)]}'
{
  "log": [
    {
      "commit": "ebd5a7bcfb13c1a74a5ad65de772e171d98ad156",
      "tree": "d43c01a878323bd14999ca5f6167ecf0cc5bae82",
      "parents": [
        "73c5dbae7a487db2b9ea29cd050eac94644974bb"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Wed Jul 15 20:54:27 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Wed Jul 15 20:54:27 2026 +0200"
      },
      "message": "Support range structure replacement, struct renumbering, and multi-paragraph blocks\n\nAdds bisStelle to StrukturErsetzung for coordinated target ranges, recognizes\ndeletion/renumbering of whole structural units (paragraphs and Gliederung\nentries), and handles insertion/replacement of multi-paragraph blocks split on\n§-headings. Updates FASSUNGEN.txt accordingly.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I637cc5effbe32c094e62c070b63c470149a77c85\n"
    },
    {
      "commit": "73c5dbae7a487db2b9ea29cd050eac94644974bb",
      "tree": "02eb946f6b971f0960fe7c86cc79c15aaffe12a5",
      "parents": [
        "e486b1f4efb034ed83247f4d4a84964ef9887221"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:42:38 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:42:38 2026 +0200"
      },
      "message": "Add FASSUNGEN.txt version register\n\nRecord the changes of the \"Fassung vom 13.7.2026\" in bureaucratic legal\nGerman, mirroring the amendment-act style the tool itself processes.\nConvention: add a dated section (newest first) for every day the code\nchanges.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ib39e4f78405b33b439be006325e2c310b72b1511\n"
    },
    {
      "commit": "e486b1f4efb034ed83247f4d4a84964ef9887221",
      "tree": "1fed779c320a9c1b7c750073f461bfe6fea0c971",
      "parents": [
        "9a29b384b84fac20f3c417ff9dcf3d461627e185"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:47 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:47 2026 +0200"
      },
      "message": "Model and apply structural (Teil/Abschnitt) and TOC commands\n\nIntroduce the Gliederungsbaum into the model and support the structural\ncommand families that were the bulk of the remaining unknowns:\n\n- Gliederung gains a kennzahl; Gesetz carries the ordered list of\n  Gliederungseinheiten, which the loader now collects.\n- New Stelle components Gliederungseinheit (Teil/Abschnitt/Unterabschnitt/\n  Anlage/…) and Absatzbezeichnung; StellenParser parses these plus\n  \"Überschrift von \u003cGliederung\u003e\" and drops \"Satzteil/Angabe vor Nummer N\"\n  chapeau qualifiers.\n- Gliederungs-Überschrift Neufassung/Streichung apply to the tree and\n  render as a \"Geänderte Gliederungs-Überschriften\" diff section;\n  Absatzbezeichnung-Streichung removes an Absatz number; Inhaltsübersicht\n  \"Angabe(n) zu …\" commands are recognized (applied via the existing TOC\n  path).\n\nReuses Neufassung/Aufhebung with structural Stellen rather than adding new\ncommand types. Final UnbekannterBefehl counts: GEG 50-\u003e5, IfSG 11-\u003e3,\nAGG 2-\u003e0 (§ 1 Alters-\u003eLebensalters now applies), UWG 2-\u003e0.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: I0cc91bfe65798140dd982b19f1884dfe60be87c4\n"
    },
    {
      "commit": "9a29b384b84fac20f3c417ff9dcf3d461627e185",
      "tree": "f872126e803a9b6452a18050cc4b701fd9b12da2",
      "parents": [
        "51712fc87ec0487bd471f24b2986a367847d24e9"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:43 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:43 2026 +0200"
      },
      "message": "Support range, renumbering, and punctuation commands\n\nExtend the parser and applier for several command families that were\nfalling back to UnbekannterBefehl:\n\n- Range/coordinated Aufhebung (\"Die Nummern 1 bis 3 werden aufgehoben.\",\n  \"Die Absätze 4 und 5 werden aufgehoben.\") via bis-range expansion in\n  StellenParser.parseMehrfach and ausStellen.\n- Range renumbering without \"zu den\" and for Nummern/Buchstaben (\"Die\n  bisherigen Nummern 4 bis 6 werden die Nummern 8 bis 10.\"); single\n  renumbering now also covers Nummer/Buchstabe and \"Die bisherige\".\n- §-range Neufassung (\"Die §§ 52 bis 56 werden wie folgt gefasst: …\"),\n  splitting the quoted block at \"§ N\" boundaries.\n- \"Der Wortlaut wird Absatz N.\" — a new WortlautZuAbsatz command that\n  numbers the previously unnumbered body.\n- Word-to-punctuation replacement (\"… das Wort „oder\" am Ende durch ein\n  Komma ersetzt\") and comma+words insert/replace variants.\n\nStellenParser gains plural component words (Absätze/Sätze/Nummern/\nBuchstaben) and bis-range expansion. Cuts UnbekannterBefehl further:\nGEG 36-\u003e21, IfSG 7-\u003e3.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: I4972d4eb1d6062521a55710c1f23822e8e22b0c4\n"
    },
    {
      "commit": "51712fc87ec0487bd471f24b2986a367847d24e9",
      "tree": "131061eaf3664bfbb2a49abf9a43628e31a33867",
      "parents": [
        "b05e44a627b3bbdf6f8b2e920b963709fd348f5a"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:25 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:25 2026 +0200"
      },
      "message": "Recognize compound and multi-pair amendment commands\n\nSplit BefehlErkenner into a single-command pass and a fallback that\ncomposes Sammelbefehle from commands chained with \"und\"/\", wird\":\n\n- Multi-pair replacement (\"… A durch B und C durch D ersetzt\") emits one\n  Ersetzung per pair, crossed with the (possibly coordinated) Stelle.\n- Verbund splitter probes each \"und\"/\", wird\" boundary; when both halves\n  parse — trying the right clause as-is, capitalized, or with the left\n  clause\u0027s locative prefix — it folds them into one Sammelbefehl.\n\nThe single pass no longer short-circuits when a pattern matches but its\nStelle is unparseable, so the fallback still gets a chance. Add\n\"ein Komma eingefügt\" and anchor-first insertion patterns the splitter\nneeds, and let StellenParser.parseMehrfach inherit the component type for\nbare-number continuations (\"Absatz 1 und 5\").\n\nCuts UnbekannterBefehl counts: GEG 50-\u003e36, IfSG 11-\u003e7, AGG/UWG 2-\u003e1.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: I8f76edd0c9ed6cf68c10c50f535a8182e13e378e\n"
    },
    {
      "commit": "b05e44a627b3bbdf6f8b2e920b963709fd348f5a",
      "tree": "af77a6cf2fb584de346e6a9387aa10fca9b14767",
      "parents": [
        "91a57498aa4acf266d0ab255aa06c18527846eec"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:20 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:20 2026 +0200"
      },
      "message": "Support multi-target \"jeweils\" commands and range renumbering\n\nAdd a Sammelbefehl command that applies one operation to several\n\"und\"/\"sowie\"/comma-coordinated Stellen sharing a common prefix, and\nresolve \"Die bisherigen Absätze X bis Y werden zu den Absätzen X\u0027 bis Y\u0027\"\ninto descending single renumberings. Parsing gains\nStellenParser.parseMehrfach; the applier folds sub-commands into one log\nentry.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nChange-Id: Iaa2c7161066d40d0605c00d3b6ca9a08696070e7\n"
    },
    {
      "commit": "91a57498aa4acf266d0ab255aa06c18527846eec",
      "tree": "5c53b08a64f87f924f9d59c6feafde500fbb9427",
      "parents": [
        "8ae49729ee18a102d503324f2be49c35694b244a"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:09 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:33:09 2026 +0200"
      },
      "message": "Add AGG, BayJG, GEG, ProdHaftG, and UWG sample data.\n\nFive new datasets with provenance in SOURCES files:\n\n* UWG: 3. UWGAendG (BGBl. 2026 I Nr. 43) in the new digital BGBl\n  format, plus drafts.\n* GEG: the 2023 \"Heizungsgesetz\" (BGBl. 2023 I Nr. 280, new format)\n  and the pending GModG 2026 drafts.\n* AGG: 2. AGGAendG drafts (RefE/RegE/BT-Drs 21/6178) -- the base XML\n  predates the bill, so this dataset produces real diffs -- and the\n  official BMJV synopsis as ground truth.\n* ProdHaftG: product-liability modernization drafts (Artikel 1 is a\n  replacement act, Artikel 2 amends the old law), with official\n  synopsis.\n* BayJG: Bavarian hunting-law amendment (GVBl. 2026 S. 113) -- state\n  law is not yet supported by the tool; kept for future work.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I8c33b6a19178f73cece9c9da99c713009016e578\n"
    },
    {
      "commit": "8ae49729ee18a102d503324f2be49c35694b244a",
      "tree": "1712c78dbf321a0c671425cfbbd4c9a7a5a7106b",
      "parents": [
        "99962fb4aff2a11074b7179b71ed5a5f0cdbc8e4"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:32:53 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:32:53 2026 +0200"
      },
      "message": "Support the digital BGBl format and bill drafts as inputs.\n\nThe Bundesgesetzblatt has been published digitally via recht.bund.de\nsince 2023 in a new single-column layout, and pending amendment acts\nare only available as Referenten-/Regierungsentwuerfe or Bundestag\nprinted papers.  Both now work as patch inputs:\n\n* PDF extraction filters out small print by font size (two-pass\n  PDFTextStripper): in the new BGBl format, footnote blocks and\n  superscript footnote markers would otherwise land in the middle of\n  the statutory text, even inside quoted passages.\n* TextBereiniger recognizes the new page headers (BGBl \"Seite N von\n  M\", draft page markers \" - N - \", Bundestag printed-paper headers)\n  and joins markerless end-of-line hyphenation (BT-Drs PDFs break\n  words without a hyphen character; regular wraps carry a trailing\n  space, so its absence is the signal -- gated on the source using\n  the trailing-space convention at all, protecting hand-written\n  plain-text inputs).  BMJV draft templates draw the hanging opening\n  quote after the paragraph marker (\"(1) „\" / \"§ 19„\"); this\n  inversion is repaired.\n* Drafts embed the statutory text between a cover sheet and a\n  Begruendung section; article scanning now stops at the Begruendung\n  heading.  Articles without numbered items (single-command articles\n  like ProdHaftG-RegE Artikel 2) are parsed from the preamble rest.\n* Target-law matching is declension-tolerant (\"Das Allgemeine\n  Gleichbehandlungsgesetz\" matches \"Allgemeines\n  Gleichbehandlungsgesetz\") via rough word-stem comparison.\n* New command form StrukturErsetzung (\"§ 2 Absatz 2 wird durch die\n  folgenden Absätze 2 und 3 ersetzt\"); \"durch die folgende\n  Überschrift/den folgenden § N ersetzt\" map to Neufassung; plural\n  insertions (\"die folgenden Absätze 6 und 7\"), triple-letter outline\n  markers (aaa), the compound punctuation replacement (\"durch ein\n  Komma und die Wörter ... ersetzt\"), and Inhaltsuebersicht-Angaben\n  inside a context frame are recognized.\n\nEnd-to-end smoke tests cover the four new datasets: UWG (new BGBl\nformat, footnote-filter assertion), GEG 2023 (\"Heizungsgesetz\",\n121 commands), AGG (BT-Drs draft against an unconsolidated base --\nthe first dataset with real diffs, spot-checked against the official\nBMJV synopsis), and ProdHaftG (draft whose Artikel 1 is a replacement\nlaw and only Artikel 2 amends the base).\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: Id1b12bc0bee4178bd1a5c55b3a83f6e13944af69\n"
    },
    {
      "commit": "99962fb4aff2a11074b7179b71ed5a5f0cdbc8e4",
      "tree": "58caa90e2a27e50e9e6b6ce13488278860903b03",
      "parents": [
        "58e19982f25ae6433d7837454bb54b8edc37589c"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:32:24 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 21:32:24 2026 +0200"
      },
      "message": "Add IfSG sample data.\n\nThe Infektionsschutzgesetz as gii-norm XML, EPUB, and PDF (consolidated\nas of 2020-11-20, i.e. already including the Art. 1 changes below), the\nDrittes Bevoelkerungsschutzgesetz (BGBl. I 2020 S. 2397) as published,\nand the Bundestag/Bundesrat drafting documents, with provenance URLs in\nSOURCES.  Used by the end-to-end smoke test.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I1221734ea3e3dab705151421774151438be1b337\n"
    },
    {
      "commit": "58e19982f25ae6433d7837454bb54b8edc37589c",
      "tree": "ba5f4f8712150e0a9aae195e59290393831845a4",
      "parents": [
        "d1e2facd01c88dbd4758fbc2a64bf9e01abca4e7"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 07:09:19 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 07:09:19 2026 +0200"
      },
      "message": "Add tests, usage documentation, and .claude/ to .gitignore.\n\nUnit tests for the gii-norm loader, text cleanup, quote extraction,\ncommand recognition (literal sentences from the sample amendment act),\nsentence splitting, and command application on a synthetic mini law;\nan HTML renderer test including escaping; and an end-to-end smoke test\non the IfSG sample data that skips itself when the (untracked) sample\nfiles are absent.  The README gains a German usage section.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I7f02ff349f9c3bd34fa90a2a84678b9e6fad697d\n"
    },
    {
      "commit": "d1e2facd01c88dbd4758fbc2a64bf9e01abca4e7",
      "tree": "05984a493b1a583543068be368aeb191ccd01d79",
      "parents": [
        "1b9bfb1bfed11593e08cde8bb072dbfb5980b740"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 07:09:04 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 07:09:04 2026 +0200"
      },
      "message": "Implement the synopsis pipeline for amendment acts.\n\nAdd the full vertical slice from input files to a two-column HTML\nsynopsis:\n\n* gesetz, gesetz.gii: immutable law model (Gesetz/Norm/Absatz) and an\n  offline loader for the gii-norm XML format of gesetze-im-internet.de,\n  flattening DL enumerations, tables, and pre blocks.\n* aenderung: amendment command model as a sealed interface with records\n  (Ersetzung, Neufassung, Einfuegung, Anfuegung, Aufhebung, Streichung,\n  Umnummerierung), including UnbekannterBefehl as the mandatory\n  fallback -- unrecognized commands are reported, never dropped.\n* aenderung.parse: text extraction (PDFBox in content-stream order for\n  two-column BGBl PDFs, plain text as escape hatch), BGBl header and\n  hyphenation cleanup, quote extraction with placeholder substitution\n  (quoted blocks cannot confuse the command regexes; unbalanced quotes\n  -- which occur in real BGBl documents -- become warnings), outline\n  scanning with successor-validated markers (1., a), aa), aa1)), and\n  the command recognizer with context-frame stacking.\n* anwendung: sequential command application with a per-command protocol\n  (ANGEWANDT / MANUELL_PRUEFEN plus reason), scope resolution down to\n  sentence/enumeration ranges via a German sentence splitter.\n* synopse: norm pairing, word-level diff via java-diff-utils, and a\n  self-contained HTML renderer with a Manuell-pruefen section.\n\nThe CLI gains -o/--output, --vollstaendig, --artikel, --extract-only,\nand hidden debug flags (--dump-gesetz, --dump-befehle).\n\nOn the IfSG sample (Drittes Bevoelkerungsschutzgesetz, BGBl. I 2020\nS. 2397), 63 of 75 commands in Artikel 1 and 2 parse into typed\ncommands; the remainder are ranges and compound commands that are\ndeliberately out of scope for v1.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I93ef8ba300f1cac70916722f23c0cefc5f62da2b\n"
    },
    {
      "commit": "1b9bfb1bfed11593e08cde8bb072dbfb5980b740",
      "tree": "984c268931d2d5567551a4cb1a50f9c735a2a3f1",
      "parents": [
        "545aeb6e25386121b414e6aa0cae0a96758cf3c8"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 07:08:31 2026 +0200"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Jul 13 07:08:31 2026 +0200"
      },
      "message": "Modernize build: Java 21, Tika 3, PDFBox 3, JUnit 5.\n\nBump all dependencies and plugins to current versions.  Replace the\ntika-parsers bundle with a direct PDFBox dependency (we need\nPDFTextStripper control), add java-diff-utils for the synopsis diff,\nand add JUnit 5 with AssertJ for testing.  Drop unused dependencies\n(tess4j, Lanterna, term4j, sqlite-jdbc, imageio codecs, annotation\nlibraries) in favour of jspecify.  Regenerate the Maven wrapper with\nthe official plugin (Takari is dead) and remove the vestigial Ant\nwrapper and Tika configuration.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nChange-Id: I0e1813b3967027cbb0bb978591d345ce138fa0a0\n"
    },
    {
      "commit": "545aeb6e25386121b414e6aa0cae0a96758cf3c8",
      "tree": "6cb998430e9c461c283ff7d692d0b14aad2a541d",
      "parents": [
        "1d92ac8fbb6c5c3a3be7bf477fef9251dcd3dfe2"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Dec 06 15:16:22 2020 +0100"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Dec 06 19:24:02 2020 +0100"
      },
      "message": "Configure Tika correctly.\n\nWith the new configuration, Tika can now extract text from PDFs and\nXML documents.\n\nAlso configures logging for the application.\n\nChange-Id: I7a89c2b232ed4e220665dd335a5f5a0cc3ef2994\n"
    },
    {
      "commit": "1d92ac8fbb6c5c3a3be7bf477fef9251dcd3dfe2",
      "tree": "95739626bbdc8727618e751cadeb30d0a18b8ec4",
      "parents": [
        "c7f1136da4b0acf11e784397e4c46278706dc84f"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Nov 23 06:31:43 2020 +0100"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Nov 23 06:36:04 2020 +0100"
      },
      "message": "Add Apache Tika, remove iText7.\n\nChange-Id: I9736779cf57050a1dfd43d18625eb464a7179a9f\n"
    },
    {
      "commit": "c7f1136da4b0acf11e784397e4c46278706dc84f",
      "tree": "5957fae9c9da5d1a558845720c4c8ebae69f6bf9",
      "parents": [
        "d9f32a8a04152f9028a436be1deabe8f908b5ca4"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Nov 22 15:01:07 2020 +0100"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Mon Nov 23 06:36:04 2020 +0100"
      },
      "message": "Modularize, avoid shade plugin by default.\n\nChange-Id: I704d78b7553f057f73e1387078623d8fe5d0b154\n"
    },
    {
      "commit": "d9f32a8a04152f9028a436be1deabe8f908b5ca4",
      "tree": "e4bccf342381e0f01f5f77a9af408faa08bbebfa",
      "parents": [
        "31a2c505ff035c1cdcefdef17d900acb76919695"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Nov 22 14:36:59 2020 +0100"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Nov 22 14:42:35 2020 +0100"
      },
      "message": "Define CLI arguments.\n\nChange-Id: I37d6cbb000df63013277fe4628cdb6570d68101a\n"
    },
    {
      "commit": "31a2c505ff035c1cdcefdef17d900acb76919695",
      "tree": "d45531e1492dd64dbc9fdc49e5da5a05e0c25533",
      "parents": [
        "b291c363badec283553d8e013c5fa912a930e764"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Nov 22 14:36:27 2020 +0100"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Nov 22 14:36:27 2020 +0100"
      },
      "message": "Add dependencies for PDF processing and terminal manipulation.\n\nChange-Id: Ie6bb3a9e77390b31bddfac657296c99a95c6af8d\n"
    },
    {
      "commit": "b291c363badec283553d8e013c5fa912a930e764",
      "tree": "bfc5a298b720c72901a650e28929c61ae4e7e1d7",
      "parents": [
        "4562aed1971ca9cd401cd649d23333a84a20658e"
      ],
      "author": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Nov 22 10:22:27 2020 +0100"
      },
      "committer": {
        "name": "Matthias Andreas Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Nov 22 14:36:08 2020 +0100"
      },
      "message": "Project skeleton\n\nChange-Id: I5609adfca13ffad643a3db93e848fc01636b066a\n"
    },
    {
      "commit": "4562aed1971ca9cd401cd649d23333a84a20658e",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [],
      "author": {
        "name": "Matthias Benkard",
        "email": "code@mail.matthias.benkard.de",
        "time": "Sun Nov 22 09:21:11 2020 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "gerrit@benkard.de",
        "time": "Sun Nov 22 09:21:11 2020 +0000"
      },
      "message": "Initial empty repository\n"
    }
  ]
}
