[
  {
    "path": ".gitignore",
    "content": "/target\n/output\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"message-book\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nanyhow = \"1.0.79\"\nchrono = \"0.4.32\"\nclap = { version = \"4.4.18\", features = [\"derive\", \"string\"] }\nimessage-database = \"1.8.0\"\nregex = \"1.10.3\"\nrusqlite = { version = \"0.30.0\", features = [\"array\"] }\n"
  },
  {
    "path": "README.md",
    "content": "# message-book\n\nThis is a tool to make a book out of a given iMessage conversation. To use it, you need either\nan iPhone backup or a Mac that holds all the messages you want included. To use the tool, clone the repo and run: \n\n```\ncargo run -- --help\n```\n\nThe code is in pretty rough shape, but it should do the job. Let me know if you run into any issues.\n\nAn example of the output can be seen in the [example-output](example-output) directory.\n\n\n![an example page, showing an automated reservation confirmation message on a blank page](example-output/reservation-page.png)\n\n![an example table of contents for a book containing a whole year of text messages. Each month is listed with its page.](example-output/long-toc.png)"
  },
  {
    "path": "example-output/Makefile",
    "content": "main.pdf: main.tex $(wildcard ch-*.tex)\n\tlatexmk -xelatex main.tex"
  },
  {
    "path": "example-output/ch-2023-10.tex",
    "content": "\\chapter{October 2023}\n\n\\markright{October  6, 2023}\n\\rightmsg{Shizen: You have a reservation at 5:30 pm 10/07. Reply 1 to confirm; reply 4 to cancel. Reply STOP to end msgs}\n\n\\markright{October  6, 2023}\n\\leftmsg{1}\n\n\\markright{October  6, 2023}\n\\rightmsg{Shizen: Your reservation has been confirmed.}\n\n"
  },
  {
    "path": "example-output/main.tex",
    "content": "%!TEX TS-program = xelatex\n%!TEX encoding = UTF-8 Unicode\n% ^ we require xelatex for emoji support\n\n\\documentclass[9pt,postvopaper]{memoir}\n\\setlrmarginsandblock{0.75in}{0.5in}{*}\n\\setulmarginsandblock{0.75in}{0.75in}{*}\n\\checkandfixthelayout\n\\usepackage{palatino}\n\\usepackage[T1]{fontenc}\n\\usepackage{fontspec}\n\\usepackage{microtype}\n\n% % set up font to support emojis - requires xetex\n\\usepackage[T1]{fontenc}\n\\usepackage[Latin,Greek,Emoticons]{ucharclasses}\n\\usepackage{fontspec}\n \n\\newfontfamily\\emojifont{Noto Emoji}\n% \\setDefaultTransitions{\\mydef}{}\n% \\newfontfamily\\mynormal{Noto Sans}\n% \\setTransitionsForLatin{\\mynormal}{}\n\n\\aliaspagestyle{title}{empty}\n\n\n\n\n\\author{}\n\\title{iMessage Book}\n\\date{}\n\n\\newcommand{\\rightmsg}[1]{\n\\noindent\\hfill%\n\\begin{minipage}{0.8\\textwidth}\n  \\begin{flushright}\n    #1\n  \\end{flushright}\n\\end{minipage}\n\\vspace{1mm}\n}\n\n\\newcommand{\\leftmsg}[1]{\n\\noindent\\begin{minipage}{0.8\\textwidth}\n  #1\n\\end{minipage}\n\\vspace{1mm}\n}\n\n\n%%% BEGIN DOCUMENT\n\n\\begin{document}\n\n\\frontmatter\n\n\\begin{titlingpage}\n\\maketitle\n\\clearpage\n\\begin{flushleft}\n\\null\\vfill\n\\textit{THE NAOMBEN CHRONICLES: VOLUME I}\n\\bigskip\n\n\n\n\n\nALL RIGHTS RESERVED\n\\end{flushleft}\n\\end{titlingpage}\n\n\\movetooddpage\n\\begin{vplace}\n\\begin{center}\n  \\textit{Dedicated to you.}\n\\end{center}\n\\end{vplace}\n\n\\movetooddpage\n\\tableofcontents \n\n\\cleartorecto\n\\mainmatter\n\n\\openany\n\\chapterstyle{dash}\n\\addtolength\\afterchapskip{2cm}\n\n% template must be finished with \\includes and \\end{document}\n\\include{ch-2023-10}\n\\end{document}"
  },
  {
    "path": "src/main.rs",
    "content": "use std::{path::{PathBuf, Path}, fs::{File, create_dir_all, copy}, io::{Read, Write}, rc::Rc};\n\nuse clap::Parser;\nuse imessage_database::{tables::{table::{get_connection, Table, DEFAULT_PATH_IOS, MESSAGE_ATTACHMENT_JOIN, MESSAGE, RECENTLY_DELETED, CHAT_MESSAGE_JOIN, DEFAULT_PATH_MACOS}, messages::Message, chat::Chat}, error::table::TableError, util::dates::get_offset};\nuse anyhow::Result;\nuse render::render_message;\nuse rusqlite::types::Value;\n\nmod render;\n\nconst TEMPLATE_DIR: &str = \"templates\";\n\n// default ios sms.db path is <backup-path>/3d/3d0d7e5fb2ce288813306e4d4636395e047a3d2\n\n#[derive(Parser)]\n#[command(author, version, about, long_about = None)]\nstruct Args {\n    /// Phone number of the conversation to export, of the form '+15555555555'\n    recipient: String,\n    /// Where to find the iMessage database. If not provided, assumes it is in the default Mac location\n    #[clap(flatten)]\n    database_location: BackupPath,\n    /// The directory to create the .tex files in\n    #[arg(short, long, default_value = \"output\")]\n    output_dir: PathBuf,\n}\n\nimpl Args {\n    fn get_db_location(&self) -> PathBuf {\n        match &self.database_location {\n            BackupPath { ios_backup_dir: Some(ios_dir), chat_database: None } => {\n                let mut path = ios_dir.clone();\n                path.push(DEFAULT_PATH_IOS);\n                path\n            },\n            BackupPath { ios_backup_dir: None, chat_database: Some(db_path) } => db_path.to_owned(),\n            BackupPath { ios_backup_dir: None, chat_database: None } => DEFAULT_PATH_MACOS.into(),\n            _ => panic!(\"too many arguments for database location\")\n        }\n    }\n}\n\n#[derive(Debug, clap::Args)]\n#[group(required = false, multiple = false)]\nstruct BackupPath {\n    /// Path to the root of an iOS backup folder\n    #[arg(short, long)]\n    ios_backup_dir: Option<PathBuf>,\n    /// Path to the chat database directly. If neither `ios_backup_dir` or `chat_database` is provided, the location will be assumed to be the default MacOS location.\n    #[arg(short, long)]\n    chat_database: Option<PathBuf>,\n}\n\n\nfn iter_messages(db_path: &PathBuf, chat_identifier: &str, output_dir: &PathBuf) -> Result<(), TableError> {\n    let db = get_connection(db_path).unwrap();\n\n    let mut chat_stmt = Chat::get(&db)?;\n    let chats: Vec<Chat> = chat_stmt\n        .query_map([], |row| Chat::from_row(row))\n        .unwrap()\n        .filter_map(|c| c.ok())\n        .filter(|c| c.chat_identifier == chat_identifier)\n        .collect(); // we collect these into a vec since there should only be a couple, we don't need to stream them\n    \n    let chat_ids: Vec<i32> = chats.iter().map(|c| c.rowid).collect();\n\n    // let mut msg_stmt = Message::get(&db)?;\n    // using rarray as in the example at https://docs.rs/rusqlite/0.29.0/rusqlite/vtab/array/index.html to check if chat is ok\n    // SQL almost entirely taken from imessage-database Message::get, with added filtering\n    rusqlite::vtab::array::load_module(&db).expect(\"failed to load module\");\n    let mut msg_stmt = db.prepare(&format!(\n        \"SELECT\n                 *,\n                 c.chat_id,\n                 (SELECT COUNT(*) FROM {MESSAGE_ATTACHMENT_JOIN} a WHERE m.ROWID = a.message_id) as num_attachments,\n                 (SELECT b.chat_id FROM {RECENTLY_DELETED} b WHERE m.ROWID = b.message_id) as deleted_from,\n                 (SELECT COUNT(*) FROM {MESSAGE} m2 WHERE m2.thread_originator_guid = m.guid) as num_replies\n             FROM\n                 message as m\n                 LEFT JOIN {CHAT_MESSAGE_JOIN} as c ON m.ROWID = c.message_id\n             WHERE\n                 c.chat_id IN rarray(?1)\n             ORDER BY\n                 m.date\n             LIMIT\n                 100000;\n            \"\n        )).expect(\"unable to build messages query\");\n\n    // unfortunately I don't think there is an easy way to add a WHERE clause\n    // to the statement generated by Message::get.\n    // So instead I generated my own SQL statement, based on Message::get\n    // and I need to pass in the valid chat ids\n    let chat_id_values = Rc::new(chat_ids.iter().copied().map(Value::from).collect::<Vec<Value>>());\n    let msgs = msg_stmt\n        .query_map([chat_id_values], |row| Message::from_row(row))\n        .unwrap()\n        .filter_map(|m| m.ok());\n        // .filter(|m| m.chat_id.is_some_and(|id| chat_ids.contains(&id))); // not needed with new sql filtering\n\n    chats.iter().for_each(|c| println!(\"Found chat {:?}\", c));\n\n    // need to create output dir first, so we can create files inside it\n    create_dir_all(output_dir).expect(\"Could not create output directory\");\n\n    let filtered_msgs = msgs\n        .filter(|m| !m.is_reaction() && !m.is_announcement() && !m.is_shareplay());\n\n    let mut chapters: Vec<String> = vec![]; // the names of the chapters created, like 2020-11\n    let mut current_output_info: Option<(String, File)> = None; // chapter_name, File\n    for mut msg in filtered_msgs {\n\n        // this is a mess. Basically we are updating current_output_file to be correct for the current message.\n        // Since the messages are in chronological order, marching through messages and updating this, creating\n        // files as necessary, should work\n        let msg_date = msg.date(&get_offset()).expect(\"could not find date for message\");\n        let chapter_name = msg_date\n            .format(\"ch-%Y-%m\")\n            .to_string();\n        let out_fname = format!(\"{}.tex\", &chapter_name);\n        let create = match &current_output_info {\n            None => {true},\n            Some((ref name, _)) => {name != &chapter_name},\n        };\n        if create {\n            println!(\"Starting chapter {}\", &chapter_name);\n            let out_path = Path::join(output_dir, &out_fname);\n            let mut f = File::create(&out_path)\n                // .expect(\"failed to create output file\")\n                .unwrap_or_else(|e| panic!(\"Failed to create output file: {} - {:?}\", &out_path.to_string_lossy(), e));\n            f.write(format!(\"\\\\chapter{{{}}}\\n\\n\", msg_date.format(\"%B %Y\").to_string()).as_bytes()).expect(\"Could not write to chapter file\");\n            current_output_info = Some((chapter_name.clone(), f));\n            chapters.push(chapter_name);\n        }\n\n        match msg.gen_text(&db) {\n            Ok(_) => {\n                // Successfully generated message, proceed with rendering and writing to output file\n                let rendered = render_message(&msg);\n                let mut output_file = &current_output_info.as_ref().expect(\"Current output info was none while processing message\").1;\n                output_file.write(rendered.as_bytes()).expect(\"Unable to write message to output file\");\n            }\n            Err(err) => {\n                // Handle the error gracefully, you can log it or ignore it depending on your requirements\n                eprintln!(\"Failed to generate message: {:?}\", err);\n            }\n        }\n    }\n\n    // Once we create all the chapter files, we need to create the main.tex file to include them \n    let mut main_template_file = File::open([TEMPLATE_DIR, \"main.tex.template\"].iter().collect::<PathBuf>()).expect(\"Could not open template file\");\n    let mut main_template = String::new();\n    main_template_file.read_to_string(&mut main_template).expect(\"could not read template main.tex\");\n    let mut main_tex_file = File::create(Path::join(output_dir, \"main.tex\")).expect(\"could not create main.tex in output dir\");\n    main_tex_file.write_all(main_template.as_bytes()).expect(\"Could not write main.tex\");\n\n    // now add the chapters to the main file\n    chapters.iter()\n        .for_each(|chapter_name| {\n            main_tex_file.write(\n                format!(\"\\\\include{{{}}}\\n\", chapter_name).as_bytes()\n            )\n            .expect(\"failed to write main file\");\n        });\n\n    // and finish it with \\end{document}\n    // TODO: we should really do this with a templating engine\n    main_tex_file.write(r\"\\end{document}\".as_bytes()).expect(\"unable to finish main.tex\");\n\n    // finally, copy over the makefile\n    copy([TEMPLATE_DIR, \"Makefile\"].iter().collect::<PathBuf>(), Path::join(output_dir, \"Makefile\")).expect(\"Could not copy makefile\");\n\n    Ok(())\n}\n\nfn main() {\n    let args = Args::parse();\n    let db_path = args.get_db_location();\n    iter_messages(&db_path, &args.recipient, &args.output_dir).expect(\"failed :(\");\n\n\n\n    println!(\"Hello!\")\n}\n"
  },
  {
    "path": "src/render.rs",
    "content": "use chrono::{DateTime, Local};\nuse imessage_database::{tables::messages::{Message, BubbleType}, util::dates::get_offset};\nuse regex::Regex;\n\n/// Make necessary replacements so that the text is ready for insertion\n/// into latex\nfn latex_escape(text: String) -> String {\n    // TODO: gotta be a more efficient way to do this\n    let escaped = text \n        // first, a bunch of weird characters replaced with ascii\n        .replace(\"’\", \"'\")\n        .replace(\"“\", \"\\\"\")\n        .replace(\"”\", \"\\\"\")\n        .replace(\"…\", \"...\")\n        // now, actual latex escapes\n        .replace(r\"\\\", r\"\\textbackslash\\ \")\n        .replace(\"$\", r\"\\$\")\n        .replace(\"%\", r\"\\%\")\n        .replace(\"&\", r\"\\&\")\n        .replace(\"_\", r\"\\_\")\n        .replace(\"^\", r\"\\textasciicircum\\ \")\n        .replace(\"~\", r\"\\textasciitilde\\ \")\n        .replace(\"#\", r\"\\#\")\n        .replace(r\"{\", r\"\\{\")\n        .replace(r\"}\", r\"\\}\")\n        .replace(\"\\n\", \"\\\\newline\\n\") // since a single newline in latex doesn't make a line break, need to add explicit newlines\n        // this last one is the \"variation selector\" which I think determines whether an emoji\n        // should be displayed big or inline. The latex font doesn't support it, so we just strip it out.\n        // More info here: https://stackoverflow.com/questions/38100329/what-does-u-ufe0f-in-an-emoji-mean-is-it-the-same-if-i-delete-it\n        .replace(\"\\u{FE0F}\", \"\");\n\n    // Now, we wrap emojis in {\\emojifont XX}. The latex template has a different font for emojis, and\n    // this allows emojis to use that font\n    // TODO: Somehow move this regex out so we only compile it once\n    let emoji_regex = Regex::new(r\"(\\p{Extended_Pictographic}+)\").expect(\"Couldn't compile demoji regex\");\n    let demojid = emoji_regex.replace_all(&escaped, \"{\\\\emojifont $1}\").into_owned();\n\n    demojid\n\n}\n\nstruct LatexMessage {\n    is_from_me: bool,\n    body_text: Option<String>,\n    attachment_count: i32,\n    date: DateTime<Local>,\n}\n\nimpl LatexMessage {\n    fn render(self) -> String {\n        let mut content = match self.body_text {\n            Some(ref text) => latex_escape(text.to_string()), // probably not ideal to be cloning here\n            None => \"\".to_string(),\n        };\n\n        // add attachment labels\n        if self.attachment_count > 0 {\n            if content.len() > 0 {\n                // add some padding if there was text in the message with the attachment\n                content.push_str(\"\\\\enskip\")\n            }\n            content.push_str(format!(\"\\\\fbox{{{} Attachment{}}}\", self.attachment_count, if self.attachment_count == 1 {\"\"} else {\"s\"}).as_ref());\n        }\n\n        let date_str = self.date.format(\"%B %e, %Y\").to_string();\n\n        let mut rendered = format!(\"\\\\markright{{{}}}\\n\", date_str);\n\n        rendered.push_str(&match self.is_from_me {\n            // god generating latex code is so annoying with the escapes\n            true => format!(\"\\\\leftmsg{{{}}}\\n\\n\", content),\n            false => format!(\"\\\\rightmsg{{{}}}\\n\\n\", content),\n        });\n\n        rendered\n    }\n}\n\npub fn render_message(msg: &Message) -> String {\n    let parts = msg.body();\n\n\n    let mut latex_msg = LatexMessage { \n        is_from_me: msg.is_from_me, \n        body_text: None, \n        attachment_count: 0,\n        date: msg.date(&get_offset()).expect(\"could not find date for message\")\n    };\n\n    for part in parts {\n        match part {\n            BubbleType::Text(text) => { latex_msg.body_text = Some(text.to_owned())},\n            BubbleType::Attachment => { latex_msg.attachment_count += 1 }\n            _ => ()\n        }\n    }\n\n    latex_msg.render()\n}"
  },
  {
    "path": "templates/Makefile",
    "content": "main.pdf: main.tex $(wildcard ch-*.tex)\n\tlatexmk -xelatex main.tex"
  },
  {
    "path": "templates/main.tex.template",
    "content": "%!TEX TS-program = xelatex\n%!TEX encoding = UTF-8 Unicode\n% ^ we require xelatex for emoji support\n\n\\documentclass[9pt,postvopaper]{memoir}\n\\setlrmarginsandblock{0.75in}{0.5in}{*}\n\\setulmarginsandblock{0.75in}{0.75in}{*}\n\\checkandfixthelayout\n\\usepackage{palatino}\n\\usepackage[T1]{fontenc}\n\\usepackage{fontspec}\n\\usepackage{microtype}\n\n% % set up font to support emojis - requires xetex\n\\usepackage[T1]{fontenc}\n\\usepackage[Latin,Greek,Emoticons]{ucharclasses}\n\\usepackage{fontspec}\n \n\\newfontfamily\\emojifont{Noto Emoji}\n% \\setDefaultTransitions{\\mydef}{}\n% \\newfontfamily\\mynormal{Noto Sans}\n% \\setTransitionsForLatin{\\mynormal}{}\n\n\\aliaspagestyle{title}{empty}\n\n\n\n\n\\author{}\n\\title{iMessage Book}\n\\date{}\n\n\\newcommand{\\rightmsg}[1]{\n\\noindent\\hfill%\n\\begin{minipage}{0.8\\textwidth}\n  \\begin{flushright}\n    #1\n  \\end{flushright}\n\\end{minipage}\n\\vspace{1mm}\n}\n\n\\newcommand{\\leftmsg}[1]{\n\\noindent\\begin{minipage}{0.8\\textwidth}\n  #1\n\\end{minipage}\n\\vspace{1mm}\n}\n\n\n%%% BEGIN DOCUMENT\n\n\\begin{document}\n\n\\frontmatter\n\n\\begin{titlingpage}\n\\maketitle\n\\clearpage\n\\begin{flushleft}\n\\null\\vfill\n\\textit{iMessage Book}\n\\bigskip\n\n\n\n\n\nALL RIGHTS RESERVED\n\\end{flushleft}\n\\end{titlingpage}\n\n\\movetooddpage\n\\begin{vplace}\n\\begin{center}\n  \\textit{Dedicated to you.}\n\\end{center}\n\\end{vplace}\n\n\\movetooddpage\n\\tableofcontents \n\n\\cleartorecto\n\\mainmatter\n\n\\openany\n\\chapterstyle{dash}\n\\addtolength\\afterchapskip{2cm}\n\n% template must be finished with \\includes and \\end{document}\n"
  },
  {
    "path": "templates/{yyyy}-{mm}.tex.template",
    "content": "\\chapter{July, 2020}\n\nhey hey hey\n"
  },
  {
    "path": "tex/.gitignore",
    "content": "*.aux\n*.log\n*.pdf\n*.xdv\n*.fdb_latexmk\n"
  },
  {
    "path": "tex/2020-07.tex",
    "content": "\\chapter{July, 2020}\n\nhey hey hey\n\n\\newpage\n\n\\markright{Hello}\nanother page\n\n\\newpage\n\n\\markright{yo yoy yo}\nand one more\n"
  },
  {
    "path": "tex/main.fls",
    "content": "PWD /home/ben/dev/message-book/tex\nINPUT /usr/share/texmf-dist/web2c/texmf.cnf\nINPUT /var/lib/texmf/web2c/xetex/xelatex.fmt\nINPUT main.tex\nOUTPUT main.log\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/memoir/memoir.cls\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/latex/memoir/mem9.clo\nINPUT /usr/share/texmf-dist/tex/latex/memoir/mem9.clo\nINPUT /usr/share/texmf-dist/tex/latex/memoir/mem9.clo\nINPUT /usr/share/texmf-dist/tex/latex/memoir/mem9.clo\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/dcolumn.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/delarray.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty\nINPUT /usr/share/texmf-dist/tex/latex/tools/array.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/textcase/textcase.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd\nINPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd\nINPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd\nINPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd\nINPUT /usr/share/texmf-dist/fonts/map/fontname/texfonts.map\nINPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr9.tfm\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty\nINPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/tuenc.def\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.cfg\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.cfg\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.cfg\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty\nINPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype-xetex.def\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/microtype.cfg\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/palatino.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd\nINPUT /usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplr8t.tfm\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/ifxetex.sty\nINPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty\nINPUT /usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty\nINPUT ./main.aux\nINPUT main.aux\nINPUT main.aux\nINPUT ./2020-07.aux\nINPUT 2020-07.aux\nINPUT 2020-07.aux\nOUTPUT main.aux\nINPUT /usr/share/texmf-dist/tex/latex/base/ts1cmr.fd\nINPUT /usr/share/texmf-dist/tex/latex/base/ts1cmr.fd\nINPUT /usr/share/texmf-dist/tex/latex/base/ts1cmr.fd\nINPUT /usr/share/texmf-dist/tex/latex/base/ts1cmr.fd\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-ppl.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-ppl.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-ppl.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-ppl.cfg\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplr8t.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplr8t.tfm\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-LatinModernRoman.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-LatinModernRoman.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-LatinModernRoman.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-LatinModernRoman.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-cmr.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-cmr.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-cmr.cfg\nINPUT /usr/share/texmf-dist/tex/latex/microtype/mt-cmr.cfg\nOUTPUT main.xdv\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplri8t.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplro8t.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplr8t.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplb8t.tfm\nINPUT ./main.toc\nINPUT main.toc\nINPUT main.toc\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplb8t.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmmi9.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmsy9.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmr9.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmr6.tfm\nINPUT ./2020-07.tex\nINPUT ./2020-07.tex\nINPUT ./2020-07.tex\nOUTPUT 2020-07.aux\nINPUT ./2020-07.tex\nINPUT ./2020-07.tex\nINPUT ./2020-07.tex\nINPUT 2020-07.tex\nINPUT ./2020-07.tex\nINPUT 2020-07.tex\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplr8t.tfm\nINPUT /usr/share/texmf-dist/fonts/tfm/adobe/palatino/pplb8t.tfm\nOUTPUT main.toc\nINPUT main.aux\nINPUT ./2020-07.aux\nINPUT 2020-07.aux\nINPUT 2020-07.aux\n"
  },
  {
    "path": "tex/main.tex",
    "content": "%!TEX TS-program = xelatex\n%!TEX encoding = UTF-8 Unicode\n% ^ we require xelatex for emoji support\n\n\\documentclass[9pt,mediumvopaper]{memoir}\n\\setlrmarginsandblock{2cm}{2cm}{*}\n\\setulmarginsandblock{2cm}{3cm}{*}\n\\checkandfixthelayout\n% TODO: figure out formatting for actual printing\n\\setlrmarginsandblock{2cm}{2cm}{*}\n\\setulmarginsandblock{2cm}{3cm}{*}\n\\checkandfixthelayout\n\\usepackage[T1]{fontenc}\n\\usepackage{fontspec}\n\\usepackage{microtype}\n\\usepackage{palatino}\n\n% % set up font to support emojis - requires xetex\n\\usepackage[T1]{fontenc}\n\\usepackage[Latin,Greek,Emoticons]{ucharclasses}\n\\usepackage{fontspec}\n \n\\newfontfamily\\emojifont{Noto Emoji Medium}\n% \\setDefaultTransitions{\\mydef}{}\n% \\newfontfamily\\mynormal{Noto Sans}\n% \\setTransitionsForLatin{\\mynormal}{}\n\n\\makepagestyle{messagebookstyle}\n\\makeevenhead{messagebookstyle}{\\thepage}{}{\\slshape\\leftmark}\n\\makeoddhead{messagebookstyle}{\\slshape\\rightmark}{}{\\thepage}\n\n\\pagestyle{messagebookstyle}\n\n\n\n\\author{Assembled by Ben Kettle}\n\\title{THE NAOMBEN CHRONICLES}\n\\date{}\n\n\\newcommand{\\rightmsg}[1]{\n\\noindent\\hfill%\n\\begin{minipage}{0.8\\textwidth}\n  \\begin{flushright}\n    #1\n  \\end{flushright}\n\\end{minipage}\n\\vspace{1mm}\n}\n\n\\newcommand{\\leftmsg}[1]{\n\\noindent\\begin{minipage}{0.8\\textwidth}\n  #1\n\\end{minipage}\n\\vspace{1mm}\n}\n\n\n%%% BEGIN DOCUMENT\n\n\\begin{document}\n\n\\let\\cleardoublepage\\clearpage\n\n\\maketitle\n\n\n\n\n\n\n\\frontmatter\n\n\\null\\vfill\n\n\\begin{flushleft}\n\\textit{NAME OF BOOK}\n\\bigskip\n\n\n\n\n\nALL RIGHTS RESERVED OR COPYRIGHT LICENSE LANGUAGE\n\n\n\n\n\\end{flushleft}\n\n\\newpage\n\\tableofcontents \n\n\\let\\cleardoublepage\\clearpage\n\n\\mainmatter\n\n% template must be finished with \\includes and \\end{document}\n\n\\leftmsg{Hey!}\n\n\\rightmsg{How's it going? {\\emojifont 😡😡😡😡} }\n\n{\\emojifont\n😀😃😄😁😆😅😂🤣🥲🥹 ☺️😊😇🙂🙃😉😌😍🥰😘😗😙 😚😋😛😝😜🤪🤨🧐🤓😎🥸 🤩🥳😏😒😞😔😟😕🙁☹️😣 😖😫😩🥺😢😭😮‍💨 😤😠😡🤬🤯😳🥵🥶😱😨 😰😥😓🫣🤗🫡🤔🫢🤭🤫 🤥😶😶‍🌫️😐😑😬🫨🫠🙄😯😦 😧😮😲🥱😴🤤😪😵😵‍💫🫥🤐🥴🤢🤮 🤧😷🤒🤕🤑🤠😈👿👹👺🤡💩👻 💀☠️👽👾🤖🎃😺😸 😹😻😼😽🙀😿😾}\n\n\\leftmsg{Oh, great! How about for you?}\n\n\\rightmsg{Swell}\n\n\\leftmsg{Awesome}\n\n\\leftmsg{Glad to hear it.}\n\n\\include{2020-07}\n\n\\end{document}\n"
  },
  {
    "path": "tex/main.toc",
    "content": "\\contentsline {chapter}{Contents}{ii}{}%\n\\contentsline {chapter}{\\chapternumberline {1}July, 2020}{3}{}%\n"
  }
]