[
  {
    "path": ".bazelignore",
    "content": "node_modules\n"
  },
  {
    "path": ".bazelrc",
    "content": "# Make TypeScript and Angular compilation fast, by keeping a few copies of the\n# compiler running as daemons, and cache SourceFile AST's to reduce parse time.\nbuild --strategy=TypeScriptCompile=worker\nbuild --strategy=AngularTemplateCompile=worker\n\n# Don't create bazel-* symlinks in the WORKSPACE directory.\n# These require .gitignore and may scare users.\n# Also, it's a workaround for https://github.com/bazelbuild/rules_typescript/issues/12\n# which affects the common case of having `tsconfig.json` in the WORKSPACE directory.\n#\n# Instead, you should run `bazel info bazel-bin` to find out where the outputs went.\nbuild --symlink_prefix=dist/\n\ntest --test_output=errors\n\n# Use the Angular 6 compiler\nbuild --define=compile=legacy\n\n# Turn off legacy external runfiles\nrun --nolegacy_external_runfiles\ntest --nolegacy_external_runfiles\n\n# Turn on --incompatible_strict_action_env which was on by default\n# in Bazel 0.21.0 but turned off again in 0.22.0. Follow\n# https://github.com/bazelbuild/bazel/issues/7026 for more details.\n# This flag is needed to so that the bazel cache is not invalidated\n# when running bazel via `yarn bazel`.\n# See https://github.com/angular/angular/issues/27514.\nbuild --incompatible_strict_action_env\nrun --incompatible_strict_action_env\ntest --incompatible_strict_action_env\n\n# Turn on managed directories feature in Bazel\n# This allows us to avoid installing a second copy of node_modules\nbuild --experimental_allow_incremental_repository_updates\nquery --experimental_allow_incremental_repository_updates\n\n###############################\n# Remote Build Execution support\n# Turn on these settings with\n#  --config=remote\n###############################\n\n# Load default settings for Remote Build Execution\n# When updating, the URLs of bazel_toolchains in packages/bazel/package.bzl\n# may also need to be updated (see https://github.com/angular/angular/pull/27935)\nimport %workspace%/third_party/github.com/bazelbuild/bazel-toolchains/bazelrc/bazel-0.24.0.bazelrc\n\n# Point to our custom execution platform; see tools/BUILD.bazel\nbuild:remote --extra_execution_platforms=//tools:rbe_ubuntu1604-angular\nbuild:remote --host_platform=//tools:rbe_ubuntu1604-angular\nbuild:remote --platforms=//tools:rbe_ubuntu1604-angular\n\n# Remote instance.\n# rbe-shared-demo has 500 2-core workers\n# rbe-shared-demo2 has 100 8-core workers\nbuild:remote --remote_instance_name=projects/rbe-shared-demo2/instances/default_instance\n# Allow Bazel to consume all the workers\nbuild:remote --jobs=100\n\n# Schedule actions both locally and remote, take the faster one\n# See https://blog.bazel.build/2019/02/01/dynamic-spawn-scheduler.html\n# NB: this setting is experimental and can cause obscure build failures.\n# The Bazel team does not recommend using this in all projects.\n# We can observe failures like Remote connection/protocol failed\n# build:remote --experimental_spawn_scheduler\n\n##################################################\n# Load any settings specific to the current user.\n##################################################\n\n# Needs to be last statement in this\n# config, as the user configuration should be able to overwrite flags from this file.\n# To use Remote Build Execution, this file should contain a line like\n# build --google_credentials=[path to the .json credentials file]\ntry-import .bazelrc.user\n"
  },
  {
    "path": ".circleci/bazel.rc",
    "content": "# These options are enabled when running on CI\n# We do this by copying this file to /etc/bazel.bazelrc at the start of the build.\n# See remote cache documentation in /docs/BAZEL.md\n\n# Don't be spammy in the logs\n# TODO: re-enable after we deal with 10m timeout on circleci\n#build --noshow_progress\n\n# Don't run tests that are not meant to be run on circleci\ntest --test_tag_filters=-no-circleci\n\n# Print all the options that apply to the build.\n# This helps us diagnose which options override others\n# (e.g. /etc/bazel.bazelrc vs. tools/bazel.rc)\nbuild --announce_rc\n\n# Prevent unstable environment variables from tainting cache keys\nbuild --experimental_strict_action_env\n\n# Save downloaded repositories such as the go toolchain\n# This directory can then be included in the CircleCI cache\n# It should save time running the first build\nbuild --experimental_repository_cache=/home/circleci/bazel_repository_cache\n\n# Workaround https://github.com/bazelbuild/bazel/issues/3645\n# Bazel doesn't calculate the memory ceiling correctly when running under Docker.\n# Limit Bazel to consuming resources that fit in CircleCI \"xlarge\" class\n# https://circleci.com/docs/2.0/configuration-reference/#resource_class\nbuild --local_resources=14336,8.0,1.0\n\n# Use fixed chunk names for code-split bundles in CI\n# so that GitHub buildsize bot reports are accurate\nbuild --define=ROLLUP_BUNDLE_FIXED_CHUNK_NAMES=1\n"
  },
  {
    "path": ".circleci/config.yml",
    "content": "# This file configures the build at https://circleci.com/gh/alexeagle/angular-bazel-example\n# Complete documentation is at https://circleci.com/docs/2.0/\n\n# CircleCI lets us pick the key for storing one or more caches, to speed up subsequent builds.\n# We can use this to avoid re-fetching our dependencies from npm on every build.\n# To ensure we don't load a stale cache, we invalidate it based on the entries in the key:\n# - the checksum of Yarn's lock file\n# - the branch we are on, which really shouldn't be needed since the yarn lock file should be hermetic\n# - the docker image tag, working around an issue we saw where changing docker images causes permission\n#   errors when restoring the cache, like when the user we run as changes\nvar_1: &default_docker_image circleci/node:10.16\nvar_2: &cache_key node-0.16-{{ .Branch }}-{{ checksum \"yarn.lock\" }}-0.8.0\n\n# Each job will inherit these defaults\nvar_3: &job_defaults\n  working_directory: ~/angular-bazel-example\n  docker:\n    - image: *default_docker_image\n\n# After checkout, rebase on top of master, because we want to test the proposed merge of a\n# onto the target branch, not just test what's on the user's fork.\n# Similar to travis behavior, but not quite the same.\n# See https://discuss.circleci.com/t/1662\nvar_4: &post_checkout\n  post: git pull --ff-only origin \"refs/pull/${CI_PULL_REQUEST//*pull\\//}/merge\"\n\nvar_5: &restore_cache\n  restore_cache:\n    keys:\n      - *cache_key\n\nvar_6: &init_environment\n  run:\n    name: Initializing environment\n    command: |\n      sudo apt-get update\n      # Install GTK+ graphical user interface (libgtk-3-0), advanced linux sound architecture (libasound2)\n      # and network security service libraries (libnss3) & X11 Screen Saver extension library (libssx1)\n      # which are dependendies of chrome & needed for karma & protractor headless chrome tests.\n      # This is a very small install with the whole init_environment step taking less than 8 seconds.\n      # TODO(gregmagolan): switch rules_webtesting to use a chrome headless_shell binary which does\n      #                    not depend on any dynamically linked libs\n      sudo apt-get -y install libgtk-3-0 libasound2 libnss3 libxss1\n      # Also install libraries required for firefox\n      sudo apt-get -y install libdbus-glib-1-2\n\n      # Setup /etc/bazel.bazelrc\n      sudo cp .circleci/bazel.rc /etc/bazel.bazelrc\n\nvar_7: &yarn_install\n  run:\n    name: Run yarn install\n    command: yarn install\n\nvar_8: &init_bazel\n  run:\n    name: Initializing Bazel\n    command: |\n      # Symlink fetched bazel to /usr/local/bin/bazel\n      pathToBazel=$(ls $(realpath ./node_modules/@bazel/bazel-linux_x64)/bazel-*)\n      sudo ln -fs $pathToBazel /usr/local/bin/bazel\n      echo \"Bazel version:\"\n      bazel version\n\nvar_9: &attach_workspace\n  attach_workspace:\n    at: ~/\n\nversion: 2\n\n# These jobs will run in parallel, and report separate statuses to GitHub PRs\njobs:\n  setup:\n    <<: *job_defaults\n    steps:\n      - checkout:\n          <<: *post_checkout\n      - *restore_cache\n      - *init_environment\n      - *yarn_install\n      - *init_bazel\n\n      # Save all node_modules to the cache\n      - save_cache:\n          key: *cache_key\n          paths:\n            - \"node_modules\"\n\n      # Persist any changes at this point to be reused by further jobs.\n      - persist_to_workspace:\n          root: ~/\n          paths:\n            - ./angular-bazel-example\n\n  lint:\n    <<: *job_defaults\n    steps:\n      - *attach_workspace\n      - *init_environment\n      - *init_bazel\n\n      # Run the Buildifier to check our Bazel rules for format issues.\n      - run: 'yarn bazel:format --mode=check ||\n              (echo \"BUILD files not formatted. Please run ''yarn bazel:format --mode=fix''\" ; exit 1)'\n\n      # Run the Buildifier to check our Bazel rules for lint issues.\n      # Note: The `--lint=warn` will auto fixe (re-write) the affected files. \n      - run: 'yarn bazel:format --lint=warn ||\n              (echo \"BUILD files contain unresolved lint errors. Please fix manually the remaining errors.\" ; exit 1)'\n\n  build_and_test:\n    <<: *job_defaults\n    resource_class: xlarge\n    steps:\n      - *attach_workspace\n      - *init_environment\n      - *init_bazel\n\n      # Build and Test\n      - run: yarn ng test\n      - run: yarn ng e2e\n\n      # Also run prodserver test which is not covered by `ng e2e`\n      - run: bazel test //e2e:prodserver_test\n\n      - store_artifacts:\n          path: dist/bin/src/bundle.min.js\n          destination: bundle.min.js\n\n      - store_artifacts:\n          path: dist/bin/src/bundle.cs.min\n          destination: bundle.cs.min\n\n  benchmark:\n    <<: *job_defaults\n    resource_class: xlarge\n    steps:\n      - *attach_workspace\n      - *init_environment\n      - *init_bazel\n\n      # Run `bazel build` first as a temporary workaround to unexpected\n      # benchmark failure when entire build runs withing ibazel-benchmark-runner\n      # ```\n      # Error running Bazel unexpected EOF\n      # [ibazel-benchmark-runner] iBazel process exited unexpectedly 4 null\n      # error Command failed with exit code 1.\n      # ```\n      # TODO(gregmagolan): remove this once issue is resolved\n      - run: bazel build ...\n\n      # Run the benchmark\n      - run: yarn benchmark\n\n\nworkflows:\n  version: 2\n  default_workflow:\n    jobs:\n      - setup\n      - lint:\n          requires:\n          - setup\n      - build_and_test:\n          requires:\n          - setup\n      - benchmark:\n          requires:\n          - setup\n"
  },
  {
    "path": ".clang-format",
    "content": "Language:        JavaScript\nBasedOnStyle:    Google\nColumnLimit:     100\n"
  },
  {
    "path": ".firebaserc",
    "content": "{\n  \"projects\": {\n    \"default\": \"bazel-angular-io\"\n  }\n}\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\nbazel-out\ndist\n.firebase\n.DS_Store\n.bazelrc.user\n"
  },
  {
    "path": "BUILD.bazel",
    "content": "load(\"@k8s_deploy//:defaults.bzl\", \"k8s_deploy\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# ts_library and ng_module use the `//:tsconfig.json` target\n# by default. This alias allows omitting explicit tsconfig\n# attribute.\nalias(\n    name = \"tsconfig.json\",\n    actual = \"//src:tsconfig.json\",\n)\n\nk8s_deploy(\n    name = \"deploy\",\n    images = {\n        \"gcr.io/internal-200822/src:nodejs_image\": \"//src:image\",\n    },\n    template = \":deployment.yaml\",\n)\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License\n\nCopyright (c) 2014-2017 Google, Inc. http://angular.io\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "[![CircleCI](https://circleci.com/gh/angular/angular-bazel-example.svg?style=svg)](https://circleci.com/gh/angular/angular-bazel-example)\n\n# Moved to rules_nodejs monorepo: https://github.com/bazelbuild/rules_nodejs/tree/master/examples/angular\n\n**Readme content is preserved below to avoid breaking links**\n\n**This is experimental, as part of Angular Labs! There may be breaking changes.**\n\nThis is part of the ABC project. The overall goal is to make it possible to\ndevelop Angular applications the same way we do at Google.\n\nLearn more about Bazel and Angular at https://bazel.angular.io\n\nThis example is deployed at https://bazel.angular.io/example\n\n## Guide to the example\n\nThis example is a monorepo, meant to show many different features and integrations that we expect are generally useful for enterprise use cases.\n\n- **Angular CLI**: you can use the `ng` command to run build, serve, test, and e2e\n- **Angular Libraries**: to maximize build incrementality, each Angular module is compiled as a separate step. This lets us re-use Angular libraries without having to publish them as npm packages. See `src/todos` for a typical `NgModule` compiled as a library for use in the application, using the `ng_module` rule in the `BUILD.bazel` file.\n- **TypeScript Libraries**: see `src/lib` for a trivial example of a pure-TS library that's consumed in the application, using the `ts_library` rule in the `BUILD.bazel` file.\n- **Sass**: we use Sass for all styling. Angular components import Sass files, and these are built by Bazel as independent processes calling the modern Sass compiler (written in Dart).\n- **Material design**: see `src/material` where we collect the material modules we use.\n- **Redux-style state management**: see `src/reducers` where we use the [NgRx Store](https://ngrx.io/guide/store).\n- **Lazy loading**: in production mode, the application is served in chunks. Run `ng serve --prod`\n- **Differential loading**: in production mode, we load a pair of `<script>` tags. Modern browsers will load code in the ES2015 syntax, which is smaller and requires fewer polyfills. Older browsers will load ES5 syntax.\n- **Docker**: see below where we package up the production app for deployment on Kubernetes.\n\n## Installation\n\nYou only need to install one build tool, and which one you choose typically depends on what kind of development you do most often.\n\nIf you're a frontend developer, you should install NodeJS and yarn.\nThe `package.json` file has an `engines` section which indicates the range of NodeJS and yarn versions that you could use.\nYou simply run `yarn` commands shown below, and don't need to install Bazel or any other dependencies.\n\nIf you're a full-stack developer, you might be using Bazel for your backend already.\nIn this case, you should install Bazel following instructions at http://bazel.build.\nAlso install `ibazel`, which is a watch mode for Bazel not included in the standard distribution. See https://github.com/bazelbuild/bazel-watcher#installation.\nThe `WORKSPACE` file has a `check_bazel_version` call which will print an error if your Bazel version is not in the supported range.\nYou simply run `bazel` commands shown below, and don't need to install NodeJS, yarn, or any other dependencies.\n\n## Development\n\nFirst we'll run the development server:\n\n```bash\n$ ng serve\n# or\n$ ibazel run //src:devserver\n```\n\nThis runs in \"watch mode\", which means it will watch any files that are inputs to the devserver, and when they change it will ask Bazel to re-build them.\nWhen the re-build is finished, it will trigger a LiveReload in the browser.\n\nThis command prints a URL on the terminal. Open that page to see the demo app\nrunning. Now you can edit one of the source files (`src/lib/file.ts` is an easy\none to understand and see the effect). As soon as you save a change, the app\nshould refresh in the browser with the new content. Our intent is that this time\nis less than two seconds, even for a large application.\n\nControl-C twice to kill the devserver.\n\n## Testing\n\nWe can also run all the unit tests:\n\n```bash\n$ ng test\n# or\n$ bazel test //src/...\n```\n\nOr run the end-to-end tests:\n\n```bash\n$ ng e2e\n# or\n$ bazel test //e2e/...\n```\n\nIn this example, there is a unit test for the `hello-world` component which uses\nthe `ts_web_test_suite` rule. There are also protractor e2e tests for both the\n`prodserver` and `devserver` which use the `protractor_web_test_suite` rule.\n\nNote that Bazel will only re-run the tests whose inputs changed since the last run.\n\n## Production\n\nWe can run the application in production mode, where the code has been bundled\nand optimized. This can be slower than the development mode, because any change\nrequires re-optimizing the app. This example uses Rollup and Uglify, but other\nbundlers can be integrated with Bazel.\n\n```bash\n$ ng serve --prod\n# or\n$ bazel run //src:prodserver\n```\n\n### Code splitting\n\nThe production bundle is code split and routes such as `/` and `/todos`\nare lazy loaded. Code splitting is handled by the rollup_bundle rule\nwhich now supports the new code splitting feature in rollup.\n\nNote: code splitting is _not_ supported in development mode yet so the\n`//src:devserver` target does not serve a code split bundle. The dynamic\n`import()` statements will resolve to modules that are served in the initial\nJS payload.\n\n## Npm dependencies\n\nHaving a local `node_modules` folder setup by `yarn` or `npm` is not\nnecessary when building this example with Bazel. This example makes use\nof Bazel managed npm dependencies (https://github.com/bazelbuild/rules_nodejs#using-bazel-managed-dependencies)\nwhich means Bazel will setup the npm dependencies in your `package.json` for you\noutside of your local workspace for use in the build.\n\nHowever, you may still want to run `yarn` or `npm` to manually\nsetup a local `node_modules` folder for editor and tooling support.\n\n## Deployment\n\n### Firebase\n\nWe use the standard firebase deploy command.\n\nRun `yarn deploy` to release changes to bazel.angular.io.\n\n### Kubernetes Engine\nWe use Bazel's docker support to package up our production server for deployment.\nEach time the app changes, we'll get a slim new docker layer with just the modified files, keeping the round-trip for deployment incremental and fast.\nThis example is configured to run on Google Kubernetes Engine, so we can have an elastic pool of backend machines behind a load balancer.\nThis setup is more expensive to operate than something like Firebase Functions where the backend code is spun up on-demand, but is also more adaptable to scenarios like backend servers that need to run other binaries on the machine.\n\nThe application is currently live at http://35.197.115.230/\n\nTo run it under docker:\n\n```\n$ bazel run src:nodejs_image -- --norun\n$ docker run --rm -p 8080:8080 bazel/src:nodejs_image\n```\n\nDeploy to production:\n\n1. Install gcloud and kubectl\n1. Authenticate to the Google Container Registry\n    `gcloud auth configure-docker`\n1. Authenticate to Kubernetes Engine\n    `gcloud container clusters get-credentials angular-bazel-example --zone=us-west1-a`\n1. For the first deployment: `bazel run :deploy.create`\n1. To update: `bazel run :deploy.replace`\n\nTips:\n\n```\n# Run the binary without docker\n$ bazel run src:nodejs_image.binary\n # What's in the image?\n$ bazel build src:nodejs_image && file-roller dist/bin/src/nodejs_image-layer.tar\n # Tear down all running docker containers\n$ docker rm -f $(docker ps -aq)\n # Hop into the running image on kubernetes\n$ kubectl exec angular-bazel-example-prod-3285254973-ncv3g  -it -- /bin/bash\n```\n"
  },
  {
    "path": "WORKSPACE",
    "content": "# The WORKSPACE file tells Bazel that this directory is a \"workspace\", which is like a project root.\n# The content of this file specifies all the external dependencies Bazel needs to perform a build.\n\n####################################\n# ESModule imports (and TypeScript imports) can be absolute starting with the workspace name.\n# The name of the workspace should match the npm package where we publish, so that these\n# imports also make sense when referencing the published package.\nworkspace(\n    name = \"angular_bazel_example\",\n    managed_directories = {\"@npm\": [\"node_modules\"]},\n)\n\n# These rules are built-into Bazel but we need to load them first to download more rules\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\n\n# Fetch rules_nodejs so we can install our npm dependencies\nhttp_archive(\n    name = \"build_bazel_rules_nodejs\",\n    sha256 = \"0d9660cf0894f1fe1e9840818553e0080fbce0851169812d77a70bdb9981c946\",\n    urls = [\"https://github.com/bazelbuild/rules_nodejs/releases/download/0.37.0/rules_nodejs-0.37.0.tar.gz\"],\n)\n\n# Fetch sass rules for compiling sass files\nhttp_archive(\n    name = \"io_bazel_rules_sass\",\n    sha256 = \"4f05239080175a3f4efa8982d2b7775892d656bb47e8cf56914d5f9441fb5ea6\",\n    strip_prefix = \"rules_sass-86ca977cf2a8ed481859f83a286e164d07335116\",\n    url = \"https://github.com/bazelbuild/rules_sass/archive/86ca977cf2a8ed481859f83a286e164d07335116.zip\",\n)\n\n# Check the bazel version and download npm dependencies\nload(\"@build_bazel_rules_nodejs//:defs.bzl\", \"check_bazel_version\", \"yarn_install\")\n\n# Bazel version must be at least the following version because:\n#   - 0.27.0 Adds managed directories support\ncheck_bazel_version(\n    message = \"\"\"\nYou no longer need to install Bazel on your machine.\nAngular has a dependency on the @bazel/bazel package which supplies it.\nTry running `yarn bazel` instead.\n    (If you did run that, check that you've got a fresh `yarn install`)\n\n\"\"\",\n    minimum_bazel_version = \"0.27.0\",\n)\n\n# Setup the Node.js toolchain & install our npm dependencies into @npm\nyarn_install(\n    name = \"npm\",\n    package_json = \"//:package.json\",\n    yarn_lock = \"//:yarn.lock\",\n)\n\n# Install all bazel dependencies of our npm packages\nload(\"@npm//:install_bazel_dependencies.bzl\", \"install_bazel_dependencies\")\n\ninstall_bazel_dependencies()\n\n# Load npm_bazel_protractor dependencies\nload(\"@npm_bazel_protractor//:package.bzl\", \"npm_bazel_protractor_dependencies\")\n\nnpm_bazel_protractor_dependencies()\n\n# Load npm_bazel_karma dependencies\nload(\"@npm_bazel_karma//:package.bzl\", \"rules_karma_dependencies\")\n\nrules_karma_dependencies()\n\n# Setup the rules_webtesting toolchain\nload(\"@io_bazel_rules_webtesting//web:repositories.bzl\", \"web_test_repositories\")\n\nweb_test_repositories()\n\n# Temporary work-around for https://github.com/angular/angular/issues/28681\n# TODO(gregmagolan): go back to @io_bazel_rules_webtesting browser_repositories\nload(\"@npm_bazel_karma//:browser_repositories.bzl\", \"browser_repositories\")\n\nbrowser_repositories()\n\n# Setup the rules_typescript tooolchain\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_setup_workspace\")\n\nts_setup_workspace()\n\n# Setup the rules_sass toolchain\nload(\"@io_bazel_rules_sass//sass:sass_repositories.bzl\", \"sass_repositories\")\n\nsass_repositories()\n\n################################\n# Support for Remote Execution #\n################################\n\nhttp_archive(\n    name = \"bazel_toolchains\",\n    sha256 = \"88e818f9f03628eef609c8429c210ecf265ffe46c2af095f36c7ef8b1855fef5\",\n    strip_prefix = \"bazel-toolchains-92dd8a7\",\n    urls = [\n        \"https://github.com/bazelbuild/bazel-toolchains/archive/92dd8a7.zip\",\n    ],\n)\n\n####################################################\n# Support creating Docker images for our node apps #\n####################################################\n\nhttp_archive(\n    name = \"io_bazel_rules_docker\",\n    sha256 = \"aed1c249d4ec8f703edddf35cbe9dfaca0b5f5ea6e4cd9e83e99f3b0d1136c3d\",\n    strip_prefix = \"rules_docker-0.7.0\",\n    urls = [\"https://github.com/bazelbuild/rules_docker/archive/v0.7.0.tar.gz\"],\n)\n\nload(\"@io_bazel_rules_docker//nodejs:image.bzl\", nodejs_image_repos = \"repositories\")\n\nnodejs_image_repos()\n\n####################################################\n# Kubernetes setup, for deployment to Google Cloud #\n####################################################\n\ngit_repository(\n    name = \"io_bazel_rules_k8s\",\n    commit = \"36ae5b534cc51ab0815c9bc723760469a9f7175c\",\n    remote = \"https://github.com/bazelbuild/rules_k8s.git\",\n    shallow_since = \"1545317854 -0500\",\n)\n\nload(\"@io_bazel_rules_k8s//k8s:k8s.bzl\", \"k8s_defaults\", \"k8s_repositories\")\n\nk8s_repositories()\n\nk8s_defaults(\n    # This creates a rule called \"k8s_deploy\" that we can call later\n    name = \"k8s_deploy\",\n    # This is the name of the cluster as it appears in:\n    #   kubectl config view --minify -o=jsonpath='{.contexts[0].context.cluster}'\n    cluster = \"_\".join([\n        \"gke\",\n        \"internal-200822\",\n        \"us-west1-a\",\n        \"angular-bazel-example\",\n    ]),\n    kind = \"deployment\",\n)\n"
  },
  {
    "path": "angular-metadata.tsconfig.json",
    "content": "// WORKAROUND https://github.com/angular/angular/issues/18810\n//\n// This file is required to run ngc on 3rd party libraries such as @ngrx,\n// to write files like node_modules/@ngrx/store/store.ngsummary.json.\n//\n{\n    \"compilerOptions\": {\n        \"lib\": [\n            \"dom\",\n            \"es2015\"\n        ],\n        \"experimentalDecorators\": true,\n        \"types\": [],\n        \"module\": \"amd\",\n        \"moduleResolution\": \"node\"\n    },\n    \"angularCompilerOptions\": {\n        \"enableSummariesForJit\": true\n    },\n    \"include\": [\n        \"node_modules/@angular/**/*\",\n        \"node_modules/@ngrx/**/*\"\n    ],\n    \"exclude\": [\n        \"node_modules/@ngrx/store/migrations/**\",\n        \"node_modules/@ngrx/store/schematics/**\",\n        \"node_modules/@ngrx/store/schematics-core/**\",\n        \"node_modules/@angular/cdk/schematics/**\",\n        \"node_modules/@angular/cdk/typings/schematics/**\",\n        \"node_modules/@angular/material/schematics/**\",\n        \"node_modules/@angular/material/typings/schematics/**\",\n        \"node_modules/@angular/common/upgrade*\",\n        \"node_modules/@angular/router/upgrade*\",\n        \"node_modules/@angular/bazel/**\",\n        \"node_modules/@angular/compiler-cli/**\",\n        \"node_modules/@angular/**/testing/**\"\n        \n    ]\n}\n"
  },
  {
    "path": "angular.json",
    "content": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"newProjectRoot\": \"projects\",\n  \"projects\": {\n    \"angular-bazel-example\": {\n      \"root\": \"\",\n      \"sourceRoot\": \"src\",\n      \"projectType\": \"application\",\n      \"prefix\": \"app\",\n      \"schematics\": {\n        \"@schematics/angular:component\": {\n          \"style\": \"scss\"\n        }\n      },\n      \"architect\": {\n        \"build\": {\n          \"builder\": \"@angular/bazel:build\",\n          \"options\": {\n            \"targetLabel\": \"//src:prodapp\",\n            \"bazelCommand\": \"build\"\n          }\n        },\n        \"serve\": {\n          \"builder\": \"@angular/bazel:build\",\n          \"options\": {\n            \"targetLabel\": \"//src:devserver\",\n            \"bazelCommand\": \"run\",\n            \"watch\": true\n          },\n          \"configurations\": {\n            \"production\": {\n              \"targetLabel\": \"//src:prodserver\"\n            }\n          }\n        },\n        \"extract-i18n\": {\n          \"builder\": \"@angular-devkit/build-angular:extract-i18n\",\n          \"options\": {\n            \"browserTarget\": \"ngbazel:build\"\n          }\n        },\n        \"test\": {\n          \"builder\": \"@angular/bazel:build\",\n          \"options\": {\n            \"bazelCommand\": \"test\",\n            \"targetLabel\": \"//src/app/...\"\n          }\n        },\n        \"lint\": {\n          \"builder\": \"@angular-devkit/build-angular:tslint\",\n          \"options\": {\n            \"tsConfig\": [\n              \"src/tsconfig.app.json\",\n              \"src/tsconfig.spec.json\"\n            ],\n            \"exclude\": [\n              \"**/node_modules/**\"\n            ]\n          }\n        }\n      }\n    },\n    \"ngbazel-e2e\": {\n      \"root\": \"e2e/\",\n      \"projectType\": \"application\",\n      \"prefix\": \"\",\n      \"architect\": {\n        \"e2e\": {\n          \"builder\": \"@angular/bazel:build\",\n          \"options\": {\n            \"bazelCommand\": \"test\",\n            \"targetLabel\": \"//e2e:devserver_test\"\n          },\n          \"configurations\": {\n            \"production\": {\n              \"targetLabel\": \"//e2e:prodserver_test\"\n            }\n          }\n        },\n        \"lint\": {\n          \"builder\": \"@angular-devkit/build-angular:tslint\",\n          \"options\": {\n            \"tsConfig\": \"e2e/tsconfig.e2e.json\",\n            \"exclude\": [\n              \"**/node_modules/**\"\n            ]\n          }\n        }\n      }\n    }\n  },\n  \"defaultProject\": \"ngbazel\"\n  \n}"
  },
  {
    "path": "deployment.yaml",
    "content": "# Configuration for deployment to kubernetes\n\napiVersion: apps/v1beta1\nkind: Deployment\nmetadata:\n  name: angular-bazel-example-prod\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: angular-bazel-example-prod\n    spec:\n      containers:\n      - name: angular-bazel-example\n        image: gcr.io/internal-200822/src:nodejs_image\n        imagePullPolicy: Always\n        ports:\n        - containerPort: 8080\n"
  },
  {
    "path": "e2e/BUILD.bazel",
    "content": "load(\"@npm_bazel_protractor//:index.bzl\", \"protractor_web_test_suite\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\n\nts_library(\n    name = \"e2e\",\n    testonly = 1,\n    srcs = glob([\"src/*.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \"@npm//@types/jasmine\",\n        \"@npm//jasmine\",\n        \"@npm//protractor\",\n    ],\n)\n\nprotractor_web_test_suite(\n    name = \"prodserver_test\",\n    on_prepare = \":protractor.on-prepare.js\",\n    server = \"//src:prodserver\",\n    deps = [\":e2e\"],\n)\n\nprotractor_web_test_suite(\n    name = \"devserver_test\",\n    on_prepare = \":protractor.on-prepare.js\",\n    server = \"//src:devserver\",\n    deps = [\":e2e\"],\n)\n"
  },
  {
    "path": "e2e/protractor.on-prepare.js",
    "content": "// The function exported from this file is used by the protractor_web_test_suite.\n// It is passed to the `onPrepare` configuration setting in protractor and executed\n// before running tests.\n//\n// If the function returns a promise, as it does here, protractor will wait\n// for the promise to resolve before running tests.\n\nconst protractorUtils = require('@bazel/protractor/protractor-utils');\nconst protractor = require('protractor');\nconst path = require('path');\n\nmodule.exports = function(config) {\n  // In this example, `@bazel/protractor/protractor-utils` is used to run\n  // the server. protractorUtils.runServer() runs the server on a randomly\n  // selected port (given a port flag to pass to the server as an argument).\n  // The port used is returned in serverSpec and the protractor serverUrl\n  // is the configured.\n  const isProdserver = path.basename(config.server, path.extname(config.server)) === 'prodserver';\n  return protractorUtils\n      .runServer(config.workspace, config.server, isProdserver ? '-p' : '-port', [])\n      .then(serverSpec => {\n        // Example app is hosted under `/example` in the prodserver and under `/` in devserver\n        const serverUrl = `http://localhost:${serverSpec.port}` + (isProdserver ? '/example' : '');\n        protractor.browser.baseUrl = serverUrl;\n      });\n};\n"
  },
  {
    "path": "e2e/src/app.e2e-spec.ts",
    "content": "import { AppPage } from './app.po';\n\ndescribe('angular example application', () => {\n  let page: AppPage;\n\n  beforeEach(() => {\n    page = new AppPage();\n  });\n\n  it('should display: Hello World!', async () => {\n    await page.navigateTo();\n    expect(await page.getParagraphText()).toEqual(`Hello Adolph Blain...`);\n    await page.typeInInput('!');\n    expect(await page.getParagraphText()).toEqual(`Hello Adolph Blain...!`);\n  });\n});\n"
  },
  {
    "path": "e2e/src/app.po.ts",
    "content": "import { browser, by, element } from 'protractor';\n\nexport class AppPage {\n  async navigateTo() {\n    await browser.get(browser.baseUrl + '/hello');\n    return browser.waitForAngular();\n  }\n\n  async waitForElement(el, timeout = 10000) {\n    await browser.wait(() => el.isPresent(), timeout);\n    await browser.wait(() => el.isDisplayed(), timeout);\n    return el;\n  }\n\n  async getParagraphText() {\n    return (await this.waitForElement(element(by.css('div#greeting')))).getText();\n  }\n\n  async typeInInput(s: string) {\n    return (await this.waitForElement(element(by.css('input')))).sendKeys(s);\n  }\n}\n"
  },
  {
    "path": "firebase.json",
    "content": "{\n  \"hosting\": {\n    \"public\": \"dist/bin/src/prodapp\",\n    \"ignore\": [\n      \"firebase.json\",\n      \"**/.*\",\n      \"**/node_modules/**\"\n    ],\n    \"rewrites\": [\n      {\n        \"source\": \"/example/**\",\n        \"destination\": \"/example/index.html\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"angular-bazel-example\",\n    \"private\": true,\n    \"description\": \"Demo of building Angular apps with Bazel\",\n    \"license\": \"Apache-2.0\",\n    \"engines\": {\n        \"node\": \">=10.9.0 <11.0.0\",\n        \"yarn\": \">=1.9.2 <2.0.0\"\n    },\n    \"dependencies\": {\n        \"@angular/animations\": \"8.2.6\",\n        \"@angular/cdk\": \"8.2.0\",\n        \"@angular/common\": \"8.2.6\",\n        \"@angular/core\": \"8.2.6\",\n        \"@angular/forms\": \"8.2.6\",\n        \"@angular/material\": \"8.2.0\",\n        \"@angular/platform-browser\": \"8.2.6\",\n        \"@angular/platform-browser-dynamic\": \"8.2.6\",\n        \"@angular/router\": \"8.2.6\",\n        \"@ngrx/store\": \"8.0.1\",\n        \"date-fns\": \"1.30.1\",\n        \"rxjs\": \"6.5.2\",\n        \"systemjs\": \"0.21.6\",\n        \"tslib\": \"1.10.0\",\n        \"zone.js\": \"0.10.2\"\n    },\n    \"devDependencies\": {\n        \"@angular/bazel\": \"8.2.6\",\n        \"@angular/cli\": \"8.3.4\",\n        \"@angular/compiler\": \"8.2.6\",\n        \"@angular/compiler-cli\": \"8.2.6\",\n        \"@bazel/bazel\": \"^0.29.0\",\n        \"@bazel/benchmark-runner\": \"0.1.0\",\n        \"@bazel/buildifier\": \"0.28.0\",\n        \"@bazel/ibazel\": \"0.10.3\",\n        \"@bazel/karma\": \"~0.37.0\",\n        \"@bazel/protractor\": \"~0.37.0\",\n        \"@bazel/typescript\": \"~0.37.0\",\n        \"@types/jasmine\": \"3.4.0\",\n        \"@types/node\": \"6.14.6\",\n        \"clang-format\": \"1.2.4\",\n        \"core-js\": \"2.6.9\",\n        \"firebase-tools\": \"7.1.0\",\n        \"husky\": \"3.0.4\",\n        \"ts-morph\": \"3.1.0\",\n        \"typescript\": \"3.4.5\"\n    },\n    \"scripts\": {\n        \"build\": \"bazel build //src:bundle\",\n        \"serve\": \"ibazel run //src:devserver\",\n        \"deploy\": \"ng build && firebase deploy\",\n        \"serve-prod\": \"bazel run //src:prodserver\",\n        \"e2e\": \"bazel test //e2e:all\",\n        \"test\": \"bazel test //src/...\",\n        \"benchmark\": \"ibazel-benchmark-runner //src:devserver src/app/hello-world/hello-world.component.ts --url=http://localhost:5432\",\n        \"postinstall\": \"ngc -p angular-metadata.tsconfig.json\",\n        \"bazel:format\": \"find . -type f \\\\( -name \\\"*.bzl\\\" -or -name WORKSPACE -or -name BUILD -or -name BUILD.bazel \\\\) ! -path \\\"*/node_modules/*\\\" | xargs buildifier -v --warnings=attr-cfg,attr-license,attr-non-empty,attr-output-default,attr-single-file,constant-glob,ctx-actions,ctx-args,depset-iteration,depset-union,dict-concatenation,duplicated-name,filetype,git-repository,http-archive,integer-division,load,load-on-top,native-build,native-package,out-of-order-load,output-group,package-name,package-on-top,positional-args,redefined-variable,repository-name,same-origin-load,string-iteration,unsorted-dict-items,unused-variable\",\n        \"bazel:lint\": \"yarn bazel:format --lint=warn\",\n        \"bazel:lint-fix\": \"yarn bazel:format --lint=fix\",\n        \"format\": \"git-clang-format\",\n        \"precommit\": \"check-clang-format \\\"yarn format\\\"\",\n        \"generate\": \"node tools/generator/index.js\",\n        \"generate:clean\": \"node tools/generator/index.js --clean\"\n    }\n}\n"
  },
  {
    "path": "renovate.json",
    "content": "{\n  \"extends\": [\n    \"config:base\"\n  ],\n  \"pinVersions\": false,\n  \"packageRules\": [\n    {\n      \"packagePatterns\": [\n        \"^@angular\\/.*\"\n      ],\n      \"groupName\": \"angular\",\n      \"pinVersions\": false\n    },\n    {\n      \"packagePatterns\": [\n        \"^@bazel\\/.*\",\n        \"build_bazel_rules_nodejs\"\n      ],\n      \"groupName\": \"bazel\",\n      \"pinVersions\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "src/BUILD.bazel",
    "content": "load(\"@build_bazel_rules_nodejs//:defs.bzl\", \"history_server\", \"rollup_bundle\")\nload(\"@build_bazel_rules_nodejs//internal/web_package:web_package.bzl\", \"web_package\")\nload(\"@io_bazel_rules_docker//container:container.bzl\", \"container_image\")\nload(\"@io_bazel_rules_docker//nodejs:image.bzl\", \"nodejs_image\")\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_config\", \"ts_devserver\", \"ts_library\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nts_config(\n    name = \"tsconfig-test\",\n    src = \"tsconfig-test.json\",\n    deps = [\":tsconfig.json\"],\n)\n\n# Run the sass compiler to output \"styles.css\"\n# TODO(alexeagle): demonstrate the sass_library rule too\nsass_binary(\n    name = \"styles\",\n    src = \"styles.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/animations\",\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nts_library(\n    name = \"initialize_testbed\",\n    testonly = 1,\n    srcs = [\n        \"initialize_testbed.ts\",\n    ],\n    deps = [\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types\",\n    ],\n)\n\nng_module(\n    name = \"src\",\n    srcs = [\n        \"main.dev.ts\",\n        \"main.prod.ts\",\n    ],\n    tsconfig = \":tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"//src/app\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/router\",\n        \"@npm//@ngrx/store\",\n    ],\n)\n\nfilegroup(\n    name = \"rxjs_umd_modules\",\n    srcs = [\n        \":rxjs_shims.js\",\n        \"@npm//:node_modules/rxjs/bundles/rxjs.umd.js\",\n    ],\n)\n\n# Files that we serve in both development and production\n_ASSETS = [\n    # This label references an output of the \"styles\" sass_binary above.\n    \":styles.css\",\n\n    # Directly reference a file that came from @angular/material npm package\n    \"@npm//:node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css\",\n\n    # We load zone.js outside the bundle. That's because it's a \"pollyfill\"\n    # which speculates that such features might be available in a browser.\n    # Also it's tricky to configure dead code elimination to understand that\n    # zone.js is used, given that we don't have any import statement that\n    # imports from it.\n    \"@npm//:node_modules/zone.js/dist/zone.min.js\",\n]\n\n# This devserver is written in Go and is super-fast.\n# It doesn't run any bundler or code splitter. Instead, it concatenates\n# named UMD and named AMD JavaScript code on-the-fly in-memory.\n# This scales really well for massive codebases.\nts_devserver(\n    name = \"devserver\",\n    # Serve these files but don't inject tags for them into the index file\n    # This might be because we only want to lazy-load these scripts on-demand,\n    # or because they aren't compatible with Require.js so we must use a runtime\n    # loader to load them.\n    data = [\n        \"//src/assets\",\n    ],\n    # Start from the development version of the main\n    entry_module = \"angular_bazel_example/src/main.dev\",\n    # <script> and <link> tags will be automatically injected into this index file\n    index_html = \"//src/example:assets\",\n    # These scripts will be included in the JS bundle after require.js\n    # They should have only named UMD modules, or require.js will throw.\n    scripts = [\n        \"@npm//:node_modules/@ngrx/store/bundles/store.umd.min.js\",\n        \"@npm//:node_modules/tslib/tslib.js\",\n        \":rxjs_umd_modules\",\n        # We are manaully adding the bazel generated named-UMD date-fns bundle here as\n        # named-UMD bundles for non-APF npm packages are not yet automatically added.\n        # This file is generated by the npm_umd_bundle @npm//date-fns:date-fns__umd\n        # rule that is setup by yarn_install.\n        \"@npm//date-fns:date-fns.umd.js\",\n    ],\n    # Serve these files in addition to the JavaScript bundle\n    # The corresponding <script> or <link> tags will be injected into the index_html\n    static_files = _ASSETS,\n    # Tell Bazel to build the sources first\n    deps = [\"//src\"],\n)\n\nrollup_bundle(\n    name = \"bundle\",\n    entry_point = \":main.prod.ts\",\n    deps = [\n        \"//src\",\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/material\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/router\",\n        \"@npm//@ngrx/store\",\n        \"@npm//rxjs\",\n    ],\n)\n\nweb_package(\n    name = \"prodapp\",\n    # In production mode we serve some polyfills with script tags that have hard-coded paths in the index.html\n    # so we must serve them at that path, by stripping a prefix\n    additional_root_paths = [\n        \"npm/node_modules/core-js/client\",\n        \"npm/node_modules/systemjs/dist\",\n    ],\n    # do not sort\n    assets = _ASSETS + [\n        # For differential loading, we supply both an ESModule entry point and an es5 entry point\n        # The injector will put two complimentary script tags in the example.html\n        \":bundle.min.js\",\n        \":bundle.min.es2015.js\",\n    ],\n    data = [\n        \":bundle\",\n        \"//src/assets\",\n        # Include polyfills that will be requested by old browsers\n        \"@npm//:node_modules/systemjs/dist/system.js\",\n        \"@npm//:node_modules/core-js/client/core.min.js\",\n        \"index.html\",\n    ],\n    # <script> and <link> tags will be automatically injected into this index.\n    index_html = \"//src/example:assets\",\n)\n\nhistory_server(\n    name = \"prodserver\",\n    data = [\":prodapp\"],\n    # '-a src/prodapp' will ask history-server to scan for all apps under the\n    # given folder this will result in the following auto-configuration:\n    #   /example => src/prodapp/example\n    #   /        => src/prodapp\n    templated_args = [\n        \"-a\",\n        \"src/prodapp\",\n    ],\n)\n\nnodejs_image(\n    name = \"nodejs_image\",\n    data = [\":prodapp\"],\n    entry_point = \"@history-server_runtime_deps//:node_modules/history-server/modules/cli.js\",\n    node_modules = \"@history-server_runtime_deps//:node_modules\",\n    # Actions created by this rule are I/O-bound,\n    # so there is no benefit to running them remotely\n    tags = [\"local\"],\n    templated_args = [\"src/prodapp\"],\n)\n\ncontainer_image(\n    name = \"image\",\n    base = \":nodejs_image\",\n    # Actions created by this rule are I/O-bound,\n    # so there is no benefit to running them remotely\n    tags = [\"local\"],\n    workdir = \"/app/src/nodejs_image.binary.runfiles/angular_bazel_example\",\n)\n"
  },
  {
    "path": "src/app/BUILD.bazel",
    "content": "load(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/animations\",\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"app\",\n    srcs = glob([\"*.ts\"]),\n    assets = [\"app.component.html\"],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"//src/app/billing\",\n        \"//src/app/compute\",\n        \"//src/app/datastore\",\n        \"//src/app/functions\",\n        \"//src/app/logging\",\n        \"//src/app/monitoring\",\n        \"//src/app/networking\",\n        \"//src/app/registry\",\n        \"//src/app/storage\",\n        \"//src/app/support\",\n        \"//src/app/hello-world\",\n        \"//src/app/home\",\n        \"//src/app/todos\",\n        \"//src/shared/material\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@ngrx/store\",\n    ],\n)\n"
  },
  {
    "path": "src/app/app-routing.module.ts",
    "content": "import {NgModule} from '@angular/core';\nimport {PreloadAllModules, RouterModule, Routes} from '@angular/router';\n\n// These are lazy-loaded routes - note that we dynamic-import the modules here\n// to avoid having an eager dependency on them.\n\n// IMPORTANT: this array is auto-updated by script/generator\n// dont rename the 'routes' variable.\nconst routes: Routes = [\n  {\n    path: '',\n    pathMatch: 'full',\n    loadChildren: () => import('./home/home.ngfactory').then(m => m.HomeModuleNgFactory)\n  },\n  {\n    path: 'hello',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./hello-world/hello-world.module.ngfactory').then(m => m.HelloWorldModuleNgFactory)\n  },\n  {\n    path: 'todos',\n    pathMatch: 'full',\n    loadChildren: () => import('./todos/todos.module.ngfactory').then(m => m.TodosModuleNgFactory)\n  },\n  {\n    path: 'billing',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./billing/billing.module.ngfactory').then(m => m.BillingModuleNgFactory)\n  },\n  {\n    path: 'compute',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./compute/compute.module.ngfactory').then(m => m.ComputeModuleNgFactory)\n  },\n  {\n    path: 'datastore',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./datastore/datastore.module.ngfactory').then(m => m.DatastoreModuleNgFactory)\n  },\n  {\n    path: 'functions',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./functions/functions.module.ngfactory').then(m => m.FunctionsModuleNgFactory)\n  },\n  {\n    path: 'logging',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./logging/logging.module.ngfactory').then(m => m.LoggingModuleNgFactory)\n  },\n  {\n    path: 'monitoring',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./monitoring/monitoring.module.ngfactory').then(m => m.MonitoringModuleNgFactory)\n  },\n  {\n    path: 'networking',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./networking/networking.module.ngfactory').then(m => m.NetworkingModuleNgFactory)\n  },\n  {\n    path: 'registry',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./registry/registry.module.ngfactory').then(m => m.RegistryModuleNgFactory)\n  },\n  {\n    path: 'storage',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./storage/storage.module.ngfactory').then(m => m.StorageModuleNgFactory)\n  },\n  {\n    path: 'support',\n    pathMatch: 'full',\n    loadChildren: () =>\n        import('./support/support.module.ngfactory').then(m => m.SupportModuleNgFactory)\n  }\n];\n\n@NgModule({\n  imports: [RouterModule.forRoot(routes, {\n    // TODO: maybe set this based on devmode?\n    enableTracing: true,\n    // preloadingStrategy: PreloadAllModules,\n  })],\n  exports: [RouterModule],\n})\nexport class AppRoutingModule {\n}\n"
  },
  {
    "path": "src/app/app.component.html",
    "content": "<nav>\n  <mat-toolbar class=\"mat-secondary\">\n    <p class=\"show-small\"><button mat-button (click)=\"drawer.toggle()\">\n        <mat-icon>menu</mat-icon>\n      </button></p>\n    <a mat-button href=\"http://angular.io\" class=\"hide-small\">\n      <img class=\"nav-logo\" src=\"/assets/angular-logo-with-text.svg\">\n    </a>\n    <span class=\"hide-small\">+</span>\n    <a mat-button href=\"https://bazel.build\">\n      <img class=\"nav-logo\" src=\"/assets/bazel-navbar.svg\">\n    </a>\n    <span class=\"flex-spacer\"></span>\n    <a mat-button href=\"https://next.angular.io/guide/bazel\">\n      Documentation\n    </a>\n    <a href=\"https://github.com/angular/angular-bazel-example\">\n      <img class=\"nav-logo\" src=\"/assets/github-circle-white-transparent.svg\">\n    </a>\n  </mat-toolbar>\n</nav>\n\n<mat-drawer-container>\n  <mat-drawer #drawer opened mode=\"side\">\n    <mat-nav-list>\n      <a mat-list-item routerLink=\"/\"> Home </a>\n      <a mat-list-item routerLink=\"/hello\"> Hello World </a>\n      <a mat-list-item routerLink=\"/todos\"> Todos </a>\n      \n      \n      \n      \n      \n      \n      \n      \n      \n      \n      <a mat-list-item routerLink=\"/billing\"><mat-icon>credit_card</mat-icon> Billing </a>\n      <a mat-list-item routerLink=\"/compute\"><mat-icon>memory</mat-icon> Compute </a>\n      <a mat-list-item routerLink=\"/datastore\"><mat-icon>view_agenda</mat-icon> Datastore </a>\n      <a mat-list-item routerLink=\"/functions\"><mat-icon>functions</mat-icon> Functions </a>\n      <a mat-list-item routerLink=\"/logging\"><mat-icon>format_align_left</mat-icon> Logging </a>\n      <a mat-list-item routerLink=\"/monitoring\"><mat-icon>device_unknown</mat-icon> Monitoring </a>\n      <a mat-list-item routerLink=\"/networking\"><mat-icon>settings_ethernet</mat-icon> Networking </a>\n      <a mat-list-item routerLink=\"/registry\"><mat-icon>ballot</mat-icon> Registry </a>\n      <a mat-list-item routerLink=\"/storage\"><mat-icon>folder</mat-icon> Storage </a>\n      <a mat-list-item routerLink=\"/support\"><mat-icon>headset_mic</mat-icon> Support </a>\n    </mat-nav-list>\n  </mat-drawer>\n\n  <mat-drawer-content>\n    <div class=\"content\">\n      <router-outlet></router-outlet>\n    </div>\n  </mat-drawer-content>\n</mat-drawer-container>"
  },
  {
    "path": "src/app/app.component.ts",
    "content": "import {Component} from '@angular/core';\n\n@Component({selector: 'app-component', templateUrl: 'app.component.html'})\nexport class AppComponent {\n}\n"
  },
  {
    "path": "src/app/app.module.ts",
    "content": "\nimport {NgModule} from '@angular/core';\nimport {BrowserModule} from '@angular/platform-browser';\nimport {BrowserAnimationsModule} from '@angular/platform-browser/animations';\nimport {StoreModule} from '@ngrx/store';\n\nimport {MaterialModule} from '../shared/material/material.module';\n\nimport {AppRoutingModule} from './app-routing.module';\nimport {AppComponent} from './app.component';\nimport {BillingModule} from './billing/billing.module';\nimport {ComputeModule} from './compute/compute.module';\nimport {DatastoreModule} from './datastore/datastore.module';\nimport {FunctionsModule} from './functions/functions.module';\nimport {HomeModule} from './home/home';\nimport {LoggingModule} from './logging/logging.module';\nimport {MonitoringModule} from './monitoring/monitoring.module';\nimport {NetworkingModule} from './networking/networking.module';\nimport {RegistryModule} from './registry/registry.module';\nimport {StorageModule} from './storage/storage.module';\nimport {SupportModule} from './support/support.module';\nimport {todoReducer} from './todos/reducers/reducers';\n\n@NgModule({\n  declarations: [AppComponent],\n  imports: [\n    AppRoutingModule, BrowserModule, BrowserAnimationsModule, MaterialModule, HomeModule,\n    StoreModule.forRoot({todoReducer}), BillingModule, ComputeModule, DatastoreModule,\n    FunctionsModule, LoggingModule, MonitoringModule, NetworkingModule, RegistryModule,\n    StorageModule, SupportModule\n  ],\n  exports: [AppComponent],\n  bootstrap: [AppComponent],\n})\nexport class AppModule {\n}\n"
  },
  {
    "path": "src/app/billing/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"billing\",\n    srcs = [\n        \"billing.module.ts\",\n        \"index/index.component.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/billing/module0\",\n        \"//src/app/billing/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/billing/billing.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class BillingModule {\n}\n"
  },
  {
    "path": "src/app/billing/index/index.component.html",
    "content": "<app-cmp0></app-cmp0>\n<app-cmp1></app-cmp1>\n<app-cmp2></app-cmp2>\n<app-cmp3></app-cmp3>"
  },
  {
    "path": "src/app/billing/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/billing/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/billing/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp0/cmp0.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp1/cmp1.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp0/cmp0.component.ts\",\n        \"cmp1/cmp1.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp0/cmp0.component.html\",\n        \"cmp1/cmp1.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/billing/module0/cmp0/cmp0.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/billing/module0/cmp0/cmp0.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/billing/module0/cmp0/cmp0.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp0Component} from './cmp0.component';\n\ndescribe('Cmp0Component', () => {\n  let component: Cmp0Component;\n  let fixture: ComponentFixture<Cmp0Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp0Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp0Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/billing/module0/cmp0/cmp0.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp0',\n  templateUrl: './cmp0.component.html',\n  styleUrls: ['./cmp0.component.scss']\n})\nexport class Cmp0Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/billing/module0/cmp1/cmp1.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/billing/module0/cmp1/cmp1.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/billing/module0/cmp1/cmp1.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp1Component} from './cmp1.component';\n\ndescribe('Cmp1Component', () => {\n  let component: Cmp1Component;\n  let fixture: ComponentFixture<Cmp1Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp1Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp1Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/billing/module0/cmp1/cmp1.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp1',\n  templateUrl: './cmp1.component.html',\n  styleUrls: ['./cmp1.component.scss']\n})\nexport class Cmp1Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/billing/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp0Component} from './cmp0/cmp0.component';\nimport {Cmp1Component} from './cmp1/cmp1.component';\n\n@NgModule({\n  declarations: [Cmp0Component, Cmp1Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp0Component, Cmp1Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/billing/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp2/cmp2.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp3/cmp3.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp2/cmp2.component.ts\",\n        \"cmp3/cmp3.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp2/cmp2.component.html\",\n        \"cmp3/cmp3.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/billing/module1/cmp2/cmp2.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/billing/module1/cmp2/cmp2.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/billing/module1/cmp2/cmp2.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp2Component} from './cmp2.component';\n\ndescribe('Cmp2Component', () => {\n  let component: Cmp2Component;\n  let fixture: ComponentFixture<Cmp2Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp2Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp2Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/billing/module1/cmp2/cmp2.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp2',\n  templateUrl: './cmp2.component.html',\n  styleUrls: ['./cmp2.component.scss']\n})\nexport class Cmp2Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/billing/module1/cmp3/cmp3.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/billing/module1/cmp3/cmp3.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/billing/module1/cmp3/cmp3.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp3Component} from './cmp3.component';\n\ndescribe('Cmp3Component', () => {\n  let component: Cmp3Component;\n  let fixture: ComponentFixture<Cmp3Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp3Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp3Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/billing/module1/cmp3/cmp3.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp3',\n  templateUrl: './cmp3.component.html',\n  styleUrls: ['./cmp3.component.scss']\n})\nexport class Cmp3Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/billing/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp2Component} from './cmp2/cmp2.component';\nimport {Cmp3Component} from './cmp3/cmp3.component';\n\n@NgModule({\n  declarations: [Cmp2Component, Cmp3Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp2Component, Cmp3Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/compute/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"compute\",\n    srcs = [\n        \"compute.module.ts\",\n        \"index/index.component.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/compute/module0\",\n        \"//src/app/compute/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/compute/compute.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class ComputeModule {\n}\n"
  },
  {
    "path": "src/app/compute/index/index.component.html",
    "content": "<app-cmp4></app-cmp4>\n<app-cmp5></app-cmp5>\n<app-cmp6></app-cmp6>\n<app-cmp7></app-cmp7>"
  },
  {
    "path": "src/app/compute/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/compute/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/compute/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp4/cmp4.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp5/cmp5.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp4/cmp4.component.ts\",\n        \"cmp5/cmp5.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp4/cmp4.component.html\",\n        \"cmp5/cmp5.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/compute/module0/cmp4/cmp4.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Compute</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/compute/module0/cmp4/cmp4.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/compute/module0/cmp4/cmp4.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp4Component} from './cmp4.component';\n\ndescribe('Cmp4Component', () => {\n  let component: Cmp4Component;\n  let fixture: ComponentFixture<Cmp4Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp4Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp4Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/compute/module0/cmp4/cmp4.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp4',\n  templateUrl: './cmp4.component.html',\n  styleUrls: ['./cmp4.component.scss']\n})\nexport class Cmp4Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/compute/module0/cmp5/cmp5.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/compute/module0/cmp5/cmp5.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/compute/module0/cmp5/cmp5.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp5Component} from './cmp5.component';\n\ndescribe('Cmp5Component', () => {\n  let component: Cmp5Component;\n  let fixture: ComponentFixture<Cmp5Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp5Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp5Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/compute/module0/cmp5/cmp5.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp5',\n  templateUrl: './cmp5.component.html',\n  styleUrls: ['./cmp5.component.scss']\n})\nexport class Cmp5Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/compute/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp4Component} from './cmp4/cmp4.component';\nimport {Cmp5Component} from './cmp5/cmp5.component';\n\n@NgModule({\n  declarations: [Cmp4Component, Cmp5Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp4Component, Cmp5Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/compute/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp6/cmp6.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp7/cmp7.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp6/cmp6.component.ts\",\n        \"cmp7/cmp7.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp6/cmp6.component.html\",\n        \"cmp7/cmp7.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/compute/module1/cmp6/cmp6.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/compute/module1/cmp6/cmp6.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/compute/module1/cmp6/cmp6.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp6Component} from './cmp6.component';\n\ndescribe('Cmp6Component', () => {\n  let component: Cmp6Component;\n  let fixture: ComponentFixture<Cmp6Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp6Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp6Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/compute/module1/cmp6/cmp6.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp6',\n  templateUrl: './cmp6.component.html',\n  styleUrls: ['./cmp6.component.scss']\n})\nexport class Cmp6Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/compute/module1/cmp7/cmp7.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/compute/module1/cmp7/cmp7.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/compute/module1/cmp7/cmp7.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp7Component} from './cmp7.component';\n\ndescribe('Cmp7Component', () => {\n  let component: Cmp7Component;\n  let fixture: ComponentFixture<Cmp7Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp7Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp7Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/compute/module1/cmp7/cmp7.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp7',\n  templateUrl: './cmp7.component.html',\n  styleUrls: ['./cmp7.component.scss']\n})\nexport class Cmp7Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/compute/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp6Component} from './cmp6/cmp6.component';\nimport {Cmp7Component} from './cmp7/cmp7.component';\n\n@NgModule({\n  declarations: [Cmp6Component, Cmp7Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp6Component, Cmp7Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/datastore/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"datastore\",\n    srcs = [\n        \"datastore.module.ts\",\n        \"index/index.component.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/datastore/module0\",\n        \"//src/app/datastore/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/datastore/datastore.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class DatastoreModule {\n}\n"
  },
  {
    "path": "src/app/datastore/index/index.component.html",
    "content": "<app-cmp8></app-cmp8>\n<app-cmp9></app-cmp9>\n<app-cmp10></app-cmp10>\n<app-cmp11></app-cmp11>"
  },
  {
    "path": "src/app/datastore/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/datastore/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/datastore/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp8/cmp8.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp9/cmp9.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp8/cmp8.component.ts\",\n        \"cmp9/cmp9.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp8/cmp8.component.html\",\n        \"cmp9/cmp9.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/datastore/module0/cmp8/cmp8.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Datastore</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/datastore/module0/cmp8/cmp8.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/datastore/module0/cmp8/cmp8.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp8Component} from './cmp8.component';\n\ndescribe('Cmp8Component', () => {\n  let component: Cmp8Component;\n  let fixture: ComponentFixture<Cmp8Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp8Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp8Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/datastore/module0/cmp8/cmp8.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp8',\n  templateUrl: './cmp8.component.html',\n  styleUrls: ['./cmp8.component.scss']\n})\nexport class Cmp8Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/datastore/module0/cmp9/cmp9.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/datastore/module0/cmp9/cmp9.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/datastore/module0/cmp9/cmp9.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp9Component} from './cmp9.component';\n\ndescribe('Cmp9Component', () => {\n  let component: Cmp9Component;\n  let fixture: ComponentFixture<Cmp9Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp9Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp9Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/datastore/module0/cmp9/cmp9.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp9',\n  templateUrl: './cmp9.component.html',\n  styleUrls: ['./cmp9.component.scss']\n})\nexport class Cmp9Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/datastore/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp8Component} from './cmp8/cmp8.component';\nimport {Cmp9Component} from './cmp9/cmp9.component';\n\n@NgModule({\n  declarations: [Cmp8Component, Cmp9Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp8Component, Cmp9Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/datastore/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp10/cmp10.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp11/cmp11.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp10/cmp10.component.ts\",\n        \"cmp11/cmp11.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp10/cmp10.component.html\",\n        \"cmp11/cmp11.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/datastore/module1/cmp10/cmp10.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/datastore/module1/cmp10/cmp10.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/datastore/module1/cmp10/cmp10.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp10Component} from './cmp10.component';\n\ndescribe('Cmp10Component', () => {\n  let component: Cmp10Component;\n  let fixture: ComponentFixture<Cmp10Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp10Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp10Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/datastore/module1/cmp10/cmp10.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp10',\n  templateUrl: './cmp10.component.html',\n  styleUrls: ['./cmp10.component.scss']\n})\nexport class Cmp10Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/datastore/module1/cmp11/cmp11.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/datastore/module1/cmp11/cmp11.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/datastore/module1/cmp11/cmp11.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp11Component} from './cmp11.component';\n\ndescribe('Cmp11Component', () => {\n  let component: Cmp11Component;\n  let fixture: ComponentFixture<Cmp11Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp11Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp11Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/datastore/module1/cmp11/cmp11.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp11',\n  templateUrl: './cmp11.component.html',\n  styleUrls: ['./cmp11.component.scss']\n})\nexport class Cmp11Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/datastore/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp10Component} from './cmp10/cmp10.component';\nimport {Cmp11Component} from './cmp11/cmp11.component';\n\n@NgModule({\n  declarations: [Cmp10Component, Cmp11Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp10Component, Cmp11Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/functions/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"functions\",\n    srcs = [\n        \"functions.module.ts\",\n        \"index/index.component.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/functions/module0\",\n        \"//src/app/functions/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/functions/functions.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class FunctionsModule {\n}\n"
  },
  {
    "path": "src/app/functions/index/index.component.html",
    "content": "<app-cmp12></app-cmp12>\n<app-cmp13></app-cmp13>\n<app-cmp14></app-cmp14>\n<app-cmp15></app-cmp15>"
  },
  {
    "path": "src/app/functions/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/functions/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/functions/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp12/cmp12.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp13/cmp13.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp12/cmp12.component.ts\",\n        \"cmp13/cmp13.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp12/cmp12.component.html\",\n        \"cmp13/cmp13.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/functions/module0/cmp12/cmp12.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Functions</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/functions/module0/cmp12/cmp12.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/functions/module0/cmp12/cmp12.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp12Component} from './cmp12.component';\n\ndescribe('Cmp12Component', () => {\n  let component: Cmp12Component;\n  let fixture: ComponentFixture<Cmp12Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp12Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp12Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/functions/module0/cmp12/cmp12.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp12',\n  templateUrl: './cmp12.component.html',\n  styleUrls: ['./cmp12.component.scss']\n})\nexport class Cmp12Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/functions/module0/cmp13/cmp13.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/functions/module0/cmp13/cmp13.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/functions/module0/cmp13/cmp13.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp13Component} from './cmp13.component';\n\ndescribe('Cmp13Component', () => {\n  let component: Cmp13Component;\n  let fixture: ComponentFixture<Cmp13Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp13Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp13Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/functions/module0/cmp13/cmp13.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp13',\n  templateUrl: './cmp13.component.html',\n  styleUrls: ['./cmp13.component.scss']\n})\nexport class Cmp13Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/functions/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp12Component} from './cmp12/cmp12.component';\nimport {Cmp13Component} from './cmp13/cmp13.component';\n\n@NgModule({\n  declarations: [Cmp12Component, Cmp13Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp12Component, Cmp13Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/functions/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp14/cmp14.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp15/cmp15.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp14/cmp14.component.ts\",\n        \"cmp15/cmp15.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp14/cmp14.component.html\",\n        \"cmp15/cmp15.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/functions/module1/cmp14/cmp14.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/functions/module1/cmp14/cmp14.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/functions/module1/cmp14/cmp14.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp14Component} from './cmp14.component';\n\ndescribe('Cmp14Component', () => {\n  let component: Cmp14Component;\n  let fixture: ComponentFixture<Cmp14Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp14Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp14Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/functions/module1/cmp14/cmp14.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp14',\n  templateUrl: './cmp14.component.html',\n  styleUrls: ['./cmp14.component.scss']\n})\nexport class Cmp14Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/functions/module1/cmp15/cmp15.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/functions/module1/cmp15/cmp15.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/functions/module1/cmp15/cmp15.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp15Component} from './cmp15.component';\n\ndescribe('Cmp15Component', () => {\n  let component: Cmp15Component;\n  let fixture: ComponentFixture<Cmp15Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp15Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp15Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/functions/module1/cmp15/cmp15.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp15',\n  templateUrl: './cmp15.component.html',\n  styleUrls: ['./cmp15.component.scss']\n})\nexport class Cmp15Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/functions/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp14Component} from './cmp14/cmp14.component';\nimport {Cmp15Component} from './cmp15/cmp15.component';\n\n@NgModule({\n  declarations: [Cmp14Component, Cmp15Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp14Component, Cmp15Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/hello-world/BUILD.bazel",
    "content": "load(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"hello-world-styles\",\n    src = \"hello-world.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n]\n\nng_module(\n    name = \"hello-world\",\n    srcs = [\n        \"hello-world.component.ts\",\n        \"hello-world.module.ts\",\n    ],\n    assets = [\n        \":hello-world.component.html\",\n        \":hello-world-styles\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"//src/lib/shorten\",\n        \"//src/shared/material\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/forms\",\n        \"@npm//@angular/router\",\n        \"@npm//date-fns\",\n    ],\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":hello-world\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ],\n)\n\nts_web_test_suite(\n    name = \"test\",\n    srcs = [\n        # We are manaully adding the bazel generated named-UMD date-fns bundle here as\n        # named-UMD bundles for non-APF npm packages are not yet automatically added.\n        # This file is generated by the npm_umd_bundle @npm//date-fns:date-fns__umd\n        # rule that is setup by yarn_install.\n        \"@npm//date-fns:date-fns.umd.js\",\n    ],\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/hello-world/hello-world.component.html",
    "content": "<h1>Home</h1>\n\n<mat-card>\n  <mat-card-title>\n    <div id=\"greeting\">Hello {{ name }}</div>\n  </mat-card-title>\n\n  <mat-card-content>\n    <mat-form-field><input matInput [(ngModel)]=\"name\"/></mat-form-field>\n    <p>Today is {{ date }}</p>\n  </mat-card-content>\n\n  <mat-card-footer>\n    <div class=\"mood-icon\"><mat-icon>mood</mat-icon></div>\n  </mat-card-footer>\n</mat-card>\n\n"
  },
  {
    "path": "src/app/hello-world/hello-world.component.scss",
    "content": ".mood-icon {\n  margin: 1rem;\n}\n"
  },
  {
    "path": "src/app/hello-world/hello-world.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {By} from '@angular/platform-browser';\nimport {BrowserAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {HelloWorldComponent} from './hello-world.component';\nimport {HelloWorldModuleNgSummary} from './hello-world.module.ngsummary';\n\ndescribe('BannerComponent (inline template)', () => {\n  let comp: HelloWorldComponent;\n  let fixture: ComponentFixture<HelloWorldComponent>;\n  let el: HTMLElement;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({\n      declarations: [HelloWorldComponent],  // declare the test component\n      aotSummaries: HelloWorldModuleNgSummary,\n      imports: [BrowserAnimationsModule],\n    });\n    TestBed.compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(HelloWorldComponent);\n    comp = fixture.componentInstance;\n    el = fixture.debugElement.query(By.css('div')).nativeElement;\n  });\n\n  it('should display original title', () => {\n    fixture.detectChanges();\n    expect(el.textContent).toContain(comp.name);\n  });\n\n  it('should display a different test title', () => {\n    comp.name = 'Test';\n    fixture.detectChanges();\n    expect(el.textContent).toContain('Test');\n  });\n});\n"
  },
  {
    "path": "src/app/hello-world/hello-world.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {shorten} from '@bazel/shorten';\nimport {format} from 'date-fns';\n\n@Component({\n  selector: 'hello-world',\n  templateUrl: 'hello-world.component.html',\n  styleUrls: ['./hello-world.component.scss']\n})\nexport class HelloWorldComponent {\n  name: string = shorten('Adolph Blaine Wolfeschlegelsteinhausenbergerdorff, Senior ', 15);\n  date: string = format(new Date(), 'MMMM D, YYYY');\n}\n"
  },
  {
    "path": "src/app/hello-world/hello-world.module.ts",
    "content": "import {NgModule} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {RouterModule} from '@angular/router';\nimport {MaterialModule} from '../../shared/material/material.module';\n\nimport {HelloWorldComponent} from './hello-world.component';\n\n@NgModule({\n  declarations: [HelloWorldComponent],\n  imports: [\n    FormsModule, RouterModule, MaterialModule,\n    RouterModule.forChild([{path: '', component: HelloWorldComponent}])\n  ],\n  exports: [HelloWorldComponent],\n})\nexport class HelloWorldModule {\n}\n"
  },
  {
    "path": "src/app/home/BUILD.bazel",
    "content": "load(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nng_module(\n    name = \"home\",\n    srcs = [\"home.ts\"],\n    assets = [\"home.html\"],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n    ],\n)\n"
  },
  {
    "path": "src/app/home/home.html",
    "content": "<h1>Angular Bazel Example</h1>\n\nThis is an example of building an Angular app at scale.\nIt uses <code>BUILD.bazel</code> files to customize the configuration of Bazel.\nThis means the application is compiled in many small libraries, giving us incremental builds.\n\nRead more about the example on the <a href=\"https://github.com/angular/angular-bazel-example\">GitHub README</a>\n\n<h2>\n    Navigating the example\n</h2>\n\nThis application mimics a developer console for a cloud provider.\nThere are ten sections in the left nav, which represent ten different teams that contribute their functionality to the single-page application.\nThis is similar to how Google Cloud Console is developed with Bazel.\n\n"
  },
  {
    "path": "src/app/home/home.ts",
    "content": "import {Component, NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\n@Component({\n  selector: 'home',\n  templateUrl: './home.html',\n})\nexport class Home {\n}\n\n@NgModule({\n  declarations: [Home],\n  imports: [\n    RouterModule.forChild([{path: '', component: Home}]),\n  ],\n})\nexport class HomeModule {\n}"
  },
  {
    "path": "src/app/logging/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"logging\",\n    srcs = [\n        \"index/index.component.ts\",\n        \"logging.module.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/logging/module0\",\n        \"//src/app/logging/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/logging/index/index.component.html",
    "content": "<app-cmp16></app-cmp16>\n<app-cmp17></app-cmp17>\n<app-cmp18></app-cmp18>\n<app-cmp19></app-cmp19>"
  },
  {
    "path": "src/app/logging/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/logging/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/logging/logging.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class LoggingModule {\n}\n"
  },
  {
    "path": "src/app/logging/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp16/cmp16.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp17/cmp17.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp16/cmp16.component.ts\",\n        \"cmp17/cmp17.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp16/cmp16.component.html\",\n        \"cmp17/cmp17.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/logging/module0/cmp16/cmp16.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Logging</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/logging/module0/cmp16/cmp16.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/logging/module0/cmp16/cmp16.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp16Component} from './cmp16.component';\n\ndescribe('Cmp16Component', () => {\n  let component: Cmp16Component;\n  let fixture: ComponentFixture<Cmp16Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp16Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp16Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/logging/module0/cmp16/cmp16.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp16',\n  templateUrl: './cmp16.component.html',\n  styleUrls: ['./cmp16.component.scss']\n})\nexport class Cmp16Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/logging/module0/cmp17/cmp17.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/logging/module0/cmp17/cmp17.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/logging/module0/cmp17/cmp17.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp17Component} from './cmp17.component';\n\ndescribe('Cmp17Component', () => {\n  let component: Cmp17Component;\n  let fixture: ComponentFixture<Cmp17Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp17Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp17Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/logging/module0/cmp17/cmp17.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp17',\n  templateUrl: './cmp17.component.html',\n  styleUrls: ['./cmp17.component.scss']\n})\nexport class Cmp17Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/logging/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp16Component} from './cmp16/cmp16.component';\nimport {Cmp17Component} from './cmp17/cmp17.component';\n\n@NgModule({\n  declarations: [Cmp16Component, Cmp17Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp16Component, Cmp17Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/logging/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp18/cmp18.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp19/cmp19.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp18/cmp18.component.ts\",\n        \"cmp19/cmp19.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp18/cmp18.component.html\",\n        \"cmp19/cmp19.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/logging/module1/cmp18/cmp18.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/logging/module1/cmp18/cmp18.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/logging/module1/cmp18/cmp18.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp18Component} from './cmp18.component';\n\ndescribe('Cmp18Component', () => {\n  let component: Cmp18Component;\n  let fixture: ComponentFixture<Cmp18Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp18Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp18Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/logging/module1/cmp18/cmp18.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp18',\n  templateUrl: './cmp18.component.html',\n  styleUrls: ['./cmp18.component.scss']\n})\nexport class Cmp18Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/logging/module1/cmp19/cmp19.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/logging/module1/cmp19/cmp19.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/logging/module1/cmp19/cmp19.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp19Component} from './cmp19.component';\n\ndescribe('Cmp19Component', () => {\n  let component: Cmp19Component;\n  let fixture: ComponentFixture<Cmp19Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp19Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp19Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/logging/module1/cmp19/cmp19.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp19',\n  templateUrl: './cmp19.component.html',\n  styleUrls: ['./cmp19.component.scss']\n})\nexport class Cmp19Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/logging/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp18Component} from './cmp18/cmp18.component';\nimport {Cmp19Component} from './cmp19/cmp19.component';\n\n@NgModule({\n  declarations: [Cmp18Component, Cmp19Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp18Component, Cmp19Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/monitoring/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"monitoring\",\n    srcs = [\n        \"index/index.component.ts\",\n        \"monitoring.module.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/monitoring/module0\",\n        \"//src/app/monitoring/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/monitoring/index/index.component.html",
    "content": "<app-cmp20></app-cmp20>\n<app-cmp21></app-cmp21>\n<app-cmp22></app-cmp22>\n<app-cmp23></app-cmp23>"
  },
  {
    "path": "src/app/monitoring/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/monitoring/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/monitoring/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp20/cmp20.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp21/cmp21.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp20/cmp20.component.ts\",\n        \"cmp21/cmp21.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp20/cmp20.component.html\",\n        \"cmp21/cmp21.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/monitoring/module0/cmp20/cmp20.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Monitoring</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/monitoring/module0/cmp20/cmp20.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/monitoring/module0/cmp20/cmp20.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp20Component} from './cmp20.component';\n\ndescribe('Cmp20Component', () => {\n  let component: Cmp20Component;\n  let fixture: ComponentFixture<Cmp20Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp20Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp20Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/monitoring/module0/cmp20/cmp20.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp20',\n  templateUrl: './cmp20.component.html',\n  styleUrls: ['./cmp20.component.scss']\n})\nexport class Cmp20Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/monitoring/module0/cmp21/cmp21.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/monitoring/module0/cmp21/cmp21.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/monitoring/module0/cmp21/cmp21.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp21Component} from './cmp21.component';\n\ndescribe('Cmp21Component', () => {\n  let component: Cmp21Component;\n  let fixture: ComponentFixture<Cmp21Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp21Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp21Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/monitoring/module0/cmp21/cmp21.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp21',\n  templateUrl: './cmp21.component.html',\n  styleUrls: ['./cmp21.component.scss']\n})\nexport class Cmp21Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/monitoring/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp20Component} from './cmp20/cmp20.component';\nimport {Cmp21Component} from './cmp21/cmp21.component';\n\n@NgModule({\n  declarations: [Cmp20Component, Cmp21Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp20Component, Cmp21Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/monitoring/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp22/cmp22.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp23/cmp23.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp22/cmp22.component.ts\",\n        \"cmp23/cmp23.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp22/cmp22.component.html\",\n        \"cmp23/cmp23.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/monitoring/module1/cmp22/cmp22.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/monitoring/module1/cmp22/cmp22.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/monitoring/module1/cmp22/cmp22.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp22Component} from './cmp22.component';\n\ndescribe('Cmp22Component', () => {\n  let component: Cmp22Component;\n  let fixture: ComponentFixture<Cmp22Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp22Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp22Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/monitoring/module1/cmp22/cmp22.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp22',\n  templateUrl: './cmp22.component.html',\n  styleUrls: ['./cmp22.component.scss']\n})\nexport class Cmp22Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/monitoring/module1/cmp23/cmp23.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/monitoring/module1/cmp23/cmp23.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/monitoring/module1/cmp23/cmp23.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp23Component} from './cmp23.component';\n\ndescribe('Cmp23Component', () => {\n  let component: Cmp23Component;\n  let fixture: ComponentFixture<Cmp23Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp23Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp23Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/monitoring/module1/cmp23/cmp23.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp23',\n  templateUrl: './cmp23.component.html',\n  styleUrls: ['./cmp23.component.scss']\n})\nexport class Cmp23Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/monitoring/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp22Component} from './cmp22/cmp22.component';\nimport {Cmp23Component} from './cmp23/cmp23.component';\n\n@NgModule({\n  declarations: [Cmp22Component, Cmp23Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp22Component, Cmp23Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/monitoring/monitoring.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class MonitoringModule {\n}\n"
  },
  {
    "path": "src/app/networking/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"networking\",\n    srcs = [\n        \"index/index.component.ts\",\n        \"networking.module.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/networking/module0\",\n        \"//src/app/networking/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/networking/index/index.component.html",
    "content": "<app-cmp24></app-cmp24>\n<app-cmp25></app-cmp25>\n<app-cmp26></app-cmp26>\n<app-cmp27></app-cmp27>"
  },
  {
    "path": "src/app/networking/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/networking/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/networking/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp24/cmp24.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp25/cmp25.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp24/cmp24.component.ts\",\n        \"cmp25/cmp25.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp24/cmp24.component.html\",\n        \"cmp25/cmp25.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/networking/module0/cmp24/cmp24.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Networking</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/networking/module0/cmp24/cmp24.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/networking/module0/cmp24/cmp24.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp24Component} from './cmp24.component';\n\ndescribe('Cmp24Component', () => {\n  let component: Cmp24Component;\n  let fixture: ComponentFixture<Cmp24Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp24Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp24Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/networking/module0/cmp24/cmp24.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp24',\n  templateUrl: './cmp24.component.html',\n  styleUrls: ['./cmp24.component.scss']\n})\nexport class Cmp24Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/networking/module0/cmp25/cmp25.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/networking/module0/cmp25/cmp25.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/networking/module0/cmp25/cmp25.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp25Component} from './cmp25.component';\n\ndescribe('Cmp25Component', () => {\n  let component: Cmp25Component;\n  let fixture: ComponentFixture<Cmp25Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp25Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp25Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/networking/module0/cmp25/cmp25.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp25',\n  templateUrl: './cmp25.component.html',\n  styleUrls: ['./cmp25.component.scss']\n})\nexport class Cmp25Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/networking/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp24Component} from './cmp24/cmp24.component';\nimport {Cmp25Component} from './cmp25/cmp25.component';\n\n@NgModule({\n  declarations: [Cmp24Component, Cmp25Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp24Component, Cmp25Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/networking/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp26/cmp26.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp27/cmp27.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp26/cmp26.component.ts\",\n        \"cmp27/cmp27.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp26/cmp26.component.html\",\n        \"cmp27/cmp27.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/networking/module1/cmp26/cmp26.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/networking/module1/cmp26/cmp26.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/networking/module1/cmp26/cmp26.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp26Component} from './cmp26.component';\n\ndescribe('Cmp26Component', () => {\n  let component: Cmp26Component;\n  let fixture: ComponentFixture<Cmp26Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp26Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp26Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/networking/module1/cmp26/cmp26.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp26',\n  templateUrl: './cmp26.component.html',\n  styleUrls: ['./cmp26.component.scss']\n})\nexport class Cmp26Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/networking/module1/cmp27/cmp27.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/networking/module1/cmp27/cmp27.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/networking/module1/cmp27/cmp27.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp27Component} from './cmp27.component';\n\ndescribe('Cmp27Component', () => {\n  let component: Cmp27Component;\n  let fixture: ComponentFixture<Cmp27Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp27Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp27Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/networking/module1/cmp27/cmp27.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp27',\n  templateUrl: './cmp27.component.html',\n  styleUrls: ['./cmp27.component.scss']\n})\nexport class Cmp27Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/networking/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp26Component} from './cmp26/cmp26.component';\nimport {Cmp27Component} from './cmp27/cmp27.component';\n\n@NgModule({\n  declarations: [Cmp26Component, Cmp27Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp26Component, Cmp27Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/networking/networking.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class NetworkingModule {\n}\n"
  },
  {
    "path": "src/app/registry/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"registry\",\n    srcs = [\n        \"index/index.component.ts\",\n        \"registry.module.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/registry/module0\",\n        \"//src/app/registry/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/registry/index/index.component.html",
    "content": "<app-cmp28></app-cmp28>\n<app-cmp29></app-cmp29>\n<app-cmp30></app-cmp30>\n<app-cmp31></app-cmp31>"
  },
  {
    "path": "src/app/registry/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/registry/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/registry/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp28/cmp28.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp29/cmp29.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp28/cmp28.component.ts\",\n        \"cmp29/cmp29.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp28/cmp28.component.html\",\n        \"cmp29/cmp29.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/registry/module0/cmp28/cmp28.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Registry</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/registry/module0/cmp28/cmp28.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/registry/module0/cmp28/cmp28.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp28Component} from './cmp28.component';\n\ndescribe('Cmp28Component', () => {\n  let component: Cmp28Component;\n  let fixture: ComponentFixture<Cmp28Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp28Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp28Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/registry/module0/cmp28/cmp28.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp28',\n  templateUrl: './cmp28.component.html',\n  styleUrls: ['./cmp28.component.scss']\n})\nexport class Cmp28Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/registry/module0/cmp29/cmp29.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/registry/module0/cmp29/cmp29.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/registry/module0/cmp29/cmp29.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp29Component} from './cmp29.component';\n\ndescribe('Cmp29Component', () => {\n  let component: Cmp29Component;\n  let fixture: ComponentFixture<Cmp29Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp29Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp29Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/registry/module0/cmp29/cmp29.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp29',\n  templateUrl: './cmp29.component.html',\n  styleUrls: ['./cmp29.component.scss']\n})\nexport class Cmp29Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/registry/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp28Component} from './cmp28/cmp28.component';\nimport {Cmp29Component} from './cmp29/cmp29.component';\n\n@NgModule({\n  declarations: [Cmp28Component, Cmp29Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp28Component, Cmp29Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/registry/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp30/cmp30.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp31/cmp31.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp30/cmp30.component.ts\",\n        \"cmp31/cmp31.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp30/cmp30.component.html\",\n        \"cmp31/cmp31.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/registry/module1/cmp30/cmp30.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/registry/module1/cmp30/cmp30.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/registry/module1/cmp30/cmp30.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp30Component} from './cmp30.component';\n\ndescribe('Cmp30Component', () => {\n  let component: Cmp30Component;\n  let fixture: ComponentFixture<Cmp30Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp30Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp30Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/registry/module1/cmp30/cmp30.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp30',\n  templateUrl: './cmp30.component.html',\n  styleUrls: ['./cmp30.component.scss']\n})\nexport class Cmp30Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/registry/module1/cmp31/cmp31.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/registry/module1/cmp31/cmp31.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/registry/module1/cmp31/cmp31.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp31Component} from './cmp31.component';\n\ndescribe('Cmp31Component', () => {\n  let component: Cmp31Component;\n  let fixture: ComponentFixture<Cmp31Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp31Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp31Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/registry/module1/cmp31/cmp31.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp31',\n  templateUrl: './cmp31.component.html',\n  styleUrls: ['./cmp31.component.scss']\n})\nexport class Cmp31Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/registry/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp30Component} from './cmp30/cmp30.component';\nimport {Cmp31Component} from './cmp31/cmp31.component';\n\n@NgModule({\n  declarations: [Cmp30Component, Cmp31Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp30Component, Cmp31Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/registry/registry.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class RegistryModule {\n}\n"
  },
  {
    "path": "src/app/storage/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"storage\",\n    srcs = [\n        \"index/index.component.ts\",\n        \"storage.module.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/storage/module0\",\n        \"//src/app/storage/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/storage/index/index.component.html",
    "content": "<app-cmp32></app-cmp32>\n<app-cmp33></app-cmp33>\n<app-cmp34></app-cmp34>\n<app-cmp35></app-cmp35>"
  },
  {
    "path": "src/app/storage/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/storage/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/storage/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp32/cmp32.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp33/cmp33.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp32/cmp32.component.ts\",\n        \"cmp33/cmp33.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp32/cmp32.component.html\",\n        \"cmp33/cmp33.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/storage/module0/cmp32/cmp32.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Storage</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/storage/module0/cmp32/cmp32.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/storage/module0/cmp32/cmp32.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp32Component} from './cmp32.component';\n\ndescribe('Cmp32Component', () => {\n  let component: Cmp32Component;\n  let fixture: ComponentFixture<Cmp32Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp32Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp32Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/storage/module0/cmp32/cmp32.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp32',\n  templateUrl: './cmp32.component.html',\n  styleUrls: ['./cmp32.component.scss']\n})\nexport class Cmp32Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/storage/module0/cmp33/cmp33.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/storage/module0/cmp33/cmp33.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/storage/module0/cmp33/cmp33.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp33Component} from './cmp33.component';\n\ndescribe('Cmp33Component', () => {\n  let component: Cmp33Component;\n  let fixture: ComponentFixture<Cmp33Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp33Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp33Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/storage/module0/cmp33/cmp33.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp33',\n  templateUrl: './cmp33.component.html',\n  styleUrls: ['./cmp33.component.scss']\n})\nexport class Cmp33Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/storage/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp32Component} from './cmp32/cmp32.component';\nimport {Cmp33Component} from './cmp33/cmp33.component';\n\n@NgModule({\n  declarations: [Cmp32Component, Cmp33Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp32Component, Cmp33Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/storage/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp34/cmp34.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp35/cmp35.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp34/cmp34.component.ts\",\n        \"cmp35/cmp35.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp34/cmp34.component.html\",\n        \"cmp35/cmp35.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/storage/module1/cmp34/cmp34.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/storage/module1/cmp34/cmp34.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/storage/module1/cmp34/cmp34.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp34Component} from './cmp34.component';\n\ndescribe('Cmp34Component', () => {\n  let component: Cmp34Component;\n  let fixture: ComponentFixture<Cmp34Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp34Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp34Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/storage/module1/cmp34/cmp34.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp34',\n  templateUrl: './cmp34.component.html',\n  styleUrls: ['./cmp34.component.scss']\n})\nexport class Cmp34Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/storage/module1/cmp35/cmp35.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/storage/module1/cmp35/cmp35.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/storage/module1/cmp35/cmp35.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp35Component} from './cmp35.component';\n\ndescribe('Cmp35Component', () => {\n  let component: Cmp35Component;\n  let fixture: ComponentFixture<Cmp35Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp35Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp35Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/storage/module1/cmp35/cmp35.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp35',\n  templateUrl: './cmp35.component.html',\n  styleUrls: ['./cmp35.component.scss']\n})\nexport class Cmp35Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/storage/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp34Component} from './cmp34/cmp34.component';\nimport {Cmp35Component} from './cmp35/cmp35.component';\n\n@NgModule({\n  declarations: [Cmp34Component, Cmp35Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp34Component, Cmp35Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/storage/storage.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class StorageModule {\n}\n"
  },
  {
    "path": "src/app/support/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"support\",\n    srcs = [\n        \"index/index.component.ts\",\n        \"support.module.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        \"//src/app/support/module0\",\n        \"//src/app/support/module1\",\n    ],\n)\n"
  },
  {
    "path": "src/app/support/index/index.component.html",
    "content": "<app-cmp36></app-cmp36>\n<app-cmp37></app-cmp37>\n<app-cmp38></app-cmp38>\n<app-cmp39></app-cmp39>"
  },
  {
    "path": "src/app/support/index/index.component.spec.ts",
    "content": "import {async, ComponentFixture, TestBed} from '@angular/core/testing';\n\nimport {IndexComponent} from './index.component';\n\ndescribe('IndexComponent', () => {\n  let component: IndexComponent;\n  let fixture: ComponentFixture<IndexComponent>;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({declarations: [IndexComponent]}).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(IndexComponent);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  it('should create', () => {\n    expect(component).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "src/app/support/index/index.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\n\n@Component({selector: 'app-index', templateUrl: './index.component.html', styles: []})\nexport class IndexComponent implements OnInit {\n  constructor() {}\n\n  ngOnInit() {}\n}\n"
  },
  {
    "path": "src/app/support/module0/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp36/cmp36.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp37/cmp37.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module0\",\n    srcs = [\n        \"cmp36/cmp36.component.ts\",\n        \"cmp37/cmp37.component.ts\",\n        \"module0.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp36/cmp36.component.html\",\n        \"cmp37/cmp37.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module0\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/support/module0/cmp36/cmp36.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Support</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/support/module0/cmp36/cmp36.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/support/module0/cmp36/cmp36.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp36Component} from './cmp36.component';\n\ndescribe('Cmp36Component', () => {\n  let component: Cmp36Component;\n  let fixture: ComponentFixture<Cmp36Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp36Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp36Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/support/module0/cmp36/cmp36.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp36',\n  templateUrl: './cmp36.component.html',\n  styleUrls: ['./cmp36.component.scss']\n})\nexport class Cmp36Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/support/module0/cmp37/cmp37.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/support/module0/cmp37/cmp37.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/support/module0/cmp37/cmp37.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp37Component} from './cmp37.component';\n\ndescribe('Cmp37Component', () => {\n  let component: Cmp37Component;\n  let fixture: ComponentFixture<Cmp37Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp37Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp37Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/support/module0/cmp37/cmp37.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp37',\n  templateUrl: './cmp37.component.html',\n  styleUrls: ['./cmp37.component.scss']\n})\nexport class Cmp37Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/support/module0/module0.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp36Component} from './cmp36/cmp36.component';\nimport {Cmp37Component} from './cmp37/cmp37.component';\n\n@NgModule({\n  declarations: [Cmp36Component, Cmp37Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp36Component, Cmp37Component]\n})\nexport class Module0Module {\n}\n"
  },
  {
    "path": "src/app/support/module1/BUILD.bazel",
    "content": "# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"module0_styles\",\n    src = \"cmp38/cmp38.component.scss\",\n)\n\nsass_binary(\n    name = \"module1_styles\",\n    src = \"cmp39/cmp39.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module1\",\n    srcs = [\n        \"cmp38/cmp38.component.ts\",\n        \"cmp39/cmp39.component.ts\",\n        \"module1.module.ts\",\n    ],\n    assets = [\n        \":module0_styles\",\n        \":module1_styles\",\n        \"cmp38/cmp38.component.html\",\n        \"cmp39/cmp39.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module1\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n"
  },
  {
    "path": "src/app/support/module1/cmp38/cmp38.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/support/module1/cmp38/cmp38.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/support/module1/cmp38/cmp38.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp38Component} from './cmp38.component';\n\ndescribe('Cmp38Component', () => {\n  let component: Cmp38Component;\n  let fixture: ComponentFixture<Cmp38Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp38Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp38Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/support/module1/cmp38/cmp38.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp38',\n  templateUrl: './cmp38.component.html',\n  styleUrls: ['./cmp38.component.scss']\n})\nexport class Cmp38Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/support/module1/cmp39/cmp39.component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "src/app/support/module1/cmp39/cmp39.component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "src/app/support/module1/cmp39/cmp39.component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {Cmp39Component} from './cmp39.component';\n\ndescribe('Cmp39Component', () => {\n  let component: Cmp39Component;\n  let fixture: ComponentFixture<Cmp39Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [Cmp39Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(Cmp39Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "src/app/support/module1/cmp39/cmp39.component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-cmp39',\n  templateUrl: './cmp39.component.html',\n  styleUrls: ['./cmp39.component.scss']\n})\nexport class Cmp39Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "src/app/support/module1/module1.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\n\nimport {MaterialModule} from '../../../shared/material/material.module';\n\nimport {Cmp38Component} from './cmp38/cmp38.component';\nimport {Cmp39Component} from './cmp39/cmp39.component';\n\n@NgModule({\n  declarations: [Cmp38Component, Cmp39Component],\n  imports: [CommonModule, ReactiveFormsModule, MaterialModule],\n  exports: [Cmp38Component, Cmp39Component]\n})\nexport class Module1Module {\n}\n"
  },
  {
    "path": "src/app/support/support.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule} from '@angular/router';\n\nimport {IndexComponent} from './index/index.component';\nimport {Module0Module} from './module0/module0.module';\nimport {Module1Module} from './module1/module1.module';\n\n@NgModule({\n  declarations: [IndexComponent],\n  imports: [\n    CommonModule, RouterModule.forChild([{path: '', component: IndexComponent}]), Module0Module,\n    Module1Module\n  ]\n})\nexport class SupportModule {\n}\n"
  },
  {
    "path": "src/app/todos/BUILD.bazel",
    "content": "load(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nsass_binary(\n    name = \"todos-styles\",\n    src = \"todos.component.scss\",\n)\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/material\",\n]\n\nng_module(\n    name = \"todos\",\n    srcs = [\n        \"todos.component.ts\",\n        \"todos.module.ts\",\n    ],\n    assets = [\n        \"todos.component.html\",\n        \":todos-styles\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"//src/shared/material\",\n        \"//src/app/todos/reducers\",\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/forms\",\n        \"@npm//@angular/router\",\n        \"@npm//@ngrx/store\",\n        \"@npm//rxjs\",\n    ],\n)\n"
  },
  {
    "path": "src/app/todos/reducers/BUILD.bazel",
    "content": "load(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nts_library(\n    name = \"reducers\",\n    srcs = glob([\"*.ts\"]),\n    deps = [\n        \"@npm//@ngrx/store\",\n    ],\n)\n"
  },
  {
    "path": "src/app/todos/reducers/reducers.ts",
    "content": "import {Action} from '@ngrx/store';\n\nexport const ADD_TODO = 'ADD_TODO';\nexport const DELETE_TODO = 'DELETE_TODO';\nexport const UPDATE_TODO = 'UPDATE_TODO';\nexport const TOGGLE_DONE = 'TOGGLE_DONE';\n\nexport interface ActionWithPayload<T> extends Action {\n  payload: T;\n}\n\nexport interface TodoPayload {\n  index?: number;\n  done?: boolean;\n  value?: string;\n  newValue?: string;\n}\n\nexport function todoReducer(state = [], action: ActionWithPayload<TodoPayload>) {\n  switch (action.type) {\n    case ADD_TODO:\n      return [action.payload, ...state];\n    case DELETE_TODO:\n      return state.filter((item, index) => index !== action.payload.index);\n    case UPDATE_TODO:\n      return state.map((item, index) => {\n        return index === action.payload.index ? {...item, value: action.payload.newValue} : item;\n      });\n    case TOGGLE_DONE:\n      return state.map((item, index) => {\n        return index === action.payload.index ? {...item, done: !action.payload.done} : item;\n      });\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "src/app/todos/todos.component.html",
    "content": "<h1>Todos</h1>\n\n<mat-card>\n  <mat-card-title>\n    <div>{{ editing ? \"Edit\" : \"Add\" }} your todo</div>\n  </mat-card-title>\n  <mat-card-content>\n    <mat-form-field><input matInput placeholder=\"your todo\" [(ngModel)]=\"todo\"></mat-form-field>\n  </mat-card-content>\n\n  <mat-card-actions>\n    <button mat-raised-button color=\"primary\"\n      (click)=\"addTodo(todo)\"\n      [disabled]=!todo\n      *ngIf=\"!editing\">\n        Create\n    </button>\n\n    <button mat-raised-button\n      (click)=\"updateTodo(todo)\"\n      *ngIf=\"editing\">\n        Update\n    </button>\n\n    <button mat-raised-button color=\"warn\"\n      (click)=\"cancelEdit()\"\n      *ngIf=\"editing\">\n        Cancel\n    </button>\n  </mat-card-actions>\n</mat-card>\n\n<mat-list>\n  <mat-list-item *ngFor=\"let todo of todos$ | async; let i = index;\">\n    <mat-icon matListIcon (click)=\"toggleDone(todo, i)\">{{ todo.done ? \"check_box\" : \"check_box_outline_blank\" }}</mat-icon>\n    <div class=\"mat-list-text\" [class.done]=\"todo.done\">{{ todo.value }}</div>\n\t\t<div>\n\t\t\t<mat-icon matListIcon (click)=\"editTodo(todo, i)\" class=\"edit-icon\">edit</mat-icon>\n\t\t</div>\n\t\t<div>\n\t\t\t<mat-icon matListIcon (click)=\"deleteTodo(i)\">delete</mat-icon>\n\t\t</div>\n  </mat-list-item>\n</mat-list>\n"
  },
  {
    "path": "src/app/todos/todos.component.scss",
    "content": ".done {\n  text-decoration: line-through;\n}\n\n.edit-icon {\n  margin-right: 12px;\n}\n"
  },
  {
    "path": "src/app/todos/todos.component.ts",
    "content": "import {Component, OnInit} from '@angular/core';\nimport {Store} from '@ngrx/store';\nimport {Observable} from 'rxjs';\n\nimport {ADD_TODO, DELETE_TODO, TOGGLE_DONE, UPDATE_TODO} from './reducers/reducers';\n\n@Component({\n  selector: 'todos',\n  templateUrl: './todos.component.html',\n  styleUrls: ['./todos.component.scss']\n})\nexport class TodosComponent implements OnInit {\n  todos$: Observable<any>;\n  todo: string;\n  editing = false;\n  indexToEdit: number|null;\n\n  constructor(private store: Store<any>) {}\n\n  ngOnInit() {\n    this.todos$ = this.store.select('todoReducer');\n  }\n\n  addTodo(value) {\n    this.store.dispatch({type: ADD_TODO, payload: {value, done: false}});\n    this.todo = '';\n  }\n\n  deleteTodo(index) {\n    this.store.dispatch({type: DELETE_TODO, payload: {index}});\n  }\n\n  editTodo(todo, index) {\n    this.editing = true;\n    this.todo = todo.value;\n    this.indexToEdit = index;\n  }\n\n  cancelEdit() {\n    this.editing = false;\n    this.todo = '';\n    this.indexToEdit = null;\n  }\n\n  updateTodo(updatedTodo) {\n    this.store.dispatch(\n        {type: UPDATE_TODO, payload: {index: this.indexToEdit, newValue: updatedTodo}});\n    this.todo = '';\n    this.indexToEdit = null;\n    this.editing = false;\n  }\n\n  toggleDone(todo, index) {\n    this.store.dispatch({type: TOGGLE_DONE, payload: {index, done: todo.done}});\n  }\n}\n"
  },
  {
    "path": "src/app/todos/todos.module.ts",
    "content": "import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {RouterModule} from '@angular/router';\nimport {MaterialModule} from '../../shared/material/material.module';\n\nimport {TodosComponent} from './todos.component';\n\n@NgModule({\n  declarations: [TodosComponent],\n  imports: [\n    CommonModule, FormsModule, RouterModule, MaterialModule,\n    RouterModule.forChild([{path: '', component: TodosComponent}])\n  ],\n\n})\nexport class TodosModule {\n}\n"
  },
  {
    "path": "src/assets/BUILD.bazel",
    "content": "package(default_visibility = [\"//:__subpackages__\"])\n\nfilegroup(\n    name = \"assets\",\n    srcs = glob([\n        \"*.svg\",\n        \"*.png\",\n        \"*.css\",\n    ]),\n)\n"
  },
  {
    "path": "src/assets/landing.css",
    "content": "material-docs-app {\n  display: flex;\n  flex-direction: column;\n  position: absolute;\n  top: 56px;\n  bottom: 0;\n  left: 0;\n  right: 0;\n}\napp-navbar {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  z-index: 2;\n}\nmaterial-docs-app > app-guides,\nmaterial-docs-app > app-homepage,\nmaterial-docs-app > guide-viewer {\n  overflow-y: auto;\n  margin-top: -4px;\n}\n.docs-navbar-header[_ngcontent-c1] {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  padding: 8px 16px;\n}\n.flex-spacer[_ngcontent-c1] {\n  flex-grow: 1;\n}\n.docs-angular-logo[_ngcontent-c1] {\n  height: 26px;\n  margin: 0 4px 3px 0;\n  vertical-align: middle;\n}\n.docs-navbar[_ngcontent-c1],\n.docs-navbar-show-small[_ngcontent-c1] {\n  display: none;\n}\n.mat-button .mat-button-focus-overlay,\n.mat-icon-button .mat-button-focus-overlay {\n  opacity: 0;\n}\n.mat-button,\n.mat-flat-button,\n.mat-icon-button,\n.mat-stroked-button {\n  box-sizing: border-box;\n  position: relative;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  cursor: pointer;\n  outline: 0;\n  border: none;\n  -webkit-tap-highlight-color: transparent;\n  display: inline-block;\n  white-space: nowrap;\n  text-decoration: none;\n  vertical-align: baseline;\n  text-align: center;\n  margin: 0;\n  min-width: 64px;\n  line-height: 36px;\n  padding: 0 16px;\n  border-radius: 4px;\n  overflow: visible;\n}\n.mat-raised-button {\n  box-sizing: border-box;\n  position: relative;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  cursor: pointer;\n  outline: 0;\n  border: none;\n  -webkit-tap-highlight-color: transparent;\n  display: inline-block;\n  white-space: nowrap;\n  text-decoration: none;\n  vertical-align: baseline;\n  text-align: center;\n  margin: 0;\n  min-width: 64px;\n  line-height: 36px;\n  padding: 0 16px;\n  border-radius: 4px;\n  overflow: visible;\n  transform: translate3d(0, 0, 0);\n  transition: background 0.4s cubic-bezier(0.25, 0.8, 0.25, 1),\n    box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.mat-icon-button {\n  padding: 0;\n  min-width: 0;\n  width: 40px;\n  height: 40px;\n  flex-shrink: 0;\n  line-height: 40px;\n  border-radius: 50%;\n}\n.mat-icon-button .mat-icon,\n.mat-icon-button i {\n  line-height: 24px;\n}\n.mat-button-focus-overlay,\n.mat-button-ripple.mat-ripple {\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  position: absolute;\n  pointer-events: none;\n  border-radius: inherit;\n}\n.mat-button-focus-overlay {\n  opacity: 0;\n  transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\n    background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\n}\n.mat-button-ripple-round {\n  border-radius: 50%;\n  z-index: 1;\n}\n.mat-button .mat-button-wrapper > *,\n.mat-fab .mat-button-wrapper > *,\n.mat-flat-button .mat-button-wrapper > *,\n.mat-icon-button .mat-button-wrapper > *,\n.mat-mini-fab .mat-button-wrapper > *,\n.mat-raised-button .mat-button-wrapper > *,\n.mat-stroked-button .mat-button-wrapper > * {\n  vertical-align: middle;\n}\n.mat-icon {\n  background-repeat: no-repeat;\n  display: inline-block;\n  fill: currentColor;\n  height: 24px;\n  width: 24px;\n}\n.docs-header-background[_ngcontent-c9] {\n  overflow: hidden;\n}\n.docs-header-section[_ngcontent-c9] {\n  text-align: center;\n  padding-top: 60px;\n}\n.docs-header-headline[_ngcontent-c9] h1[_ngcontent-c9] {\n  font-size: 56px;\n  font-weight: 300;\n  line-height: 56px;\n  margin: 15px 5px;\n}\n.docs-header-headline[_ngcontent-c9] h2[_ngcontent-c9] {\n  font-size: 18px;\n  font-weight: 300;\n  line-height: 28px;\n  margin: 15px 0 25px;\n  color: #fff;\n}\n.docs-homepage-promo[_ngcontent-c9] {\n  align-items: center;\n  display: flex;\n  flex-direction: column;\n  padding: 16px;\n}\nh2 {\n  font-size: 25px;\n  font-weight: 400;\n  margin: 0 0 16px;\n  padding: 0;\n  color: rgba(0, 0, 0, 0.54);\n}\n.docs-homepage-bottom-start ul,\n.docs-homepage-bottom-start a {\n  color: rgba(0, 0, 0, 0.54);\n}\n\n.docs-homepage-bottom-start li {\n  line-height: 23px;\n}\nh3 {\n  color: rgba(0, 0, 0, 0.54);\n  font-weight: 200;\n}\n.docs-homepage-promo[_ngcontent-c9] p[_ngcontent-c9] {\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 28px;\n  margin: 0 0 24px;\n  padding: 0;\n}\n.docs-homepage-row[_ngcontent-c9] {\n  display: flex;\n  width: 100%;\n  max-width: 800px;\n  margin: 60px 0;\n}\n.docs-homepage-row[_ngcontent-c9] svg {\n  max-width: 300px;\n}\n\n.docs-homepage-promo-desc {\n  margin-left: 50px;\n  margin-right: 50px;\n}\n\n.docs-homepage-reverse-row[_ngcontent-c9] {\n  flex-direction: row-reverse;\n}\n.docs-header-start[_ngcontent-c9],\n.docs-homepage-bottom-start[_ngcontent-c9] {\n  text-align: center;\n  margin: 60px 0;\n}\n.docs-homepage-promo-desc[_ngcontent-c9],\n.docs-homepage-promo-img[_ngcontent-c9] {\n  width: 50%;\n}\n.docs-homepage-promo-img[_ngcontent-c9] {\n  text-align: center;\n}\n.docs-homepage-promo-desc[_ngcontent-c9] {\n  line-height: 2;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n\n.docs-footer[_ngcontent-c10] {\n  padding: 12px;\n  font-size: 12px;\n  margin-top: 40px;\n}\n.docs-footer-list[_ngcontent-c10] {\n  align-items: center;\n  display: flex;\n  flex-flow: row wrap;\n  padding: 8px;\n}\n.docs-footer-logo[_ngcontent-c10] {\n  flex: 1;\n}\n.docs-footer-angular-logo[_ngcontent-c10] {\n  height: 50px;\n}\n.docs-footer-version[_ngcontent-c10] {\n  flex: 1;\n  text-align: center;\n}\n.docs-footer-copyright[_ngcontent-c10] {\n  display: flex;\n  flex: 1;\n  justify-content: flex-end;\n  flex-direction: column;\n  min-width: 225px;\n  text-align: center;\n}\n.docs-footer-logo[_ngcontent-c10] span[_ngcontent-c10] {\n  display: inline-block;\n  line-height: 50px;\n  margin: 0 40px;\n  vertical-align: bottom;\n}\n.docs-footer-logo[_ngcontent-c10] span[_ngcontent-c10] a[_ngcontent-c10] {\n  font-size: 16px;\n  padding: 0;\n  text-decoration: none;\n  color: inherit;\n}\n\n.mat-elevation-z6 {\n  box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2),\n    0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);\n}\n\n.mat-button,\n.mat-icon-button,\n.mat-stroked-button {\n  color: inherit;\n  background: transparent;\n}\n\n.mat-button-focus-overlay {\n  background: black;\n}\n\n.mat-flat-button,\n.mat-raised-button,\n.mat-fab,\n.mat-mini-fab {\n  color: rgba(0, 0, 0, 0.87);\n  background-color: white;\n}\n.mat-raised-button:not([class*=\"mat-elevation-z\"]) {\n  box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2),\n    0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);\n}\n\n.docs-app-background {\n  background: #fafafa;\n}\n\n.docs-footer {\n  background: #673ab7;\n  color: white;\n}\n\n.docs-svg-primary-fill {\n  fill: #673ab7;\n}\n\n.docs-svg-primary-dark-40-fill {\n  fill: #3e236e;\n}\n\n.docs-svg-primary-light-20-fill {\n  fill: #845ccb;\n}\n\n.docs-svg-primary-light-20-stroke {\n  stroke: #845ccb;\n}\n\n.docs-svg-primary-light-20-stop-color {\n  stop-color: #845ccb;\n}\n\n.docs-svg-primary-light-30-stop-color {\n  stop-color: #9370d2;\n}\n\n.docs-svg-primary-light-40-stop-color {\n  stop-color: #a384d8;\n}\n\n.docs-svg-primary-light-60-fill {\n  fill: #c1ade5;\n}\n\n.docs-svg-primary-light-80-fill {\n  fill: #e0d6f2;\n}\n\n.docs-svg-primary-light-85-fill {\n  fill: #e8e0f5;\n}\nbody {\n  font-family: Roboto, \"Helvetica Neue Light\", \"Helvetica Neue\", Helvetica,\n    Arial, \"Lucida Grande\", sans-serif;\n  margin: 0;\n}\nh1,\nh2 {\n  font-weight: 400;\n}\n.mat-h1,\n.mat-headline,\n.mat-typography h1 {\n  font: 400 24px/32px Roboto, \"Helvetica Neue\", sans-serif;\n  margin: 0 0 16px;\n}\n.mat-button,\n.mat-fab,\n.mat-flat-button,\n.mat-icon-button,\n.mat-mini-fab,\n.mat-raised-button,\n.mat-stroked-button {\n  font-family: Roboto, \"Helvetica Neue\", sans-serif;\n  font-size: 14px;\n  font-weight: 500;\n}\n.mat-ripple {\n  overflow: hidden;\n  position: relative;\n}\n.mat-button,\n.mat-icon-button,\n.mat-stroked-button {\n  color: inherit;\n  background: 0 0;\n}\n.mat-button-focus-overlay {\n  background: #000;\n}\n.mat-fab,\n.mat-flat-button,\n.mat-mini-fab,\n.mat-raised-button {\n  color: rgba(0, 0, 0, 0.87);\n  background-color: #fff;\n}\n.mat-raised-button:not([class*=\"mat-elevation-z\"]) {\n  box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n    0 1px 5px 0 rgba(0, 0, 0, 0.12);\n}\n.docs-app-background {\n  background: #fafafa;\n}\n.docs-footer {\n  background: #4d811b;\n  color: #fff;\n}\n.docs-svg-primary-fill {\n  fill: #4d811b;\n}\n.docs-svg-primary-dark-40-fill {\n  fill: #26316d;\n}\n.docs-svg-primary-light-20-fill {\n  fill: #6171c8;\n}\n.docs-svg-primary-light-20-stroke {\n  stroke: #6171c8;\n}\n.docs-svg-primary-light-20-stop-color {\n  stop-color: #6171c8;\n}\n.docs-svg-primary-light-30-stop-color {\n  stop-color: #7583cf;\n}\n.docs-svg-primary-light-40-stop-color {\n  stop-color: #8994d6;\n}\n.docs-svg-primary-light-60-fill {\n  fill: #b0b8e4;\n}\n.docs-svg-primary-light-80-fill {\n  fill: #d8dbf1;\n}\n.docs-svg-primary-light-85-fill {\n  fill: #e1e4f5;\n}\napp-homepage .docs-header-background {\n  background: #4d811b;\n}\napp-homepage .docs-header-headline {\n  color: #fff;\n}\napp-homepage .docs-header-start {\n  color: #4d811b;\n}\napp-homepage .docs-homepage-row {\n  color: rgba(0, 0, 0, 0.54);\n}\napp-navbar {\n  color: #fff;\n}\napp-navbar .docs-navbar,\napp-navbar .docs-navbar-header {\n  background: #4d811b;\n}\n\napp-homepage .docs-header-background {\n  background: #7db14a;\n}\n\napp-homepage .docs-header-headline {\n  color: white;\n}\n\napp-homepage .docs-header-start {\n  color: #673ab7;\n}\n\napp-homepage .docs-homepage-row {\n  color: rgba(0, 0, 0, 0.54);\n}\n\napp-navbar {\n  color: white;\n}\napp-navbar .docs-navbar,\napp-navbar .docs-navbar-header {\n  background: #4d811b;\n}\n\n.docs-homepage-promo.first {\n  margin-top: 90px;\n}\n"
  },
  {
    "path": "src/example/BUILD.bazel",
    "content": "package(default_visibility = [\"//:__subpackages__\"])\n\nfilegroup(\n    name = \"assets\",\n    srcs = [\n        \"index.html\",\n    ],\n)\n"
  },
  {
    "path": "src/example/index.html",
    "content": "<!doctype html>\n\n<html>\n  <head>\n    <title>Angular Bazel Example</title>\n    <base href=\"/example\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/icon?family=Material+Icons\">\n  </head>\n  <body>\n    <!-- The Angular application will be bootstrapped into this element. -->\n    <app-component></app-component>\n\n    <!-- in browsers that don't support ESModules, we polyfill with system.js-->\n    <script nomodule src=\"/core.min.js\"></script>\n    <script nomodule src=\"/system.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "src/index.html",
    "content": "<html>\n  <head>\n    <!-- Global site tag (gtag.js) - Google Analytics -->\n    <script\n      async\n      src=\"https://www.googletagmanager.com/gtag/js?id=UA-8594346-33\"\n    ></script>\n    <script>\n      window.dataLayer = window.dataLayer || [];\n      function gtag() {\n        dataLayer.push(arguments);\n      }\n      gtag(\"js\", new Date());\n\n      gtag(\"config\", \"UA-8594346-33\");\n    </script>\n\n    <meta charset=\"utf-8\" />\n    <title>ABC: Angular Buildtools Convergence</title>\n    <base href=\"/\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n    <meta name=\"mobile-web-app-capable\" content=\"yes\" />\n    <link rel=\"icon\" type=\"image/x-icon\" href=\"favicon.ico\" />\n\n    <link rel=\"stylesheet\" href=\"assets/landing.css\" />\n  </head>\n\n  <body class=\"docs-app-background\">\n    <material-docs-app\n      ><app-navbar class=\"mat-elevation-z6\" _nghost-c1=\"\"\n        ><nav _ngcontent-c1=\"\" class=\"docs-navbar-header\">\n          <a\n            _ngcontent-c1=\"\"\n            aria-label=\"Angular & Bazel\"\n            class=\"docs-button mat-button\"\n            mat-button=\"\"\n            routerlink=\"/\"\n            tabindex=\"0\"\n            aria-disabled=\"false\"\n            href=\"/\"\n            ><span class=\"mat-button-wrapper\">\n              <img\n                _ngcontent-c1=\"\"\n                alt=\"angular\"\n                class=\"docs-angular-logo\"\n                src=\"assets/angular-white-transparent.svg\"/>\n              <img\n                _ngcontent-c1=\"\"\n                alt=\"angular\"\n                class=\"docs-angular-logo\"\n                src=\"assets/bazel-white-transparent.svg\"\n                width=\"20\"\n            /></span>\n            <div class=\"mat-button-ripple mat-ripple\" matripple=\"\"></div>\n            <div class=\"mat-button-focus-overlay\"></div></a\n          ><!----><a\n            _ngcontent-c1=\"\"\n            class=\"docs-navbar-hide-small docs-button mat-button ng-star-inserted\"\n            mat-button=\"\"\n            tabindex=\"0\"\n            aria-disabled=\"false\"\n            href=\"https://next.angular.io/guide/bazel\"\n            ><span class=\"mat-button-wrapper\">Documentation</span>\n            <div class=\"mat-button-ripple mat-ripple\" matripple=\"\"></div>\n            <div class=\"mat-button-focus-overlay\"></div></a\n          ><a\n            _ngcontent-c1=\"\"\n            class=\"docs-navbar-hide-small docs-button mat-button ng-star-inserted\"\n            mat-button=\"\"\n            tabindex=\"0\"\n            aria-disabled=\"false\"\n            href=\"https://goo.gl/forms/Tv8lMdH0N3D4yo8Q2\"\n            ><span class=\"mat-button-wrapper\">Request Support</span>\n            <div class=\"mat-button-ripple mat-ripple\" matripple=\"\"></div>\n            <div class=\"mat-button-focus-overlay\"></div></a\n          ><a\n            _ngcontent-c1=\"\"\n            class=\"docs-navbar-hide-small docs-button mat-button\"\n            mat-button=\"\"\n            tabindex=\"0\"\n            aria-disabled=\"false\"\n            href=\"https://github.com/angular/angular-bazel-example\"\n            ><span class=\"mat-button-wrapper\">Example</span>\n            <div class=\"mat-button-ripple mat-ripple\" matripple=\"\"></div>\n            <div class=\"mat-button-focus-overlay\"></div\n          ></a>\n          <div _ngcontent-c1=\"\" class=\"flex-spacer\"></div>\n          <version-picker _ngcontent-c1=\"\"\n            ><mat-menu class=\"ng-tns-c6-0\"><!----></mat-menu></version-picker\n          >\n          <a\n            _ngcontent-c1=\"\"\n            aria-label=\"GitHub Repository\"\n            class=\"docs-button docs-navbar-hide-small mat-button\"\n            href=\"https://github.com/angular/angular/tree/master/packages/bazel\"\n            mat-button=\"\"\n            tabindex=\"0\"\n            aria-disabled=\"false\"\n            ><span class=\"mat-button-wrapper\"\n              ><img\n                _ngcontent-c1=\"\"\n                alt=\"angular\"\n                class=\"docs-angular-logo\"\n                src=\"assets/github-circle-white-transparent.svg\"\n              />\n              GitHub\n            </span>\n            <div class=\"mat-button-ripple mat-ripple\" matripple=\"\"></div>\n            <div class=\"mat-button-focus-overlay\"></div></a\n          ><a\n            _ngcontent-c1=\"\"\n            aria-label=\"GitHub Repository\"\n            class=\"docs-button docs-navbar-show-small mat-icon-button\"\n            href=\"https://github.com/angular/angular/tree/master/packages/bazel\"\n            mat-icon-button=\"\"\n            tabindex=\"0\"\n            aria-disabled=\"false\"\n          >\n            <div\n              class=\"mat-button-ripple mat-ripple mat-button-ripple-round\"\n              matripple=\"\"\n            ></div>\n            <div class=\"mat-button-focus-overlay\"></div\n          ></a>\n        </nav>\n      </app-navbar>\n      <app-homepage _nghost-c9=\"\" class=\"ng-star-inserted\"\n        ><header _ngcontent-c9=\"\" class=\"docs-header-background\">\n          <div _ngcontent-c9=\"\" class=\"docs-header-section\">\n            <div _ngcontent-c9=\"\" class=\"docs-header-headline\">\n              <h1 _ngcontent-c9=\"\" class=\"mat-h1\">Angular and Bazel</h1>\n              <h2 _ngcontent-c9=\"\">\n                Build and test Angular applications at scale like Google\n              </h2>\n            </div>\n            <div _ngcontent-c9=\"\" class=\"docs-header-start\">\n              <a\n                _ngcontent-c9=\"\"\n                class=\"docs-button mat-raised-button\"\n                mat-raised-button=\"\"\n                tabindex=\"0\"\n                aria-disabled=\"false\"\n                href=\"https://github.com/angular/angular/issues/19058\"\n                ><span class=\"mat-button-wrapper\">Subscribe for Updates</span>\n                <div class=\"mat-button-ripple mat-ripple\" matripple=\"\"></div>\n                <div class=\"mat-button-focus-overlay\"></div\n              ></a>\n            </div>\n          </div>\n        </header>\n        <div _ngcontent-c9=\"\" class=\"docs-homepage-promo first\">\n          <div _ngcontent-c9=\"\" class=\"docs-homepage-row\">\n            <div _ngcontent-c9=\"\" class=\"docs-homepage-promo-img\">\n              <svg\n                version=\"1.1\"\n                id=\"Capa_1\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n                x=\"0px\"\n                y=\"0px\"\n                viewBox=\"0 0 512 512\"\n                style=\"enable-background:new 0 0 512 512;\"\n                xml:space=\"preserve\"\n              >\n                <circle style=\"fill:#7EC359;\" cx=\"256\" cy=\"256\" r=\"256\" />\n                <circle style=\"fill:#F1592F;\" cx=\"256\" cy=\"256\" r=\"210\" />\n                <circle style=\"fill:#FDFEFF;\" cx=\"256\" cy=\"256\" r=\"187.512\" />\n                <path\n                  style=\"fill:#70B1E1;\"\n                  d=\"M256,90.824c-91.088,0-165.176,74.092-165.176,165.176h2.156\n                c13.4-75.576,85.896-127.472,163.02-113.8C256,121.968,256,109.9,256,90.824z\"\n                />\n                <path\n                  style=\"fill:#F1592F;\"\n                  d=\"M372.748,139.252c-48.828,48.828-23.236,23.236-42,42.004c19.936,19.94,33.936,45.824,39.064,74.744\n                h51.364C421.18,210.456,402.656,169.16,372.748,139.252z\"\n                />\n                <path\n                  style=\"fill:#F5EA07;\"\n                  d=\"M372.748,139.252C342.84,109.344,301.544,90.824,256,90.824c0,19.08,0,31.14,0,51.38\n                c28.916,5.128,54.804,19.112,74.744,39.056C359.452,152.548,354.548,157.452,372.748,139.252z\"\n                />\n                <g>\n                  <polygon\n                    style=\"fill:#656D7A;\"\n                    points=\"248.592,274.82 319.32,192.624 237.124,263.352 \t\"\n                  />\n                  <circle style=\"fill:#656D7A;\" cx=\"256\" cy=\"256\" r=\"14.96\" />\n                </g>\n                <circle style=\"fill:#FDFEFF;\" cx=\"256\" cy=\"256\" r=\"7.104\" />\n                <path\n                  style=\"fill:#656D7A;\"\n                  d=\"M329.432,390.116H182.568c-7.324,0-13.26-5.936-13.26-13.26v-38.58c0-7.324,5.936-13.26,13.26-13.26\n                h146.864c7.324,0,13.26,5.936,13.26,13.26v38.58C342.692,384.18,336.756,390.116,329.432,390.116z\"\n                />\n                <g>\n                  <path\n                    style=\"fill:#FDFEFF;\"\n                    d=\"M186.976,338.648c2.748-2.172,6.192-3.26,10.336-3.26s7.588,1.088,10.336,3.26\n                  s4.124,4.912,4.124,8.212s-1.54,6.224-4.616,8.768c4.144,2.624,6.216,6.316,6.216,11.072c0,3.692-1.476,6.788-4.432,9.288\n                  c-2.952,2.504-6.828,3.756-11.628,3.756s-8.672-1.252-11.628-3.756c-2.952-2.5-4.428-5.596-4.428-9.288\n                  c0-4.756,2.072-8.444,6.212-11.072c-3.076-2.544-4.612-5.464-4.612-8.768S184.228,340.824,186.976,338.648z M191.284,371.656\n                  c1.884,1.208,3.896,1.816,6.028,1.816s4.144-0.604,6.032-1.816c1.884-1.208,2.828-2.944,2.828-5.2s-0.9-3.996-2.704-5.228\n                  c-1.804-1.228-3.856-1.844-6.152-1.844s-4.348,0.616-6.152,1.844c-1.808,1.232-2.708,2.972-2.708,5.228\n                  C188.452,368.712,189.396,370.444,191.284,371.656z M191.868,352.092c1.54,1.252,3.356,1.876,5.444,1.876\n                  c2.092,0,3.908-0.624,5.444-1.876c1.54-1.252,2.308-2.788,2.308-4.616c0-1.824-0.768-3.352-2.308-4.58\n                  c-1.536-1.232-3.352-1.848-5.444-1.848s-3.904,0.616-5.444,1.848c-1.536,1.228-2.304,2.76-2.304,4.58\n                  C189.56,349.304,190.328,350.84,191.868,352.092z\"\n                  />\n                  <path\n                    style=\"fill:#FDFEFF;\"\n                    d=\"M226.1,338.648c2.748-2.172,6.192-3.26,10.336-3.26s7.588,1.088,10.336,3.26\n                  s4.124,4.912,4.124,8.212s-1.54,6.224-4.616,8.768c4.144,2.624,6.216,6.316,6.216,11.072c0,3.692-1.476,6.788-4.432,9.288\n                  c-2.952,2.504-6.828,3.756-11.628,3.756s-8.672-1.252-11.628-3.756c-2.952-2.5-4.428-5.596-4.428-9.288\n                  c0-4.756,2.072-8.444,6.212-11.072c-3.076-2.544-4.612-5.464-4.612-8.768S223.356,340.824,226.1,338.648z M230.408,371.656\n                  c1.884,1.208,3.896,1.816,6.028,1.816s4.144-0.604,6.032-1.816c1.884-1.208,2.828-2.944,2.828-5.2s-0.9-3.996-2.704-5.228\n                  c-1.804-1.228-3.856-1.844-6.152-1.844s-4.348,0.616-6.152,1.844c-1.808,1.232-2.708,2.972-2.708,5.228\n                  C227.576,368.712,228.52,370.444,230.408,371.656z M230.992,352.092c1.54,1.252,3.356,1.876,5.444,1.876\n                  c2.092,0,3.908-0.624,5.444-1.876c1.54-1.252,2.308-2.788,2.308-4.616c0-1.824-0.768-3.352-2.308-4.58\n                  c-1.536-1.232-3.352-1.848-5.444-1.848s-3.904,0.616-5.444,1.848c-1.536,1.228-2.304,2.76-2.304,4.58\n                  C228.688,349.304,229.456,350.84,230.992,352.092z\"\n                  />\n                  <path\n                    style=\"fill:#FDFEFF;\"\n                    d=\"M265.224,338.648c2.748-2.172,6.192-3.26,10.336-3.26s7.588,1.088,10.336,3.26\n                  s4.124,4.912,4.124,8.212s-1.54,6.224-4.616,8.768c4.144,2.624,6.216,6.316,6.216,11.072c0,3.692-1.476,6.788-4.432,9.288\n                  c-2.952,2.504-6.828,3.756-11.628,3.756s-8.672-1.252-11.628-3.756c-2.952-2.5-4.428-5.596-4.428-9.288\n                  c0-4.756,2.072-8.444,6.212-11.072c-3.076-2.544-4.612-5.464-4.612-8.768S262.48,340.824,265.224,338.648z M269.532,371.656\n                  c1.884,1.208,3.896,1.816,6.028,1.816s4.144-0.604,6.032-1.816c1.884-1.208,2.828-2.944,2.828-5.2s-0.9-3.996-2.704-5.228\n                  c-1.804-1.228-3.856-1.844-6.152-1.844s-4.348,0.616-6.152,1.844c-1.808,1.232-2.708,2.972-2.708,5.228\n                  C266.704,368.712,267.648,370.444,269.532,371.656z M270.116,352.092c1.54,1.252,3.356,1.876,5.444,1.876\n                  c2.092,0,3.908-0.624,5.444-1.876c1.54-1.252,2.308-2.788,2.308-4.616c0-1.824-0.768-3.352-2.308-4.58\n                  c-1.536-1.232-3.352-1.848-5.444-1.848s-3.904,0.616-5.444,1.848c-1.536,1.228-2.304,2.76-2.304,4.58\n                  C267.812,349.304,268.58,350.84,270.116,352.092z\"\n                  />\n                  <path\n                    style=\"fill:#FDFEFF;\"\n                    d=\"M304.352,338.648c2.748-2.172,6.192-3.26,10.336-3.26s7.588,1.088,10.336,3.26\n                  s4.124,4.912,4.124,8.212s-1.54,6.224-4.616,8.768c4.144,2.624,6.216,6.316,6.216,11.072c0,3.692-1.476,6.788-4.432,9.288\n                  c-2.952,2.504-6.828,3.756-11.628,3.756s-8.672-1.252-11.628-3.756c-2.952-2.5-4.428-5.596-4.428-9.288\n                  c0-4.756,2.072-8.444,6.212-11.072c-3.076-2.544-4.612-5.464-4.612-8.768S301.604,340.824,304.352,338.648z M308.66,371.656\n                  c1.884,1.208,3.896,1.816,6.028,1.816s4.144-0.604,6.032-1.816c1.884-1.208,2.828-2.944,2.828-5.2s-0.9-3.996-2.704-5.228\n                  c-1.804-1.228-3.856-1.844-6.152-1.844s-4.348,0.616-6.152,1.844c-1.808,1.232-2.708,2.972-2.708,5.228\n                  C305.828,368.712,306.772,370.444,308.66,371.656z M309.24,352.092c1.54,1.252,3.356,1.876,5.444,1.876\n                  c2.092,0,3.908-0.624,5.444-1.876c1.54-1.252,2.308-2.788,2.308-4.616c0-1.824-0.768-3.352-2.308-4.58\n                  c-1.536-1.232-3.352-1.848-5.444-1.848s-3.904,0.616-5.444,1.848c-1.536,1.228-2.304,2.76-2.304,4.58\n                  C306.936,349.304,307.704,350.84,309.24,352.092z\"\n                  />\n                </g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n              </svg>\n            </div>\n            <div _ngcontent-c9=\"\" class=\"docs-homepage-promo-desc\">\n              <h2 _ngcontent-c9=\"\">Incremental re-builds</h2>\n              <p _ngcontent-c9=\"\">\n                A small change to your app should require a small re-build.\n              </p>\n            </div>\n          </div>\n          <div\n            _ngcontent-c9=\"\"\n            class=\"docs-homepage-row docs-homepage-reverse-row\"\n          >\n            <div _ngcontent-c9=\"\" class=\"docs-homepage-promo-img\">\n              <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 185.6 200\">\n                <defs>\n                  <style>\n                    .cls-1 {\n                      fill: #5480ae;\n                    }\n                    .cls-2 {\n                      fill: #3c5c7d;\n                    }\n                    .cls-3 {\n                      fill: #fff;\n                    }\n                  </style>\n                </defs>\n                <title>cli</title>\n                <g id=\"Layer_2\" data-name=\"Layer 2\">\n                  <g id=\"Layer_1-2\" data-name=\"Layer 1\">\n                    <polygon\n                      class=\"cls-1\"\n                      points=\"92.4 0 92.4 0 92.4 0 0 33.3 14 156.1 92.4 200 92.4 200 92.4 200 171.3 156.1 185.6 33.3 92.4 0\"\n                    />\n                    <polygon\n                      class=\"cls-2\"\n                      points=\"92.4 0 92.4 22.2 92.4 22.2 92.4 123.2 92.4 123.2 92.4 200 92.4 200 171.3 156.1 185.6 33.3 92.4 0\"\n                    />\n                    <path\n                      class=\"cls-3\"\n                      d=\"M42.8,55v90h100V55ZM138,139.9H47.5V60.1h90.6v79.8Z\"\n                    />\n                    <polygon\n                      class=\"cls-3\"\n                      points=\"60.1 111.4 63.5 114.9 82.8 95.5 63.2 75.9 59.8 79.3 76 95.5 60.1 111.4\"\n                    />\n                    <rect\n                      class=\"cls-3\"\n                      x=\"82.8\"\n                      y=\"117.2\"\n                      width=\"30\"\n                      height=\"4\"\n                    />\n                  </g>\n                </g>\n              </svg>\n            </div>\n            <div _ngcontent-c9=\"\" class=\"docs-homepage-promo-desc\">\n              <h2 _ngcontent-c9=\"\">Works with Angular CLI</h2>\n              <p _ngcontent-c9=\"\">\n                Use the same <code>ng</code> commands you're used to.\n              </p>\n            </div>\n          </div>\n          <div _ngcontent-c9=\"\" class=\"docs-homepage-row\">\n            <div _ngcontent-c9=\"\" class=\"docs-homepage-promo-img\">\n              <svg\n                version=\"1.1\"\n                id=\"Capa_1\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n                x=\"0px\"\n                y=\"0px\"\n                viewBox=\"0 0 511.999 511.999\"\n                style=\"enable-background:new 0 0 511.999 511.999;\"\n                xml:space=\"preserve\"\n              >\n                <path\n                  style=\"fill:#A6E2E3;\"\n                  d=\"M420.79,234.945c50.372,0,91.209,40.824,91.209,91.197s-40.837,91.209-91.209,91.209H117.356\n\tC52.539,417.351,0,364.799,0,299.982s52.539-117.369,117.356-117.369c12.021,0,23.613,1.812,34.52,5.166\n\tc-0.379-3.244-0.6-6.537-0.6-9.879c0-45.978,37.274-83.252,83.24-83.252c44.435,0,80.731,34.802,83.118,78.637\n\tc10.576-9.536,24.556-15.338,39.906-15.338c32.929,0,59.615,26.686,59.615,59.615c0,6.133-0.93,12.045-2.656,17.615\n\tC416.579,235.043,418.673,234.945,420.79,234.945z\"\n                />\n                <path\n                  style=\"opacity:0.1;enable-background:new    ;\"\n                  d=\"M295.399,197.154c8.173-13.942,22.235-23.867,22.235-23.867\n\tc-2.387-43.836-38.682-78.638-83.118-78.638c-3.937,0-7.804,0.293-11.596,0.822C262.131,100.63,295.399,130.666,295.399,197.154z\"\n                />\n                <path\n                  style=\"fill:#7CCBCC;\"\n                  d=\"M420.79,234.945c-2.118,0-4.211,0.098-6.292,0.232c1.726-5.569,2.656-11.482,2.656-17.615\n\tc0-32.929-26.686-59.615-59.615-59.615c-1.501,0-2.983,0.072-4.456,0.18c25.967,1.045,51.447,48.16,32.206,90.219\n\tc28.375,0,57.955,1.255,79.625,35.73c17.954,28.563,12.313,68.178-13.057,91.401c-9.052,8.286-35.091,23.953-61.817,23.953\n\tc-0.76-0.008-1.536-0.013-2.33-0.013H84.277c-13.524,0-26.509-2.295-38.598-6.505c19.826,15.318,44.685,24.438,71.678,24.438H420.79\n\tc50.372,0,91.209-40.836,91.209-91.209C511.999,275.769,471.163,234.945,420.79,234.945z\"\n                />\n                <g>\n                  <polygon\n                    style=\"fill:#FFFFFF;\"\n                    points=\"330.548,238.066 385.291,309.335 357.344,309.335 357.344,369.267 303.765,369.267 \n\t\t303.765,309.335 275.818,309.335 \t\"\n                  />\n                  <polygon\n                    style=\"fill:#FFFFFF;\"\n                    points=\"236.169,297.999 181.439,369.267 126.708,297.999 154.643,297.999 154.643,238.066 \n\t\t208.235,238.066 208.235,297.999 \t\"\n                  />\n                </g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n                <g></g>\n              </svg>\n            </div>\n            <div _ngcontent-c9=\"\" class=\"docs-homepage-promo-desc\">\n              <h2 _ngcontent-c9=\"\">Cloud Ready</h2>\n              <p _ngcontent-c9=\"\">\n                Expand your build and test to run in parallel on a cluster of\n                workers.\n              </p>\n            </div>\n          </div>\n          <div\n            _ngcontent-c9=\"\"\n            class=\"docs-homepage-row docs-homepage-reverse-row\"\n          >\n            <div _ngcontent-c9=\"\" class=\"docs-homepage-promo-img\">\n              <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 179.2 192.7\">\n                <defs>\n                  <style>\n                    .cls-labs-1 {\n                      fill: #1de9b6;\n                    }\n                    .cls-labs-2 {\n                      fill: #00bfa5;\n                    }\n                    .cls-labs-3 {\n                      fill: #bbf8e9;\n                    }\n                    .cls-labs-4 {\n                      fill: #fff;\n                    }\n                  </style>\n                </defs>\n                <title>labs</title>\n                <g id=\"Layer_2\" data-name=\"Layer 2\">\n                  <g id=\"Layer_1-2\" data-name=\"Layer 1\">\n                    <polygon\n                      class=\"cls-labs-1\"\n                      points=\"89.4 0 89.4 0 89.4 0 0 32 13.5 150.4 89.4 192.7 89.4 192.7 89.4 192.7 165.4 150.4 179.2 32 89.4 0\"\n                    />\n                    <polygon\n                      class=\"cls-labs-2\"\n                      points=\"89.4 0 89.4 21.4 89.4 21.4 89.4 118.7 89.4 118.7 89.4 192.7 89.4 192.7 165.4 150.4 179.2 32 89.4 0\"\n                    />\n                    <path\n                      class=\"cls-labs-3\"\n                      d=\"M124.1,75.8l-37-11.5a2.8,2.8,0,0,0-3.5,1.9l-.2.5a2.9,2.9,0,0,0,1.9,3.5l7.1,2.2L85.2,95.5a30.4,30.4,0,0,0,1.7,60.7A30.7,30.7,0,0,0,98,153.8h0l1.5-.7a30.5,30.5,0,0,0,4.8-51.5l7.2-23.3,10.7,3.4a3,3,0,0,0,3.6-1.9v-.5A2.7,2.7,0,0,0,124.1,75.8Z\"\n                    />\n                    <ellipse\n                      class=\"cls-labs-4\"\n                      cx=\"90.4\"\n                      cy=\"44.1\"\n                      rx=\"7.8\"\n                      ry=\"7.9\"\n                    />\n                    <ellipse\n                      class=\"cls-labs-4\"\n                      cx=\"126.8\"\n                      cy=\"60.3\"\n                      rx=\"3.8\"\n                      ry=\"3.8\"\n                    />\n                    <ellipse\n                      class=\"cls-labs-4\"\n                      cx=\"51.5\"\n                      cy=\"73.9\"\n                      rx=\"4.9\"\n                      ry=\"4.9\"\n                    />\n                    <path\n                      class=\"cls-labs-4\"\n                      d=\"M111.3,134.2a26.3,26.3,0,1,1-50.2-15.6\"\n                    />\n                  </g>\n                </g>\n              </svg>\n            </div>\n            <div _ngcontent-c9=\"\" class=\"docs-homepage-promo-desc\">\n              <h2 _ngcontent-c9=\"\">Part of Angular Labs</h2>\n              <p _ngcontent-c9=\"\">\n                Not a stable, supported API, so use Bazel with caution in\n                production applications. We expect to promote it to stable for\n                Angular version 9.\n              </p>\n            </div>\n          </div>\n          <div\n            _ngcontent-c9=\"\"\n            class=\"docs-homepage-bottom-start\"\n            style=\"text-align: left\"\n          >\n            <h2>📚 Resources</h2>\n            <h3>Projects</h3>\n            <ul>\n              <li>\n                <a\n                  href=\"https://groups.google.com/forum/#!forum/rbe-alpha-customers\"\n                  >Remote Build Execution for Google Cloud Platform</a\n                >\n              </li>\n              <li>\n                <a href=\"https://github.com/bazelbuild/bazel-buildfarm\"\n                  >On-prem Bazel remote caching and execution service</a\n                >\n              </li>\n\n              <li>\n                <a href=\"https://github.com/jin/awesome-bazel\"\n                  >A curated list of Bazel rules, tooling and resources</a\n                >\n              </li>\n            </ul>\n\n            <h3>Talks</h3>\n            <ul>\n              <li>\n                Building Apps Like Google with Angular, Bazel, and GCP\n                <a href=\"https://www.youtube.com/watch?v=lDyIc2Abkwg\">Video</a>\n                (Google Cloud Next, April 2019)\n              </li>\n\n              <li>\n                Layering in JS tooling\n                <a href=\"https://hackmd.io/p/HJZ_ekxuN\">Slides</a>\n                <a\n                  href=\"https://drive.google.com/file/d/1AxrwjLUf_35Z2C9VK5Ut7wo5L89roHH2/view\"\n                  >Video</a\n                >\n                (ModernWeb Meetup, March 2019)\n              </li>\n\n              <li>\n                Angular, Bazel, and CLI\n                <a\n                  href=\"https://docs.google.com/presentation/d/1weKiN44mj02uriWMnpVm-CYDVTjP-NT2nYmZe3ii4X0/preview\"\n                  >Slides</a\n                >\n                (AngularSF Meetup, January 2019)\n              </li>\n\n              <li>\n                Bazel in Angular CLI\n                <a href=\"https://www.youtube.com/watch?v=fEUgZopCK8E\">Video</a>\n                <a\n                  href=\"https://docs.google.com/presentation/d/1VcSkWDFkmkZKCP9yTfKbq-lTMU3qW_3zNabKItCWDec/preview\"\n                  >Slides</a\n                >\n                (AngularNYC Meetup, January 2019)\n              </li>\n\n              <li>\n                The CLI Roadmap\n                <a href=\"ttps://www.youtube.com/watch?v=tUCd6QSzEy4\">Video</a>\n                (AngularConnect, November 2018)\n              </li>\n\n              <li>\n                Develop Angular like Google Does\n                <a\n                  href=\"https://docs.google.com/presentation/d/1b0PdG-bxN0nwHa3ZuA0a_anOEYeMoI_CSsZl6ngZWp8/preview?slide=id.g26d86d3325_0_0\"\n                  >Slides</a\n                >\n                (AngularMIX, October 2018)\n              </li>\n\n              <li>\n                Building large Angular apps with Bazel\n                <a\n                  href=\"https://docs.google.com/presentation/d/1ZIKO07h9fFAyJnMGK-TE3Tr-NXi-9jOYEaQDXcIMZ-A/preview\"\n                  >Slides</a\n                >\n                <a href=\"https://www.youtube.com/watch?v=yBg9zG6ZGb4\">Video</a>\n                (BazelCon, October 2018)\n              </li>\n\n              <li>\n                How I love being ejected\n                <a href=\"https://goo.gl/Szcnfk\">Slides</a>\n                <a href=\"https://www.youtube.com/watch?v=ieRJwFGWEOM\">Video</a>\n                (ng-conf, April 2018)\n              </li>\n              <li>\n                Angular Libraries in Bazel\n                <a\n                  href=\"https://docs.google.com/presentation/d/1SU3rjpj8YEAyLAhHJwtO7TR1d_Sx1e9iGI3osiasPhA/preview \"\n                  >Slides</a\n                >\n                (AngularSF Meetup, April 2018)\n              </li>\n\n              <li>\n                Bazel for building Angular Applications\n                <a href=\"https://www.youtube.com/watch?v=KmaE6z_ECRg \">Video</a>\n                (St. Louis Angular Lunch, February 2018)\n              </li>\n\n              <li>\n                Building Angular Applications like Google\n                <a\n                  href=\"https://docs.google.com/presentation/d/1EudIzQvz9gzVPr0UdP1DymlbhfG29kFCeiJVVEE_FVw/preview\"\n                  >Slides</a\n                >\n                <a href=\"https://www.youtube.com/watch?v=CeUF9hjdoZQ\">Video</a>\n                (AngularConnect, November 2017)\n              </li>\n\n              <li>\n                Bazel for Web Frontends\n                <a href=\"https://goo.gl/ebcPXi\">Slides</a>\n                <a href=\"https://www.youtube.com/watch?v=0pgERydGyqo\">Video</a>\n                (BazelCon November 2017)\n              </li>\n\n              <li>\n                Angular with Bazel and Closure\n                <a\n                  href=\"https://docs.google.com/presentation/d/1gFta6MSrafNap4YFA6SfL8uRKJMsQlZ8RsZj8RJ0_6k/preview\"\n                  >Slides</a\n                >\n                <a href=\"https://www.youtube.com/watch?v=tnKyXH_5028\">Video</a>\n                (AngularMIX October 2017)\n              </li>\n            </ul>\n            <h3>Articles</h3>\n            <ul>\n              <li>\n                <a\n                  href=\"https://medium.com/@Jakeherringbone/automated-testing-of-each-commit-ci-6f718d93d0da\"\n                >\n                  Automated testing of each commit != CI\n                </a>\n                (January 2019)\n              </li>\n              <li>\n                <a\n                  href=\"https://medium.com/@Jakeherringbone/running-tools-under-bazel-8aa416e7090c\"\n                >\n                  Running tools under Bazel\n                </a>\n                (November 2018)\n              </li>\n\n              <li>\n                <a\n                  href=\"https://medium.com/@Jakeherringbone/multiple-npm-packages-in-a-bazel-monorepo-5072f2aebdb2\"\n                >\n                  Multiple npm packages in a Bazel monorepo\n                </a>\n                (March 2018)\n              </li>\n\n              <li>\n                <a\n                  href=\"https://medium.com/@Jakeherringbone/deploying-an-angular-app-to-kubernetes-using-bazel-preview-91432b8690b5\"\n                >\n                  Deploying an Angular app to Kubernetes using Bazel (preview)\n                </a>\n                (January 2018)\n              </li>\n\n              <li>\n                <a\n                  href=\"https://medium.com/dailyjs/building-angular-apps-at-scale-813ef42add04\"\n                >\n                  Building Angular apps at Scale</a\n                >\n                (August 2017)\n              </li>\n\n              <li>\n                <a\n                  href=\"https://medium.com/@Jakeherringbone/what-angular-is-doing-with-bazel-and-closure-21f526f64a34\"\n                  >What Angular is doing with Bazel and Closure</a\n                >\n                (April 2017)\n              </li>\n            </ul>\n\n            <h3>Trainings</h3>\n            <ul>\n              <li>\n                LiveCoding a Bazel rule for Stylus\n                <a\n                  href=\"https://drive.google.com/drive/folders/1I71w8JSGcZk1nUX2oXvT8NLT47Onb1t0\"\n                  >Video</a\n                >\n                (July 2019)\n              </li>\n                \n              <li>\n                Bazel Training for Angular Team\n                <a\n                  href=\"https://docs.google.com/presentation/d/1OwktccLvV3VvWn3i7H2SuZkBeAQ8z-E5RdJODVLf8SA/preview\"\n                  >Slides</a\n                >\n                (January 2019)\n              </li>\n\n              <li>\n                Full Stack development with Nx and Bazel\n                <a\n                  href=\"https://docs.google.com/presentation/d/1fSZwcpO9hUBFd_k9hUS45ZyVJcZLEyz0VxISSOnIZ1I/preview\"\n                  >Slides</a\n                >\n                <a href=\"https://www.youtube.com/watch?v=1KDDIhcQORM\">Video</a>\n                (ng-conf, April 2018)\n              </li>\n\n              <li>\n                ABC Deep Dive tech talk\n                <a href=\"https://goo.gl/zDYWsq\">Slides</a>\n                <a href=\"https://youtu.be/z9Q_2N9oaG8\">Video</a>\n                (February 2018)\n              </li>\n            </ul>\n\n            <h3>Examples</h3>\n            <ul>\n              <li>\n                <a href=\"https://github.com/mgechev/bazel-demo\">TypeScript Bazel \"Hello World\" example</a>\n              </li>\n              <li>\n                <a href=\"https://github.com/mgechev/real-world-bazel\">The \"Real World Angular Example\" with Bazel build</a>\n              </li>\n              <li>\n                <a href=\"https://github.com/angular/angular-bazel-example\">Enterprise example build &amp; test angular with bazel</a>\n              </li>\n              <li>\n                <a href=\"https://github.com/GoogleCloudPlatform/gke-bazel-demo\">Java backend and Angular frontend deployed together to Kubernetes</a>\n              </li>\n            </ul>\n          </div>\n        </div>\n        <app-footer _ngcontent-c9=\"\" _nghost-c10=\"\"\n          ><footer _ngcontent-c10=\"\" class=\"docs-footer\">\n            <div _ngcontent-c10=\"\" class=\"docs-footer-list\">\n              <div _ngcontent-c10=\"\" class=\"docs-footer-logo\">\n                <div _ngcontent-c10=\"\" class=\"footer-logo\">\n                  <img\n                    _ngcontent-c10=\"\"\n                    alt=\"angular\"\n                    class=\"docs-footer-angular-logo\"\n                    src=\"assets/angular-white-transparent.svg\"\n                  /><span _ngcontent-c10=\"\"\n                    ><a _ngcontent-c10=\"\" href=\"https://angular.io\"\n                      >Learn Angular</a\n                    ></span\n                  >\n                </div>\n              </div>\n              <div _ngcontent-c10=\"\" class=\"docs-footer-copyright\">\n                <span _ngcontent-c10=\"\">Powered by Google ©2010-2019.</span\n                ><span _ngcontent-c10=\"\"\n                  >Code licensed under an MIT-style License.</span\n                ><span _ngcontent-c10=\"\"\n                  >Documentation licensed under CC BY 4.0.</span\n                >\n              </div>\n            </div>\n          </footer></app-footer\n        ></app-homepage\n      ></material-docs-app\n    >\n  </body>\n</html>\n"
  },
  {
    "path": "src/initialize_testbed.ts",
    "content": "/**\n * @fileoverview Provides a script to initialize TestBed before tests are run.\n * This file should be included in the \"runtime_deps\" of a \"ts_web_test_suite\"\n * rule.\n */\nimport {TestBed} from '@angular/core/testing';\nimport {BrowserDynamicTestingModule, platformBrowserDynamicTesting} from '@angular/platform-browser-dynamic/testing';\n\nTestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());\n"
  },
  {
    "path": "src/lib/shorten/BUILD.bazel",
    "content": "load(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\nts_library(\n    name = \"shorten\",\n    srcs = [\"shorten.ts\"],\n    module_name = \"@bazel/shorten\",\n    module_root = \"shorten\",\n)\n\n# TODO(alexeagle): show how it can be deployed to npm\n"
  },
  {
    "path": "src/lib/shorten/README.md",
    "content": "# A simple example TS-only library\n\nThis shows how a TypeScript library looks in a Bazel monorepo.\n"
  },
  {
    "path": "src/lib/shorten/shorten.ts",
    "content": "export function shorten(s: string, length: number) {\n  if (s.length < length) return s;\n  return s.substr(0, length - 3) + '...';\n}"
  },
  {
    "path": "src/main.dev.ts",
    "content": "/**\n * Used to launch the application under Bazel development mode.\n */\nimport {platformBrowser} from '@angular/platform-browser';\nimport {AppModuleNgFactory} from './app/app.module.ngfactory';\n\nplatformBrowser().bootstrapModuleFactory(AppModuleNgFactory);\n"
  },
  {
    "path": "src/main.prod.ts",
    "content": "/**\n * Used to launch the application under Bazel production mode.\n */\nimport {enableProdMode} from '@angular/core';\nimport {platformBrowser} from '@angular/platform-browser';\nimport {AppModuleNgFactory} from './app/app.module.ngfactory';\n\nenableProdMode();\nplatformBrowser().bootstrapModuleFactory(AppModuleNgFactory);\n"
  },
  {
    "path": "src/main.ts",
    "content": "/**\n * This main entry point is used to launch the app under the\n * @angular-devkit/build-angular, which is the default CLI\n * builder. Note that for AOT, the CLI will magically replace\n * the bootstrap by switching platform-browser-dynamic with\n * platform-browser.\n * This file is completely unused in the Bazel build.\n */\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app.module';\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n  .catch(err => console.log(err));"
  },
  {
    "path": "src/rxjs_shims.js",
    "content": "/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n /**\n  * @fileoverview these provide named UMD modules so that we can bundle\n  * the application along with rxjs using the concatjs bundler.\n  */\n\n// rxjs/operators\n(function(factory) {\nif (typeof module === 'object' && typeof module.exports === 'object') {\n  var v = factory(require, exports);\n  if (v !== undefined) module.exports = v;\n} else if (typeof define === 'function' && define.amd) {\n  define('rxjs/operators', ['exports', 'rxjs'], factory);\n}\n})(function(exports, rxjs) {\n'use strict';\nObject.keys(rxjs.operators).forEach(function(key) {\n  exports[key] = rxjs.operators[key];\n});\nObject.defineProperty(exports, '__esModule', {value: true});\n});\n\n// rxjs/testing\n(function(factory) {\nif (typeof module === 'object' && typeof module.exports === 'object') {\n  var v = factory(require, exports);\n  if (v !== undefined) module.exports = v;\n} else if (typeof define === 'function' && define.amd) {\n  define('rxjs/testing', ['exports', 'rxjs'], factory);\n}\n})(function(exports, rxjs) {\n'use strict';\nObject.keys(rxjs.testing).forEach(function(key) {\n  exports[key] = rxjs.testing[key];\n});\nObject.defineProperty(exports, '__esModule', {value: true});\n});\n"
  },
  {
    "path": "src/shared/material/BUILD.bazel",
    "content": "load(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/forms\",\n    \"@npm//@angular/platform-browser\",\n]\n\nng_module(\n    name = \"material\",\n    srcs = glob([\"*.ts\"]),\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/core\",\n        \"@npm//@angular/material\",\n    ],\n)\n"
  },
  {
    "path": "src/shared/material/material.module.ts",
    "content": "import { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatGridListModule } from '@angular/material/grid-list';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nconst matModules = [\n  MatButtonModule,\n  MatCardModule,\n  MatFormFieldModule,\n  MatIconModule,\n  MatInputModule,\n  MatListModule,\n  MatToolbarModule,\n  MatSidenavModule,\n  MatRadioModule,\n  MatSelectModule,\n  MatGridListModule,\n  MatMenuModule,\n  MatTableModule,\n  MatPaginatorModule,\n  MatTooltipModule\n];\n\n@NgModule({\n  imports: matModules,\n  exports: matModules,\n})\nexport class MaterialModule {\n}"
  },
  {
    "path": "src/styles.scss",
    "content": "$theme-primary: #3e236e;\n$theme-secondary: #43a047;\n\n$default-font-stack: Cambria, \"Hoefler Text\", Utopia, \"Liberation Serif\", \"Nimbus Roman No9 L Regular\", Times, \"Times New Roman\", serif;\n$modern-font-stack: Constantia, \"Lucida Bright\", Lucidabright, \"Lucida Serif\", Lucida, \"DejaVu Serif\", \"Bitstream Vera Serif\", \"Liberation Serif\", Georgia, serif;\n\nhtml, body {\n  font-family: $default-font-stack;\n  padding: 0;\n  margin: 0;\n\n  .content {\n    margin: 2rem;\n  }\n}\n\napp-component {\n\tdisplay: flex;\n\tflex-direction: column;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n}\n\nmat-drawer-container {\n\tflex: 1;\n}\n\nnav > .mat-toolbar {\n\tbackground: $theme-secondary;\n\tcolor: #fff;\n\n\t.nav-logo {\n\t\theight: 28px;\n\t}\n\n\t.flex-spacer {\n\t\tflex: 1 1 auto;\n\t}\n\n\ta {\n\t\ttext-decoration: none;\n\t}\n}\n\n.mobile-nav > a {\n\tflex: 1 1 auto;\n}\n\n.hide-small {\n\t@media screen and (max-width: 720px) {\n\t\tdisplay: none !important;\n\t}\n}\n\n.show-small {\n\t@media screen and (min-width: 720px) {\n\t\tdisplay: none !important;\n\t}\n}\n\n.mat-card {\n\tmargin: 1em;\n}\n\nmat-drawer mat-nav-list .mat-icon {\n\tmargin-right: 0.5em;\n}\n\nh1 {\n\tfont-family: $modern-font-stack;\n\tcolor: $theme-primary;\n  }\n  \n  "
  },
  {
    "path": "src/tsconfig-test.json",
    "content": "{\n    \"extends\": \"./tsconfig.json\",\n    \"compilerOptions\": {\n        \"types\": [\"jasmine\"]\n    }\n}"
  },
  {
    "path": "src/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        // Allow uses of these JS APIs\n        \"lib\": [\n            \"dom\",\n            \"es5\",\n            \"es2015.collection\",\n            \"es2015.iterable\",\n            \"es2015.promise\"\n        ],\n        // Allow type-checking to succeed when we import from generated files\n        // This lets us write out Angular AOT bootstrap by importing the\n        // ngfactory file.\n        // Under Angular Ivy, this is unneeded.\n        \"rootDirs\": [\n            \".\",\n            \"../dist/bin/src\",\n        ],\n        // Permit decorator syntax\n        \"experimentalDecorators\": true,\n        // Don't scan the node_modules/@types folder for ambient types.\n        // This would force us to have all the types in the dependencies of\n        // each library.\n        // Instead we'll be explicit about declaring ambient type dependencies\n        // using the ///<reference types=\"\"/> syntax.\n        \"types\": []\n    }\n}"
  },
  {
    "path": "third_party/github.com/bazelbuild/bazel-toolchains/bazelrc/bazel-0.24.0.bazelrc",
    "content": "# Copyright 2016 The Bazel Authors. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This file is auto-generated from release/bazelrc.tpl and should not be\n# modified directly.\n\n# This .bazelrc file contains all of the flags required for the provided\n# toolchain with Remote Build Execution.\n#\n# This .bazelrc file also contains all of the flags required for the local\n# docker sandboxing.\n\n# Depending on how many machines are in the remote execution instance, setting\n# this higher can make builds faster by allowing more jobs to run in parallel.\n# Setting it too high can result in jobs that timeout, however, while waiting\n# for a remote machine to execute them.\nbuild:remote --jobs=50\n\n# Set several flags related to specifying the platform, toolchain and java\n# properties.\n# These flags are duplicated rather than imported from (for example)\n# %workspace%/configs/ubuntu16_04_clang/1.2/toolchain.bazelrc to make this\n# bazelrc a standalone file that can be copied more easily.\n# These flags should only be used as is for the rbe-ubuntu16-04 container\n# and need to be adapted to work with other toolchain containers.\nbuild:remote --host_javabase=@bazel_toolchains//configs/ubuntu16_04_clang/1.2:jdk8\nbuild:remote --javabase=@bazel_toolchains//configs/ubuntu16_04_clang/1.2:jdk8\nbuild:remote --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8\nbuild:remote --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8\nbuild:remote --crosstool_top=@bazel_toolchains//configs/ubuntu16_04_clang/1.2/bazel_0.24.0/default:toolchain\nbuild:remote --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1\n# Platform flags:\n# The toolchain container used for execution is defined in the target indicated\n# by \"extra_execution_platforms\", \"host_platform\" and \"platforms\".\n# If you are using your own toolchain container, you need to create a platform\n# target with \"constraint_values\" that allow for the toolchain specified with\n# \"extra_toolchains\" to be selected (given constraints defined in\n# \"exec_compatible_with\").\n# More about platforms: https://docs.bazel.build/versions/master/platforms.html\nbuild:remote --extra_toolchains=@bazel_toolchains//configs/ubuntu16_04_clang/1.2/bazel_0.24.0/cpp:cc-toolchain-clang-x86_64-default\nbuild:remote --extra_execution_platforms=@bazel_toolchains//configs/ubuntu16_04_clang/1.2:rbe_ubuntu1604\nbuild:remote --host_platform=@bazel_toolchains//configs/ubuntu16_04_clang/1.2:rbe_ubuntu1604\nbuild:remote --platforms=@bazel_toolchains//configs/ubuntu16_04_clang/1.2:rbe_ubuntu1604\n\n# Set various strategies so that all actions execute remotely. Mixing remote\n# and local execution will lead to errors unless the toolchain and remote\n# machine exactly match the host machine.\nbuild:remote --spawn_strategy=remote\nbuild:remote --strategy=Javac=remote\nbuild:remote --strategy=Closure=remote\nbuild:remote --strategy=Genrule=remote\nbuild:remote --define=EXECUTOR=remote\n\n# Enable the remote cache so action results can be shared across machines,\n# developers, and workspaces.\nbuild:remote --remote_cache=remotebuildexecution.googleapis.com\n\n# Enable remote execution so actions are performed on the remote systems.\nbuild:remote --remote_executor=remotebuildexecution.googleapis.com\n\n# Enable encryption.\nbuild:remote --tls_enabled=true\n\n# Set a higher timeout value, just in case.\nbuild:remote --remote_timeout=3600\n\n# Enable authentication. This will pick up application default credentials by\n# default. You can use --auth_credentials=some_file.json to use a service\n# account credential instead.\nbuild:remote --auth_enabled=true\n\n# The following flags are only necessary for local docker sandboxing\n# with the rbe-ubuntu16-04 container. Use of these flags is still experimental.\nbuild:docker-sandbox --host_javabase=@bazel_toolchains//configs/ubuntu16_04_clang/1.2:jdk8\nbuild:docker-sandbox --javabase=@bazel_toolchains//configs/ubuntu16_04_clang/1.2:jdk8\nbuild:docker-sandbox --crosstool_top=@bazel_toolchains//configs/ubuntu16_04_clang/1.2/bazel_0.24.0/default:toolchain\nbuild:docker-sandbox --experimental_docker_image=gcr.io/cloud-marketplace/google/rbe-ubuntu16-04@sha256:da0f21c71abce3bbb92c3a0c44c3737f007a82b60f8bd2930abc55fe64fc2729\nbuild:docker-sandbox --spawn_strategy=docker\nbuild:docker-sandbox --strategy=Javac=docker\nbuild:docker-sandbox --strategy=Closure=docker\nbuild:docker-sandbox --strategy=Genrule=docker\nbuild:docker-sandbox --define=EXECUTOR=remote\nbuild:docker-sandbox --experimental_docker_verbose\nbuild:docker-sandbox --experimental_enable_docker_sandbox\n\n# The following flags enable the remote cache so action results can be shared\n# across machines, developers, and workspaces.\nbuild:remote-cache --remote_cache=remotebuildexecution.googleapis.com\nbuild:remote-cache --tls_enabled=true\nbuild:remote-cache --remote_timeout=3600\nbuild:remote-cache --auth_enabled=true\nbuild:remote-cache --spawn_strategy=standalone\nbuild:remote-cache --strategy=Javac=standalone\nbuild:remote-cache --strategy=Closure=standalone\nbuild:remote-cache --strategy=Genrule=standalone\n"
  },
  {
    "path": "tools/BUILD.bazel",
    "content": "# The toolchain container used for execution is defined in the target indicated\n# by \"extra_execution_platforms\", \"host_platform\" and \"platforms\".\n# If you are using your own toolchain container, you need to create a platform\n# target with \"constraint_values\" that allow for the toolchain specified with\n# \"extra_toolchains\" to be selected (given constraints defined in\n# \"exec_compatible_with\").\n# More about platforms: https://docs.bazel.build/versions/master/platforms.html\n# Note: we are working to remove the need for this custom platform and image\nplatform(\n    name = \"rbe_ubuntu1604-angular\",\n    constraint_values = [\n        \"@bazel_tools//platforms:x86_64\",\n        \"@bazel_tools//platforms:linux\",\n        \"@bazel_tools//tools/cpp:clang\",\n        \"@bazel_toolchains//constraints:xenial\",\n    ],\n    # RBE team maintains this Docker image for the angular/angular project.\n    remote_execution_properties = \"\"\"\n        properties: {\n            name: \"container-image\"\n            value:\"docker://gcr.io/asci-toolchain/nosla-ubuntu16_04-webtest@sha256:e874885f5e3d9ac0c0d3176e5369cb5969467dbf9ad8d42b862829cec8d84b9b\"\n        }\n        properties: {\n            name: \"dockerAddCapabilities\"\n            value: \"SYS_ADMIN\"\n        }\n        \"\"\",\n)\n"
  },
  {
    "path": "tools/defaults.bzl",
    "content": "load(\"@npm_bazel_karma//:defs.bzl\", _ts_web_test_suite = \"ts_web_test_suite\")\n\ndef ts_web_test_suite(name, browsers = [], tags = [], **kwargs):\n    _ts_web_test_suite(\n        name = name,\n        tags = tags + [\"native\", \"no-bazelci\"],\n        browsers = browsers,\n        **kwargs\n    )\n\n    # BazelCI docker images are missing shares libs to run a subset browser tests:\n    # mac: firefox does not work, chrome works\n    # ubuntu: firefox and chrome do not work --- there are 0 tests to run\n    _ts_web_test_suite(\n        name = \"bazelci_\" + name,\n        tags = tags + [\"native\", \"no-circleci\"],\n        browsers = [\n            \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        ],\n        **kwargs\n    )\n"
  },
  {
    "path": "tools/generator/index.js",
    "content": "if (process.argv[2] === '--clean') {\n require('./src/clean')();\n}\nelse {\n require('./src/generate')(process.argv);\n}\n"
  },
  {
    "path": "tools/generator/src/build-file.js",
    "content": "\nconst fs = require('fs');\n\nmodule.exports.writeModuleBuildFile =\n    function writeModuleBuildFile(file, {modIdx, scssFileAcc, tsFileAcc, htmlFileAcc}) {\n  fs.writeFileSync(\n      file,\n      // Make Buildifier happy, don't format line below.\n      `# Generated BUILD file, see /tools/generator\nload(\"@io_bazel_rules_sass//:defs.bzl\", \"sass_binary\")\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\nload(\"@npm_bazel_typescript//:defs.bzl\", \"ts_library\")\nload(\"//tools:defaults.bzl\", \"ts_web_test_suite\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n${\n          scssFileAcc\n              .map(\n                  (s, idx) =>\n                      // Make Buildifier happy, don't format line below.\n                  `sass_binary(\n    name = \"module${idx}_styles\",\n    src = \"${s}\",\n)`).join('\\n\\n')}\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"module${modIdx}\",\n    srcs = [\n        ${tsFileAcc.map(s => `\"${s}\"`).join(',\\n        ')},\n        \"module${modIdx}.module.ts\",\n    ],\n    assets = [\n        ${scssFileAcc.map((_, idx) => `\":module${idx}_styles\"`).join(`,\\n        `)},\n        ${htmlFileAcc.map(s => `\"${s}\"`).join(',\\n        ')},\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"//src/shared/material\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_library(\n    name = \"test_lib\",\n    testonly = 1,\n    srcs = glob([\"**/*.spec.ts\"]),\n    tsconfig = \"//src:tsconfig-test\",\n    deps = [\n        \":module${modIdx}\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/platform-browser\",\n        \"@npm//@angular/platform-browser-dynamic\",\n        \"@npm//@types/jasmine\",\n        \"@npm//@types/node\",\n    ] + NG_FACTORY_ADDED_IMPORTS,\n)\n\nts_web_test_suite(\n    name = \"test\",\n    # do not sort\n    bootstrap = [\n        \"@npm//:node_modules/zone.js/dist/zone-testing-bundle.js\",\n        \"@npm//:node_modules/reflect-metadata/Reflect.js\",\n    ],\n    browsers = [\n        \"@io_bazel_rules_webtesting//browsers:chromium-local\",\n        \"@io_bazel_rules_webtesting//browsers:firefox-local\",\n    ],\n    runtime_deps = [\n        \"//src:initialize_testbed\",\n    ],\n    deps = [\n        \":test_lib\",\n        \"//src:rxjs_umd_modules\",\n    ],\n)\n        `);\n}\n\n    module.exports.writeFeatureModuleBuildFile = function writeFeatureModuleBuildFile(\n        file, {name, featureModuleDeps}) {\n  fs.writeFileSync(\n      file,\n      // Make Buildifier happy, don't format line below.\n      `# Generated BUILD file, see /tools/generator\nload(\"@npm_angular_bazel//:index.bzl\", \"ng_module\")\n\npackage(default_visibility = [\"//:__subpackages__\"])\n\n# We don't import from these, but the generated ngfactory code will\nNG_FACTORY_ADDED_IMPORTS = [\n    \"@npm//@angular/cdk\",\n    \"@npm//@angular/material\",\n    \"@npm//@angular/forms\",\n]\n\nng_module(\n    name = \"${name}\",\n    srcs = [\n        \"${name}.module.ts\",\n        \"index/index.component.ts\",\n    ],\n    assets = [\n        \"index/index.component.html\",\n    ],\n    tsconfig = \"//src:tsconfig.json\",\n    deps = NG_FACTORY_ADDED_IMPORTS + [\n        \"@npm//@angular/common\",\n        \"@npm//@angular/core\",\n        \"@npm//@angular/router\",\n        ${featureModuleDeps.map(s => `\"${s}\"`).join(',\\n        ')},\n    ],\n)\n    `);\n}\n"
  },
  {
    "path": "tools/generator/src/clean.js",
    "content": "const rimraf = require('rimraf');\nconst { FEATURES } = require('./feature-names');\nconst { updateNgModule, removeRoutesFromNgModule, removeRoutesFromAppComponentHtml } = require('./ng-module');\n\nmodule.exports = function() {\n  FEATURES.map(feature => `src/app/${feature.path}`).forEach(featPath => {\n    console.log(`DELETE ${featPath}`);\n    rimraf.sync(featPath);\n  });\n\n  updateNgModule('src/app/app.module.ts');\n  removeRoutesFromNgModule('src/app/app-routing.module.ts');\n  removeRoutesFromAppComponentHtml('src/app/app.component.html');\n}"
  },
  {
    "path": "tools/generator/src/create-feature-module.js",
    "content": "/**\n * Generate lots of \"feature\" code to bulk out this example to a given size.\n * By default we generate 40 components and check that in.\n * You can generate more by passing arguments, for example\n * yarn generate 10 10\n * will make 1000 components total: for each of the ten \"features\", it will have 10 modules, each\n * has 10 components.\n */\nconst { ng, ngFromTemplate } = require('./ng');\nconst { writeModuleBuildFile, writeFeatureModuleBuildFile } = require('./build-file');\nconst { referenceComponents } = require('./reference-components');\nconst { updateNgModuleWithExtraDeps, updateRoutesInFeatureModule } = require('./ng-module');\n\nlet globalCmpIdx = 0;\n\nmodule.exports.makeFeatureModule = function makeFeatureModule(argv) {\n    return function (feature) {\n        const modulesPerFeature = argv[2] || 2;\n        const componentsPerModule = argv[3] || 2;\n\n        console.log('INFO  ', `Feature: ${feature.path}, Modules: ${modulesPerFeature}, Components: ${componentsPerModule}`);\n\n        ng('generate', 'module', feature.path, '--module', 'app');\n        ng('generate', 'component', `${feature.path}/index`, '--module', `${feature.path}`, '--inlineStyle=true');\n\n        const featureModuleDeps = [];\n        const featureRootModuleDeps = [];\n        const selectorAcc = [];\n\n        for (let modIdx = 0; modIdx < modulesPerFeature; modIdx++) {\n            ng('generate', 'module', `${feature.path}/module${modIdx}`, '--module', feature.path);\n\n            featureRootModuleDeps.push(`//src/app/${feature.path}`);\n            featureModuleDeps.push(`//src/app/${feature.path}/module${modIdx}`);\n            const tsFileAcc = [];\n            const scssFileAcc = [];\n            const htmlFileAcc = [];\n\n            for (let cmpIdx = 0; cmpIdx < componentsPerModule; cmpIdx++) {\n                ngFromTemplate('generate', 'component', `${feature.path}/module${modIdx}/cmp${globalCmpIdx}`, '--module',\n                    `${feature.path}/module${modIdx}`, '--export=true', { componentName: `cmp${globalCmpIdx}`, featureName: feature.path});\n\n                tsFileAcc.push(`cmp${globalCmpIdx}/cmp${globalCmpIdx}.component.ts`);\n                scssFileAcc.push(`cmp${globalCmpIdx}/cmp${globalCmpIdx}.component.scss`);\n                htmlFileAcc.push(`cmp${globalCmpIdx}/cmp${globalCmpIdx}.component.html`);\n                selectorAcc.push(`app-cmp${globalCmpIdx}`);\n                globalCmpIdx++;\n            }\n\n            // Write a BUILD file to build the module\n            writeModuleBuildFile(`src/app/${feature.path}/module${modIdx}/BUILD.bazel`, { modIdx, scssFileAcc, tsFileAcc, htmlFileAcc });\n\n            // Update feature modules with extra dependencies ie, MaterialModule, FormsModule...\n            updateNgModuleWithExtraDeps(`src/app/${feature.path}/module${modIdx}/module${modIdx}.module.ts`, {\n                className: `Module${modIdx}Module`\n            });\n        }\n\n        // Reference all the component selectors in the feature module's index component\n        referenceComponents(`src/app/${feature.path}/index/index.component.html`, { selectorAcc });\n\n        // Wire up routing for the feature module\n        updateRoutesInFeatureModule(`src/app/${feature.path}/${feature.path}.module.ts`);\n\n        // Write a BUILD file to build the feature module\n        writeFeatureModuleBuildFile(`src/app/${feature.path}/BUILD.bazel`, { name: feature.path, featureModuleDeps });\n    }\n}"
  },
  {
    "path": "tools/generator/src/feature-names.js",
    "content": "module.exports.FEATURES = [\n    { path: 'billing', icon: 'credit_card' },\n    { path: 'compute', icon: 'memory' },\n    { path: 'datastore', icon: 'view_agenda' },\n    { path: 'functions', icon: 'functions' },\n    { path: 'logging', icon: 'format_align_left' },\n    { path: 'monitoring', icon: 'device_unknown' },\n    { path: 'networking', icon: 'settings_ethernet' },\n    { path: 'registry', icon: 'ballot' },\n    { path: 'storage', icon: 'folder' },\n    { path: 'support', icon: 'headset_mic' }\n];\n"
  },
  {
    "path": "tools/generator/src/generate.js",
    "content": "\nconst { makeFeatureModule } = require('./create-feature-module');\nconst { updateRoutesInAppComponentHtml, updateRoutesInNgModule } = require('./ng-module');\nconst { FEATURES } = require('./feature-names');\n\nmodule.exports = function(argv) {\n  // Create all feature modules and update BUILD files\n  FEATURES.forEach(makeFeatureModule(argv));\n\n  // Update routing module with routes definition\n  updateRoutesInNgModule(\n      `src/app/app-routing.module.ts`, {routes: FEATURES.map(_feature => _feature.path)});\n\n  // Update src/app/app.component.html with links to the new generated modules\n  updateRoutesInAppComponentHtml('src/app/app.component.html', {features: FEATURES});\n}"
  },
  {
    "path": "tools/generator/src/ng-module.js",
    "content": "const fs = require('fs');\nconst { Project, ts } = require('ts-morph');\nconst { FEATURES } = require('./feature-names');\nconst { humanize, routeLinkRegex } = require('./utils');\n\nmodule.exports.updateNgModule = function updateNgModule(ngAppModulePath = 'src/app/app.module.ts') {\n  // 0-setup\n  const project = new Project();\n  project.addExistingSourceFiles(ngAppModulePath);\n  const importedFeautreModules = [];\n\n  // 1-clean import statements in app.module.ts\n  const ngAppModuleFile = project.getSourceFile(ngAppModulePath);\n  ngAppModuleFile.getImportDeclarations().forEach(importDeclaration => {\n\n    // get the import statment:\n    // eg: import {LoggingModule} from './logging/logging.module';\n\n    const imp = importDeclaration.print();\n    FEATURES.forEach(feature => {\n      if (imp.includes(feature.path)) {\n\n        // we assume there is only one import, eg: {LoggingModule}\n        // not many: {LoggingModule, BillingModule, UserModule}\n        const moduleName = importDeclaration.getNamedImports().pop();\n        importedFeautreModules.push(moduleName.print());\n        importDeclaration.remove();\n      }\n    });\n\n  });\n\n\n  // 2-clean the @NgModule.imports array in app.module.ts\n  const ngAppModuleClass = ngAppModuleFile.getClass('AppModule');\n  const ngModuleDecorator = ngAppModuleClass.getDecorator('NgModule');\n  const ngModuleDecoratorArgs = ngModuleDecorator.getArguments().pop();\n\n  const cleanImportedFeatureModules = ngModuleDecoratorArgs.getProperty('imports').getDescendantsOfKind(ts.SyntaxKind.ArrayLiteralExpression).pop();\n  importedFeautreModules.forEach(featureName => {\n    cleanImportedFeatureModules.getElements().forEach(element => {\n      if (featureName === element.getText()) {\n        cleanImportedFeatureModules.removeElement(element);\n      }\n    });\n  });\n\n  console.log(`\u001dUPDATE ${ngAppModulePath}`);\n\n  project.saveSync();\n};\n\nmodule.exports.removeRoutesFromNgModule = function removeRoutesFromNgModule(\n    ngAppRoutingModulePath = 'src/app/app-routing.module.ts') {\n  // 0-setup\n  const project = new Project();\n  project.addExistingSourceFiles(ngAppRoutingModulePath);\n\n  // 1- clean the route statements in app-routing.module.ts\n  const ngAppRoutingModuleFile = project.getSourceFile(ngAppRoutingModulePath);\n\n  try {\n    var routesArray = ngAppRoutingModuleFile.getVariableDeclaration('routes').getDescendantsOfKind(ts.SyntaxKind.ArrayLiteralExpression).pop();\n  } catch (error) {\n    console.error('ERROR', `couldn't find declaration 'routes' in '${ngAppRoutingModulePath}'.`);\n    process.exit(1);\n  }\n\n  const featureRoutePaths = FEATURES.map(feature => feature.path);\n\n  routesArray.getElements().forEach(route => {\n\n    // route is:\n    // {\n    //  path: 'billing',\n    //  pathMatch: 'full',\n    //  loadChildren: () => import('./billing/billing.module.ngfactory').then(m => m.BillingModuleNgFactory)\n    // }\n\n    const path = route.getProperty('path').getInitializer().getLiteralValue();\n    if (featureRoutePaths.includes(path)) {\n      routesArray.removeElement(route);\n    }\n\n  });\n\n  console.log(`\u001dUPDATE ${ngAppRoutingModulePath}`);\n\n  project.saveSync();\n};\n\nmodule.exports.removeRoutesFromAppComponentHtml = function removeRoutesFromAppComponentHtml(\n    file = 'src/app/app.component.html') {\n  const appComponent = fs.readFileSync(file, { encoding: 'utf-8' });\n\n  fs.writeFileSync(file, appComponent.replace(routeLinkRegex, ''));\n\n  console.log(`UPDATE ${file}`);\n};\n\nmodule.exports.updateRoutesInNgModule = function updateRoutesInNgModule(\n    ngAppRoutingModulePath = 'src/app/app-routing.module.ts', {routes}) {\n  // 0-setup\n  const project = new Project();\n  project.addExistingSourceFiles(ngAppRoutingModulePath);\n\n  // 1- add route statements in app-routing.module.ts\n  const ngAppRoutingModuleFile = project.getSourceFile(ngAppRoutingModulePath);\n\n  try {\n    var routesArray = ngAppRoutingModuleFile.getVariableDeclaration('routes').getDescendantsOfKind(ts.SyntaxKind.ArrayLiteralExpression).pop();\n  } catch (error) {\n    console.error('ERROR', `couldn't find declaration 'routes' in '${ngAppRoutingModulePath}'.`);\n    process.exit(1);\n  }\n\n  routes.forEach(route => {\n    // write a route definition, eg:\n    // {\n    //  path: '${route}',\n    //  pathMatch: 'full',\n    //  loadChildren: () =>\n    //      import('./${route}/${route}.module.ngfactory').then(m => m.HelloWorldModuleNgFactory)\n    // }\n\n    if (routesArray.print().includes(route)) {\n      console.log(`SKIP ${ngAppRoutingModulePath} (${route})`);\n    }\n    else {\n      routesArray.addElement(writer =>\n        writer.writeLine('{')\n          .writeLine(`path: '${route}',`)\n          .writeLine(`pathMatch: 'full',`)\n          .writeLine(`loadChildren: () => import('./${route}/${route}.module.ngfactory').then(m => m.${humanize(route, true)}ModuleNgFactory)`)\n          .writeLine('}')\n      );\n    }\n  });\n\n  console.log(`\u001dUPDATE ${ngAppRoutingModulePath}`);\n  project.saveSync();\n};\n\nmodule.exports.updateRoutesInFeatureModule = function updateRoutesInFeatureModule(file) {\n  const originalFeatureModuleContent =\n    fs.readFileSync(file, { encoding: 'utf-8' });\n\n  if (originalFeatureModuleContent.includes('RouterModule')) {\n    console.log(`SKIP ${file} (RouterModule)`);\n    return true;\n  }\n\n  fs.writeFileSync(\n    file,\n    originalFeatureModuleContent\n      .replace('CommonModule,', `CommonModule,\nRouterModule.forChild([{path: '', component: IndexComponent}]),`)\n      .replace(\n        `from '@angular/common';`,\n        `from '@angular/common';\\nimport { RouterModule } from '@angular/router';`));\n};\n\n\nmodule.exports.updateRoutesInAppComponentHtml = function updateRoutesInAppComponentHtml(\n    file = 'src/app/app.component.html', {features}) {\n  let appComponent =\n    fs.readFileSync(file, { encoding: 'utf-8' });\n\n  const linkTemplate = (feature) => `  <a mat-list-item routerLink=\"/${feature.path}\"><mat-icon>${feature.icon}</mat-icon> ${humanize(feature.path)} </a>`;\n\n  features.forEach(feature => {\n    if (!appComponent.includes(`routerLink=\"/${feature.path}\"`)) {\n      appComponent = appComponent.replace('</mat-nav-list>', `${linkTemplate(feature)}\\n    </mat-nav-list>`);\n    }\n  });\n\n  fs.writeFileSync(file, appComponent);\n\n  console.log(`UPDATE ${file}`);\n};\n\nmodule.exports.updateNgModuleWithExtraDeps = function updateNgModuleWithExtraDeps(\n    featureNgModule, {className}) {\n  // 0-setup\n  const project = new Project();\n  project.addExistingSourceFiles(featureNgModule);\n\n  // 1- add extra imports required by this module\n  // eg: import { MaterialModule } from '../../../shared/material/material.module';\n  const featureNgModuleFile = project.getSourceFile(featureNgModule);\n\n  if (featureNgModuleFile.print().includes('MaterialModule')) {\n    console.log(`SKIP ${featureNgModule} (${className})`);\n    return true;\n  }\n\n  featureNgModuleFile.addImportDeclarations([{\n    defaultImport: '{ ReactiveFormsModule }',\n    moduleSpecifier: '@angular/forms'\n  }, {\n    defaultImport: '{ MaterialModule }',\n    // TODO(manekinekko): use TS path aliases\n    moduleSpecifier: '../../../shared/material/material.module'\n  }]);\n\n  // 2-add MaterialModule to @NgModule.imports\n  const ngAppModuleClass = featureNgModuleFile.getClass(className);\n  const ngModuleDecorator = ngAppModuleClass.getDecorator('NgModule');\n  const ngModuleDecoratorArgs = ngModuleDecorator.getArguments().pop();\n  const importedModules = ngModuleDecoratorArgs.getProperty('imports').getDescendantsOfKind(ts.SyntaxKind.ArrayLiteralExpression).pop();\n  importedModules.addElements(['ReactiveFormsModule', 'MaterialModule']);\n\n  console.log(`\u001dUPDATE ${featureNgModule}`);\n\n  project.saveSync();\n};"
  },
  {
    "path": "tools/generator/src/ng.js",
    "content": "\nconst { spawnSync } = require('child_process');\nconst fs = require('fs');\nconst { humanize } = require('./utils');\n\nmodule.exports.ng = function ng(...args) {\n  spawnSync('ng', args, {stdio: 'inherit'});\n};\n\nconst cmpIdx = 0;\nmodule.exports.ngFromTemplate = function ngFromTemplate(...args) {\n  const {featureName, componentName} = args.pop();\n\n  // reconstruct the final component filepath\n  // NOTE: args[2] = billing/module0/cmp0\n  const componentDestinationFile = `src/app/${args[2]}/${componentName}.component`;\n  const templateDir = 'tools/generator/templates';\n  const templateTypes = ['form', 'dashboard', 'table'];\n  const copyFromTemplate = (destinationFile, templateName, fileType) => {\n    destinationFile = `${destinationFile}.${fileType}`;\n\n    let content = fs.readFileSync(\n        `${templateDir}/${templateName}/component.${fileType}`, {encoding: 'utf-8'});\n\n    content = content.replace(/__name__/g, componentName)\n                  .replace(/__Feature__/g, humanize(featureName, true))\n                  .replace(/__Name__/g, humanize(componentName, true));\n\n    fs.writeFileSync(destinationFile, content);\n\n    console.log('UPDATE', destinationFile, `(${templateName})`);\n  };\n\n  // run ng and generate the component\n  spawnSync('ng', args, {stdio: 'inherit'});\n\n  // cycle through template directories (so the generation is stable)\n  const templateName = templateTypes[cmpIdx % templateTypes.length];\n  // copy template contents\n  copyFromTemplate(componentDestinationFile, templateName, 'ts');\n  copyFromTemplate(componentDestinationFile, templateName, 'spec.ts');\n  copyFromTemplate(componentDestinationFile, templateName, 'scss');\n  copyFromTemplate(componentDestinationFile, templateName, 'html');\n};\n"
  },
  {
    "path": "tools/generator/src/reference-components.js",
    "content": "const fs = require('fs');\n\nmodule.exports.referenceComponents = function referenceComponents(file, {selectorAcc}) {\n  fs.writeFileSync(\n    file,\n    selectorAcc.map(s => `<${s}></${s}>`).join('\\n'));\n};"
  },
  {
    "path": "tools/generator/src/utils.js",
    "content": "const { FEATURES } = require('./feature-names');\n\n// This will match\"\n// <a mat-list-item routerLink=\"/storage\"><mat-icon>folder</mat-icon> Storage </a>\nmodule.exports.routeLinkRegex = new RegExp(`<a.*?routerLink=\"\\/(${FEATURES.map(feature => feature.path).join('|')})\">[\\\\w\\\\W\\\\s'\"<>]+?<\\/a>`, 'mg');\n\n// Transforms \"word-word\" to \"Word Word\" or \"WordWord\"\nmodule.exports.humanize = function humanize(str, removeSpaces = false) {\n  str = str.replace(/\\-/g, ' ')\n    .trim()\n    // lowercase all word blocks\n    .replace(/\\b[A-Za-z]+\\b/g, (word) => word.toLowerCase())\n    // uppercase first letter of each block\n    .replace(/(^[a-z]|\\s[a-z])/g, (first) => first.toUpperCase())\n\n  if (removeSpaces) {\n    str = str.replace(/\\s*/g, '');\n  }\n\n  return str;\n};"
  },
  {
    "path": "tools/generator/templates/dashboard/component.html",
    "content": "<div class=\"grid-container\">\n  <h1 class=\"mat-h1\">__Feature__ – Dashboard</h1>\n  <mat-grid-list cols=\"2\" rowHeight=\"350px\">\n    <mat-grid-tile *ngFor=\"let card of cards | async\" [colspan]=\"card.cols\" [rowspan]=\"card.rows\">\n      <mat-card class=\"dashboard-card\">\n        <mat-card-header>\n          <mat-card-title>\n            {{card.title}}\n            <button mat-icon-button class=\"more-button\" [matMenuTriggerFor]=\"menu\" aria-label=\"Toggle menu\">\n              <mat-icon>more_vert</mat-icon>\n            </button>\n            <mat-menu #menu=\"matMenu\" xPosition=\"before\">\n              <button mat-menu-item>Expand</button>\n              <button mat-menu-item>Remove</button>\n            </mat-menu>\n          </mat-card-title>\n        </mat-card-header>\n        <mat-card-content class=\"dashboard-card-content\">\n          <div>Card Content Here</div>\n        </mat-card-content>\n      </mat-card>\n    </mat-grid-tile>\n  </mat-grid-list>\n</div>\n"
  },
  {
    "path": "tools/generator/templates/dashboard/component.scss",
    "content": ".grid-container {\n margin: 20px;\n}\n\n.dashboard-card {\n position: absolute;\n top: 15px;\n left: 15px;\n right: 15px;\n bottom: 15px;\n}\n\n.more-button {\n position: absolute;\n top: 5px;\n right: 10px;\n}\n\n.dashboard-card-content {\n text-align: center;\n}\n"
  },
  {
    "path": "tools/generator/templates/dashboard/component.spec.ts",
    "content": "import {LayoutModule} from '@angular/cdk/layout';\nimport {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {MatButtonModule, MatCardModule, MatGridListModule, MatIconModule, MatMenuModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {__Name__Component} from './__name__.component';\n\ndescribe('__Name__Component', () => {\n  let component: __Name__Component;\n  let fixture: ComponentFixture<__Name__Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [__Name__Component],\n          imports: [\n            NoopAnimationsModule,\n            LayoutModule,\n            MatButtonModule,\n            MatCardModule,\n            MatGridListModule,\n            MatIconModule,\n            MatMenuModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(__Name__Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it(`should compile ${i}`, () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "tools/generator/templates/dashboard/component.ts",
    "content": "import {BreakpointObserver, Breakpoints} from '@angular/cdk/layout';\nimport {Component} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {map} from 'rxjs/operators';\n\n@Component({\n  selector: 'app-__name__',\n  templateUrl: './__name__.component.html',\n  styleUrls: ['./__name__.component.css']\n})\nexport class __Name__Component {\n  /** Based on the screen size, switch from standard to one column per row */\n  cards: Observable<{title: string; cols: number; rows: number;}[]> =\n      this.breakpointObserver.observe(Breakpoints.Handset).pipe(map(({matches}) => {\n        if (matches) {\n          return [\n            {title: 'Card 1', cols: 1, rows: 1}, {title: 'Card 2', cols: 1, rows: 1},\n            {title: 'Card 3', cols: 1, rows: 1}, {title: 'Card 4', cols: 1, rows: 1}\n          ];\n        }\n\n        return [\n          {title: 'Card 1', cols: 2, rows: 1}, {title: 'Card 2', cols: 1, rows: 1},\n          {title: 'Card 3', cols: 1, rows: 2}, {title: 'Card 4', cols: 1, rows: 1}\n        ];\n      }));\n\n  constructor(private breakpointObserver: BreakpointObserver) {}\n}\n"
  },
  {
    "path": "tools/generator/templates/form/component.html",
    "content": "<form [formGroup]=\"addressForm\" novalidate (ngSubmit)=\"onSubmit()\">\n  <mat-card class=\"shipping-card\">\n    <mat-card-header>\n      <mat-card-title>Billing</mat-card-title>\n    </mat-card-header>\n    <mat-card-content>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Company\" formControlName=\"company\">\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"First name\" formControlName=\"firstName\">\n            <mat-error *ngIf=\"addressForm.controls['firstName'].hasError('required')\">\n              First name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"Last name\" formControlName=\"lastName\">\n            <mat-error *ngIf=\"addressForm.controls['lastName'].hasError('required')\">\n              Last name is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address\" formControlName=\"address\"></textarea>\n            <mat-error *ngIf=\"addressForm.controls['address'].hasError('required')\">\n              Address is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"!hasUnitNumber\">\n        <div class=\"col\">\n          <button mat-button type=\"button\" (click)=\"hasUnitNumber = !hasUnitNumber\">\n            + Add C/O, Apt, Suite, Unit\n          </button>\n        </div>\n      </div>\n      <div class=\"row\" *ngIf=\"hasUnitNumber\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <textarea matInput placeholder=\"Address 2\" formControlName=\"address2\"></textarea>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput placeholder=\"City\" formControlName=\"city\">\n            <mat-error *ngIf=\"addressForm.controls['city'].hasError('required')\">\n              City is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <mat-select placeholder=\"State\" formControlName=\"state\">\n              <mat-option *ngFor=\"let state of states\" [value]=\"state.abbreviation\">\n                {{ state.name }}\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"addressForm.controls['state'].hasError('required')\">\n              State is <strong>required</strong>\n            </mat-error>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-form-field class=\"full-width\">\n            <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" type=\"number\"\n              formControlName=\"postalCode\">\n            <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n          </mat-form-field>\n        </div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col\">\n          <mat-radio-group formControlName=\"shipping\">\n            <mat-radio-button value=\"free\">Free Shipping</mat-radio-button>\n            <mat-radio-button value=\"priority\">Priority Shipping</mat-radio-button>\n            <mat-radio-button value=\"nextday\">Next Day Shipping</mat-radio-button>\n          </mat-radio-group>\n        </div>\n      </div>\n    </mat-card-content>\n    <mat-card-actions>\n      <button mat-raised-button color=\"primary\" type=\"submit\">Submit</button>\n    </mat-card-actions>\n  </mat-card>\n</form>"
  },
  {
    "path": "tools/generator/templates/form/component.scss",
    "content": ".full-width {\n width: 100%;\n}\n\n.shipping-card {\n min-width: 120px;\n margin: 20px auto;\n}\n\n.mat-radio-button {\n display: block;\n margin: 5px 0;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.col {\n flex: 1;\n margin-right: 20px;\n}\n\n.col:last-child {\n margin-right: 0;\n}\n"
  },
  {
    "path": "tools/generator/templates/form/component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport { async, ComponentFixture, TestBed } from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule, MatCardModule, MatInputModule, MatRadioModule, MatSelectModule,} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport { __Name__Component } from './__name__.component';\n\ndescribe('__Name__Component', () => {\n  let component: __Name__Component;\n  let fixture: ComponentFixture<__Name__Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [__Name__Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatButtonModule,\n            MatCardModule,\n            MatInputModule,\n            MatRadioModule,\n            MatSelectModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(__Name__Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "tools/generator/templates/form/component.ts",
    "content": "import {Component} from '@angular/core';\nimport {FormBuilder, FormGroup, Validators} from '@angular/forms';\n\n@Component({\n  selector: 'app-__name__',\n  templateUrl: './__name__.component.html',\n  styleUrls: ['./__name__.component.scss']\n})\nexport class __Name__Component {\n  addressForm: FormGroup = this.fb.group({\n    company: null,\n    firstName: [null, Validators.required],\n    lastName: [null, Validators.required],\n    address: [null, Validators.required],\n    address2: null,\n    city: [null, Validators.required],\n    state: [null, Validators.required],\n    postalCode:\n        [\n          null,\n          Validators.compose(\n              [Validators.required, Validators.minLength(5), Validators.maxLength(5)])\n        ],\n    shipping: ['free', Validators.required]\n  });\n\n  hasUnitNumber = false;\n\n  states = [\n    {name: 'Alabama', abbreviation: 'AL'},\n    {name: 'Alaska', abbreviation: 'AK'},\n    {name: 'American Samoa', abbreviation: 'AS'},\n    {name: 'Arizona', abbreviation: 'AZ'},\n    {name: 'Arkansas', abbreviation: 'AR'},\n    {name: 'California', abbreviation: 'CA'},\n    {name: 'Colorado', abbreviation: 'CO'},\n    {name: 'Connecticut', abbreviation: 'CT'},\n    {name: 'Delaware', abbreviation: 'DE'},\n    {name: 'District Of Columbia', abbreviation: 'DC'},\n    {name: 'Federated States Of Micronesia', abbreviation: 'FM'},\n    {name: 'Florida', abbreviation: 'FL'},\n    {name: 'Georgia', abbreviation: 'GA'},\n    {name: 'Guam', abbreviation: 'GU'},\n    {name: 'Hawaii', abbreviation: 'HI'},\n    {name: 'Idaho', abbreviation: 'ID'},\n    {name: 'Illinois', abbreviation: 'IL'},\n    {name: 'Indiana', abbreviation: 'IN'},\n    {name: 'Iowa', abbreviation: 'IA'},\n    {name: 'Kansas', abbreviation: 'KS'},\n    {name: 'Kentucky', abbreviation: 'KY'},\n    {name: 'Louisiana', abbreviation: 'LA'},\n    {name: 'Maine', abbreviation: 'ME'},\n    {name: 'Marshall Islands', abbreviation: 'MH'},\n    {name: 'Maryland', abbreviation: 'MD'},\n    {name: 'Massachusetts', abbreviation: 'MA'},\n    {name: 'Michigan', abbreviation: 'MI'},\n    {name: 'Minnesota', abbreviation: 'MN'},\n    {name: 'Mississippi', abbreviation: 'MS'},\n    {name: 'Missouri', abbreviation: 'MO'},\n    {name: 'Montana', abbreviation: 'MT'},\n    {name: 'Nebraska', abbreviation: 'NE'},\n    {name: 'Nevada', abbreviation: 'NV'},\n    {name: 'New Hampshire', abbreviation: 'NH'},\n    {name: 'New Jersey', abbreviation: 'NJ'},\n    {name: 'New Mexico', abbreviation: 'NM'},\n    {name: 'New York', abbreviation: 'NY'},\n    {name: 'North Carolina', abbreviation: 'NC'},\n    {name: 'North Dakota', abbreviation: 'ND'},\n    {name: 'Northern Mariana Islands', abbreviation: 'MP'},\n    {name: 'Ohio', abbreviation: 'OH'},\n    {name: 'Oklahoma', abbreviation: 'OK'},\n    {name: 'Oregon', abbreviation: 'OR'},\n    {name: 'Palau', abbreviation: 'PW'},\n    {name: 'Pennsylvania', abbreviation: 'PA'},\n    {name: 'Puerto Rico', abbreviation: 'PR'},\n    {name: 'Rhode Island', abbreviation: 'RI'},\n    {name: 'South Carolina', abbreviation: 'SC'},\n    {name: 'South Dakota', abbreviation: 'SD'},\n    {name: 'Tennessee', abbreviation: 'TN'},\n    {name: 'Texas', abbreviation: 'TX'},\n    {name: 'Utah', abbreviation: 'UT'},\n    {name: 'Vermont', abbreviation: 'VT'},\n    {name: 'Virgin Islands', abbreviation: 'VI'},\n    {name: 'Virginia', abbreviation: 'VA'},\n    {name: 'Washington', abbreviation: 'WA'},\n    {name: 'West Virginia', abbreviation: 'WV'},\n    {name: 'Wisconsin', abbreviation: 'WI'},\n    {name: 'Wyoming', abbreviation: 'WY'}\n  ];\n\n  constructor(private fb: FormBuilder) {}\n\n  onSubmit() {\n    alert('Thanks!');\n  }\n}\n"
  },
  {
    "path": "tools/generator/templates/table/component.html",
    "content": "<mat-form-field>\n  <input matInput (keyup)=\"applyFilter($event.target.value)\" placeholder=\"Filter\">\n</mat-form-field>\n\n<div class=\"mat-elevation-z8\">\n  <table mat-table [dataSource]=\"dataSource\" matSort>\n\n    <!-- ID Column -->\n    <ng-container matColumnDef=\"id\">\n      <th mat-header-cell *matHeaderCellDef mat-sort-header> ID </th>\n      <td mat-cell *matCellDef=\"let row\"> {{row.id}} </td>\n    </ng-container>\n\n    <!-- Progress Column -->\n    <ng-container matColumnDef=\"progress\">\n      <th mat-header-cell *matHeaderCellDef mat-sort-header> Progress </th>\n      <td mat-cell *matCellDef=\"let row\"> {{row.progress}}% </td>\n    </ng-container>\n\n    <!-- Name Column -->\n    <ng-container matColumnDef=\"name\">\n      <th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>\n      <td mat-cell *matCellDef=\"let row\"> {{row.name}} </td>\n    </ng-container>\n\n    <!-- Color Column -->\n    <ng-container matColumnDef=\"color\">\n      <th mat-header-cell *matHeaderCellDef mat-sort-header> Color </th>\n      <td mat-cell *matCellDef=\"let row\" [style.color]=\"row.color\"> {{row.color}} </td>\n    </ng-container>\n\n    <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n    <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\">\n    </tr>\n  </table>\n\n  <mat-paginator [pageSizeOptions]=\"[5, 10, 25, 100]\"></mat-paginator>\n</div>"
  },
  {
    "path": "tools/generator/templates/table/component.scss",
    "content": "table {\n width: 100%;\n}\n\n.mat-form-field {\n font-size: 14px;\n width: 100%;\n}\n\ntd, th {\n width: 25%;\n}\n"
  },
  {
    "path": "tools/generator/templates/table/component.spec.ts",
    "content": "import {NO_ERRORS_SCHEMA} from '@angular/core';\nimport {async, ComponentFixture, TestBed} from '@angular/core/testing';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatPaginatorModule, MatSortModule, MatTableModule} from '@angular/material';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\n\nimport {__Name__Component} from './__name__.component';\n\ndescribe('__Name__Component', () => {\n  let component: __Name__Component;\n  let fixture: ComponentFixture<__Name__Component>;\n\n  beforeEach(async(() => {\n    TestBed\n        .configureTestingModule({\n          declarations: [__Name__Component],\n          imports: [\n            NoopAnimationsModule,\n            ReactiveFormsModule,\n            MatTableModule,\n            MatPaginatorModule,\n            MatSortModule,\n          ],\n          schemas: [NO_ERRORS_SCHEMA]\n        })\n        .compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(__Name__Component);\n    component = fixture.componentInstance;\n    fixture.detectChanges();\n  });\n\n  // Make the test more realistic by doing lots of assertions\n  for (let i = 0; i < 50; i++) {\n    it('should compile', () => {\n      expect(component).toBeTruthy();\n    });\n  }\n});\n"
  },
  {
    "path": "tools/generator/templates/table/component.ts",
    "content": "import {Component, OnInit, ViewChild} from '@angular/core';\nimport {MatPaginator} from '@angular/material/paginator';\nimport {MatSort} from '@angular/material/sort';\nimport {MatTableDataSource} from '@angular/material/table';\n\nexport interface UserData {\n  id: string;\n  name: string;\n  progress: string;\n  color: string;\n}\n\n/** Constants used to fill up our data base. */\nconst COLORS: string[] = [\n  'maroon', 'red', 'orange', 'yellow', 'olive', 'green', 'purple', 'fuchsia', 'lime', 'teal',\n  'aqua', 'blue', 'navy', 'black', 'gray'\n];\nconst NAMES: string[] = [\n  'Maia', 'Asher', 'Olivia', 'Atticus', 'Amelia', 'Jack', 'Charlotte', 'Theodore', 'Isla', 'Oliver',\n  'Isabella', 'Jasper', 'Cora', 'Levi', 'Violet', 'Arthur', 'Mia', 'Thomas', 'Elizabeth'\n];\n\n/**\n * @title Data table with sorting, pagination, and filtering.\n */\n@Component({\n  selector: 'app-__name__',\n  styleUrls: ['__name__.component.scss'],\n  templateUrl: '__name__.component.html',\n})\nexport class __Name__Component implements OnInit {\n  displayedColumns: string[] = ['id', 'name', 'progress', 'color'];\n  dataSource: MatTableDataSource<UserData>;\n\n  @ViewChild(MatPaginator) paginator: MatPaginator;\n  @ViewChild(MatSort) sort: MatSort;\n\n  constructor() {\n    // Create 1000 users\n    const users = Array.from({length: 1000}, (_, k) => createNewUser(k + 1));\n\n    // Assign the data to the data source for the table to render\n    this.dataSource = new MatTableDataSource(users);\n  }\n\n  ngOnInit() {\n    this.dataSource.paginator = this.paginator;\n    this.dataSource.sort = this.sort;\n  }\n\n  applyFilter(filterValue: string) {\n    this.dataSource.filter = filterValue.trim().toLowerCase();\n\n    if (this.dataSource.paginator) {\n      this.dataSource.paginator.firstPage();\n    }\n  }\n}\n\n/** Builds and returns a new User. */\nfunction createNewUser(id: number): UserData {\n  const name = NAMES[Math.round(Math.random() * (NAMES.length - 1))] + ' ' +\n      NAMES[Math.round(Math.random() * (NAMES.length - 1))].charAt(0) + '.';\n\n  return {\n    id: id.toString(),\n    name: name,\n    progress: Math.round(Math.random() * 100).toString(),\n    color: COLORS[Math.round(Math.random() * (COLORS.length - 1))]\n  };\n}"
  }
]