summaryrefslogtreecommitdiff
path: root/hadrian/bootstrap
diff options
context:
space:
mode:
Diffstat (limited to 'hadrian/bootstrap')
-rw-r--r--hadrian/bootstrap/README.md23
-rwxr-xr-xhadrian/bootstrap/bootstrap.py388
-rw-r--r--hadrian/bootstrap/cabal.project1
-rwxr-xr-xhadrian/bootstrap/generate_bootstrap_plans18
-rw-r--r--hadrian/bootstrap/hadrian-bootstrap-gen.cabal20
-rw-r--r--hadrian/bootstrap/plan-8_10_1.json1
-rw-r--r--hadrian/bootstrap/plan-8_10_2.json1
-rw-r--r--hadrian/bootstrap/plan-8_10_3.json1
-rw-r--r--hadrian/bootstrap/plan-8_10_4.json1
-rw-r--r--hadrian/bootstrap/plan-8_10_5.json1
-rw-r--r--hadrian/bootstrap/plan-9_0_1.json1
-rw-r--r--hadrian/bootstrap/plan-bootstrap-8_10_1.json1
-rw-r--r--hadrian/bootstrap/plan-bootstrap-8_10_2.json1
-rw-r--r--hadrian/bootstrap/plan-bootstrap-8_10_3.json1
-rw-r--r--hadrian/bootstrap/plan-bootstrap-8_10_4.json1
-rw-r--r--hadrian/bootstrap/plan-bootstrap-8_10_5.json1
-rw-r--r--hadrian/bootstrap/plan-bootstrap-9_0_1.json1
-rw-r--r--hadrian/bootstrap/src/Main.hs233
18 files changed, 695 insertions, 0 deletions
diff --git a/hadrian/bootstrap/README.md b/hadrian/bootstrap/README.md
new file mode 100644
index 0000000000..c82ace0669
--- /dev/null
+++ b/hadrian/bootstrap/README.md
@@ -0,0 +1,23 @@
+# Bootstrapping hadrian
+
+These scripts are originally from the cabal-install repo with a few
+small tweaks.
+
+This utility allows you to build hadrian without cabal-install, which can be useful
+for packagers. If you are a developer then build hadrian using cabal-install.
+
+If you want to bootstrap with ghc-8.10.5 then run the ./bootstrap script with the
+`plan-bootstrap-8.10.5.json` file.
+
+ bootstrap.py -d plan-bootstrap-8.10.5.json -w /path/to-ghc
+
+The result of the bootstrap script will be a hadrian binary in
+`_build/bin/hadrian`.
+
+There is a script (using nix) which can be used to generate the bootstrap plans for the range
+of supported GHC versions using nix.
+
+ generate_bootstrap_plans
+
+Otherwise you can run the commands in ./generate_bootstrap_plans directly.
+
diff --git a/hadrian/bootstrap/bootstrap.py b/hadrian/bootstrap/bootstrap.py
new file mode 100755
index 0000000000..8ed4d5588c
--- /dev/null
+++ b/hadrian/bootstrap/bootstrap.py
@@ -0,0 +1,388 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+"""
+bootstrap.py - bootstrapping utility for hadrian
+
+See bootstrap/README.md for usage instructions.
+"""
+
+USAGE = """
+This utility is only intended for use in building hadrian
+on a new platform. If you already have a functional cabal-install
+please rather run `cabal build hadrian .`. or `./hadrian/build`
+"""
+
+from enum import Enum
+import hashlib
+import logging
+import json
+from pathlib import Path
+import platform
+import shutil
+import subprocess
+from textwrap import dedent
+from typing import Set, Optional, Dict, List, Tuple, \
+ NewType, BinaryIO, NamedTuple, TypeVar
+
+#logging.basicConfig(level=logging.INFO)
+
+BUILDDIR = Path('_build')
+
+BINDIR = BUILDDIR / 'bin' # binaries go there (--bindir)
+DISTDIR = BUILDDIR / 'dists' # --builddir
+UNPACKED = BUILDDIR / 'unpacked' # where we unpack tarballs
+TARBALLS = BUILDDIR / 'tarballs' # where we download tarballks
+PSEUDOSTORE = BUILDDIR / 'pseudostore' # where we install packages
+ARTIFACTS = BUILDDIR / 'artifacts' # Where we put the archive
+TMPDIR = BUILDDIR / 'tmp' #
+PKG_DB = BUILDDIR / 'packages.conf' # package db
+
+PackageName = NewType('PackageName', str)
+Version = NewType('Version', str)
+SHA256Hash = NewType('SHA256Hash', str)
+
+class PackageSource(Enum):
+ HACKAGE = 'hackage'
+ LOCAL = 'local'
+
+BuiltinDep = NamedTuple('BuiltinDep', [
+ ('package', PackageName),
+ ('version', Version),
+])
+
+BootstrapDep = NamedTuple('BootstrapDep', [
+ ('package', PackageName),
+ ('version', Version),
+ ('source', PackageSource),
+ # source tarball SHA256
+ ('src_sha256', Optional[SHA256Hash]),
+ # `revision` is only valid when source == HACKAGE.
+ ('revision', Optional[int]),
+ ('cabal_sha256', Optional[SHA256Hash]),
+ ('flags', List[str]),
+])
+
+BootstrapInfo = NamedTuple('BootstrapInfo', [
+ ('builtin', List[BuiltinDep]),
+ ('dependencies', List[BootstrapDep]),
+])
+
+class Compiler:
+ def __init__(self, ghc_path: Path):
+ if not ghc_path.is_file():
+ raise TypeError(f'GHC {ghc_path} is not a file')
+
+ self.ghc_path = ghc_path.resolve()
+
+ info = self._get_ghc_info()
+ self.version = info['Project version']
+ #self.lib_dir = Path(info['LibDir'])
+ #self.ghc_pkg_path = (self.lib_dir / 'bin' / 'ghc-pkg').resolve()
+ self.ghc_pkg_path = (self.ghc_path.parent / 'ghc-pkg').resolve()
+ if not self.ghc_pkg_path.is_file():
+ raise TypeError(f'ghc-pkg {self.ghc_pkg_path} is not a file')
+
+ def _get_ghc_info(self) -> Dict[str,str]:
+ from ast import literal_eval
+ p = subprocess_run([self.ghc_path, '--info'], stdout=subprocess.PIPE, check=True, encoding='UTF-8')
+ out = p.stdout.replace('\n', '').strip()
+ return dict(literal_eval(out))
+
+PackageSpec = Tuple[PackageName, Version]
+
+class BadTarball(Exception):
+ def __init__(self, path: Path, expected_sha256: SHA256Hash, found_sha256: SHA256Hash):
+ self.path = path
+ self.expected_sha256 = expected_sha256
+ self.found_sha256 = found_sha256
+
+ def __str__(self):
+ return '\n'.join([
+ f'Bad tarball hash: {str(self.path)}',
+ f' expected: {self.expected_sha256}',
+ f' found: {self.found_sha256}',
+ ])
+
+def package_url(package: PackageName, version: Version) -> str:
+ return f'http://hackage.haskell.org/package/{package}-{version}/{package}-{version}.tar.gz'
+
+def package_cabal_url(package: PackageName, version: Version, revision: int) -> str:
+ return f'http://hackage.haskell.org/package/{package}-{version}/revision/{revision}.cabal'
+
+def verify_sha256(expected_hash: SHA256Hash, f: Path):
+ h = hash_file(hashlib.sha256(), f.open('rb'))
+ if h != expected_hash:
+ raise BadTarball(f, expected_hash, h)
+
+def fetch_package(package: PackageName,
+ version: Version,
+ src_sha256: SHA256Hash,
+ revision: Optional[int],
+ cabal_sha256: Optional[SHA256Hash],
+ ) -> (Path, Path):
+ import urllib.request
+
+ # Download source distribution
+ tarball = TARBALLS / f'{package}-{version}.tar.gz'
+ if not tarball.exists():
+ print(f'Fetching {package}-{version}...')
+ tarball.parent.mkdir(parents=True, exist_ok=True)
+ url = package_url(package, version)
+ with urllib.request.urlopen(url) as resp:
+ shutil.copyfileobj(resp, tarball.open('wb'))
+
+ verify_sha256(src_sha256, tarball)
+
+ # Download revised cabal file
+ cabal_file = TARBALLS / f'{package}.cabal'
+ if revision is not None and not cabal_file.exists():
+ assert cabal_sha256 is not None
+ url = package_cabal_url(package, version, revision)
+ with urllib.request.urlopen(url) as resp:
+ shutil.copyfileobj(resp, cabal_file.open('wb'))
+ verify_sha256(cabal_sha256, cabal_file)
+
+ return (tarball, cabal_file)
+
+def read_bootstrap_info(path: Path) -> BootstrapInfo:
+ obj = json.load(path.open())
+
+ def bi_from_json(o: dict) -> BuiltinDep:
+ return BuiltinDep(**o)
+
+ def dep_from_json(o: dict) -> BootstrapDep:
+ o['source'] = PackageSource(o['source'])
+ return BootstrapDep(**o)
+
+ builtin = [bi_from_json(dep) for dep in obj['builtin'] ]
+ deps = [dep_from_json(dep) for dep in obj['dependencies'] ]
+
+ return BootstrapInfo(dependencies=deps, builtin=builtin)
+
+def check_builtin(dep: BuiltinDep, ghc: Compiler) -> None:
+ subprocess_run([str(ghc.ghc_pkg_path), 'describe', f'{dep.package}-{dep.version}'],
+ check=True, stdout=subprocess.DEVNULL)
+ print(f'Using {dep.package}-{dep.version} from GHC...')
+ return
+
+def install_dep(dep: BootstrapDep, ghc: Compiler) -> None:
+ dist_dir = (DISTDIR / f'{dep.package}-{dep.version}').resolve()
+
+ if dep.source == PackageSource.HACKAGE:
+ assert dep.src_sha256 is not None
+ (tarball, cabal_file) = fetch_package(dep.package, dep.version, dep.src_sha256,
+ dep.revision, dep.cabal_sha256)
+ UNPACKED.mkdir(parents=True, exist_ok=True)
+ shutil.unpack_archive(tarball.resolve(), UNPACKED, 'gztar')
+ sdist_dir = UNPACKED / f'{dep.package}-{dep.version}'
+
+ # Update cabal file with revision
+ if dep.revision is not None:
+ shutil.copyfile(cabal_file, sdist_dir / f'{dep.package}.cabal')
+
+ elif dep.source == PackageSource.LOCAL:
+ if dep.package == 'hadrian':
+ sdist_dir = Path('../').resolve()
+ else:
+ raise ValueError(f'Unknown local package {dep.package}')
+
+ install_sdist(dist_dir, sdist_dir, ghc, dep.flags)
+
+def install_sdist(dist_dir: Path, sdist_dir: Path, ghc: Compiler, flags: List[str]):
+ prefix = PSEUDOSTORE.resolve()
+ flags_option = ' '.join(flags)
+ setup_dist_dir = dist_dir / 'setup'
+ setup = setup_dist_dir / 'Setup'
+
+ build_args = [
+ f'--builddir={dist_dir}',
+ ]
+
+ configure_args = build_args + [
+ f'--package-db={PKG_DB.resolve()}',
+ f'--prefix={prefix}',
+ f'--bindir={BINDIR.resolve()}',
+ f'--with-compiler={ghc.ghc_path}',
+ f'--with-hc-pkg={ghc.ghc_pkg_path}',
+ f'--flags={flags_option}',
+ ]
+
+ def check_call(args: List[str]) -> None:
+ subprocess_run(args, cwd=sdist_dir, check=True)
+
+ setup_dist_dir.mkdir(parents=True, exist_ok=True)
+
+
+ setup_file = sdist_dir / 'Setup.hs'
+ if not setup_file.exists():
+ with open(setup_file, 'w') as setup_out:
+ setup_out.write('import Distribution.Simple\nmain = defaultMain')
+
+ # Note: we pass -i so GHC doesn't look for anything else
+ # This should be fine for cabal-install dependencies.
+ check_call([str(ghc.ghc_path), '--make', '-package-env=-', '-i', f'-odir={setup_dist_dir}', f'-hidir={setup_dist_dir}', '-o', setup, 'Setup'])
+ check_call([setup, 'configure'] + configure_args)
+ check_call([setup, 'build'] + build_args)
+ check_call([setup, 'install'] + build_args)
+
+def hash_file(h, f: BinaryIO) -> SHA256Hash:
+ while True:
+ d = f.read(1024)
+ if len(d) == 0:
+ return SHA256Hash(h.hexdigest())
+
+ h.update(d)
+
+
+# Cabal plan.json representation
+UnitId = NewType('UnitId', str)
+PlanUnit = NewType('PlanUnit', dict)
+
+def bootstrap(info: BootstrapInfo, ghc: Compiler) -> None:
+ if not PKG_DB.exists():
+ print(f'Creating package database {PKG_DB}')
+ PKG_DB.parent.mkdir(parents=True, exist_ok=True)
+ subprocess_run([ghc.ghc_pkg_path, 'init', PKG_DB])
+
+ for dep in info.builtin:
+ check_builtin(dep, ghc)
+
+ for dep in info.dependencies:
+ install_dep(dep, ghc)
+
+# Steps
+#######################################################################
+
+def linuxname(i, r):
+ i = i.strip() # id
+ r = r.strip() # release
+ if i == '': return 'linux'
+ else: return f"{i}-{r}".lower()
+
+def macname(macver):
+ # https://en.wikipedia.org/wiki/MacOS_version_history#Releases
+ if macver.startswith('10.12.'): return 'sierra'
+ if macver.startswith('10.13.'): return 'high-sierra'
+ if macver.startswith('10.14.'): return 'mojave'
+ if macver.startswith('10.15.'): return 'catalina'
+ if macver.startswith('11.0.'): return 'big-sur'
+ else: return macver
+
+def archive_name(version):
+ # Ask platform information
+ machine = platform.machine()
+ if machine == '': machine = "unknown"
+
+ system = platform.system().lower()
+ if system == '': system = "unknown"
+
+ version = system
+ if system == 'linux':
+ try:
+ i = subprocess_run(['lsb_release', '-si'], stdout=subprocess.PIPE, encoding='UTF-8')
+ r = subprocess_run(['lsb_release', '-sr'], stdout=subprocess.PIPE, encoding='UTF-8')
+ version = linuxname(i.stdout, r.stdout)
+ except:
+ try:
+ with open('/etc/alpine-release') as f:
+ alpinever = f.read().strip()
+ return f'alpine-{alpinever}'
+ except:
+ pass
+ elif system == 'darwin':
+ version = 'darwin-' + macname(platform.mac_ver()[0])
+ elif system == 'freebsd':
+ version = 'freebsd-' + platform.release().lower()
+
+ return f'hadrian-{version}-{machine}-{version}'
+
+def make_archive(hadrian_path):
+ import tempfile
+
+ print(f'Creating distribution tarball')
+
+ # Get bootstrapped hadrian version
+ # This also acts as smoke test
+ p = subprocess_run([hadrian_path, '--numeric-version'], stdout=subprocess.PIPE, check=True, encoding='UTF-8')
+ cabalversion = p.stdout.replace('\n', '').strip()
+
+ # Archive name
+ basename = ARTIFACTS.resolve() / (archive_name(cabalversion) + '-bootstrapped')
+
+ # In temporary directory, create a directory which we will archive
+ tmpdir = TMPDIR.resolve()
+ tmpdir.mkdir(parents=True, exist_ok=True)
+
+ rootdir = Path(tempfile.mkdtemp(dir=tmpdir))
+ shutil.copy(hadrian_path, rootdir / 'hadrian')
+
+ # Make archive...
+ fmt = 'xztar'
+ if platform.system() == 'Windows': fmt = 'zip'
+ archivename = shutil.make_archive(basename, fmt, rootdir)
+
+ return archivename
+
+def main() -> None:
+ import argparse
+ parser = argparse.ArgumentParser(
+ description="bootstrapping utility for hadrian.",
+ epilog = USAGE,
+ formatter_class = argparse.RawDescriptionHelpFormatter)
+ parser.add_argument('-d', '--deps', type=Path, default='bootstrap-deps.json',
+ help='bootstrap dependency file')
+ parser.add_argument('-w', '--with-compiler', type=Path,
+ help='path to GHC')
+ args = parser.parse_args()
+
+ # Find compiler
+ if args.with_compiler is None:
+ path = shutil.which('ghc')
+ if path is None:
+ raise ValueError("Couldn't find ghc in PATH")
+ ghc = Compiler(Path(path))
+ else:
+ ghc = Compiler(args.with_compiler)
+
+ print(f'Bootstrapping hadrian with GHC {ghc.version} at {ghc.ghc_path}...')
+
+ print(dedent("""
+ DO NOT use this script if you have another recent cabal-install available.
+ This script is intended only for bootstrapping hadrian on new
+ architectures.
+ """))
+
+ info = read_bootstrap_info(args.deps)
+ bootstrap(info, ghc)
+ hadrian_path = (BINDIR / 'hadrian').resolve()
+
+ archive = make_archive(hadrian_path)
+
+ print(dedent(f'''
+ Bootstrapping finished!
+
+ The resulting hadrian executable can be found at
+
+ {hadrian_path}
+
+ It have been archived for distribution in
+
+ {archive}
+
+ You can use this executable to build GHC.
+ '''))
+
+def subprocess_run(args, **kwargs):
+ "Like subprocess.run, but also print what we run"
+
+ args_str = ' '.join(map(str, args))
+ extras = ''
+ if 'cwd' in kwargs:
+ extras += f' cwd={kwargs["cwd"]}'
+ print(f'bootstrap: running{extras} {args_str}')
+
+ return subprocess.run(args, **kwargs)
+
+if __name__ == '__main__':
+ main()
diff --git a/hadrian/bootstrap/cabal.project b/hadrian/bootstrap/cabal.project
new file mode 100644
index 0000000000..e6fdbadb43
--- /dev/null
+++ b/hadrian/bootstrap/cabal.project
@@ -0,0 +1 @@
+packages: .
diff --git a/hadrian/bootstrap/generate_bootstrap_plans b/hadrian/bootstrap/generate_bootstrap_plans
new file mode 100755
index 0000000000..167559aa53
--- /dev/null
+++ b/hadrian/bootstrap/generate_bootstrap_plans
@@ -0,0 +1,18 @@
+ghcs_nix="https://gitlab.haskell.org/bgamari/ghcs-nix/-/archive/master/ghcs-nix-master.tar.gz"
+
+run() {
+ local ver="$1"
+ local drv="ghc-$ver"
+ echo "$ver"
+ nix build -f "$ghcs_nix" $drv
+ (cd ../; rm -r dist-newstyle; cabal configure hadrian -w bootstrap/result/bin/ghc)
+ cp ../dist-newstyle/cache/plan.json "plan-$ver.json"
+ cabal run -v0 hadrian-bootstrap-gen -- "plan-$ver.json" | tee "plan-bootstrap-$ver.json"
+}
+
+run "8_10_1"
+# run "8_10_2" Broken
+run "8_10_3"
+run "8_10_4"
+run "8_10_5"
+run "9_0_1"
diff --git a/hadrian/bootstrap/hadrian-bootstrap-gen.cabal b/hadrian/bootstrap/hadrian-bootstrap-gen.cabal
new file mode 100644
index 0000000000..977af35468
--- /dev/null
+++ b/hadrian/bootstrap/hadrian-bootstrap-gen.cabal
@@ -0,0 +1,20 @@
+cabal-version: 2.2
+name: hadrian-bootstrap-gen
+version: 0
+
+executable hadrian-bootstrap-gen
+ default-language: Haskell2010
+ hs-source-dirs: src
+ ghc-options: -Wall
+ main-is: Main.hs
+ build-depends:
+ , aeson ^>=1.5.2.0
+ , base ^>=4.12.0.0 || ^>=4.13.0.0 || ^>=4.14.0.0
+ , bytestring ^>=0.10.8.2
+ , Cabal ^>=3.2.0.0
+ , cabal-install-parsers ^>=0.3.0.1
+ , cabal-plan ^>=0.7.0.0
+ , containers ^>=0.6.0.1
+ , text ^>=1.2.3.0
+ , topograph ^>=1.0.0.1
+ , transformers ^>=0.5.6.2
diff --git a/hadrian/bootstrap/plan-8_10_1.json b/hadrian/bootstrap/plan-8_10_1.json
new file mode 100644
index 0000000000..3dd477cf8e
--- /dev/null
+++ b/hadrian/bootstrap/plan-8_10_1.json
@@ -0,0 +1 @@
+{"cabal-version":"3.2.0.0","cabal-lib-version":"3.2.0.0","compiler-id":"ghc-8.10.1","os":"linux","arch":"x86_64","install-plan":[{"type":"pre-existing","id":"Cabal-3.2.0.0","pkg-name":"Cabal","pkg-version":"3.2.0.0","depends":["array-0.5.4.0","base-4.14.0.0","binary-0.8.8.0","bytestring-0.10.10.0","containers-0.6.2.1","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","pretty-1.1.3.6","process-1.6.8.2","text-1.2.3.2","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2"]},{"type":"configured","id":"QuickCheck-2.14.2-3bf861496cce6d2157bfd3021c541eef02c0e69e64932316a5665fc5e4c4102f","pkg-name":"QuickCheck","pkg-version":"2.14.2","flags":{"old-random":false,"templatehaskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","pkg-src-sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","depends":["base-4.14.0.0","containers-0.6.2.1","deepseq-1.4.4.0","random-1.2.0-7dca4da04d1af76b276795b5f4342d551ad8e8615320698c61e830145bad1f46","splitmix-0.1.0.3-0ed9006997a5257b2ba2fca3e9619b8740b49d5b8e73c7ca7421df40f3d8ee0d","template-haskell-2.16.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"array-0.5.4.0","pkg-name":"array","pkg-version":"0.5.4.0","depends":["base-4.14.0.0"]},{"type":"pre-existing","id":"base-4.14.0.0","pkg-name":"base","pkg-version":"4.14.0.0","depends":["ghc-prim-0.6.1","integer-gmp-1.0.3.0","rts"]},{"type":"pre-existing","id":"binary-0.8.8.0","pkg-name":"binary","pkg-version":"0.8.8.0","depends":["array-0.5.4.0","base-4.14.0.0","bytestring-0.10.10.0","containers-0.6.2.1"]},{"type":"pre-existing","id":"bytestring-0.10.10.0","pkg-name":"bytestring","pkg-version":"0.10.10.0","depends":["base-4.14.0.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0"]},{"type":"configured","id":"clock-0.8.2-5678492e11bfb8a7d3a2b2e38d8d4c40f7d1b5d4dccfb1b05678d09b7bf1c4bd","pkg-name":"clock","pkg-version":"0.8.2","flags":{"llvm":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","pkg-src-sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","depends":["base-4.14.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"containers-0.6.2.1","pkg-name":"containers","pkg-version":"0.6.2.1","depends":["array-0.5.4.0","base-4.14.0.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"deepseq-1.4.4.0","pkg-name":"deepseq","pkg-version":"1.4.4.0","depends":["array-0.5.4.0","base-4.14.0.0"]},{"type":"pre-existing","id":"directory-1.3.6.0","pkg-name":"directory","pkg-version":"1.3.6.0","depends":["base-4.14.0.0","filepath-1.4.2.1","time-1.9.3","unix-2.7.2.2"]},{"type":"configured","id":"extra-1.7.9-fcbae94026571f14f14a2f934b7ca4aeb931d4388235276e41d1f314dff3ed48","pkg-name":"extra","pkg-version":"1.7.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","pkg-src-sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","depends":["base-4.14.0.0","clock-0.8.2-5678492e11bfb8a7d3a2b2e38d8d4c40f7d1b5d4dccfb1b05678d09b7bf1c4bd","directory-1.3.6.0","filepath-1.4.2.1","process-1.6.8.2","time-1.9.3","unix-2.7.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"filepath-1.4.2.1","pkg-name":"filepath","pkg-version":"1.4.2.1","depends":["base-4.14.0.0"]},{"type":"configured","id":"filepattern-0.1.2-f4bcbba4b051aa2703f4d8db7a044e2e5f0676b5a743af7564a465b04acc2fe0","pkg-name":"filepattern","pkg-version":"0.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","pkg-src-sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","depends":["base-4.14.0.0","directory-1.3.6.0","extra-1.7.9-fcbae94026571f14f14a2f934b7ca4aeb931d4388235276e41d1f314dff3ed48","filepath-1.4.2.1"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"ghc-boot-th-8.10.1","pkg-name":"ghc-boot-th","pkg-version":"8.10.1","depends":["base-4.14.0.0"]},{"type":"pre-existing","id":"ghc-prim-0.6.1","pkg-name":"ghc-prim","pkg-version":"0.6.1","depends":["rts"]},{"type":"configured","id":"hadrian-0.1.0.0-inplace-hadrian","pkg-name":"hadrian","pkg-version":"0.1.0.0","flags":{"threaded":true},"style":"local","pkg-src":{"type":"local","path":"/home/matt/ghc-hadrian-bootstrap/hadrian/."},"dist-dir":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.1/hadrian-0.1.0.0/x/hadrian","depends":["Cabal-3.2.0.0","QuickCheck-2.14.2-3bf861496cce6d2157bfd3021c541eef02c0e69e64932316a5665fc5e4c4102f","base-4.14.0.0","bytestring-0.10.10.0","containers-0.6.2.1","directory-1.3.6.0","extra-1.7.9-fcbae94026571f14f14a2f934b7ca4aeb931d4388235276e41d1f314dff3ed48","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","shake-0.19.4-8efe84f02a56166e8783c9ec6246bc734f19a6bb93690c65f6832ed0b0afa88a","transformers-0.5.6.2","unordered-containers-0.2.13.0-515c86b51479cff7046834433af1270b0862534995184bb2b2f9995333de32bf"],"exe-depends":[],"component-name":"exe:hadrian","bin-file":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.1/hadrian-0.1.0.0/x/hadrian/build/hadrian/hadrian"},{"type":"configured","id":"hashable-1.3.1.0-e5266421805138ba33cb27c5894cb8d323461bfd1d26eab8a3eeaa8738feb21f","pkg-name":"hashable","pkg-version":"1.3.1.0","flags":{"integer-gmp":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","pkg-src-sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","depends":["base-4.14.0.0","bytestring-0.10.10.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0","text-1.2.3.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"heaps-0.4-ebb85f92a69df2a486999e08b7e807d9fbc4e26e25545eba46f44ce382961342","pkg-name":"heaps","pkg-version":"0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","pkg-src-sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","depends":["base-4.14.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"integer-gmp-1.0.3.0","pkg-name":"integer-gmp","pkg-version":"1.0.3.0","depends":["ghc-prim-0.6.1"]},{"type":"configured","id":"js-dgtable-0.5.2-1b1295ec305a0a0a37f8af71db1bf3b9906d5052baa83df910e19162afe8d0af","pkg-name":"js-dgtable","pkg-version":"0.5.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","pkg-src-sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","depends":["base-4.14.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-flot-0.8.3-24f7575c68cf18833a7af148b1da8ca04552dd81b411728aacefa32c87ac0d48","pkg-name":"js-flot","pkg-version":"0.8.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","pkg-src-sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","depends":["base-4.14.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-jquery-3.3.1-7c01f724a76c7ce3dad098d46b1380931a0b051eb6f623b83fdf8f7f344e10cd","pkg-name":"js-jquery","pkg-version":"3.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","pkg-src-sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","depends":["base-4.14.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"mtl-2.2.2","pkg-name":"mtl","pkg-version":"2.2.2","depends":["base-4.14.0.0","transformers-0.5.6.2"]},{"type":"pre-existing","id":"parsec-3.1.14.0","pkg-name":"parsec","pkg-version":"3.1.14.0","depends":["base-4.14.0.0","bytestring-0.10.10.0","mtl-2.2.2","text-1.2.3.2"]},{"type":"pre-existing","id":"pretty-1.1.3.6","pkg-name":"pretty","pkg-version":"1.1.3.6","depends":["base-4.14.0.0","deepseq-1.4.4.0","ghc-prim-0.6.1"]},{"type":"configured","id":"primitive-0.7.1.0-3f661be4f721ce92d10cbee1089ed28cba78d61cc6f3688eddf35cc825d96e95","pkg-name":"primitive","pkg-version":"0.7.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f6357d5720c1c665096c3e011467daf443198b786a708d2ff926958a24d508d4","pkg-src-sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","depends":["base-4.14.0.0","deepseq-1.4.4.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"process-1.6.8.2","pkg-name":"process","pkg-version":"1.6.8.2","depends":["base-4.14.0.0","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","unix-2.7.2.2"]},{"type":"configured","id":"random-1.2.0-7dca4da04d1af76b276795b5f4342d551ad8e8615320698c61e830145bad1f46","pkg-name":"random","pkg-version":"1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"30d72df4cc1d2fe2d445c88f0ee9d21965af7ce86660c43a6c32a6a1d90d51c9","pkg-src-sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","depends":["base-4.14.0.0","bytestring-0.10.10.0","deepseq-1.4.4.0","mtl-2.2.2","splitmix-0.1.0.3-0ed9006997a5257b2ba2fca3e9619b8740b49d5b8e73c7ca7421df40f3d8ee0d"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"rts","pkg-name":"rts","pkg-version":"1.0","depends":[]},{"type":"configured","id":"shake-0.19.4-46bc09b21201f84f8cfb104e58245d2d8b2af4763aada804340b8cd557beedf9","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.0.0","binary-0.8.8.0","bytestring-0.10.10.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-fcbae94026571f14f14a2f934b7ca4aeb931d4388235276e41d1f314dff3ed48","filepath-1.4.2.1","filepattern-0.1.2-f4bcbba4b051aa2703f4d8db7a044e2e5f0676b5a743af7564a465b04acc2fe0","hashable-1.3.1.0-e5266421805138ba33cb27c5894cb8d323461bfd1d26eab8a3eeaa8738feb21f","heaps-0.4-ebb85f92a69df2a486999e08b7e807d9fbc4e26e25545eba46f44ce382961342","js-dgtable-0.5.2-1b1295ec305a0a0a37f8af71db1bf3b9906d5052baa83df910e19162afe8d0af","js-flot-0.8.3-24f7575c68cf18833a7af148b1da8ca04552dd81b411728aacefa32c87ac0d48","js-jquery-3.3.1-7c01f724a76c7ce3dad098d46b1380931a0b051eb6f623b83fdf8f7f344e10cd","primitive-0.7.1.0-3f661be4f721ce92d10cbee1089ed28cba78d61cc6f3688eddf35cc825d96e95","process-1.6.8.2","random-1.2.0-7dca4da04d1af76b276795b5f4342d551ad8e8615320698c61e830145bad1f46","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-515c86b51479cff7046834433af1270b0862534995184bb2b2f9995333de32bf","utf8-string-1.0.2-2815d6173223cc0d3fa6daeb6e7e82993bf2b7b864e9ca8453a068a4ab7ffea9"],"exe-depends":[],"component-name":"exe:shake","bin-file":"/home/matt/.cabal/store/ghc-8.10.1/shake-0.19.4-46bc09b21201f84f8cfb104e58245d2d8b2af4763aada804340b8cd557beedf9/bin/shake"},{"type":"configured","id":"shake-0.19.4-8efe84f02a56166e8783c9ec6246bc734f19a6bb93690c65f6832ed0b0afa88a","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.0.0","binary-0.8.8.0","bytestring-0.10.10.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-fcbae94026571f14f14a2f934b7ca4aeb931d4388235276e41d1f314dff3ed48","filepath-1.4.2.1","filepattern-0.1.2-f4bcbba4b051aa2703f4d8db7a044e2e5f0676b5a743af7564a465b04acc2fe0","hashable-1.3.1.0-e5266421805138ba33cb27c5894cb8d323461bfd1d26eab8a3eeaa8738feb21f","heaps-0.4-ebb85f92a69df2a486999e08b7e807d9fbc4e26e25545eba46f44ce382961342","js-dgtable-0.5.2-1b1295ec305a0a0a37f8af71db1bf3b9906d5052baa83df910e19162afe8d0af","js-flot-0.8.3-24f7575c68cf18833a7af148b1da8ca04552dd81b411728aacefa32c87ac0d48","js-jquery-3.3.1-7c01f724a76c7ce3dad098d46b1380931a0b051eb6f623b83fdf8f7f344e10cd","primitive-0.7.1.0-3f661be4f721ce92d10cbee1089ed28cba78d61cc6f3688eddf35cc825d96e95","process-1.6.8.2","random-1.2.0-7dca4da04d1af76b276795b5f4342d551ad8e8615320698c61e830145bad1f46","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-515c86b51479cff7046834433af1270b0862534995184bb2b2f9995333de32bf","utf8-string-1.0.2-2815d6173223cc0d3fa6daeb6e7e82993bf2b7b864e9ca8453a068a4ab7ffea9"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"splitmix-0.1.0.3-0ed9006997a5257b2ba2fca3e9619b8740b49d5b8e73c7ca7421df40f3d8ee0d","pkg-name":"splitmix","pkg-version":"0.1.0.3","flags":{"optimised-mixer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","pkg-src-sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","depends":["base-4.14.0.0","deepseq-1.4.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"template-haskell-2.16.0.0","pkg-name":"template-haskell","pkg-version":"2.16.0.0","depends":["base-4.14.0.0","ghc-boot-th-8.10.1","ghc-prim-0.6.1","pretty-1.1.3.6"]},{"type":"pre-existing","id":"text-1.2.3.2","pkg-name":"text","pkg-version":"1.2.3.2","depends":["array-0.5.4.0","base-4.14.0.0","binary-0.8.8.0","bytestring-0.10.10.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0"]},{"type":"pre-existing","id":"time-1.9.3","pkg-name":"time","pkg-version":"1.9.3","depends":["base-4.14.0.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"transformers-0.5.6.2","pkg-name":"transformers","pkg-version":"0.5.6.2","depends":["base-4.14.0.0"]},{"type":"pre-existing","id":"unix-2.7.2.2","pkg-name":"unix","pkg-version":"2.7.2.2","depends":["base-4.14.0.0","bytestring-0.10.10.0","time-1.9.3"]},{"type":"configured","id":"unordered-containers-0.2.13.0-515c86b51479cff7046834433af1270b0862534995184bb2b2f9995333de32bf","pkg-name":"unordered-containers","pkg-version":"0.2.13.0","flags":{"debug":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","pkg-src-sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","depends":["base-4.14.0.0","deepseq-1.4.4.0","hashable-1.3.1.0-e5266421805138ba33cb27c5894cb8d323461bfd1d26eab8a3eeaa8738feb21f"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"utf8-string-1.0.2-2815d6173223cc0d3fa6daeb6e7e82993bf2b7b864e9ca8453a068a4ab7ffea9","pkg-name":"utf8-string","pkg-version":"1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","pkg-src-sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","depends":["base-4.14.0.0","bytestring-0.10.10.0"],"exe-depends":[],"component-name":"lib"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-8_10_2.json b/hadrian/bootstrap/plan-8_10_2.json
new file mode 100644
index 0000000000..dc9fff4bc1
--- /dev/null
+++ b/hadrian/bootstrap/plan-8_10_2.json
@@ -0,0 +1 @@
+{"cabal-version":"3.2.0.0","cabal-lib-version":"3.2.0.0","compiler-id":"ghc-8.10.2","os":"linux","arch":"x86_64","install-plan":[{"type":"pre-existing","id":"Cabal-3.2.0.0","pkg-name":"Cabal","pkg-version":"3.2.0.0","depends":["array-0.5.4.0","base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.10.0","containers-0.6.2.1","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","pretty-1.1.3.6","process-1.6.9.0","text-1.2.3.2","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2"]},{"type":"configured","id":"QuickCheck-2.14.2-4044f5a3c770279a46a4bce71f9df77e45678626f035897da04ca467e8d974da","pkg-name":"QuickCheck","pkg-version":"2.14.2","flags":{"old-random":false,"templatehaskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","pkg-src-sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","depends":["base-4.14.1.0","containers-0.6.2.1","deepseq-1.4.4.0","random-1.2.0-f056578d75c60848b8e9e432f58aef5a50fd256f12c0d313697cf915d364df6e","splitmix-0.1.0.3-dcfd89d2a83afbc76e693b35ab28b6af92e664e5e9ca7adbee03987ab7311697","template-haskell-2.16.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"array-0.5.4.0","pkg-name":"array","pkg-version":"0.5.4.0","depends":["base-4.14.1.0"]},{"type":"pre-existing","id":"base-4.14.1.0","pkg-name":"base","pkg-version":"4.14.1.0","depends":["ghc-prim-0.6.1","integer-gmp-1.0.3.0","rts"]},{"type":"pre-existing","id":"binary-0.8.8.0","pkg-name":"binary","pkg-version":"0.8.8.0","depends":["array-0.5.4.0","base-4.14.1.0","bytestring-0.10.10.0","containers-0.6.2.1"]},{"type":"pre-existing","id":"bytestring-0.10.10.0","pkg-name":"bytestring","pkg-version":"0.10.10.0","depends":["base-4.14.1.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0"]},{"type":"configured","id":"clock-0.8.2-ab5b6c44643ca4539e7f0278ba1ecd8a2b8b7f0c8d1a40e5b2075f360ebc9ef1","pkg-name":"clock","pkg-version":"0.8.2","flags":{"llvm":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","pkg-src-sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"containers-0.6.2.1","pkg-name":"containers","pkg-version":"0.6.2.1","depends":["array-0.5.4.0","base-4.14.1.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"deepseq-1.4.4.0","pkg-name":"deepseq","pkg-version":"1.4.4.0","depends":["array-0.5.4.0","base-4.14.1.0"]},{"type":"pre-existing","id":"directory-1.3.6.0","pkg-name":"directory","pkg-version":"1.3.6.0","depends":["base-4.14.1.0","filepath-1.4.2.1","time-1.9.3","unix-2.7.2.2"]},{"type":"configured","id":"extra-1.7.9-6f94da3821f2f5df7b0cd80e72f6f8ebd26d26ff383fd20a81fabf8cc11bc903","pkg-name":"extra","pkg-version":"1.7.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","pkg-src-sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","depends":["base-4.14.1.0","clock-0.8.2-ab5b6c44643ca4539e7f0278ba1ecd8a2b8b7f0c8d1a40e5b2075f360ebc9ef1","directory-1.3.6.0","filepath-1.4.2.1","process-1.6.9.0","time-1.9.3","unix-2.7.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"filepath-1.4.2.1","pkg-name":"filepath","pkg-version":"1.4.2.1","depends":["base-4.14.1.0"]},{"type":"configured","id":"filepattern-0.1.2-482fb6b9851cd3b3ea17ca0f09ae14ceb0b13f1e76d2229921f60707aabd7243","pkg-name":"filepattern","pkg-version":"0.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","pkg-src-sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","depends":["base-4.14.1.0","directory-1.3.6.0","extra-1.7.9-6f94da3821f2f5df7b0cd80e72f6f8ebd26d26ff383fd20a81fabf8cc11bc903","filepath-1.4.2.1"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"ghc-boot-th-8.10.2","pkg-name":"ghc-boot-th","pkg-version":"8.10.2","depends":["base-4.14.1.0"]},{"type":"pre-existing","id":"ghc-prim-0.6.1","pkg-name":"ghc-prim","pkg-version":"0.6.1","depends":["rts"]},{"type":"configured","id":"hadrian-0.1.0.0-inplace-hadrian","pkg-name":"hadrian","pkg-version":"0.1.0.0","flags":{"threaded":true},"style":"local","pkg-src":{"type":"local","path":"/home/matt/ghc-hadrian-bootstrap/hadrian/."},"dist-dir":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.2/hadrian-0.1.0.0/x/hadrian","depends":["Cabal-3.2.0.0","QuickCheck-2.14.2-4044f5a3c770279a46a4bce71f9df77e45678626f035897da04ca467e8d974da","base-4.14.1.0","bytestring-0.10.10.0","containers-0.6.2.1","directory-1.3.6.0","extra-1.7.9-6f94da3821f2f5df7b0cd80e72f6f8ebd26d26ff383fd20a81fabf8cc11bc903","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","shake-0.19.4-f8cdc3e489342853f74786242c9a766272e61ed4562f4c435df2b56d21e8d3fd","transformers-0.5.6.2","unordered-containers-0.2.13.0-52616055beaf35b7801a4548d552377bdc0d78bf23390ed0c3384b06e8940f3f"],"exe-depends":[],"component-name":"exe:hadrian","bin-file":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.2/hadrian-0.1.0.0/x/hadrian/build/hadrian/hadrian"},{"type":"configured","id":"hashable-1.3.1.0-7b0e9905af2c8c28f1c93a5db526225be808fbbb246856be800cc8d4fbb94dfd","pkg-name":"hashable","pkg-version":"1.3.1.0","flags":{"integer-gmp":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","pkg-src-sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","depends":["base-4.14.1.0","bytestring-0.10.10.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0","text-1.2.3.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"heaps-0.4-a7e7fc85bc63f2274cc7beeb3dca066995f9f0ffa9b8a2eb066886fb968ab7c9","pkg-name":"heaps","pkg-version":"0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","pkg-src-sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"integer-gmp-1.0.3.0","pkg-name":"integer-gmp","pkg-version":"1.0.3.0","depends":["ghc-prim-0.6.1"]},{"type":"configured","id":"js-dgtable-0.5.2-4f088268d09c2f9647278883e5402bd984046a32e50bcf47f101c4f2dc5fafe0","pkg-name":"js-dgtable","pkg-version":"0.5.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","pkg-src-sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-flot-0.8.3-39743a76d3bd70144281f131cefa148e8394b14de00015baaad9f2e5e7a7cb80","pkg-name":"js-flot","pkg-version":"0.8.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","pkg-src-sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-jquery-3.3.1-2c482b4477c7cd995d7a3b1ff5594d388a9f62830d6aba26fceadd912ccf4fd0","pkg-name":"js-jquery","pkg-version":"3.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","pkg-src-sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"mtl-2.2.2","pkg-name":"mtl","pkg-version":"2.2.2","depends":["base-4.14.1.0","transformers-0.5.6.2"]},{"type":"pre-existing","id":"parsec-3.1.14.0","pkg-name":"parsec","pkg-version":"3.1.14.0","depends":["base-4.14.1.0","bytestring-0.10.10.0","mtl-2.2.2","text-1.2.3.2"]},{"type":"pre-existing","id":"pretty-1.1.3.6","pkg-name":"pretty","pkg-version":"1.1.3.6","depends":["base-4.14.1.0","deepseq-1.4.4.0","ghc-prim-0.6.1"]},{"type":"configured","id":"primitive-0.7.1.0-f012577575c0a83a7acb71352c37f9c2228aa22d38df742952e879128e014616","pkg-name":"primitive","pkg-version":"0.7.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f6357d5720c1c665096c3e011467daf443198b786a708d2ff926958a24d508d4","pkg-src-sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","depends":["base-4.14.1.0","deepseq-1.4.4.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"process-1.6.9.0","pkg-name":"process","pkg-version":"1.6.9.0","depends":["base-4.14.1.0","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","unix-2.7.2.2"]},{"type":"configured","id":"random-1.2.0-f056578d75c60848b8e9e432f58aef5a50fd256f12c0d313697cf915d364df6e","pkg-name":"random","pkg-version":"1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"30d72df4cc1d2fe2d445c88f0ee9d21965af7ce86660c43a6c32a6a1d90d51c9","pkg-src-sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","depends":["base-4.14.1.0","bytestring-0.10.10.0","deepseq-1.4.4.0","mtl-2.2.2","splitmix-0.1.0.3-dcfd89d2a83afbc76e693b35ab28b6af92e664e5e9ca7adbee03987ab7311697"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"rts","pkg-name":"rts","pkg-version":"1.0","depends":[]},{"type":"configured","id":"shake-0.19.4-043a452e03636c533f8396bf4845a504600fbe9ae9b301a3549004d4b35e16bd","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.10.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-6f94da3821f2f5df7b0cd80e72f6f8ebd26d26ff383fd20a81fabf8cc11bc903","filepath-1.4.2.1","filepattern-0.1.2-482fb6b9851cd3b3ea17ca0f09ae14ceb0b13f1e76d2229921f60707aabd7243","hashable-1.3.1.0-7b0e9905af2c8c28f1c93a5db526225be808fbbb246856be800cc8d4fbb94dfd","heaps-0.4-a7e7fc85bc63f2274cc7beeb3dca066995f9f0ffa9b8a2eb066886fb968ab7c9","js-dgtable-0.5.2-4f088268d09c2f9647278883e5402bd984046a32e50bcf47f101c4f2dc5fafe0","js-flot-0.8.3-39743a76d3bd70144281f131cefa148e8394b14de00015baaad9f2e5e7a7cb80","js-jquery-3.3.1-2c482b4477c7cd995d7a3b1ff5594d388a9f62830d6aba26fceadd912ccf4fd0","primitive-0.7.1.0-f012577575c0a83a7acb71352c37f9c2228aa22d38df742952e879128e014616","process-1.6.9.0","random-1.2.0-f056578d75c60848b8e9e432f58aef5a50fd256f12c0d313697cf915d364df6e","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-52616055beaf35b7801a4548d552377bdc0d78bf23390ed0c3384b06e8940f3f","utf8-string-1.0.2-7bb4e7e8bc997282589aaaaa9ac99fb554953ac12c720494d91f57d7ff984c86"],"exe-depends":[],"component-name":"exe:shake","bin-file":"/home/matt/.cabal/store/ghc-8.10.2/shake-0.19.4-043a452e03636c533f8396bf4845a504600fbe9ae9b301a3549004d4b35e16bd/bin/shake"},{"type":"configured","id":"shake-0.19.4-f8cdc3e489342853f74786242c9a766272e61ed4562f4c435df2b56d21e8d3fd","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.10.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-6f94da3821f2f5df7b0cd80e72f6f8ebd26d26ff383fd20a81fabf8cc11bc903","filepath-1.4.2.1","filepattern-0.1.2-482fb6b9851cd3b3ea17ca0f09ae14ceb0b13f1e76d2229921f60707aabd7243","hashable-1.3.1.0-7b0e9905af2c8c28f1c93a5db526225be808fbbb246856be800cc8d4fbb94dfd","heaps-0.4-a7e7fc85bc63f2274cc7beeb3dca066995f9f0ffa9b8a2eb066886fb968ab7c9","js-dgtable-0.5.2-4f088268d09c2f9647278883e5402bd984046a32e50bcf47f101c4f2dc5fafe0","js-flot-0.8.3-39743a76d3bd70144281f131cefa148e8394b14de00015baaad9f2e5e7a7cb80","js-jquery-3.3.1-2c482b4477c7cd995d7a3b1ff5594d388a9f62830d6aba26fceadd912ccf4fd0","primitive-0.7.1.0-f012577575c0a83a7acb71352c37f9c2228aa22d38df742952e879128e014616","process-1.6.9.0","random-1.2.0-f056578d75c60848b8e9e432f58aef5a50fd256f12c0d313697cf915d364df6e","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-52616055beaf35b7801a4548d552377bdc0d78bf23390ed0c3384b06e8940f3f","utf8-string-1.0.2-7bb4e7e8bc997282589aaaaa9ac99fb554953ac12c720494d91f57d7ff984c86"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"splitmix-0.1.0.3-dcfd89d2a83afbc76e693b35ab28b6af92e664e5e9ca7adbee03987ab7311697","pkg-name":"splitmix","pkg-version":"0.1.0.3","flags":{"optimised-mixer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","pkg-src-sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","depends":["base-4.14.1.0","deepseq-1.4.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"template-haskell-2.16.0.0","pkg-name":"template-haskell","pkg-version":"2.16.0.0","depends":["base-4.14.1.0","ghc-boot-th-8.10.2","ghc-prim-0.6.1","pretty-1.1.3.6"]},{"type":"pre-existing","id":"text-1.2.3.2","pkg-name":"text","pkg-version":"1.2.3.2","depends":["array-0.5.4.0","base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.10.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0"]},{"type":"pre-existing","id":"time-1.9.3","pkg-name":"time","pkg-version":"1.9.3","depends":["base-4.14.1.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"transformers-0.5.6.2","pkg-name":"transformers","pkg-version":"0.5.6.2","depends":["base-4.14.1.0"]},{"type":"pre-existing","id":"unix-2.7.2.2","pkg-name":"unix","pkg-version":"2.7.2.2","depends":["base-4.14.1.0","bytestring-0.10.10.0","time-1.9.3"]},{"type":"configured","id":"unordered-containers-0.2.13.0-52616055beaf35b7801a4548d552377bdc0d78bf23390ed0c3384b06e8940f3f","pkg-name":"unordered-containers","pkg-version":"0.2.13.0","flags":{"debug":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","pkg-src-sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","depends":["base-4.14.1.0","deepseq-1.4.4.0","hashable-1.3.1.0-7b0e9905af2c8c28f1c93a5db526225be808fbbb246856be800cc8d4fbb94dfd"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"utf8-string-1.0.2-7bb4e7e8bc997282589aaaaa9ac99fb554953ac12c720494d91f57d7ff984c86","pkg-name":"utf8-string","pkg-version":"1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","pkg-src-sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","depends":["base-4.14.1.0","bytestring-0.10.10.0"],"exe-depends":[],"component-name":"lib"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-8_10_3.json b/hadrian/bootstrap/plan-8_10_3.json
new file mode 100644
index 0000000000..2cb9d47551
--- /dev/null
+++ b/hadrian/bootstrap/plan-8_10_3.json
@@ -0,0 +1 @@
+{"cabal-version":"3.2.0.0","cabal-lib-version":"3.2.0.0","compiler-id":"ghc-8.10.3","os":"linux","arch":"x86_64","install-plan":[{"type":"pre-existing","id":"Cabal-3.2.1.0","pkg-name":"Cabal","pkg-version":"3.2.1.0","depends":["array-0.5.4.0","base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.12.0","containers-0.6.2.1","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","pretty-1.1.3.6","process-1.6.9.0","text-1.2.4.1","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2"]},{"type":"configured","id":"QuickCheck-2.14.2-f6f12c3f614c16e3c653247bcad2dd0dec63c03a385bbdfe3c7e047c86572d3c","pkg-name":"QuickCheck","pkg-version":"2.14.2","flags":{"old-random":false,"templatehaskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","pkg-src-sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","depends":["base-4.14.1.0","containers-0.6.2.1","deepseq-1.4.4.0","random-1.2.0-8751b6ab3bf8a29738d8affd64a32c530278d4d97e2b8b78157213eb4fd0fad3","splitmix-0.1.0.3-5263e456e3deb12ee532288e6660fa3141fb27d86848a24ef3f795b36bf28604","template-haskell-2.16.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"array-0.5.4.0","pkg-name":"array","pkg-version":"0.5.4.0","depends":["base-4.14.1.0"]},{"type":"pre-existing","id":"base-4.14.1.0","pkg-name":"base","pkg-version":"4.14.1.0","depends":["ghc-prim-0.6.1","integer-gmp-1.0.3.0","rts"]},{"type":"pre-existing","id":"binary-0.8.8.0","pkg-name":"binary","pkg-version":"0.8.8.0","depends":["array-0.5.4.0","base-4.14.1.0","bytestring-0.10.12.0","containers-0.6.2.1"]},{"type":"pre-existing","id":"bytestring-0.10.12.0","pkg-name":"bytestring","pkg-version":"0.10.12.0","depends":["base-4.14.1.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0"]},{"type":"configured","id":"clock-0.8.2-561bf41aecf0cfc291ef9b3c9a081b639a48cd32a13227a24db604f2b84abc87","pkg-name":"clock","pkg-version":"0.8.2","flags":{"llvm":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","pkg-src-sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"containers-0.6.2.1","pkg-name":"containers","pkg-version":"0.6.2.1","depends":["array-0.5.4.0","base-4.14.1.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"deepseq-1.4.4.0","pkg-name":"deepseq","pkg-version":"1.4.4.0","depends":["array-0.5.4.0","base-4.14.1.0"]},{"type":"pre-existing","id":"directory-1.3.6.0","pkg-name":"directory","pkg-version":"1.3.6.0","depends":["base-4.14.1.0","filepath-1.4.2.1","time-1.9.3","unix-2.7.2.2"]},{"type":"configured","id":"extra-1.7.9-dce3c7c629dc8cd0e0494399218eba89ce41cd419182de9b96b1d47307217ba8","pkg-name":"extra","pkg-version":"1.7.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","pkg-src-sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","depends":["base-4.14.1.0","clock-0.8.2-561bf41aecf0cfc291ef9b3c9a081b639a48cd32a13227a24db604f2b84abc87","directory-1.3.6.0","filepath-1.4.2.1","process-1.6.9.0","time-1.9.3","unix-2.7.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"filepath-1.4.2.1","pkg-name":"filepath","pkg-version":"1.4.2.1","depends":["base-4.14.1.0"]},{"type":"configured","id":"filepattern-0.1.2-53645fcb5130018828ce8e09006a2ec9f131b6bd679725f5d2f656e0e63873b2","pkg-name":"filepattern","pkg-version":"0.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","pkg-src-sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","depends":["base-4.14.1.0","directory-1.3.6.0","extra-1.7.9-dce3c7c629dc8cd0e0494399218eba89ce41cd419182de9b96b1d47307217ba8","filepath-1.4.2.1"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"ghc-boot-th-8.10.3","pkg-name":"ghc-boot-th","pkg-version":"8.10.3","depends":["base-4.14.1.0"]},{"type":"pre-existing","id":"ghc-prim-0.6.1","pkg-name":"ghc-prim","pkg-version":"0.6.1","depends":["rts"]},{"type":"configured","id":"hadrian-0.1.0.0-inplace-hadrian","pkg-name":"hadrian","pkg-version":"0.1.0.0","flags":{"threaded":true},"style":"local","pkg-src":{"type":"local","path":"/home/matt/ghc-hadrian-bootstrap/hadrian/."},"dist-dir":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.3/hadrian-0.1.0.0/x/hadrian","depends":["Cabal-3.2.1.0","QuickCheck-2.14.2-f6f12c3f614c16e3c653247bcad2dd0dec63c03a385bbdfe3c7e047c86572d3c","base-4.14.1.0","bytestring-0.10.12.0","containers-0.6.2.1","directory-1.3.6.0","extra-1.7.9-dce3c7c629dc8cd0e0494399218eba89ce41cd419182de9b96b1d47307217ba8","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","shake-0.19.4-154a036f7fabd1afe2433f6b01fc055bc27b8bf12b4b54274f96d9d7f95c45af","transformers-0.5.6.2","unordered-containers-0.2.13.0-c339ce8bcad402d54dda48190f0160368a91b33000b6363217428f19f11b311d"],"exe-depends":[],"component-name":"exe:hadrian","bin-file":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.3/hadrian-0.1.0.0/x/hadrian/build/hadrian/hadrian"},{"type":"configured","id":"hashable-1.3.1.0-9d9392e26ad14e913887d96978f75dc08a0b208fc5749961c981ba1e6234b17a","pkg-name":"hashable","pkg-version":"1.3.1.0","flags":{"integer-gmp":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","pkg-src-sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","depends":["base-4.14.1.0","bytestring-0.10.12.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0","text-1.2.4.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"heaps-0.4-a2b06a7095349a383c9c422287d4b54d3b349d39442bf720c0dd32927a806724","pkg-name":"heaps","pkg-version":"0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","pkg-src-sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"integer-gmp-1.0.3.0","pkg-name":"integer-gmp","pkg-version":"1.0.3.0","depends":["ghc-prim-0.6.1"]},{"type":"configured","id":"js-dgtable-0.5.2-77d91e31d290a2be1a0b48b51eda2c33a04d51bdeed64d2341bbee2db7f93554","pkg-name":"js-dgtable","pkg-version":"0.5.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","pkg-src-sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-flot-0.8.3-e6f42e02763ad88995e377c2665c6d778eb08c83c2c1fdd7a8a1a343bebd41f1","pkg-name":"js-flot","pkg-version":"0.8.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","pkg-src-sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-jquery-3.3.1-feca31846e8a0af2c70634e7e82c203a09152383c65737988599200ffd674215","pkg-name":"js-jquery","pkg-version":"3.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","pkg-src-sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"mtl-2.2.2","pkg-name":"mtl","pkg-version":"2.2.2","depends":["base-4.14.1.0","transformers-0.5.6.2"]},{"type":"pre-existing","id":"parsec-3.1.14.0","pkg-name":"parsec","pkg-version":"3.1.14.0","depends":["base-4.14.1.0","bytestring-0.10.12.0","mtl-2.2.2","text-1.2.4.1"]},{"type":"pre-existing","id":"pretty-1.1.3.6","pkg-name":"pretty","pkg-version":"1.1.3.6","depends":["base-4.14.1.0","deepseq-1.4.4.0","ghc-prim-0.6.1"]},{"type":"configured","id":"primitive-0.7.1.0-b64578c3e3db8528a2409db30cbec8c49a4e78bf70f136b4f273606555288293","pkg-name":"primitive","pkg-version":"0.7.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f6357d5720c1c665096c3e011467daf443198b786a708d2ff926958a24d508d4","pkg-src-sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","depends":["base-4.14.1.0","deepseq-1.4.4.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"process-1.6.9.0","pkg-name":"process","pkg-version":"1.6.9.0","depends":["base-4.14.1.0","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","unix-2.7.2.2"]},{"type":"configured","id":"random-1.2.0-8751b6ab3bf8a29738d8affd64a32c530278d4d97e2b8b78157213eb4fd0fad3","pkg-name":"random","pkg-version":"1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"30d72df4cc1d2fe2d445c88f0ee9d21965af7ce86660c43a6c32a6a1d90d51c9","pkg-src-sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","depends":["base-4.14.1.0","bytestring-0.10.12.0","deepseq-1.4.4.0","mtl-2.2.2","splitmix-0.1.0.3-5263e456e3deb12ee532288e6660fa3141fb27d86848a24ef3f795b36bf28604"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"rts","pkg-name":"rts","pkg-version":"1.0","depends":[]},{"type":"configured","id":"shake-0.19.4-154a036f7fabd1afe2433f6b01fc055bc27b8bf12b4b54274f96d9d7f95c45af","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.12.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-dce3c7c629dc8cd0e0494399218eba89ce41cd419182de9b96b1d47307217ba8","filepath-1.4.2.1","filepattern-0.1.2-53645fcb5130018828ce8e09006a2ec9f131b6bd679725f5d2f656e0e63873b2","hashable-1.3.1.0-9d9392e26ad14e913887d96978f75dc08a0b208fc5749961c981ba1e6234b17a","heaps-0.4-a2b06a7095349a383c9c422287d4b54d3b349d39442bf720c0dd32927a806724","js-dgtable-0.5.2-77d91e31d290a2be1a0b48b51eda2c33a04d51bdeed64d2341bbee2db7f93554","js-flot-0.8.3-e6f42e02763ad88995e377c2665c6d778eb08c83c2c1fdd7a8a1a343bebd41f1","js-jquery-3.3.1-feca31846e8a0af2c70634e7e82c203a09152383c65737988599200ffd674215","primitive-0.7.1.0-b64578c3e3db8528a2409db30cbec8c49a4e78bf70f136b4f273606555288293","process-1.6.9.0","random-1.2.0-8751b6ab3bf8a29738d8affd64a32c530278d4d97e2b8b78157213eb4fd0fad3","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-c339ce8bcad402d54dda48190f0160368a91b33000b6363217428f19f11b311d","utf8-string-1.0.2-726aff700d8b8562f31c2e2566ac8ba43b365bb48cb8c60dfa098430e9a88f18"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"shake-0.19.4-e592095104d8d10af7c8c638222a4f572e4aa0d8571c63bad3429dfd672ef529","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.12.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-dce3c7c629dc8cd0e0494399218eba89ce41cd419182de9b96b1d47307217ba8","filepath-1.4.2.1","filepattern-0.1.2-53645fcb5130018828ce8e09006a2ec9f131b6bd679725f5d2f656e0e63873b2","hashable-1.3.1.0-9d9392e26ad14e913887d96978f75dc08a0b208fc5749961c981ba1e6234b17a","heaps-0.4-a2b06a7095349a383c9c422287d4b54d3b349d39442bf720c0dd32927a806724","js-dgtable-0.5.2-77d91e31d290a2be1a0b48b51eda2c33a04d51bdeed64d2341bbee2db7f93554","js-flot-0.8.3-e6f42e02763ad88995e377c2665c6d778eb08c83c2c1fdd7a8a1a343bebd41f1","js-jquery-3.3.1-feca31846e8a0af2c70634e7e82c203a09152383c65737988599200ffd674215","primitive-0.7.1.0-b64578c3e3db8528a2409db30cbec8c49a4e78bf70f136b4f273606555288293","process-1.6.9.0","random-1.2.0-8751b6ab3bf8a29738d8affd64a32c530278d4d97e2b8b78157213eb4fd0fad3","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-c339ce8bcad402d54dda48190f0160368a91b33000b6363217428f19f11b311d","utf8-string-1.0.2-726aff700d8b8562f31c2e2566ac8ba43b365bb48cb8c60dfa098430e9a88f18"],"exe-depends":[],"component-name":"exe:shake","bin-file":"/home/matt/.cabal/store/ghc-8.10.3/shake-0.19.4-e592095104d8d10af7c8c638222a4f572e4aa0d8571c63bad3429dfd672ef529/bin/shake"},{"type":"configured","id":"splitmix-0.1.0.3-5263e456e3deb12ee532288e6660fa3141fb27d86848a24ef3f795b36bf28604","pkg-name":"splitmix","pkg-version":"0.1.0.3","flags":{"optimised-mixer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","pkg-src-sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","depends":["base-4.14.1.0","deepseq-1.4.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"template-haskell-2.16.0.0","pkg-name":"template-haskell","pkg-version":"2.16.0.0","depends":["base-4.14.1.0","ghc-boot-th-8.10.3","ghc-prim-0.6.1","pretty-1.1.3.6"]},{"type":"pre-existing","id":"text-1.2.4.1","pkg-name":"text","pkg-version":"1.2.4.1","depends":["array-0.5.4.0","base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.12.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0","template-haskell-2.16.0.0"]},{"type":"pre-existing","id":"time-1.9.3","pkg-name":"time","pkg-version":"1.9.3","depends":["base-4.14.1.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"transformers-0.5.6.2","pkg-name":"transformers","pkg-version":"0.5.6.2","depends":["base-4.14.1.0"]},{"type":"pre-existing","id":"unix-2.7.2.2","pkg-name":"unix","pkg-version":"2.7.2.2","depends":["base-4.14.1.0","bytestring-0.10.12.0","time-1.9.3"]},{"type":"configured","id":"unordered-containers-0.2.13.0-c339ce8bcad402d54dda48190f0160368a91b33000b6363217428f19f11b311d","pkg-name":"unordered-containers","pkg-version":"0.2.13.0","flags":{"debug":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","pkg-src-sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","depends":["base-4.14.1.0","deepseq-1.4.4.0","hashable-1.3.1.0-9d9392e26ad14e913887d96978f75dc08a0b208fc5749961c981ba1e6234b17a"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"utf8-string-1.0.2-726aff700d8b8562f31c2e2566ac8ba43b365bb48cb8c60dfa098430e9a88f18","pkg-name":"utf8-string","pkg-version":"1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","pkg-src-sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","depends":["base-4.14.1.0","bytestring-0.10.12.0"],"exe-depends":[],"component-name":"lib"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-8_10_4.json b/hadrian/bootstrap/plan-8_10_4.json
new file mode 100644
index 0000000000..7babd506d7
--- /dev/null
+++ b/hadrian/bootstrap/plan-8_10_4.json
@@ -0,0 +1 @@
+{"cabal-version":"3.2.0.0","cabal-lib-version":"3.2.0.0","compiler-id":"ghc-8.10.4","os":"linux","arch":"x86_64","install-plan":[{"type":"pre-existing","id":"Cabal-3.2.1.0","pkg-name":"Cabal","pkg-version":"3.2.1.0","depends":["array-0.5.4.0","base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.12.0","containers-0.6.2.1","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","pretty-1.1.3.6","process-1.6.9.0","text-1.2.4.1","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2"]},{"type":"configured","id":"QuickCheck-2.14.2-1ff9bae85831dc0b6952a57b65e5655191418d456f323fac5ce787579a76b0b0","pkg-name":"QuickCheck","pkg-version":"2.14.2","flags":{"old-random":false,"templatehaskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","pkg-src-sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","depends":["base-4.14.1.0","containers-0.6.2.1","deepseq-1.4.4.0","random-1.2.0-821b8d1dbfd6e71abc1db66ac7846a36093b1f4ea533fe3af624349f163573ad","splitmix-0.1.0.3-50ec55b0f09ac3f0d066c466987b99709f10e5609d166e51ea3e13c78b1d5ed2","template-haskell-2.16.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"array-0.5.4.0","pkg-name":"array","pkg-version":"0.5.4.0","depends":["base-4.14.1.0"]},{"type":"pre-existing","id":"base-4.14.1.0","pkg-name":"base","pkg-version":"4.14.1.0","depends":["ghc-prim-0.6.1","integer-gmp-1.0.3.0","rts"]},{"type":"pre-existing","id":"binary-0.8.8.0","pkg-name":"binary","pkg-version":"0.8.8.0","depends":["array-0.5.4.0","base-4.14.1.0","bytestring-0.10.12.0","containers-0.6.2.1"]},{"type":"pre-existing","id":"bytestring-0.10.12.0","pkg-name":"bytestring","pkg-version":"0.10.12.0","depends":["base-4.14.1.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0"]},{"type":"configured","id":"clock-0.8.2-6b0474766238ffdedd4e520e87f3571bf523807bb3d02cc63bbe924ea35d10f6","pkg-name":"clock","pkg-version":"0.8.2","flags":{"llvm":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","pkg-src-sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"containers-0.6.2.1","pkg-name":"containers","pkg-version":"0.6.2.1","depends":["array-0.5.4.0","base-4.14.1.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"deepseq-1.4.4.0","pkg-name":"deepseq","pkg-version":"1.4.4.0","depends":["array-0.5.4.0","base-4.14.1.0"]},{"type":"pre-existing","id":"directory-1.3.6.0","pkg-name":"directory","pkg-version":"1.3.6.0","depends":["base-4.14.1.0","filepath-1.4.2.1","time-1.9.3","unix-2.7.2.2"]},{"type":"configured","id":"extra-1.7.9-47a411b8b20392deafff7b1d1e093c2c91827d2b1bc36a44706a945815afa270","pkg-name":"extra","pkg-version":"1.7.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","pkg-src-sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","depends":["base-4.14.1.0","clock-0.8.2-6b0474766238ffdedd4e520e87f3571bf523807bb3d02cc63bbe924ea35d10f6","directory-1.3.6.0","filepath-1.4.2.1","process-1.6.9.0","time-1.9.3","unix-2.7.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"filepath-1.4.2.1","pkg-name":"filepath","pkg-version":"1.4.2.1","depends":["base-4.14.1.0"]},{"type":"configured","id":"filepattern-0.1.2-69fbc6cf5d277e8ff5f9dd390a3c76533614ff0e9a59297a9261364699bbb5f1","pkg-name":"filepattern","pkg-version":"0.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","pkg-src-sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","depends":["base-4.14.1.0","directory-1.3.6.0","extra-1.7.9-47a411b8b20392deafff7b1d1e093c2c91827d2b1bc36a44706a945815afa270","filepath-1.4.2.1"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"ghc-boot-th-8.10.4","pkg-name":"ghc-boot-th","pkg-version":"8.10.4","depends":["base-4.14.1.0"]},{"type":"pre-existing","id":"ghc-prim-0.6.1","pkg-name":"ghc-prim","pkg-version":"0.6.1","depends":["rts"]},{"type":"configured","id":"hadrian-0.1.0.0-inplace-hadrian","pkg-name":"hadrian","pkg-version":"0.1.0.0","flags":{"threaded":true},"style":"local","pkg-src":{"type":"local","path":"/home/matt/ghc-hadrian-bootstrap/hadrian/."},"dist-dir":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.4/hadrian-0.1.0.0/x/hadrian","depends":["Cabal-3.2.1.0","QuickCheck-2.14.2-1ff9bae85831dc0b6952a57b65e5655191418d456f323fac5ce787579a76b0b0","base-4.14.1.0","bytestring-0.10.12.0","containers-0.6.2.1","directory-1.3.6.0","extra-1.7.9-47a411b8b20392deafff7b1d1e093c2c91827d2b1bc36a44706a945815afa270","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","shake-0.19.4-20c6545ab58e09240e1fa246d8fa870a38f1b3f44de1e37fd2fd5ff0f6f94849","transformers-0.5.6.2","unordered-containers-0.2.13.0-25a25c80a274cafa04144e390819c8940e24acb3e26f2c4ae170825b997e9e77"],"exe-depends":[],"component-name":"exe:hadrian","bin-file":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.4/hadrian-0.1.0.0/x/hadrian/build/hadrian/hadrian"},{"type":"configured","id":"hashable-1.3.1.0-d6843a1c354b03ec345a56de12b120cc2558ac419378e59c75471c08f0c9e3bb","pkg-name":"hashable","pkg-version":"1.3.1.0","flags":{"integer-gmp":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","pkg-src-sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","depends":["base-4.14.1.0","bytestring-0.10.12.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0","text-1.2.4.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"heaps-0.4-90d3dc4ea8620bd8dbd6e0136cc3ba2daca5664d7545551c36ebb2df08315abb","pkg-name":"heaps","pkg-version":"0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","pkg-src-sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"integer-gmp-1.0.3.0","pkg-name":"integer-gmp","pkg-version":"1.0.3.0","depends":["ghc-prim-0.6.1"]},{"type":"configured","id":"js-dgtable-0.5.2-31820cf9d5c13023e6017c25e0c81ec87aab55cf480ef8f5062f450bfa2fd177","pkg-name":"js-dgtable","pkg-version":"0.5.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","pkg-src-sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-flot-0.8.3-0977c020259684c26ba34ee6fd3a18fcf317a60de826c6e599f86cd58a8d7a24","pkg-name":"js-flot","pkg-version":"0.8.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","pkg-src-sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-jquery-3.3.1-651422bf85670942e80cb1dd65e886868e288fcd18a389b9f0ae2d5b97672daf","pkg-name":"js-jquery","pkg-version":"3.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","pkg-src-sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","depends":["base-4.14.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"mtl-2.2.2","pkg-name":"mtl","pkg-version":"2.2.2","depends":["base-4.14.1.0","transformers-0.5.6.2"]},{"type":"pre-existing","id":"parsec-3.1.14.0","pkg-name":"parsec","pkg-version":"3.1.14.0","depends":["base-4.14.1.0","bytestring-0.10.12.0","mtl-2.2.2","text-1.2.4.1"]},{"type":"pre-existing","id":"pretty-1.1.3.6","pkg-name":"pretty","pkg-version":"1.1.3.6","depends":["base-4.14.1.0","deepseq-1.4.4.0","ghc-prim-0.6.1"]},{"type":"configured","id":"primitive-0.7.1.0-57016f0038ed9bc68ae4ba8a0bf5334da1a65f93f4331980931e581cdbba846c","pkg-name":"primitive","pkg-version":"0.7.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f6357d5720c1c665096c3e011467daf443198b786a708d2ff926958a24d508d4","pkg-src-sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","depends":["base-4.14.1.0","deepseq-1.4.4.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"process-1.6.9.0","pkg-name":"process","pkg-version":"1.6.9.0","depends":["base-4.14.1.0","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","unix-2.7.2.2"]},{"type":"configured","id":"random-1.2.0-821b8d1dbfd6e71abc1db66ac7846a36093b1f4ea533fe3af624349f163573ad","pkg-name":"random","pkg-version":"1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"30d72df4cc1d2fe2d445c88f0ee9d21965af7ce86660c43a6c32a6a1d90d51c9","pkg-src-sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","depends":["base-4.14.1.0","bytestring-0.10.12.0","deepseq-1.4.4.0","mtl-2.2.2","splitmix-0.1.0.3-50ec55b0f09ac3f0d066c466987b99709f10e5609d166e51ea3e13c78b1d5ed2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"rts","pkg-name":"rts","pkg-version":"1.0","depends":[]},{"type":"configured","id":"shake-0.19.4-20c6545ab58e09240e1fa246d8fa870a38f1b3f44de1e37fd2fd5ff0f6f94849","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.12.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-47a411b8b20392deafff7b1d1e093c2c91827d2b1bc36a44706a945815afa270","filepath-1.4.2.1","filepattern-0.1.2-69fbc6cf5d277e8ff5f9dd390a3c76533614ff0e9a59297a9261364699bbb5f1","hashable-1.3.1.0-d6843a1c354b03ec345a56de12b120cc2558ac419378e59c75471c08f0c9e3bb","heaps-0.4-90d3dc4ea8620bd8dbd6e0136cc3ba2daca5664d7545551c36ebb2df08315abb","js-dgtable-0.5.2-31820cf9d5c13023e6017c25e0c81ec87aab55cf480ef8f5062f450bfa2fd177","js-flot-0.8.3-0977c020259684c26ba34ee6fd3a18fcf317a60de826c6e599f86cd58a8d7a24","js-jquery-3.3.1-651422bf85670942e80cb1dd65e886868e288fcd18a389b9f0ae2d5b97672daf","primitive-0.7.1.0-57016f0038ed9bc68ae4ba8a0bf5334da1a65f93f4331980931e581cdbba846c","process-1.6.9.0","random-1.2.0-821b8d1dbfd6e71abc1db66ac7846a36093b1f4ea533fe3af624349f163573ad","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-25a25c80a274cafa04144e390819c8940e24acb3e26f2c4ae170825b997e9e77","utf8-string-1.0.2-57fac2057b6823357928c7f7eaed369df519e527346522b28830a792a7e4423e"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"shake-0.19.4-ae5ec51b1b7f2b7cb1e6cd8d971dc36c890ce50e50ac0a990b9e62f777583125","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.12.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-47a411b8b20392deafff7b1d1e093c2c91827d2b1bc36a44706a945815afa270","filepath-1.4.2.1","filepattern-0.1.2-69fbc6cf5d277e8ff5f9dd390a3c76533614ff0e9a59297a9261364699bbb5f1","hashable-1.3.1.0-d6843a1c354b03ec345a56de12b120cc2558ac419378e59c75471c08f0c9e3bb","heaps-0.4-90d3dc4ea8620bd8dbd6e0136cc3ba2daca5664d7545551c36ebb2df08315abb","js-dgtable-0.5.2-31820cf9d5c13023e6017c25e0c81ec87aab55cf480ef8f5062f450bfa2fd177","js-flot-0.8.3-0977c020259684c26ba34ee6fd3a18fcf317a60de826c6e599f86cd58a8d7a24","js-jquery-3.3.1-651422bf85670942e80cb1dd65e886868e288fcd18a389b9f0ae2d5b97672daf","primitive-0.7.1.0-57016f0038ed9bc68ae4ba8a0bf5334da1a65f93f4331980931e581cdbba846c","process-1.6.9.0","random-1.2.0-821b8d1dbfd6e71abc1db66ac7846a36093b1f4ea533fe3af624349f163573ad","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-25a25c80a274cafa04144e390819c8940e24acb3e26f2c4ae170825b997e9e77","utf8-string-1.0.2-57fac2057b6823357928c7f7eaed369df519e527346522b28830a792a7e4423e"],"exe-depends":[],"component-name":"exe:shake","bin-file":"/home/matt/.cabal/store/ghc-8.10.4/shake-0.19.4-ae5ec51b1b7f2b7cb1e6cd8d971dc36c890ce50e50ac0a990b9e62f777583125/bin/shake"},{"type":"configured","id":"splitmix-0.1.0.3-50ec55b0f09ac3f0d066c466987b99709f10e5609d166e51ea3e13c78b1d5ed2","pkg-name":"splitmix","pkg-version":"0.1.0.3","flags":{"optimised-mixer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","pkg-src-sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","depends":["base-4.14.1.0","deepseq-1.4.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"template-haskell-2.16.0.0","pkg-name":"template-haskell","pkg-version":"2.16.0.0","depends":["base-4.14.1.0","ghc-boot-th-8.10.4","ghc-prim-0.6.1","pretty-1.1.3.6"]},{"type":"pre-existing","id":"text-1.2.4.1","pkg-name":"text","pkg-version":"1.2.4.1","depends":["array-0.5.4.0","base-4.14.1.0","binary-0.8.8.0","bytestring-0.10.12.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0","template-haskell-2.16.0.0"]},{"type":"pre-existing","id":"time-1.9.3","pkg-name":"time","pkg-version":"1.9.3","depends":["base-4.14.1.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"transformers-0.5.6.2","pkg-name":"transformers","pkg-version":"0.5.6.2","depends":["base-4.14.1.0"]},{"type":"pre-existing","id":"unix-2.7.2.2","pkg-name":"unix","pkg-version":"2.7.2.2","depends":["base-4.14.1.0","bytestring-0.10.12.0","time-1.9.3"]},{"type":"configured","id":"unordered-containers-0.2.13.0-25a25c80a274cafa04144e390819c8940e24acb3e26f2c4ae170825b997e9e77","pkg-name":"unordered-containers","pkg-version":"0.2.13.0","flags":{"debug":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","pkg-src-sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","depends":["base-4.14.1.0","deepseq-1.4.4.0","hashable-1.3.1.0-d6843a1c354b03ec345a56de12b120cc2558ac419378e59c75471c08f0c9e3bb"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"utf8-string-1.0.2-57fac2057b6823357928c7f7eaed369df519e527346522b28830a792a7e4423e","pkg-name":"utf8-string","pkg-version":"1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","pkg-src-sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","depends":["base-4.14.1.0","bytestring-0.10.12.0"],"exe-depends":[],"component-name":"lib"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-8_10_5.json b/hadrian/bootstrap/plan-8_10_5.json
new file mode 100644
index 0000000000..b8002cbb76
--- /dev/null
+++ b/hadrian/bootstrap/plan-8_10_5.json
@@ -0,0 +1 @@
+{"cabal-version":"3.2.0.0","cabal-lib-version":"3.2.0.0","compiler-id":"ghc-8.10.5","os":"linux","arch":"x86_64","install-plan":[{"type":"pre-existing","id":"Cabal-3.2.1.0","pkg-name":"Cabal","pkg-version":"3.2.1.0","depends":["array-0.5.4.0","base-4.14.2.0","binary-0.8.8.0","bytestring-0.10.12.0","containers-0.6.4.1","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","pretty-1.1.3.6","process-1.6.9.0","text-1.2.4.1","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2"]},{"type":"configured","id":"QuickCheck-2.14.2-3c87942fc5929dee6aa51ecc936079cd95dd7d471fde77d64ac4579578541913","pkg-name":"QuickCheck","pkg-version":"2.14.2","flags":{"old-random":false,"templatehaskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","pkg-src-sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","depends":["base-4.14.2.0","containers-0.6.4.1","deepseq-1.4.4.0","random-1.2.0-5168e89137eb4ea0630d1d72c47f7987740be427db4e07b39ed7242279cf06fc","splitmix-0.1.0.3-c3b36566ac6fe5013261bb6b4e50474d306e4a9838c78dd76bfe3359275b09f1","template-haskell-2.16.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"array-0.5.4.0","pkg-name":"array","pkg-version":"0.5.4.0","depends":["base-4.14.2.0"]},{"type":"pre-existing","id":"base-4.14.2.0","pkg-name":"base","pkg-version":"4.14.2.0","depends":["ghc-prim-0.6.1","integer-gmp-1.0.3.0","rts"]},{"type":"pre-existing","id":"binary-0.8.8.0","pkg-name":"binary","pkg-version":"0.8.8.0","depends":["array-0.5.4.0","base-4.14.2.0","bytestring-0.10.12.0","containers-0.6.4.1"]},{"type":"pre-existing","id":"bytestring-0.10.12.0","pkg-name":"bytestring","pkg-version":"0.10.12.0","depends":["base-4.14.2.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0"]},{"type":"configured","id":"clock-0.8.2-55a22a153f26cf53b6b654282e8c15f783ef2b53faacc8360d4c491d4e07409a","pkg-name":"clock","pkg-version":"0.8.2","flags":{"llvm":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","pkg-src-sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","depends":["base-4.14.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"containers-0.6.4.1","pkg-name":"containers","pkg-version":"0.6.4.1","depends":["array-0.5.4.0","base-4.14.2.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"deepseq-1.4.4.0","pkg-name":"deepseq","pkg-version":"1.4.4.0","depends":["array-0.5.4.0","base-4.14.2.0"]},{"type":"pre-existing","id":"directory-1.3.6.0","pkg-name":"directory","pkg-version":"1.3.6.0","depends":["base-4.14.2.0","filepath-1.4.2.1","time-1.9.3","unix-2.7.2.2"]},{"type":"configured","id":"extra-1.7.9-f7e2bbebfc54b6659688f9db579c8c73dd1ba8ab1142cd720c09e215f2be79f5","pkg-name":"extra","pkg-version":"1.7.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","pkg-src-sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","depends":["base-4.14.2.0","clock-0.8.2-55a22a153f26cf53b6b654282e8c15f783ef2b53faacc8360d4c491d4e07409a","directory-1.3.6.0","filepath-1.4.2.1","process-1.6.9.0","time-1.9.3","unix-2.7.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"filepath-1.4.2.1","pkg-name":"filepath","pkg-version":"1.4.2.1","depends":["base-4.14.2.0"]},{"type":"configured","id":"filepattern-0.1.2-b4cad4464f1df6bd2c46516feb4704875ca9ff08d048b2c98426a9455152d297","pkg-name":"filepattern","pkg-version":"0.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","pkg-src-sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","depends":["base-4.14.2.0","directory-1.3.6.0","extra-1.7.9-f7e2bbebfc54b6659688f9db579c8c73dd1ba8ab1142cd720c09e215f2be79f5","filepath-1.4.2.1"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"ghc-boot-th-8.10.5","pkg-name":"ghc-boot-th","pkg-version":"8.10.5","depends":["base-4.14.2.0"]},{"type":"pre-existing","id":"ghc-prim-0.6.1","pkg-name":"ghc-prim","pkg-version":"0.6.1","depends":["rts"]},{"type":"configured","id":"hadrian-0.1.0.0-inplace-hadrian","pkg-name":"hadrian","pkg-version":"0.1.0.0","flags":{"threaded":true},"style":"local","pkg-src":{"type":"local","path":"/home/matt/ghc-hadrian-bootstrap/hadrian/."},"dist-dir":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.5/hadrian-0.1.0.0/x/hadrian","depends":["Cabal-3.2.1.0","QuickCheck-2.14.2-3c87942fc5929dee6aa51ecc936079cd95dd7d471fde77d64ac4579578541913","base-4.14.2.0","bytestring-0.10.12.0","containers-0.6.4.1","directory-1.3.6.0","extra-1.7.9-f7e2bbebfc54b6659688f9db579c8c73dd1ba8ab1142cd720c09e215f2be79f5","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","shake-0.19.4-e21a01342ca240404369c44846f296e31657c42fed14a4428dc585df7f46d91c","transformers-0.5.6.2","unordered-containers-0.2.13.0-54ccd9301c36e57d00ecae5b9a167fed0f1b0ee3950e328323bc604f35f98357"],"exe-depends":[],"component-name":"exe:hadrian","bin-file":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-8.10.5/hadrian-0.1.0.0/x/hadrian/build/hadrian/hadrian"},{"type":"configured","id":"hashable-1.3.1.0-5c8079f097ccb4a07ade79412359d99109870c422180b241405e865c08d1d256","pkg-name":"hashable","pkg-version":"1.3.1.0","flags":{"integer-gmp":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","pkg-src-sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","depends":["base-4.14.2.0","bytestring-0.10.12.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0","text-1.2.4.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"heaps-0.4-bc3cd4eac5ca091f62c7945101f6ecdd6fe44a077745e2ead12dd6b9d52ab6bc","pkg-name":"heaps","pkg-version":"0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","pkg-src-sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","depends":["base-4.14.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"integer-gmp-1.0.3.0","pkg-name":"integer-gmp","pkg-version":"1.0.3.0","depends":["ghc-prim-0.6.1"]},{"type":"configured","id":"js-dgtable-0.5.2-7db9737be07ccec17708b5ca1b40401ce1090735eb90ba973558d26060497844","pkg-name":"js-dgtable","pkg-version":"0.5.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","pkg-src-sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","depends":["base-4.14.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-flot-0.8.3-8878a9bacfa61fc94b6d648168d753a135d51d736c0a2009340ea368ddbb83f4","pkg-name":"js-flot","pkg-version":"0.8.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","pkg-src-sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","depends":["base-4.14.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-jquery-3.3.1-ed9d83375b124b49d06e3787af95cad66ab1ca9d1b374e8fa3e0b8b9ca368258","pkg-name":"js-jquery","pkg-version":"3.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","pkg-src-sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","depends":["base-4.14.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"mtl-2.2.2","pkg-name":"mtl","pkg-version":"2.2.2","depends":["base-4.14.2.0","transformers-0.5.6.2"]},{"type":"pre-existing","id":"parsec-3.1.14.0","pkg-name":"parsec","pkg-version":"3.1.14.0","depends":["base-4.14.2.0","bytestring-0.10.12.0","mtl-2.2.2","text-1.2.4.1"]},{"type":"pre-existing","id":"pretty-1.1.3.6","pkg-name":"pretty","pkg-version":"1.1.3.6","depends":["base-4.14.2.0","deepseq-1.4.4.0","ghc-prim-0.6.1"]},{"type":"configured","id":"primitive-0.7.1.0-df7304295e6acb489b482bd664f64a1c3559a7f8db0b27cc58d442850043cbeb","pkg-name":"primitive","pkg-version":"0.7.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f6357d5720c1c665096c3e011467daf443198b786a708d2ff926958a24d508d4","pkg-src-sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","depends":["base-4.14.2.0","deepseq-1.4.4.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"process-1.6.9.0","pkg-name":"process","pkg-version":"1.6.9.0","depends":["base-4.14.2.0","deepseq-1.4.4.0","directory-1.3.6.0","filepath-1.4.2.1","unix-2.7.2.2"]},{"type":"configured","id":"random-1.2.0-5168e89137eb4ea0630d1d72c47f7987740be427db4e07b39ed7242279cf06fc","pkg-name":"random","pkg-version":"1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"30d72df4cc1d2fe2d445c88f0ee9d21965af7ce86660c43a6c32a6a1d90d51c9","pkg-src-sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","depends":["base-4.14.2.0","bytestring-0.10.12.0","deepseq-1.4.4.0","mtl-2.2.2","splitmix-0.1.0.3-c3b36566ac6fe5013261bb6b4e50474d306e4a9838c78dd76bfe3359275b09f1"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"rts","pkg-name":"rts","pkg-version":"1.0.1","depends":[]},{"type":"configured","id":"shake-0.19.4-92e4d38ca4821d6fa5e820c36603f31e84450b23dd3dc59b1072cc1cde8d7590","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.2.0","binary-0.8.8.0","bytestring-0.10.12.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-f7e2bbebfc54b6659688f9db579c8c73dd1ba8ab1142cd720c09e215f2be79f5","filepath-1.4.2.1","filepattern-0.1.2-b4cad4464f1df6bd2c46516feb4704875ca9ff08d048b2c98426a9455152d297","hashable-1.3.1.0-5c8079f097ccb4a07ade79412359d99109870c422180b241405e865c08d1d256","heaps-0.4-bc3cd4eac5ca091f62c7945101f6ecdd6fe44a077745e2ead12dd6b9d52ab6bc","js-dgtable-0.5.2-7db9737be07ccec17708b5ca1b40401ce1090735eb90ba973558d26060497844","js-flot-0.8.3-8878a9bacfa61fc94b6d648168d753a135d51d736c0a2009340ea368ddbb83f4","js-jquery-3.3.1-ed9d83375b124b49d06e3787af95cad66ab1ca9d1b374e8fa3e0b8b9ca368258","primitive-0.7.1.0-df7304295e6acb489b482bd664f64a1c3559a7f8db0b27cc58d442850043cbeb","process-1.6.9.0","random-1.2.0-5168e89137eb4ea0630d1d72c47f7987740be427db4e07b39ed7242279cf06fc","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-54ccd9301c36e57d00ecae5b9a167fed0f1b0ee3950e328323bc604f35f98357","utf8-string-1.0.2-b29a25454cb19836e8343db96d90d2832e49fbc0bc91247893aa677d97ddb24e"],"exe-depends":[],"component-name":"exe:shake","bin-file":"/home/matt/.cabal/store/ghc-8.10.5/shake-0.19.4-92e4d38ca4821d6fa5e820c36603f31e84450b23dd3dc59b1072cc1cde8d7590/bin/shake"},{"type":"configured","id":"shake-0.19.4-e21a01342ca240404369c44846f296e31657c42fed14a4428dc585df7f46d91c","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.14.2.0","binary-0.8.8.0","bytestring-0.10.12.0","deepseq-1.4.4.0","directory-1.3.6.0","extra-1.7.9-f7e2bbebfc54b6659688f9db579c8c73dd1ba8ab1142cd720c09e215f2be79f5","filepath-1.4.2.1","filepattern-0.1.2-b4cad4464f1df6bd2c46516feb4704875ca9ff08d048b2c98426a9455152d297","hashable-1.3.1.0-5c8079f097ccb4a07ade79412359d99109870c422180b241405e865c08d1d256","heaps-0.4-bc3cd4eac5ca091f62c7945101f6ecdd6fe44a077745e2ead12dd6b9d52ab6bc","js-dgtable-0.5.2-7db9737be07ccec17708b5ca1b40401ce1090735eb90ba973558d26060497844","js-flot-0.8.3-8878a9bacfa61fc94b6d648168d753a135d51d736c0a2009340ea368ddbb83f4","js-jquery-3.3.1-ed9d83375b124b49d06e3787af95cad66ab1ca9d1b374e8fa3e0b8b9ca368258","primitive-0.7.1.0-df7304295e6acb489b482bd664f64a1c3559a7f8db0b27cc58d442850043cbeb","process-1.6.9.0","random-1.2.0-5168e89137eb4ea0630d1d72c47f7987740be427db4e07b39ed7242279cf06fc","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-54ccd9301c36e57d00ecae5b9a167fed0f1b0ee3950e328323bc604f35f98357","utf8-string-1.0.2-b29a25454cb19836e8343db96d90d2832e49fbc0bc91247893aa677d97ddb24e"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"splitmix-0.1.0.3-c3b36566ac6fe5013261bb6b4e50474d306e4a9838c78dd76bfe3359275b09f1","pkg-name":"splitmix","pkg-version":"0.1.0.3","flags":{"optimised-mixer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","pkg-src-sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","depends":["base-4.14.2.0","deepseq-1.4.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"template-haskell-2.16.0.0","pkg-name":"template-haskell","pkg-version":"2.16.0.0","depends":["base-4.14.2.0","ghc-boot-th-8.10.5","ghc-prim-0.6.1","pretty-1.1.3.6"]},{"type":"pre-existing","id":"text-1.2.4.1","pkg-name":"text","pkg-version":"1.2.4.1","depends":["array-0.5.4.0","base-4.14.2.0","binary-0.8.8.0","bytestring-0.10.12.0","deepseq-1.4.4.0","ghc-prim-0.6.1","integer-gmp-1.0.3.0","template-haskell-2.16.0.0"]},{"type":"pre-existing","id":"time-1.9.3","pkg-name":"time","pkg-version":"1.9.3","depends":["base-4.14.2.0","deepseq-1.4.4.0"]},{"type":"pre-existing","id":"transformers-0.5.6.2","pkg-name":"transformers","pkg-version":"0.5.6.2","depends":["base-4.14.2.0"]},{"type":"pre-existing","id":"unix-2.7.2.2","pkg-name":"unix","pkg-version":"2.7.2.2","depends":["base-4.14.2.0","bytestring-0.10.12.0","time-1.9.3"]},{"type":"configured","id":"unordered-containers-0.2.13.0-54ccd9301c36e57d00ecae5b9a167fed0f1b0ee3950e328323bc604f35f98357","pkg-name":"unordered-containers","pkg-version":"0.2.13.0","flags":{"debug":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","pkg-src-sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","depends":["base-4.14.2.0","deepseq-1.4.4.0","hashable-1.3.1.0-5c8079f097ccb4a07ade79412359d99109870c422180b241405e865c08d1d256"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"utf8-string-1.0.2-b29a25454cb19836e8343db96d90d2832e49fbc0bc91247893aa677d97ddb24e","pkg-name":"utf8-string","pkg-version":"1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","pkg-src-sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","depends":["base-4.14.2.0","bytestring-0.10.12.0"],"exe-depends":[],"component-name":"lib"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-9_0_1.json b/hadrian/bootstrap/plan-9_0_1.json
new file mode 100644
index 0000000000..ef3fd63776
--- /dev/null
+++ b/hadrian/bootstrap/plan-9_0_1.json
@@ -0,0 +1 @@
+{"cabal-version":"3.2.0.0","cabal-lib-version":"3.2.0.0","compiler-id":"ghc-9.0.1","os":"linux","arch":"x86_64","install-plan":[{"type":"pre-existing","id":"Cabal-3.4.0.0","pkg-name":"Cabal","pkg-version":"3.4.0.0","depends":["array-0.5.4.0","base-4.15.0.0","binary-0.8.8.0","bytestring-0.10.12.1","containers-0.6.4.1","deepseq-1.4.5.0","directory-1.3.6.1","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","pretty-1.1.3.6","process-1.6.11.0","text-1.2.4.1","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2"]},{"type":"configured","id":"QuickCheck-2.14.2-1a5ced7bda7b07a7fbcf3b2c9a631d6d6d6f31b01674e1cf2aa430001b83e69e","pkg-name":"QuickCheck","pkg-version":"2.14.2","flags":{"old-random":false,"templatehaskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","pkg-src-sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","depends":["base-4.15.0.0","containers-0.6.4.1","deepseq-1.4.5.0","random-1.2.0-42695b2d92a156e2d79d6b1353900ab25e2ede55fe7b46738e4c426308e80acb","splitmix-0.1.0.3-cc5e2af2f495a04fe592d927ff5c9ccab99979d46d7e1a1c79f457dc2efcf613","template-haskell-2.17.0.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"array-0.5.4.0","pkg-name":"array","pkg-version":"0.5.4.0","depends":["base-4.15.0.0"]},{"type":"pre-existing","id":"base-4.15.0.0","pkg-name":"base","pkg-version":"4.15.0.0","depends":["ghc-bignum-1.0","ghc-prim-0.7.0","rts"]},{"type":"pre-existing","id":"binary-0.8.8.0","pkg-name":"binary","pkg-version":"0.8.8.0","depends":["array-0.5.4.0","base-4.15.0.0","bytestring-0.10.12.1","containers-0.6.4.1"]},{"type":"pre-existing","id":"bytestring-0.10.12.1","pkg-name":"bytestring","pkg-version":"0.10.12.1","depends":["base-4.15.0.0","deepseq-1.4.5.0","ghc-bignum-1.0","ghc-prim-0.7.0"]},{"type":"configured","id":"clock-0.8.2-94d35da6efced15094e29084a5f451e0789b94c07444085b3e66bf357595f6a7","pkg-name":"clock","pkg-version":"0.8.2","flags":{"llvm":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","pkg-src-sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","depends":["base-4.15.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"containers-0.6.4.1","pkg-name":"containers","pkg-version":"0.6.4.1","depends":["array-0.5.4.0","base-4.15.0.0","deepseq-1.4.5.0"]},{"type":"pre-existing","id":"deepseq-1.4.5.0","pkg-name":"deepseq","pkg-version":"1.4.5.0","depends":["array-0.5.4.0","base-4.15.0.0"]},{"type":"pre-existing","id":"directory-1.3.6.1","pkg-name":"directory","pkg-version":"1.3.6.1","depends":["base-4.15.0.0","filepath-1.4.2.1","time-1.9.3","unix-2.7.2.2"]},{"type":"configured","id":"extra-1.7.9-3b5071fb639982c0300593c21906006486c82cfbcfa86fb8452c5ad59c066e91","pkg-name":"extra","pkg-version":"1.7.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","pkg-src-sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","depends":["base-4.15.0.0","clock-0.8.2-94d35da6efced15094e29084a5f451e0789b94c07444085b3e66bf357595f6a7","directory-1.3.6.1","filepath-1.4.2.1","process-1.6.11.0","time-1.9.3","unix-2.7.2.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"filepath-1.4.2.1","pkg-name":"filepath","pkg-version":"1.4.2.1","depends":["base-4.15.0.0"]},{"type":"configured","id":"filepattern-0.1.2-e1a604f2fb037766dd8dedcdf4412a1060873283818f5babf6c842fcef309004","pkg-name":"filepattern","pkg-version":"0.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","pkg-src-sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","depends":["base-4.15.0.0","directory-1.3.6.1","extra-1.7.9-3b5071fb639982c0300593c21906006486c82cfbcfa86fb8452c5ad59c066e91","filepath-1.4.2.1"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"ghc-bignum-1.0","pkg-name":"ghc-bignum","pkg-version":"1.0","depends":["ghc-prim-0.7.0"]},{"type":"pre-existing","id":"ghc-boot-th-9.0.1","pkg-name":"ghc-boot-th","pkg-version":"9.0.1","depends":["base-4.15.0.0"]},{"type":"pre-existing","id":"ghc-prim-0.7.0","pkg-name":"ghc-prim","pkg-version":"0.7.0","depends":["rts"]},{"type":"configured","id":"hadrian-0.1.0.0-inplace-hadrian","pkg-name":"hadrian","pkg-version":"0.1.0.0","flags":{"threaded":true},"style":"local","pkg-src":{"type":"local","path":"/home/matt/ghc-hadrian-bootstrap/hadrian/."},"dist-dir":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-9.0.1/hadrian-0.1.0.0/x/hadrian","depends":["Cabal-3.4.0.0","QuickCheck-2.14.2-1a5ced7bda7b07a7fbcf3b2c9a631d6d6d6f31b01674e1cf2aa430001b83e69e","base-4.15.0.0","bytestring-0.10.12.1","containers-0.6.4.1","directory-1.3.6.1","extra-1.7.9-3b5071fb639982c0300593c21906006486c82cfbcfa86fb8452c5ad59c066e91","filepath-1.4.2.1","mtl-2.2.2","parsec-3.1.14.0","shake-0.19.4-14804ff74b1678b050130a6b940d7752bedd32673aae21cd5eae957bb9cfee11","transformers-0.5.6.2","unordered-containers-0.2.13.0-d5b41b4da4f1acde715ed2aaecf225ba2e02f6b2ee0b14fccdb2e575c6fb1e86"],"exe-depends":[],"component-name":"exe:hadrian","bin-file":"/home/matt/ghc-hadrian-bootstrap/hadrian/dist-newstyle/build/x86_64-linux/ghc-9.0.1/hadrian-0.1.0.0/x/hadrian/build/hadrian/hadrian"},{"type":"configured","id":"hashable-1.3.1.0-a92c75af1fea2a65b2365eb935f4a4802dac5057158f909650e1011dc3a01a23","pkg-name":"hashable","pkg-version":"1.3.1.0","flags":{"integer-gmp":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","pkg-src-sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","depends":["base-4.15.0.0","bytestring-0.10.12.1","deepseq-1.4.5.0","ghc-bignum-1.0","ghc-prim-0.7.0","text-1.2.4.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"heaps-0.4-87888aff9113a58a699c90be7814d8c23bf04f5a5c526ba9db4c06bfd4975096","pkg-name":"heaps","pkg-version":"0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","pkg-src-sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","depends":["base-4.15.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-dgtable-0.5.2-de91c94b5176a9d05a633a22beb7400ea96ff2dd1108d33bc77eff04a92ba35a","pkg-name":"js-dgtable","pkg-version":"0.5.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","pkg-src-sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","depends":["base-4.15.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-flot-0.8.3-4d1035c07927d31bcbd757690f3cb31c131d26dcb3dc160579d9e8cb05d196e8","pkg-name":"js-flot","pkg-version":"0.8.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","pkg-src-sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","depends":["base-4.15.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"js-jquery-3.3.1-3fe70afe7299ef4d6c19c49e55872aec043229cfd82d521c08678f06d388613b","pkg-name":"js-jquery","pkg-version":"3.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","pkg-src-sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","depends":["base-4.15.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"mtl-2.2.2","pkg-name":"mtl","pkg-version":"2.2.2","depends":["base-4.15.0.0","transformers-0.5.6.2"]},{"type":"pre-existing","id":"parsec-3.1.14.0","pkg-name":"parsec","pkg-version":"3.1.14.0","depends":["base-4.15.0.0","bytestring-0.10.12.1","mtl-2.2.2","text-1.2.4.1"]},{"type":"pre-existing","id":"pretty-1.1.3.6","pkg-name":"pretty","pkg-version":"1.1.3.6","depends":["base-4.15.0.0","deepseq-1.4.5.0","ghc-prim-0.7.0"]},{"type":"configured","id":"primitive-0.7.1.0-f003beddf0fc9d04aaf34af7ddb2d21771469f6e4225ce5a793266b89bfbb923","pkg-name":"primitive","pkg-version":"0.7.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"f6357d5720c1c665096c3e011467daf443198b786a708d2ff926958a24d508d4","pkg-src-sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","depends":["base-4.15.0.0","deepseq-1.4.5.0","transformers-0.5.6.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"process-1.6.11.0","pkg-name":"process","pkg-version":"1.6.11.0","depends":["base-4.15.0.0","deepseq-1.4.5.0","directory-1.3.6.1","filepath-1.4.2.1","unix-2.7.2.2"]},{"type":"configured","id":"random-1.2.0-42695b2d92a156e2d79d6b1353900ab25e2ede55fe7b46738e4c426308e80acb","pkg-name":"random","pkg-version":"1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"30d72df4cc1d2fe2d445c88f0ee9d21965af7ce86660c43a6c32a6a1d90d51c9","pkg-src-sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","depends":["base-4.15.0.0","bytestring-0.10.12.1","deepseq-1.4.5.0","mtl-2.2.2","splitmix-0.1.0.3-cc5e2af2f495a04fe592d927ff5c9ccab99979d46d7e1a1c79f457dc2efcf613"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"rts","pkg-name":"rts","pkg-version":"1.0","depends":[]},{"type":"configured","id":"shake-0.19.4-14804ff74b1678b050130a6b940d7752bedd32673aae21cd5eae957bb9cfee11","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.15.0.0","binary-0.8.8.0","bytestring-0.10.12.1","deepseq-1.4.5.0","directory-1.3.6.1","extra-1.7.9-3b5071fb639982c0300593c21906006486c82cfbcfa86fb8452c5ad59c066e91","filepath-1.4.2.1","filepattern-0.1.2-e1a604f2fb037766dd8dedcdf4412a1060873283818f5babf6c842fcef309004","hashable-1.3.1.0-a92c75af1fea2a65b2365eb935f4a4802dac5057158f909650e1011dc3a01a23","heaps-0.4-87888aff9113a58a699c90be7814d8c23bf04f5a5c526ba9db4c06bfd4975096","js-dgtable-0.5.2-de91c94b5176a9d05a633a22beb7400ea96ff2dd1108d33bc77eff04a92ba35a","js-flot-0.8.3-4d1035c07927d31bcbd757690f3cb31c131d26dcb3dc160579d9e8cb05d196e8","js-jquery-3.3.1-3fe70afe7299ef4d6c19c49e55872aec043229cfd82d521c08678f06d388613b","primitive-0.7.1.0-f003beddf0fc9d04aaf34af7ddb2d21771469f6e4225ce5a793266b89bfbb923","process-1.6.11.0","random-1.2.0-42695b2d92a156e2d79d6b1353900ab25e2ede55fe7b46738e4c426308e80acb","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-d5b41b4da4f1acde715ed2aaecf225ba2e02f6b2ee0b14fccdb2e575c6fb1e86","utf8-string-1.0.2-062c687b43b30db818356f6c18bf5308582996ce4363a46aa42090181ecf1b53"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"shake-0.19.4-63dd3995f97dd9418e130cf69737e0a0b507ae692b3f4e4f682434074d6a498c","pkg-name":"shake","pkg-version":"0.19.4","flags":{"cloud":false,"embed-files":false,"portable":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","pkg-src-sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","depends":["base-4.15.0.0","binary-0.8.8.0","bytestring-0.10.12.1","deepseq-1.4.5.0","directory-1.3.6.1","extra-1.7.9-3b5071fb639982c0300593c21906006486c82cfbcfa86fb8452c5ad59c066e91","filepath-1.4.2.1","filepattern-0.1.2-e1a604f2fb037766dd8dedcdf4412a1060873283818f5babf6c842fcef309004","hashable-1.3.1.0-a92c75af1fea2a65b2365eb935f4a4802dac5057158f909650e1011dc3a01a23","heaps-0.4-87888aff9113a58a699c90be7814d8c23bf04f5a5c526ba9db4c06bfd4975096","js-dgtable-0.5.2-de91c94b5176a9d05a633a22beb7400ea96ff2dd1108d33bc77eff04a92ba35a","js-flot-0.8.3-4d1035c07927d31bcbd757690f3cb31c131d26dcb3dc160579d9e8cb05d196e8","js-jquery-3.3.1-3fe70afe7299ef4d6c19c49e55872aec043229cfd82d521c08678f06d388613b","primitive-0.7.1.0-f003beddf0fc9d04aaf34af7ddb2d21771469f6e4225ce5a793266b89bfbb923","process-1.6.11.0","random-1.2.0-42695b2d92a156e2d79d6b1353900ab25e2ede55fe7b46738e4c426308e80acb","time-1.9.3","transformers-0.5.6.2","unix-2.7.2.2","unordered-containers-0.2.13.0-d5b41b4da4f1acde715ed2aaecf225ba2e02f6b2ee0b14fccdb2e575c6fb1e86","utf8-string-1.0.2-062c687b43b30db818356f6c18bf5308582996ce4363a46aa42090181ecf1b53"],"exe-depends":[],"component-name":"exe:shake","bin-file":"/home/matt/.cabal/store/ghc-9.0.1/shake-0.19.4-63dd3995f97dd9418e130cf69737e0a0b507ae692b3f4e4f682434074d6a498c/bin/shake"},{"type":"configured","id":"splitmix-0.1.0.3-cc5e2af2f495a04fe592d927ff5c9ccab99979d46d7e1a1c79f457dc2efcf613","pkg-name":"splitmix","pkg-version":"0.1.0.3","flags":{"optimised-mixer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","pkg-src-sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","depends":["base-4.15.0.0","deepseq-1.4.5.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"template-haskell-2.17.0.0","pkg-name":"template-haskell","pkg-version":"2.17.0.0","depends":["base-4.15.0.0","ghc-boot-th-9.0.1","ghc-prim-0.7.0","pretty-1.1.3.6"]},{"type":"pre-existing","id":"text-1.2.4.1","pkg-name":"text","pkg-version":"1.2.4.1","depends":["array-0.5.4.0","base-4.15.0.0","binary-0.8.8.0","bytestring-0.10.12.1","deepseq-1.4.5.0","ghc-bignum-1.0","ghc-prim-0.7.0","template-haskell-2.17.0.0"]},{"type":"pre-existing","id":"time-1.9.3","pkg-name":"time","pkg-version":"1.9.3","depends":["base-4.15.0.0","deepseq-1.4.5.0"]},{"type":"pre-existing","id":"transformers-0.5.6.2","pkg-name":"transformers","pkg-version":"0.5.6.2","depends":["base-4.15.0.0"]},{"type":"pre-existing","id":"unix-2.7.2.2","pkg-name":"unix","pkg-version":"2.7.2.2","depends":["base-4.15.0.0","bytestring-0.10.12.1","time-1.9.3"]},{"type":"configured","id":"unordered-containers-0.2.13.0-d5b41b4da4f1acde715ed2aaecf225ba2e02f6b2ee0b14fccdb2e575c6fb1e86","pkg-name":"unordered-containers","pkg-version":"0.2.13.0","flags":{"debug":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","pkg-src-sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","depends":["base-4.15.0.0","deepseq-1.4.5.0","hashable-1.3.1.0-a92c75af1fea2a65b2365eb935f4a4802dac5057158f909650e1011dc3a01a23"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"utf8-string-1.0.2-062c687b43b30db818356f6c18bf5308582996ce4363a46aa42090181ecf1b53","pkg-name":"utf8-string","pkg-version":"1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"http://hackage.haskell.org/"}},"pkg-cabal-sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","pkg-src-sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","depends":["base-4.15.0.0","bytestring-0.10.12.1"],"exe-depends":[],"component-name":"lib"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-bootstrap-8_10_1.json b/hadrian/bootstrap/plan-bootstrap-8_10_1.json
new file mode 100644
index 0000000000..bcc9add71a
--- /dev/null
+++ b/hadrian/bootstrap/plan-bootstrap-8_10_1.json
@@ -0,0 +1 @@
+{"dependencies":[{"source":"hackage","package":"splitmix","version":"0.1.0.3","flags":["-optimised-mixer"],"cabal_sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","src_sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","revision":0},{"source":"hackage","package":"random","version":"1.2.0","flags":[],"cabal_sha256":"195506fedaa7c31c1fa2a747e9b49b4a5d1f0b09dd8f1291f23a771656faeec3","src_sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","revision":6},{"source":"hackage","package":"QuickCheck","version":"2.14.2","flags":["-old-random","+templatehaskell"],"cabal_sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","src_sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","revision":0},{"source":"hackage","package":"clock","version":"0.8.2","flags":["-llvm"],"cabal_sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","src_sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","revision":0},{"source":"hackage","package":"extra","version":"1.7.9","flags":[],"cabal_sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","src_sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","revision":0},{"source":"hackage","package":"filepattern","version":"0.1.2","flags":[],"cabal_sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","src_sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","revision":0},{"source":"hackage","package":"hashable","version":"1.3.1.0","flags":["+integer-gmp"],"cabal_sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","src_sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","revision":0},{"source":"hackage","package":"heaps","version":"0.4","flags":[],"cabal_sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","src_sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","revision":0},{"source":"hackage","package":"js-dgtable","version":"0.5.2","flags":[],"cabal_sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","src_sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","revision":0},{"source":"hackage","package":"js-flot","version":"0.8.3","flags":[],"cabal_sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","src_sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","revision":0},{"source":"hackage","package":"js-jquery","version":"3.3.1","flags":[],"cabal_sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","src_sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","revision":0},{"source":"hackage","package":"primitive","version":"0.7.1.0","flags":[],"cabal_sha256":"29de6bfd0cf8ba023ceb806203dfbec0e51e3524e75ffe41056f70b4229c6f0f","src_sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","revision":3},{"source":"hackage","package":"unordered-containers","version":"0.2.13.0","flags":["-debug"],"cabal_sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","src_sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","revision":0},{"source":"hackage","package":"utf8-string","version":"1.0.2","flags":[],"cabal_sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","src_sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","revision":0},{"source":"hackage","package":"shake","version":"0.19.4","flags":["-cloud","-embed-files","-portable"],"cabal_sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","src_sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","revision":0},{"source":"local","package":"hadrian","version":"0.1.0.0","flags":["+threaded"],"cabal_sha256":null,"src_sha256":null,"revision":null}],"builtin":[{"package":"rts","version":"1.0"},{"package":"ghc-prim","version":"0.6.1"},{"package":"integer-gmp","version":"1.0.3.0"},{"package":"base","version":"4.14.0.0"},{"package":"array","version":"0.5.4.0"},{"package":"deepseq","version":"1.4.4.0"},{"package":"bytestring","version":"0.10.10.0"},{"package":"containers","version":"0.6.2.1"},{"package":"binary","version":"0.8.8.0"},{"package":"filepath","version":"1.4.2.1"},{"package":"time","version":"1.9.3"},{"package":"unix","version":"2.7.2.2"},{"package":"directory","version":"1.3.6.0"},{"package":"transformers","version":"0.5.6.2"},{"package":"mtl","version":"2.2.2"},{"package":"text","version":"1.2.3.2"},{"package":"parsec","version":"3.1.14.0"},{"package":"pretty","version":"1.1.3.6"},{"package":"process","version":"1.6.8.2"},{"package":"Cabal","version":"3.2.0.0"},{"package":"ghc-boot-th","version":"8.10.1"},{"package":"template-haskell","version":"2.16.0.0"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-bootstrap-8_10_2.json b/hadrian/bootstrap/plan-bootstrap-8_10_2.json
new file mode 100644
index 0000000000..4fcbffd9c5
--- /dev/null
+++ b/hadrian/bootstrap/plan-bootstrap-8_10_2.json
@@ -0,0 +1 @@
+{"dependencies":[{"source":"hackage","package":"splitmix","version":"0.1.0.3","flags":["-optimised-mixer"],"cabal_sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","src_sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","revision":0},{"source":"hackage","package":"random","version":"1.2.0","flags":[],"cabal_sha256":"195506fedaa7c31c1fa2a747e9b49b4a5d1f0b09dd8f1291f23a771656faeec3","src_sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","revision":6},{"source":"hackage","package":"QuickCheck","version":"2.14.2","flags":["-old-random","+templatehaskell"],"cabal_sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","src_sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","revision":0},{"source":"hackage","package":"clock","version":"0.8.2","flags":["-llvm"],"cabal_sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","src_sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","revision":0},{"source":"hackage","package":"extra","version":"1.7.9","flags":[],"cabal_sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","src_sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","revision":0},{"source":"hackage","package":"filepattern","version":"0.1.2","flags":[],"cabal_sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","src_sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","revision":0},{"source":"hackage","package":"hashable","version":"1.3.1.0","flags":["+integer-gmp"],"cabal_sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","src_sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","revision":0},{"source":"hackage","package":"heaps","version":"0.4","flags":[],"cabal_sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","src_sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","revision":0},{"source":"hackage","package":"js-dgtable","version":"0.5.2","flags":[],"cabal_sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","src_sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","revision":0},{"source":"hackage","package":"js-flot","version":"0.8.3","flags":[],"cabal_sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","src_sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","revision":0},{"source":"hackage","package":"js-jquery","version":"3.3.1","flags":[],"cabal_sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","src_sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","revision":0},{"source":"hackage","package":"primitive","version":"0.7.1.0","flags":[],"cabal_sha256":"29de6bfd0cf8ba023ceb806203dfbec0e51e3524e75ffe41056f70b4229c6f0f","src_sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","revision":3},{"source":"hackage","package":"unordered-containers","version":"0.2.13.0","flags":["-debug"],"cabal_sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","src_sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","revision":0},{"source":"hackage","package":"utf8-string","version":"1.0.2","flags":[],"cabal_sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","src_sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","revision":0},{"source":"hackage","package":"shake","version":"0.19.4","flags":["-cloud","-embed-files","-portable"],"cabal_sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","src_sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","revision":0},{"source":"local","package":"hadrian","version":"0.1.0.0","flags":["+threaded"],"cabal_sha256":null,"src_sha256":null,"revision":null}],"builtin":[{"package":"rts","version":"1.0"},{"package":"ghc-prim","version":"0.6.1"},{"package":"integer-gmp","version":"1.0.3.0"},{"package":"base","version":"4.14.1.0"},{"package":"array","version":"0.5.4.0"},{"package":"deepseq","version":"1.4.4.0"},{"package":"bytestring","version":"0.10.10.0"},{"package":"containers","version":"0.6.2.1"},{"package":"binary","version":"0.8.8.0"},{"package":"filepath","version":"1.4.2.1"},{"package":"time","version":"1.9.3"},{"package":"unix","version":"2.7.2.2"},{"package":"directory","version":"1.3.6.0"},{"package":"transformers","version":"0.5.6.2"},{"package":"mtl","version":"2.2.2"},{"package":"text","version":"1.2.3.2"},{"package":"parsec","version":"3.1.14.0"},{"package":"pretty","version":"1.1.3.6"},{"package":"process","version":"1.6.9.0"},{"package":"Cabal","version":"3.2.0.0"},{"package":"ghc-boot-th","version":"8.10.2"},{"package":"template-haskell","version":"2.16.0.0"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-bootstrap-8_10_3.json b/hadrian/bootstrap/plan-bootstrap-8_10_3.json
new file mode 100644
index 0000000000..0b76a18a2b
--- /dev/null
+++ b/hadrian/bootstrap/plan-bootstrap-8_10_3.json
@@ -0,0 +1 @@
+{"dependencies":[{"source":"hackage","package":"splitmix","version":"0.1.0.3","flags":["-optimised-mixer"],"cabal_sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","src_sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","revision":0},{"source":"hackage","package":"random","version":"1.2.0","flags":[],"cabal_sha256":"195506fedaa7c31c1fa2a747e9b49b4a5d1f0b09dd8f1291f23a771656faeec3","src_sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","revision":6},{"source":"hackage","package":"QuickCheck","version":"2.14.2","flags":["-old-random","+templatehaskell"],"cabal_sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","src_sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","revision":0},{"source":"hackage","package":"clock","version":"0.8.2","flags":["-llvm"],"cabal_sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","src_sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","revision":0},{"source":"hackage","package":"extra","version":"1.7.9","flags":[],"cabal_sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","src_sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","revision":0},{"source":"hackage","package":"filepattern","version":"0.1.2","flags":[],"cabal_sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","src_sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","revision":0},{"source":"hackage","package":"hashable","version":"1.3.1.0","flags":["+integer-gmp"],"cabal_sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","src_sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","revision":0},{"source":"hackage","package":"heaps","version":"0.4","flags":[],"cabal_sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","src_sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","revision":0},{"source":"hackage","package":"js-dgtable","version":"0.5.2","flags":[],"cabal_sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","src_sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","revision":0},{"source":"hackage","package":"js-flot","version":"0.8.3","flags":[],"cabal_sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","src_sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","revision":0},{"source":"hackage","package":"js-jquery","version":"3.3.1","flags":[],"cabal_sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","src_sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","revision":0},{"source":"hackage","package":"primitive","version":"0.7.1.0","flags":[],"cabal_sha256":"29de6bfd0cf8ba023ceb806203dfbec0e51e3524e75ffe41056f70b4229c6f0f","src_sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","revision":3},{"source":"hackage","package":"unordered-containers","version":"0.2.13.0","flags":["-debug"],"cabal_sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","src_sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","revision":0},{"source":"hackage","package":"utf8-string","version":"1.0.2","flags":[],"cabal_sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","src_sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","revision":0},{"source":"hackage","package":"shake","version":"0.19.4","flags":["-cloud","-embed-files","-portable"],"cabal_sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","src_sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","revision":0},{"source":"local","package":"hadrian","version":"0.1.0.0","flags":["+threaded"],"cabal_sha256":null,"src_sha256":null,"revision":null}],"builtin":[{"package":"rts","version":"1.0"},{"package":"ghc-prim","version":"0.6.1"},{"package":"integer-gmp","version":"1.0.3.0"},{"package":"base","version":"4.14.1.0"},{"package":"array","version":"0.5.4.0"},{"package":"deepseq","version":"1.4.4.0"},{"package":"bytestring","version":"0.10.12.0"},{"package":"containers","version":"0.6.2.1"},{"package":"binary","version":"0.8.8.0"},{"package":"filepath","version":"1.4.2.1"},{"package":"time","version":"1.9.3"},{"package":"unix","version":"2.7.2.2"},{"package":"directory","version":"1.3.6.0"},{"package":"transformers","version":"0.5.6.2"},{"package":"mtl","version":"2.2.2"},{"package":"ghc-boot-th","version":"8.10.3"},{"package":"pretty","version":"1.1.3.6"},{"package":"template-haskell","version":"2.16.0.0"},{"package":"text","version":"1.2.4.1"},{"package":"parsec","version":"3.1.14.0"},{"package":"process","version":"1.6.9.0"},{"package":"Cabal","version":"3.2.1.0"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-bootstrap-8_10_4.json b/hadrian/bootstrap/plan-bootstrap-8_10_4.json
new file mode 100644
index 0000000000..12977226c6
--- /dev/null
+++ b/hadrian/bootstrap/plan-bootstrap-8_10_4.json
@@ -0,0 +1 @@
+{"dependencies":[{"source":"hackage","package":"splitmix","version":"0.1.0.3","flags":["-optimised-mixer"],"cabal_sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","src_sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","revision":0},{"source":"hackage","package":"random","version":"1.2.0","flags":[],"cabal_sha256":"195506fedaa7c31c1fa2a747e9b49b4a5d1f0b09dd8f1291f23a771656faeec3","src_sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","revision":6},{"source":"hackage","package":"QuickCheck","version":"2.14.2","flags":["-old-random","+templatehaskell"],"cabal_sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","src_sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","revision":0},{"source":"hackage","package":"clock","version":"0.8.2","flags":["-llvm"],"cabal_sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","src_sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","revision":0},{"source":"hackage","package":"extra","version":"1.7.9","flags":[],"cabal_sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","src_sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","revision":0},{"source":"hackage","package":"filepattern","version":"0.1.2","flags":[],"cabal_sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","src_sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","revision":0},{"source":"hackage","package":"hashable","version":"1.3.1.0","flags":["+integer-gmp"],"cabal_sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","src_sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","revision":0},{"source":"hackage","package":"heaps","version":"0.4","flags":[],"cabal_sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","src_sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","revision":0},{"source":"hackage","package":"js-dgtable","version":"0.5.2","flags":[],"cabal_sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","src_sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","revision":0},{"source":"hackage","package":"js-flot","version":"0.8.3","flags":[],"cabal_sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","src_sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","revision":0},{"source":"hackage","package":"js-jquery","version":"3.3.1","flags":[],"cabal_sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","src_sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","revision":0},{"source":"hackage","package":"primitive","version":"0.7.1.0","flags":[],"cabal_sha256":"29de6bfd0cf8ba023ceb806203dfbec0e51e3524e75ffe41056f70b4229c6f0f","src_sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","revision":3},{"source":"hackage","package":"unordered-containers","version":"0.2.13.0","flags":["-debug"],"cabal_sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","src_sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","revision":0},{"source":"hackage","package":"utf8-string","version":"1.0.2","flags":[],"cabal_sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","src_sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","revision":0},{"source":"hackage","package":"shake","version":"0.19.4","flags":["-cloud","-embed-files","-portable"],"cabal_sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","src_sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","revision":0},{"source":"local","package":"hadrian","version":"0.1.0.0","flags":["+threaded"],"cabal_sha256":null,"src_sha256":null,"revision":null}],"builtin":[{"package":"rts","version":"1.0"},{"package":"ghc-prim","version":"0.6.1"},{"package":"integer-gmp","version":"1.0.3.0"},{"package":"base","version":"4.14.1.0"},{"package":"array","version":"0.5.4.0"},{"package":"deepseq","version":"1.4.4.0"},{"package":"bytestring","version":"0.10.12.0"},{"package":"containers","version":"0.6.2.1"},{"package":"binary","version":"0.8.8.0"},{"package":"filepath","version":"1.4.2.1"},{"package":"time","version":"1.9.3"},{"package":"unix","version":"2.7.2.2"},{"package":"directory","version":"1.3.6.0"},{"package":"transformers","version":"0.5.6.2"},{"package":"mtl","version":"2.2.2"},{"package":"ghc-boot-th","version":"8.10.4"},{"package":"pretty","version":"1.1.3.6"},{"package":"template-haskell","version":"2.16.0.0"},{"package":"text","version":"1.2.4.1"},{"package":"parsec","version":"3.1.14.0"},{"package":"process","version":"1.6.9.0"},{"package":"Cabal","version":"3.2.1.0"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-bootstrap-8_10_5.json b/hadrian/bootstrap/plan-bootstrap-8_10_5.json
new file mode 100644
index 0000000000..b978a67f84
--- /dev/null
+++ b/hadrian/bootstrap/plan-bootstrap-8_10_5.json
@@ -0,0 +1 @@
+{"dependencies":[{"source":"hackage","package":"splitmix","version":"0.1.0.3","flags":["-optimised-mixer"],"cabal_sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","src_sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","revision":0},{"source":"hackage","package":"random","version":"1.2.0","flags":[],"cabal_sha256":"195506fedaa7c31c1fa2a747e9b49b4a5d1f0b09dd8f1291f23a771656faeec3","src_sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","revision":6},{"source":"hackage","package":"QuickCheck","version":"2.14.2","flags":["-old-random","+templatehaskell"],"cabal_sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","src_sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","revision":0},{"source":"hackage","package":"clock","version":"0.8.2","flags":["-llvm"],"cabal_sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","src_sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","revision":0},{"source":"hackage","package":"extra","version":"1.7.9","flags":[],"cabal_sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","src_sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","revision":0},{"source":"hackage","package":"filepattern","version":"0.1.2","flags":[],"cabal_sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","src_sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","revision":0},{"source":"hackage","package":"hashable","version":"1.3.1.0","flags":["+integer-gmp"],"cabal_sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","src_sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","revision":0},{"source":"hackage","package":"heaps","version":"0.4","flags":[],"cabal_sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","src_sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","revision":0},{"source":"hackage","package":"js-dgtable","version":"0.5.2","flags":[],"cabal_sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","src_sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","revision":0},{"source":"hackage","package":"js-flot","version":"0.8.3","flags":[],"cabal_sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","src_sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","revision":0},{"source":"hackage","package":"js-jquery","version":"3.3.1","flags":[],"cabal_sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","src_sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","revision":0},{"source":"hackage","package":"primitive","version":"0.7.1.0","flags":[],"cabal_sha256":"29de6bfd0cf8ba023ceb806203dfbec0e51e3524e75ffe41056f70b4229c6f0f","src_sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","revision":3},{"source":"hackage","package":"unordered-containers","version":"0.2.13.0","flags":["-debug"],"cabal_sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","src_sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","revision":0},{"source":"hackage","package":"utf8-string","version":"1.0.2","flags":[],"cabal_sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","src_sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","revision":0},{"source":"hackage","package":"shake","version":"0.19.4","flags":["-cloud","-embed-files","-portable"],"cabal_sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","src_sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","revision":0},{"source":"local","package":"hadrian","version":"0.1.0.0","flags":["+threaded"],"cabal_sha256":null,"src_sha256":null,"revision":null}],"builtin":[{"package":"rts","version":"1.0.1"},{"package":"ghc-prim","version":"0.6.1"},{"package":"integer-gmp","version":"1.0.3.0"},{"package":"base","version":"4.14.2.0"},{"package":"array","version":"0.5.4.0"},{"package":"deepseq","version":"1.4.4.0"},{"package":"bytestring","version":"0.10.12.0"},{"package":"containers","version":"0.6.4.1"},{"package":"binary","version":"0.8.8.0"},{"package":"filepath","version":"1.4.2.1"},{"package":"time","version":"1.9.3"},{"package":"unix","version":"2.7.2.2"},{"package":"directory","version":"1.3.6.0"},{"package":"transformers","version":"0.5.6.2"},{"package":"mtl","version":"2.2.2"},{"package":"ghc-boot-th","version":"8.10.5"},{"package":"pretty","version":"1.1.3.6"},{"package":"template-haskell","version":"2.16.0.0"},{"package":"text","version":"1.2.4.1"},{"package":"parsec","version":"3.1.14.0"},{"package":"process","version":"1.6.9.0"},{"package":"Cabal","version":"3.2.1.0"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/plan-bootstrap-9_0_1.json b/hadrian/bootstrap/plan-bootstrap-9_0_1.json
new file mode 100644
index 0000000000..f166623da5
--- /dev/null
+++ b/hadrian/bootstrap/plan-bootstrap-9_0_1.json
@@ -0,0 +1 @@
+{"dependencies":[{"source":"hackage","package":"splitmix","version":"0.1.0.3","flags":["-optimised-mixer"],"cabal_sha256":"fc3aae74c467f4b608050bef53aec17904a618731df9407e655d8f3bf8c32d5c","src_sha256":"46009f4b000c9e6613377767b8718bf38476469f2a8e2162d98cc246882d5a35","revision":0},{"source":"hackage","package":"random","version":"1.2.0","flags":[],"cabal_sha256":"195506fedaa7c31c1fa2a747e9b49b4a5d1f0b09dd8f1291f23a771656faeec3","src_sha256":"e4519cf7c058bfd5bdbe4acc782284acc9e25e74487208619ca83cbcd63fb9de","revision":6},{"source":"hackage","package":"QuickCheck","version":"2.14.2","flags":["-old-random","+templatehaskell"],"cabal_sha256":"4ce29211223d5e6620ebceba34a3ca9ccf1c10c0cf387d48aea45599222ee5aa","src_sha256":"d87b6c85696b601175274361fa62217894401e401e150c3c5d4013ac53cd36f3","revision":0},{"source":"hackage","package":"clock","version":"0.8.2","flags":["-llvm"],"cabal_sha256":"473ffd59765cc67634bdc55b63c699a85addf3a024089073ec2a862881e83e2a","src_sha256":"0b5db110c703e68b251d5883253a934b012110b45393fc65df1b095eb9a4e461","revision":0},{"source":"hackage","package":"extra","version":"1.7.9","flags":[],"cabal_sha256":"f1dec740f0f2025790c540732bfd52c556ec55bde4f5dfd7cf18e22bd44ff3d0","src_sha256":"f66e26a63b216f0ca33665a75c08eada0a96af192ace83a18d87839d79afdf9d","revision":0},{"source":"hackage","package":"filepattern","version":"0.1.2","flags":[],"cabal_sha256":"aec816ff25418d1b03ba75189e568f490eb86efc47f586d43363fa338e422e81","src_sha256":"d92912ee0db0b8c50d6b2ffdc1ae91ee30e2704b47896aa325b42b58a2fcf65b","revision":0},{"source":"hackage","package":"hashable","version":"1.3.1.0","flags":["+integer-gmp"],"cabal_sha256":"d965e098e06cc585b201da6137dcb31c40f35eb7a937b833903969447985c076","src_sha256":"8061823a4ac521b53912edcba36b956f3159cb885b07ec119af295a6568ca7c4","revision":0},{"source":"hackage","package":"heaps","version":"0.4","flags":[],"cabal_sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","src_sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","revision":0},{"source":"hackage","package":"js-dgtable","version":"0.5.2","flags":[],"cabal_sha256":"f75cb4fa53c88c65794becdd48eb0d3b2b8abd89a3d5c19e87af91f5225c15e4","src_sha256":"e28dd65bee8083b17210134e22e01c6349dc33c3b7bd17705973cd014e9f20ac","revision":0},{"source":"hackage","package":"js-flot","version":"0.8.3","flags":[],"cabal_sha256":"4c1c447a9a2fba0adba6d30678302a30c32b9dfde9e7aa9e9156483e1545096d","src_sha256":"1ba2f2a6b8d85da76c41f526c98903cbb107f8642e506c072c1e7e3c20fe5e7a","revision":0},{"source":"hackage","package":"js-jquery","version":"3.3.1","flags":[],"cabal_sha256":"59ab6c79159549ef94b584abce8e6d3b336014c2cce1337b59a8f637e2856df5","src_sha256":"e0e0681f0da1130ede4e03a051630ea439c458cb97216cdb01771ebdbe44069b","revision":0},{"source":"hackage","package":"primitive","version":"0.7.1.0","flags":[],"cabal_sha256":"29de6bfd0cf8ba023ceb806203dfbec0e51e3524e75ffe41056f70b4229c6f0f","src_sha256":"6bebecfdf2a57787d9fd5231bfd612b65a92edd7b33a973b2a0f11312b89a3f0","revision":3},{"source":"hackage","package":"unordered-containers","version":"0.2.13.0","flags":["-debug"],"cabal_sha256":"6310c636f92ed4908fdd0de582b6be31c2851c7b5f2ec14e9f416eb94df7a078","src_sha256":"86b01369ab8eb311383a052d389337e2cd71a63088323f02932754df4aa37b55","revision":0},{"source":"hackage","package":"utf8-string","version":"1.0.2","flags":[],"cabal_sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","src_sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","revision":0},{"source":"hackage","package":"shake","version":"0.19.4","flags":["-cloud","-embed-files","-portable"],"cabal_sha256":"be81f7c69137e639812380047dfbbdd253ca536cc919504c3bc0f14517e80eb9","src_sha256":"5bae8873f628113604159f650802edb249dfbe5802c4612751f680ac987d73ee","revision":0},{"source":"local","package":"hadrian","version":"0.1.0.0","flags":["+threaded"],"cabal_sha256":null,"src_sha256":null,"revision":null}],"builtin":[{"package":"rts","version":"1.0"},{"package":"ghc-prim","version":"0.7.0"},{"package":"ghc-bignum","version":"1.0"},{"package":"base","version":"4.15.0.0"},{"package":"array","version":"0.5.4.0"},{"package":"deepseq","version":"1.4.5.0"},{"package":"bytestring","version":"0.10.12.1"},{"package":"containers","version":"0.6.4.1"},{"package":"binary","version":"0.8.8.0"},{"package":"filepath","version":"1.4.2.1"},{"package":"time","version":"1.9.3"},{"package":"unix","version":"2.7.2.2"},{"package":"directory","version":"1.3.6.1"},{"package":"transformers","version":"0.5.6.2"},{"package":"mtl","version":"2.2.2"},{"package":"ghc-boot-th","version":"9.0.1"},{"package":"pretty","version":"1.1.3.6"},{"package":"template-haskell","version":"2.17.0.0"},{"package":"text","version":"1.2.4.1"},{"package":"parsec","version":"3.1.14.0"},{"package":"process","version":"1.6.11.0"},{"package":"Cabal","version":"3.4.0.0"}]} \ No newline at end of file
diff --git a/hadrian/bootstrap/src/Main.hs b/hadrian/bootstrap/src/Main.hs
new file mode 100644
index 0000000000..c87383d7de
--- /dev/null
+++ b/hadrian/bootstrap/src/Main.hs
@@ -0,0 +1,233 @@
+module Main (main) where
+
+import Control.Monad (when)
+import Data.Either (partitionEithers)
+import Data.Foldable (for_, traverse_)
+import Data.Maybe (listToMaybe)
+import Data.String (fromString)
+import Data.Traversable (for)
+import System.Environment (getArgs)
+import System.Exit (exitFailure)
+import System.IO (hPutStrLn, stderr)
+
+import qualified Data.Text as T
+import qualified Cabal.Index as I
+import qualified Cabal.Plan as P
+import qualified Data.Aeson as A
+import qualified Data.ByteString.Lazy as LBS
+import qualified Data.Map.Strict as Map
+import qualified Data.Set as Set
+import qualified Distribution.Types.PackageName as C
+import qualified Distribution.Types.Version as C
+import qualified Topograph as TG
+
+-------------------------------------------------------------------------------
+-- Main
+-------------------------------------------------------------------------------
+
+main :: IO ()
+main = do
+ args <- getArgs
+ case args of
+ [fp] -> main1 fp
+ _ -> die "Usage: hadrian-bootstrap-gen plan.json"
+
+main1 :: FilePath -> IO ()
+main1 planPath = do
+ meta <- I.cachedHackageMetadata
+ plan <- P.decodePlanJson planPath
+ main2 meta plan
+
+main2 :: Map.Map C.PackageName I.PackageInfo -> P.PlanJson -> IO ()
+main2 meta plan = do
+ info $ show $ Map.keys $ P.pjUnits plan
+
+ -- find hadrian-install:exe:hadrian unit
+ (hadrianUid, hadrianUnit) <- case findHadrianExe plan of
+ Just x -> return x
+ Nothing -> die "Cannot find hadrian:exe unit"
+
+ info $ "hadrian:exe unit " ++ show hadrianUid
+
+ -- BFS from hadrian unit, getting all dependencies
+ units <- bfs plan hadrianUnit
+
+ info $ "Unit order:"
+ for_ units $ \unit -> do
+ info $ " - " ++ show (P.uId unit)
+
+ (builtin, deps) <- fmap partitionEithers $ for units $ \unit -> do
+ let P.PkgId pkgname@(P.PkgName tpkgname) ver@(P.Ver verdigits) = P.uPId unit
+
+ let uid = P.uId unit
+
+ let cpkgname :: C.PackageName
+ cpkgname = C.mkPackageName (T.unpack tpkgname)
+
+ let cversion :: C.Version
+ cversion = C.mkVersion verdigits
+
+ case P.uType unit of
+ P.UnitTypeBuiltin ->
+ return $ Left Builtin
+ { builtinPackageName = pkgname
+ , builtinVersion = ver
+ }
+
+ _ -> do
+ (src, rev, revhash) <- case P.uSha256 unit of
+ Just _ -> do
+ pkgInfo <- maybe (die $ "Cannot find " ++ show uid ++ " package metadata") return $
+ Map.lookup cpkgname meta
+ relInfo <- maybe (die $ "Cannot find " ++ show uid ++ " version metadata") return $
+ Map.lookup cversion $ I.piVersions pkgInfo
+
+ return
+ ( Hackage
+ , Just $ fromIntegral (I.riRevision relInfo)
+ , P.sha256FromByteString $ I.getSHA256 $ I.riCabal relInfo
+ )
+
+ Nothing -> case P.uType unit of
+ P.UnitTypeLocal -> return (Local, Nothing, Nothing)
+ t -> die $ "Unit of wrong type " ++ show uid ++ " " ++ show t
+
+ return $ Right Dep
+ { depPackageName = pkgname
+ , depVersion = ver
+ , depSource = src
+ , depSrcHash = P.uSha256 unit
+ , depRevision = rev
+ , depRevHash = revhash
+ , depFlags =
+ [ (if fval then "+" else "-") ++ T.unpack fname
+ | (P.FlagName fname, fval) <- Map.toList (P.uFlags unit)
+ ]
+ }
+
+ LBS.putStr $ A.encode Result
+ { resBuiltin = builtin
+ , resDependencies = deps
+ }
+
+bfs :: P.PlanJson -> P.Unit -> IO [P.Unit]
+bfs plan unit0 = do
+ uids <- either (\loop -> die $ "Loop in install-plan " ++ show loop) id $ TG.runG am $ \g -> do
+ v <- maybe (die "Cannot find hadrian-install unit in topograph") return $
+ TG.gToVertex g $ P.uId unit0
+
+ let t = TG.dfs g v
+
+ return $ map (TG.gFromVertex g) $
+ -- nub and sort
+ reverse $ Set.toList $ Set.fromList $ concat t
+
+ for uids $ \uid -> do
+ unit <- lookupUnit units uid
+ case Map.toList (P.uComps unit) of
+ [(_, compinfo)] -> checkExeDeps uid (P.pjUnits plan) (P.ciExeDeps compinfo)
+ _ -> die $ "Unit with multiple components " ++ show uid
+ return unit
+
+ where
+ am :: Map.Map P.UnitId (Set.Set P.UnitId)
+ am = fmap (foldMap P.ciLibDeps . P.uComps) units
+
+ units = P.pjUnits plan
+
+checkExeDeps :: P.UnitId -> Map.Map P.UnitId P.Unit -> Set.Set P.UnitId -> IO ()
+checkExeDeps pkgUid units = traverse_ check . Set.toList where
+ check uid = do
+ unit <- lookupUnit units uid
+ let P.PkgId pkgname _ = P.uPId unit
+ when (pkgname /= P.PkgName (fromString "hsc2hs")) $ do
+ die $ "unit " ++ show pkgUid ++ " depends on executable " ++ show uid
+
+lookupUnit :: Map.Map P.UnitId P.Unit -> P.UnitId -> IO P.Unit
+lookupUnit units uid
+ = maybe (die $ "Cannot find unit " ++ show uid) return
+ $ Map.lookup uid units
+
+-------------------------------------------------------------------------------
+-- Data
+-------------------------------------------------------------------------------
+
+data Result = Result
+ { resBuiltin :: [Builtin]
+ , resDependencies :: [Dep]
+ }
+ deriving (Show)
+
+data Builtin = Builtin
+ { builtinPackageName :: P.PkgName
+ , builtinVersion :: P.Ver
+ }
+ deriving (Show)
+
+data Dep = Dep
+ { depPackageName :: P.PkgName
+ , depVersion :: P.Ver
+ , depSource :: SrcType
+ , depSrcHash :: Maybe P.Sha256
+ , depRevision :: Maybe Int
+ , depRevHash :: Maybe P.Sha256
+ , depFlags :: [String]
+ }
+ deriving (Show)
+
+data SrcType
+ = Hackage
+ | Local
+ deriving (Show)
+
+instance A.ToJSON Result where
+ toJSON res = A.object
+ [ fromString "builtin" A..= resBuiltin res
+ , fromString "dependencies" A..= resDependencies res
+ ]
+
+instance A.ToJSON Builtin where
+ toJSON b = A.object
+ [ fromString "package" A..= builtinPackageName b
+ , fromString "version" A..= builtinVersion b
+ ]
+
+instance A.ToJSON Dep where
+ toJSON dep = A.object
+ [ fromString "package" A..= depPackageName dep
+ , fromString "version" A..= depVersion dep
+ , fromString "source" A..= depSource dep
+ , fromString "src_sha256" A..= depSrcHash dep
+ , fromString "revision" A..= depRevision dep
+ , fromString "cabal_sha256" A..= depRevHash dep
+ , fromString "flags" A..= depFlags dep
+ ]
+
+instance A.ToJSON SrcType where
+ toJSON Hackage = fromString "hackage"
+ toJSON Local = fromString "local"
+
+-------------------------------------------------------------------------------
+-- Utilities
+-------------------------------------------------------------------------------
+
+info :: String -> IO ()
+info msg = hPutStrLn stderr $ "INFO: " ++ msg
+
+die :: String -> IO a
+die msg = do
+ hPutStrLn stderr msg
+ exitFailure
+
+-------------------------------------------------------------------------------
+-- Pure bits
+-------------------------------------------------------------------------------
+
+findHadrianExe :: P.PlanJson -> Maybe (P.UnitId, P.Unit)
+findHadrianExe plan = listToMaybe
+ [ (uid, unit)
+ | (uid, unit) <- Map.toList (P.pjUnits plan)
+ , let P.PkgId pkgname _ = P.uPId unit
+ , pkgname == P.PkgName (fromString "hadrian")
+ , Map.keys (P.uComps unit) == [P.CompNameExe (fromString "hadrian")]
+ ]