[
  {
    "path": ".circleci/config.yml",
    "content": "version: 2.1\njobs:\n  dss:\n    docker:\n      - image: circleci/rust:stretch\n    environment:\n      RUST_BACKTRACE: \"1\"\n      RUSTFLAGS: \"-Dwarnings\"\n    working_directory: ~/talent-plan/courses/dss\n    steps:\n      - checkout:\n          path: ~/talent-plan\n      - run: rustup component add clippy-preview rustfmt-preview\n      - run: cargo fmt --all -- --check\n      - run: cargo clippy --all --tests -- -D clippy::all\n      - run: cargo test -p labcodec -p labrpc\n      - run: cargo test -p raft -- --test raft::persister\n      - run:\n          command: cargo test -p linearizability\n          no_output_timeout: 30m\n\nworkflows:\n  version: 2\n  ci-test:\n    jobs:\n      - dss\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.md",
    "content": "---\nname: \"\\U0001F41B Bug Report\"\nabout: something isn't working as expected\nlabels: type/bug\n---\n\n## Bug Report\n\nPlease answer these questions before submitting your issue. Thanks!\n\n### 1. What did you do? <!-- provide a recipe for reproducing -->\n\n### 2. What did you expect to see?\n\n### 3. What did you see instead?\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-requirement.md",
    "content": "---\nname: \"\\U0001F680 Feature Request\"\nabout: I have a suggestion!\nlabels: type/enhancement\n---\n\n## Feature Request\n\nplease make a clear and concise description for the following questions.\n\n### Is your feature request related to a problem?\n<!-- what the problem is -->\n\n### Describe the feature you'd like\n<!-- what you want to happen. -->\n\n### Describe alternatives you've considered\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question.md",
    "content": "---\nname: \"\\U0001F914 Question\"\nabout: I have a question!\nlabels: type/question\n---\n\n## General Question\n\n## Tips\n\nExpect for asking questions on Github, you can also discuss it in the channel\n**#wg-talent-plan-courses**. of\n[tidbcommunity](https://join.slack.com/t/tidbcommunity/shared_invite/enQtNzc0MzI4ODExMDc4LWYwYmIzMjZkYzJiNDUxMmZlN2FiMGJkZjAyMzQ5NGU0NGY0NzI3NTYwMjAyNGQ1N2I2ZjAxNzc1OGUwYWM0NzE)\nslack workspace.\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "<!-- Thank you for contributing to talent-plan!\n\nPR Title Format:\n1. pkg [, pkg2, pkg3]: what's changed\n2. *: what's changed\n\n-->\n\n### What problem does this PR solve?\n\n- Issue number: close #xxx <!-- remove this line if no issue to close -->\n- Breif description of the problem:\n\n### What is changed and how it works?\n\n### Check List <!--REMOVE the items that are not applicable-->\n\nTests <!-- At least one of them must be included. -->\n\n - Unit test\n - Integration test\n - Manual test (add detailed scripts or steps below)\n - No code\n\nSide effects\n\n - Possible performance regression\n - Increased code complexity\n\nRelated changes\n\n - Need to update the documentation\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at [ts-team@pingcap.com](mailto:ts-team@pingcap.com). All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing Guide\n\nThanks for taking the time to contribute to Talent Plan! Contributions of any kind are welcome.\n\n## Ways to contribute\n\nWe love contributions from the community. Here are just a few of the ways you can contribute:\n\n- **Report bugs:** if you find a bug while taking courses, you may want to do a quick check of past issues to see if you can find any help there. Otherwise, create a new bug issue in the course repository using the provided template.\n- **Answer questions:** check out the open issues to see if you can help answer learner questions.\n- **Suggest changes:** this could come in the form of a new learning outcome, updates to the content, updates to the bot responses, or the logic of the course. If you'd like, you can fork the course and suggest the change that way, but most people like to talk about it first in an issue.\n- **Tackle an issue:** if you see an issue you would like to resolve, please feel free to fork the course and submit a PR (check out the instructions below).\n- **Translate a course:** if you have the ability to translate a course, we'd love to see it. Please fork the course and submit a PR. We'll need a second native speaker to confirm the translation so if you have anyone in mind, please @ mention them in your PR for a review.\n\n\n## How to Contribute\n\n1. Check out which [contributions](#ways-to-contribute) above you are willing to make\n1. Fork this repository.\n2. Commit your changes to your branch\n3. Open a pull request to upstream\n4. Request a review from the reviewers\n\nWant to konw more about how to use Git & GitHub to make contributions? Click [how to use Git & GitHub](courses/tp102-how-to-use-git-github.md) courses for more help\n"
  },
  {
    "path": "README.md",
    "content": "# Welcome to learn Talent Plan Courses!\n\n![Talent Plan Logo](media/talent-plan-logo.png)\n\nTalent Plan is an open source training program initiated by PingCAP. It aims to create or combine some open source learning materials for people interested in open source, distributed systems, Rust, Golang, and other infrastructure knowledge. As such, it provides a series of courses focused on open source collaboration, rust programming, distributed database and systems.\n\n> Note:\n\n> Each course is developed by different teams, so they may vary in their organization and learning outcomes. Please see the individual course documentation for details.\n\n## Our Courses\n\n### Series 1: Open Source Collaboration\n\nOpen source collaboration includes a series of open-source related learning materials to help  enthusiasts gain basic knowledge of what open source software is, the differences between existing open-source software licenses, how to participate in open source projects, and what a welcoming open source community looks like. \n\nCourses include:\n\n- [TP 101: Introduction to open source software](courses/tp101-intro-to-oss.md)\n- [TP 102: How to use Git and GitHub](courses/tp102-how-to-use-git-github.md)\n- [TP 103: Build a welcoming community](courses/tp103-open-source-community.md)\n\n### Series 2: Rust Programming\n\nThis series is core to TALENT-PLAN. It builds your understanding of Rust as a programming language and provides opportunities for you to practice with it.\n\nCourses include:\n\n- [TP 201: Practical Networked Applications in Rust](courses/rust/README.md). A series of projects that incrementally develop a single Rust project from the ground up into a high-performance, networked, parallel and asynchronous key/value store. Along the way various real-world Rust development subject matter are explored and discussed.\n\n- [TP 202: Distributed Systems in Rust](courses/dss/README.md). Adapted from the [MIT 6.824](http://nil.csail.mit.edu/6.824/2017/index.html) distributed systems coursework, this course focuses on implementing important distributed algorithms, including the [Raft](https://raft.github.io/) consensus algorithm, and the [Percolator](https://storage.googleapis.com/pub-tools-public-publication-data/pdf/36726.pdf) distributed transaction protocol.\n\n### Series 3: Distributed Database \n\nThis series provides information on TinySQL and TinyKV, which are distributed databases in Go.\n\nCourses include:\n\n- [TP 301: TinySQL, a distributed relational database in Go](https://github.com/pingcap-incubator/tinysql)\n- [TP 302: TinyKV, a distributed key value database in Go](https://github.com/pingcap-incubator/tinykv) \n\n### Series 4: Deep Dive into TiDB Ecosystems \n\nThis series provides information on TiDB and TiKV, which are distributed databases developed by PingCAP.\n\nCourses include:\n\n- TP 401: Deep Dive into TiDB(WIP)\n- TP 402: Deep Dive into TiKV(WIP)\n\n\nSee [Courses](courses/README.md) for more details.\n\n# Contributing to talent plan\n\nContributions of any kind are welcome! Check out the [Contributing Guide](CONTRIBUTING.md) in this repository for more information on how you can contribute to Talent Plan. \n\nWe love our community and take great care to ensure it is fun, safe and rewarding. Please review our [Code of Conduct](/CODE_OF_CONDUCT.md) for community expectations and guidelines for reporting concerns.\n\n\n## We're here to help\n\nIf you have questions about building (or taking) courses, you can ask in the channel **#wg-talent-plan-courses** of the [tidbcommunity](https://tidbcommunity.slack.com/join/shared_invite/enQtNzc0MzI4ODExMDc4LWYwYmIzMjZkYzJiNDUxMmZlN2FiMGJkZjAyMzQ5NGU0NGY0NzI3NTYwMjAyNGQ1N2I2ZjAxNzc1OGUwYWM0NzE#/shared-invite/email) slack workspace.\n\n## License\n\nThese courses may be freely used and modified for any purpose, under the terms of each course's individual license. See the courses for details.\n"
  },
  {
    "path": "courses/README.md",
    "content": "# All public courses\n\nHere we list all public courses of Talent Plan, including:\n\n- [TP 101: Introduction to open source software](tp101-intro-to-oss.md)\n- [TP 102: How to use Git and GitHub](tp102-how-to-use-git-github.md)\n- [TP 103: Build a welcoming community](tp103-open-source-community.md)\n- [TP 201: Practical Networked Applications in Rust](rust/README.md)\n- [TP 202: Distributed Systems in Rust](dss/README.md)\n- [TP 301: TinySQL, a distributed relational database in Go](https://github.com/pingcap-incubator/tinysql)\n- [TP 302: TinyKV, a distributed key value database in Go](https://github.com/pingcap-incubator/tinykv) \n- TP 401: Deep Dive into TiDB(WIP)\n- TP 402: Deep Dive into TiKV(WIP)\n"
  },
  {
    "path": "courses/dss/.gitignore",
    "content": "**/target\n**/*.rs.bk\n6.824-golabs-2018\n"
  },
  {
    "path": "courses/dss/Cargo.toml",
    "content": "[workspace]\nmembers = [\n    \"labcodec\",\n    \"labrpc\",\n    \"linearizability\",\n    \"raft\",\n    \"percolator\"\n]\n"
  },
  {
    "path": "courses/dss/Makefile",
    "content": "export RUSTFLAGS=-Dwarnings\nexport RUST_TEST_THREADS=1\nexport RUST_BACKTRACE=1\n\nLOG_LEVEL ?= raft=info,percolator=info\n\ncheck:\n\tcargo fmt --all -- --check\n\tcargo clippy --all --tests -- -D clippy::all\n\ntest: test_others test_2 test_3\n\ntest_2: test_2a test_2b test_2c test_2d\n\ntest_2a: cargo_test_2a\n\ntest_2b: cargo_test_2b\n\ntest_2c: cargo_test_2c\n\ntest_2d: cargo_test_2d\n\ntest_3: test_3a test_3b\n\ntest_3a: cargo_test_3a\n\ntest_3b: cargo_test_3b\n\ncargo_test_%: check\n\tRUST_LOG=${LOG_LEVEL} cargo test -p raft -- --nocapture --test $*\n\ntest_others: check\n\tRUST_LOG=${LOG_LEVEL} cargo test -p labrpc -p labcodec -- --nocapture\n\ntest_percolator: check\n\tRUST_LOG=${LOG_LEVEL} cargo test -p percolator -- --nocapture\n"
  },
  {
    "path": "courses/dss/README.md",
    "content": "# Distributed Systems in Rust\n\nA training course about the distributed systems in [Rust].\n\nSubjects covered include:\n\n- [Raft consensus algorithm] (including a fault-tolerant key-value storage service\nusing Raft)\n- [Percolator transaction model]\n\nAfter completing this course you will have the knowledge to implement a basic\nkey-value storage service with transaction and fault-tolerant in Rust.\n\n**Important note: Distributed Systems in Rust is in an alpha state**\nIt might contain bugs. Any feedback is greatly appreciated. Please [file issues]\nif you have any problem. And also You are encouraged to fix problems on your own\nand submit pull requests.\n\n## The goal of this course\n\nThe goal of this course is to teach the Rust programmers who are interested in\ndistributed systems to know about how to make the distributed systems reliable\nand how to implement the distributed transaction.\n\n## Who is this for?\n\nDistributed Systems in Rust is for experienced _Rust_ programmers, who are\nfamiliar with the Rust language. If you are not, you can first learn our [rust]\nlessons.\n\n## A PingCAP-specific note\n\nThis course, combined with [Deep Dive TiKV], is intended to be enough to enable\nprogrammers to meaningfully contribute to [TiKV]. It is most specifically\ndesigned to teach those in the Chinese Rust community enough Rust to work on\nTiKV. The language used is intended to be simple so that those who read only a\nlittle English can follow. If you find any of the language difficult to\nunderstand please [file issues].\n\n## License\n\n[CC-BY 4.0](https://opendefinition.org/licenses/cc-by/)\n\n<!-- links -->\n[rust]: ../rust/README.md\n[file issues]: https://github.com/pingcap/talent-plan/issues/\n[Deep Dive TiKV]: https://tikv.github.io/deep-dive-tikv/overview/introduction.html\n[TiKV]: https://github.com/tikv/tikv/\n[Rust]: https://www.rust-lang.org/\n[Raft consensus algorithm]: raft/README.md\n[Percolator transaction model]: percolator/README.md\n"
  },
  {
    "path": "courses/dss/labcodec/Cargo.toml",
    "content": "[package]\nname = \"labcodec\"\nversion = \"0.1.0\"\nbuild = \"build.rs\"\nedition = \"2018\"\npublish = false\n\n[dependencies]\nprost = \"0.6\"\n\n[build-dependencies]\nprost-build = \"0.6\"\n"
  },
  {
    "path": "courses/dss/labcodec/build.rs",
    "content": "fn main() {\n    prost_build::compile_protos(&[\"proto/fixture.proto\"], &[\"proto\"]).unwrap();\n    println!(\"cargo:rerun-if-changed=proto\");\n}\n"
  },
  {
    "path": "courses/dss/labcodec/demonstration/README.md",
    "content": "# Demonstration\n\nExpanded version of generated rust files. Files in the folder are for the sake\nof understanding how procedural macro works, and they are not compilable.\n"
  },
  {
    "path": "courses/dss/labcodec/demonstration/expanded_fixture.rs",
    "content": "/// A simple protobuf message.\npub struct Msg {\n    #[prost(enumeration = \"msg::Type\", tag = \"1\")]\n    pub r#type: i32,\n    #[prost(uint64, tag = \"2\")]\n    pub id: u64,\n    #[prost(string, tag = \"3\")]\n    pub name: std::string::String,\n    #[prost(bytes, repeated, tag = \"4\")]\n    pub paylad: ::std::vec::Vec<std::vec::Vec<u8>>,\n}\n#[automatically_derived]\n#[allow(unused_qualifications)]\nimpl ::core::clone::Clone for Msg {\n    #[inline]\n    fn clone(&self) -> Msg {\n        match *self {\n            Msg {\n                r#type: ref __self_0_0,\n                id: ref __self_0_1,\n                name: ref __self_0_2,\n                paylad: ref __self_0_3,\n            } => Msg {\n                r#type: ::core::clone::Clone::clone(&(*__self_0_0)),\n                id: ::core::clone::Clone::clone(&(*__self_0_1)),\n                name: ::core::clone::Clone::clone(&(*__self_0_2)),\n                paylad: ::core::clone::Clone::clone(&(*__self_0_3)),\n            },\n        }\n    }\n}\nimpl ::core::marker::StructuralPartialEq for Msg {}\n#[automatically_derived]\n#[allow(unused_qualifications)]\nimpl ::core::cmp::PartialEq for Msg {\n    #[inline]\n    fn eq(&self, other: &Msg) -> bool {\n        match *other {\n            Msg {\n                r#type: ref __self_1_0,\n                id: ref __self_1_1,\n                name: ref __self_1_2,\n                paylad: ref __self_1_3,\n            } => match *self {\n                Msg {\n                    r#type: ref __self_0_0,\n                    id: ref __self_0_1,\n                    name: ref __self_0_2,\n                    paylad: ref __self_0_3,\n                } => {\n                    (*__self_0_0) == (*__self_1_0)\n                        && (*__self_0_1) == (*__self_1_1)\n                        && (*__self_0_2) == (*__self_1_2)\n                        && (*__self_0_3) == (*__self_1_3)\n                }\n            },\n        }\n    }\n    #[inline]\n    fn ne(&self, other: &Msg) -> bool {\n        match *other {\n            Msg {\n                r#type: ref __self_1_0,\n                id: ref __self_1_1,\n                name: ref __self_1_2,\n                paylad: ref __self_1_3,\n            } => match *self {\n                Msg {\n                    r#type: ref __self_0_0,\n                    id: ref __self_0_1,\n                    name: ref __self_0_2,\n                    paylad: ref __self_0_3,\n                } => {\n                    (*__self_0_0) != (*__self_1_0)\n                        || (*__self_0_1) != (*__self_1_1)\n                        || (*__self_0_2) != (*__self_1_2)\n                        || (*__self_0_3) != (*__self_1_3)\n                }\n            },\n        }\n    }\n}\nimpl ::prost::Message for Msg {\n    #[allow(unused_variables)]\n    fn encode_raw<B>(&self, buf: &mut B)\n    where\n        B: ::prost::bytes::BufMut,\n    {\n        if self.r#type != msg::Type::default() as i32 {\n            ::prost::encoding::int32::encode(1u32, &self.r#type, buf);\n        }\n        if self.id != 0u64 {\n            ::prost::encoding::uint64::encode(2u32, &self.id, buf);\n        }\n        if self.name != \"\" {\n            ::prost::encoding::string::encode(3u32, &self.name, buf);\n        }\n        ::prost::encoding::bytes::encode_repeated(4u32, &self.paylad, buf);\n    }\n    #[allow(unused_variables)]\n    fn merge_field<B>(\n        &mut self,\n        tag: u32,\n        wire_type: ::prost::encoding::WireType,\n        buf: &mut B,\n        ctx: ::prost::encoding::DecodeContext,\n    ) -> ::std::result::Result<(), ::prost::DecodeError>\n    where\n        B: ::prost::bytes::Buf,\n    {\n        const STRUCT_NAME: &'static str = \"Msg\";\n        match tag {\n            1u32 => {\n                let mut value = &mut self.r#type;\n                ::prost::encoding::int32::merge(wire_type, value, buf, ctx).map_err(|mut error| {\n                    error.push(STRUCT_NAME, \"r#type\");\n                    error\n                })\n            }\n            2u32 => {\n                let mut value = &mut self.id;\n                ::prost::encoding::uint64::merge(wire_type, value, buf, ctx).map_err(|mut error| {\n                    error.push(STRUCT_NAME, \"id\");\n                    error\n                })\n            }\n            3u32 => {\n                let mut value = &mut self.name;\n                ::prost::encoding::string::merge(wire_type, value, buf, ctx).map_err(|mut error| {\n                    error.push(STRUCT_NAME, \"name\");\n                    error\n                })\n            }\n            4u32 => {\n                let mut value = &mut self.paylad;\n                ::prost::encoding::bytes::merge_repeated(wire_type, value, buf, ctx).map_err(\n                    |mut error| {\n                        error.push(STRUCT_NAME, \"paylad\");\n                        error\n                    },\n                )\n            }\n            _ => ::prost::encoding::skip_field(wire_type, tag, buf, ctx),\n        }\n    }\n    #[inline]\n    fn encoded_len(&self) -> usize {\n        0 + if self.r#type != msg::Type::default() as i32 {\n            ::prost::encoding::int32::encoded_len(1u32, &self.r#type)\n        } else {\n            0\n        } + if self.id != 0u64 {\n            ::prost::encoding::uint64::encoded_len(2u32, &self.id)\n        } else {\n            0\n        } + if self.name != \"\" {\n            ::prost::encoding::string::encoded_len(3u32, &self.name)\n        } else {\n            0\n        } + ::prost::encoding::bytes::encoded_len_repeated(4u32, &self.paylad)\n    }\n    fn clear(&mut self) {\n        self.r#type = msg::Type::default() as i32;\n        self.id = 0u64;\n        self.name.clear();\n        self.paylad.clear();\n    }\n}\nimpl Default for Msg {\n    fn default() -> Msg {\n        Msg {\n            r#type: msg::Type::default() as i32,\n            id: 0u64,\n            name: ::std::string::String::new(),\n            paylad: ::std::vec::Vec::new(),\n        }\n    }\n}\nimpl ::std::fmt::Debug for Msg {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n        let mut builder = f.debug_struct(\"Msg\");\n        let builder = {\n            let wrapper = {\n                struct ScalarWrapper<'a>(&'a i32);\n                impl<'a> ::std::fmt::Debug for ScalarWrapper<'a> {\n                    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n                        match msg::Type::from_i32(*self.0) {\n                            None => ::std::fmt::Debug::fmt(&self.0, f),\n                            Some(en) => ::std::fmt::Debug::fmt(&en, f),\n                        }\n                    }\n                }\n                ScalarWrapper(&self.r#type)\n            };\n            builder.field(\"r#type\", &wrapper)\n        };\n        let builder = {\n            let wrapper = {\n                fn ScalarWrapper<T>(v: T) -> T {\n                    v\n                }\n                ScalarWrapper(&self.id)\n            };\n            builder.field(\"id\", &wrapper)\n        };\n        let builder = {\n            let wrapper = {\n                fn ScalarWrapper<T>(v: T) -> T {\n                    v\n                }\n                ScalarWrapper(&self.name)\n            };\n            builder.field(\"name\", &wrapper)\n        };\n        let builder = {\n            let wrapper = {\n                struct ScalarWrapper<'a>(&'a ::std::vec::Vec<::std::vec::Vec<u8>>);\n                impl<'a> ::std::fmt::Debug for ScalarWrapper<'a> {\n                    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n                        let mut vec_builder = f.debug_list();\n                        for v in self.0 {\n                            fn Inner<T>(v: T) -> T {\n                                v\n                            }\n                            vec_builder.entry(&Inner(v));\n                        }\n                        vec_builder.finish()\n                    }\n                }\n                ScalarWrapper(&self.paylad)\n            };\n            builder.field(\"paylad\", &wrapper)\n        };\n        builder.finish()\n    }\n}\n#[allow(dead_code)]\nimpl Msg {\n    ///Returns the enum value of `type`, or the default if the field is set to an invalid enum value.\n    pub fn r#type(&self) -> msg::Type {\n        msg::Type::from_i32(self.r#type).unwrap_or(msg::Type::default())\n    }\n    ///Sets `type` to the provided enum value.\n    pub fn set_type(&mut self, value: msg::Type) {\n        self.r#type = value as i32;\n    }\n}\npub mod msg {\n    #[repr(i32)]\n    pub enum Type {\n        Unknown = 0,\n        Put = 1,\n        Get = 2,\n        Del = 3,\n    }\n    #[automatically_derived]\n    #[allow(unused_qualifications)]\n    impl ::core::clone::Clone for Type {\n        #[inline]\n        fn clone(&self) -> Type {\n            {\n                *self\n            }\n        }\n    }\n    #[automatically_derived]\n    #[allow(unused_qualifications)]\n    impl ::core::marker::Copy for Type {}\n    #[automatically_derived]\n    #[allow(unused_qualifications)]\n    impl ::core::fmt::Debug for Type {\n        fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n            match (&*self,) {\n                (&Type::Unknown,) => {\n                    let mut debug_trait_builder = f.debug_tuple(\"Unknown\");\n                    debug_trait_builder.finish()\n                }\n                (&Type::Put,) => {\n                    let mut debug_trait_builder = f.debug_tuple(\"Put\");\n                    debug_trait_builder.finish()\n                }\n                (&Type::Get,) => {\n                    let mut debug_trait_builder = f.debug_tuple(\"Get\");\n                    debug_trait_builder.finish()\n                }\n                (&Type::Del,) => {\n                    let mut debug_trait_builder = f.debug_tuple(\"Del\");\n                    debug_trait_builder.finish()\n                }\n            }\n        }\n    }\n    impl ::core::marker::StructuralPartialEq for Type {}\n    #[automatically_derived]\n    #[allow(unused_qualifications)]\n    impl ::core::cmp::PartialEq for Type {\n        #[inline]\n        fn eq(&self, other: &Type) -> bool {\n            {\n                let __self_vi = unsafe { ::core::intrinsics::discriminant_value(&*self) } as i32;\n                let __arg_1_vi = unsafe { ::core::intrinsics::discriminant_value(&*other) } as i32;\n                if true && __self_vi == __arg_1_vi {\n                    match (&*self, &*other) {\n                        _ => true,\n                    }\n                } else {\n                    false\n                }\n            }\n        }\n    }\n    impl ::core::marker::StructuralEq for Type {}\n    #[automatically_derived]\n    #[allow(unused_qualifications)]\n    impl ::core::cmp::Eq for Type {\n        #[inline]\n        #[doc(hidden)]\n        fn assert_receiver_is_total_eq(&self) -> () {\n            {}\n        }\n    }\n    #[automatically_derived]\n    #[allow(unused_qualifications)]\n    impl ::core::hash::Hash for Type {\n        fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {\n            match (&*self,) {\n                _ => ::core::hash::Hash::hash(\n                    &unsafe { ::core::intrinsics::discriminant_value(self) },\n                    state,\n                ),\n            }\n        }\n    }\n    #[automatically_derived]\n    #[allow(unused_qualifications)]\n    impl ::core::cmp::PartialOrd for Type {\n        #[inline]\n        fn partial_cmp(&self, other: &Type) -> ::core::option::Option<::core::cmp::Ordering> {\n            {\n                let __self_vi = unsafe { ::core::intrinsics::discriminant_value(&*self) } as i32;\n                let __arg_1_vi = unsafe { ::core::intrinsics::discriminant_value(&*other) } as i32;\n                if true && __self_vi == __arg_1_vi {\n                    match (&*self, &*other) {\n                        _ => ::core::option::Option::Some(::core::cmp::Ordering::Equal),\n                    }\n                } else {\n                    __self_vi.partial_cmp(&__arg_1_vi)\n                }\n            }\n        }\n    }\n    #[automatically_derived]\n    #[allow(unused_qualifications)]\n    impl ::core::cmp::Ord for Type {\n        #[inline]\n        fn cmp(&self, other: &Type) -> ::core::cmp::Ordering {\n            {\n                let __self_vi = unsafe { ::core::intrinsics::discriminant_value(&*self) } as i32;\n                let __arg_1_vi = unsafe { ::core::intrinsics::discriminant_value(&*other) } as i32;\n                if true && __self_vi == __arg_1_vi {\n                    match (&*self, &*other) {\n                        _ => ::core::cmp::Ordering::Equal,\n                    }\n                } else {\n                    __self_vi.cmp(&__arg_1_vi)\n                }\n            }\n        }\n    }\n    impl Type {\n        ///Returns `true` if `value` is a variant of `Type`.\n        pub fn is_valid(value: i32) -> bool {\n            match value {\n                0 => true,\n                1 => true,\n                2 => true,\n                3 => true,\n                _ => false,\n            }\n        }\n        ///Converts an `i32` to a `Type`, or `None` if `value` is not a valid variant.\n        pub fn from_i32(value: i32) -> ::std::option::Option<Type> {\n            match value {\n                0 => ::std::option::Option::Some(Type::Unknown),\n                1 => ::std::option::Option::Some(Type::Put),\n                2 => ::std::option::Option::Some(Type::Get),\n                3 => ::std::option::Option::Some(Type::Del),\n                _ => ::std::option::Option::None,\n            }\n        }\n    }\n    impl ::std::default::Default for Type {\n        fn default() -> Type {\n            Type::Unknown\n        }\n    }\n    impl ::std::convert::From<Type> for i32 {\n        fn from(value: Type) -> i32 {\n            value as i32\n        }\n    }\n}\n"
  },
  {
    "path": "courses/dss/labcodec/proto/fixture.proto",
    "content": "syntax = \"proto3\";\n\npackage fixture;\n\n// A simple protobuf message.\nmessage Msg {\n    enum Type {\n        UNKNOWN = 0;\n        PUT = 1;\n        GET = 2;\n        DEL = 3;\n    }\n\n    Type type = 1;\n    uint64 id = 2;\n    string name = 3;\n    repeated bytes paylad = 4;\n}\n"
  },
  {
    "path": "courses/dss/labcodec/src/lib.rs",
    "content": "//! A thin wrapper of [prost](https://docs.rs/prost/0.6.1/prost/)\n\n/// A labcodec message.\npub trait Message: prost::Message + Default {}\nimpl<T: prost::Message + Default> Message for T {}\n\n/// A message encoding error.\npub type EncodeError = prost::EncodeError;\n/// A message decoding error.\npub type DecodeError = prost::DecodeError;\n\n/// Encodes the message to a `Vec<u8>`.\npub fn encode<M: Message>(message: &M, buf: &mut Vec<u8>) -> Result<(), EncodeError> {\n    buf.reserve(message.encoded_len());\n    message.encode(buf)?;\n    Ok(())\n}\n\n/// Decodes an message from the buffer.\npub fn decode<M: Message>(buf: &[u8]) -> Result<M, DecodeError> {\n    M::decode(buf)\n}\n\n#[cfg(test)]\nmod tests {\n    mod fixture {\n        // The generated rust file:\n        // labs6824/target/debug/build/labcodec-hashhashhashhash/out/fixture.rs\n        //\n        // It looks like:\n        //\n        // ```no_run\n        // /// A simple protobuf message.\n        // #[derive(Clone, PartialEq, Message)]\n        // pub struct Msg {\n        //     #[prost(enumeration=\"msg::Type\", tag=\"1\")]\n        //     pub type_: i32,\n        //     #[prost(uint64, tag=\"2\")]\n        //     pub id: u64,\n        //     #[prost(string, tag=\"3\")]\n        //     pub name: String,\n        //     #[prost(bytes, repeated, tag=\"4\")]\n        //     pub paylad: ::std::vec::Vec<Vec<u8>>,\n        // }\n        // pub mod msg {\n        //     #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Enumeration)]\n        //     pub enum Type {\n        //         Unknown = 0,\n        //         Put = 1,\n        //         Get = 2,\n        //         Del = 3,\n        //     }\n        // }\n        // ```\n        include!(concat!(env!(\"OUT_DIR\"), \"/fixture.rs\"));\n    }\n\n    use super::{decode, encode};\n\n    #[test]\n    fn test_basic_encode_decode() {\n        let msg = fixture::Msg {\n            r#type: fixture::msg::Type::Put as _,\n            id: 42,\n            name: \"the answer\".to_owned(),\n            paylad: vec![vec![7; 3]; 2],\n        };\n        let mut buf = vec![];\n        encode(&msg, &mut buf).unwrap();\n        let msg1 = decode(&buf).unwrap();\n        assert_eq!(msg, msg1);\n    }\n\n    #[test]\n    fn test_default() {\n        let msg = fixture::Msg::default();\n        let msg1 = decode(&[]).unwrap();\n        assert_eq!(msg, msg1);\n    }\n}\n"
  },
  {
    "path": "courses/dss/labrpc/Cargo.toml",
    "content": "[package]\nname = \"labrpc\"\nversion = \"0.1.0\"\nedition = \"2018\"\npublish = false\n\n[dependencies]\nasync-trait = \"0.1\"\nfutures = { version = \"0.3\", features = [\"thread-pool\"] }\nfutures-timer = \"3.0\"\nlog = \"0.4\"\nprost = \"0.6\"\nrand = \"0.7\"\n\nlabcodec = { path = \"../labcodec\" }\n\n[dev-dependencies]\ncriterion = \"0.3\"\nenv_logger = \"0.7\"\nprost-derive = \"0.6\"\n\n[[bench]]\nname = \"rpc\"\npath = \"benches/rpc.rs\"\nharness = false\n"
  },
  {
    "path": "courses/dss/labrpc/benches/rpc.rs",
    "content": "use std::sync::{Arc, Mutex};\n\nuse criterion::{black_box, criterion_group, criterion_main, Criterion};\nuse futures::executor::block_on;\nuse prost_derive::Message;\n\nuse labrpc::{service, Network, Result, Server, ServerBuilder};\n\nservice! {\n    /// A simple bench-purpose service.\n    service bench {\n        /// Doc comments.\n        rpc handler(BenchArgs) returns (BenchReply);\n    }\n}\nuse bench::{add_service, Client as BenchClient, Service};\n\n// Hand-written protobuf messages.\n#[derive(Clone, PartialEq, Message)]\npub struct BenchArgs {\n    #[prost(int64, tag = \"1\")]\n    pub x: i64,\n}\n\n#[derive(Clone, PartialEq, Message)]\npub struct BenchReply {\n    #[prost(string, tag = \"1\")]\n    pub x: String,\n}\n\n#[derive(Default)]\nstruct BenchInner {\n    log2: Vec<i64>,\n}\n#[derive(Clone)]\npub struct BenchService {\n    inner: Arc<Mutex<BenchInner>>,\n}\nimpl BenchService {\n    fn new() -> BenchService {\n        BenchService {\n            inner: Arc::default(),\n        }\n    }\n}\n\n#[async_trait::async_trait]\nimpl Service for BenchService {\n    async fn handler(&self, args: BenchArgs) -> Result<BenchReply> {\n        self.inner.lock().unwrap().log2.push(args.x);\n        Ok(BenchReply {\n            x: format!(\"handler-{}\", args.x),\n        })\n    }\n}\n\nfn bench_suit() -> (Network, Server, BenchService) {\n    let net = Network::new();\n    let server_name = \"test_server\".to_owned();\n    let mut builder = ServerBuilder::new(server_name);\n    let bench_server = BenchService::new();\n    add_service(bench_server.clone(), &mut builder).unwrap();\n    let server = builder.build();\n    net.add_server(server.clone());\n    (net, server, bench_server)\n}\n\nfn bench_rpc(c: &mut Criterion) {\n    let (net, server, _bench_server) = bench_suit();\n    let server_name = server.name();\n    let client_name = \"client\";\n    let client = BenchClient::new(net.create_client(client_name.to_owned()));\n    net.connect(client_name, server_name);\n    net.enable(client_name, true);\n\n    c.bench_function(\"rpc\", |b| {\n        b.iter(|| {\n            black_box(block_on(async {\n                client.handler(&BenchArgs { x: 111 }).await.unwrap()\n            }));\n        })\n        // i7-8650U, 13 microseconds per RPC\n    });\n}\n\ncriterion_group!(benches, bench_rpc);\ncriterion_main!(benches);\n"
  },
  {
    "path": "courses/dss/labrpc/examples/echo.rs",
    "content": "use futures::executor::block_on;\nuse prost_derive::Message;\n\nuse labrpc::*;\n\n/// A Hand-written protobuf messages\n#[derive(Clone, PartialEq, Message)]\npub struct Echo {\n    #[prost(int64, tag = \"1\")]\n    pub x: i64,\n}\n\nservice! {\n    service echo {\n        rpc ping(Echo) returns (Echo);\n    }\n}\nuse echo::{add_service, Client, Service};\n\n#[derive(Clone)]\nstruct EchoService;\n\n#[async_trait::async_trait]\nimpl Service for EchoService {\n    async fn ping(&self, input: Echo) -> Result<Echo> {\n        Ok(input)\n    }\n}\n\nfn main() {\n    let rn = Network::new();\n    let server_name = \"echo_server\";\n    let mut builder = ServerBuilder::new(server_name.to_owned());\n    add_service(EchoService, &mut builder).unwrap();\n    let server = builder.build();\n    rn.add_server(server);\n\n    let client_name = \"client\";\n    let client = Client::new(rn.create_client(client_name.to_owned()));\n    rn.enable(client_name, true);\n    rn.connect(client_name, server_name);\n\n    let reply = block_on(async { client.ping(&Echo { x: 777 }).await.unwrap() });\n    assert_eq!(reply, Echo { x: 777 });\n    println!(\"{:?}\", reply);\n}\n"
  },
  {
    "path": "courses/dss/labrpc/src/client.rs",
    "content": "use std::fmt;\nuse std::sync::{Arc, Mutex};\n\nuse futures::channel::mpsc::UnboundedSender;\nuse futures::channel::oneshot;\nuse futures::executor::ThreadPool;\nuse futures::future::{self, FutureExt};\n\nuse crate::error::{Error, Result};\nuse crate::server::RpcFuture;\n\npub struct Rpc {\n    pub(crate) client_name: String,\n    pub(crate) fq_name: &'static str,\n    pub(crate) req: Option<Vec<u8>>,\n    pub(crate) resp: Option<oneshot::Sender<Result<Vec<u8>>>>,\n    pub(crate) hooks: Arc<Mutex<Option<Arc<dyn RpcHooks>>>>,\n}\n\nimpl Rpc {\n    pub(crate) fn take_resp_sender(&mut self) -> Option<oneshot::Sender<Result<Vec<u8>>>> {\n        self.resp.take()\n    }\n}\n\nimpl fmt::Debug for Rpc {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        f.debug_struct(\"Rpc\")\n            .field(\"client_name\", &self.client_name)\n            .field(\"fq_name\", &self.fq_name)\n            .finish()\n    }\n}\n\npub trait RpcHooks: Sync + Send + 'static {\n    fn before_dispatch(&self, fq_name: &str, req: &[u8]) -> Result<()>;\n    fn after_dispatch(&self, fq_name: &str, resp: Result<Vec<u8>>) -> Result<Vec<u8>>;\n}\n\n#[derive(Clone)]\npub struct Client {\n    // this end-point's name\n    pub(crate) name: String,\n    // copy of Network.sender\n    pub(crate) sender: UnboundedSender<Rpc>,\n    pub(crate) hooks: Arc<Mutex<Option<Arc<dyn RpcHooks>>>>,\n\n    pub worker: ThreadPool,\n}\n\nimpl Client {\n    pub fn call<Req, Rsp>(&self, fq_name: &'static str, req: &Req) -> RpcFuture<Result<Rsp>>\n    where\n        Req: labcodec::Message,\n        Rsp: labcodec::Message + 'static,\n    {\n        let mut buf = vec![];\n        if let Err(e) = labcodec::encode(req, &mut buf) {\n            return Box::pin(future::err(Error::Encode(e)));\n        }\n\n        let (tx, rx) = oneshot::channel();\n        let rpc = Rpc {\n            client_name: self.name.clone(),\n            fq_name,\n            req: Some(buf),\n            resp: Some(tx),\n            hooks: self.hooks.clone(),\n        };\n\n        // Sends requests and waits responses.\n        if self.sender.unbounded_send(rpc).is_err() {\n            return Box::pin(future::err(Error::Stopped));\n        }\n\n        Box::pin(rx.then(|res| async move {\n            match res {\n                Ok(Ok(resp)) => labcodec::decode(&resp).map_err(Error::Decode),\n                Ok(Err(e)) => Err(e),\n                Err(e) => Err(Error::Recv(e)),\n            }\n        }))\n    }\n\n    pub fn set_hooks(&self, hooks: Arc<dyn RpcHooks>) {\n        *self.hooks.lock().unwrap() = Some(hooks);\n    }\n\n    pub fn clear_hooks(&self) {\n        *self.hooks.lock().unwrap() = None;\n    }\n}\n"
  },
  {
    "path": "courses/dss/labrpc/src/error.rs",
    "content": "use std::{error, fmt, result};\n\nuse futures::channel::oneshot::Canceled;\n\nuse labcodec::{DecodeError, EncodeError};\n\n#[derive(Clone, Debug, PartialEq, Eq)]\npub enum Error {\n    Unimplemented(String),\n    Encode(EncodeError),\n    Decode(DecodeError),\n    Recv(Canceled),\n    Timeout,\n    Stopped,\n    Other(String),\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{:?}\", self)\n    }\n}\n\nimpl error::Error for Error {\n    fn source(&self) -> Option<&(dyn error::Error + 'static)> {\n        match *self {\n            Error::Encode(ref e) => Some(e),\n            Error::Decode(ref e) => Some(e),\n            Error::Recv(ref e) => Some(e),\n            _ => None,\n        }\n    }\n}\n\npub type Result<T> = result::Result<T, Error>;\n"
  },
  {
    "path": "courses/dss/labrpc/src/lib.rs",
    "content": "#![allow(clippy::new_without_default)]\n\nmod client;\nmod error;\n#[macro_use]\nmod macros;\nmod network;\nmod server;\n\npub use self::client::{Client, Rpc, RpcHooks};\npub use self::error::{Error, Result};\npub use self::network::Network;\npub use self::server::{Handler, HandlerFactory, RpcFuture, Server, ServerBuilder};\n\n#[cfg(test)]\npub mod tests {\n    use std::sync::atomic::{AtomicBool, Ordering};\n    use std::sync::{mpsc, Arc, Mutex, Once};\n    use std::thread;\n    use std::time::{Duration, Instant};\n\n    use futures::channel::oneshot::Canceled;\n    use futures::executor::{block_on, ThreadPool};\n    use futures::stream::StreamExt;\n    use futures_timer::Delay;\n    use prost_derive::Message;\n\n    use super::*;\n\n    service! {\n        /// A simple test-purpose service.\n        service junk {\n            /// Doc comments.\n            rpc handler2(JunkArgs) returns (JunkReply);\n            rpc handler3(JunkArgs) returns (JunkReply);\n            rpc handler4(JunkArgs) returns (JunkReply);\n        }\n    }\n    use junk::{add_service, Client as JunkClient, Service as Junk};\n\n    // Hand-written protobuf messages.\n    #[derive(Clone, PartialEq, Message)]\n    pub struct JunkArgs {\n        #[prost(int64, tag = \"1\")]\n        pub x: i64,\n    }\n    #[derive(Clone, PartialEq, Message)]\n    pub struct JunkReply {\n        #[prost(string, tag = \"1\")]\n        pub x: String,\n    }\n\n    #[derive(Default)]\n    struct JunkInner {\n        log2: Vec<i64>,\n    }\n    #[derive(Clone)]\n    struct JunkService {\n        inner: Arc<Mutex<JunkInner>>,\n    }\n    impl JunkService {\n        fn new() -> JunkService {\n            JunkService {\n                inner: Arc::default(),\n            }\n        }\n    }\n    #[async_trait::async_trait]\n    impl Junk for JunkService {\n        async fn handler2(&self, args: JunkArgs) -> Result<JunkReply> {\n            self.inner.lock().unwrap().log2.push(args.x);\n            Ok(JunkReply {\n                x: format!(\"handler2-{}\", args.x),\n            })\n        }\n        async fn handler3(&self, args: JunkArgs) -> Result<JunkReply> {\n            Delay::new(Duration::from_secs(20)).await;\n            Ok(JunkReply {\n                x: format!(\"handler3-{}\", -args.x),\n            })\n        }\n        async fn handler4(&self, _: JunkArgs) -> Result<JunkReply> {\n            Ok(JunkReply {\n                x: \"pointer\".to_owned(),\n            })\n        }\n    }\n\n    fn init_logger() {\n        static LOGGER_INIT: Once = Once::new();\n        LOGGER_INIT.call_once(env_logger::init);\n    }\n\n    #[test]\n    fn test_service_dispatch() {\n        init_logger();\n\n        let mut builder = ServerBuilder::new(\"test\".to_owned());\n        let junk = JunkService::new();\n        add_service(junk.clone(), &mut builder).unwrap();\n        let prev_len = builder.services.len();\n        add_service(junk, &mut builder).unwrap_err();\n        assert_eq!(builder.services.len(), prev_len);\n        let server = builder.build();\n\n        let buf = block_on(async { server.dispatch(\"junk.handler4\", &[]).await.unwrap() });\n        let rsp = labcodec::decode(&buf).unwrap();\n        assert_eq!(\n            JunkReply {\n                x: \"pointer\".to_owned(),\n            },\n            rsp,\n        );\n\n        block_on(async {\n            server\n                .dispatch(\"junk.handler4\", b\"bad message\")\n                .await\n                .unwrap_err();\n\n            server.dispatch(\"badjunk.handler4\", &[]).await.unwrap_err();\n\n            server.dispatch(\"junk.badhandler\", &[]).await.unwrap_err();\n        });\n    }\n\n    #[test]\n    fn test_network_client_rpc() {\n        init_logger();\n\n        let mut builder = ServerBuilder::new(\"test\".to_owned());\n        let junk = JunkService::new();\n        add_service(junk, &mut builder).unwrap();\n        let server = builder.build();\n\n        let (net, incoming) = Network::create();\n        net.add_server(server);\n\n        let client = JunkClient::new(net.create_client(\"test_client\".to_owned()));\n        let (tx, rx) = mpsc::channel();\n        let cli = client.clone();\n        client.spawn(async move {\n            let reply = cli.handler4(&JunkArgs { x: 777 }).await;\n            tx.send(reply).unwrap();\n        });\n        let (mut rpc, incoming) = block_on(async {\n            match incoming.into_future().await {\n                (Some(rpc), s) => (rpc, s),\n                _ => panic!(\"unexpected error\"),\n            }\n        });\n        let reply = JunkReply {\n            x: \"boom!!!\".to_owned(),\n        };\n        let mut buf = vec![];\n        labcodec::encode(&reply, &mut buf).unwrap();\n        let resp = rpc.take_resp_sender().unwrap();\n        resp.send(Ok(buf)).unwrap();\n        assert_eq!(rpc.client_name, \"test_client\");\n        assert_eq!(rpc.fq_name, \"junk.handler4\");\n        assert!(!rpc.req.as_ref().unwrap().is_empty());\n        assert_eq!(rx.recv().unwrap(), Ok(reply));\n\n        let (tx, rx) = mpsc::channel();\n        let cli = client.clone();\n        client.spawn(async move {\n            let reply = cli.handler4(&JunkArgs { x: 777 }).await;\n            tx.send(reply).unwrap();\n        });\n        let (rpc, incoming) = block_on(async {\n            match incoming.into_future().await {\n                (Some(rpc), s) => (rpc, s),\n                _ => panic!(\"unexpected error\"),\n            }\n        });\n        drop(rpc.resp);\n        assert_eq!(rx.recv().unwrap(), Err(Error::Recv(Canceled)));\n\n        drop(incoming);\n        assert_eq!(\n            block_on(async { client.handler4(&JunkArgs::default()).await }),\n            Err(Error::Stopped)\n        );\n    }\n\n    fn junk_suit() -> (Network, Server, JunkService) {\n        let net = Network::new();\n        let server_name = \"test_server\".to_owned();\n        let mut builder = ServerBuilder::new(server_name);\n        let junk_server = JunkService::new();\n        add_service(junk_server.clone(), &mut builder).unwrap();\n        let server = builder.build();\n        net.add_server(server.clone());\n        (net, server, junk_server)\n    }\n\n    #[test]\n    fn test_basic() {\n        init_logger();\n\n        let (net, _, _) = junk_suit();\n\n        let client = JunkClient::new(net.create_client(\"test_client\".to_owned()));\n        net.connect(\"test_client\", \"test_server\");\n        net.enable(\"test_client\", true);\n\n        let rsp = block_on(async { client.handler4(&JunkArgs::default()).await.unwrap() });\n        assert_eq!(\n            JunkReply {\n                x: \"pointer\".to_owned(),\n            },\n            rsp,\n        );\n    }\n\n    // does net.Enable(endname, false) really disconnect a client?\n    #[test]\n    fn test_disconnect() {\n        init_logger();\n\n        let (net, _, _) = junk_suit();\n\n        let client = JunkClient::new(net.create_client(\"test_client\".to_owned()));\n        net.connect(\"test_client\", \"test_server\");\n\n        block_on(async { client.handler4(&JunkArgs::default()).await.unwrap_err() });\n\n        net.enable(\"test_client\", true);\n        let rsp = block_on(async { client.handler4(&JunkArgs::default()).await.unwrap() });\n\n        assert_eq!(\n            JunkReply {\n                x: \"pointer\".to_owned(),\n            },\n            rsp,\n        );\n    }\n\n    // test net.GetCount()\n    #[test]\n    fn test_count() {\n        init_logger();\n\n        let (net, _, _) = junk_suit();\n\n        let client = JunkClient::new(net.create_client(\"test_client\".to_owned()));\n        net.connect(\"test_client\", \"test_server\");\n        net.enable(\"test_client\", true);\n\n        for i in 0..=16 {\n            let reply = block_on(async { client.handler2(&JunkArgs { x: i }).await.unwrap() });\n            assert_eq!(reply.x, format!(\"handler2-{}\", i));\n        }\n\n        assert_eq!(net.count(\"test_server\"), 17);\n    }\n\n    // test RPCs from concurrent Clients\n    #[test]\n    fn test_concurrent_many() {\n        init_logger();\n\n        let (net, server, _) = junk_suit();\n        let server_name = server.name();\n\n        let pool = ThreadPool::new().unwrap();\n        let (tx, rx) = mpsc::channel::<usize>();\n\n        let nclients = 20usize;\n        let nrpcs = 10usize;\n        for i in 0..nclients {\n            let net = net.clone();\n            let sender = tx.clone();\n            let server_name = server_name.to_string();\n\n            pool.spawn_ok(async move {\n                let mut n = 0;\n                let client_name = format!(\"client-{}\", i);\n                let client = JunkClient::new(net.create_client(client_name.clone()));\n                net.enable(&client_name, true);\n                net.connect(&client_name, &server_name);\n\n                for j in 0..nrpcs {\n                    let x = (i * 100 + j) as i64;\n                    let reply = client.handler2(&JunkArgs { x }).await.unwrap();\n                    assert_eq!(reply.x, format!(\"handler2-{}\", x));\n                    n += 1;\n                }\n\n                sender.send(n).unwrap();\n            });\n        }\n\n        let mut total = 0;\n        for _ in 0..nclients {\n            total += rx.recv().unwrap();\n        }\n        assert_eq!(total, nrpcs * nclients);\n        let n = net.count(server_name);\n        assert_eq!(n, total);\n    }\n\n    #[test]\n    fn test_unreliable() {\n        init_logger();\n\n        let (net, server, _) = junk_suit();\n        let server_name = server.name();\n        net.set_reliable(false);\n\n        let pool = ThreadPool::new().unwrap();\n        let (tx, rx) = mpsc::channel::<usize>();\n        let nclients = 300;\n        for i in 0..nclients {\n            let sender = tx.clone();\n            let mut n = 0;\n            let server_name = server_name.to_owned();\n            let net = net.clone();\n\n            pool.spawn_ok(async move {\n                let client_name = format!(\"client-{}\", i);\n                let client = JunkClient::new(net.create_client(client_name.clone()));\n                net.enable(&client_name, true);\n                net.connect(&client_name, &server_name);\n\n                let x = i * 100;\n                if let Ok(reply) = client.handler2(&JunkArgs { x }).await {\n                    assert_eq!(reply.x, format!(\"handler2-{}\", x));\n                    n += 1;\n                }\n                sender.send(n).unwrap();\n            });\n        }\n        let mut total = 0;\n        for _ in 0..nclients {\n            total += rx.recv().unwrap();\n        }\n        assert!(\n            !(total == nclients as _ || total == 0),\n            \"all RPCs succeeded despite unreliable total {}, nclients {}\",\n            total,\n            nclients\n        );\n    }\n\n    // test concurrent RPCs from a single Client\n    #[test]\n    fn test_concurrent_one() {\n        init_logger();\n\n        let (net, server, junk_server) = junk_suit();\n        let server_name = server.name();\n\n        let pool = ThreadPool::new().unwrap();\n        let (tx, rx) = mpsc::channel::<usize>();\n        let nrpcs = 20;\n        for i in 0..20 {\n            let sender = tx.clone();\n            let client_name = format!(\"client-{}\", i);\n            let client = JunkClient::new(net.create_client(client_name.clone()));\n            net.enable(&client_name, true);\n            net.connect(&client_name, server_name);\n\n            pool.spawn_ok(async move {\n                let mut n = 0;\n                let x = i + 100;\n                let reply = client.handler2(&JunkArgs { x }).await.unwrap();\n                assert_eq!(reply.x, format!(\"handler2-{}\", x));\n                n += 1;\n                sender.send(n).unwrap()\n            });\n        }\n\n        let mut total = 0;\n        for _ in 0..nrpcs {\n            total += rx.recv().unwrap();\n        }\n        assert_eq!(\n            total, nrpcs,\n            \"wrong number of RPCs completed, got {}, expected {}\",\n            total, nrpcs\n        );\n\n        assert_eq!(\n            junk_server.inner.lock().unwrap().log2.len(),\n            nrpcs,\n            \"wrong number of RPCs delivered\"\n        );\n\n        let n = net.count(server.name());\n        assert_eq!(n, total, \"wrong count() {}, expected {}\", n, total);\n    }\n\n    // regression: an RPC that's delayed during Enabled=false\n    // should not delay subsequent RPCs (e.g. after Enabled=true).\n    #[test]\n    fn test_regression1() {\n        init_logger();\n\n        let (net, server, junk_server) = junk_suit();\n        let server_name = server.name();\n\n        let client_name = \"client\";\n        let client = JunkClient::new(net.create_client(client_name.to_owned()));\n        net.connect(client_name, server_name);\n\n        // start some RPCs while the Client is disabled.\n        // they'll be delayed.\n        net.enable(client_name, false);\n\n        let pool = ThreadPool::new().unwrap();\n        let (tx, rx) = mpsc::channel::<bool>();\n        let nrpcs = 20;\n        for i in 0..20 {\n            let sender = tx.clone();\n            let cli = client.clone();\n            pool.spawn_ok(async move {\n                let x = i + 100;\n                // this call ought to return false.\n                let _ = cli.handler2(&JunkArgs { x });\n                sender.send(true).unwrap();\n            });\n        }\n\n        // FIXME: have to sleep 300ms to pass the test\n        //        in my computer (i5-4200U, 4 threads).\n        thread::sleep(Duration::from_millis(100 * 3));\n\n        let t0 = Instant::now();\n        net.enable(client_name, true);\n        let x = 99;\n        let reply = block_on(async { client.handler2(&JunkArgs { x }).await.unwrap() });\n        assert_eq!(reply.x, format!(\"handler2-{}\", x));\n        let dur = t0.elapsed();\n        assert!(\n            dur < Duration::from_millis(30),\n            \"RPC took too long ({:?}) after Enable\",\n            dur\n        );\n\n        for _ in 0..nrpcs {\n            rx.recv().unwrap();\n        }\n\n        let len = junk_server.inner.lock().unwrap().log2.len();\n        assert_eq!(\n            len, 1,\n            \"wrong number ({}) of RPCs delivered, expected 1\",\n            len\n        );\n\n        let n = net.count(server.name());\n        assert_eq!(n, 1, \"wrong count() {}, expected 1\", n);\n    }\n\n    // if an RPC is stuck in a server, and the server\n    // is killed with DeleteServer(), does the RPC\n    // get un-stuck?\n    #[test]\n    fn test_killed() {\n        init_logger();\n\n        let (net, server, _junk_server) = junk_suit();\n        let server_name = server.name();\n\n        let client_name = \"client\";\n        let client = JunkClient::new(net.create_client(client_name.to_owned()));\n        net.connect(client_name, server_name);\n        net.enable(client_name, true);\n        let (tx, rx) = mpsc::channel();\n        let cli = client.clone();\n        client.spawn(async move {\n            let reply = cli.handler3(&JunkArgs { x: 99 }).await;\n            tx.send(reply).unwrap();\n        });\n        thread::sleep(Duration::from_secs(1));\n        rx.recv_timeout(Duration::from_millis(100)).unwrap_err();\n\n        net.delete_server(server_name);\n        let reply = rx.recv_timeout(Duration::from_millis(100)).unwrap();\n        assert_eq!(reply, Err(Error::Stopped));\n    }\n\n    struct Hooks {\n        drop_req: AtomicBool,\n        drop_resp: AtomicBool,\n    }\n    impl RpcHooks for Hooks {\n        fn before_dispatch(&self, _: &str, _: &[u8]) -> Result<()> {\n            if self.drop_req.load(Ordering::Relaxed) {\n                Err(Error::Other(\"reqhook\".to_owned()))\n            } else {\n                Ok(())\n            }\n        }\n        fn after_dispatch(&self, _: &str, resp: Result<Vec<u8>>) -> Result<Vec<u8>> {\n            if self.drop_resp.load(Ordering::Relaxed) {\n                Err(Error::Other(\"resphook\".to_owned()))\n            } else {\n                resp\n            }\n        }\n    }\n\n    #[test]\n    fn test_rpc_hooks() {\n        init_logger();\n        let (net, _, _) = junk_suit();\n\n        let raw_cli = net.create_client(\"test_client\".to_owned());\n        let hook = Arc::new(Hooks {\n            drop_req: AtomicBool::new(false),\n            drop_resp: AtomicBool::new(false),\n        });\n        raw_cli.set_hooks(hook.clone());\n\n        let client = JunkClient::new(raw_cli);\n        net.connect(\"test_client\", \"test_server\");\n        net.enable(\"test_client\", true);\n\n        let i = 100;\n        let reply = block_on(async { client.handler2(&JunkArgs { x: i }).await.unwrap() });\n        assert_eq!(reply.x, format!(\"handler2-{}\", i));\n        hook.drop_req.store(true, Ordering::Relaxed);\n        assert_eq!(\n            block_on(async { client.handler2(&JunkArgs { x: i }).await.unwrap_err() }),\n            Error::Other(\"reqhook\".to_owned())\n        );\n        hook.drop_req.store(false, Ordering::Relaxed);\n        hook.drop_resp.store(true, Ordering::Relaxed);\n        assert_eq!(\n            block_on(async { client.handler2(&JunkArgs { x: i }).await.unwrap_err() }),\n            Error::Other(\"resphook\".to_owned())\n        );\n        hook.drop_resp.store(false, Ordering::Relaxed);\n        block_on(async { client.handler2(&JunkArgs { x: i }).await.unwrap() });\n        assert_eq!(reply.x, format!(\"handler2-{}\", i));\n    }\n}\n"
  },
  {
    "path": "courses/dss/labrpc/src/macros.rs",
    "content": "#[macro_export]\nmacro_rules! service {\n    () => {\n        compile_error!(\"empty service is not allowed\");\n    };\n    (\n        $(#[$service_attr:meta])*\n        service $svc_name:ident {\n            $(\n                $(#[$method_attr:meta])*\n                rpc $method_name:ident($input:ty) returns ($output:ty);\n            )*\n        }\n    ) => {\n        $(#[$service_attr])*\n        pub mod $svc_name {\n            // In order to find input and output.\n            use super::*;\n            // $( use super::$input; )*\n            // $( use super::$output;)*\n\n            extern crate futures as __futures;\n\n            #[async_trait::async_trait]\n            pub trait Service: Clone + Send + 'static {\n                $(\n                    $(#[$method_attr])*\n                    async fn $method_name(&self, req: $input) -> $crate::Result<$output>;\n                )*\n            }\n\n            #[derive(Clone)]\n            pub struct Client {\n                client: $crate::Client,\n            }\n            impl Client {\n                pub fn new(client: $crate::Client) -> Client {\n                    Client { client }\n                }\n\n                pub fn spawn<F>(&self, f: F)\n                where F: __futures::Future<Output = ()> + Send + 'static\n                {\n                    self.client.worker.spawn_ok(f);\n                }\n\n                $(pub fn $method_name(&self, args: &$input) -> $crate::RpcFuture<$crate::Result<$output>> {\n                    let fq_name = concat!(stringify!($svc_name), \".\", stringify!($method_name));\n                    self.client.call(fq_name, args)\n                })*\n            }\n\n            pub fn add_service<T: Service>(svc: T, builder: &mut $crate::ServerBuilder) -> $crate::Result<()> {\n                use ::std::sync::Mutex;\n                struct Factory<S> {\n                    svc: Mutex<S>,\n                }\n                impl<S: Service> $crate::HandlerFactory for Factory<S> {\n                    fn handler(&self, name: &'static str) -> Box<$crate::Handler> {\n                        let s = self.svc.lock().unwrap().clone();\n                        Box::new(move |req| {\n                            match name {\n                                $(stringify!($method_name) => {\n                                    let request = match labcodec::decode(req) {\n                                        Ok(req) => req,\n                                        Err(e) => return Box::pin(__futures::future::err(\n                                            $crate::Error::Decode(e)\n                                        )),\n                                    };\n                                    Box::pin(async move {\n                                        let f = s.$method_name(request);\n                                        let resp = f.await;\n                                        match resp {\n                                            Ok(resp) => {\n                                                let mut rsp = vec![];\n                                                labcodec::encode(&resp, &mut rsp).map_err($crate::Error::Encode)?;\n                                                Ok(rsp)\n                                            }\n                                            Err(e) => Err(e),\n                                        }\n                                    })\n                                })*\n                                other => {\n                                    Box::pin(__futures::future::err(\n                                        $crate::Error::Unimplemented(\n                                            format!(\"unknown {} in {}\", other, stringify!($svc_name))\n                                        )\n                                    ))\n                                }\n                            }\n                        })\n                    }\n                }\n\n                let fact = Factory {\n                    svc: Mutex::new(svc),\n                };\n\n                builder.add_service(stringify!($svc_name), Box::new(fact))\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "courses/dss/labrpc/src/network.rs",
    "content": "use std::collections::HashMap;\nuse std::future::Future;\nuse std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};\nuse std::sync::{Arc, Mutex};\nuse std::time::Duration;\n\nuse futures::channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender};\nuse futures::executor::ThreadPool;\nuse futures::future::FutureExt;\nuse futures::select;\nuse futures::stream::StreamExt;\nuse futures_timer::Delay;\nuse log::{debug, error};\nuse rand::{thread_rng, Rng};\n\nuse crate::client::{Client, Rpc};\nuse crate::error::{Error, Result};\nuse crate::server::Server;\n\n#[derive(Debug)]\nstruct EndInfo {\n    enabled: bool,\n    reliable: bool,\n    long_reordering: bool,\n    server: Option<Server>,\n}\n\nstruct Endpoints {\n    // by client name\n    enabled: HashMap<String, bool>,\n    // servers, by name\n    servers: HashMap<String, Option<Server>>,\n    // client_name -> server_name\n    connections: HashMap<String, Option<String>>,\n}\n\nstruct NetworkCore {\n    reliable: AtomicBool,\n    // pause a long time on send on disabled connection\n    long_delays: AtomicBool,\n    // sometimes delay replies a long time\n    long_reordering: AtomicBool,\n    endpoints: Mutex<Endpoints>,\n    count: AtomicUsize,\n    sender: UnboundedSender<Rpc>,\n    poller: ThreadPool,\n    worker: ThreadPool,\n}\n\n#[derive(Clone)]\npub struct Network {\n    core: Arc<NetworkCore>,\n}\n\nimpl Network {\n    pub fn new() -> Network {\n        let (net, incoming) = Network::create();\n        net.start(incoming);\n        net\n    }\n\n    pub fn create() -> (Network, UnboundedReceiver<Rpc>) {\n        let (sender, incoming) = unbounded();\n        let net = Network {\n            core: Arc::new(NetworkCore {\n                reliable: AtomicBool::new(true),\n                long_delays: AtomicBool::new(false),\n                long_reordering: AtomicBool::new(false),\n                endpoints: Mutex::new(Endpoints {\n                    enabled: HashMap::new(),\n                    servers: HashMap::new(),\n                    connections: HashMap::new(),\n                }),\n                count: AtomicUsize::new(0),\n                poller: ThreadPool::builder().pool_size(2).create().unwrap(),\n                worker: ThreadPool::new().unwrap(),\n                sender,\n            }),\n        };\n\n        (net, incoming)\n    }\n\n    fn start(&self, mut incoming: UnboundedReceiver<Rpc>) {\n        let network = self.clone();\n        self.core.poller.spawn_ok(async move {\n            while let Some(mut rpc) = incoming.next().await {\n                let resp = rpc.take_resp_sender().unwrap();\n                let net = network.clone();\n                network.core.poller.spawn_ok(async move {\n                    let res = net.process_rpc(rpc).await;\n                    if let Err(e) = resp.send(res) {\n                        error!(\"fail to send resp: {:?}\", e);\n                    }\n                })\n            }\n        });\n    }\n\n    pub fn add_server(&self, server: Server) {\n        let mut eps = self.core.endpoints.lock().unwrap();\n        eps.servers.insert(server.core.name.clone(), Some(server));\n    }\n\n    pub fn delete_server(&self, name: &str) {\n        let mut eps = self.core.endpoints.lock().unwrap();\n        if let Some(s) = eps.servers.get_mut(name) {\n            *s = None;\n        }\n    }\n\n    pub fn create_client(&self, name: String) -> Client {\n        let sender = self.core.sender.clone();\n        let mut eps = self.core.endpoints.lock().unwrap();\n        eps.enabled.insert(name.clone(), false);\n        eps.connections.insert(name.clone(), None);\n        Client {\n            name,\n            sender,\n            worker: self.core.worker.clone(),\n            hooks: Arc::new(Mutex::new(None)),\n        }\n    }\n\n    /// Connects a Client to a server.\n    /// a Client can only be connected once in its lifetime.\n    pub fn connect(&self, client_name: &str, server_name: &str) {\n        let mut eps = self.core.endpoints.lock().unwrap();\n        eps.connections\n            .insert(client_name.to_owned(), Some(server_name.to_owned()));\n    }\n\n    /// Enable/disable a Client.\n    pub fn enable(&self, client_name: &str, enabled: bool) {\n        debug!(\n            \"client {} is {}\",\n            client_name,\n            if enabled { \"enabled\" } else { \"disabled\" }\n        );\n        let mut eps = self.core.endpoints.lock().unwrap();\n        eps.enabled.insert(client_name.to_owned(), enabled);\n    }\n\n    pub fn set_reliable(&self, yes: bool) {\n        self.core.reliable.store(yes, Ordering::Release);\n    }\n\n    pub fn set_long_reordering(&self, yes: bool) {\n        self.core.long_reordering.store(yes, Ordering::Release);\n    }\n\n    pub fn set_long_delays(&self, yes: bool) {\n        self.core.long_delays.store(yes, Ordering::Release);\n    }\n\n    pub fn count(&self, server_name: &str) -> usize {\n        let eps = self.core.endpoints.lock().unwrap();\n        eps.servers[server_name].as_ref().unwrap().count()\n    }\n\n    pub fn total_count(&self) -> usize {\n        self.core.count.load(Ordering::Relaxed)\n    }\n\n    fn end_info(&self, client_name: &str) -> EndInfo {\n        let eps = self.core.endpoints.lock().unwrap();\n        let mut server = None;\n        if let Some(Some(server_name)) = eps.connections.get(client_name) {\n            server = eps.servers[server_name].clone();\n        }\n        EndInfo {\n            enabled: eps.enabled[client_name],\n            reliable: self.core.reliable.load(Ordering::Acquire),\n            long_reordering: self.core.long_reordering.load(Ordering::Acquire),\n            server,\n        }\n    }\n\n    fn is_server_dead(&self, client_name: &str, server_name: &str, server_id: usize) -> bool {\n        let eps = self.core.endpoints.lock().unwrap();\n        !eps.enabled[client_name]\n            || eps.servers.get(server_name).map_or(true, |o| {\n                o.as_ref().map(|s| s.core.id != server_id).unwrap_or(true)\n            })\n    }\n\n    async fn process_rpc(&self, rpc: Rpc) -> Result<Vec<u8>> {\n        self.core.count.fetch_add(1, Ordering::Relaxed);\n        let network = self.clone();\n        let end_info = self.end_info(&rpc.client_name);\n        debug!(\"{:?} process with {:?}\", rpc, end_info);\n        let EndInfo {\n            enabled,\n            reliable,\n            long_reordering,\n            server,\n        } = end_info;\n\n        match (enabled, server) {\n            (true, Some(server)) => {\n                let short_delay = if !reliable {\n                    // short delay\n                    let ms = thread_rng().gen::<u64>() % 27;\n                    Some(ms)\n                } else {\n                    None\n                };\n\n                if !reliable && (thread_rng().gen::<u64>() % 1000) < 100 {\n                    // drop the request, return as if timeout\n                    Delay::new(Duration::from_secs(short_delay.unwrap())).await;\n                    return Err(Error::Timeout);\n                }\n\n                let drop_reply = !reliable && thread_rng().gen::<u64>() % 1000 < 100;\n                let long_reordering = if long_reordering && thread_rng().gen_range(0, 900) < 600i32\n                {\n                    // delay the response for a while\n                    let upper_bound: u64 = 1 + thread_rng().gen_range(0, 2000);\n                    Some(200 + thread_rng().gen_range(0, upper_bound))\n                } else {\n                    None\n                };\n\n                // Dispatch\n                process_rpc(\n                    short_delay,\n                    drop_reply,\n                    long_reordering,\n                    rpc,\n                    network,\n                    server,\n                )\n                .await\n            }\n            _ => {\n                // simulate no reply and eventual timeout.\n                let ms = if self.core.long_delays.load(Ordering::Acquire) {\n                    // let Raft tests check that leader doesn't send\n                    // RPCs synchronously.\n                    thread_rng().gen::<u64>() % 7000\n                } else {\n                    // many kv tests require the client to try each\n                    // server in fairly rapid succession.\n                    thread_rng().gen::<u64>() % 100\n                };\n\n                debug!(\"{:?} delay {}ms then timeout\", rpc, ms);\n                Delay::new(Duration::from_millis(ms)).await;\n                Err(Error::Timeout)\n            }\n        }\n    }\n\n    /// Spawns a future to run on this net framework.\n    pub fn spawn<F>(&self, f: F)\n    where\n        F: Future<Output = ()> + Send + 'static,\n    {\n        self.core.worker.spawn_ok(f);\n    }\n\n    /// Spawns a future to run on this net framework.\n    pub fn spawn_poller<F>(&self, f: F)\n    where\n        F: Future<Output = ()> + Send + 'static,\n    {\n        self.core.poller.spawn_ok(f);\n    }\n}\n\nasync fn process_rpc(\n    mut delay: Option<u64>,\n    drop_reply: bool,\n    long_reordering: Option<u64>,\n    mut rpc: Rpc,\n    network: Network,\n    server: Server,\n) -> Result<Vec<u8>> {\n    // Dispatch ===============================================================\n    if let Some(delay) = delay {\n        Delay::new(Duration::from_millis(delay)).await;\n    }\n    // We has finished the delay, take it out to prevent polling\n    // twice.\n    delay.take();\n\n    let fq_name = rpc.fq_name;\n    let req = rpc.req.take().unwrap();\n    if let Some(hooks) = rpc.hooks.lock().unwrap().as_ref() {\n        hooks.before_dispatch(fq_name, &req)?;\n    }\n\n    // Execute the request (call the RPC handler) in a separate thread so that\n    // we can periodically check if the server has been killed and the RPC\n    // should get a failure reply.\n    //\n    // do not reply if DeleteServer() has been called, i.e. the server has been killed.\n    // this is needed to avoid situation in which a client gets a positive reply\n    // to an Append, but the server persisted the update into the old Persister.\n    // config.go is careful to call DeleteServer() before superseding the Persister.\n    let resp = select! {\n        res = server.dispatch(fq_name, &req).fuse() => res,\n        _ = server_dead(\n            Duration::from_millis(100),\n            network.clone(),\n            &rpc.client_name,\n            &server.core.name,\n            server.core.id,\n        ).fuse() => Err(Error::Stopped),\n    };\n\n    let resp = if let Some(hooks) = rpc.hooks.lock().unwrap().as_ref() {\n        hooks.after_dispatch(fq_name, resp)?\n    } else {\n        resp?\n    };\n\n    // Ongoing ================================================================\n    let client_name = &rpc.client_name;\n    let server_name = &server.core.name;\n    let server_id = server.core.id;\n    if network.is_server_dead(client_name, server_name, server_id) {\n        return Err(Error::Stopped);\n    }\n    if drop_reply {\n        // drop the reply, return as if timeout.\n        return Err(Error::Timeout);\n    }\n\n    // Reordering =============================================================\n    if let Some(reordering) = long_reordering {\n        debug!(\"{:?} next long reordering {}ms\", rpc, reordering);\n        Delay::new(Duration::from_millis(reordering)).await;\n        Ok(resp)\n    } else {\n        Ok(resp)\n    }\n}\n\n/// Checks if the specified server killed.\n///\n/// It will return when the server is killed.\nasync fn server_dead(\n    interval: Duration,\n    net: Network,\n    client_name: &str,\n    server_name: &str,\n    server_id: usize,\n) {\n    loop {\n        Delay::new(interval).await;\n        if net.is_server_dead(client_name, server_name, server_id) {\n            debug!(\"{:?} is dead\", server_name);\n            return;\n        }\n    }\n}\n"
  },
  {
    "path": "courses/dss/labrpc/src/server.rs",
    "content": "use std::collections::hash_map::{Entry, HashMap};\nuse std::fmt;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::Arc;\n\nuse futures::future::{self, BoxFuture};\n\nuse crate::error::{Error, Result};\n\nstatic ID_ALLOC: AtomicUsize = AtomicUsize::new(0);\n\npub type RpcFuture<T> = BoxFuture<'static, T>;\n\npub type Handler = dyn FnOnce(&[u8]) -> RpcFuture<Result<Vec<u8>>>;\n\npub trait HandlerFactory: Sync + Send + 'static {\n    fn handler(&self, name: &'static str) -> Box<Handler>;\n}\n\npub struct ServerBuilder {\n    name: String,\n    // Service name -> service methods\n    pub(crate) services: HashMap<&'static str, Box<dyn HandlerFactory>>,\n}\n\nimpl ServerBuilder {\n    pub fn new(name: String) -> ServerBuilder {\n        ServerBuilder {\n            name,\n            services: HashMap::new(),\n        }\n    }\n\n    pub fn add_service(\n        &mut self,\n        service_name: &'static str,\n        factory: Box<dyn HandlerFactory>,\n    ) -> Result<()> {\n        match self.services.entry(service_name) {\n            Entry::Occupied(_) => Err(Error::Other(format!(\n                \"{} has already registered\",\n                service_name\n            ))),\n            Entry::Vacant(entry) => {\n                entry.insert(factory);\n                Ok(())\n            }\n        }\n    }\n\n    pub fn build(self) -> Server {\n        Server {\n            core: Arc::new(ServerCore {\n                name: self.name,\n                services: self.services,\n                id: ID_ALLOC.fetch_add(1, Ordering::Relaxed),\n                count: AtomicUsize::new(0),\n            }),\n        }\n    }\n}\n\npub(crate) struct ServerCore {\n    pub(crate) name: String,\n    pub(crate) id: usize,\n\n    pub(crate) services: HashMap<&'static str, Box<dyn HandlerFactory>>,\n    pub(crate) count: AtomicUsize,\n}\n\n#[derive(Clone)]\npub struct Server {\n    pub(crate) core: Arc<ServerCore>,\n}\n\nimpl Server {\n    pub fn count(&self) -> usize {\n        self.core.count.load(Ordering::Relaxed)\n    }\n\n    pub fn name(&self) -> &str {\n        &self.core.name\n    }\n\n    pub(crate) fn dispatch(&self, fq_name: &'static str, req: &[u8]) -> RpcFuture<Result<Vec<u8>>> {\n        self.core.count.fetch_add(1, Ordering::Relaxed);\n        let mut names = fq_name.split('.');\n        let service_name = match names.next() {\n            Some(n) => n,\n            None => {\n                return Box::pin(future::err(Error::Unimplemented(format!(\n                    \"unknown {}\",\n                    fq_name\n                ))));\n            }\n        };\n        let method_name = match names.next() {\n            Some(n) => n,\n            None => {\n                return Box::pin(future::err(Error::Unimplemented(format!(\n                    \"unknown {}\",\n                    fq_name\n                ))));\n            }\n        };\n        if let Some(factory) = self.core.services.get(service_name) {\n            let handle = factory.handler(method_name);\n            handle(req)\n        } else {\n            Box::pin(future::err(Error::Unimplemented(format!(\n                \"unknown {}\",\n                fq_name\n            ))))\n        }\n    }\n}\n\nimpl fmt::Debug for Server {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        f.debug_struct(\"Server\")\n            .field(\"name\", &self.core.name)\n            .field(\"id\", &self.core.id)\n            .finish()\n    }\n}\n"
  },
  {
    "path": "courses/dss/linearizability/Cargo.toml",
    "content": "[package]\nname = \"linearizability\"\nversion = \"0.1.0\"\nedition = \"2018\"\npublish = false\n\n[dev-dependencies]\nregex = \"1.3\"\nlazy_static = \"1.4\"\n"
  },
  {
    "path": "courses/dss/linearizability/src/bitset.rs",
    "content": "use std::num::Wrapping;\n\n#[derive(Clone)]\npub struct Bitset(Vec<u64>);\n\nimpl Bitset {\n    pub fn new(bits: usize) -> Self {\n        let extra = if bits % 64 != 0 { 1 } else { 0 };\n        Bitset(vec![0; bits / 64 + extra])\n    }\n\n    pub fn set(&mut self, pos: usize) {\n        let (major, minor) = bitset_index(pos);\n        self.0[major] |= 1 << minor;\n    }\n\n    pub fn clear(&mut self, pos: usize) {\n        let (major, minor) = bitset_index(pos);\n        self.0[major] &= !(1 << minor);\n    }\n\n    fn popcnt(&self) -> usize {\n        let mut total = 0;\n        for b in &self.0 {\n            let mut v = *b;\n            v = (v & 0x5555_5555_5555_5555) + ((v & 0xAAAA_AAAA_AAAA_AAAA) >> 1);\n            v = (v & 0x3333_3333_3333_3333) + ((v & 0xCCCC_CCCC_CCCC_CCCC) >> 2);\n            v = (v & 0x0F0F_0F0F_0F0F_0F0F) + ((v & 0xF0F0_F0F0_F0F0_F0F0) >> 4);\n            v = (Wrapping(v) * Wrapping(0x0101_0101_0101_0101)).0;\n            total += ((v >> 56) & 0xFF) as usize;\n        }\n        total\n    }\n\n    pub fn hash(&self) -> u64 {\n        let mut hash = self.popcnt() as u64;\n        for v in &self.0 {\n            hash ^= v;\n        }\n        hash\n    }\n\n    pub fn equals(&self, b2: &Bitset) -> bool {\n        let b = &self.0;\n        let b2 = &b2.0;\n        if b.len() != b2.len() {\n            return false;\n        }\n        for i in 0..b.len() {\n            if b[i] != b2[i] {\n                return false;\n            }\n        }\n        true\n    }\n}\n\nfn bitset_index(pos: usize) -> (usize, usize) {\n    (pos / 64, pos % 64)\n}\n"
  },
  {
    "path": "courses/dss/linearizability/src/lib.rs",
    "content": "mod bitset;\npub mod model;\npub mod models;\n\nuse std::cell::{Ref, RefCell};\nuse std::collections::HashMap;\nuse std::fmt::Debug;\nuse std::rc::Rc;\nuse std::sync::atomic::{AtomicBool, Ordering};\nuse std::sync::mpsc::{channel, Receiver, RecvTimeoutError};\nuse std::sync::Arc;\nuse std::thread;\nuse std::time::Duration;\n\nuse crate::bitset::Bitset;\nuse crate::model::{Event, EventKind, Events, Model, Operations, Value};\n\nenum EntryKind {\n    CallEntry,\n    ReturnEntry,\n}\n\nstruct Entry<T> {\n    pub kind: EntryKind,\n    pub value: T,\n    pub id: usize,\n    pub time: i64,\n}\n\nfn make_entries<I: Debug, O: Debug>(history: Operations<I, O>) -> Vec<Entry<Value<I, O>>> {\n    let mut entries = Vec::new();\n    for (id, elem) in history.into_iter().enumerate() {\n        entries.push(Entry {\n            kind: EntryKind::CallEntry,\n            value: Value::Input(elem.input),\n            id,\n            time: elem.call,\n        });\n        entries.push(Entry {\n            kind: EntryKind::ReturnEntry,\n            value: Value::Output(elem.output),\n            id,\n            time: elem.finish,\n        })\n    }\n    entries.sort_by(|a, b| a.time.partial_cmp(&b.time).unwrap());\n    entries\n}\n\nstruct LinkedNodes<T: Debug> {\n    head: Option<LinkNode<T>>,\n}\n\nimpl<T: Debug> LinkedNodes<T> {\n    pub fn new() -> Self {\n        LinkedNodes { head: None }\n    }\n\n    pub fn head(&self) -> Option<LinkNode<T>> {\n        self.head.clone()\n    }\n\n    pub fn from_entries(entries: Vec<Entry<T>>) -> Self {\n        let mut matches: HashMap<usize, LinkNode<T>> = HashMap::new();\n        let mut nodes = Self::new();\n\n        for entry in entries.into_iter().rev() {\n            nodes.push_front(match entry.kind {\n                EntryKind::CallEntry => Rc::new(RefCell::new(Node {\n                    value: entry.value,\n                    matched: matches.get(&entry.id).cloned(),\n                    id: entry.id,\n                    next: None,\n                    prev: None,\n                })),\n                EntryKind::ReturnEntry => {\n                    let node = Rc::new(RefCell::new(Node {\n                        value: entry.value,\n                        matched: None,\n                        id: entry.id,\n                        next: None,\n                        prev: None,\n                    }));\n                    matches.insert(entry.id, node.clone());\n                    node\n                }\n            })\n        }\n\n        nodes\n    }\n\n    pub fn len(&self) -> usize {\n        let mut len = 0;\n        let mut entry = self.head.clone();\n        while let Some(e) = entry {\n            entry = e.borrow().next.clone();\n            len += 1;\n        }\n        len\n    }\n\n    pub fn push_front(&mut self, new_head: LinkNode<T>) {\n        match self.head.take() {\n            Some(old_head) => {\n                old_head.borrow_mut().prev = Some(new_head.clone());\n                new_head.borrow_mut().next = Some(old_head);\n                self.head = Some(new_head);\n            }\n            None => {\n                self.head = Some(new_head);\n            }\n        }\n    }\n}\n\ntype LinkNode<T> = Rc<RefCell<Node<T>>>;\n\nstruct Node<T: Debug> {\n    pub value: T,\n    pub matched: Option<LinkNode<T>>,\n    pub id: usize,\n    pub next: Option<LinkNode<T>>,\n    pub prev: Option<LinkNode<T>>,\n}\n\nfn renumber<T>(events: Vec<Event<T>>) -> Vec<Event<T>> {\n    let mut e = Vec::new();\n    let mut m: HashMap<usize, usize> = HashMap::new(); // renumbering\n    let mut id: usize = 0;\n    for event in events {\n        e.push(Event {\n            kind: event.kind,\n            value: event.value,\n            id: *m.entry(event.id).or_insert_with(|| {\n                id += 1;\n                id - 1\n            }),\n        });\n    }\n    e\n}\n\nfn convert_entries<T>(events: Vec<Event<T>>) -> Vec<Entry<T>> {\n    let mut entries = Vec::new();\n    for event in events {\n        entries.push(match event.kind {\n            EventKind::CallEvent => Entry {\n                kind: EntryKind::CallEntry,\n                value: event.value,\n                id: event.id,\n                time: -1,\n            },\n            EventKind::ReturnEvent => Entry {\n                kind: EntryKind::ReturnEntry,\n                value: event.value,\n                id: event.id,\n                time: -1,\n            },\n        })\n    }\n    entries\n}\n\nstruct CacheEntry<T> {\n    linearized: Bitset,\n    state: T,\n}\n\nfn cache_contains<M: Model>(\n    model: &M,\n    cache: &HashMap<u64, Vec<CacheEntry<M::State>>>,\n    entry: &CacheEntry<M::State>,\n) -> bool {\n    if cache.contains_key(&entry.linearized.hash()) {\n        for elem in &cache[&entry.linearized.hash()] {\n            if entry.linearized.equals(&elem.linearized) && model.equal(&entry.state, &elem.state) {\n                return true;\n            }\n        }\n    }\n    false\n}\n\nstruct CallsEntry<V: Debug, T> {\n    entry: Option<LinkNode<V>>,\n    state: T,\n}\n\nfn lift<T: Debug>(entry: &LinkNode<T>) {\n    let prev = Ref::map(entry.borrow(), |e| e.prev.as_ref().unwrap());\n    prev.borrow_mut().next = entry.borrow().next.clone();\n    let next = Ref::map(entry.borrow(), |e| e.next.as_ref().unwrap());\n    next.borrow_mut().prev = entry.borrow().prev.clone();\n\n    let matched = Ref::map(entry.borrow(), |e| e.matched.as_ref().unwrap());\n    let matched_prev = Ref::map(matched.borrow(), |e| e.prev.as_ref().unwrap());\n    matched_prev.borrow_mut().next = matched.borrow().next.clone();\n    if matched.borrow().next.is_some() {\n        let matched_next = Ref::map(matched.borrow(), |e| e.next.as_ref().unwrap());\n        matched_next.borrow_mut().prev = matched.borrow().prev.clone();\n    }\n}\n\nfn unlift<T: Debug>(entry: &LinkNode<T>) {\n    {\n        let matched = Ref::map(entry.borrow(), |e| e.matched.as_ref().unwrap());\n        let matched_prev = Ref::map(matched.borrow(), |e| e.prev.as_ref().unwrap());\n        matched_prev.borrow_mut().next = Some(matched.clone());\n        if matched.borrow().next.is_some() {\n            let matched_next = Ref::map(matched.borrow(), |e| e.next.as_ref().unwrap());\n            matched_next.borrow_mut().prev = Some(matched.clone());\n        }\n    }\n\n    let prev = Ref::map(entry.borrow(), |e| e.prev.as_ref().unwrap());\n    prev.borrow_mut().next = Some(entry.clone());\n    let next = Ref::map(entry.borrow(), |e| e.next.as_ref().unwrap());\n    next.borrow_mut().prev = Some(entry.clone());\n}\n\nfn check_single<M: Model>(\n    model: M,\n    mut subhistory: LinkedNodes<Value<M::Input, M::Output>>,\n    kill: Arc<AtomicBool>,\n) -> bool {\n    let n = subhistory.len() / 2;\n    let mut linearized = Bitset::new(n);\n    let mut cache = HashMap::new();\n    let mut calls = vec![];\n\n    let mut state = model.init();\n    subhistory.push_front(Rc::new(RefCell::new(Node {\n        value: Value::None,\n        matched: None,\n        id: usize::max_value(),\n        prev: None,\n        next: None,\n    })));\n    let head_entry = subhistory.head().unwrap();\n    let mut entry = head_entry.borrow().next.clone();\n    while head_entry.borrow().next.is_some() {\n        if kill.load(Ordering::SeqCst) {\n            return false;\n        }\n        let matched = entry.as_ref().unwrap().borrow().matched.clone();\n        entry = if let Some(matching) = matched {\n            // the return entry\n            let res = model.step(\n                &state,\n                entry.as_ref().unwrap().borrow().value.input(),\n                matching.borrow().value.output(),\n            );\n            match res {\n                (true, new_state) => {\n                    let mut new_linearized = linearized.clone();\n                    new_linearized.set(entry.as_ref().unwrap().borrow().id);\n                    let new_cache_entry = CacheEntry {\n                        linearized: new_linearized.clone(),\n                        state: new_state.clone(),\n                    };\n                    if !cache_contains(&model, &cache, &new_cache_entry) {\n                        let hash = new_linearized.hash();\n                        cache.entry(hash).or_default().push(new_cache_entry);\n                        calls.push(CallsEntry {\n                            entry: entry.clone(),\n                            state,\n                        });\n                        state = new_state;\n                        linearized.set(entry.as_ref().unwrap().borrow().id);\n                        lift(entry.as_ref().unwrap());\n                        head_entry.borrow().next.clone()\n                    } else {\n                        entry.as_ref().unwrap().borrow().next.clone()\n                    }\n                }\n                (false, _) => entry.as_ref().unwrap().borrow().next.clone(),\n            }\n        } else {\n            if calls.is_empty() {\n                return false;\n            }\n            let calls_top = calls.pop().unwrap();\n            entry = calls_top.entry;\n            state = calls_top.state;\n            linearized.clear(entry.as_ref().unwrap().borrow().id);\n            unlift(entry.as_ref().unwrap());\n            entry.as_ref().unwrap().borrow().next.clone()\n        }\n    }\n    true\n}\n\npub fn check_operations<M: Model>(model: M, history: Operations<M::Input, M::Output>) -> bool {\n    check_operations_timeout(model, history, Duration::new(0, 0))\n}\n\n// timeout = 0 means no timeout\n// if this operation times out, then a false positive is possible\npub fn check_operations_timeout<M: Model>(\n    model: M,\n    history: Operations<M::Input, M::Output>,\n    timeout: Duration,\n) -> bool {\n    let partitions = model.partition(history);\n\n    let (tx, rx) = channel();\n    let mut handles = vec![];\n    let kill = Arc::new(AtomicBool::new(false));\n    let count = partitions.len();\n    for subhistory in partitions {\n        let tx = tx.clone();\n        let kill = Arc::clone(&kill);\n        let m = model.clone();\n        let handle = thread::spawn(move || {\n            let l = LinkedNodes::from_entries(make_entries(subhistory));\n            let _ = tx.send(check_single(m, l, kill));\n        });\n        handles.push(handle);\n    }\n\n    let res = wait_res(rx, kill, count, timeout);\n    for handle in handles {\n        handle.join().unwrap();\n    }\n    res\n}\n\npub fn check_events<M: Model>(model: M, history: Events<M::Input, M::Output>) -> bool {\n    check_events_timeout(model, history, Duration::new(0, 0))\n}\n\n// timeout = 0 means no timeout\n// if this operation times out, then a false positive is possible\npub fn check_events_timeout<M: Model>(\n    model: M,\n    history: Events<M::Input, M::Output>,\n    timeout: Duration,\n) -> bool {\n    let partitions = model.partition_event(history);\n\n    let (tx, rx) = channel();\n    let mut handles = vec![];\n    let kill = Arc::new(AtomicBool::new(false));\n    let count = partitions.len();\n    for subhistory in partitions {\n        let tx = tx.clone();\n        let kill = Arc::clone(&kill);\n        let m = model.clone();\n        let handle = thread::spawn(move || {\n            let l = LinkedNodes::from_entries(convert_entries(renumber(subhistory)));\n            let _ = tx.send(check_single(m, l, kill));\n        });\n        handles.push(handle);\n    }\n\n    let res = wait_res(rx, kill, count, timeout);\n    for handle in handles {\n        handle.join().unwrap();\n    }\n    res\n}\n\nfn wait_res(\n    rx: Receiver<bool>,\n    kill: Arc<AtomicBool>,\n    mut count: usize,\n    timeout: Duration,\n) -> bool {\n    let mut ok = true;\n    loop {\n        match if timeout.as_secs() == 0 && timeout.subsec_nanos() == 0 {\n            rx.recv().map_err(From::from)\n        } else {\n            rx.recv_timeout(timeout)\n        } {\n            Ok(res) => {\n                ok = ok && res;\n                if !ok {\n                    kill.store(true, Ordering::SeqCst);\n                    break;\n                }\n                count -= 1;\n                if count == 0 {\n                    break;\n                }\n            }\n            Err(RecvTimeoutError::Timeout) => break,\n            Err(e) => panic!(\"recv err: {}\", e),\n        }\n    }\n    ok\n}\n"
  },
  {
    "path": "courses/dss/linearizability/src/model.rs",
    "content": "use std::cmp::PartialEq;\nuse std::fmt::Debug;\nuse std::fmt::Display;\nuse std::marker::Send;\n\n#[derive(Debug)]\npub enum Value<I: Debug, O: Debug> {\n    Input(I),\n    Output(O),\n    None,\n}\n\nimpl<I: Debug, O: Debug> Value<I, O> {\n    pub fn input(&self) -> &I {\n        if let Value::Input(i) = self {\n            i\n        } else {\n            panic!(\"Not a input\")\n        }\n    }\n\n    pub fn output(&self) -> &O {\n        if let Value::Output(o) = self {\n            o\n        } else {\n            panic!(\"Not a output\")\n        }\n    }\n}\n\n#[derive(Debug)]\npub struct Operation<I: Debug, O: Debug> {\n    pub input: I,\n    pub call: i64, // invocation time\n    pub output: O,\n    pub finish: i64, // response time\n}\n\npub enum EventKind {\n    CallEvent,\n    ReturnEvent,\n}\n\npub struct Event<T> {\n    pub kind: EventKind,\n    pub value: T,\n    pub id: usize,\n}\n\npub type Operations<I, O> = Vec<Operation<I, O>>;\npub type Events<I, O> = Vec<Event<Value<I, O>>>;\n\npub trait Model: Clone + Send + 'static {\n    type State: Clone + Display + PartialEq;\n    type Input: Send + Debug + 'static;\n    type Output: Send + Debug + 'static;\n\n    // Partition functions, such that a history is linearizable if an only\n    // if each partition is linearizable. If you don't want to implement\n    // this, you can always use the `NoPartition` functions implemented\n    // below.\n    fn partition(\n        &self,\n        history: Operations<Self::Input, Self::Output>,\n    ) -> Vec<Operations<Self::Input, Self::Output>> {\n        vec![history]\n    }\n\n    fn partition_event(\n        &self,\n        history: Events<Self::Input, Self::Output>,\n    ) -> Vec<Events<Self::Input, Self::Output>> {\n        vec![history]\n    }\n\n    // Initial state of the system.\n    fn init(&self) -> Self::State;\n\n    // Step function for the system. Returns whether or not the system\n    // could take this step with the given inputs and outputs and also\n    // returns the new state. This should not mutate the existing state.\n    fn step(\n        &self,\n        state: &Self::State,\n        input: &Self::Input,\n        output: &Self::Output,\n    ) -> (bool, Self::State);\n\n    // Equality on states. If you are using a simple data type for states,\n    // you can use the `ShallowEqual` function implemented below.\n    fn equal(&self, state1: &Self::State, state2: &Self::State) -> bool {\n        state1 == state2\n    }\n}\n"
  },
  {
    "path": "courses/dss/linearizability/src/models.rs",
    "content": "use std::collections::HashMap;\n\nuse super::model::{EventKind, Events, Model, Operations};\n\n#[derive(Clone, Debug)]\npub enum Op {\n    Get,\n    Put,\n    Append,\n}\n\n#[derive(Clone, Debug)]\npub struct KvInput {\n    pub op: Op,\n    pub key: String,\n    pub value: String,\n}\n\n#[derive(Clone, Debug)]\npub struct KvOutput {\n    pub value: String,\n}\n\n#[derive(Clone, Default)]\npub struct KvModel {}\n\nimpl Model for KvModel {\n    type State = String;\n    type Input = KvInput;\n    type Output = KvOutput;\n\n    fn partition(\n        &self,\n        history: Operations<Self::Input, Self::Output>,\n    ) -> Vec<Operations<Self::Input, Self::Output>> {\n        let mut map = HashMap::new();\n        for op in history {\n            let v = map.entry(op.input.key.clone()).or_insert_with(Vec::new);\n            (*v).push(op);\n        }\n        let mut ret = vec![];\n        for (_, ops) in map {\n            ret.push(ops);\n        }\n        ret\n    }\n\n    fn partition_event(\n        &self,\n        history: Events<Self::Input, Self::Output>,\n    ) -> Vec<Events<Self::Input, Self::Output>> {\n        let mut m = HashMap::new();\n        let mut matched: HashMap<usize, String> = HashMap::new();\n        for event in history {\n            match event.kind {\n                EventKind::CallEvent => {\n                    let key = event.value.input().key.clone();\n                    matched.insert(event.id, key.clone());\n                    m.entry(key).or_insert_with(Vec::new).push(event);\n                }\n                EventKind::ReturnEvent => {\n                    let key = matched[&event.id].clone();\n                    m.entry(key).or_insert_with(Vec::new).push(event);\n                }\n            }\n        }\n        let mut ret = vec![];\n        for (_, v) in m {\n            ret.push(v);\n        }\n        ret\n    }\n\n    fn init(&self) -> Self::State {\n        // note: we are modeling a single key's value here;\n        // we're partitioning by key, so this is okay\n        \"\".to_string()\n    }\n\n    fn step(\n        &self,\n        state: &Self::State,\n        input: &Self::Input,\n        output: &Self::Output,\n    ) -> (bool, Self::State) {\n        match input.op {\n            Op::Get => (&output.value == state, state.clone()),\n            Op::Put => (true, input.value.clone()),\n            Op::Append => (true, state.clone() + &input.value),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::collections::HashMap;\n    use std::fs::File;\n    use std::io::{BufRead, BufReader, Result};\n\n    use super::super::check_events;\n    use super::{KvInput, KvModel, KvOutput, Op};\n    use crate::model::{Event, EventKind, Events, Model, Value};\n    use regex::Regex;\n\n    fn check_kv(log_name: String, correct: bool) {\n        let model = KvModel {};\n\n        let file_name = format!(\"../linearizability/test_data/{}.txt\", &log_name);\n        let events = match parse_kv_log(&file_name) {\n            Ok(events) => events,\n            Err(e) => panic!(\"parse kv log {} failed: {}\", &file_name, e),\n        };\n        assert_eq!(check_events(model, events), correct);\n    }\n\n    fn parse_kv_log(\n        file_name: &str,\n    ) -> Result<Events<<KvModel as Model>::Input, <KvModel as Model>::Output>> {\n        lazy_static::lazy_static! {\n            static ref INVOKE_GET: Regex = Regex::new(\n                r#\"\\{:process (\\d+), :type :invoke, :f :get, :key \"(.*)\", :value nil\\}\"#\n            )\n            .unwrap();\n            static ref INVOKE_PUT: Regex = Regex::new(\n                r#\"\\{:process (\\d+), :type :invoke, :f :put, :key \"(.*)\", :value \"(.*)\"\\}\"#\n            )\n            .unwrap();\n            static ref INVOKE_APPEND: Regex = Regex::new(\n                r#\"\\{:process (\\d+), :type :invoke, :f :append, :key \"(.*)\", :value \"(.*)\"\\}\"#\n            )\n            .unwrap();\n            static ref RETURN_GET: Regex =\n                Regex::new(r#\"\\{:process (\\d+), :type :ok, :f :get, :key \".*\", :value \"(.*)\"\\}\"#)\n                    .unwrap();\n            static ref RETURN_PUT: Regex =\n                Regex::new(r#\"\\{:process (\\d+), :type :ok, :f :put, :key \".*\", :value \".*\"\\}\"#)\n                    .unwrap();\n            static ref RETURN_APPEND: Regex =\n                Regex::new(r#\"\\{:process (\\d+), :type :ok, :f :append, :key \".*\", :value \".*\"\\}\"#)\n                    .unwrap();\n        }\n\n        let f = File::open(file_name)?;\n        let buf_reader = BufReader::new(f);\n        let mut events = vec![];\n        let mut id = 0;\n        let mut procid_map: HashMap<isize, usize> = HashMap::new();\n\n        for line in buf_reader.lines() {\n            let contents = line.unwrap();\n            if let Some(args) = INVOKE_GET.captures(&contents) {\n                events.push(Event {\n                    kind: EventKind::CallEvent,\n                    value: Value::Input(KvInput {\n                        op: Op::Get,\n                        key: args[2].to_string(),\n                        value: \"\".to_string(),\n                    }),\n                    id,\n                });\n                procid_map.insert(args[1].to_string().parse().unwrap(), id);\n                id += 1;\n            } else if let Some(args) = INVOKE_PUT.captures(&contents) {\n                events.push(Event {\n                    kind: EventKind::CallEvent,\n                    value: Value::Input(KvInput {\n                        op: Op::Put,\n                        key: args[2].to_string(),\n                        value: args[3].to_string(),\n                    }),\n                    id,\n                });\n                procid_map.insert(args[1].to_string().parse().unwrap(), id);\n                id += 1;\n            } else if let Some(args) = INVOKE_APPEND.captures(&contents) {\n                events.push(Event {\n                    kind: EventKind::CallEvent,\n                    value: Value::Input(KvInput {\n                        op: Op::Append,\n                        key: args[2].to_string(),\n                        value: args[3].to_string(),\n                    }),\n                    id,\n                });\n                procid_map.insert(args[1].to_string().parse().unwrap(), id);\n                id += 1;\n            } else if let Some(args) = RETURN_GET.captures(&contents) {\n                let match_id = procid_map\n                    .remove(&args[1].to_string().parse().unwrap())\n                    .unwrap();\n                events.push(Event {\n                    kind: EventKind::ReturnEvent,\n                    value: Value::Output(KvOutput {\n                        value: args[2].to_string(),\n                    }),\n                    id: match_id,\n                });\n            } else if let Some(args) = RETURN_PUT.captures(&contents) {\n                let match_id = procid_map\n                    .remove(&args[1].to_string().parse().unwrap())\n                    .unwrap();\n                events.push(Event {\n                    kind: EventKind::ReturnEvent,\n                    value: Value::Output(KvOutput {\n                        value: \"\".to_string(),\n                    }),\n                    id: match_id,\n                });\n            } else if let Some(args) = RETURN_APPEND.captures(&contents) {\n                let match_id = procid_map\n                    .remove(&args[1].to_string().parse().unwrap())\n                    .unwrap();\n                events.push(Event {\n                    kind: EventKind::ReturnEvent,\n                    value: Value::Output(KvOutput {\n                        value: \"\".to_string(),\n                    }),\n                    id: match_id,\n                });\n            } else {\n                unreachable!();\n            }\n        }\n\n        for (_, match_id) in procid_map {\n            events.push(Event {\n                kind: EventKind::ReturnEvent,\n                value: Value::Output(KvOutput {\n                    value: \"\".to_string(),\n                }),\n                id: match_id,\n            })\n        }\n        Ok(events)\n    }\n\n    #[test]\n    fn test_kv_1client_ok() {\n        check_kv(\"c01-ok\".to_string(), true)\n    }\n\n    #[test]\n    fn test_kv_1client_bad() {\n        check_kv(\"c01-bad\".to_string(), false)\n    }\n\n    #[test]\n    fn test_kv_10client_ok() {\n        check_kv(\"c10-ok\".to_string(), true)\n    }\n\n    #[test]\n    fn test_kv_10client_bad() {\n        check_kv(\"c10-bad\".to_string(), false)\n    }\n\n    #[test]\n    fn test_kv_50client_ok() {\n        check_kv(\"c50-ok\".to_string(), true)\n    }\n\n    #[test]\n    fn test_kv_50client_bad() {\n        check_kv(\"c50-bad\".to_string(), false)\n    }\n}\n"
  },
  {
    "path": "courses/dss/linearizability/test_data/c01-bad.txt",
    "content": "{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 1 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 2 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 2 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 3 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 4 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 5 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 6 y\"}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"3\", :value \"\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 7 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 0 0 yx 0 1 yx 0 2 yx 0 3 yx 0 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 8 y\"}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 0 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 0 0 yx 0 1 yx 0 2 yx 0 3 yx 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 1 y\"}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :put, :key \"1\", :value \"x 0 2 y\"}\n{:process 0, :type :ok, :f :put, :key \"1\", :value \"x 0 2 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 3 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 4 y\"}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 5 y\"}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 6 y\"}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 7 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 8 y\"}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 9 y\"}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 0 0 yx 0 3 y\"}\n{:process 0, :type :invoke, :f :put, :key \"2\", :value \"x 0 10 y\"}\n{:process 0, :type :ok, :f :put, :key \"2\", :value \"x 0 10 y\"}"
  },
  {
    "path": "courses/dss/linearizability/test_data/c01-ok.txt",
    "content": "{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 1 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 2 y\"}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 2 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 3 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 4 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 5 y\"}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 0 2 yx 0 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 6 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 7 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 8 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 8 y\"}\n{:process 0, :type :invoke, :f :put, :key \"9\", :value \"x 0 9 y\"}\n{:process 0, :type :ok, :f :put, :key \"9\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 10 y\"}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 10 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 11 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 11 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 12 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 12 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 0 12 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 0 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 0 12 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 1 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 2 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 2 y\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 3 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 4 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 0 12 yx 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 0 12 yx 0 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 5 y\"}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 6 y\"}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 7 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 0 0 yx 0 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 8 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 9 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :put, :key \"4\", :value \"x 0 10 y\"}\n{:process 0, :type :ok, :f :put, :key \"4\", :value \"x 0 10 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 0 10 yx 0 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 11 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 11 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 12 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 12 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 13 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 13 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 14 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 14 y\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"3\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"3\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 0 4 yx 0 0 yx 0 1 yx 0 7 yx 0 11 yx 0 13 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 15 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 15 y\"}\n{:process 0, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"3\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 6 yx 0 7 yx 0 11 yx 0 2 yx 0 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 16 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 16 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 17 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 17 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 18 y\"}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 18 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 19 y\"}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 19 y\"}"
  },
  {
    "path": "courses/dss/linearizability/test_data/c10-bad.txt",
    "content": "{:process 9, :type :invoke, :f :append, :key \"0\", :value \"x 9 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"1\", :value \"x 4 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :invoke, :f :append, :key \"9\", :value \"x 2 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 7, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 5, :type :invoke, :f :put, :key \"8\", :value \"x 5 0 y\"}\n{:process 1, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 1, :type :invoke, :f :put, :key \"8\", :value \"x 1 0 y\"}\n{:process 7, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 0 y\"}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 0 y\"}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 0 y\"}\n{:process 3, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"4\", :value \"\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 1 y\"}\n{:process 9, :type :ok, :f :append, :key \"0\", :value \"x 9 0 y\"}\n{:process 9, :type :invoke, :f :append, :key \"3\", :value \"x 9 1 y\"}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 1 y\"}\n{:process 3, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"3\", :value \"x 9 1 y\"}\n{:process 9, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 3, :type :invoke, :f :put, :key \"8\", :value \"x 3 2 y\"}\n{:process 3, :type :ok, :f :put, :key \"8\", :value \"x 3 2 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 3 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :put, :key \"2\", :value \"x 0 1 y\"}\n{:process 0, :type :ok, :f :put, :key \"2\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 2 y\"}\n{:process 9, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 2 y\"}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :put, :key \"8\", :value \"x 5 0 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 1 y\"}\n{:process 1, :type :ok, :f :put, :key \"8\", :value \"x 1 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"2\", :value \"x 0 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 1 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"1\", :value \"x 3 0 yx 3 1 yx 4 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 0 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"7\", :value \"x 5 2 y\"}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 9 1 y\"}\n{:process 1, :type :invoke, :f :append, :key \"2\", :value \"x 1 1 y\"}\n{:process 6, :type :ok, :f :get, :key \"1\", :value \"x 3 0 yx 3 1 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 1 y\"}\n{:process 2, :type :ok, :f :append, :key \"9\", :value \"x 2 0 y\"}\n{:process 2, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 2 y\"}\n{:process 9, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 y\"}\n{:process 9, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 y\"}\n{:process 9, :type :invoke, :f :append, :key \"2\", :value \"x 9 3 y\"}\n{:process 9, :type :ok, :f :append, :key \"2\", :value \"x 9 3 y\"}\n{:process 9, :type :invoke, :f :append, :key \"2\", :value \"x 9 4 y\"}\n{:process 9, :type :ok, :f :append, :key \"2\", :value \"x 9 4 y\"}\n{:process 9, :type :invoke, :f :append, :key \"2\", :value \"x 9 5 y\"}\n{:process 9, :type :ok, :f :append, :key \"2\", :value \"x 9 5 y\"}\n{:process 9, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 2 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 3 3 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 0 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 1 y\"}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 3 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 3 y\"}\n{:process 9, :type :ok, :f :get, :key \"4\", :value \"x 7 0 y\"}\n{:process 9, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"2\", :value \"x 0 1 yx 9 3 yx 9 4 yx 9 5 yx 8 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"5\", :value \"x 3 3 y\"}\n{:process 9, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"1\", :value \"x 3 0 yx 3 1 y\"}\n{:process 9, :type :invoke, :f :append, :key \"3\", :value \"x 9 6 y\"}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 2 y\"}\n{:process 2, :type :ok, :f :get, :key \"2\", :value \"x 0 1 yx 9 3 yx 9 4 yx 9 5 yx 8 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 4 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 2 y\"}\n{:process 7, :type :invoke, :f :append, :key \"6\", :value \"x 7 3 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 9 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 2 y\"}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 5 y\"}\n{:process 7, :type :ok, :f :append, :key \"6\", :value \"x 7 3 y\"}\n{:process 7, :type :invoke, :f :put, :key \"4\", :value \"x 7 4 y\"}\n{:process 2, :type :ok, :f :get, :key \"3\", :value \"x 9 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 2, :type :invoke, :f :append, :key \"6\", :value \"x 2 1 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 6 y\"}\n{:process 9, :type :ok, :f :append, :key \"3\", :value \"x 9 6 y\"}\n{:process 9, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 8 0 yx 7 1 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 7 y\"}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 2 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 3 y\"}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 7 y\"}\n{:process 9, :type :invoke, :f :append, :key \"2\", :value \"x 9 8 y\"}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 4 y\"}\n{:process 9, :type :ok, :f :append, :key \"2\", :value \"x 9 8 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 4 y\"}\n{:process 9, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 7, :type :ok, :f :put, :key \"4\", :value \"x 7 4 y\"}\n{:process 7, :type :invoke, :f :append, :key \"8\", :value \"x 7 5 y\"}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 7 y\"}\n{:process 7, :type :ok, :f :append, :key \"8\", :value \"x 7 5 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 6 y\"}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 6 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 7 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 8 y\"}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 8 0 yx 7 1 yx 0 6 yx 7 6 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 7 y\"}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 8 y\"}\n{:process 0, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 9, :type :invoke, :f :append, :key \"1\", :value \"x 9 9 y\"}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 0 2 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 9 1 y\"}\n{:process 8, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"4\", :value \"x 7 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 8 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 5 y\"}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 1 yx 9 3 yx 9 4 yx 9 5 yx 8 1 yx 0 3 yx 0 4 yx 9 8 yx 8 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 9 y\"}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 7 y\"}\n{:process 7, :type :invoke, :f :append, :key \"2\", :value \"x 7 8 y\"}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 8 0 yx 7 1 yx 0 6 yx 7 6 yx 7 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 1 yx 9 3 yx 9 4 yx 9 5 yx 8 1 yx 0 3 yx 0 4 yx 9 8 yx 8 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 3 0 yx 3 1 yx 4 0 yx 8 2 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 10 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 10 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 11 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 1 y\"}\n{:process 6, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 y\"}\n{:process 6, :type :invoke, :f :append, :key \"3\", :value \"x 6 2 y\"}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 11 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 12 y\"}\n{:process 7, :type :ok, :f :append, :key \"2\", :value \"x 7 8 y\"}\n{:process 7, :type :invoke, :f :append, :key \"6\", :value \"x 7 9 y\"}\n{:process 6, :type :ok, :f :append, :key \"3\", :value \"x 6 2 y\"}\n{:process 6, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"6\", :value \"x 7 9 y\"}\n{:process 7, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 12 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"2\", :value \"x 1 1 y\"}\n{:process 1, :type :invoke, :f :put, :key \"1\", :value \"x 1 2 y\"}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"x 0 2 yx 7 3 yx 0 8 yx 7 9 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 13 y\"}\n{:process 1, :type :ok, :f :put, :key \"1\", :value \"x 1 2 y\"}\n{:process 1, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"4\", :value \"x 7 4 yx 0 12 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 13 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 14 y\"}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 y\"}\n{:process 1, :type :invoke, :f :append, :key \"5\", :value \"x 1 3 y\"}\n{:process 6, :type :ok, :f :get, :key \"2\", :value \"x 0 1 yx 9 3 yx 9 4 yx 9 5 yx 8 1 yx 0 3 yx 0 4 yx 9 8 yx 8 4 yx 7 8 yx 1 1 y\"}\n{:process 6, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"4\", :value \"x 7 4 yx 0 12 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 yx 0 9 yx 0 13 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 10 y\"}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 3 y\"}\n{:process 9, :type :ok, :f :append, :key \"1\", :value \"x 9 9 y\"}\n{:process 9, :type :invoke, :f :put, :key \"6\", :value \"x 9 10 y\"}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 5 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 9 10 y\"}\n{:process 8, :type :invoke, :f :append, :key \"6\", :value \"x 8 6 y\"}\n{:process 8, :type :ok, :f :append, :key \"6\", :value \"x 8 6 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 8 0 yx 7 1 yx 0 6 yx 7 6 yx 7 7 yx 0 10 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 7 y\"}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 7 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 8 y\"}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 8 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 9 10 yx 8 6 y\"}\n{:process 8, :type :invoke, :f :append, :key \"6\", :value \"x 8 9 y\"}\n{:process 8, :type :ok, :f :append, :key \"6\", :value \"x 8 9 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 10 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 10 y\"}\n{:process 7, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"1\", :value \"x 1 2 yx 9 9 yx 8 7 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"1\", :value \"x 4 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"1\", :value \"x 4 1 y\"}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 14 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"1\", :value \"x 4 1 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 2 y\"}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 8 0 yx 7 1 yx 0 6 yx 7 6 yx 7 7 yx 0 10 yx 6 3 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 11 y\"}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 1 yx 9 3 yx 9 4 yx 9 5 yx 8 1 yx 0 3 yx 0 4 yx 9 8 yx 8 4 yx 7 8 yx 1 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 15 y\"}\n{:process 1, :type :ok, :f :append, :key \"5\", :value \"x 1 3 y\"}\n{:process 1, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"4\", :value \"x 7 4 yx 0 12 y\"}\n{:process 1, :type :invoke, :f :put, :key \"1\", :value \"x 1 4 y\"}\n{:process 2, :type :ok, :f :append, :key \"6\", :value \"x 2 1 y\"}\n{:process 2, :type :invoke, :f :append, :key \"2\", :value \"x 2 2 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 15 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 16 y\"}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 11 y\"}\n{:process 7, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 2 y\"}\n{:process 4, :type :invoke, :f :append, :key \"8\", :value \"x 4 3 y\"}\n{:process 1, :type :ok, :f :put, :key \"1\", :value \"x 1 4 y\"}\n{:process 1, :type :invoke, :f :append, :key \"0\", :value \"x 1 5 y\"}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 16 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 17 y\"}\n{:process 7, :type :ok, :f :get, :key \"4\", :value \"x 7 4 yx 0 12 yx 0 15 yx 4 2 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 12 y\"}\n{:process 4, :type :ok, :f :append, :key \"8\", :value \"x 4 3 y\"}\n{:process 4, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 y\"}\n{:process 4, :type :invoke, :f :append, :key \"2\", :value \"x 4 4 y\"}\n{:process 9, :type :ok, :f :put, :key \"6\", :value \"x 9 10 y\"}\n{:process 9, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 y\"}\n{:process 9, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 y\"}\n{:process 9, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 10 y\"}\n{:process 8, :type :invoke, :f :append, :key \"7\", :value \"x 8 11 y\"}\n{:process 8, :type :ok, :f :append, :key \"7\", :value \"x 8 11 y\"}\n{:process 8, :type :invoke, :f :put, :key \"4\", :value \"x 8 12 y\"}\n{:process 8, :type :ok, :f :put, :key \"4\", :value \"x 8 12 y\"}\n{:process 8, :type :invoke, :f :put, :key \"0\", :value \"x 8 13 y\"}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 3 y\"}\n{:process 6, :type :invoke, :f :append, :key \"3\", :value \"x 6 4 y\"}\n{:process 6, :type :ok, :f :append, :key \"3\", :value \"x 6 4 y\"}\n{:process 6, :type :invoke, :f :append, :key \"6\", :value \"x 6 5 y\"}\n{:process 9, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 y\"}\n{:process 9, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 8 0 yx 7 1 yx 0 6 yx 7 6 yx 7 7 yx 0 10 yx 6 3 yx 7 11 yx 1 5 y\"}\n{:process 9, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"6\", :value \"x 6 5 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 yx 0 9 yx 0 13 yx 0 14 y\"}\n{:process 6, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"2\", :value \"x 2 2 y\"}\n{:process 2, :type :invoke, :f :append, :key \"9\", :value \"x 2 3 y\"}\n{:process 9, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 yx 7 5 yx 4 3 y\"}\n{:process 9, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 y\"}\n{:process 9, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"2\", :value \"x 0 1 yx 9 3 yx 9 4 yx 9 5 yx 8 1 yx 0 3 yx 0 4 yx 9 8 yx 8 4 yx 7 8 yx 1 1 y\"}\n{:process 9, :type :invoke, :f :append, :key \"8\", :value \"x 9 11 y\"}\n{:process 6, :type :ok, :f :get, :key \"1\", :value \"x 1 4 yx 0 16 yx 0 17 y\"}\n{:process 6, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"1\", :value \"x 1 4 yx 0 16 yx 0 17 y\"}\n{:process 6, :type :invoke, :f :put, :key \"2\", :value \"x 6 6 y\"}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 12 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 13 y\"}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 13 y\"}\n{:process 7, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"0\", :value \"x 1 5 y\"}\n{:process 1, :type :invoke, :f :append, :key \"0\", :value \"x 1 6 y\"}\n{:process 7, :type :ok, :f :get, :key \"1\", :value \"x 1 4 yx 0 16 yx 0 17 y\"}\n{:process 7, :type :invoke, :f :append, :key \"9\", :value \"x 7 14 y\"}\n{:process 7, :type :ok, :f :append, :key \"9\", :value \"x 7 14 y\"}\n{:process 7, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"0\", :value \"x 1 6 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 8 13 yx 1 6 y\"}\n{:process 1, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"2\", :value \"x 0 1 yx 9 3 yx 9 4 yx 9 5 yx 8 1 yx 0 3 yx 0 4 yx 9 8 yx 8 4 yx 7 8 yx 1 1 yx 2 2 y\"}\n{:process 1, :type :invoke, :f :append, :key \"9\", :value \"x 1 7 y\"}\n{:process 7, :type :ok, :f :get, :key \"2\", :value \"x 0 1 yx 9 3 yx 9 4 yx 9 5 yx 8 1 yx 0 3 yx 0 4 yx 9 8 yx 8 4 yx 7 8 yx 1 1 yx 2 2 y\"}\n{:process 7, :type :invoke, :f :append, :key \"1\", :value \"x 7 15 y\"}\n{:process 9, :type :ok, :f :append, :key \"8\", :value \"x 9 11 y\"}\n{:process 9, :type :invoke, :f :append, :key \"4\", :value \"x 9 12 y\"}\n{:process 9, :type :ok, :f :append, :key \"4\", :value \"x 9 12 y\"}\n{:process 9, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 yx 0 9 yx 0 13 yx 0 14 yx 7 14 y\"}\n{:process 9, :type :invoke, :f :append, :key \"5\", :value \"x 9 13 y\"}\n{:process 1, :type :ok, :f :append, :key \"9\", :value \"x 1 7 y\"}\n{:process 7, :type :ok, :f :append, :key \"1\", :value \"x 7 15 y\"}\n{:process 4, :type :ok, :f :append, :key \"2\", :value \"x 4 4 y\"}\n{:process 5, :type :ok, :f :append, :key \"7\", :value \"x 5 2 y\"}\n{:process 9, :type :ok, :f :append, :key \"5\", :value \"x 9 13 y\"}\n{:process 2, :type :ok, :f :append, :key \"9\", :value \"x 2 3 y\"}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 3 y\"}\n{:process 8, :type :ok, :f :put, :key \"0\", :value \"x 8 13 y\"}\n{:process 6, :type :ok, :f :put, :key \"2\", :value \"x 6 6 y\"}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 17 y\"}\n{:process 1, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 2, :type :invoke, :f :append, :key \"9\", :value \"x 2 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :invoke, :f :append, :key \"9\", :value \"x 4 0 y\"}\n{:process 7, :type :invoke, :f :append, :key \"9\", :value \"x 7 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 0 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 0 y\"}\n{:process 6, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"2\", :value \"x 6 6 y\"}\n{:process 9, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"2\", :value \"x 6 6 y\"}\n{:process 1, :type :invoke, :f :append, :key \"1\", :value \"x 1 0 y\"}\n{:process 6, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 yx 9 13 y\"}\n{:process 6, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"9\", :value \"x 7 0 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 yx 9 13 y\"}\n{:process 7, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 y\"}\n{:process 9, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"1\", :value \"x 1 4 yx 0 16 yx 0 17 yx 7 15 y\"}\n{:process 9, :type :invoke, :f :append, :key \"5\", :value \"x 9 0 y\"}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 yx 0 9 yx 0 13 yx 0 14 yx 7 14 yx 1 7 yx 2 3 yx 7 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"2\", :value \"x 6 0 y\"}\n{:process 7, :type :ok, :f :get, :key \"2\", :value \"x 6 6 y\"}\n{:process 7, :type :invoke, :f :put, :key \"1\", :value \"x 7 1 y\"}\n{:process 7, :type :ok, :f :put, :key \"1\", :value \"x 7 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"7\", :value \"x 7 2 y\"}\n{:process 6, :type :ok, :f :append, :key \"2\", :value \"x 6 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"4\", :value \"x 8 12 yx 7 13 yx 9 12 y\"}\n{:process 6, :type :invoke, :f :put, :key \"0\", :value \"x 6 1 y\"}\n{:process 4, :type :ok, :f :append, :key \"9\", :value \"x 4 0 y\"}\n{:process 4, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 6, :type :ok, :f :put, :key \"0\", :value \"x 6 1 y\"}\n{:process 6, :type :invoke, :f :append, :key \"7\", :value \"x 6 2 y\"}\n{:process 6, :type :ok, :f :append, :key \"7\", :value \"x 6 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"2\", :value \"x 6 3 y\"}\n{:process 4, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 yx 7 2 yx 6 2 y\"}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 1 y\"}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 yx 7 5 yx 4 3 yx 9 11 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"2\", :value \"x 6 3 y\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 4 y\"}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"x 9 10 yx 8 6 yx 8 9 yx 2 1 yx 6 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 0 y\"}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 4 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 5 y\"}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"9\", :value \"x 2 0 y\"}\n{:process 2, :type :invoke, :f :append, :key \"1\", :value \"x 2 1 y\"}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 6 6 yx 6 0 yx 6 3 y\"}\n{:process 5, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"0\", :value \"x 6 1 y\"}\n{:process 5, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"0\", :value \"x 6 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 1 y\"}\n{:process 2, :type :ok, :f :append, :key \"1\", :value \"x 2 1 y\"}\n{:process 2, :type :invoke, :f :append, :key \"6\", :value \"x 2 2 y\"}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"1\", :value \"x 5 2 y\"}\n{:process 2, :type :ok, :f :append, :key \"6\", :value \"x 2 2 y\"}\n{:process 2, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 yx 7 2 yx 6 2 y\"}\n{:process 2, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 yx 0 9 yx 0 13 yx 0 14 yx 7 14 yx 1 7 yx 2 3 yx 7 0 yx 4 0 yx 6 4 yx 2 0 yx 5 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"1\", :value \"x 5 2 y\"}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 3 y\"}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 3 y\"}\n{:process 5, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 yx 7 5 yx 4 3 yx 9 11 y\"}\n{:process 2, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 y\"}\n{:process 2, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"6\", :value \"x 9 10 yx 8 6 yx 8 9 yx 2 1 yx 6 5 yx 2 2 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 4 y\"}\n{:process 2, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 yx 7 2 yx 6 2 y\"}\n{:process 2, :type :invoke, :f :append, :key \"5\", :value \"x 2 3 y\"}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 yx 9 13 yx 8 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 1 y\"}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 1 y\"}\n{:process 8, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 yx 7 2 yx 6 2 y\"}\n{:process 8, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 yx 9 13 yx 8 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 yx 0 9 yx 0 13 yx 0 14 yx 7 14 yx 1 7 yx 2 3 yx 7 0 yx 4 0 yx 6 4 yx 2 0 yx 5 1 yx 5 3 yx 3 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 yx 7 5 yx 4 3 yx 9 11 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :put, :key \"2\", :value \"x 0 1 y\"}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 6 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"4\", :value \"x 8 2 y\"}\n{:process 9, :type :ok, :f :append, :key \"5\", :value \"x 9 0 y\"}\n{:process 9, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"0\", :value \"x 6 1 y\"}\n{:process 9, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"2\", :value \"x 6 6 yx 6 0 yx 6 3 yx 0 0 y\"}\n{:process 9, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"2\", :value \"x 6 6 yx 6 0 yx 6 3 yx 0 0 y\"}\n{:process 9, :type :invoke, :f :append, :key \"4\", :value \"x 9 1 y\"}\n{:process 0, :type :ok, :f :put, :key \"2\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 2 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 5 y\"}\n{:process 6, :type :invoke, :f :append, :key \"2\", :value \"x 6 6 y\"}\n{:process 6, :type :ok, :f :append, :key \"2\", :value \"x 6 6 y\"}\n{:process 6, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"6\", :value \"x 9 10 yx 8 6 yx 8 9 yx 2 1 yx 6 5 yx 2 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"7\", :value \"x 6 7 y\"}\n{:process 6, :type :ok, :f :append, :key \"7\", :value \"x 6 7 y\"}\n{:process 6, :type :invoke, :f :append, :key \"3\", :value \"x 6 8 y\"}\n{:process 6, :type :ok, :f :append, :key \"3\", :value \"x 6 8 y\"}\n{:process 6, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 yx 7 2 yx 6 2 yx 6 7 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 9 y\"}\n{:process 8, :type :ok, :f :append, :key \"4\", :value \"x 8 2 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 3 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 9 y\"}\n{:process 6, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"6\", :value \"x 9 10 yx 8 6 yx 8 9 yx 2 1 yx 6 5 yx 2 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 10 y\"}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"6\", :value \"x 8 4 y\"}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 10 y\"}\n{:process 6, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 1 y\"}\n{:process 7, :type :ok, :f :append, :key \"7\", :value \"x 7 2 y\"}\n{:process 7, :type :invoke, :f :append, :key \"8\", :value \"x 7 3 y\"}\n{:process 6, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 yx 7 5 yx 4 3 yx 9 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"6\", :value \"x 8 4 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 yx 9 13 yx 8 0 yx 9 0 yx 6 5 yx 6 9 y\"}\n{:process 6, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"8\", :value \"x 7 3 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 yx 9 13 yx 8 0 yx 9 0 yx 6 5 yx 6 9 y\"}\n{:process 6, :type :invoke, :f :append, :key \"7\", :value \"x 6 11 y\"}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 6 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 4 y\"}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 1 y\"}\n{:process 3, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"7\", :value \"x 6 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 4 y\"}\n{:process 7, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 4 y\"}\n{:process 5, :type :invoke, :f :append, :key \"7\", :value \"x 5 5 y\"}\n{:process 3, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 yx 9 13 yx 8 0 yx 9 0 yx 6 5 yx 6 9 yx 3 1 yx 7 4 y\"}\n{:process 3, :type :invoke, :f :append, :key \"0\", :value \"x 3 2 y\"}\n{:process 7, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 y\"}\n{:process 7, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"6\", :value \"x 9 10 yx 8 6 yx 8 9 yx 2 1 yx 6 5 yx 2 2 yx 8 4 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"7\", :value \"x 5 5 y\"}\n{:process 5, :type :invoke, :f :append, :key \"5\", :value \"x 5 6 y\"}\n{:process 3, :type :ok, :f :append, :key \"0\", :value \"x 3 2 y\"}\n{:process 3, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"5\", :value \"x 5 6 y\"}\n{:process 5, :type :invoke, :f :append, :key \"1\", :value \"x 5 7 y\"}\n{:process 2, :type :ok, :f :append, :key \"5\", :value \"x 2 3 y\"}\n{:process 2, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"8\", :value \"x 1 0 yx 5 1 yx 7 5 yx 4 3 yx 9 11 yx 7 3 y\"}\n{:process 3, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"7\", :value \"x 8 5 y\"}\n{:process 2, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 y\"}\n{:process 2, :type :invoke, :f :put, :key \"4\", :value \"x 2 4 y\"}\n{:process 5, :type :ok, :f :append, :key \"1\", :value \"x 5 7 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 8 12 yx 7 13 yx 9 12 yx 8 2 yx 5 4 y\"}\n{:process 5, :type :invoke, :f :append, :key \"6\", :value \"x 5 8 y\"}\n{:process 5, :type :ok, :f :append, :key \"6\", :value \"x 5 8 y\"}\n{:process 5, :type :invoke, :f :append, :key \"1\", :value \"x 5 9 y\"}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 6 1 yx 3 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"3\", :value \"x 6 12 y\"}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 yx 9 13 yx 8 0 yx 9 0 y\"}\n{:process 7, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 5 y\"}\n{:process 3, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 y\"}\n{:process 3, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 3 y\"}\n{:process 9, :type :ok, :f :append, :key \"4\", :value \"x 9 1 y\"}\n{:process 9, :type :invoke, :f :put, :key \"2\", :value \"x 9 2 y\"}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 3 y\"}\n{:process 3, :type :invoke, :f :append, :key \"2\", :value \"x 3 4 y\"}\n{:process 3, :type :ok, :f :append, :key \"2\", :value \"x 3 4 y\"}\n{:process 3, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 yx 5 9 y\"}\n{:process 3, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 2, :type :ok, :f :put, :key \"4\", :value \"x 2 4 y\"}\n{:process 2, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 yx 5 9 y\"}\n{:process 2, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 yx 0 9 yx 0 13 yx 0 14 yx 7 14 yx 1 7 yx 2 3 yx 7 0 yx 4 0 yx 6 4 yx 2 0 yx 5 1 yx 5 3 yx 3 0 yx 6 10 y\"}\n{:process 2, :type :invoke, :f :append, :key \"3\", :value \"x 2 5 y\"}\n{:process 5, :type :ok, :f :append, :key \"1\", :value \"x 5 9 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 10 y\"}\n{:process 2, :type :ok, :f :append, :key \"3\", :value \"x 2 5 y\"}\n{:process 2, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 yx 5 9 y\"}\n{:process 2, :type :invoke, :f :append, :key \"6\", :value \"x 2 6 y\"}\n{:process 2, :type :ok, :f :append, :key \"6\", :value \"x 2 6 y\"}\n{:process 2, :type :invoke, :f :append, :key \"6\", :value \"x 2 7 y\"}\n{:process 3, :type :ok, :f :get, :key \"6\", :value \"x 9 10 yx 8 6 yx 8 9 yx 2 1 yx 6 5 yx 2 2 yx 8 4 yx 5 8 y\"}\n{:process 3, :type :invoke, :f :put, :key \"6\", :value \"x 3 5 y\"}\n{:process 2, :type :ok, :f :append, :key \"6\", :value \"x 2 7 y\"}\n{:process 2, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 yx 0 9 yx 0 13 yx 0 14 yx 7 14 yx 1 7 yx 2 3 yx 7 0 yx 4 0 yx 6 4 yx 2 0 yx 5 1 yx 5 3 yx 3 0 yx 6 10 y\"}\n{:process 2, :type :invoke, :f :append, :key \"4\", :value \"x 2 8 y\"}\n{:process 9, :type :ok, :f :put, :key \"2\", :value \"x 9 2 y\"}\n{:process 9, :type :invoke, :f :append, :key \"1\", :value \"x 9 3 y\"}\n{:process 2, :type :ok, :f :append, :key \"4\", :value \"x 2 8 y\"}\n{:process 2, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"1\", :value \"x 9 3 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 4 y\"}\n{:process 2, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 yx 7 2 yx 6 2 yx 6 7 yx 6 11 yx 5 5 y\"}\n{:process 2, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 yx 2 5 y\"}\n{:process 2, :type :invoke, :f :append, :key \"5\", :value \"x 2 9 y\"}\n{:process 6, :type :ok, :f :append, :key \"3\", :value \"x 6 12 y\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 13 y\"}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 13 y\"}\n{:process 6, :type :invoke, :f :append, :key \"8\", :value \"x 6 14 y\"}\n{:process 6, :type :ok, :f :append, :key \"8\", :value \"x 6 14 y\"}\n{:process 6, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 yx 5 9 yx 9 3 y\"}\n{:process 6, :type :invoke, :f :append, :key \"1\", :value \"x 6 15 y\"}\n{:process 6, :type :ok, :f :append, :key \"1\", :value \"x 6 15 y\"}\n{:process 6, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"4\", :value \"x 2 4 yx 9 1 yx 2 8 y\"}\n{:process 6, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 yx 5 9 yx 9 3 yx 6 15 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 6 0 yx 2 0 yx 0 9 yx 0 13 yx 0 14 yx 7 14 yx 1 7 yx 2 3 yx 7 0 yx 4 0 yx 6 4 yx 2 0 yx 5 1 yx 5 3 yx 3 0 yx 6 10 yx 6 13 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 16 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 16 y\"}\n{:process 6, :type :invoke, :f :append, :key \"6\", :value \"x 6 17 y\"}\n{:process 1, :type :ok, :f :append, :key \"1\", :value \"x 1 0 y\"}\n{:process 1, :type :invoke, :f :append, :key \"9\", :value \"x 1 1 y\"}\n{:process 6, :type :ok, :f :append, :key \"6\", :value \"x 6 17 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 3, :type :ok, :f :put, :key \"6\", :value \"x 3 5 y\"}\n{:process 3, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 10 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 yx 5 9 yx 9 3 yx 6 15 y\"}\n{:process 3, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"0\", :value \"x 6 1 yx 3 2 y\"}\n{:process 3, :type :invoke, :f :append, :key \"6\", :value \"x 3 6 y\"}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 9 2 yx 3 4 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 2 4 yx 9 1 yx 2 8 yx 5 10 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 9 2 yx 3 4 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 11 y\"}\n{:process 3, :type :ok, :f :append, :key \"6\", :value \"x 3 6 y\"}\n{:process 3, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"4\", :value \"x 2 4 yx 9 1 yx 2 8 yx 5 10 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 7 y\"}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 11 y\"}\n{:process 5, :type :invoke, :f :append, :key \"2\", :value \"x 5 12 y\"}\n{:process 5, :type :ok, :f :append, :key \"2\", :value \"x 5 12 y\"}\n{:process 5, :type :invoke, :f :append, :key \"6\", :value \"x 5 13 y\"}\n{:process 5, :type :ok, :f :append, :key \"6\", :value \"x 5 13 y\"}\n{:process 5, :type :invoke, :f :put, :key \"9\", :value \"x 5 14 y\"}\n{:process 5, :type :ok, :f :put, :key \"9\", :value \"x 5 14 y\"}\n{:process 5, :type :invoke, :f :append, :key \"0\", :value \"x 5 15 y\"}\n{:process 5, :type :ok, :f :append, :key \"0\", :value \"x 5 15 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 16 y\"}\n{:process 2, :type :ok, :f :append, :key \"5\", :value \"x 2 9 y\"}\n{:process 2, :type :invoke, :f :append, :key \"5\", :value \"x 2 10 y\"}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 6 1 yx 3 2 y\"}\n{:process 6, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 16 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 17 y\"}\n{:process 6, :type :ok, :f :get, :key \"2\", :value \"x 9 2 yx 3 4 yx 5 12 y\"}\n{:process 6, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"5\", :value \"x 2 10 y\"}\n{:process 2, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"2\", :value \"x 9 2 yx 3 4 yx 5 12 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 yx 2 5 yx 6 12 yx 5 11 y\"}\n{:process 2, :type :invoke, :f :put, :key \"5\", :value \"x 2 11 y\"}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 17 y\"}\n{:process 5, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 6 1 yx 3 2 yx 5 15 y\"}\n{:process 6, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"5\", :value \"x 3 3 yx 7 2 yx 8 3 yx 6 1 yx 7 10 yx 1 3 yx 8 10 yx 9 13 yx 8 0 yx 9 0 yx 6 5 yx 6 9 yx 3 1 yx 7 4 yx 5 6 yx 2 3 yx 3 3 yx 6 16 yx 2 9 y\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 18 y\"}\n{:process 2, :type :ok, :f :put, :key \"5\", :value \"x 2 11 y\"}\n{:process 2, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"9\", :value \"x 5 14 y\"}\n{:process 2, :type :invoke, :f :append, :key \"2\", :value \"x 2 12 y\"}\n{:process 2, :type :ok, :f :append, :key \"2\", :value \"x 2 12 y\"}\n{:process 2, :type :invoke, :f :append, :key \"3\", :value \"x 2 13 y\"}\n{:process 5, :type :ok, :f :get, :key \"9\", :value \"x 5 14 y\"}\n{:process 5, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"5\", :value \"x 2 11 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 18 y\"}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 2 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 3 y\"}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 1 y\"}\n{:process 4, :type :invoke, :f :append, :key \"2\", :value \"x 4 2 y\"}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 6 1 yx 3 2 yx 5 15 y\"}\n{:process 0, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"4\", :value \"x 2 4 yx 9 1 yx 2 8 yx 5 10 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 4 y\"}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 18 y\"}\n{:process 6, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 yx 2 5 yx 6 12 yx 5 11 y\"}\n{:process 6, :type :invoke, :f :put, :key \"8\", :value \"x 6 19 y\"}\n{:process 1, :type :ok, :f :append, :key \"9\", :value \"x 1 1 y\"}\n{:process 1, :type :invoke, :f :append, :key \"2\", :value \"x 1 2 y\"}\n{:process 1, :type :ok, :f :append, :key \"2\", :value \"x 1 2 y\"}\n{:process 1, :type :invoke, :f :append, :key \"4\", :value \"x 1 3 y\"}\n{:process 2, :type :ok, :f :append, :key \"3\", :value \"x 2 13 y\"}\n{:process 2, :type :invoke, :f :append, :key \"2\", :value \"x 2 14 y\"}\n{:process 8, :type :ok, :f :append, :key \"7\", :value \"x 8 5 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 6 y\"}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 6 y\"}\n{:process 8, :type :invoke, :f :put, :key \"4\", :value \"x 8 7 y\"}\n{:process 8, :type :ok, :f :put, :key \"4\", :value \"x 8 7 y\"}\n{:process 8, :type :invoke, :f :append, :key \"6\", :value \"x 8 8 y\"}\n{:process 8, :type :ok, :f :append, :key \"6\", :value \"x 8 8 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 9 y\"}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 18 y\"}\n{:process 5, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 yx 5 9 yx 9 3 yx 6 15 y\"}\n{:process 5, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 9 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"5\", :value \"x 2 11 yx 8 9 y\"}\n{:process 5, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 yx 2 5 yx 6 12 yx 5 11 yx 2 13 yx 8 6 yx 5 18 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 19 y\"}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 19 y\"}\n{:process 5, :type :invoke, :f :append, :key \"6\", :value \"x 5 20 y\"}\n{:process 5, :type :ok, :f :append, :key \"6\", :value \"x 5 20 y\"}\n{:process 5, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 yx 2 5 yx 6 12 yx 5 11 yx 2 13 yx 8 6 yx 5 18 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 21 y\"}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 4 y\"}\n{:process 9, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 21 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 22 y\"}\n{:process 9, :type :ok, :f :get, :key \"9\", :value \"x 5 14 yx 6 18 yx 1 1 y\"}\n{:process 9, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 yx 5 9 yx 9 3 yx 6 15 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"2\", :value \"x 4 2 y\"}\n{:process 4, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 22 y\"}\n{:process 5, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"4\", :value \"x 8 7 yx 5 21 yx 5 22 y\"}\n{:process 4, :type :invoke, :f :append, :key \"5\", :value \"x 4 3 y\"}\n{:process 9, :type :ok, :f :get, :key \"8\", :value \"x 6 19 yx 5 19 y\"}\n{:process 9, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 yx 2 5 yx 6 12 yx 5 11 yx 2 13 yx 8 6 yx 5 18 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 5 y\"}\n{:process 4, :type :ok, :f :append, :key \"5\", :value \"x 4 3 y\"}\n{:process 4, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 yx 2 5 yx 6 12 yx 5 11 yx 2 13 yx 8 6 yx 5 18 y\"}\n{:process 9, :type :invoke, :f :append, :key \"6\", :value \"x 9 5 y\"}\n{:process 4, :type :ok, :f :get, :key \"2\", :value \"x 9 2 yx 3 4 yx 5 12 yx 2 12 yx 4 2 yx 1 2 y\"}\n{:process 4, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"2\", :value \"x 9 2 yx 3 4 yx 5 12 yx 2 12 yx 4 2 yx 1 2 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 4 y\"}\n{:process 9, :type :ok, :f :append, :key \"6\", :value \"x 9 5 y\"}\n{:process 9, :type :invoke, :f :append, :key \"0\", :value \"x 9 6 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"x 3 5 yx 3 6 yx 5 13 yx 0 3 yx 8 8 yx 5 20 yx 9 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 6 y\"}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 5 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 6 y\"}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 4 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 5 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 6 y\"}\n{:process 7, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 7 y\"}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 5 y\"}\n{:process 4, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"0\", :value \"x 9 6 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 7 y\"}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 8 y\"}\n{:process 4, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 yx 7 2 yx 6 2 yx 6 7 yx 6 11 yx 5 5 yx 9 4 yx 8 5 y\"}\n{:process 4, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 yx 7 2 yx 6 2 yx 6 7 yx 6 11 yx 5 5 yx 9 4 yx 8 5 y\"}\n{:process 4, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 7 y\"}\n{:process 9, :type :invoke, :f :append, :key \"6\", :value \"x 9 8 y\"}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 8 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 9 2 yx 3 4 yx 5 12 yx 2 12 yx 4 2 yx 1 2 yx 0 5 yx 0 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 7 1 yx 2 1 yx 5 2 yx 1 0 yx 8 1 yx 8 3 yx 5 7 yx 5 9 yx 9 3 yx 6 15 yx 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"5\", :value \"x 2 11 yx 8 9 yx 4 3 yx 7 6 y\"}\n{:process 5, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"5\", :value \"x 2 11 yx 8 9 yx 4 3 yx 7 6 y\"}\n{:process 4, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"7\", :value \"x 5 2 yx 9 2 yx 9 7 yx 0 7 yx 8 11 yx 7 2 yx 6 2 yx 6 7 yx 6 11 yx 5 5 yx 9 4 yx 8 5 yx 9 7 y\"}\n{:process 4, :type :invoke, :f :append, :key \"2\", :value \"x 4 6 y\"}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 2 11 yx 8 9 yx 4 3 yx 7 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 9 1 yx 9 6 yx 0 11 yx 6 2 yx 8 5 yx 8 8 yx 6 4 yx 4 1 yx 5 0 yx 0 2 yx 6 8 yx 2 5 yx 6 12 yx 5 11 yx 2 13 yx 8 6 yx 5 18 y\"}\n{:process 8, :type :invoke, :f :append, :key \"6\", :value \"x 8 10 y\"}\n{:process 0, :type :ok, :f :get, :key \"4\", :value \"x 8 7 yx 5 21 yx 5 22 yx 7 5 yx 4 4 yx 4 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 9 y\"}\n{:process 9, :type :ok, :f :append, :key \"6\", :value \"x 9 8 y\"}\n{:process 9, :type :invoke, :f :append, :key \"8\", :value \"x 9 9 y\"}\n{:process 4, :type :ok, :f :append, :key \"2\", :value \"x 4 6 y\"}\n{:process 4, :type :invoke, :f :append, :key \"5\", :value \"x 4 7 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"8\", :value \"x 9 9 y\"}\n{:process 9, :type :invoke, :f :append, :key \"0\", :value \"x 9 10 y\"}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 5 14 yx 6 18 yx 1 1 yx 0 7 y\"}\n{:process 0, :type :invoke, :f :put, :key \"1\", :value \"x 0 10 y\"}\n{:process 4, :type :ok, :f :append, :key \"5\", :value \"x 4 7 y\"}\n{:process 4, :type :invoke, :f :append, :key \"5\", :value \"x 4 8 y\"}\n{:process 5, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 7, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 6, :type :ok, :f :put, :key \"8\", :value \"x 6 19 y\"}\n{:process 1, :type :ok, :f :append, :key \"4\", :value \"x 1 3 y\"}\n{:process 2, :type :ok, :f :append, :key \"2\", :value \"x 2 14 y\"}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 7 y\"}\n{:process 8, :type :ok, :f :append, :key \"6\", :value \"x 8 10 y\"}\n{:process 9, :type :ok, :f :append, :key \"0\", :value \"x 9 10 y\"}\n{:process 0, :type :ok, :f :put, :key \"1\", :value \"x 0 10 y\"}\n{:process 4, :type :ok, :f :append, :key \"5\", :value \"x 4 8 y\"}"
  },
  {
    "path": "courses/dss/linearizability/test_data/c10-ok.txt",
    "content": "{:process 9, :type :invoke, :f :append, :key \"0\", :value \"x 9 0 y\"}\n{:process 2, :type :invoke, :f :append, :key \"1\", :value \"x 2 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"1\", :value \"x 4 0 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"1\", :value \"x 4 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"1\", :value \"x 4 1 y\"}\n{:process 9, :type :ok, :f :append, :key \"0\", :value \"x 9 0 y\"}\n{:process 9, :type :invoke, :f :append, :key \"5\", :value \"x 9 1 y\"}\n{:process 4, :type :ok, :f :append, :key \"1\", :value \"x 4 1 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 2 y\"}\n{:process 9, :type :ok, :f :append, :key \"5\", :value \"x 9 1 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 2 y\"}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 2 y\"}\n{:process 4, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"3\", :value \"\"}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 3 y\"}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 3 y\"}\n{:process 4, :type :invoke, :f :append, :key \"9\", :value \"x 4 4 y\"}\n{:process 4, :type :ok, :f :append, :key \"9\", :value \"x 4 4 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 5 y\"}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 5 y\"}\n{:process 4, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"5\", :value \"x 9 1 y\"}\n{:process 4, :type :invoke, :f :append, :key \"2\", :value \"x 4 6 y\"}\n{:process 4, :type :ok, :f :append, :key \"2\", :value \"x 4 6 y\"}\n{:process 4, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 1 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 0 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 1 y\"}\n{:process 2, :type :ok, :f :append, :key \"1\", :value \"x 2 0 y\"}\n{:process 2, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"5\", :value \"x 9 1 yx 7 0 y\"}\n{:process 2, :type :invoke, :f :append, :key \"1\", :value \"x 2 1 y\"}\n{:process 2, :type :ok, :f :append, :key \"1\", :value \"x 2 1 y\"}\n{:process 2, :type :invoke, :f :append, :key \"5\", :value \"x 2 2 y\"}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 1 y\"}\n{:process 2, :type :ok, :f :append, :key \"5\", :value \"x 2 2 y\"}\n{:process 2, :type :invoke, :f :append, :key \"9\", :value \"x 2 3 y\"}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 1 y\"}\n{:process 3, :type :invoke, :f :append, :key \"0\", :value \"x 3 2 y\"}\n{:process 3, :type :ok, :f :append, :key \"0\", :value \"x 3 2 y\"}\n{:process 3, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 3 y\"}\n{:process 8, :type :ok, :f :get, :key \"8\", :value \"\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 2 y\"}\n{:process 9, :type :invoke, :f :put, :key \"6\", :value \"x 9 3 y\"}\n{:process 4, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 7 y\"}\n{:process 1, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 y\"}\n{:process 1, :type :invoke, :f :append, :key \"1\", :value \"x 1 0 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 1 y\"}\n{:process 6, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 7 y\"}\n{:process 4, :type :invoke, :f :append, :key \"8\", :value \"x 4 8 y\"}\n{:process 1, :type :ok, :f :append, :key \"1\", :value \"x 1 0 y\"}\n{:process 1, :type :invoke, :f :append, :key \"2\", :value \"x 1 1 y\"}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 2 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 2 y\"}\n{:process 7, :type :invoke, :f :append, :key \"9\", :value \"x 7 3 y\"}\n{:process 1, :type :ok, :f :append, :key \"2\", :value \"x 1 1 y\"}\n{:process 1, :type :invoke, :f :put, :key \"7\", :value \"x 1 2 y\"}\n{:process 4, :type :ok, :f :append, :key \"8\", :value \"x 4 8 y\"}\n{:process 4, :type :invoke, :f :append, :key \"5\", :value \"x 4 9 y\"}\n{:process 7, :type :ok, :f :append, :key \"9\", :value \"x 7 3 y\"}\n{:process 7, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 1, :type :ok, :f :put, :key \"7\", :value \"x 1 2 y\"}\n{:process 1, :type :invoke, :f :append, :key \"4\", :value \"x 1 3 y\"}\n{:process 4, :type :ok, :f :append, :key \"5\", :value \"x 4 9 y\"}\n{:process 4, :type :invoke, :f :append, :key \"8\", :value \"x 4 10 y\"}\n{:process 1, :type :ok, :f :append, :key \"4\", :value \"x 1 3 y\"}\n{:process 1, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"8\", :value \"x 4 8 y\"}\n{:process 7, :type :invoke, :f :put, :key \"6\", :value \"x 7 4 y\"}\n{:process 1, :type :ok, :f :get, :key \"5\", :value \"x 9 1 yx 7 0 yx 3 1 yx 2 2 yx 6 1 yx 7 2 yx 4 9 y\"}\n{:process 1, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"1\", :value \"x 4 0 yx 4 1 yx 2 0 yx 2 1 yx 1 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"2\", :value \"x 6 2 y\"}\n{:process 6, :type :ok, :f :append, :key \"2\", :value \"x 6 2 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 y\"}\n{:process 6, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"8\", :value \"x 4 10 y\"}\n{:process 4, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"4\", :value \"x 4 2 yx 4 5 yx 4 7 yx 1 3 y\"}\n{:process 1, :type :invoke, :f :append, :key \"4\", :value \"x 1 4 y\"}\n{:process 0, :type :ok, :f :get, :key \"3\", :value \"x 4 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 1 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 2 y\"}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 4 0 yx 4 1 yx 2 0 yx 2 1 yx 1 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 2 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 y\"}\n{:process 8, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 3 y\"}\n{:process 3, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 3 2 yx 7 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 3 y\"}\n{:process 3, :type :ok, :f :get, :key \"4\", :value \"x 4 2 yx 4 5 yx 4 7 yx 1 3 y\"}\n{:process 3, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 4 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"8\", :value \"x 4 8 yx 4 10 yx 0 1 yx 0 3 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 4 0 yx 4 1 yx 2 0 yx 2 1 yx 1 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 5 y\"}\n{:process 3, :type :ok, :f :get, :key \"1\", :value \"x 4 0 yx 4 1 yx 2 0 yx 2 1 yx 1 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"8\", :value \"x 3 4 y\"}\n{:process 3, :type :ok, :f :append, :key \"8\", :value \"x 3 4 y\"}\n{:process 3, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 6 y\"}\n{:process 7, :type :ok, :f :put, :key \"6\", :value \"x 7 4 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 5 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 7 y\"}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 5 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 6 y\"}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 y\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 3 y\"}\n{:process 4, :type :ok, :f :get, :key \"6\", :value \"x 7 4 y\"}\n{:process 4, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"1\", :value \"x 4 0 yx 4 1 yx 2 0 yx 2 1 yx 1 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"6\", :value \"x 4 11 y\"}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 7 y\"}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 6 y\"}\n{:process 4, :type :ok, :f :append, :key \"6\", :value \"x 4 11 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 7, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 4, :type :invoke, :f :append, :key \"8\", :value \"x 4 12 y\"}\n{:process 4, :type :ok, :f :append, :key \"8\", :value \"x 4 12 y\"}\n{:process 4, :type :invoke, :f :append, :key \"0\", :value \"x 4 13 y\"}\n{:process 7, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 y\"}\n{:process 7, :type :invoke, :f :put, :key \"4\", :value \"x 7 7 y\"}\n{:process 7, :type :ok, :f :put, :key \"4\", :value \"x 7 7 y\"}\n{:process 7, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"0\", :value \"x 4 13 y\"}\n{:process 4, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"8\", :value \"x 4 8 yx 4 10 yx 0 1 yx 0 3 yx 3 4 yx 4 12 y\"}\n{:process 4, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"4\", :value \"x 7 7 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"8\", :value \"x 4 8 yx 4 10 yx 0 1 yx 0 3 yx 3 4 yx 4 12 y\"}\n{:process 4, :type :invoke, :f :append, :key \"0\", :value \"x 4 14 y\"}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 3 2 yx 7 1 yx 0 4 yx 7 5 yx 7 6 yx 4 13 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"0\", :value \"x 4 14 y\"}\n{:process 4, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"8\", :value \"x 4 8 yx 4 10 yx 0 1 yx 0 3 yx 3 4 yx 4 12 y\"}\n{:process 5, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"9\", :value \"x 2 3 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 4 y\"}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 9 1 yx 7 0 yx 3 1 yx 2 2 yx 6 1 yx 7 2 yx 4 9 yx 3 3 yx 0 5 y\"}\n{:process 7, :type :invoke, :f :append, :key \"2\", :value \"x 7 8 y\"}\n{:process 5, :type :ok, :f :get, :key \"5\", :value \"x 9 1 yx 7 0 yx 3 1 yx 2 2 yx 6 1 yx 7 2 yx 4 9 yx 3 3 yx 0 5 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 1 y\"}\n{:process 4, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 y\"}\n{:process 4, :type :invoke, :f :append, :key \"1\", :value \"x 4 15 y\"}\n{:process 7, :type :ok, :f :append, :key \"2\", :value \"x 7 8 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 9 y\"}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 4 y\"}\n{:process 2, :type :invoke, :f :append, :key \"5\", :value \"x 2 5 y\"}\n{:process 4, :type :ok, :f :append, :key \"1\", :value \"x 4 15 y\"}\n{:process 4, :type :invoke, :f :append, :key \"6\", :value \"x 4 16 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 9 y\"}\n{:process 7, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 1 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"6\", :value \"x 4 16 y\"}\n{:process 4, :type :invoke, :f :append, :key \"6\", :value \"x 4 17 y\"}\n{:process 2, :type :ok, :f :append, :key \"5\", :value \"x 2 5 y\"}\n{:process 2, :type :invoke, :f :append, :key \"4\", :value \"x 2 6 y\"}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 4 6 yx 1 1 yx 6 2 yx 0 2 yx 7 8 y\"}\n{:process 5, :type :invoke, :f :append, :key \"7\", :value \"x 5 2 y\"}\n{:process 7, :type :ok, :f :get, :key \"8\", :value \"x 4 8 yx 4 10 yx 0 1 yx 0 3 yx 3 4 yx 4 12 y\"}\n{:process 7, :type :invoke, :f :append, :key \"7\", :value \"x 7 10 y\"}\n{:process 5, :type :ok, :f :append, :key \"7\", :value \"x 5 2 y\"}\n{:process 5, :type :invoke, :f :append, :key \"1\", :value \"x 5 3 y\"}\n{:process 4, :type :ok, :f :append, :key \"6\", :value \"x 4 17 y\"}\n{:process 4, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"3\", :value \"x 4 3 yx 0 7 y\"}\n{:process 4, :type :invoke, :f :append, :key \"1\", :value \"x 4 18 y\"}\n{:process 4, :type :ok, :f :append, :key \"1\", :value \"x 4 18 y\"}\n{:process 4, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"2\", :value \"x 4 6 yx 1 1 yx 6 2 yx 0 2 yx 7 8 y\"}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 19 y\"}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 19 y\"}\n{:process 4, :type :invoke, :f :append, :key \"7\", :value \"x 4 20 y\"}\n{:process 4, :type :ok, :f :append, :key \"7\", :value \"x 4 20 y\"}\n{:process 4, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"7\", :value \"x 1 2 yx 0 6 yx 5 2 yx 7 10 yx 4 20 y\"}\n{:process 8, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"2\", :value \"x 4 6 yx 1 1 yx 6 2 yx 0 2 yx 7 8 y\"}\n{:process 8, :type :invoke, :f :put, :key \"3\", :value \"x 8 0 y\"}\n{:process 8, :type :ok, :f :put, :key \"3\", :value \"x 8 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"4\", :value \"x 8 1 y\"}\n{:process 8, :type :ok, :f :append, :key \"4\", :value \"x 8 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"9\", :value \"x 8 2 y\"}\n{:process 8, :type :ok, :f :append, :key \"9\", :value \"x 8 2 y\"}\n{:process 8, :type :invoke, :f :append, :key \"9\", :value \"x 8 3 y\"}\n{:process 8, :type :ok, :f :append, :key \"9\", :value \"x 8 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 4 y\"}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 3 y\"}\n{:process 6, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"4\", :value \"x 1 4 y\"}\n{:process 1, :type :invoke, :f :append, :key \"5\", :value \"x 1 5 y\"}\n{:process 9, :type :ok, :f :put, :key \"6\", :value \"x 9 3 y\"}\n{:process 9, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"4\", :value \"x 2 6 y\"}\n{:process 2, :type :invoke, :f :append, :key \"5\", :value \"x 2 7 y\"}\n{:process 9, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 y\"}\n{:process 9, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"5\", :value \"x 2 7 y\"}\n{:process 2, :type :invoke, :f :append, :key \"6\", :value \"x 2 8 y\"}\n{:process 5, :type :ok, :f :append, :key \"1\", :value \"x 5 3 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 4 y\"}\n{:process 2, :type :ok, :f :append, :key \"6\", :value \"x 2 8 y\"}\n{:process 2, :type :invoke, :f :append, :key \"5\", :value \"x 2 9 y\"}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 4 y\"}\n{:process 5, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"7\", :value \"x 7 10 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 9 1 yx 7 0 yx 3 1 yx 2 2 yx 6 1 yx 7 2 yx 4 9 yx 3 3 yx 0 5 yx 7 9 yx 2 5 yx 1 5 yx 2 7 y\"}\n{:process 7, :type :invoke, :f :put, :key \"7\", :value \"x 7 11 y\"}\n{:process 5, :type :ok, :f :get, :key \"7\", :value \"x 1 2 yx 0 6 yx 5 2 yx 7 10 yx 4 20 y\"}\n{:process 5, :type :invoke, :f :append, :key \"0\", :value \"x 5 5 y\"}\n{:process 5, :type :ok, :f :append, :key \"0\", :value \"x 5 5 y\"}\n{:process 5, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 7, :type :ok, :f :put, :key \"7\", :value \"x 7 11 y\"}\n{:process 7, :type :invoke, :f :append, :key \"6\", :value \"x 7 12 y\"}\n{:process 5, :type :ok, :f :get, :key \"1\", :value \"x 4 0 yx 4 1 yx 2 0 yx 2 1 yx 1 0 yx 4 15 yx 4 18 yx 5 3 y\"}\n{:process 5, :type :invoke, :f :append, :key \"5\", :value \"x 5 6 y\"}\n{:process 5, :type :ok, :f :append, :key \"5\", :value \"x 5 6 y\"}\n{:process 5, :type :invoke, :f :append, :key \"0\", :value \"x 5 7 y\"}\n{:process 5, :type :ok, :f :append, :key \"0\", :value \"x 5 7 y\"}\n{:process 5, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 3 2 yx 7 1 yx 0 4 yx 7 5 yx 7 6 yx 4 13 yx 4 14 yx 2 4 yx 8 4 yx 5 5 yx 5 7 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 8 y\"}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 8 y\"}\n{:process 5, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 9 y\"}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 9 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 10 y\"}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 10 y\"}\n{:process 5, :type :invoke, :f :put, :key \"5\", :value \"x 5 11 y\"}\n{:process 4, :type :ok, :f :get, :key \"8\", :value \"x 4 8 yx 4 10 yx 0 1 yx 0 3 yx 3 4 yx 4 12 yx 5 9 y\"}\n{:process 4, :type :invoke, :f :put, :key \"5\", :value \"x 4 21 y\"}\n{:process 5, :type :ok, :f :put, :key \"5\", :value \"x 5 11 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 yx 5 10 y\"}\n{:process 5, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"7\", :value \"x 7 11 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 yx 5 10 y\"}\n{:process 5, :type :invoke, :f :append, :key \"0\", :value \"x 5 12 y\"}\n{:process 5, :type :ok, :f :append, :key \"0\", :value \"x 5 12 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 yx 5 10 y\"}\n{:process 5, :type :invoke, :f :append, :key \"5\", :value \"x 5 13 y\"}\n{:process 4, :type :ok, :f :put, :key \"5\", :value \"x 4 21 y\"}\n{:process 7, :type :ok, :f :append, :key \"6\", :value \"x 7 12 y\"}\n{:process 6, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 y\"}\n{:process 5, :type :ok, :f :append, :key \"5\", :value \"x 5 13 y\"}\n{:process 3, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 yx 8 2 yx 8 3 yx 6 3 y\"}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 4 0 yx 4 1 yx 2 0 yx 2 1 yx 1 0 yx 4 15 yx 4 18 yx 5 3 y\"}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 4 y\"}\n{:process 2, :type :ok, :f :append, :key \"5\", :value \"x 2 9 y\"}\n{:process 9, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 yx 5 10 y\"}\n{:process 1, :type :ok, :f :append, :key \"5\", :value \"x 1 5 y\"}\n{:process 9, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 3, :type :invoke, :f :append, :key \"4\", :value \"x 3 0 y\"}\n{:process 4, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 2, :type :invoke, :f :append, :key \"4\", :value \"x 2 0 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 0, :type :invoke, :f :put, :key \"1\", :value \"x 0 0 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"8\", :value \"x 8 0 y\"}\n{:process 1, :type :invoke, :f :append, :key \"1\", :value \"x 1 0 y\"}\n{:process 8, :type :ok, :f :append, :key \"8\", :value \"x 8 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 y\"}\n{:process 8, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"5\", :value \"x 5 11 yx 5 13 yx 2 9 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 2 y\"}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 0 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 1 y\"}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 2 y\"}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 2 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 3 y\"}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 4 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 4 y\"}\n{:process 8, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 yx 5 10 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 5 y\"}\n{:process 9, :type :ok, :f :get, :key \"8\", :value \"x 4 8 yx 4 10 yx 0 1 yx 0 3 yx 3 4 yx 4 12 yx 5 9 yx 8 0 yx 5 0 yx 5 1 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 0 y\"}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 0 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 0 y\"}\n{:process 9, :type :invoke, :f :append, :key \"3\", :value \"x 9 1 y\"}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 5 y\"}\n{:process 8, :type :invoke, :f :append, :key \"7\", :value \"x 8 6 y\"}\n{:process 8, :type :ok, :f :append, :key \"7\", :value \"x 8 6 y\"}\n{:process 8, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 5 11 yx 5 13 yx 2 9 yx 8 5 y\"}\n{:process 7, :type :invoke, :f :append, :key \"3\", :value \"x 7 1 y\"}\n{:process 9, :type :ok, :f :append, :key \"3\", :value \"x 9 1 y\"}\n{:process 9, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"8\", :value \"x 4 8 yx 4 10 yx 0 1 yx 0 3 yx 3 4 yx 4 12 yx 5 9 yx 8 0 yx 5 0 yx 5 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 7 y\"}\n{:process 7, :type :ok, :f :append, :key \"3\", :value \"x 7 1 y\"}\n{:process 7, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"5\", :value \"x 5 11 yx 5 13 yx 2 9 yx 8 5 y\"}\n{:process 9, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"8\", :value \"x 4 8 yx 4 10 yx 0 1 yx 0 3 yx 3 4 yx 4 12 yx 5 9 yx 8 0 yx 5 0 yx 5 1 y\"}\n{:process 7, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 7 y\"}\n{:process 8, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"1\", :value \"x 4 0 yx 4 1 yx 2 0 yx 2 1 yx 1 0 yx 4 15 yx 4 18 yx 5 3 yx 8 2 y\"}\n{:process 9, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"2\", :value \"x 4 6 yx 1 1 yx 6 2 yx 0 2 yx 7 8 yx 8 1 yx 8 4 y\"}\n{:process 7, :type :invoke, :f :append, :key \"9\", :value \"x 7 2 y\"}\n{:process 7, :type :ok, :f :append, :key \"9\", :value \"x 7 2 y\"}\n{:process 7, :type :invoke, :f :append, :key \"9\", :value \"x 7 3 y\"}\n{:process 1, :type :ok, :f :append, :key \"1\", :value \"x 1 0 y\"}\n{:process 1, :type :invoke, :f :append, :key \"1\", :value \"x 1 1 y\"}\n{:process 8, :type :ok, :f :get, :key \"7\", :value \"x 7 11 yx 9 0 yx 8 6 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"1\", :value \"x 1 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 4 0 yx 4 1 yx 2 0 yx 2 1 yx 1 0 yx 4 15 yx 4 18 yx 5 3 yx 8 2 yx 1 0 yx 1 1 y\"}\n{:process 8, :type :invoke, :f :put, :key \"8\", :value \"x 8 8 y\"}\n{:process 1, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 y\"}\n{:process 1, :type :invoke, :f :append, :key \"7\", :value \"x 1 2 y\"}\n{:process 1, :type :ok, :f :append, :key \"7\", :value \"x 1 2 y\"}\n{:process 1, :type :invoke, :f :append, :key \"7\", :value \"x 1 3 y\"}\n{:process 3, :type :ok, :f :append, :key \"4\", :value \"x 3 0 y\"}\n{:process 3, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"7\", :value \"x 1 3 y\"}\n{:process 1, :type :invoke, :f :append, :key \"7\", :value \"x 1 4 y\"}\n{:process 1, :type :ok, :f :append, :key \"7\", :value \"x 1 4 y\"}\n{:process 1, :type :invoke, :f :append, :key \"2\", :value \"x 1 5 y\"}\n{:process 1, :type :ok, :f :append, :key \"2\", :value \"x 1 5 y\"}\n{:process 1, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 yx 5 10 yx 7 0 yx 3 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :put, :key \"1\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"2\", :value \"x 4 6 yx 1 1 yx 6 2 yx 0 2 yx 7 8 yx 8 1 yx 8 4 yx 1 5 y\"}\n{:process 4, :type :invoke, :f :append, :key \"9\", :value \"x 4 0 y\"}\n{:process 2, :type :ok, :f :append, :key \"4\", :value \"x 2 0 y\"}\n{:process 2, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 yx 8 2 yx 8 3 yx 6 3 yx 7 2 yx 7 3 yx 4 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 1 y\"}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 2 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 2 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 4 6 yx 1 1 yx 6 2 yx 0 2 yx 7 8 yx 8 1 yx 8 4 yx 1 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 3 y\"}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 4 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"x 8 8 yx 0 2 yx 0 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 5 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 6 y\"}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 7 y\"}\n{:process 7, :type :ok, :f :append, :key \"9\", :value \"x 7 3 y\"}\n{:process 7, :type :invoke, :f :append, :key \"1\", :value \"x 7 4 y\"}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 2 y\"}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 3 y\"}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 3 y\"}\n{:process 5, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"1\", :value \"x 7 4 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 5 y\"}\n{:process 8, :type :ok, :f :put, :key \"8\", :value \"x 8 8 y\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 9 y\"}\n{:process 5, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 yx 8 2 yx 8 3 yx 6 3 yx 7 2 yx 7 3 yx 4 0 yx 0 6 yx 5 3 y\"}\n{:process 5, :type :invoke, :f :append, :key \"2\", :value \"x 5 4 y\"}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 9 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 5 y\"}\n{:process 7, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 y\"}\n{:process 8, :type :invoke, :f :append, :key \"7\", :value \"x 8 10 y\"}\n{:process 5, :type :ok, :f :append, :key \"2\", :value \"x 5 4 y\"}\n{:process 5, :type :invoke, :f :put, :key \"2\", :value \"x 5 5 y\"}\n{:process 3, :type :ok, :f :get, :key \"5\", :value \"x 5 11 yx 5 13 yx 2 9 yx 8 5 y\"}\n{:process 3, :type :invoke, :f :append, :key \"8\", :value \"x 3 1 y\"}\n{:process 8, :type :ok, :f :append, :key \"7\", :value \"x 8 10 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"8\", :value \"x 3 1 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 2 y\"}\n{:process 5, :type :ok, :f :put, :key \"2\", :value \"x 5 5 y\"}\n{:process 5, :type :invoke, :f :append, :key \"6\", :value \"x 5 6 y\"}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 y\"}\n{:process 8, :type :invoke, :f :append, :key \"4\", :value \"x 8 11 y\"}\n{:process 8, :type :ok, :f :append, :key \"4\", :value \"x 8 11 y\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 12 y\"}\n{:process 5, :type :ok, :f :append, :key \"6\", :value \"x 5 6 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 7 y\"}\n{:process 2, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 yx 3 2 y\"}\n{:process 2, :type :invoke, :f :append, :key \"7\", :value \"x 2 1 y\"}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 2 y\"}\n{:process 3, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"9\", :value \"x 4 0 y\"}\n{:process 4, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 12 y\"}\n{:process 8, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 yx 8 2 yx 8 3 yx 6 3 yx 7 2 yx 7 3 yx 4 0 yx 0 6 yx 5 3 y\"}\n{:process 4, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"7\", :value \"x 7 11 yx 9 0 yx 8 6 yx 1 2 yx 1 3 yx 1 4 yx 0 5 yx 8 10 yx 2 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 13 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"x 8 8 yx 0 2 yx 0 4 yx 0 7 yx 5 2 yx 3 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 8 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 8 y\"}\n{:process 0, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 yx 5 10 yx 7 0 yx 3 0 yx 2 0 yx 7 5 yx 8 11 yx 0 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 9 y\"}\n{:process 7, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 yx 5 10 yx 7 0 yx 3 0 yx 2 0 yx 7 5 yx 8 11 yx 0 8 y\"}\n{:process 7, :type :invoke, :f :append, :key \"6\", :value \"x 7 6 y\"}\n{:process 7, :type :ok, :f :append, :key \"6\", :value \"x 7 6 y\"}\n{:process 7, :type :invoke, :f :append, :key \"7\", :value \"x 7 7 y\"}\n{:process 1, :type :ok, :f :get, :key \"5\", :value \"x 5 11 yx 5 13 yx 2 9 yx 8 5 y\"}\n{:process 1, :type :invoke, :f :append, :key \"1\", :value \"x 1 6 y\"}\n{:process 4, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 yx 5 6 yx 0 9 yx 7 6 y\"}\n{:process 4, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"7\", :value \"x 7 11 yx 9 0 yx 8 6 yx 1 2 yx 1 3 yx 1 4 yx 0 5 yx 8 10 yx 2 1 y\"}\n{:process 3, :type :invoke, :f :append, :key \"0\", :value \"x 3 3 y\"}\n{:process 2, :type :ok, :f :append, :key \"7\", :value \"x 2 1 y\"}\n{:process 2, :type :invoke, :f :put, :key \"5\", :value \"x 2 2 y\"}\n{:process 1, :type :ok, :f :append, :key \"1\", :value \"x 1 6 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 7 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 8 y\"}\n{:process 3, :type :ok, :f :append, :key \"0\", :value \"x 3 3 y\"}\n{:process 3, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 yx 3 2 yx 5 7 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 13 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 8 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 9 y\"}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 0 0 yx 0 1 yx 0 3 yx 7 4 yx 1 6 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 yx 3 2 yx 5 7 yx 5 8 y\"}\n{:process 1, :type :invoke, :f :append, :key \"1\", :value \"x 1 7 y\"}\n{:process 3, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 yx 3 2 yx 5 7 yx 5 8 y\"}\n{:process 3, :type :invoke, :f :append, :key \"7\", :value \"x 3 4 y\"}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 9 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 10 y\"}\n{:process 1, :type :ok, :f :append, :key \"1\", :value \"x 1 7 y\"}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 0 0 yx 0 1 yx 0 3 yx 7 4 yx 1 6 yx 1 7 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 1, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"7\", :value \"x 3 4 y\"}\n{:process 3, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 yx 5 6 yx 0 9 yx 7 6 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 10 y\"}\n{:process 3, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 yx 8 2 yx 8 3 yx 6 3 yx 7 2 yx 7 3 yx 4 0 yx 0 6 yx 5 3 y\"}\n{:process 5, :type :invoke, :f :append, :key \"6\", :value \"x 5 11 y\"}\n{:process 3, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 yx 3 2 yx 5 7 yx 5 8 y\"}\n{:process 8, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"7\", :value \"x 7 11 yx 9 0 yx 8 6 yx 1 2 yx 1 3 yx 1 4 yx 0 5 yx 8 10 yx 2 1 yx 3 4 y\"}\n{:process 1, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"1\", :value \"x 0 0 yx 0 1 yx 0 3 yx 7 4 yx 1 6 yx 1 7 y\"}\n{:process 3, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"1\", :value \"x 0 0 yx 0 1 yx 0 3 yx 7 4 yx 1 6 yx 1 7 y\"}\n{:process 1, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"6\", :value \"x 5 11 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 12 y\"}\n{:process 8, :type :ok, :f :get, :key \"4\", :value \"x 7 7 yx 5 1 yx 1 4 yx 2 6 yx 8 1 yx 5 10 yx 7 0 yx 3 0 yx 2 0 yx 7 5 yx 8 11 yx 0 8 yx 5 9 yx 5 10 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 yx 5 6 yx 0 9 yx 7 6 yx 5 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 yx 3 2 yx 5 7 yx 5 8 y\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 5 y\"}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 12 y\"}\n{:process 5, :type :invoke, :f :put, :key \"4\", :value \"x 5 13 y\"}\n{:process 1, :type :ok, :f :get, :key \"2\", :value \"x 5 5 yx 8 13 y\"}\n{:process 1, :type :invoke, :f :append, :key \"3\", :value \"x 1 8 y\"}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 0 0 yx 0 1 yx 0 3 yx 7 4 yx 1 6 yx 1 7 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 5, :type :ok, :f :put, :key \"4\", :value \"x 5 13 y\"}\n{:process 5, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 yx 8 2 yx 8 3 yx 6 3 yx 7 2 yx 7 3 yx 4 0 yx 0 6 yx 5 3 y\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 0 y\"}\n{:process 1, :type :ok, :f :append, :key \"3\", :value \"x 1 8 y\"}\n{:process 1, :type :invoke, :f :append, :key \"0\", :value \"x 1 9 y\"}\n{:process 5, :type :ok, :f :get, :key \"8\", :value \"x 8 8 yx 0 2 yx 0 4 yx 0 7 yx 5 2 yx 3 1 y\"}\n{:process 5, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"2\", :value \"x 6 1 y\"}\n{:process 5, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 yx 3 2 yx 5 7 yx 5 8 yx 5 12 yx 1 8 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 14 y\"}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 14 y\"}\n{:process 5, :type :invoke, :f :append, :key \"2\", :value \"x 5 15 y\"}\n{:process 1, :type :ok, :f :append, :key \"0\", :value \"x 1 9 y\"}\n{:process 1, :type :invoke, :f :append, :key \"9\", :value \"x 1 10 y\"}\n{:process 6, :type :ok, :f :append, :key \"2\", :value \"x 6 1 y\"}\n{:process 6, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"9\", :value \"x 1 10 y\"}\n{:process 1, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"2\", :value \"x 5 15 y\"}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 16 y\"}\n{:process 1, :type :ok, :f :get, :key \"8\", :value \"x 8 8 yx 0 2 yx 0 4 yx 0 7 yx 5 2 yx 3 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 yx 8 2 yx 8 3 yx 6 3 yx 7 2 yx 7 3 yx 4 0 yx 0 6 yx 5 3 yx 1 10 y\"}\n{:process 1, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"2\", :value \"x 5 5 yx 8 13 yx 6 1 yx 5 15 y\"}\n{:process 6, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 16 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 17 y\"}\n{:process 6, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 yx 5 6 yx 0 9 yx 7 6 yx 5 11 y\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 2 y\"}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 17 y\"}\n{:process 5, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 3 y\"}\n{:process 5, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 3 2 yx 7 1 yx 0 4 yx 7 5 yx 7 6 yx 4 13 yx 4 14 yx 2 4 yx 8 4 yx 5 5 yx 5 7 yx 5 12 yx 8 9 yx 8 12 yx 3 3 yx 6 0 yx 1 9 yx 6 2 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 3 y\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 4 y\"}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 5 13 yx 5 14 y\"}\n{:process 5, :type :invoke, :f :put, :key \"7\", :value \"x 5 18 y\"}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 4 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 5, :type :ok, :f :put, :key \"7\", :value \"x 5 18 y\"}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 19 y\"}\n{:process 1, :type :ok, :f :get, :key \"4\", :value \"x 5 13 yx 5 14 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 19 y\"}\n{:process 5, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 5 4 yx 5 8 yx 8 3 yx 9 1 yx 7 1 yx 8 7 yx 3 2 yx 5 7 yx 5 8 yx 5 12 yx 1 8 y\"}\n{:process 1, :type :invoke, :f :append, :key \"2\", :value \"x 1 11 y\"}\n{:process 5, :type :ok, :f :get, :key \"1\", :value \"x 0 0 yx 0 1 yx 0 3 yx 7 4 yx 1 6 yx 1 7 yx 3 5 y\"}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 20 y\"}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 20 y\"}\n{:process 5, :type :invoke, :f :put, :key \"3\", :value \"x 5 21 y\"}\n{:process 4, :type :ok, :f :get, :key \"5\", :value \"x 5 11 yx 5 13 yx 2 9 yx 8 5 y\"}\n{:process 4, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 3 2 yx 7 1 yx 0 4 yx 7 5 yx 7 6 yx 4 13 yx 4 14 yx 2 4 yx 8 4 yx 5 5 yx 5 7 yx 5 12 yx 8 9 yx 8 12 yx 3 3 yx 6 0 yx 1 9 yx 6 2 yx 6 3 yx 6 4 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 10 y\"}\n{:process 2, :type :ok, :f :put, :key \"5\", :value \"x 2 2 y\"}\n{:process 2, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 10 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 11 y\"}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 9 0 yx 0 0 yx 3 2 yx 7 1 yx 0 4 yx 7 5 yx 7 6 yx 4 13 yx 4 14 yx 2 4 yx 8 4 yx 5 5 yx 5 7 yx 5 12 yx 8 9 yx 8 12 yx 3 3 yx 6 0 yx 1 9 yx 6 2 yx 6 3 yx 6 4 y\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 5 y\"}\n{:process 2, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 yx 8 2 yx 8 3 yx 6 3 yx 7 2 yx 7 3 yx 4 0 yx 0 6 yx 5 3 yx 1 10 yx 5 16 yx 5 19 yx 5 20 y\"}\n{:process 2, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 5 y\"}\n{:process 6, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"1\", :value \"x 0 0 yx 0 1 yx 0 3 yx 7 4 yx 1 6 yx 1 7 yx 3 5 y\"}\n{:process 2, :type :invoke, :f :put, :key \"4\", :value \"x 2 3 y\"}\n{:process 2, :type :ok, :f :put, :key \"4\", :value \"x 2 3 y\"}\n{:process 2, :type :invoke, :f :append, :key \"2\", :value \"x 2 4 y\"}\n{:process 2, :type :ok, :f :append, :key \"2\", :value \"x 2 4 y\"}\n{:process 2, :type :invoke, :f :put, :key \"3\", :value \"x 2 5 y\"}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 5 y\"}\n{:process 3, :type :invoke, :f :append, :key \"4\", :value \"x 3 6 y\"}\n{:process 3, :type :ok, :f :append, :key \"4\", :value \"x 3 6 y\"}\n{:process 3, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"2\", :value \"x 5 5 yx 8 13 yx 6 1 yx 5 15 yx 1 11 yx 2 4 y\"}\n{:process 4, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"2\", :value \"x 5 5 yx 8 13 yx 6 1 yx 5 15 yx 1 11 yx 2 4 y\"}\n{:process 4, :type :invoke, :f :append, :key \"2\", :value \"x 4 1 y\"}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 5 21 y\"}\n{:process 8, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"5\", :value \"x 2 2 y\"}\n{:process 8, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"8\", :value \"x 8 8 yx 0 2 yx 0 4 yx 0 7 yx 5 2 yx 3 1 yx 5 17 y\"}\n{:process 8, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 11 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 12 y\"}\n{:process 8, :type :ok, :f :get, :key \"2\", :value \"x 5 5 yx 8 13 yx 6 1 yx 5 15 yx 1 11 yx 2 4 yx 4 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 14 y\"}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 14 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 15 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 15 y\"}\n{:process 8, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"2\", :value \"x 5 5 yx 8 13 yx 6 1 yx 5 15 yx 1 11 yx 2 4 yx 4 1 yx 8 15 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 16 y\"}\n{:process 9, :type :ok, :f :get, :key \"7\", :value \"x 5 18 yx 0 10 yx 7 7 y\"}\n{:process 9, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 16 y\"}\n{:process 8, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 2, :type :ok, :f :put, :key \"3\", :value \"x 2 5 y\"}\n{:process 2, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"8\", :value \"x 8 8 yx 0 2 yx 0 4 yx 0 7 yx 5 2 yx 3 1 yx 5 17 yx 0 11 yx 0 12 y\"}\n{:process 9, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"4\", :value \"x 2 3 yx 3 6 y\"}\n{:process 8, :type :invoke, :f :append, :key \"7\", :value \"x 8 17 y\"}\n{:process 8, :type :ok, :f :append, :key \"7\", :value \"x 8 17 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 yx 5 6 yx 0 9 yx 7 6 yx 5 11 y\"}\n{:process 3, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"3\", :value \"x 2 5 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 7 y\"}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 7 y\"}\n{:process 3, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"9\", :value \"x 4 4 yx 6 0 yx 3 0 yx 5 0 yx 7 3 yx 2 3 yx 8 2 yx 8 3 yx 6 3 yx 7 2 yx 7 3 yx 4 0 yx 0 6 yx 5 3 yx 1 10 yx 5 16 yx 5 19 yx 5 20 y\"}\n{:process 3, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"5\", :value \"x 2 2 yx 8 16 yx 3 7 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 8 y\"}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 8 y\"}\n{:process 3, :type :invoke, :f :put, :key \"0\", :value \"x 3 9 y\"}\n{:process 3, :type :ok, :f :put, :key \"0\", :value \"x 3 9 y\"}\n{:process 3, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"2\", :value \"x 1 11 y\"}\n{:process 1, :type :invoke, :f :append, :key \"7\", :value \"x 1 12 y\"}\n{:process 3, :type :ok, :f :get, :key \"0\", :value \"x 3 9 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 10 y\"}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 10 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 11 y\"}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 11 y\"}\n{:process 3, :type :invoke, :f :put, :key \"3\", :value \"x 3 12 y\"}\n{:process 3, :type :ok, :f :put, :key \"3\", :value \"x 3 12 y\"}\n{:process 3, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"2\", :value \"x 5 5 yx 8 13 yx 6 1 yx 5 15 yx 1 11 yx 2 4 yx 4 1 yx 8 15 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 13 y\"}\n{:process 9, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 yx 5 6 yx 0 9 yx 7 6 yx 5 11 y\"}\n{:process 9, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"7\", :value \"x 7 7 y\"}\n{:process 2, :type :ok, :f :get, :key \"8\", :value \"x 8 8 yx 0 2 yx 0 4 yx 0 7 yx 5 2 yx 3 1 yx 5 17 yx 0 11 yx 0 12 y\"}\n{:process 5, :type :ok, :f :put, :key \"3\", :value \"x 5 21 y\"}\n{:process 6, :type :ok, :f :get, :key \"7\", :value \"x 5 18 yx 0 10 yx 7 7 yx 8 17 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 12 y\"}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 7 4 yx 4 11 yx 4 16 yx 4 17 yx 2 8 yx 7 12 yx 5 6 yx 0 9 yx 7 6 yx 5 11 y\"}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 13 y\"}\n{:process 1, :type :ok, :f :append, :key \"7\", :value \"x 1 12 y\"}\n{:process 9, :type :ok, :f :get, :key \"1\", :value \"x 0 0 yx 0 1 yx 0 3 yx 7 4 yx 1 6 yx 1 7 yx 3 5 yx 8 14 y\"}\n{:process 4, :type :ok, :f :append, :key \"2\", :value \"x 4 1 y\"}"
  },
  {
    "path": "courses/dss/linearizability/test_data/c50-bad.txt",
    "content": "{:process 2, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 21, :type :invoke, :f :append, :key \"9\", :value \"x 21 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"8\", :value \"x 4 0 y\"}\n{:process 5, :type :invoke, :f :append, :key \"1\", :value \"x 5 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 7, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 0 y\"}\n{:process 10, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 11, :type :invoke, :f :append, :key \"6\", :value \"x 11 0 y\"}\n{:process 12, :type :invoke, :f :append, :key \"6\", :value \"x 12 0 y\"}\n{:process 49, :type :invoke, :f :append, :key \"0\", :value \"x 49 0 y\"}\n{:process 13, :type :invoke, :f :append, :key \"9\", :value \"x 13 0 y\"}\n{:process 22, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 14, :type :invoke, :f :put, :key \"6\", :value \"x 14 0 y\"}\n{:process 23, :type :invoke, :f :append, :key \"8\", :value \"x 23 0 y\"}\n{:process 15, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 24, :type :invoke, :f :append, :key \"9\", :value \"x 24 0 y\"}\n{:process 16, :type :invoke, :f :append, :key \"7\", :value \"x 16 0 y\"}\n{:process 25, :type :invoke, :f :append, :key \"1\", :value \"x 25 0 y\"}\n{:process 17, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 26, :type :invoke, :f :append, :key \"2\", :value \"x 26 0 y\"}\n{:process 18, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 27, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 19, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 28, :type :invoke, :f :append, :key \"0\", :value \"x 28 0 y\"}\n{:process 29, :type :invoke, :f :put, :key \"7\", :value \"x 29 0 y\"}\n{:process 30, :type :invoke, :f :append, :key \"1\", :value \"x 30 0 y\"}\n{:process 20, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 31, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 40, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 41, :type :invoke, :f :append, :key \"9\", :value \"x 41 0 y\"}\n{:process 32, :type :invoke, :f :append, :key \"0\", :value \"x 32 0 y\"}\n{:process 42, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 33, :type :invoke, :f :append, :key \"5\", :value \"x 33 0 y\"}\n{:process 43, :type :invoke, :f :put, :key \"5\", :value \"x 43 0 y\"}\n{:process 44, :type :invoke, :f :append, :key \"4\", :value \"x 44 0 y\"}\n{:process 45, :type :invoke, :f :append, :key \"5\", :value \"x 45 0 y\"}\n{:process 46, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 47, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 34, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 48, :type :invoke, :f :put, :key \"8\", :value \"x 48 0 y\"}\n{:process 1, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 1, :type :invoke, :f :append, :key \"8\", :value \"x 1 0 y\"}\n{:process 35, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 37, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 38, :type :invoke, :f :append, :key \"4\", :value \"x 38 0 y\"}\n{:process 36, :type :invoke, :f :append, :key \"9\", :value \"x 36 0 y\"}\n{:process 39, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 46, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"3\", :value \"\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 42, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"8\", :value \"\"}\n{:process 46, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"0\", :value \"\"}\n{:process 22, :type :invoke, :f :append, :key \"2\", :value \"x 22 0 y\"}\n{:process 18, :type :ok, :f :get, :key \"3\", :value \"\"}\n{:process 7, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 0 y\"}\n{:process 18, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 8, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 35, :type :invoke, :f :append, :key \"3\", :value \"x 35 0 y\"}\n{:process 2, :type :ok, :f :get, :key \"0\", :value \"\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 0 y\"}\n{:process 19, :type :ok, :f :get, :key \"8\", :value \"\"}\n{:process 19, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 19, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 47, :type :invoke, :f :append, :key \"2\", :value \"x 47 0 y\"}\n{:process 20, :type :ok, :f :get, :key \"5\", :value \"\"}\n{:process 20, :type :invoke, :f :append, :key \"3\", :value \"x 20 0 y\"}\n{:process 15, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 15, :type :invoke, :f :append, :key \"2\", :value \"x 15 0 y\"}\n{:process 17, :type :ok, :f :get, :key \"2\", :value \"\"}\n{:process 17, :type :invoke, :f :append, :key \"7\", :value \"x 17 0 y\"}\n{:process 27, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 27, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 8, :type :invoke, :f :append, :key \"4\", :value \"x 8 0 y\"}\n{:process 42, :type :ok, :f :get, :key \"3\", :value \"\"}\n{:process 42, :type :invoke, :f :append, :key \"3\", :value \"x 42 0 y\"}\n{:process 31, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 31, :type :invoke, :f :append, :key \"6\", :value \"x 31 0 y\"}\n{:process 37, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 37, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"5\", :value \"\"}\n{:process 46, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"0\", :value \"\"}\n{:process 39, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"5\", :value \"\"}\n{:process 27, :type :invoke, :f :append, :key \"2\", :value \"x 27 0 y\"}\n{:process 18, :type :ok, :f :get, :key \"0\", :value \"\"}\n{:process 18, :type :invoke, :f :append, :key \"9\", :value \"x 18 0 y\"}\n{:process 39, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 39, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"0\", :value \"\"}\n{:process 19, :type :invoke, :f :append, :key \"8\", :value \"x 19 0 y\"}\n{:process 39, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 39, :type :invoke, :f :append, :key \"7\", :value \"x 39 0 y\"}\n{:process 46, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 46, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 46, :type :invoke, :f :put, :key \"5\", :value \"x 46 0 y\"}\n{:process 6, :type :ok, :f :get, :key \"8\", :value \"\"}\n{:process 6, :type :invoke, :f :append, :key \"4\", :value \"x 6 0 y\"}\n{:process 40, :type :ok, :f :get, :key \"2\", :value \"\"}\n{:process 40, :type :invoke, :f :append, :key \"1\", :value \"x 40 0 y\"}\n{:process 37, :type :ok, :f :get, :key \"0\", :value \"\"}\n{:process 37, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"4\", :value \"\"}\n{:process 37, :type :invoke, :f :put, :key \"0\", :value \"x 37 0 y\"}\n{:process 34, :type :ok, :f :get, :key \"5\", :value \"\"}\n{:process 34, :type :invoke, :f :append, :key \"1\", :value \"x 34 0 y\"}\n{:process 10, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 10, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"2\", :value \"\"}\n{:process 10, :type :invoke, :f :append, :key \"5\", :value \"x 10 0 y\"}\n{:process 12, :type :ok, :f :append, :key \"6\", :value \"x 12 0 y\"}\n{:process 12, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 30, :type :ok, :f :append, :key \"1\", :value \"x 30 0 y\"}\n{:process 30, :type :invoke, :f :append, :key \"6\", :value \"x 30 1 y\"}\n{:process 12, :type :ok, :f :get, :key \"2\", :value \"\"}\n{:process 12, :type :invoke, :f :append, :key \"7\", :value \"x 12 1 y\"}\n{:process 26, :type :ok, :f :append, :key \"2\", :value \"x 26 0 y\"}\n{:process 26, :type :invoke, :f :append, :key \"4\", :value \"x 26 1 y\"}\n{:process 30, :type :ok, :f :append, :key \"6\", :value \"x 30 1 y\"}\n{:process 30, :type :invoke, :f :append, :key \"0\", :value \"x 30 2 y\"}\n{:process 12, :type :ok, :f :append, :key \"7\", :value \"x 12 1 y\"}\n{:process 12, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"4\", :value \"x 6 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"8\", :value \"x 6 1 y\"}\n{:process 26, :type :ok, :f :append, :key \"4\", :value \"x 26 1 y\"}\n{:process 26, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 26, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 12, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 0 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 1 y\"}\n{:process 30, :type :ok, :f :append, :key \"0\", :value \"x 30 2 y\"}\n{:process 46, :type :ok, :f :put, :key \"5\", :value \"x 46 0 y\"}\n{:process 30, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 46, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"8\", :value \"x 6 1 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"0\", :value \"x 2 0 yx 30 2 y\"}\n{:process 12, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"3\", :value \"\"}\n{:process 30, :type :invoke, :f :append, :key \"1\", :value \"x 30 3 y\"}\n{:process 46, :type :ok, :f :get, :key \"2\", :value \"x 26 0 y\"}\n{:process 46, :type :invoke, :f :append, :key \"1\", :value \"x 46 1 y\"}\n{:process 12, :type :ok, :f :get, :key \"5\", :value \"x 46 0 y\"}\n{:process 12, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 2 y\"}\n{:process 46, :type :ok, :f :append, :key \"1\", :value \"x 46 1 y\"}\n{:process 46, :type :invoke, :f :append, :key \"4\", :value \"x 46 2 y\"}\n{:process 12, :type :ok, :f :get, :key \"6\", :value \"x 12 0 yx 30 1 y\"}\n{:process 12, :type :invoke, :f :append, :key \"0\", :value \"x 12 2 y\"}\n{:process 30, :type :ok, :f :append, :key \"1\", :value \"x 30 3 y\"}\n{:process 30, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 12, :type :ok, :f :append, :key \"0\", :value \"x 12 2 y\"}\n{:process 12, :type :invoke, :f :append, :key \"8\", :value \"x 12 3 y\"}\n{:process 46, :type :ok, :f :append, :key \"4\", :value \"x 46 2 y\"}\n{:process 46, :type :invoke, :f :append, :key \"5\", :value \"x 46 3 y\"}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 3 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 3 y\"}\n{:process 6, :type :invoke, :f :put, :key \"3\", :value \"x 6 4 y\"}\n{:process 13, :type :ok, :f :append, :key \"9\", :value \"x 13 0 y\"}\n{:process 13, :type :invoke, :f :append, :key \"1\", :value \"x 13 1 y\"}\n{:process 36, :type :ok, :f :append, :key \"9\", :value \"x 36 0 y\"}\n{:process 36, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 12, :type :ok, :f :append, :key \"8\", :value \"x 12 3 y\"}\n{:process 12, :type :invoke, :f :append, :key \"3\", :value \"x 12 4 y\"}\n{:process 36, :type :ok, :f :get, :key \"7\", :value \"x 12 1 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 1 y\"}\n{:process 12, :type :ok, :f :append, :key \"3\", :value \"x 12 4 y\"}\n{:process 12, :type :invoke, :f :append, :key \"3\", :value \"x 12 5 y\"}\n{:process 13, :type :ok, :f :append, :key \"1\", :value \"x 13 1 y\"}\n{:process 13, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 6, :type :ok, :f :put, :key \"3\", :value \"x 6 4 y\"}\n{:process 6, :type :invoke, :f :append, :key \"6\", :value \"x 6 5 y\"}\n{:process 16, :type :ok, :f :append, :key \"7\", :value \"x 16 0 y\"}\n{:process 16, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"5\", :value \"x 10 0 y\"}\n{:process 10, :type :invoke, :f :append, :key \"7\", :value \"x 10 1 y\"}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"4\", :value \"x 3 1 y\"}\n{:process 16, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 y\"}\n{:process 16, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"6\", :value \"x 12 0 yx 30 1 y\"}\n{:process 13, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"8\", :value \"x 19 0 y\"}\n{:process 19, :type :invoke, :f :append, :key \"5\", :value \"x 19 1 y\"}\n{:process 6, :type :ok, :f :append, :key \"6\", :value \"x 6 5 y\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 6 y\"}\n{:process 26, :type :ok, :f :get, :key \"7\", :value \"x 12 1 y\"}\n{:process 26, :type :invoke, :f :append, :key \"0\", :value \"x 26 2 y\"}\n{:process 12, :type :ok, :f :append, :key \"3\", :value \"x 12 5 y\"}\n{:process 12, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"6\", :value \"x 12 0 yx 30 1 yx 6 5 y\"}\n{:process 16, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 6 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"7\", :value \"x 10 1 y\"}\n{:process 10, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 y\"}\n{:process 13, :type :invoke, :f :append, :key \"2\", :value \"x 13 2 y\"}\n{:process 3, :type :ok, :f :append, :key \"4\", :value \"x 3 1 y\"}\n{:process 3, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"2\", :value \"x 26 0 y\"}\n{:process 3, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 y\"}\n{:process 3, :type :invoke, :f :append, :key \"8\", :value \"x 3 2 y\"}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 y\"}\n{:process 12, :type :invoke, :f :append, :key \"4\", :value \"x 12 6 y\"}\n{:process 16, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 y\"}\n{:process 16, :type :invoke, :f :append, :key \"4\", :value \"x 16 1 y\"}\n{:process 10, :type :ok, :f :get, :key \"2\", :value \"x 26 0 y\"}\n{:process 10, :type :invoke, :f :append, :key \"3\", :value \"x 10 2 y\"}\n{:process 13, :type :ok, :f :append, :key \"2\", :value \"x 13 2 y\"}\n{:process 13, :type :invoke, :f :append, :key \"0\", :value \"x 13 3 y\"}\n{:process 12, :type :ok, :f :append, :key \"4\", :value \"x 12 6 y\"}\n{:process 12, :type :invoke, :f :append, :key \"0\", :value \"x 12 7 y\"}\n{:process 10, :type :ok, :f :append, :key \"3\", :value \"x 10 2 y\"}\n{:process 10, :type :invoke, :f :append, :key \"6\", :value \"x 10 3 y\"}\n{:process 15, :type :ok, :f :append, :key \"2\", :value \"x 15 0 y\"}\n{:process 15, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"8\", :value \"x 3 2 y\"}\n{:process 3, :type :invoke, :f :append, :key \"0\", :value \"x 3 3 y\"}\n{:process 13, :type :ok, :f :append, :key \"0\", :value \"x 13 3 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"9\", :value \"x 24 0 y\"}\n{:process 24, :type :invoke, :f :append, :key \"3\", :value \"x 24 1 y\"}\n{:process 30, :type :ok, :f :get, :key \"5\", :value \"x 46 0 yx 6 3 yx 10 0 yx 19 1 y\"}\n{:process 30, :type :invoke, :f :append, :key \"8\", :value \"x 30 4 y\"}\n{:process 15, :type :ok, :f :get, :key \"5\", :value \"x 46 0 yx 6 3 yx 10 0 yx 19 1 y\"}\n{:process 15, :type :invoke, :f :append, :key \"7\", :value \"x 15 1 y\"}\n{:process 3, :type :ok, :f :append, :key \"0\", :value \"x 3 3 y\"}\n{:process 3, :type :invoke, :f :append, :key \"6\", :value \"x 3 4 y\"}\n{:process 49, :type :ok, :f :append, :key \"0\", :value \"x 49 0 y\"}\n{:process 49, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 46 0 yx 6 3 yx 10 0 yx 19 1 y\"}\n{:process 13, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"6\", :value \"x 12 0 yx 30 1 yx 6 5 y\"}\n{:process 13, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"6\", :value \"x 12 0 yx 30 1 yx 6 5 y\"}\n{:process 13, :type :invoke, :f :put, :key \"7\", :value \"x 13 4 y\"}\n{:process 49, :type :ok, :f :get, :key \"3\", :value \"x 6 4 yx 12 5 yx 10 2 y\"}\n{:process 49, :type :invoke, :f :append, :key \"3\", :value \"x 49 1 y\"}\n{:process 24, :type :ok, :f :append, :key \"3\", :value \"x 24 1 y\"}\n{:process 24, :type :invoke, :f :append, :key \"5\", :value \"x 24 2 y\"}\n{:process 15, :type :ok, :f :append, :key \"7\", :value \"x 15 1 y\"}\n{:process 15, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"3\", :value \"x 49 1 y\"}\n{:process 49, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"5\", :value \"x 46 0 yx 6 3 yx 10 0 yx 19 1 y\"}\n{:process 15, :type :invoke, :f :append, :key \"5\", :value \"x 15 2 y\"}\n{:process 13, :type :ok, :f :put, :key \"7\", :value \"x 13 4 y\"}\n{:process 13, :type :invoke, :f :append, :key \"5\", :value \"x 13 5 y\"}\n{:process 49, :type :ok, :f :get, :key \"8\", :value \"x 6 1 yx 12 3 yx 19 0 yx 3 2 y\"}\n{:process 49, :type :invoke, :f :append, :key \"9\", :value \"x 49 2 y\"}\n{:process 24, :type :ok, :f :append, :key \"5\", :value \"x 24 2 y\"}\n{:process 24, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"5\", :value \"x 15 2 y\"}\n{:process 15, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 y\"}\n{:process 15, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"7\", :value \"x 13 4 y\"}\n{:process 6, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 48, :type :ok, :f :put, :key \"8\", :value \"x 48 0 y\"}\n{:process 48, :type :invoke, :f :append, :key \"0\", :value \"x 48 1 y\"}\n{:process 15, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 y\"}\n{:process 15, :type :invoke, :f :append, :key \"4\", :value \"x 15 3 y\"}\n{:process 49, :type :ok, :f :append, :key \"9\", :value \"x 49 2 y\"}\n{:process 49, :type :invoke, :f :append, :key \"8\", :value \"x 49 3 y\"}\n{:process 37, :type :ok, :f :put, :key \"0\", :value \"x 37 0 y\"}\n{:process 37, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"2\", :value \"x 26 0 yx 13 2 yx 15 0 y\"}\n{:process 37, :type :invoke, :f :append, :key \"8\", :value \"x 37 1 y\"}\n{:process 6, :type :ok, :f :get, :key \"5\", :value \"x 46 0 yx 6 3 yx 10 0 yx 19 1 yx 24 2 yx 15 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"7\", :value \"x 6 7 y\"}\n{:process 28, :type :ok, :f :append, :key \"0\", :value \"x 28 0 y\"}\n{:process 28, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 48, :type :ok, :f :append, :key \"0\", :value \"x 48 1 y\"}\n{:process 48, :type :invoke, :f :append, :key \"1\", :value \"x 48 2 y\"}\n{:process 15, :type :ok, :f :append, :key \"4\", :value \"x 15 3 y\"}\n{:process 15, :type :invoke, :f :append, :key \"1\", :value \"x 15 4 y\"}\n{:process 49, :type :ok, :f :append, :key \"8\", :value \"x 49 3 y\"}\n{:process 49, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"4\", :value \"x 8 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 37, :type :ok, :f :append, :key \"8\", :value \"x 37 1 y\"}\n{:process 37, :type :invoke, :f :append, :key \"5\", :value \"x 37 2 y\"}\n{:process 18, :type :ok, :f :append, :key \"9\", :value \"x 18 0 y\"}\n{:process 18, :type :invoke, :f :append, :key \"9\", :value \"x 18 1 y\"}\n{:process 35, :type :ok, :f :append, :key \"3\", :value \"x 35 0 y\"}\n{:process 35, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"2\", :value \"x 26 0 yx 13 2 yx 15 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 35, :type :ok, :f :get, :key \"7\", :value \"x 13 4 y\"}\n{:process 35, :type :invoke, :f :append, :key \"0\", :value \"x 35 1 y\"}\n{:process 18, :type :ok, :f :append, :key \"9\", :value \"x 18 1 y\"}\n{:process 18, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"1\", :value \"x 5 0 y\"}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 1 y\"}\n{:process 15, :type :ok, :f :append, :key \"1\", :value \"x 15 4 y\"}\n{:process 15, :type :invoke, :f :append, :key \"2\", :value \"x 15 5 y\"}\n{:process 37, :type :ok, :f :append, :key \"5\", :value \"x 37 2 y\"}\n{:process 37, :type :invoke, :f :append, :key \"5\", :value \"x 37 3 y\"}\n{:process 49, :type :ok, :f :get, :key \"7\", :value \"x 13 4 y\"}\n{:process 49, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 1 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"0\", :value \"x 37 0 yx 28 0 yx 48 1 y\"}\n{:process 18, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 37, :type :ok, :f :append, :key \"5\", :value \"x 37 3 y\"}\n{:process 37, :type :invoke, :f :append, :key \"2\", :value \"x 37 4 y\"}\n{:process 35, :type :ok, :f :append, :key \"0\", :value \"x 35 1 y\"}\n{:process 35, :type :invoke, :f :append, :key \"7\", :value \"x 35 2 y\"}\n{:process 49, :type :ok, :f :get, :key \"6\", :value \"x 14 0 y\"}\n{:process 49, :type :invoke, :f :append, :key \"7\", :value \"x 49 4 y\"}\n{:process 15, :type :ok, :f :append, :key \"2\", :value \"x 15 5 y\"}\n{:process 15, :type :invoke, :f :put, :key \"3\", :value \"x 15 6 y\"}\n{:process 18, :type :ok, :f :get, :key \"3\", :value \"x 6 4 yx 12 5 yx 10 2 yx 24 1 yx 49 1 yx 35 0 y\"}\n{:process 18, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 26 0 yx 13 2 yx 15 0 yx 15 5 y\"}\n{:process 5, :type :invoke, :f :put, :key \"0\", :value \"x 5 2 y\"}\n{:process 18, :type :ok, :f :get, :key \"2\", :value \"x 26 0 yx 13 2 yx 15 0 yx 15 5 y\"}\n{:process 18, :type :invoke, :f :append, :key \"8\", :value \"x 18 2 y\"}\n{:process 37, :type :ok, :f :append, :key \"2\", :value \"x 37 4 y\"}\n{:process 37, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"7\", :value \"x 35 2 y\"}\n{:process 35, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"5\", :value \"x 46 0 yx 6 3 yx 10 0 yx 19 1 yx 24 2 yx 15 2 yx 33 0 yx 37 2 yx 37 3 y\"}\n{:process 35, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 y\"}\n{:process 24, :type :invoke, :f :append, :key \"7\", :value \"x 24 3 y\"}\n{:process 49, :type :ok, :f :append, :key \"7\", :value \"x 49 4 y\"}\n{:process 5, :type :ok, :f :put, :key \"0\", :value \"x 5 2 y\"}\n{:process 49, :type :invoke, :f :append, :key \"3\", :value \"x 49 5 y\"}\n{:process 5, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 15, :type :ok, :f :put, :key \"3\", :value \"x 15 6 y\"}\n{:process 15, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 y\"}\n{:process 37, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"8\", :value \"x 18 2 y\"}\n{:process 18, :type :invoke, :f :append, :key \"1\", :value \"x 18 3 y\"}\n{:process 21, :type :ok, :f :append, :key \"9\", :value \"x 21 0 y\"}\n{:process 21, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"6\", :value \"x 14 0 y\"}\n{:process 15, :type :invoke, :f :append, :key \"7\", :value \"x 15 7 y\"}\n{:process 21, :type :ok, :f :get, :key \"6\", :value \"x 14 0 y\"}\n{:process 21, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 y\"}\n{:process 37, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"1\", :value \"x 18 3 y\"}\n{:process 18, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 y\"}\n{:process 37, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"3\", :value \"x 49 5 y\"}\n{:process 49, :type :invoke, :f :append, :key \"3\", :value \"x 49 6 y\"}\n{:process 18, :type :ok, :f :get, :key \"6\", :value \"x 14 0 y\"}\n{:process 18, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 y\"}\n{:process 21, :type :invoke, :f :append, :key \"7\", :value \"x 21 1 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 1 y\"}\n{:process 27, :type :ok, :f :append, :key \"2\", :value \"x 27 0 y\"}\n{:process 27, :type :invoke, :f :append, :key \"7\", :value \"x 27 1 y\"}\n{:process 18, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 y\"}\n{:process 18, :type :invoke, :f :append, :key \"9\", :value \"x 18 4 y\"}\n{:process 15, :type :ok, :f :append, :key \"7\", :value \"x 15 7 y\"}\n{:process 15, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"7\", :value \"x 13 4 yx 35 2 yx 49 4 y\"}\n{:process 28, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"3\", :value \"x 49 6 y\"}\n{:process 49, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"6\", :value \"x 14 0 y\"}\n{:process 15, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :put, :key \"2\", :value \"x 0 2 y\"}\n{:process 21, :type :ok, :f :append, :key \"7\", :value \"x 21 1 y\"}\n{:process 21, :type :invoke, :f :append, :key \"0\", :value \"x 21 2 y\"}\n{:process 27, :type :ok, :f :append, :key \"7\", :value \"x 27 1 y\"}\n{:process 27, :type :invoke, :f :append, :key \"4\", :value \"x 27 2 y\"}\n{:process 28, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 y\"}\n{:process 28, :type :invoke, :f :append, :key \"0\", :value \"x 28 1 y\"}\n{:process 18, :type :ok, :f :append, :key \"9\", :value \"x 18 4 y\"}\n{:process 18, :type :invoke, :f :append, :key \"8\", :value \"x 18 5 y\"}\n{:process 0, :type :ok, :f :put, :key \"2\", :value \"x 0 2 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 3 y\"}\n{:process 21, :type :ok, :f :append, :key \"0\", :value \"x 21 2 y\"}\n{:process 21, :type :invoke, :f :append, :key \"8\", :value \"x 21 3 y\"}\n{:process 15, :type :ok, :f :get, :key \"2\", :value \"x 0 2 y\"}\n{:process 15, :type :invoke, :f :put, :key \"0\", :value \"x 15 8 y\"}\n{:process 18, :type :ok, :f :append, :key \"8\", :value \"x 18 5 y\"}\n{:process 18, :type :invoke, :f :append, :key \"9\", :value \"x 18 6 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"4\", :value \"x 27 2 y\"}\n{:process 27, :type :invoke, :f :append, :key \"8\", :value \"x 27 3 y\"}\n{:process 0, :type :ok, :f :get, :key \"3\", :value \"x 15 6 yx 49 5 yx 49 6 yx 0 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 4 y\"}\n{:process 18, :type :ok, :f :append, :key \"9\", :value \"x 18 6 y\"}\n{:process 18, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"8\", :value \"x 4 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 1 y\"}\n{:process 18, :type :ok, :f :get, :key \"3\", :value \"x 15 6 yx 49 5 yx 49 6 yx 0 1 y\"}\n{:process 18, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"6\", :value \"x 11 0 y\"}\n{:process 11, :type :invoke, :f :append, :key \"2\", :value \"x 11 1 y\"}\n{:process 21, :type :ok, :f :append, :key \"8\", :value \"x 21 3 y\"}\n{:process 21, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 y\"}\n{:process 21, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 15, :type :ok, :f :put, :key \"0\", :value \"x 15 8 y\"}\n{:process 15, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"0\", :value \"x 15 8 y\"}\n{:process 21, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 y\"}\n{:process 18, :type :invoke, :f :append, :key \"8\", :value \"x 18 7 y\"}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 1 y\"}\n{:process 4, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"0\", :value \"x 15 8 y\"}\n{:process 37, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"3\", :value \"x 15 6 yx 49 5 yx 49 6 yx 0 1 y\"}\n{:process 37, :type :invoke, :f :put, :key \"3\", :value \"x 37 5 y\"}\n{:process 21, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 y\"}\n{:process 21, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 15 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 5 y\"}\n{:process 11, :type :ok, :f :append, :key \"2\", :value \"x 11 1 y\"}\n{:process 11, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"6\", :value \"x 31 0 y\"}\n{:process 31, :type :invoke, :f :append, :key \"3\", :value \"x 31 1 y\"}\n{:process 31, :type :ok, :f :append, :key \"3\", :value \"x 31 1 y\"}\n{:process 31, :type :invoke, :f :append, :key \"7\", :value \"x 31 2 y\"}\n{:process 49, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 y\"}\n{:process 49, :type :invoke, :f :append, :key \"4\", :value \"x 49 7 y\"}\n{:process 31, :type :ok, :f :append, :key \"7\", :value \"x 31 2 y\"}\n{:process 31, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"5\", :value \"x 46 0 yx 6 3 yx 10 0 yx 19 1 yx 24 2 yx 15 2 yx 33 0 yx 37 2 yx 37 3 yx 0 3 y\"}\n{:process 35, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 0 y\"}\n{:process 7, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"5\", :value \"x 46 0 yx 6 3 yx 10 0 yx 19 1 yx 24 2 yx 15 2 yx 33 0 yx 37 2 yx 37 3 yx 0 3 y\"}\n{:process 5, :type :invoke, :f :append, :key \"4\", :value \"x 5 3 y\"}\n{:process 35, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 y\"}\n{:process 35, :type :invoke, :f :append, :key \"5\", :value \"x 35 3 y\"}\n{:process 15, :type :ok, :f :get, :key \"0\", :value \"x 15 8 y\"}\n{:process 15, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"7\", :value \"x 13 4 yx 35 2 yx 49 4 yx 15 7 yx 21 1 yx 27 1 yx 31 2 y\"}\n{:process 4, :type :invoke, :f :append, :key \"2\", :value \"x 4 2 y\"}\n{:process 21, :type :ok, :f :get, :key \"5\", :value \"x 46 0 yx 6 3 yx 10 0 yx 19 1 yx 24 2 yx 15 2 yx 33 0 yx 37 2 yx 37 3 yx 0 3 y\"}\n{:process 21, :type :invoke, :f :append, :key \"5\", :value \"x 21 4 y\"}\n{:process 15, :type :ok, :f :get, :key \"0\", :value \"x 15 8 y\"}\n{:process 15, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"7\", :value \"x 13 4 yx 35 2 yx 49 4 yx 15 7 yx 21 1 yx 27 1 yx 31 2 y\"}\n{:process 31, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"3\", :value \"x 15 6 yx 49 5 yx 49 6 yx 0 1 yx 4 1 yx 20 0 yx 31 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 1 y\"}\n{:process 15, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 y\"}\n{:process 15, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 y\"}\n{:process 11, :type :invoke, :f :append, :key \"8\", :value \"x 11 2 y\"}\n{:process 15, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 y\"}\n{:process 15, :type :invoke, :f :append, :key \"5\", :value \"x 15 9 y\"}\n{:process 31, :type :ok, :f :get, :key \"3\", :value \"x 15 6 yx 49 5 yx 49 6 yx 0 1 yx 4 1 yx 20 0 yx 31 1 y\"}\n{:process 31, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 y\"}\n{:process 31, :type :invoke, :f :append, :key \"1\", :value \"x 31 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"2\", :value \"x 47 0 y\"}\n{:process 47, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"5\", :value \"x 19 1 y\"}\n{:process 19, :type :invoke, :f :append, :key \"4\", :value \"x 19 2 y\"}\n{:process 47, :type :ok, :f :get, :key \"5\", :value \"x 43 0 y\"}\n{:process 47, :type :invoke, :f :append, :key \"2\", :value \"x 47 1 y\"}\n{:process 19, :type :ok, :f :append, :key \"4\", :value \"x 19 2 y\"}\n{:process 19, :type :invoke, :f :append, :key \"4\", :value \"x 19 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"2\", :value \"x 47 1 y\"}\n{:process 47, :type :invoke, :f :append, :key \"7\", :value \"x 47 2 y\"}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 0 y\"}\n{:process 9, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"1\", :value \"x 34 0 y\"}\n{:process 34, :type :invoke, :f :append, :key \"7\", :value \"x 34 1 y\"}\n{:process 6, :type :ok, :f :append, :key \"7\", :value \"x 6 7 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"5\", :value \"x 21 4 y\"}\n{:process 21, :type :invoke, :f :append, :key \"2\", :value \"x 21 5 y\"}\n{:process 19, :type :ok, :f :append, :key \"4\", :value \"x 19 3 y\"}\n{:process 19, :type :invoke, :f :append, :key \"0\", :value \"x 19 4 y\"}\n{:process 47, :type :ok, :f :append, :key \"7\", :value \"x 47 2 y\"}\n{:process 21, :type :ok, :f :append, :key \"2\", :value \"x 21 5 y\"}\n{:process 47, :type :invoke, :f :append, :key \"6\", :value \"x 47 3 y\"}\n{:process 21, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"7\", :value \"x 34 1 y\"}\n{:process 34, :type :invoke, :f :append, :key \"3\", :value \"x 34 2 y\"}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 15 8 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 8 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 8 y\"}\n{:process 6, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 y\"}\n{:process 21, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"6\", :value \"x 47 3 y\"}\n{:process 47, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 y\"}\n{:process 6, :type :invoke, :f :append, :key \"2\", :value \"x 6 9 y\"}\n{:process 47, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 y\"}\n{:process 47, :type :invoke, :f :append, :key \"1\", :value \"x 47 4 y\"}\n{:process 21, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 y\"}\n{:process 21, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"9\", :value \"x 41 0 y\"}\n{:process 41, :type :invoke, :f :append, :key \"5\", :value \"x 41 1 y\"}\n{:process 21, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 y\"}\n{:process 21, :type :invoke, :f :append, :key \"6\", :value \"x 21 6 y\"}\n{:process 29, :type :ok, :f :put, :key \"7\", :value \"x 29 0 y\"}\n{:process 29, :type :invoke, :f :append, :key \"4\", :value \"x 29 1 y\"}\n{:process 6, :type :ok, :f :append, :key \"2\", :value \"x 6 9 y\"}\n{:process 6, :type :invoke, :f :append, :key \"3\", :value \"x 6 10 y\"}\n{:process 21, :type :ok, :f :append, :key \"6\", :value \"x 21 6 y\"}\n{:process 21, :type :invoke, :f :append, :key \"5\", :value \"x 21 7 y\"}\n{:process 47, :type :ok, :f :append, :key \"1\", :value \"x 47 4 y\"}\n{:process 47, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"5\", :value \"x 41 1 y\"}\n{:process 41, :type :invoke, :f :append, :key \"2\", :value \"x 41 2 y\"}\n{:process 6, :type :ok, :f :append, :key \"3\", :value \"x 6 10 y\"}\n{:process 6, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"4\", :value \"x 29 1 y\"}\n{:process 29, :type :invoke, :f :append, :key \"3\", :value \"x 29 2 y\"}\n{:process 33, :type :ok, :f :append, :key \"5\", :value \"x 33 0 y\"}\n{:process 33, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 32, :type :ok, :f :append, :key \"0\", :value \"x 32 0 y\"}\n{:process 32, :type :invoke, :f :append, :key \"5\", :value \"x 32 1 y\"}\n{:process 41, :type :ok, :f :append, :key \"2\", :value \"x 41 2 y\"}\n{:process 41, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 y\"}\n{:process 41, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"3\", :value \"x 15 6 yx 49 5 yx 49 6 yx 0 1 yx 4 1 yx 20 0 yx 31 1 yx 34 2 yx 6 10 y\"}\n{:process 33, :type :invoke, :f :append, :key \"0\", :value \"x 33 1 y\"}\n{:process 9, :type :ok, :f :get, :key \"3\", :value \"x 15 6 yx 49 5 yx 49 6 yx 0 1 yx 4 1 yx 20 0 yx 31 1 yx 34 2 y\"}\n{:process 9, :type :invoke, :f :put, :key \"6\", :value \"x 9 1 y\"}\n{:process 10, :type :ok, :f :append, :key \"6\", :value \"x 10 3 y\"}\n{:process 10, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 yx 47 4 y\"}\n{:process 6, :type :invoke, :f :append, :key \"6\", :value \"x 6 11 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"9\", :value \"x 8 2 y\"}\n{:process 32, :type :ok, :f :append, :key \"5\", :value \"x 32 1 y\"}\n{:process 32, :type :invoke, :f :append, :key \"3\", :value \"x 32 2 y\"}\n{:process 49, :type :ok, :f :append, :key \"4\", :value \"x 49 7 y\"}\n{:process 49, :type :invoke, :f :append, :key \"2\", :value \"x 49 8 y\"}\n{:process 17, :type :ok, :f :append, :key \"7\", :value \"x 17 0 y\"}\n{:process 17, :type :invoke, :f :put, :key \"3\", :value \"x 17 1 y\"}\n{:process 10, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 y\"}\n{:process 10, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"6\", :value \"x 6 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"9\", :value \"x 8 2 y\"}\n{:process 8, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 33, :type :ok, :f :append, :key \"0\", :value \"x 33 1 y\"}\n{:process 33, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 y\"}\n{:process 10, :type :invoke, :f :append, :key \"7\", :value \"x 10 4 y\"}\n{:process 8, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 y\"}\n{:process 6, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 17, :type :ok, :f :put, :key \"3\", :value \"x 17 1 y\"}\n{:process 17, :type :invoke, :f :append, :key \"6\", :value \"x 17 2 y\"}\n{:process 32, :type :ok, :f :append, :key \"3\", :value \"x 32 2 y\"}\n{:process 32, :type :invoke, :f :append, :key \"4\", :value \"x 32 3 y\"}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 yx 47 4 y\"}\n{:process 8, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 y\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 3 y\"}\n{:process 32, :type :ok, :f :append, :key \"4\", :value \"x 32 3 y\"}\n{:process 32, :type :invoke, :f :append, :key \"4\", :value \"x 32 4 y\"}\n{:process 6, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"6\", :value \"x 17 2 y\"}\n{:process 17, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 y\"}\n{:process 17, :type :invoke, :f :append, :key \"1\", :value \"x 17 3 y\"}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 y\"}\n{:process 6, :type :invoke, :f :append, :key \"4\", :value \"x 6 12 y\"}\n{:process 47, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 yx 47 0 yx 47 1 yx 21 5 yx 6 9 yx 41 2 yx 8 1 y\"}\n{:process 47, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"3\", :value \"x 20 0 y\"}\n{:process 20, :type :invoke, :f :append, :key \"3\", :value \"x 20 1 y\"}\n{:process 1, :type :ok, :f :append, :key \"8\", :value \"x 1 0 y\"}\n{:process 1, :type :invoke, :f :append, :key \"7\", :value \"x 1 1 y\"}\n{:process 17, :type :ok, :f :append, :key \"1\", :value \"x 17 3 y\"}\n{:process 17, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"6\", :value \"x 3 4 y\"}\n{:process 3, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"8\", :value \"x 23 0 y\"}\n{:process 23, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"7\", :value \"x 1 1 y\"}\n{:process 1, :type :invoke, :f :append, :key \"1\", :value \"x 1 2 y\"}\n{:process 41, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 y\"}\n{:process 41, :type :invoke, :f :append, :key \"6\", :value \"x 41 3 y\"}\n{:process 23, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 y\"}\n{:process 23, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"6\", :value \"x 14 0 yx 11 0 yx 31 0 yx 47 3 yx 21 6 yx 10 3 yx 6 11 yx 17 2 y\"}\n{:process 17, :type :invoke, :f :append, :key \"9\", :value \"x 17 4 y\"}\n{:process 6, :type :ok, :f :append, :key \"4\", :value \"x 6 12 y\"}\n{:process 6, :type :invoke, :f :append, :key \"2\", :value \"x 6 13 y\"}\n{:process 20, :type :ok, :f :append, :key \"3\", :value \"x 20 1 y\"}\n{:process 20, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"6\", :value \"x 14 0 yx 11 0 yx 31 0 yx 47 3 yx 21 6 yx 10 3 yx 6 11 yx 17 2 y\"}\n{:process 47, :type :invoke, :f :put, :key \"8\", :value \"x 47 5 y\"}\n{:process 20, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 y\"}\n{:process 20, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"2\", :value \"x 6 13 y\"}\n{:process 6, :type :invoke, :f :append, :key \"7\", :value \"x 6 14 y\"}\n{:process 33, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 yx 47 0 yx 47 1 yx 21 5 yx 6 9 yx 41 2 yx 8 1 y\"}\n{:process 33, :type :invoke, :f :append, :key \"9\", :value \"x 33 2 y\"}\n{:process 3, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 yx 47 4 yx 17 3 y\"}\n{:process 3, :type :invoke, :f :append, :key \"4\", :value \"x 3 5 y\"}\n{:process 1, :type :ok, :f :append, :key \"1\", :value \"x 1 2 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"7\", :value \"x 29 0 yx 17 0 yx 10 4 yx 1 1 y\"}\n{:process 2, :type :invoke, :f :append, :key \"6\", :value \"x 2 2 y\"}\n{:process 23, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 yx 47 0 yx 47 1 yx 21 5 yx 6 9 yx 41 2 yx 8 1 yx 6 13 y\"}\n{:process 23, :type :invoke, :f :append, :key \"6\", :value \"x 23 1 y\"}\n{:process 17, :type :ok, :f :append, :key \"9\", :value \"x 17 4 y\"}\n{:process 17, :type :invoke, :f :append, :key \"3\", :value \"x 17 5 y\"}\n{:process 20, :type :ok, :f :get, :key \"3\", :value \"x 17 1 yx 32 2 yx 20 1 y\"}\n{:process 20, :type :invoke, :f :append, :key \"0\", :value \"x 20 2 y\"}\n{:process 39, :type :ok, :f :append, :key \"7\", :value \"x 39 0 y\"}\n{:process 39, :type :invoke, :f :append, :key \"4\", :value \"x 39 1 y\"}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 17 1 yx 32 2 yx 20 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"4\", :value \"x 3 5 y\"}\n{:process 2, :type :ok, :f :append, :key \"6\", :value \"x 2 2 y\"}\n{:process 3, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 2, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 y\"}\n{:process 1, :type :invoke, :f :append, :key \"0\", :value \"x 1 3 y\"}\n{:process 20, :type :ok, :f :append, :key \"0\", :value \"x 20 2 y\"}\n{:process 20, :type :invoke, :f :append, :key \"2\", :value \"x 20 3 y\"}\n{:process 39, :type :ok, :f :append, :key \"4\", :value \"x 39 1 y\"}\n{:process 39, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 yx 47 0 yx 47 1 yx 21 5 yx 6 9 yx 41 2 yx 8 1 yx 6 13 y\"}\n{:process 3, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 y\"}\n{:process 39, :type :invoke, :f :append, :key \"1\", :value \"x 39 2 y\"}\n{:process 2, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 3 y\"}\n{:process 1, :type :ok, :f :append, :key \"0\", :value \"x 1 3 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"2\", :value \"x 20 3 y\"}\n{:process 20, :type :invoke, :f :append, :key \"5\", :value \"x 20 4 y\"}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 17 1 yx 32 2 yx 20 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 y\"}\n{:process 3, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"8\", :value \"x 11 2 y\"}\n{:process 11, :type :invoke, :f :append, :key \"0\", :value \"x 11 3 y\"}\n{:process 39, :type :ok, :f :append, :key \"1\", :value \"x 39 2 y\"}\n{:process 39, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 yx 47 0 yx 47 1 yx 21 5 yx 6 9 yx 41 2 yx 8 1 yx 6 13 yx 20 3 y\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 6 y\"}\n{:process 20, :type :ok, :f :append, :key \"5\", :value \"x 20 4 y\"}\n{:process 20, :type :invoke, :f :append, :key \"9\", :value \"x 20 5 y\"}\n{:process 1, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"1\", :value \"x 40 0 y\"}\n{:process 40, :type :invoke, :f :append, :key \"0\", :value \"x 40 1 y\"}\n{:process 11, :type :ok, :f :append, :key \"0\", :value \"x 11 3 y\"}\n{:process 11, :type :invoke, :f :append, :key \"6\", :value \"x 11 4 y\"}\n{:process 42, :type :ok, :f :append, :key \"3\", :value \"x 42 0 y\"}\n{:process 42, :type :invoke, :f :append, :key \"9\", :value \"x 42 1 y\"}\n{:process 44, :type :ok, :f :append, :key \"4\", :value \"x 44 0 y\"}\n{:process 44, :type :invoke, :f :append, :key \"2\", :value \"x 44 1 y\"}\n{:process 20, :type :ok, :f :append, :key \"9\", :value \"x 20 5 y\"}\n{:process 20, :type :invoke, :f :append, :key \"6\", :value \"x 20 6 y\"}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 6 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 7 y\"}\n{:process 42, :type :ok, :f :append, :key \"9\", :value \"x 42 1 y\"}\n{:process 42, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 44, :type :ok, :f :append, :key \"2\", :value \"x 44 1 y\"}\n{:process 44, :type :invoke, :f :append, :key \"4\", :value \"x 44 2 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 6 y\"}\n{:process 11, :type :ok, :f :append, :key \"6\", :value \"x 11 4 y\"}\n{:process 11, :type :invoke, :f :append, :key \"6\", :value \"x 11 5 y\"}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 7 y\"}\n{:process 3, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 y\"}\n{:process 3, :type :invoke, :f :put, :key \"1\", :value \"x 3 8 y\"}\n{:process 44, :type :ok, :f :append, :key \"4\", :value \"x 44 2 y\"}\n{:process 44, :type :invoke, :f :append, :key \"7\", :value \"x 44 3 y\"}\n{:process 20, :type :ok, :f :append, :key \"6\", :value \"x 20 6 y\"}\n{:process 20, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 20, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 y\"}\n{:process 20, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 yx 20 5 yx 42 1 y\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 29 0 yx 17 0 yx 10 4 yx 1 1 yx 39 0 y\"}\n{:process 42, :type :invoke, :f :append, :key \"7\", :value \"x 42 2 y\"}\n{:process 11, :type :ok, :f :append, :key \"6\", :value \"x 11 5 y\"}\n{:process 11, :type :invoke, :f :append, :key \"2\", :value \"x 11 6 y\"}\n{:process 3, :type :ok, :f :put, :key \"1\", :value \"x 3 8 y\"}\n{:process 3, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"5\", :value \"x 46 3 y\"}\n{:process 11, :type :ok, :f :append, :key \"2\", :value \"x 11 6 y\"}\n{:process 11, :type :invoke, :f :append, :key \"5\", :value \"x 11 7 y\"}\n{:process 46, :type :invoke, :f :append, :key \"0\", :value \"x 46 4 y\"}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 44, :type :ok, :f :append, :key \"7\", :value \"x 44 3 y\"}\n{:process 44, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 7 y\"}\n{:process 44, :type :ok, :f :get, :key \"1\", :value \"x 3 8 y\"}\n{:process 44, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"7\", :value \"x 42 2 y\"}\n{:process 42, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 yx 47 0 yx 47 1 yx 21 5 yx 6 9 yx 41 2 yx 8 1 yx 6 13 yx 20 3 yx 44 1 yx 11 6 y\"}\n{:process 3, :type :invoke, :f :put, :key \"6\", :value \"x 3 9 y\"}\n{:process 31, :type :ok, :f :append, :key \"1\", :value \"x 31 3 y\"}\n{:process 31, :type :invoke, :f :append, :key \"3\", :value \"x 31 4 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 y\"}\n{:process 42, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"3\", :value \"x 31 4 y\"}\n{:process 31, :type :invoke, :f :append, :key \"2\", :value \"x 31 5 y\"}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 y\"}\n{:process 1, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"5\", :value \"x 11 7 y\"}\n{:process 11, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 yx 20 5 yx 42 1 y\"}\n{:process 42, :type :invoke, :f :append, :key \"4\", :value \"x 42 3 y\"}\n{:process 46, :type :ok, :f :append, :key \"0\", :value \"x 46 4 y\"}\n{:process 46, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 y\"}\n{:process 1, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 43, :type :ok, :f :put, :key \"5\", :value \"x 43 0 y\"}\n{:process 43, :type :invoke, :f :append, :key \"7\", :value \"x 43 1 y\"}\n{:process 46, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 y\"}\n{:process 46, :type :invoke, :f :append, :key \"4\", :value \"x 46 5 y\"}\n{:process 26, :type :ok, :f :append, :key \"0\", :value \"x 26 2 y\"}\n{:process 26, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"7\", :value \"x 29 0 yx 17 0 yx 10 4 yx 1 1 yx 39 0 yx 44 3 yx 42 2 y\"}\n{:process 11, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"4\", :value \"x 42 3 y\"}\n{:process 42, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"7\", :value \"x 24 3 y\"}\n{:process 24, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"2\", :value \"x 31 5 y\"}\n{:process 31, :type :invoke, :f :put, :key \"3\", :value \"x 31 6 y\"}\n{:process 1, :type :ok, :f :get, :key \"7\", :value \"x 29 0 yx 17 0 yx 10 4 yx 1 1 yx 39 0 yx 44 3 yx 42 2 y\"}\n{:process 1, :type :invoke, :f :append, :key \"5\", :value \"x 1 4 y\"}\n{:process 24, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 y\"}\n{:process 24, :type :invoke, :f :append, :key \"9\", :value \"x 24 4 y\"}\n{:process 12, :type :ok, :f :append, :key \"0\", :value \"x 12 7 y\"}\n{:process 12, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"6\", :value \"x 3 9 y\"}\n{:process 11, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"3\", :value \"x 17 1 yx 32 2 yx 20 1 yx 42 0 yx 3 7 yx 31 4 y\"}\n{:process 42, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"4\", :value \"x 46 5 y\"}\n{:process 46, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 30, :type :ok, :f :append, :key \"8\", :value \"x 30 4 y\"}\n{:process 30, :type :invoke, :f :append, :key \"8\", :value \"x 30 5 y\"}\n{:process 46, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 y\"}\n{:process 46, :type :invoke, :f :append, :key \"2\", :value \"x 46 6 y\"}\n{:process 24, :type :ok, :f :append, :key \"9\", :value \"x 24 4 y\"}\n{:process 24, :type :invoke, :f :append, :key \"7\", :value \"x 24 5 y\"}\n{:process 26, :type :ok, :f :get, :key \"7\", :value \"x 29 0 yx 17 0 yx 10 4 yx 1 1 yx 39 0 yx 44 3 yx 42 2 yx 24 3 y\"}\n{:process 26, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 43, :type :ok, :f :append, :key \"7\", :value \"x 43 1 y\"}\n{:process 43, :type :invoke, :f :put, :key \"3\", :value \"x 43 2 y\"}\n{:process 12, :type :ok, :f :get, :key \"3\", :value \"x 17 1 yx 32 2 yx 20 1 yx 42 0 yx 3 7 yx 31 4 y\"}\n{:process 12, :type :invoke, :f :append, :key \"2\", :value \"x 12 8 y\"}\n{:process 22, :type :ok, :f :append, :key \"2\", :value \"x 22 0 y\"}\n{:process 22, :type :invoke, :f :append, :key \"6\", :value \"x 22 1 y\"}\n{:process 24, :type :ok, :f :append, :key \"7\", :value \"x 24 5 y\"}\n{:process 24, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 y\"}\n{:process 11, :type :invoke, :f :append, :key \"0\", :value \"x 11 8 y\"}\n{:process 12, :type :ok, :f :append, :key \"2\", :value \"x 12 8 y\"}\n{:process 12, :type :invoke, :f :append, :key \"2\", :value \"x 12 9 y\"}\n{:process 26, :type :ok, :f :get, :key \"3\", :value \"x 17 1 yx 32 2 yx 20 1 yx 42 0 yx 3 7 yx 31 4 y\"}\n{:process 26, :type :invoke, :f :append, :key \"3\", :value \"x 26 3 y\"}\n{:process 24, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 y\"}\n{:process 24, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 20, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 yx 47 0 yx 47 1 yx 21 5 yx 6 9 yx 41 2 yx 8 1 yx 6 13 yx 20 3 yx 44 1 yx 11 6 yx 31 5 yx 22 0 yx 12 8 y\"}\n{:process 20, :type :invoke, :f :append, :key \"5\", :value \"x 20 7 y\"}\n{:process 30, :type :ok, :f :append, :key \"8\", :value \"x 30 5 y\"}\n{:process 30, :type :invoke, :f :append, :key \"4\", :value \"x 30 6 y\"}\n{:process 22, :type :ok, :f :append, :key \"6\", :value \"x 22 1 y\"}\n{:process 22, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 43, :type :ok, :f :put, :key \"3\", :value \"x 43 2 y\"}\n{:process 43, :type :invoke, :f :append, :key \"3\", :value \"x 43 3 y\"}\n{:process 22, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 y\"}\n{:process 22, :type :invoke, :f :append, :key \"8\", :value \"x 22 2 y\"}\n{:process 24, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 yx 30 5 y\"}\n{:process 24, :type :invoke, :f :append, :key \"3\", :value \"x 24 6 y\"}\n{:process 11, :type :ok, :f :append, :key \"0\", :value \"x 11 8 y\"}\n{:process 11, :type :invoke, :f :append, :key \"8\", :value \"x 11 9 y\"}\n{:process 30, :type :ok, :f :append, :key \"4\", :value \"x 30 6 y\"}\n{:process 30, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 y\"}\n{:process 30, :type :invoke, :f :append, :key \"8\", :value \"x 30 7 y\"}\n{:process 22, :type :ok, :f :append, :key \"8\", :value \"x 22 2 y\"}\n{:process 22, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 y\"}\n{:process 22, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"3\", :value \"x 24 6 y\"}\n{:process 24, :type :invoke, :f :append, :key \"2\", :value \"x 24 7 y\"}\n{:process 26, :type :ok, :f :append, :key \"3\", :value \"x 26 3 y\"}\n{:process 26, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 y\"}\n{:process 26, :type :invoke, :f :append, :key \"4\", :value \"x 26 4 y\"}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 8 y\"}\n{:process 27, :type :ok, :f :append, :key \"8\", :value \"x 27 3 y\"}\n{:process 27, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"3\", :value \"x 43 2 y\"}\n{:process 39, :type :invoke, :f :append, :key \"8\", :value \"x 39 3 y\"}\n{:process 30, :type :ok, :f :append, :key \"8\", :value \"x 30 7 y\"}\n{:process 30, :type :invoke, :f :put, :key \"7\", :value \"x 30 8 y\"}\n{:process 44, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 yx 20 5 yx 42 1 yx 24 4 y\"}\n{:process 44, :type :invoke, :f :put, :key \"0\", :value \"x 44 4 y\"}\n{:process 27, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 y\"}\n{:process 27, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"8\", :value \"x 11 9 y\"}\n{:process 11, :type :invoke, :f :append, :key \"3\", :value \"x 11 10 y\"}\n{:process 13, :type :ok, :f :append, :key \"5\", :value \"x 13 5 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 y\"}\n{:process 22, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 1 y\"}\n{:process 36, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"4\", :value \"x 26 4 y\"}\n{:process 26, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"5\", :value \"x 45 0 y\"}\n{:process 45, :type :invoke, :f :append, :key \"0\", :value \"x 45 1 y\"}\n{:process 36, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 y\"}\n{:process 36, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 y\"}\n{:process 36, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 30, :type :ok, :f :put, :key \"7\", :value \"x 30 8 y\"}\n{:process 30, :type :invoke, :f :append, :key \"3\", :value \"x 30 9 y\"}\n{:process 11, :type :ok, :f :append, :key \"3\", :value \"x 11 10 y\"}\n{:process 11, :type :invoke, :f :append, :key \"8\", :value \"x 11 11 y\"}\n{:process 26, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 y\"}\n{:process 26, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"0\", :value \"x 45 1 y\"}\n{:process 45, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 y\"}\n{:process 26, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"5\", :value \"x 15 9 y\"}\n{:process 15, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 yx 15 9 y\"}\n{:process 15, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 y\"}\n{:process 26, :type :invoke, :f :append, :key \"6\", :value \"x 26 5 y\"}\n{:process 30, :type :ok, :f :append, :key \"3\", :value \"x 30 9 y\"}\n{:process 30, :type :invoke, :f :append, :key \"3\", :value \"x 30 10 y\"}\n{:process 11, :type :ok, :f :append, :key \"8\", :value \"x 11 11 y\"}\n{:process 11, :type :invoke, :f :append, :key \"2\", :value \"x 11 12 y\"}\n{:process 15, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 y\"}\n{:process 15, :type :invoke, :f :append, :key \"6\", :value \"x 15 10 y\"}\n{:process 45, :type :ok, :f :get, :key \"3\", :value \"x 43 2 yx 26 3 yx 24 6 yx 11 10 yx 30 9 y\"}\n{:process 45, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"6\", :value \"x 26 5 y\"}\n{:process 26, :type :invoke, :f :append, :key \"2\", :value \"x 26 6 y\"}\n{:process 11, :type :ok, :f :append, :key \"2\", :value \"x 11 12 y\"}\n{:process 11, :type :invoke, :f :append, :key \"5\", :value \"x 11 13 y\"}\n{:process 45, :type :ok, :f :get, :key \"7\", :value \"x 30 8 y\"}\n{:process 45, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 y\"}\n{:process 45, :type :invoke, :f :put, :key \"2\", :value \"x 45 2 y\"}\n{:process 15, :type :ok, :f :append, :key \"6\", :value \"x 15 10 y\"}\n{:process 15, :type :invoke, :f :append, :key \"8\", :value \"x 15 11 y\"}\n{:process 30, :type :ok, :f :append, :key \"3\", :value \"x 30 10 y\"}\n{:process 30, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"5\", :value \"x 11 13 y\"}\n{:process 11, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 y\"}\n{:process 11, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"3\", :value \"x 43 2 yx 26 3 yx 24 6 yx 11 10 yx 30 9 yx 30 10 y\"}\n{:process 30, :type :invoke, :f :append, :key \"4\", :value \"x 30 11 y\"}\n{:process 11, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 yx 30 5 yx 22 2 yx 27 3 yx 30 7 yx 11 9 yx 11 11 y\"}\n{:process 11, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"2\", :value \"x 26 6 y\"}\n{:process 26, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 yx 30 5 yx 22 2 yx 27 3 yx 30 7 yx 11 9 yx 11 11 y\"}\n{:process 11, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 y\"}\n{:process 26, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"8\", :value \"x 15 11 y\"}\n{:process 15, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 y\"}\n{:process 11, :type :invoke, :f :append, :key \"9\", :value \"x 11 14 y\"}\n{:process 16, :type :ok, :f :append, :key \"4\", :value \"x 16 1 y\"}\n{:process 16, :type :invoke, :f :append, :key \"6\", :value \"x 16 2 y\"}\n{:process 14, :type :ok, :f :put, :key \"6\", :value \"x 14 0 y\"}\n{:process 14, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 yx 30 5 yx 22 2 yx 27 3 yx 30 7 yx 11 9 yx 11 11 yx 15 11 y\"}\n{:process 15, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 30, :type :ok, :f :append, :key \"4\", :value \"x 30 11 y\"}\n{:process 30, :type :invoke, :f :append, :key \"8\", :value \"x 30 12 y\"}\n{:process 16, :type :ok, :f :append, :key \"6\", :value \"x 16 2 y\"}\n{:process 16, :type :invoke, :f :put, :key \"7\", :value \"x 16 3 y\"}\n{:process 27, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 y\"}\n{:process 27, :type :invoke, :f :append, :key \"7\", :value \"x 27 4 y\"}\n{:process 26, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 yx 26 5 yx 15 10 yx 16 2 y\"}\n{:process 26, :type :invoke, :f :append, :key \"2\", :value \"x 26 7 y\"}\n{:process 30, :type :ok, :f :append, :key \"8\", :value \"x 30 12 y\"}\n{:process 30, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 y\"}\n{:process 14, :type :invoke, :f :put, :key \"2\", :value \"x 14 1 y\"}\n{:process 36, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 yx 26 5 yx 15 10 yx 16 2 y\"}\n{:process 36, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"9\", :value \"x 11 14 y\"}\n{:process 11, :type :invoke, :f :append, :key \"9\", :value \"x 11 15 y\"}\n{:process 30, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 yx 15 9 yx 11 13 y\"}\n{:process 30, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 yx 30 5 yx 22 2 yx 27 3 yx 30 7 yx 11 9 yx 11 11 yx 15 11 yx 30 12 y\"}\n{:process 30, :type :invoke, :f :append, :key \"2\", :value \"x 30 13 y\"}\n{:process 26, :type :ok, :f :append, :key \"2\", :value \"x 26 7 y\"}\n{:process 26, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 y\"}\n{:process 26, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 16, :type :ok, :f :put, :key \"7\", :value \"x 16 3 y\"}\n{:process 16, :type :invoke, :f :append, :key \"2\", :value \"x 16 4 y\"}\n{:process 42, :type :ok, :f :get, :key \"6\", :value \"x 14 0 yx 11 0 yx 31 0 y\"}\n{:process 42, :type :invoke, :f :append, :key \"4\", :value \"x 42 4 y\"}\n{:process 14, :type :ok, :f :put, :key \"2\", :value \"x 14 1 y\"}\n{:process 14, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"7\", :value \"x 16 3 y\"}\n{:process 26, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"2\", :value \"x 16 4 y\"}\n{:process 16, :type :invoke, :f :append, :key \"1\", :value \"x 16 5 y\"}\n{:process 11, :type :ok, :f :append, :key \"9\", :value \"x 11 15 y\"}\n{:process 11, :type :invoke, :f :append, :key \"3\", :value \"x 11 16 y\"}\n{:process 30, :type :ok, :f :append, :key \"2\", :value \"x 30 13 y\"}\n{:process 30, :type :invoke, :f :append, :key \"3\", :value \"x 30 14 y\"}\n{:process 26, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 y\"}\n{:process 26, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"7\", :value \"x 16 3 y\"}\n{:process 26, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 1 y\"}\n{:process 7, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"1\", :value \"x 25 0 y\"}\n{:process 25, :type :invoke, :f :put, :key \"0\", :value \"x 25 1 y\"}\n{:process 26, :type :ok, :f :get, :key \"2\", :value \"x 14 1 yx 16 4 yx 30 13 y\"}\n{:process 26, :type :invoke, :f :append, :key \"1\", :value \"x 26 8 y\"}\n{:process 16, :type :ok, :f :append, :key \"1\", :value \"x 16 5 y\"}\n{:process 16, :type :invoke, :f :append, :key \"0\", :value \"x 16 6 y\"}\n{:process 48, :type :ok, :f :append, :key \"1\", :value \"x 48 2 y\"}\n{:process 48, :type :invoke, :f :append, :key \"8\", :value \"x 48 3 y\"}\n{:process 7, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 yx 30 5 yx 22 2 yx 27 3 yx 30 7 yx 11 9 yx 11 11 yx 15 11 yx 30 12 y\"}\n{:process 7, :type :invoke, :f :append, :key \"8\", :value \"x 7 2 y\"}\n{:process 16, :type :ok, :f :append, :key \"0\", :value \"x 16 6 y\"}\n{:process 16, :type :invoke, :f :append, :key \"0\", :value \"x 16 7 y\"}\n{:process 30, :type :ok, :f :append, :key \"3\", :value \"x 30 14 y\"}\n{:process 30, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 48, :type :ok, :f :append, :key \"8\", :value \"x 48 3 y\"}\n{:process 48, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"0\", :value \"x 16 7 y\"}\n{:process 16, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"1\", :value \"x 26 8 y\"}\n{:process 26, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 yx 20 5 yx 42 1 yx 24 4 yx 11 14 yx 11 15 y\"}\n{:process 22, :type :invoke, :f :append, :key \"6\", :value \"x 22 3 y\"}\n{:process 26, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 yx 30 5 yx 22 2 yx 27 3 yx 30 7 yx 11 9 yx 11 11 yx 15 11 yx 30 12 yx 48 3 y\"}\n{:process 26, :type :invoke, :f :append, :key \"6\", :value \"x 26 9 y\"}\n{:process 15, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 y\"}\n{:process 15, :type :invoke, :f :append, :key \"0\", :value \"x 15 12 y\"}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 yx 15 9 yx 11 13 y\"}\n{:process 13, :type :invoke, :f :append, :key \"1\", :value \"x 13 6 y\"}\n{:process 48, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 yx 15 9 yx 11 13 y\"}\n{:process 48, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"3\", :value \"x 37 5 y\"}\n{:process 30, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 yx 7 1 y\"}\n{:process 30, :type :invoke, :f :put, :key \"8\", :value \"x 30 15 y\"}\n{:process 48, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 yx 30 5 yx 22 2 yx 27 3 yx 30 7 yx 11 9 yx 11 11 yx 15 11 yx 30 12 yx 48 3 y\"}\n{:process 48, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"8\", :value \"x 7 2 y\"}\n{:process 7, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 yx 1 0 yx 18 7 yx 23 0 yx 11 2 yx 30 4 yx 30 5 yx 22 2 yx 27 3 yx 30 7 yx 11 9 yx 11 11 yx 15 11 yx 30 12 yx 48 3 yx 7 2 y\"}\n{:process 7, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 30, :type :ok, :f :put, :key \"8\", :value \"x 30 15 y\"}\n{:process 30, :type :invoke, :f :append, :key \"1\", :value \"x 30 16 y\"}\n{:process 26, :type :ok, :f :append, :key \"6\", :value \"x 26 9 y\"}\n{:process 26, :type :invoke, :f :append, :key \"6\", :value \"x 26 10 y\"}\n{:process 48, :type :ok, :f :get, :key \"2\", :value \"x 14 1 yx 16 4 yx 30 13 y\"}\n{:process 48, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 y\"}\n{:process 14, :type :invoke, :f :append, :key \"5\", :value \"x 14 2 y\"}\n{:process 7, :type :ok, :f :get, :key \"2\", :value \"x 14 1 yx 16 4 yx 30 13 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 3 y\"}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 3 y\"}\n{:process 7, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 48, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 y\"}\n{:process 48, :type :invoke, :f :append, :key \"3\", :value \"x 48 4 y\"}\n{:process 30, :type :ok, :f :append, :key \"1\", :value \"x 30 16 y\"}\n{:process 30, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 y\"}\n{:process 30, :type :invoke, :f :append, :key \"8\", :value \"x 30 17 y\"}\n{:process 26, :type :ok, :f :append, :key \"6\", :value \"x 26 10 y\"}\n{:process 26, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 48, :type :ok, :f :append, :key \"3\", :value \"x 48 4 y\"}\n{:process 48, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 yx 7 1 yx 7 3 y\"}\n{:process 26, :type :invoke, :f :append, :key \"4\", :value \"x 26 11 y\"}\n{:process 30, :type :ok, :f :append, :key \"8\", :value \"x 30 17 y\"}\n{:process 30, :type :invoke, :f :append, :key \"6\", :value \"x 30 18 y\"}\n{:process 16, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 yx 7 1 yx 7 3 y\"}\n{:process 16, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 48, :type :ok, :f :get, :key \"3\", :value \"x 37 5 yx 48 4 y\"}\n{:process 48, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"2\", :value \"x 14 1 yx 16 4 yx 30 13 y\"}\n{:process 16, :type :invoke, :f :append, :key \"5\", :value \"x 16 8 y\"}\n{:process 48, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 y\"}\n{:process 48, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 2 y\"}\n{:process 48, :type :ok, :f :get, :key \"2\", :value \"x 14 1 yx 16 4 yx 30 13 y\"}\n{:process 48, :type :invoke, :f :append, :key \"2\", :value \"x 48 5 y\"}\n{:process 7, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 7, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"8\", :value \"x 30 15 yx 30 17 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 4 y\"}\n{:process 34, :type :ok, :f :append, :key \"3\", :value \"x 34 2 y\"}\n{:process 34, :type :invoke, :f :append, :key \"8\", :value \"x 34 3 y\"}\n{:process 4, :type :ok, :f :append, :key \"2\", :value \"x 4 2 y\"}\n{:process 4, :type :invoke, :f :append, :key \"7\", :value \"x 4 3 y\"}\n{:process 47, :type :ok, :f :put, :key \"8\", :value \"x 47 5 y\"}\n{:process 47, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 47, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"5\", :value \"x 21 7 y\"}\n{:process 21, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"2\", :value \"x 49 8 y\"}\n{:process 49, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 49, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 33, :type :ok, :f :append, :key \"9\", :value \"x 33 2 y\"}\n{:process 33, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"7\", :value \"x 4 3 y\"}\n{:process 4, :type :invoke, :f :append, :key \"5\", :value \"x 4 4 y\"}\n{:process 41, :type :ok, :f :append, :key \"6\", :value \"x 41 3 y\"}\n{:process 41, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 21, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 yx 26 5 yx 15 10 yx 16 2 yx 26 9 yx 26 10 yx 30 18 yx 41 3 y\"}\n{:process 21, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"3\", :value \"x 29 2 y\"}\n{:process 29, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 yx 26 5 yx 15 10 yx 16 2 yx 26 9 yx 26 10 yx 30 18 yx 41 3 y\"}\n{:process 49, :type :invoke, :f :append, :key \"4\", :value \"x 49 9 y\"}\n{:process 10, :type :ok, :f :append, :key \"7\", :value \"x 10 4 y\"}\n{:process 10, :type :invoke, :f :append, :key \"8\", :value \"x 10 5 y\"}\n{:process 29, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 29, :type :invoke, :f :append, :key \"6\", :value \"x 29 3 y\"}\n{:process 4, :type :ok, :f :append, :key \"5\", :value \"x 4 4 y\"}\n{:process 4, :type :invoke, :f :append, :key \"0\", :value \"x 4 5 y\"}\n{:process 49, :type :ok, :f :append, :key \"4\", :value \"x 49 9 y\"}\n{:process 49, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 49, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"8\", :value \"x 10 5 y\"}\n{:process 10, :type :invoke, :f :append, :key \"2\", :value \"x 10 6 y\"}\n{:process 49, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 yx 26 5 yx 15 10 yx 16 2 yx 26 9 yx 26 10 yx 30 18 yx 41 3 y\"}\n{:process 49, :type :invoke, :f :append, :key \"5\", :value \"x 49 10 y\"}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 4 y\"}\n{:process 29, :type :ok, :f :append, :key \"6\", :value \"x 29 3 y\"}\n{:process 29, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"0\", :value \"x 4 5 y\"}\n{:process 4, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 29, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 yx 15 9 yx 11 13 yx 21 7 yx 4 4 y\"}\n{:process 29, :type :invoke, :f :append, :key \"3\", :value \"x 29 4 y\"}\n{:process 49, :type :ok, :f :append, :key \"5\", :value \"x 49 10 y\"}\n{:process 32, :type :ok, :f :append, :key \"4\", :value \"x 32 4 y\"}\n{:process 32, :type :invoke, :f :append, :key \"0\", :value \"x 32 5 y\"}\n{:process 49, :type :invoke, :f :put, :key \"7\", :value \"x 49 11 y\"}\n{:process 10, :type :ok, :f :append, :key \"2\", :value \"x 10 6 y\"}\n{:process 10, :type :invoke, :f :put, :key \"3\", :value \"x 10 7 y\"}\n{:process 4, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 yx 15 9 yx 11 13 yx 21 7 yx 4 4 yx 49 10 y\"}\n{:process 4, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 4, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"8\", :value \"x 18 7 y\"}\n{:process 18, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 yx 20 5 yx 42 1 yx 24 4 yx 11 14 yx 11 15 y\"}\n{:process 47, :type :invoke, :f :append, :key \"3\", :value \"x 47 6 y\"}\n{:process 18, :type :ok, :f :get, :key \"7\", :value \"x 16 3 yx 4 3 y\"}\n{:process 18, :type :invoke, :f :append, :key \"8\", :value \"x 18 8 y\"}\n{:process 5, :type :ok, :f :append, :key \"4\", :value \"x 5 3 y\"}\n{:process 49, :type :ok, :f :put, :key \"7\", :value \"x 49 11 y\"}\n{:process 5, :type :invoke, :f :append, :key \"1\", :value \"x 5 4 y\"}\n{:process 49, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"3\", :value \"x 17 5 y\"}\n{:process 29, :type :ok, :f :append, :key \"3\", :value \"x 29 4 y\"}\n{:process 29, :type :invoke, :f :append, :key \"3\", :value \"x 29 5 y\"}\n{:process 17, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 4 y\"}\n{:process 8, :type :invoke, :f :append, :key \"6\", :value \"x 8 5 y\"}\n{:process 23, :type :ok, :f :append, :key \"6\", :value \"x 23 1 y\"}\n{:process 23, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 yx 7 1 yx 7 3 yx 26 11 yx 49 9 yx 32 4 y\"}\n{:process 17, :type :invoke, :f :append, :key \"4\", :value \"x 17 6 y\"}\n{:process 10, :type :ok, :f :put, :key \"3\", :value \"x 10 7 y\"}\n{:process 10, :type :invoke, :f :append, :key \"6\", :value \"x 10 8 y\"}\n{:process 5, :type :ok, :f :append, :key \"1\", :value \"x 5 4 y\"}\n{:process 5, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 yx 8 3 yx 4 5 y\"}\n{:process 49, :type :invoke, :f :append, :key \"6\", :value \"x 49 12 y\"}\n{:process 5, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 yx 20 5 yx 42 1 yx 24 4 yx 11 14 yx 11 15 yx 33 2 y\"}\n{:process 5, :type :invoke, :f :append, :key \"7\", :value \"x 5 5 y\"}\n{:process 41, :type :ok, :f :get, :key \"2\", :value \"x 14 1 yx 16 4 yx 30 13 y\"}\n{:process 41, :type :invoke, :f :append, :key \"5\", :value \"x 41 4 y\"}\n{:process 29, :type :ok, :f :append, :key \"3\", :value \"x 29 5 y\"}\n{:process 29, :type :invoke, :f :append, :key \"9\", :value \"x 29 6 y\"}\n{:process 21, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 21, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 yx 15 9 yx 11 13 y\"}\n{:process 33, :type :invoke, :f :append, :key \"9\", :value \"x 33 3 y\"}\n{:process 6, :type :ok, :f :append, :key \"7\", :value \"x 6 14 y\"}\n{:process 6, :type :invoke, :f :put, :key \"1\", :value \"x 6 15 y\"}\n{:process 8, :type :ok, :f :append, :key \"6\", :value \"x 8 5 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 6 y\"}\n{:process 23, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 yx 8 3 yx 4 5 y\"}\n{:process 23, :type :invoke, :f :append, :key \"1\", :value \"x 23 2 y\"}\n{:process 10, :type :ok, :f :append, :key \"6\", :value \"x 10 8 y\"}\n{:process 10, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"8\", :value \"x 18 8 y\"}\n{:process 18, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"6\", :value \"x 49 12 y\"}\n{:process 17, :type :ok, :f :append, :key \"4\", :value \"x 17 6 y\"}\n{:process 5, :type :ok, :f :append, :key \"7\", :value \"x 5 5 y\"}\n{:process 17, :type :invoke, :f :append, :key \"7\", :value \"x 17 7 y\"}\n{:process 49, :type :invoke, :f :put, :key \"6\", :value \"x 49 13 y\"}\n{:process 5, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 y\"}\n{:process 5, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"1\", :value \"x 23 2 y\"}\n{:process 23, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 6 y\"}\n{:process 8, :type :invoke, :f :append, :key \"7\", :value \"x 8 7 y\"}\n{:process 10, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 yx 7 1 yx 7 3 yx 26 11 yx 49 9 yx 32 4 yx 17 6 y\"}\n{:process 10, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 yx 26 5 yx 15 10 yx 16 2 yx 26 9 yx 26 10 yx 30 18 yx 41 3 yx 29 3 yx 8 5 yx 10 8 yx 49 12 y\"}\n{:process 23, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"2\", :value \"x 14 1 yx 16 4 yx 30 13 yx 4 2 yx 49 8 yx 10 6 y\"}\n{:process 23, :type :invoke, :f :put, :key \"2\", :value \"x 23 3 y\"}\n{:process 6, :type :ok, :f :put, :key \"1\", :value \"x 6 15 y\"}\n{:process 6, :type :invoke, :f :append, :key \"8\", :value \"x 6 16 y\"}\n{:process 10, :type :ok, :f :get, :key \"6\", :value \"x 3 9 yx 22 1 yx 26 5 yx 15 10 yx 16 2 yx 26 9 yx 26 10 yx 30 18 yx 41 3 yx 29 3 yx 8 5 yx 10 8 yx 49 12 y\"}\n{:process 10, :type :invoke, :f :append, :key \"0\", :value \"x 10 9 y\"}\n{:process 8, :type :ok, :f :append, :key \"7\", :value \"x 8 7 y\"}\n{:process 8, :type :invoke, :f :append, :key \"6\", :value \"x 8 8 y\"}\n{:process 49, :type :ok, :f :put, :key \"6\", :value \"x 49 13 y\"}\n{:process 49, :type :invoke, :f :append, :key \"6\", :value \"x 49 14 y\"}\n{:process 17, :type :ok, :f :append, :key \"7\", :value \"x 17 7 y\"}\n{:process 17, :type :invoke, :f :append, :key \"4\", :value \"x 17 8 y\"}\n{:process 39, :type :ok, :f :append, :key \"8\", :value \"x 39 3 y\"}\n{:process 39, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 23, :type :ok, :f :put, :key \"2\", :value \"x 23 3 y\"}\n{:process 23, :type :invoke, :f :append, :key \"5\", :value \"x 23 4 y\"}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 3 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 4 y\"}\n{:process 6, :type :ok, :f :append, :key \"8\", :value \"x 6 16 y\"}\n{:process 6, :type :invoke, :f :append, :key \"6\", :value \"x 6 17 y\"}\n{:process 39, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 yx 7 1 yx 7 3 yx 26 11 yx 49 9 yx 32 4 yx 17 6 y\"}\n{:process 39, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"0\", :value \"x 10 9 y\"}\n{:process 10, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 4 y\"}\n{:process 2, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"4\", :value \"x 17 8 y\"}\n{:process 17, :type :invoke, :f :append, :key \"1\", :value \"x 17 9 y\"}\n{:process 23, :type :ok, :f :append, :key \"5\", :value \"x 23 4 y\"}\n{:process 23, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 yx 8 3 yx 4 5 yx 10 9 yx 2 4 y\"}\n{:process 2, :type :invoke, :f :append, :key \"2\", :value \"x 2 5 y\"}\n{:process 8, :type :ok, :f :append, :key \"6\", :value \"x 8 8 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 9 y\"}\n{:process 40, :type :ok, :f :append, :key \"0\", :value \"x 40 1 y\"}\n{:process 1, :type :ok, :f :append, :key \"5\", :value \"x 1 4 y\"}\n{:process 1, :type :invoke, :f :append, :key \"7\", :value \"x 1 5 y\"}\n{:process 40, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"6\", :value \"x 49 14 y\"}\n{:process 49, :type :invoke, :f :put, :key \"3\", :value \"x 49 15 y\"}\n{:process 10, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 y\"}\n{:process 10, :type :invoke, :f :append, :key \"2\", :value \"x 10 10 y\"}\n{:process 23, :type :ok, :f :get, :key \"6\", :value \"x 49 13 yx 8 8 yx 49 14 yx 6 17 y\"}\n{:process 23, :type :invoke, :f :append, :key \"1\", :value \"x 23 5 y\"}\n{:process 17, :type :ok, :f :append, :key \"1\", :value \"x 17 9 y\"}\n{:process 17, :type :invoke, :f :append, :key \"8\", :value \"x 17 10 y\"}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 9 y\"}\n{:process 8, :type :invoke, :f :append, :key \"7\", :value \"x 8 10 y\"}\n{:process 49, :type :ok, :f :put, :key \"3\", :value \"x 49 15 y\"}\n{:process 49, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"2\", :value \"x 2 5 y\"}\n{:process 2, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 yx 8 3 yx 4 5 yx 10 9 yx 2 4 y\"}\n{:process 2, :type :invoke, :f :put, :key \"7\", :value \"x 2 6 y\"}\n{:process 28, :type :ok, :f :append, :key \"0\", :value \"x 28 1 y\"}\n{:process 28, :type :invoke, :f :append, :key \"3\", :value \"x 28 2 y\"}\n{:process 1, :type :ok, :f :append, :key \"7\", :value \"x 1 5 y\"}\n{:process 1, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 yx 8 3 yx 4 5 yx 10 9 yx 2 4 yx 28 1 y\"}\n{:process 49, :type :invoke, :f :append, :key \"4\", :value \"x 49 16 y\"}\n{:process 1, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 yx 20 5 yx 42 1 yx 24 4 yx 11 14 yx 11 15 yx 33 2 yx 29 6 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 yx 8 3 yx 4 5 yx 10 9 yx 2 4 yx 28 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"2\", :value \"x 10 10 y\"}\n{:process 10, :type :invoke, :f :append, :key \"1\", :value \"x 10 11 y\"}\n{:process 23, :type :ok, :f :append, :key \"1\", :value \"x 23 5 y\"}\n{:process 23, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 yx 20 5 yx 42 1 yx 24 4 yx 11 14 yx 11 15 yx 33 2 yx 29 6 y\"}\n{:process 18, :type :invoke, :f :append, :key \"1\", :value \"x 18 9 y\"}\n{:process 5, :type :ok, :f :get, :key \"6\", :value \"x 14 0 yx 11 0 yx 31 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 y\"}\n{:process 5, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"8\", :value \"x 48 0 yx 49 3 yx 37 1 yx 18 2 yx 0 0 yx 18 5 yx 4 0 yx 21 3 yx 0 4 y\"}\n{:process 5, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 2, :type :ok, :f :put, :key \"7\", :value \"x 2 6 y\"}\n{:process 28, :type :ok, :f :append, :key \"3\", :value \"x 28 2 y\"}\n{:process 2, :type :invoke, :f :append, :key \"7\", :value \"x 2 7 y\"}\n{:process 28, :type :invoke, :f :put, :key \"1\", :value \"x 28 3 y\"}\n{:process 8, :type :ok, :f :append, :key \"7\", :value \"x 8 10 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"8\", :value \"x 17 10 y\"}\n{:process 17, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 49 15 yx 28 2 y\"}\n{:process 1, :type :invoke, :f :append, :key \"3\", :value \"x 1 6 y\"}\n{:process 10, :type :ok, :f :append, :key \"1\", :value \"x 10 11 y\"}\n{:process 31, :type :ok, :f :put, :key \"3\", :value \"x 31 6 y\"}\n{:process 10, :type :invoke, :f :append, :key \"7\", :value \"x 10 12 y\"}\n{:process 31, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 6 15 yx 17 9 yx 23 5 yx 10 11 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 11 y\"}\n{:process 49, :type :ok, :f :append, :key \"4\", :value \"x 49 16 y\"}\n{:process 49, :type :invoke, :f :put, :key \"5\", :value \"x 49 17 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 9 y\"}\n{:process 5, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 0 2 yx 11 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"7\", :value \"x 5 6 y\"}\n{:process 20, :type :ok, :f :append, :key \"5\", :value \"x 20 7 y\"}\n{:process 20, :type :invoke, :f :append, :key \"3\", :value \"x 20 8 y\"}\n{:process 17, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 yx 15 9 yx 11 13 yx 21 7 yx 4 4 yx 49 10 yx 8 4 yx 8 6 yx 23 4 yx 1 4 yx 20 7 y\"}\n{:process 17, :type :invoke, :f :append, :key \"4\", :value \"x 17 11 y\"}\n{:process 31, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 y\"}\n{:process 31, :type :invoke, :f :put, :key \"9\", :value \"x 31 7 y\"}\n{:process 49, :type :ok, :f :put, :key \"5\", :value \"x 49 17 y\"}\n{:process 49, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 44, :type :ok, :f :put, :key \"0\", :value \"x 44 4 y\"}\n{:process 44, :type :invoke, :f :append, :key \"2\", :value \"x 44 5 y\"}\n{:process 39, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 y\"}\n{:process 39, :type :invoke, :f :append, :key \"8\", :value \"x 39 4 y\"}\n{:process 49, :type :ok, :f :get, :key \"2\", :value \"x 23 3 yx 2 5 yx 10 10 y\"}\n{:process 49, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"3\", :value \"x 1 6 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 11 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"7\", :value \"x 10 12 y\"}\n{:process 10, :type :invoke, :f :append, :key \"0\", :value \"x 10 13 y\"}\n{:process 4, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 y\"}\n{:process 4, :type :invoke, :f :append, :key \"8\", :value \"x 4 6 y\"}\n{:process 49, :type :ok, :f :get, :key \"5\", :value \"x 49 17 yx 8 11 y\"}\n{:process 49, :type :invoke, :f :append, :key \"7\", :value \"x 49 18 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 10 y\"}\n{:process 28, :type :ok, :f :put, :key \"1\", :value \"x 28 3 y\"}\n{:process 28, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 44, :type :ok, :f :append, :key \"2\", :value \"x 44 5 y\"}\n{:process 44, :type :invoke, :f :append, :key \"2\", :value \"x 44 6 y\"}\n{:process 10, :type :ok, :f :append, :key \"0\", :value \"x 10 13 y\"}\n{:process 10, :type :invoke, :f :append, :key \"1\", :value \"x 10 14 y\"}\n{:process 28, :type :ok, :f :get, :key \"3\", :value \"x 31 6 yx 1 6 yx 20 8 y\"}\n{:process 28, :type :invoke, :f :append, :key \"9\", :value \"x 28 4 y\"}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 28 3 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 31, :type :ok, :f :put, :key \"9\", :value \"x 31 7 y\"}\n{:process 31, :type :invoke, :f :append, :key \"1\", :value \"x 31 8 y\"}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 28 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"9\", :value \"x 8 12 y\"}\n{:process 21, :type :ok, :f :get, :key \"0\", :value \"x 44 4 yx 10 13 y\"}\n{:process 21, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"4\", :value \"x 42 4 y\"}\n{:process 42, :type :invoke, :f :put, :key \"4\", :value \"x 42 5 y\"}\n{:process 35, :type :ok, :f :append, :key \"5\", :value \"x 35 3 y\"}\n{:process 35, :type :invoke, :f :append, :key \"6\", :value \"x 35 4 y\"}\n{:process 44, :type :ok, :f :append, :key \"2\", :value \"x 44 6 y\"}\n{:process 44, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 10 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 23 3 yx 2 5 yx 10 10 yx 44 5 yx 46 6 yx 44 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"9\", :value \"x 28 4 y\"}\n{:process 28, :type :invoke, :f :append, :key \"8\", :value \"x 28 5 y\"}\n{:process 44, :type :ok, :f :get, :key \"5\", :value \"x 49 17 yx 8 11 yx 35 3 y\"}\n{:process 44, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"3\", :value \"x 31 6 yx 1 6 yx 20 8 y\"}\n{:process 44, :type :invoke, :f :append, :key \"2\", :value \"x 44 7 y\"}\n{:process 43, :type :ok, :f :append, :key \"3\", :value \"x 43 3 y\"}\n{:process 43, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"2\", :value \"x 23 3 yx 2 5 yx 10 10 yx 44 5 yx 46 6 yx 44 6 y\"}\n{:process 43, :type :invoke, :f :append, :key \"0\", :value \"x 43 4 y\"}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"x 49 13 yx 8 8 yx 49 14 yx 6 17 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 11 y\"}\n{:process 24, :type :ok, :f :append, :key \"2\", :value \"x 24 7 y\"}\n{:process 24, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"1\", :value \"x 28 3 yx 10 14 y\"}\n{:process 24, :type :invoke, :f :append, :key \"7\", :value \"x 24 8 y\"}\n{:process 43, :type :ok, :f :append, :key \"0\", :value \"x 43 4 y\"}\n{:process 43, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"9\", :value \"x 31 7 yx 28 4 y\"}\n{:process 43, :type :invoke, :f :append, :key \"8\", :value \"x 43 5 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 11 y\"}\n{:process 28, :type :ok, :f :append, :key \"8\", :value \"x 28 5 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 28, :type :invoke, :f :append, :key \"4\", :value \"x 28 6 y\"}\n{:process 44, :type :ok, :f :append, :key \"2\", :value \"x 44 7 y\"}\n{:process 44, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 y\"}\n{:process 1, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"7\", :value \"x 24 8 y\"}\n{:process 24, :type :invoke, :f :append, :key \"8\", :value \"x 24 9 y\"}\n{:process 1, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 1, :type :invoke, :f :append, :key \"0\", :value \"x 1 7 y\"}\n{:process 44, :type :ok, :f :get, :key \"6\", :value \"x 49 13 yx 8 8 yx 49 14 yx 6 17 yx 22 3 y\"}\n{:process 44, :type :invoke, :f :append, :key \"4\", :value \"x 44 8 y\"}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 44 4 yx 10 13 yx 0 10 yx 43 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"3\", :value \"x 31 6 yx 1 6 yx 20 8 yx 43 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 12 y\"}\n{:process 28, :type :ok, :f :append, :key \"4\", :value \"x 28 6 y\"}\n{:process 28, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"7\", :value \"x 27 4 y\"}\n{:process 27, :type :invoke, :f :append, :key \"7\", :value \"x 27 5 y\"}\n{:process 13, :type :ok, :f :append, :key \"1\", :value \"x 13 6 y\"}\n{:process 43, :type :ok, :f :append, :key \"8\", :value \"x 43 5 y\"}\n{:process 43, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 13, :type :invoke, :f :put, :key \"5\", :value \"x 13 7 y\"}\n{:process 21, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 y\"}\n{:process 21, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 40, :type :ok, :f :get, :key \"2\", :value \"x 23 3 yx 2 5 yx 10 10 yx 44 5 yx 46 6 yx 44 6 yx 24 7 yx 44 7 yx 0 11 y\"}\n{:process 40, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 2 y\"}\n{:process 36, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 12 y\"}\n{:process 0, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"8\", :value \"x 24 9 y\"}\n{:process 24, :type :invoke, :f :append, :key \"1\", :value \"x 24 10 y\"}\n{:process 44, :type :ok, :f :append, :key \"4\", :value \"x 44 8 y\"}\n{:process 44, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 40, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 yx 7 1 yx 7 3 yx 26 11 yx 49 9 yx 32 4 yx 17 6 yx 17 8 yx 49 16 yx 0 9 yx 17 11 yx 42 4 yx 28 6 y\"}\n{:process 40, :type :invoke, :f :append, :key \"9\", :value \"x 40 2 y\"}\n{:process 0, :type :ok, :f :get, :key \"2\", :value \"x 23 3 yx 2 5 yx 10 10 yx 44 5 yx 46 6 yx 44 6 yx 24 7 yx 44 7 yx 0 11 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 13 y\"}\n{:process 36, :type :ok, :f :get, :key \"2\", :value \"x 23 3 yx 2 5 yx 10 10 yx 44 5 yx 46 6 yx 44 6 yx 24 7 yx 44 7 yx 0 11 y\"}\n{:process 36, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"5\", :value \"x 43 0 yx 21 4 yx 6 8 yx 41 1 yx 32 1 yx 20 4 yx 46 3 yx 0 7 yx 11 7 yx 13 5 yx 45 0 yx 15 9 yx 11 13 y\"}\n{:process 23, :type :invoke, :f :append, :key \"1\", :value \"x 23 6 y\"}\n{:process 44, :type :ok, :f :get, :key \"0\", :value \"x 44 4 yx 10 13 yx 0 10 yx 43 4 yx 36 2 y\"}\n{:process 44, :type :invoke, :f :append, :key \"5\", :value \"x 44 9 y\"}\n{:process 36, :type :ok, :f :get, :key \"3\", :value \"x 31 6 yx 1 6 yx 20 8 yx 43 3 y\"}\n{:process 36, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 13, :type :ok, :f :put, :key \"5\", :value \"x 13 7 y\"}\n{:process 13, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"7\", :value \"x 27 5 y\"}\n{:process 27, :type :invoke, :f :append, :key \"2\", :value \"x 27 6 y\"}\n{:process 24, :type :ok, :f :append, :key \"1\", :value \"x 24 10 y\"}\n{:process 24, :type :invoke, :f :append, :key \"0\", :value \"x 24 11 y\"}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 13 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"2\", :value \"x 23 3 yx 2 5 yx 10 10 yx 44 5 yx 46 6 yx 44 6 yx 24 7 yx 44 7 yx 0 11 y\"}\n{:process 13, :type :invoke, :f :append, :key \"8\", :value \"x 13 8 y\"}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 31 7 yx 28 4 yx 0 13 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 14 y\"}\n{:process 27, :type :ok, :f :append, :key \"2\", :value \"x 27 6 y\"}\n{:process 27, :type :invoke, :f :put, :key \"6\", :value \"x 27 7 y\"}\n{:process 45, :type :ok, :f :put, :key \"2\", :value \"x 45 2 y\"}\n{:process 45, :type :invoke, :f :append, :key \"4\", :value \"x 45 3 y\"}\n{:process 44, :type :ok, :f :append, :key \"5\", :value \"x 44 9 y\"}\n{:process 44, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"8\", :value \"x 13 8 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 13 7 yx 44 9 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"3\", :value \"x 37 5 y\"}\n{:process 28, :type :invoke, :f :append, :key \"7\", :value \"x 28 7 y\"}\n{:process 43, :type :ok, :f :get, :key \"0\", :value \"x 15 8 y\"}\n{:process 43, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 13 7 yx 44 9 y\"}\n{:process 13, :type :invoke, :f :append, :key \"2\", :value \"x 13 9 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 14 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 27, :type :ok, :f :put, :key \"6\", :value \"x 27 7 y\"}\n{:process 27, :type :invoke, :f :append, :key \"1\", :value \"x 27 8 y\"}\n{:process 45, :type :ok, :f :append, :key \"4\", :value \"x 45 3 y\"}\n{:process 45, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"0\", :value \"x 15 8 y\"}\n{:process 43, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"1\", :value \"x 27 8 y\"}\n{:process 27, :type :invoke, :f :append, :key \"1\", :value \"x 27 9 y\"}\n{:process 13, :type :ok, :f :append, :key \"2\", :value \"x 13 9 y\"}\n{:process 13, :type :invoke, :f :append, :key \"4\", :value \"x 13 10 y\"}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 13 7 yx 44 9 yx 14 2 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"3\", :value \"x 11 16 y\"}\n{:process 11, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 31 7 yx 28 4 yx 0 13 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"0\", :value \"x 44 4 yx 10 13 yx 0 10 yx 43 4 yx 36 2 y\"}\n{:process 11, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 yx 10 12 yx 49 18 yx 24 8 yx 27 4 yx 27 5 y\"}\n{:process 11, :type :invoke, :f :append, :key \"3\", :value \"x 11 17 y\"}\n{:process 25, :type :ok, :f :put, :key \"0\", :value \"x 25 1 y\"}\n{:process 25, :type :invoke, :f :append, :key \"9\", :value \"x 25 2 y\"}\n{:process 27, :type :ok, :f :append, :key \"1\", :value \"x 27 9 y\"}\n{:process 27, :type :invoke, :f :append, :key \"9\", :value \"x 27 10 y\"}\n{:process 13, :type :ok, :f :append, :key \"4\", :value \"x 13 10 y\"}\n{:process 13, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"3\", :value \"x 37 5 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 3 y\"}\n{:process 37, :type :ok, :f :put, :key \"3\", :value \"x 37 5 y\"}\n{:process 37, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 yx 10 12 yx 49 18 yx 24 8 yx 27 4 yx 27 5 y\"}\n{:process 37, :type :invoke, :f :append, :key \"2\", :value \"x 37 6 y\"}\n{:process 16, :type :ok, :f :append, :key \"5\", :value \"x 16 8 y\"}\n{:process 16, :type :invoke, :f :append, :key \"1\", :value \"x 16 9 y\"}\n{:process 44, :type :ok, :f :get, :key \"6\", :value \"x 27 7 y\"}\n{:process 44, :type :invoke, :f :append, :key \"5\", :value \"x 44 10 y\"}\n{:process 16, :type :ok, :f :append, :key \"1\", :value \"x 16 9 y\"}\n{:process 16, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"9\", :value \"x 25 2 y\"}\n{:process 25, :type :invoke, :f :append, :key \"4\", :value \"x 25 3 y\"}\n{:process 21, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 yx 10 12 yx 49 18 yx 24 8 yx 27 4 yx 27 5 y\"}\n{:process 21, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"3\", :value \"x 15 6 yx 49 5 yx 49 6 yx 0 1 yx 4 1 yx 20 0 yx 31 1 y\"}\n{:process 45, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 yx 43 5 yx 24 9 yx 13 8 y\"}\n{:process 16, :type :invoke, :f :append, :key \"6\", :value \"x 16 10 y\"}\n{:process 45, :type :ok, :f :get, :key \"1\", :value \"x 30 0 yx 46 1 yx 30 3 yx 13 1 yx 5 0 yx 15 4 yx 34 0 yx 25 0 yx 18 3 y\"}\n{:process 45, :type :invoke, :f :append, :key \"9\", :value \"x 45 4 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 4 y\"}\n{:process 7, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"4\", :value \"x 6 0 yx 26 1 yx 46 2 yx 3 1 yx 12 6 yx 16 1 yx 15 3 yx 8 0 yx 38 0 yx 27 2 yx 19 2 yx 19 3 yx 29 1 yx 49 7 yx 32 3 yx 5 3 yx 6 12 yx 3 5 yx 39 1 yx 44 0 yx 44 2 yx 42 3 yx 46 5 yx 30 6 yx 26 4 yx 30 11 yx 7 1 yx 7 3 yx 26 11 yx 49 9 yx 32 4 yx 17 6 yx 17 8 yx 49 16 yx 0 9 yx 17 11 yx 42 4 yx 28 6 yx 44 8 yx 0 14 yx 45 3 yx 13 10 y\"}\n{:process 7, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"3\", :value \"x 37 5 y\"}\n{:process 43, :type :invoke, :f :append, :key \"1\", :value \"x 43 6 y\"}\n{:process 21, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 y\"}\n{:process 21, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 13 7 yx 44 9 yx 14 2 yx 16 8 yx 7 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 15 y\"}\n{:process 16, :type :ok, :f :append, :key \"6\", :value \"x 16 10 y\"}\n{:process 16, :type :invoke, :f :append, :key \"9\", :value \"x 16 11 y\"}\n{:process 7, :type :ok, :f :get, :key \"9\", :value \"x 31 7 yx 28 4 yx 0 13 yx 27 10 yx 25 2 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"3\", :value \"x 15 6 yx 49 5 yx 49 6 yx 0 1 yx 4 1 yx 20 0 yx 31 1 y\"}\n{:process 21, :type :invoke, :f :append, :key \"2\", :value \"x 21 8 y\"}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 25 1 y\"}\n{:process 7, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"0\", :value \"x 25 1 y\"}\n{:process 13, :type :invoke, :f :append, :key \"1\", :value \"x 13 11 y\"}\n{:process 7, :type :ok, :f :get, :key \"6\", :value \"x 14 0 yx 11 0 yx 31 0 y\"}\n{:process 7, :type :invoke, :f :append, :key \"9\", :value \"x 7 5 y\"}\n{:process 39, :type :ok, :f :append, :key \"8\", :value \"x 39 4 y\"}\n{:process 39, :type :invoke, :f :append, :key \"9\", :value \"x 39 5 y\"}\n{:process 39, :type :ok, :f :append, :key \"9\", :value \"x 39 5 y\"}\n{:process 39, :type :invoke, :f :append, :key \"5\", :value \"x 39 6 y\"}\n{:process 20, :type :ok, :f :append, :key \"3\", :value \"x 20 8 y\"}\n{:process 20, :type :invoke, :f :append, :key \"9\", :value \"x 20 9 y\"}\n{:process 23, :type :ok, :f :append, :key \"1\", :value \"x 23 6 y\"}\n{:process 23, :type :invoke, :f :append, :key \"7\", :value \"x 23 7 y\"}\n{:process 2, :type :ok, :f :append, :key \"7\", :value \"x 2 7 y\"}\n{:process 2, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"5\", :value \"x 39 6 y\"}\n{:process 39, :type :invoke, :f :append, :key \"4\", :value \"x 39 7 y\"}\n{:process 2, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 y\"}\n{:process 2, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"1\", :value \"x 10 14 y\"}\n{:process 10, :type :invoke, :f :put, :key \"9\", :value \"x 10 15 y\"}\n{:process 23, :type :ok, :f :append, :key \"7\", :value \"x 23 7 y\"}\n{:process 23, :type :invoke, :f :append, :key \"9\", :value \"x 23 8 y\"}\n{:process 12, :type :ok, :f :append, :key \"2\", :value \"x 12 9 y\"}\n{:process 12, :type :invoke, :f :append, :key \"2\", :value \"x 12 10 y\"}\n{:process 2, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 y\"}\n{:process 2, :type :invoke, :f :put, :key \"4\", :value \"x 2 8 y\"}\n{:process 23, :type :ok, :f :append, :key \"9\", :value \"x 23 8 y\"}\n{:process 23, :type :invoke, :f :append, :key \"2\", :value \"x 23 9 y\"}\n{:process 39, :type :ok, :f :append, :key \"4\", :value \"x 39 7 y\"}\n{:process 39, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 3, :type :ok, :f :put, :key \"6\", :value \"x 3 9 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 10 y\"}\n{:process 12, :type :ok, :f :append, :key \"2\", :value \"x 12 10 y\"}\n{:process 12, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 10, :type :ok, :f :put, :key \"9\", :value \"x 10 15 y\"}\n{:process 10, :type :invoke, :f :append, :key \"0\", :value \"x 10 16 y\"}\n{:process 35, :type :ok, :f :append, :key \"6\", :value \"x 35 4 y\"}\n{:process 35, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 2, :type :ok, :f :put, :key \"4\", :value \"x 2 8 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 9 y\"}\n{:process 35, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 y\"}\n{:process 35, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 yx 10 12 yx 49 18 yx 24 8 yx 27 4 yx 27 5 yx 23 7 y\"}\n{:process 39, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"4\", :value \"x 2 8 y\"}\n{:process 12, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"1\", :value \"x 31 8 y\"}\n{:process 31, :type :invoke, :f :append, :key \"6\", :value \"x 31 9 y\"}\n{:process 17, :type :ok, :f :append, :key \"4\", :value \"x 17 11 y\"}\n{:process 17, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"4\", :value \"x 2 8 y\"}\n{:process 12, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"2\", :value \"x 23 9 y\"}\n{:process 23, :type :invoke, :f :append, :key \"9\", :value \"x 23 10 y\"}\n{:process 12, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 y\"}\n{:process 12, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 yx 10 12 yx 49 18 yx 24 8 yx 27 4 yx 27 5 yx 23 7 y\"}\n{:process 35, :type :invoke, :f :append, :key \"6\", :value \"x 35 5 y\"}\n{:process 49, :type :ok, :f :append, :key \"7\", :value \"x 49 18 y\"}\n{:process 49, :type :invoke, :f :append, :key \"9\", :value \"x 49 19 y\"}\n{:process 39, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 yx 43 5 yx 24 9 yx 13 8 yx 39 4 y\"}\n{:process 39, :type :invoke, :f :append, :key \"5\", :value \"x 39 8 y\"}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 10 y\"}\n{:process 3, :type :invoke, :f :append, :key \"6\", :value \"x 3 11 y\"}\n{:process 42, :type :ok, :f :put, :key \"4\", :value \"x 42 5 y\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 y\"}\n{:process 12, :type :invoke, :f :put, :key \"7\", :value \"x 12 11 y\"}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 yx 10 12 yx 49 18 yx 24 8 yx 27 4 yx 27 5 yx 23 7 y\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"0\", :value \"x 10 16 y\"}\n{:process 8, :type :ok, :f :append, :key \"9\", :value \"x 8 12 y\"}\n{:process 10, :type :invoke, :f :append, :key \"3\", :value \"x 10 17 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"9\", :value \"x 49 19 y\"}\n{:process 49, :type :invoke, :f :append, :key \"9\", :value \"x 49 20 y\"}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 2 6 yx 8 10 yx 2 7 yx 10 12 yx 49 18 yx 24 8 yx 27 4 yx 27 5 yx 23 7 y\"}\n{:process 42, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"1\", :value \"x 28 3 yx 10 14 yx 13 6 yx 24 10 yx 27 8 yx 27 9 yx 16 9 yx 23 6 yx 31 8 y\"}\n{:process 42, :type :invoke, :f :append, :key \"6\", :value \"x 42 6 y\"}\n{:process 12, :type :ok, :f :put, :key \"7\", :value \"x 12 11 y\"}\n{:process 12, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"5\", :value \"x 39 8 y\"}\n{:process 39, :type :invoke, :f :append, :key \"3\", :value \"x 39 9 y\"}\n{:process 3, :type :ok, :f :append, :key \"6\", :value \"x 3 11 y\"}\n{:process 3, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 9 1 yx 35 4 yx 3 11 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 13 y\"}\n{:process 10, :type :ok, :f :append, :key \"3\", :value \"x 10 17 y\"}\n{:process 10, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"4\", :value \"x 42 5 y\"}\n{:process 12, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 yx 43 5 yx 24 9 yx 13 8 yx 39 4 y\"}\n{:process 12, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"3\", :value \"x 39 9 y\"}\n{:process 39, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"6\", :value \"x 42 6 y\"}\n{:process 42, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 yx 43 5 yx 24 9 yx 13 8 yx 39 4 y\"}\n{:process 12, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"5\", :value \"x 13 7 yx 44 9 yx 14 2 yx 16 8 yx 7 4 yx 39 6 yx 39 8 y\"}\n{:process 3, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 13 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 14 y\"}\n{:process 49, :type :ok, :f :append, :key \"9\", :value \"x 49 20 y\"}\n{:process 49, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 y\"}\n{:process 10, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 y\"}\n{:process 49, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"6\", :value \"x 9 1 yx 35 4 yx 3 11 yx 42 6 y\"}\n{:process 39, :type :invoke, :f :put, :key \"5\", :value \"x 39 10 y\"}\n{:process 12, :type :ok, :f :get, :key \"5\", :value \"x 13 7 yx 44 9 yx 14 2 yx 16 8 yx 7 4 yx 39 6 yx 39 8 y\"}\n{:process 12, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"5\", :value \"x 13 7 yx 44 9 yx 14 2 yx 16 8 yx 7 4 yx 39 6 yx 39 8 y\"}\n{:process 49, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"7\", :value \"x 28 7 y\"}\n{:process 28, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"3\", :value \"x 31 6 yx 1 6 yx 20 8 yx 43 3 yx 11 17 yx 3 10 yx 10 17 yx 39 9 yx 8 13 y\"}\n{:process 28, :type :invoke, :f :append, :key \"9\", :value \"x 28 8 y\"}\n{:process 42, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 y\"}\n{:process 42, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"4\", :value \"x 42 5 y\"}\n{:process 42, :type :invoke, :f :append, :key \"0\", :value \"x 42 7 y\"}\n{:process 10, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 y\"}\n{:process 10, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 yx 43 5 yx 24 9 yx 13 8 yx 39 4 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 12 y\"}\n{:process 22, :type :ok, :f :append, :key \"6\", :value \"x 22 3 y\"}\n{:process 22, :type :invoke, :f :append, :key \"7\", :value \"x 22 4 y\"}\n{:process 49, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 yx 43 5 yx 24 9 yx 13 8 yx 39 4 y\"}\n{:process 49, :type :invoke, :f :append, :key \"4\", :value \"x 49 21 y\"}\n{:process 10, :type :ok, :f :get, :key \"3\", :value \"x 31 6 yx 1 6 yx 20 8 yx 43 3 yx 11 17 yx 3 10 yx 10 17 yx 39 9 yx 8 13 y\"}\n{:process 10, :type :invoke, :f :append, :key \"2\", :value \"x 10 18 y\"}\n{:process 17, :type :ok, :f :get, :key \"7\", :value \"x 12 11 yx 28 7 y\"}\n{:process 17, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 39, :type :ok, :f :put, :key \"5\", :value \"x 39 10 y\"}\n{:process 39, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 14 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 15 y\"}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 12 y\"}\n{:process 10, :type :ok, :f :append, :key \"2\", :value \"x 10 18 y\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 13 y\"}\n{:process 10, :type :invoke, :f :append, :key \"0\", :value \"x 10 19 y\"}\n{:process 28, :type :ok, :f :append, :key \"9\", :value \"x 28 8 y\"}\n{:process 28, :type :invoke, :f :append, :key \"8\", :value \"x 28 9 y\"}\n{:process 39, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 yx 43 5 yx 24 9 yx 13 8 yx 39 4 y\"}\n{:process 39, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"6\", :value \"x 9 1 yx 35 4 yx 3 11 yx 42 6 y\"}\n{:process 17, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"6\", :value \"x 9 1 yx 35 4 yx 3 11 yx 42 6 y\"}\n{:process 39, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"0\", :value \"x 42 7 y\"}\n{:process 42, :type :invoke, :f :append, :key \"0\", :value \"x 42 8 y\"}\n{:process 22, :type :ok, :f :append, :key \"7\", :value \"x 22 4 y\"}\n{:process 22, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 3 y\"}\n{:process 36, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 y\"}\n{:process 17, :type :invoke, :f :append, :key \"3\", :value \"x 17 12 y\"}\n{:process 39, :type :ok, :f :get, :key \"7\", :value \"x 12 11 yx 28 7 yx 22 4 y\"}\n{:process 39, :type :invoke, :f :append, :key \"7\", :value \"x 39 11 y\"}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 13 y\"}\n{:process 3, :type :invoke, :f :append, :key \"0\", :value \"x 3 14 y\"}\n{:process 28, :type :ok, :f :append, :key \"8\", :value \"x 28 9 y\"}\n{:process 28, :type :invoke, :f :append, :key \"9\", :value \"x 28 10 y\"}\n{:process 10, :type :ok, :f :append, :key \"0\", :value \"x 10 19 y\"}\n{:process 10, :type :invoke, :f :append, :key \"2\", :value \"x 10 20 y\"}\n{:process 36, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 yx 10 18 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 4 y\"}\n{:process 22, :type :ok, :f :get, :key \"3\", :value \"x 31 6 yx 1 6 yx 20 8 yx 43 3 yx 11 17 yx 3 10 yx 10 17 yx 39 9 yx 8 13 yx 8 14 y\"}\n{:process 22, :type :invoke, :f :append, :key \"3\", :value \"x 22 5 y\"}\n{:process 42, :type :ok, :f :append, :key \"0\", :value \"x 42 8 y\"}\n{:process 42, :type :invoke, :f :append, :key \"4\", :value \"x 42 9 y\"}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 4 y\"}\n{:process 36, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"7\", :value \"x 39 11 y\"}\n{:process 39, :type :invoke, :f :append, :key \"4\", :value \"x 39 12 y\"}\n{:process 28, :type :ok, :f :append, :key \"9\", :value \"x 28 10 y\"}\n{:process 28, :type :invoke, :f :append, :key \"3\", :value \"x 28 11 y\"}\n{:process 22, :type :ok, :f :append, :key \"3\", :value \"x 22 5 y\"}\n{:process 22, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"2\", :value \"x 10 20 y\"}\n{:process 10, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 yx 10 18 yx 10 20 y\"}\n{:process 22, :type :invoke, :f :append, :key \"3\", :value \"x 22 6 y\"}\n{:process 24, :type :ok, :f :append, :key \"0\", :value \"x 24 11 y\"}\n{:process 24, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"4\", :value \"x 42 9 y\"}\n{:process 3, :type :ok, :f :append, :key \"0\", :value \"x 3 14 y\"}\n{:process 42, :type :invoke, :f :append, :key \"7\", :value \"x 42 10 y\"}\n{:process 3, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"5\", :value \"x 39 10 y\"}\n{:process 36, :type :invoke, :f :append, :key \"9\", :value \"x 36 5 y\"}\n{:process 28, :type :ok, :f :append, :key \"3\", :value \"x 28 11 y\"}\n{:process 28, :type :invoke, :f :put, :key \"1\", :value \"x 28 12 y\"}\n{:process 22, :type :ok, :f :append, :key \"3\", :value \"x 22 6 y\"}\n{:process 22, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"4\", :value \"x 39 12 y\"}\n{:process 39, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"2\", :value \"x 14 1 yx 16 4 yx 30 13 y\"}\n{:process 12, :type :invoke, :f :append, :key \"0\", :value \"x 12 12 y\"}\n{:process 39, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 y\"}\n{:process 39, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 yx 10 18 yx 10 20 y\"}\n{:process 3, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 yx 43 5 yx 24 9 yx 13 8 yx 39 4 yx 28 9 y\"}\n{:process 22, :type :invoke, :f :append, :key \"8\", :value \"x 22 7 y\"}\n{:process 15, :type :ok, :f :append, :key \"0\", :value \"x 15 12 y\"}\n{:process 15, :type :invoke, :f :append, :key \"3\", :value \"x 15 13 y\"}\n{:process 3, :type :ok, :f :get, :key \"3\", :value \"x 31 6 yx 1 6 yx 20 8 yx 43 3 yx 11 17 yx 3 10 yx 10 17 yx 39 9 yx 8 13 yx 8 14 yx 22 5 yx 28 11 yx 22 6 y\"}\n{:process 3, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"9\", :value \"x 36 5 y\"}\n{:process 36, :type :invoke, :f :append, :key \"9\", :value \"x 36 6 y\"}\n{:process 42, :type :ok, :f :append, :key \"7\", :value \"x 42 10 y\"}\n{:process 42, :type :invoke, :f :append, :key \"6\", :value \"x 42 11 y\"}\n{:process 24, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 y\"}\n{:process 24, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"3\", :value \"x 31 6 yx 1 6 yx 20 8 yx 43 3 yx 11 17 yx 3 10 yx 10 17 yx 39 9 yx 8 13 yx 8 14 yx 22 5 yx 28 11 yx 22 6 y\"}\n{:process 3, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 y\"}\n{:process 39, :type :invoke, :f :put, :key \"3\", :value \"x 39 13 y\"}\n{:process 3, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 y\"}\n{:process 3, :type :invoke, :f :append, :key \"6\", :value \"x 3 15 y\"}\n{:process 28, :type :ok, :f :put, :key \"1\", :value \"x 28 12 y\"}\n{:process 28, :type :invoke, :f :append, :key \"8\", :value \"x 28 13 y\"}\n{:process 22, :type :ok, :f :append, :key \"8\", :value \"x 22 7 y\"}\n{:process 22, :type :invoke, :f :append, :key \"3\", :value \"x 22 8 y\"}\n{:process 15, :type :ok, :f :append, :key \"3\", :value \"x 15 13 y\"}\n{:process 15, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"5\", :value \"x 39 10 y\"}\n{:process 24, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"9\", :value \"x 36 6 y\"}\n{:process 36, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 7 y\"}\n{:process 28, :type :ok, :f :append, :key \"8\", :value \"x 28 13 y\"}\n{:process 28, :type :invoke, :f :put, :key \"8\", :value \"x 28 14 y\"}\n{:process 22, :type :ok, :f :append, :key \"3\", :value \"x 22 8 y\"}\n{:process 22, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"6\", :value \"x 3 15 y\"}\n{:process 3, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 44, :type :ok, :f :append, :key \"5\", :value \"x 44 10 y\"}\n{:process 44, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"6\", :value \"x 42 11 y\"}\n{:process 42, :type :invoke, :f :append, :key \"3\", :value \"x 42 12 y\"}\n{:process 22, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 y\"}\n{:process 22, :type :invoke, :f :append, :key \"9\", :value \"x 22 9 y\"}\n{:process 28, :type :ok, :f :put, :key \"8\", :value \"x 28 14 y\"}\n{:process 28, :type :invoke, :f :append, :key \"3\", :value \"x 28 15 y\"}\n{:process 45, :type :ok, :f :append, :key \"9\", :value \"x 45 4 y\"}\n{:process 45, :type :invoke, :f :append, :key \"4\", :value \"x 45 5 y\"}\n{:process 24, :type :ok, :f :get, :key \"8\", :value \"x 28 14 y\"}\n{:process 24, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 y\"}\n{:process 15, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 39, :type :ok, :f :put, :key \"3\", :value \"x 39 13 y\"}\n{:process 39, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 7 y\"}\n{:process 36, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 yx 10 18 yx 10 20 y\"}\n{:process 36, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"7\", :value \"x 12 11 yx 28 7 yx 22 4 yx 39 11 yx 42 10 y\"}\n{:process 36, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 y\"}\n{:process 39, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"3\", :value \"x 28 15 y\"}\n{:process 28, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"6\", :value \"x 9 1 yx 35 4 yx 3 11 yx 42 6 yx 3 15 yx 42 11 y\"}\n{:process 36, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"4\", :value \"x 45 5 y\"}\n{:process 45, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 yx 45 5 y\"}\n{:process 45, :type :invoke, :f :append, :key \"3\", :value \"x 45 6 y\"}\n{:process 36, :type :ok, :f :get, :key \"5\", :value \"x 39 10 yx 44 10 y\"}\n{:process 36, :type :invoke, :f :append, :key \"7\", :value \"x 36 8 y\"}\n{:process 28, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 yx 45 5 y\"}\n{:process 28, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"9\", :value \"x 22 9 y\"}\n{:process 22, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"3\", :value \"x 45 6 y\"}\n{:process 45, :type :invoke, :f :append, :key \"0\", :value \"x 45 7 y\"}\n{:process 39, :type :ok, :f :get, :key \"8\", :value \"x 28 14 y\"}\n{:process 39, :type :invoke, :f :append, :key \"6\", :value \"x 39 14 y\"}\n{:process 13, :type :ok, :f :append, :key \"1\", :value \"x 13 11 y\"}\n{:process 13, :type :invoke, :f :append, :key \"9\", :value \"x 13 12 y\"}\n{:process 25, :type :ok, :f :append, :key \"4\", :value \"x 25 3 y\"}\n{:process 25, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 y\"}\n{:process 22, :type :invoke, :f :append, :key \"4\", :value \"x 22 10 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 15 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 16 y\"}\n{:process 28, :type :ok, :f :get, :key \"5\", :value \"x 39 10 yx 44 10 yx 0 15 y\"}\n{:process 28, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 37, :type :ok, :f :append, :key \"2\", :value \"x 37 6 y\"}\n{:process 37, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"7\", :value \"x 36 8 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 9 y\"}\n{:process 39, :type :ok, :f :append, :key \"6\", :value \"x 39 14 y\"}\n{:process 39, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"0\", :value \"x 45 7 y\"}\n{:process 45, :type :invoke, :f :append, :key \"6\", :value \"x 45 8 y\"}\n{:process 27, :type :ok, :f :append, :key \"9\", :value \"x 27 10 y\"}\n{:process 27, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"9\", :value \"x 13 12 y\"}\n{:process 13, :type :invoke, :f :append, :key \"0\", :value \"x 13 13 y\"}\n{:process 22, :type :ok, :f :append, :key \"4\", :value \"x 22 10 y\"}\n{:process 22, :type :invoke, :f :append, :key \"8\", :value \"x 22 11 y\"}\n{:process 39, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 y\"}\n{:process 39, :type :invoke, :f :append, :key \"1\", :value \"x 39 15 y\"}\n{:process 37, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 y\"}\n{:process 37, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 yx 45 5 yx 25 3 yx 22 10 y\"}\n{:process 37, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 yx 10 18 yx 10 20 yx 37 6 y\"}\n{:process 28, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"7\", :value \"x 12 11 yx 28 7 yx 22 4 yx 39 11 yx 42 10 yx 36 8 y\"}\n{:process 37, :type :invoke, :f :append, :key \"2\", :value \"x 37 7 y\"}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 9 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 10 y\"}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 16 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 y\"}\n{:process 0, :type :invoke, :f :append, :key \"5\", :value \"x 0 17 y\"}\n{:process 3, :type :ok, :f :get, :key \"1\", :value \"x 3 8 yx 31 3 yx 16 5 yx 48 2 yx 26 8 yx 30 16 y\"}\n{:process 3, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"8\", :value \"x 28 14 y\"}\n{:process 27, :type :invoke, :f :append, :key \"8\", :value \"x 27 11 y\"}\n{:process 44, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 y\"}\n{:process 44, :type :invoke, :f :append, :key \"1\", :value \"x 44 11 y\"}\n{:process 45, :type :ok, :f :append, :key \"6\", :value \"x 45 8 y\"}\n{:process 45, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"8\", :value \"x 22 11 y\"}\n{:process 22, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"0\", :value \"x 13 13 y\"}\n{:process 13, :type :invoke, :f :append, :key \"1\", :value \"x 13 14 y\"}\n{:process 37, :type :ok, :f :append, :key \"2\", :value \"x 37 7 y\"}\n{:process 37, :type :invoke, :f :append, :key \"3\", :value \"x 37 8 y\"}\n{:process 27, :type :ok, :f :append, :key \"8\", :value \"x 27 11 y\"}\n{:process 27, :type :invoke, :f :append, :key \"4\", :value \"x 27 12 y\"}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 10 y\"}\n{:process 36, :type :invoke, :f :append, :key \"1\", :value \"x 36 11 y\"}\n{:process 39, :type :ok, :f :append, :key \"1\", :value \"x 39 15 y\"}\n{:process 39, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"1\", :value \"x 28 12 yx 13 11 yx 39 15 y\"}\n{:process 39, :type :invoke, :f :append, :key \"3\", :value \"x 39 16 y\"}\n{:process 15, :type :ok, :f :get, :key \"8\", :value \"x 47 5 yx 10 5 yx 18 8 yx 39 3 yx 6 16 yx 17 10 yx 0 8 yx 28 5 yx 43 5 yx 24 9 yx 13 8 y\"}\n{:process 15, :type :invoke, :f :append, :key \"6\", :value \"x 15 14 y\"}\n{:process 0, :type :ok, :f :append, :key \"5\", :value \"x 0 17 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"1\", :value \"x 28 12 yx 13 11 yx 39 15 y\"}\n{:process 24, :type :invoke, :f :append, :key \"9\", :value \"x 24 12 y\"}\n{:process 13, :type :ok, :f :append, :key \"1\", :value \"x 13 14 y\"}\n{:process 13, :type :invoke, :f :append, :key \"6\", :value \"x 13 15 y\"}\n{:process 37, :type :ok, :f :append, :key \"3\", :value \"x 37 8 y\"}\n{:process 37, :type :invoke, :f :append, :key \"0\", :value \"x 37 9 y\"}\n{:process 27, :type :ok, :f :append, :key \"4\", :value \"x 27 12 y\"}\n{:process 27, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 37, :type :ok, :f :append, :key \"0\", :value \"x 37 9 y\"}\n{:process 37, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"1\", :value \"x 36 11 y\"}\n{:process 36, :type :invoke, :f :append, :key \"6\", :value \"x 36 12 y\"}\n{:process 39, :type :ok, :f :append, :key \"3\", :value \"x 39 16 y\"}\n{:process 39, :type :invoke, :f :append, :key \"3\", :value \"x 39 17 y\"}\n{:process 27, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 y\"}\n{:process 27, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"6\", :value \"x 13 15 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"6\", :value \"x 9 1 yx 35 4 yx 3 11 yx 42 6 yx 3 15 yx 42 11 yx 39 14 yx 45 8 y\"}\n{:process 10, :type :invoke, :f :append, :key \"6\", :value \"x 10 21 y\"}\n{:process 25, :type :ok, :f :get, :key \"7\", :value \"x 16 3 y\"}\n{:process 25, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 yx 45 5 yx 25 3 yx 22 10 yx 27 12 y\"}\n{:process 27, :type :invoke, :f :append, :key \"4\", :value \"x 27 13 y\"}\n{:process 7, :type :ok, :f :append, :key \"9\", :value \"x 7 5 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 6 y\"}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 39 10 yx 44 10 yx 0 15 yx 0 17 y\"}\n{:process 13, :type :invoke, :f :append, :key \"2\", :value \"x 13 16 y\"}\n{:process 25, :type :ok, :f :get, :key \"9\", :value \"x 6 2 yx 13 0 yx 36 0 yx 3 0 yx 24 0 yx 49 2 yx 18 0 yx 18 1 yx 5 1 yx 21 0 yx 18 4 yx 18 6 yx 41 0 yx 8 2 yx 17 4 yx 20 5 yx 42 1 yx 24 4 yx 11 14 yx 11 15 y\"}\n{:process 25, :type :invoke, :f :append, :key \"7\", :value \"x 25 4 y\"}\n{:process 39, :type :ok, :f :append, :key \"3\", :value \"x 39 17 y\"}\n{:process 39, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"1\", :value \"x 28 12 yx 13 11 yx 39 15 yx 13 14 yx 36 11 y\"}\n{:process 28, :type :invoke, :f :append, :key \"3\", :value \"x 28 16 y\"}\n{:process 39, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 y\"}\n{:process 39, :type :invoke, :f :append, :key \"5\", :value \"x 39 18 y\"}\n{:process 22, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 yx 10 18 yx 10 20 yx 37 6 yx 37 7 y\"}\n{:process 22, :type :invoke, :f :append, :key \"7\", :value \"x 22 12 y\"}\n{:process 37, :type :ok, :f :get, :key \"9\", :value \"x 31 7 yx 28 4 yx 0 13 yx 27 10 yx 25 2 y\"}\n{:process 37, :type :invoke, :f :append, :key \"1\", :value \"x 37 10 y\"}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"x 9 1 yx 35 4 yx 3 11 yx 42 6 yx 3 15 yx 42 11 yx 39 14 yx 45 8 yx 13 15 yx 36 12 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"5\", :value \"x 39 10 yx 44 10 yx 0 15 yx 0 17 y\"}\n{:process 45, :type :invoke, :f :append, :key \"9\", :value \"x 45 9 y\"}\n{:process 3, :type :ok, :f :get, :key \"0\", :value \"x 15 8 yx 32 0 yx 33 1 yx 20 2 yx 1 3 yx 2 3 yx 11 3 yx 40 1 yx 0 5 yx 46 4 yx 26 2 yx 12 7 yx 11 8 yx 36 1 yx 45 1 yx 16 6 yx 16 7 y\"}\n{:process 3, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 28 12 yx 13 11 yx 39 15 yx 13 14 yx 36 11 y\"}\n{:process 0, :type :invoke, :f :append, :key \"7\", :value \"x 0 18 y\"}\n{:process 3, :type :ok, :f :get, :key \"7\", :value \"x 12 11 yx 28 7 yx 22 4 yx 39 11 yx 42 10 yx 36 8 y\"}\n{:process 3, :type :invoke, :f :append, :key \"2\", :value \"x 3 16 y\"}\n{:process 32, :type :ok, :f :append, :key \"0\", :value \"x 32 5 y\"}\n{:process 32, :type :invoke, :f :append, :key \"6\", :value \"x 32 6 y\"}\n{:process 10, :type :ok, :f :append, :key \"6\", :value \"x 10 21 y\"}\n{:process 10, :type :invoke, :f :append, :key \"8\", :value \"x 10 22 y\"}\n{:process 32, :type :ok, :f :append, :key \"6\", :value \"x 32 6 y\"}\n{:process 32, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"1\", :value \"x 28 12 yx 13 11 yx 39 15 yx 13 14 yx 36 11 y\"}\n{:process 32, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"7\", :value \"x 25 4 y\"}\n{:process 25, :type :invoke, :f :append, :key \"2\", :value \"x 25 5 y\"}\n{:process 44, :type :ok, :f :append, :key \"1\", :value \"x 44 11 y\"}\n{:process 44, :type :invoke, :f :append, :key \"4\", :value \"x 44 12 y\"}\n{:process 14, :type :ok, :f :append, :key \"5\", :value \"x 14 2 y\"}\n{:process 14, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"7\", :value \"x 22 12 y\"}\n{:process 22, :type :invoke, :f :append, :key \"1\", :value \"x 22 13 y\"}\n{:process 15, :type :ok, :f :append, :key \"6\", :value \"x 15 14 y\"}\n{:process 15, :type :invoke, :f :append, :key \"9\", :value \"x 15 15 y\"}\n{:process 25, :type :ok, :f :append, :key \"2\", :value \"x 25 5 y\"}\n{:process 25, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"8\", :value \"x 28 14 yx 22 11 yx 27 11 yx 10 22 y\"}\n{:process 14, :type :invoke, :f :append, :key \"8\", :value \"x 14 3 y\"}\n{:process 44, :type :ok, :f :append, :key \"4\", :value \"x 44 12 y\"}\n{:process 44, :type :invoke, :f :append, :key \"4\", :value \"x 44 13 y\"}\n{:process 15, :type :ok, :f :append, :key \"9\", :value \"x 15 15 y\"}\n{:process 15, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"7\", :value \"x 12 11 yx 28 7 yx 22 4 yx 39 11 yx 42 10 yx 36 8 yx 5 6 yx 25 4 yx 22 12 y\"}\n{:process 25, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"5\", :value \"x 39 10 yx 44 10 yx 0 15 yx 0 17 yx 39 18 y\"}\n{:process 25, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"8\", :value \"x 14 3 y\"}\n{:process 14, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"6\", :value \"x 9 1 yx 35 4 yx 3 11 yx 42 6 yx 3 15 yx 42 11 yx 39 14 yx 45 8 yx 13 15 yx 36 12 yx 10 21 yx 32 6 yx 15 14 y\"}\n{:process 25, :type :invoke, :f :append, :key \"8\", :value \"x 25 6 y\"}\n{:process 14, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 y\"}\n{:process 14, :type :invoke, :f :append, :key \"0\", :value \"x 14 4 y\"}\n{:process 18, :type :ok, :f :append, :key \"1\", :value \"x 18 9 y\"}\n{:process 18, :type :invoke, :f :append, :key \"2\", :value \"x 18 10 y\"}\n{:process 15, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 y\"}\n{:process 15, :type :invoke, :f :append, :key \"2\", :value \"x 15 16 y\"}\n{:process 36, :type :ok, :f :append, :key \"6\", :value \"x 36 12 y\"}\n{:process 25, :type :ok, :f :append, :key \"8\", :value \"x 25 6 y\"}\n{:process 36, :type :invoke, :f :append, :key \"5\", :value \"x 36 13 y\"}\n{:process 25, :type :invoke, :f :append, :key \"3\", :value \"x 25 7 y\"}\n{:process 44, :type :ok, :f :append, :key \"4\", :value \"x 44 13 y\"}\n{:process 44, :type :invoke, :f :append, :key \"2\", :value \"x 44 14 y\"}\n{:process 4, :type :ok, :f :append, :key \"8\", :value \"x 4 6 y\"}\n{:process 4, :type :invoke, :f :append, :key \"2\", :value \"x 4 7 y\"}\n{:process 18, :type :ok, :f :append, :key \"2\", :value \"x 18 10 y\"}\n{:process 18, :type :invoke, :f :append, :key \"6\", :value \"x 18 11 y\"}\n{:process 14, :type :ok, :f :append, :key \"0\", :value \"x 14 4 y\"}\n{:process 14, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"3\", :value \"x 25 7 y\"}\n{:process 25, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 y\"}\n{:process 14, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"6\", :value \"x 18 11 y\"}\n{:process 18, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"7\", :value \"x 12 11 yx 28 7 yx 22 4 yx 39 11 yx 42 10 yx 36 8 yx 5 6 yx 25 4 yx 22 12 y\"}\n{:process 14, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"2\", :value \"x 4 7 y\"}\n{:process 4, :type :invoke, :f :append, :key \"7\", :value \"x 4 8 y\"}\n{:process 25, :type :ok, :f :get, :key \"2\", :value \"x 45 2 yx 27 6 yx 13 9 yx 48 5 yx 12 9 yx 12 10 yx 23 9 yx 10 18 yx 10 20 yx 37 6 yx 37 7 yx 13 16 yx 25 5 yx 18 10 yx 4 7 y\"}\n{:process 25, :type :invoke, :f :put, :key \"7\", :value \"x 25 8 y\"}\n{:process 18, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 y\"}\n{:process 18, :type :invoke, :f :put, :key \"5\", :value \"x 18 12 y\"}\n{:process 44, :type :ok, :f :append, :key \"2\", :value \"x 44 14 y\"}\n{:process 44, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"7\", :value \"x 4 8 y\"}\n{:process 4, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"8\", :value \"x 28 14 yx 22 11 yx 27 11 yx 10 22 yx 14 3 yx 25 6 yx 4 6 y\"}\n{:process 44, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 y\"}\n{:process 4, :type :invoke, :f :put, :key \"5\", :value \"x 4 9 y\"}\n{:process 44, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 yx 45 5 yx 25 3 yx 22 10 yx 27 12 yx 7 6 yx 27 13 yx 44 12 yx 44 13 y\"}\n{:process 44, :type :invoke, :f :append, :key \"6\", :value \"x 44 15 y\"}\n{:process 18, :type :ok, :f :put, :key \"5\", :value \"x 18 12 y\"}\n{:process 18, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"9\", :value \"x 16 11 y\"}\n{:process 16, :type :invoke, :f :append, :key \"0\", :value \"x 16 12 y\"}\n{:process 25, :type :ok, :f :put, :key \"7\", :value \"x 25 8 y\"}\n{:process 25, :type :invoke, :f :append, :key \"7\", :value \"x 25 9 y\"}\n{:process 18, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 y\"}\n{:process 18, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 33, :type :ok, :f :append, :key \"9\", :value \"x 33 3 y\"}\n{:process 33, :type :invoke, :f :append, :key \"5\", :value \"x 33 4 y\"}\n{:process 4, :type :ok, :f :put, :key \"5\", :value \"x 4 9 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 10 y\"}\n{:process 16, :type :ok, :f :append, :key \"0\", :value \"x 16 12 y\"}\n{:process 16, :type :invoke, :f :append, :key \"7\", :value \"x 16 13 y\"}\n{:process 18, :type :ok, :f :get, :key \"5\", :value \"x 4 9 y\"}\n{:process 18, :type :invoke, :f :append, :key \"9\", :value \"x 18 13 y\"}\n{:process 11, :type :ok, :f :append, :key \"3\", :value \"x 11 17 y\"}\n{:process 11, :type :invoke, :f :append, :key \"6\", :value \"x 11 18 y\"}\n{:process 28, :type :ok, :f :append, :key \"3\", :value \"x 28 16 y\"}\n{:process 28, :type :invoke, :f :put, :key \"1\", :value \"x 28 17 y\"}\n{:process 33, :type :ok, :f :append, :key \"5\", :value \"x 33 4 y\"}\n{:process 33, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 28, :type :ok, :f :put, :key \"1\", :value \"x 28 17 y\"}\n{:process 28, :type :invoke, :f :append, :key \"0\", :value \"x 28 18 y\"}\n{:process 11, :type :ok, :f :append, :key \"6\", :value \"x 11 18 y\"}\n{:process 11, :type :invoke, :f :put, :key \"5\", :value \"x 11 19 y\"}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 10 y\"}\n{:process 18, :type :ok, :f :append, :key \"9\", :value \"x 18 13 y\"}\n{:process 4, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 18, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"7\", :value \"x 16 13 y\"}\n{:process 16, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"6\", :value \"x 9 1 yx 35 4 yx 3 11 yx 42 6 yx 3 15 yx 42 11 yx 39 14 yx 45 8 yx 13 15 yx 36 12 yx 10 21 yx 32 6 yx 15 14 yx 18 11 yx 11 18 y\"}\n{:process 33, :type :invoke, :f :put, :key \"8\", :value \"x 33 5 y\"}\n{:process 28, :type :ok, :f :append, :key \"0\", :value \"x 28 18 y\"}\n{:process 28, :type :invoke, :f :append, :key \"6\", :value \"x 28 19 y\"}\n{:process 4, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 yx 28 16 y\"}\n{:process 4, :type :invoke, :f :put, :key \"0\", :value \"x 4 11 y\"}\n{:process 33, :type :ok, :f :put, :key \"8\", :value \"x 33 5 y\"}\n{:process 33, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"3\", :value \"x 47 6 y\"}\n{:process 47, :type :invoke, :f :put, :key \"6\", :value \"x 47 7 y\"}\n{:process 14, :type :ok, :f :get, :key \"1\", :value \"x 28 17 y\"}\n{:process 14, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 43, :type :ok, :f :append, :key \"1\", :value \"x 43 6 y\"}\n{:process 43, :type :invoke, :f :append, :key \"0\", :value \"x 43 7 y\"}\n{:process 11, :type :ok, :f :put, :key \"5\", :value \"x 11 19 y\"}\n{:process 11, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"9\", :value \"x 40 2 y\"}\n{:process 40, :type :invoke, :f :append, :key \"5\", :value \"x 40 3 y\"}\n{:process 28, :type :ok, :f :append, :key \"6\", :value \"x 28 19 y\"}\n{:process 28, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 47, :type :ok, :f :put, :key \"6\", :value \"x 47 7 y\"}\n{:process 47, :type :invoke, :f :append, :key \"6\", :value \"x 47 8 y\"}\n{:process 14, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 yx 45 5 yx 25 3 yx 22 10 yx 27 12 yx 7 6 yx 27 13 yx 44 12 yx 44 13 yx 4 10 y\"}\n{:process 14, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"6\", :value \"x 47 7 y\"}\n{:process 11, :type :invoke, :f :append, :key \"3\", :value \"x 11 20 y\"}\n{:process 40, :type :ok, :f :append, :key \"5\", :value \"x 40 3 y\"}\n{:process 40, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 y\"}\n{:process 28, :type :invoke, :f :append, :key \"7\", :value \"x 28 20 y\"}\n{:process 43, :type :ok, :f :append, :key \"0\", :value \"x 43 7 y\"}\n{:process 43, :type :invoke, :f :append, :key \"9\", :value \"x 43 8 y\"}\n{:process 40, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 yx 43 7 y\"}\n{:process 40, :type :invoke, :f :append, :key \"1\", :value \"x 40 4 y\"}\n{:process 14, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 y\"}\n{:process 14, :type :invoke, :f :append, :key \"7\", :value \"x 14 5 y\"}\n{:process 47, :type :ok, :f :append, :key \"6\", :value \"x 47 8 y\"}\n{:process 47, :type :invoke, :f :put, :key \"2\", :value \"x 47 9 y\"}\n{:process 28, :type :ok, :f :append, :key \"7\", :value \"x 28 20 y\"}\n{:process 40, :type :ok, :f :append, :key \"1\", :value \"x 40 4 y\"}\n{:process 28, :type :invoke, :f :append, :key \"9\", :value \"x 28 21 y\"}\n{:process 40, :type :invoke, :f :append, :key \"0\", :value \"x 40 5 y\"}\n{:process 47, :type :ok, :f :put, :key \"2\", :value \"x 47 9 y\"}\n{:process 47, :type :invoke, :f :append, :key \"8\", :value \"x 47 10 y\"}\n{:process 43, :type :ok, :f :append, :key \"9\", :value \"x 43 8 y\"}\n{:process 43, :type :invoke, :f :append, :key \"8\", :value \"x 43 9 y\"}\n{:process 0, :type :ok, :f :append, :key \"7\", :value \"x 0 18 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 y\"}\n{:process 32, :type :invoke, :f :append, :key \"9\", :value \"x 32 7 y\"}\n{:process 16, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 yx 43 7 y\"}\n{:process 16, :type :invoke, :f :append, :key \"4\", :value \"x 16 14 y\"}\n{:process 47, :type :ok, :f :append, :key \"8\", :value \"x 47 10 y\"}\n{:process 47, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"9\", :value \"x 28 21 y\"}\n{:process 28, :type :invoke, :f :append, :key \"2\", :value \"x 28 22 y\"}\n{:process 47, :type :ok, :f :get, :key \"5\", :value \"x 11 19 yx 40 3 y\"}\n{:process 47, :type :invoke, :f :append, :key \"1\", :value \"x 47 11 y\"}\n{:process 37, :type :ok, :f :append, :key \"1\", :value \"x 37 10 y\"}\n{:process 40, :type :ok, :f :append, :key \"0\", :value \"x 40 5 y\"}\n{:process 37, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 40, :type :invoke, :f :append, :key \"1\", :value \"x 40 6 y\"}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 y\"}\n{:process 0, :type :invoke, :f :append, :key \"3\", :value \"x 0 19 y\"}\n{:process 43, :type :ok, :f :append, :key \"8\", :value \"x 43 9 y\"}\n{:process 43, :type :invoke, :f :append, :key \"8\", :value \"x 43 10 y\"}\n{:process 18, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 y\"}\n{:process 18, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"2\", :value \"x 47 9 y\"}\n{:process 18, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"2\", :value \"x 28 22 y\"}\n{:process 28, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 y\"}\n{:process 33, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 y\"}\n{:process 33, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"1\", :value \"x 47 11 y\"}\n{:process 47, :type :invoke, :f :append, :key \"8\", :value \"x 47 12 y\"}\n{:process 28, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 yx 28 16 yx 47 6 yx 0 19 y\"}\n{:process 28, :type :invoke, :f :append, :key \"7\", :value \"x 28 23 y\"}\n{:process 18, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 yx 43 7 yx 40 5 y\"}\n{:process 18, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"4\", :value \"x 26 11 y\"}\n{:process 26, :type :invoke, :f :append, :key \"2\", :value \"x 26 12 y\"}\n{:process 43, :type :ok, :f :append, :key \"8\", :value \"x 43 10 y\"}\n{:process 43, :type :invoke, :f :append, :key \"8\", :value \"x 43 11 y\"}\n{:process 18, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 y\"}\n{:process 18, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 yx 28 16 yx 47 6 yx 0 19 y\"}\n{:process 33, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"5\", :value \"x 11 19 yx 40 3 y\"}\n{:process 18, :type :invoke, :f :append, :key \"8\", :value \"x 18 14 y\"}\n{:process 33, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 yx 28 16 yx 47 6 yx 0 19 y\"}\n{:process 33, :type :invoke, :f :append, :key \"6\", :value \"x 33 6 y\"}\n{:process 26, :type :ok, :f :append, :key \"2\", :value \"x 26 12 y\"}\n{:process 26, :type :invoke, :f :append, :key \"2\", :value \"x 26 13 y\"}\n{:process 28, :type :ok, :f :append, :key \"7\", :value \"x 28 23 y\"}\n{:process 28, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"8\", :value \"x 47 12 y\"}\n{:process 47, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"2\", :value \"x 26 13 y\"}\n{:process 26, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 43, :type :ok, :f :append, :key \"8\", :value \"x 43 11 y\"}\n{:process 43, :type :invoke, :f :append, :key \"6\", :value \"x 43 12 y\"}\n{:process 39, :type :ok, :f :append, :key \"5\", :value \"x 39 18 y\"}\n{:process 39, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"4\", :value \"x 42 5 yx 49 21 yx 42 9 yx 39 12 yx 45 5 yx 25 3 yx 22 10 yx 27 12 yx 7 6 yx 27 13 yx 44 12 yx 44 13 yx 4 10 y\"}\n{:process 28, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"8\", :value \"x 33 5 yx 47 10 yx 43 9 yx 43 10 yx 47 12 yx 43 11 y\"}\n{:process 47, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 43, :type :ok, :f :append, :key \"6\", :value \"x 43 12 y\"}\n{:process 43, :type :invoke, :f :put, :key \"4\", :value \"x 43 13 y\"}\n{:process 41, :type :ok, :f :append, :key \"5\", :value \"x 41 4 y\"}\n{:process 41, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 yx 28 16 yx 47 6 yx 0 19 y\"}\n{:process 37, :type :invoke, :f :append, :key \"1\", :value \"x 37 11 y\"}\n{:process 41, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 y\"}\n{:process 41, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 43, :type :ok, :f :put, :key \"4\", :value \"x 43 13 y\"}\n{:process 43, :type :invoke, :f :append, :key \"3\", :value \"x 43 14 y\"}\n{:process 41, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 y\"}\n{:process 41, :type :invoke, :f :append, :key \"0\", :value \"x 41 5 y\"}\n{:process 6, :type :ok, :f :append, :key \"6\", :value \"x 6 17 y\"}\n{:process 6, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 9, :type :ok, :f :put, :key \"6\", :value \"x 9 1 y\"}\n{:process 9, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"0\", :value \"x 41 5 y\"}\n{:process 41, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"5\", :value \"x 11 19 yx 40 3 yx 41 4 y\"}\n{:process 41, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"5\", :value \"x 11 19 yx 40 3 yx 41 4 y\"}\n{:process 6, :type :invoke, :f :append, :key \"4\", :value \"x 6 18 y\"}\n{:process 43, :type :ok, :f :append, :key \"3\", :value \"x 43 14 y\"}\n{:process 43, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 y\"}\n{:process 43, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"1\", :value \"x 28 17 yx 40 4 yx 37 10 yx 40 6 yx 47 11 y\"}\n{:process 28, :type :invoke, :f :append, :key \"1\", :value \"x 28 24 y\"}\n{:process 41, :type :ok, :f :get, :key \"8\", :value \"x 33 5 yx 47 10 yx 43 9 yx 43 10 yx 47 12 yx 43 11 y\"}\n{:process 41, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"2\", :value \"x 21 8 y\"}\n{:process 21, :type :invoke, :f :append, :key \"9\", :value \"x 21 9 y\"}\n{:process 6, :type :ok, :f :append, :key \"4\", :value \"x 6 18 y\"}\n{:process 6, :type :invoke, :f :append, :key \"6\", :value \"x 6 19 y\"}\n{:process 26, :type :ok, :f :get, :key \"1\", :value \"x 28 17 yx 40 4 yx 37 10 yx 40 6 yx 47 11 y\"}\n{:process 26, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"3\", :value \"x 42 12 y\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 48, :type :ok, :f :append, :key \"2\", :value \"x 48 5 y\"}\n{:process 48, :type :invoke, :f :append, :key \"4\", :value \"x 48 6 y\"}\n{:process 41, :type :ok, :f :get, :key \"4\", :value \"x 43 13 yx 6 18 y\"}\n{:process 41, :type :invoke, :f :append, :key \"8\", :value \"x 41 6 y\"}\n{:process 21, :type :ok, :f :append, :key \"9\", :value \"x 21 9 y\"}\n{:process 21, :type :invoke, :f :append, :key \"2\", :value \"x 21 10 y\"}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 y\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"4\", :value \"x 43 13 yx 6 18 y\"}\n{:process 39, :type :invoke, :f :append, :key \"1\", :value \"x 39 19 y\"}\n{:process 26, :type :ok, :f :get, :key \"4\", :value \"x 43 13 y\"}\n{:process 26, :type :invoke, :f :append, :key \"3\", :value \"x 26 14 y\"}\n{:process 6, :type :ok, :f :append, :key \"6\", :value \"x 6 19 y\"}\n{:process 6, :type :invoke, :f :put, :key \"8\", :value \"x 6 20 y\"}\n{:process 41, :type :ok, :f :append, :key \"8\", :value \"x 41 6 y\"}\n{:process 41, :type :invoke, :f :append, :key \"9\", :value \"x 41 7 y\"}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 y\"}\n{:process 42, :type :invoke, :f :append, :key \"9\", :value \"x 42 13 y\"}\n{:process 48, :type :ok, :f :append, :key \"4\", :value \"x 48 6 y\"}\n{:process 48, :type :invoke, :f :append, :key \"9\", :value \"x 48 7 y\"}\n{:process 49, :type :ok, :f :append, :key \"4\", :value \"x 49 21 y\"}\n{:process 49, :type :invoke, :f :append, :key \"4\", :value \"x 49 22 y\"}\n{:process 6, :type :ok, :f :put, :key \"8\", :value \"x 6 20 y\"}\n{:process 6, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"2\", :value \"x 21 10 y\"}\n{:process 21, :type :invoke, :f :append, :key \"9\", :value \"x 21 11 y\"}\n{:process 41, :type :ok, :f :append, :key \"9\", :value \"x 41 7 y\"}\n{:process 41, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"2\", :value \"x 13 16 y\"}\n{:process 13, :type :invoke, :f :append, :key \"6\", :value \"x 13 17 y\"}\n{:process 42, :type :ok, :f :append, :key \"9\", :value \"x 42 13 y\"}\n{:process 42, :type :invoke, :f :append, :key \"2\", :value \"x 42 14 y\"}\n{:process 45, :type :ok, :f :append, :key \"9\", :value \"x 45 9 y\"}\n{:process 45, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 y\"}\n{:process 9, :type :invoke, :f :append, :key \"9\", :value \"x 9 2 y\"}\n{:process 41, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 y\"}\n{:process 41, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"4\", :value \"x 43 13 yx 6 18 yx 48 6 y\"}\n{:process 41, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"9\", :value \"x 21 11 y\"}\n{:process 21, :type :invoke, :f :append, :key \"3\", :value \"x 21 12 y\"}\n{:process 45, :type :ok, :f :get, :key \"8\", :value \"x 6 20 y\"}\n{:process 45, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"5\", :value \"x 39 10 yx 44 10 yx 0 15 yx 0 17 y\"}\n{:process 43, :type :invoke, :f :append, :key \"5\", :value \"x 43 15 y\"}\n{:process 41, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 y\"}\n{:process 41, :type :invoke, :f :append, :key \"1\", :value \"x 41 8 y\"}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 15 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 16 y\"}\n{:process 42, :type :ok, :f :append, :key \"2\", :value \"x 42 14 y\"}\n{:process 42, :type :invoke, :f :put, :key \"5\", :value \"x 42 15 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 16 y\"}\n{:process 8, :type :invoke, :f :append, :key \"9\", :value \"x 8 17 y\"}\n{:process 42, :type :ok, :f :put, :key \"5\", :value \"x 42 15 y\"}\n{:process 41, :type :ok, :f :append, :key \"1\", :value \"x 41 8 y\"}\n{:process 42, :type :invoke, :f :append, :key \"3\", :value \"x 42 16 y\"}\n{:process 41, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"9\", :value \"x 29 6 y\"}\n{:process 29, :type :invoke, :f :append, :key \"5\", :value \"x 29 7 y\"}\n{:process 41, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 yx 43 7 yx 40 5 yx 41 5 y\"}\n{:process 41, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"8\", :value \"x 6 20 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 yx 28 16 yx 47 6 yx 0 19 yx 43 14 yx 21 12 y\"}\n{:process 41, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"1\", :value \"x 28 17 yx 40 4 yx 37 10 yx 40 6 yx 47 11 yx 8 15 yx 41 8 y\"}\n{:process 41, :type :invoke, :f :append, :key \"6\", :value \"x 41 9 y\"}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 yx 43 7 yx 40 5 yx 41 5 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 yx 28 16 yx 47 6 yx 0 19 yx 43 14 yx 21 12 y\"}\n{:process 6, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"1\", :value \"x 28 17 yx 40 4 yx 37 10 yx 40 6 yx 47 11 yx 8 15 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 10 y\"}\n{:process 6, :type :ok, :f :get, :key \"2\", :value \"x 47 9 yx 28 22 yx 26 12 yx 26 13 yx 21 8 yx 21 10 yx 42 14 yx 8 16 y\"}\n{:process 6, :type :invoke, :f :put, :key \"3\", :value \"x 6 21 y\"}\n{:process 47, :type :ok, :f :get, :key \"1\", :value \"x 28 17 yx 40 4 yx 37 10 yx 40 6 yx 47 11 yx 8 15 y\"}\n{:process 47, :type :invoke, :f :append, :key \"8\", :value \"x 47 13 y\"}\n{:process 35, :type :ok, :f :append, :key \"6\", :value \"x 35 5 y\"}\n{:process 35, :type :invoke, :f :append, :key \"5\", :value \"x 35 6 y\"}\n{:process 18, :type :ok, :f :append, :key \"8\", :value \"x 18 14 y\"}\n{:process 18, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 y\"}\n{:process 18, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"6\", :value \"x 31 9 y\"}\n{:process 31, :type :invoke, :f :put, :key \"5\", :value \"x 31 10 y\"}\n{:process 35, :type :ok, :f :append, :key \"5\", :value \"x 35 6 y\"}\n{:process 35, :type :invoke, :f :append, :key \"9\", :value \"x 35 7 y\"}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 9 y\"}\n{:process 2, :type :invoke, :f :put, :key \"8\", :value \"x 2 10 y\"}\n{:process 18, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 yx 43 7 yx 40 5 yx 41 5 y\"}\n{:process 18, :type :invoke, :f :put, :key \"5\", :value \"x 18 15 y\"}\n{:process 31, :type :ok, :f :put, :key \"5\", :value \"x 31 10 y\"}\n{:process 31, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 18, :type :ok, :f :put, :key \"5\", :value \"x 18 15 y\"}\n{:process 18, :type :invoke, :f :put, :key \"2\", :value \"x 18 16 y\"}\n{:process 31, :type :ok, :f :get, :key \"2\", :value \"x 47 9 yx 28 22 yx 26 12 yx 26 13 yx 21 8 yx 21 10 yx 42 14 yx 8 16 y\"}\n{:process 31, :type :invoke, :f :append, :key \"1\", :value \"x 31 11 y\"}\n{:process 2, :type :ok, :f :put, :key \"8\", :value \"x 2 10 y\"}\n{:process 2, :type :invoke, :f :append, :key \"5\", :value \"x 2 11 y\"}\n{:process 35, :type :ok, :f :append, :key \"9\", :value \"x 35 7 y\"}\n{:process 35, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"5\", :value \"x 2 11 y\"}\n{:process 2, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"1\", :value \"x 31 11 y\"}\n{:process 31, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"5\", :value \"x 18 15 yx 2 11 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 12 y\"}\n{:process 31, :type :ok, :f :get, :key \"5\", :value \"x 18 15 yx 2 11 y\"}\n{:process 31, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"9\", :value \"x 23 10 y\"}\n{:process 23, :type :invoke, :f :append, :key \"9\", :value \"x 23 11 y\"}\n{:process 31, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 y\"}\n{:process 31, :type :invoke, :f :append, :key \"9\", :value \"x 31 12 y\"}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 12 y\"}\n{:process 2, :type :invoke, :f :append, :key \"7\", :value \"x 2 13 y\"}\n{:process 12, :type :ok, :f :append, :key \"0\", :value \"x 12 12 y\"}\n{:process 12, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"7\", :value \"x 2 13 y\"}\n{:process 2, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 yx 28 16 yx 47 6 yx 0 19 yx 43 14 yx 21 12 yx 17 12 y\"}\n{:process 12, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"4\", :value \"x 49 22 y\"}\n{:process 49, :type :invoke, :f :append, :key \"0\", :value \"x 49 23 y\"}\n{:process 2, :type :ok, :f :get, :key \"4\", :value \"x 43 13 yx 6 18 yx 48 6 yx 49 22 y\"}\n{:process 2, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"8\", :value \"x 2 10 y\"}\n{:process 2, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 y\"}\n{:process 2, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 y\"}\n{:process 12, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"9\", :value \"x 31 12 y\"}\n{:process 31, :type :invoke, :f :append, :key \"2\", :value \"x 31 13 y\"}\n{:process 12, :type :ok, :f :get, :key \"8\", :value \"x 2 10 y\"}\n{:process 12, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 y\"}\n{:process 2, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"2\", :value \"x 31 13 y\"}\n{:process 31, :type :invoke, :f :put, :key \"4\", :value \"x 31 14 y\"}\n{:process 2, :type :ok, :f :get, :key \"1\", :value \"x 28 17 yx 40 4 yx 37 10 yx 40 6 yx 47 11 yx 8 15 yx 41 8 yx 31 11 y\"}\n{:process 2, :type :invoke, :f :append, :key \"3\", :value \"x 2 14 y\"}\n{:process 31, :type :ok, :f :put, :key \"4\", :value \"x 31 14 y\"}\n{:process 31, :type :invoke, :f :append, :key \"9\", :value \"x 31 15 y\"}\n{:process 10, :type :ok, :f :append, :key \"8\", :value \"x 10 22 y\"}\n{:process 10, :type :invoke, :f :append, :key \"4\", :value \"x 10 23 y\"}\n{:process 8, :type :ok, :f :append, :key \"9\", :value \"x 8 17 y\"}\n{:process 8, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"3\", :value \"x 2 14 y\"}\n{:process 2, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 y\"}\n{:process 8, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 y\"}\n{:process 2, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"9\", :value \"x 31 15 y\"}\n{:process 31, :type :invoke, :f :append, :key \"3\", :value \"x 31 16 y\"}\n{:process 2, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 y\"}\n{:process 2, :type :invoke, :f :append, :key \"2\", :value \"x 2 15 y\"}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 39 13 yx 28 15 yx 42 12 yx 45 6 yx 37 8 yx 39 16 yx 39 17 yx 25 7 yx 28 16 yx 47 6 yx 0 19 yx 43 14 yx 21 12 yx 17 12 yx 2 14 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"3\", :value \"x 31 16 y\"}\n{:process 31, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"2\", :value \"x 2 15 y\"}\n{:process 2, :type :invoke, :f :append, :key \"1\", :value \"x 2 16 y\"}\n{:process 31, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 y\"}\n{:process 31, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"9\", :value \"x 24 12 y\"}\n{:process 24, :type :invoke, :f :append, :key \"8\", :value \"x 24 13 y\"}\n{:process 35, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 y\"}\n{:process 35, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"4\", :value \"x 31 14 y\"}\n{:process 31, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"8\", :value \"x 24 13 y\"}\n{:process 24, :type :invoke, :f :append, :key \"7\", :value \"x 24 14 y\"}\n{:process 31, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 yx 43 7 yx 40 5 yx 41 5 yx 2 12 yx 12 12 yx 49 23 y\"}\n{:process 31, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 y\"}\n{:process 31, :type :invoke, :f :append, :key \"1\", :value \"x 31 17 y\"}\n{:process 35, :type :ok, :f :get, :key \"4\", :value \"x 31 14 y\"}\n{:process 35, :type :invoke, :f :append, :key \"7\", :value \"x 35 8 y\"}\n{:process 15, :type :ok, :f :append, :key \"2\", :value \"x 15 16 y\"}\n{:process 15, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"7\", :value \"x 24 14 y\"}\n{:process 24, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 y\"}\n{:process 15, :type :invoke, :f :append, :key \"1\", :value \"x 15 17 y\"}\n{:process 24, :type :ok, :f :get, :key \"4\", :value \"x 31 14 y\"}\n{:process 24, :type :invoke, :f :append, :key \"4\", :value \"x 24 15 y\"}\n{:process 24, :type :ok, :f :append, :key \"4\", :value \"x 24 15 y\"}\n{:process 24, :type :invoke, :f :append, :key \"9\", :value \"x 24 16 y\"}\n{:process 43, :type :ok, :f :append, :key \"5\", :value \"x 43 15 y\"}\n{:process 43, :type :invoke, :f :append, :key \"5\", :value \"x 43 16 y\"}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 yx 43 7 yx 40 5 yx 41 5 yx 2 12 yx 12 12 yx 49 23 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 18 y\"}\n{:process 24, :type :ok, :f :append, :key \"9\", :value \"x 24 16 y\"}\n{:process 24, :type :invoke, :f :append, :key \"2\", :value \"x 24 17 y\"}\n{:process 12, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 y\"}\n{:process 12, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"2\", :value \"x 24 17 y\"}\n{:process 24, :type :invoke, :f :append, :key \"2\", :value \"x 24 18 y\"}\n{:process 12, :type :ok, :f :get, :key \"2\", :value \"x 18 16 yx 31 13 yx 2 15 yx 15 16 y\"}\n{:process 12, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"2\", :value \"x 24 18 y\"}\n{:process 24, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 37, :type :ok, :f :append, :key \"1\", :value \"x 37 11 y\"}\n{:process 37, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"0\", :value \"x 25 1 yx 19 4 yx 1 7 yx 10 16 yx 42 7 yx 36 3 yx 10 19 yx 42 8 yx 36 4 yx 24 11 yx 3 14 yx 15 12 yx 36 7 yx 45 7 yx 36 9 yx 13 13 yx 36 10 yx 37 9 yx 32 5 yx 14 4 yx 2 9 yx 16 12 yx 28 18 yx 43 7 yx 40 5 yx 41 5 yx 2 12 yx 12 12 yx 49 23 y\"}\n{:process 12, :type :invoke, :f :append, :key \"3\", :value \"x 12 13 y\"}\n{:process 24, :type :ok, :f :get, :key \"1\", :value \"x 28 17 yx 40 4 yx 37 10 yx 40 6 yx 47 11 yx 8 15 yx 41 8 yx 31 11 yx 2 16 yx 15 17 yx 37 11 y\"}\n{:process 24, :type :invoke, :f :append, :key \"5\", :value \"x 24 19 y\"}\n{:process 44, :type :ok, :f :append, :key \"6\", :value \"x 44 15 y\"}\n{:process 44, :type :invoke, :f :append, :key \"6\", :value \"x 44 16 y\"}\n{:process 24, :type :ok, :f :append, :key \"5\", :value \"x 24 19 y\"}\n{:process 24, :type :invoke, :f :append, :key \"3\", :value \"x 24 20 y\"}\n{:process 44, :type :ok, :f :append, :key \"6\", :value \"x 44 16 y\"}\n{:process 44, :type :invoke, :f :append, :key \"2\", :value \"x 44 17 y\"}\n{:process 37, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 yx 44 15 yx 44 16 y\"}\n{:process 37, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"7\", :value \"x 14 5 y\"}\n{:process 14, :type :invoke, :f :append, :key \"9\", :value \"x 14 6 y\"}\n{:process 36, :type :ok, :f :append, :key \"5\", :value \"x 36 13 y\"}\n{:process 36, :type :invoke, :f :put, :key \"1\", :value \"x 36 14 y\"}\n{:process 44, :type :ok, :f :append, :key \"2\", :value \"x 44 17 y\"}\n{:process 44, :type :invoke, :f :append, :key \"6\", :value \"x 44 18 y\"}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 10 y\"}\n{:process 45, :type :invoke, :f :put, :key \"5\", :value \"x 45 11 y\"}\n{:process 37, :type :ok, :f :get, :key \"8\", :value \"x 2 10 yx 24 13 y\"}\n{:process 37, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 36, :type :ok, :f :put, :key \"1\", :value \"x 36 14 y\"}\n{:process 36, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 45, :type :ok, :f :put, :key \"5\", :value \"x 45 11 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 12 y\"}\n{:process 24, :type :ok, :f :append, :key \"3\", :value \"x 24 20 y\"}\n{:process 24, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 y\"}\n{:process 36, :type :invoke, :f :append, :key \"4\", :value \"x 36 15 y\"}\n{:process 37, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 yx 44 15 yx 44 16 y\"}\n{:process 37, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"5\", :value \"x 45 11 y\"}\n{:process 37, :type :invoke, :f :append, :key \"7\", :value \"x 37 12 y\"}\n{:process 14, :type :ok, :f :append, :key \"9\", :value \"x 14 6 y\"}\n{:process 14, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"5\", :value \"x 45 11 y\"}\n{:process 24, :type :invoke, :f :put, :key \"0\", :value \"x 24 21 y\"}\n{:process 14, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 y\"}\n{:process 14, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 12 y\"}\n{:process 45, :type :invoke, :f :append, :key \"4\", :value \"x 45 13 y\"}\n{:process 14, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 yx 24 14 yx 14 5 yx 45 10 yx 45 12 y\"}\n{:process 14, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"3\", :value \"x 0 19 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 20 y\"}\n{:process 14, :type :ok, :f :get, :key \"2\", :value \"x 18 16 yx 31 13 yx 2 15 yx 15 16 yx 24 17 yx 24 18 yx 44 17 y\"}\n{:process 14, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"1\", :value \"x 36 14 y\"}\n{:process 14, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"4\", :value \"x 45 13 y\"}\n{:process 45, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"0\", :value \"x 19 4 y\"}\n{:process 19, :type :invoke, :f :append, :key \"4\", :value \"x 19 5 y\"}\n{:process 14, :type :ok, :f :get, :key \"5\", :value \"x 45 11 y\"}\n{:process 14, :type :invoke, :f :append, :key \"2\", :value \"x 14 7 y\"}\n{:process 25, :type :ok, :f :append, :key \"7\", :value \"x 25 9 y\"}\n{:process 25, :type :invoke, :f :append, :key \"4\", :value \"x 25 10 y\"}\n{:process 34, :type :ok, :f :append, :key \"8\", :value \"x 34 3 y\"}\n{:process 34, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"0\", :value \"\"}\n{:process 34, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 13, :type :ok, :f :append, :key \"6\", :value \"x 13 17 y\"}\n{:process 48, :type :ok, :f :append, :key \"9\", :value \"x 48 7 y\"}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 18 y\"}\n{:process 10, :type :ok, :f :append, :key \"4\", :value \"x 10 23 y\"}\n{:process 39, :type :ok, :f :append, :key \"1\", :value \"x 39 19 y\"}\n{:process 28, :type :ok, :f :append, :key \"1\", :value \"x 28 24 y\"}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 20 y\"}\n{:process 3, :type :ok, :f :append, :key \"2\", :value \"x 3 16 y\"}\n{:process 30, :type :ok, :f :append, :key \"6\", :value \"x 30 18 y\"}\n{:process 32, :type :ok, :f :append, :key \"9\", :value \"x 32 7 y\"}\n{:process 43, :type :ok, :f :append, :key \"5\", :value \"x 43 16 y\"}\n{:process 22, :type :ok, :f :append, :key \"1\", :value \"x 22 13 y\"}\n{:process 12, :type :ok, :f :append, :key \"3\", :value \"x 12 13 y\"}\n{:process 17, :type :ok, :f :append, :key \"3\", :value \"x 17 12 y\"}\n{:process 41, :type :ok, :f :append, :key \"6\", :value \"x 41 9 y\"}\n{:process 23, :type :ok, :f :append, :key \"9\", :value \"x 23 11 y\"}\n{:process 27, :type :ok, :f :append, :key \"4\", :value \"x 27 13 y\"}\n{:process 46, :type :ok, :f :append, :key \"2\", :value \"x 46 6 y\"}\n{:process 5, :type :ok, :f :append, :key \"7\", :value \"x 5 6 y\"}\n{:process 19, :type :ok, :f :append, :key \"4\", :value \"x 19 5 y\"}\n{:process 25, :type :ok, :f :append, :key \"4\", :value \"x 25 10 y\"}\n{:process 15, :type :ok, :f :append, :key \"1\", :value \"x 15 17 y\"}\n{:process 35, :type :ok, :f :append, :key \"7\", :value \"x 35 8 y\"}\n{:process 20, :type :ok, :f :append, :key \"9\", :value \"x 20 9 y\"}\n{:process 47, :type :ok, :f :append, :key \"8\", :value \"x 47 13 y\"}\n{:process 42, :type :ok, :f :append, :key \"3\", :value \"x 42 16 y\"}\n{:process 33, :type :ok, :f :append, :key \"6\", :value \"x 33 6 y\"}\n{:process 37, :type :ok, :f :append, :key \"7\", :value \"x 37 12 y\"}\n{:process 36, :type :ok, :f :append, :key \"4\", :value \"x 36 15 y\"}\n{:process 21, :type :ok, :f :append, :key \"3\", :value \"x 21 12 y\"}\n{:process 18, :type :ok, :f :put, :key \"2\", :value \"x 18 16 y\"}\n{:process 4, :type :ok, :f :put, :key \"0\", :value \"x 4 11 y\"}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 6 y\"}\n{:process 14, :type :ok, :f :append, :key \"2\", :value \"x 14 7 y\"}\n{:process 6, :type :ok, :f :put, :key \"3\", :value \"x 6 21 y\"}\n{:process 31, :type :ok, :f :append, :key \"1\", :value \"x 31 17 y\"}\n{:process 11, :type :ok, :f :append, :key \"3\", :value \"x 11 20 y\"}\n{:process 26, :type :ok, :f :append, :key \"3\", :value \"x 26 14 y\"}\n{:process 2, :type :ok, :f :append, :key \"1\", :value \"x 2 16 y\"}\n{:process 49, :type :ok, :f :append, :key \"0\", :value \"x 49 23 y\"}\n{:process 29, :type :ok, :f :append, :key \"5\", :value \"x 29 7 y\"}\n{:process 9, :type :ok, :f :append, :key \"9\", :value \"x 9 2 y\"}\n{:process 1, :type :ok, :f :append, :key \"0\", :value \"x 1 7 y\"}\n{:process 38, :type :ok, :f :append, :key \"4\", :value \"x 38 0 y\"}\n{:process 44, :type :ok, :f :append, :key \"6\", :value \"x 44 18 y\"}\n{:process 24, :type :ok, :f :put, :key \"0\", :value \"x 24 21 y\"}\n{:process 40, :type :ok, :f :append, :key \"1\", :value \"x 40 6 y\"}\n{:process 16, :type :ok, :f :append, :key \"4\", :value \"x 16 14 y\"}\n{:process 3, :type :invoke, :f :append, :key \"0\", :value \"x 3 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 16, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 1, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 2, :type :invoke, :f :append, :key \"6\", :value \"x 2 0 y\"}\n{:process 49, :type :invoke, :f :append, :key \"3\", :value \"x 49 0 y\"}\n{:process 33, :type :invoke, :f :append, :key \"8\", :value \"x 33 0 y\"}\n{:process 32, :type :invoke, :f :append, :key \"6\", :value \"x 32 0 y\"}\n{:process 34, :type :invoke, :f :append, :key \"4\", :value \"x 34 0 y\"}\n{:process 17, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 35, :type :invoke, :f :append, :key \"6\", :value \"x 35 0 y\"}\n{:process 18, :type :invoke, :f :append, :key \"2\", :value \"x 18 0 y\"}\n{:process 36, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 19, :type :invoke, :f :append, :key \"3\", :value \"x 19 0 y\"}\n{:process 37, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 20, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 38, :type :invoke, :f :append, :key \"2\", :value \"x 38 0 y\"}\n{:process 21, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 39, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 22, :type :invoke, :f :append, :key \"9\", :value \"x 22 0 y\"}\n{:process 40, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 23, :type :invoke, :f :append, :key \"6\", :value \"x 23 0 y\"}\n{:process 41, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 24, :type :invoke, :f :put, :key \"4\", :value \"x 24 0 y\"}\n{:process 1, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 42, :type :invoke, :f :append, :key \"2\", :value \"x 42 0 y\"}\n{:process 25, :type :invoke, :f :append, :key \"5\", :value \"x 25 0 y\"}\n{:process 43, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 26, :type :invoke, :f :append, :key \"0\", :value \"x 26 0 y\"}\n{:process 44, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 27, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 45, :type :invoke, :f :append, :key \"5\", :value \"x 45 0 y\"}\n{:process 28, :type :invoke, :f :append, :key \"6\", :value \"x 28 0 y\"}\n{:process 46, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 29, :type :invoke, :f :append, :key \"8\", :value \"x 29 0 y\"}\n{:process 47, :type :invoke, :f :append, :key \"5\", :value \"x 47 0 y\"}\n{:process 30, :type :invoke, :f :append, :key \"0\", :value \"x 30 0 y\"}\n{:process 48, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 31, :type :invoke, :f :append, :key \"7\", :value \"x 31 0 y\"}\n{:process 12, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 9, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 10, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 11, :type :invoke, :f :append, :key \"6\", :value \"x 11 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"2\", :value \"x 6 0 y\"}\n{:process 7, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 14, :type :invoke, :f :append, :key \"5\", :value \"x 14 0 y\"}\n{:process 13, :type :invoke, :f :append, :key \"3\", :value \"x 13 0 y\"}\n{:process 15, :type :invoke, :f :append, :key \"3\", :value \"x 15 0 y\"}\n{:process 16, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 yx 44 15 yx 44 16 yx 44 18 yx 41 9 yx 33 6 y\"}\n{:process 16, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 0 y\"}\n{:process 10, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 y\"}\n{:process 10, :type :invoke, :f :append, :key \"9\", :value \"x 10 0 y\"}\n{:process 37, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 yx 24 14 yx 14 5 yx 45 10 yx 45 12 yx 37 12 yx 25 9 yx 35 8 y\"}\n{:process 37, :type :invoke, :f :append, :key \"5\", :value \"x 37 0 y\"}\n{:process 40, :type :ok, :f :get, :key \"8\", :value \"x 2 10 yx 24 13 yx 34 3 yx 47 13 y\"}\n{:process 40, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 y\"}\n{:process 39, :type :invoke, :f :put, :key \"7\", :value \"x 39 0 y\"}\n{:process 40, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 y\"}\n{:process 40, :type :invoke, :f :append, :key \"3\", :value \"x 40 0 y\"}\n{:process 12, :type :ok, :f :get, :key \"8\", :value \"x 2 10 yx 24 13 yx 34 3 yx 47 13 y\"}\n{:process 12, :type :invoke, :f :append, :key \"5\", :value \"x 12 0 y\"}\n{:process 20, :type :ok, :f :get, :key \"8\", :value \"x 2 10 yx 24 13 yx 34 3 yx 47 13 y\"}\n{:process 20, :type :invoke, :f :append, :key \"7\", :value \"x 20 0 y\"}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 yx 24 14 yx 14 5 yx 45 10 yx 45 12 yx 37 12 yx 25 9 yx 35 8 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"0\", :value \"x 3 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 1 y\"}\n{:process 43, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 yx 44 15 yx 44 16 yx 44 18 yx 41 9 yx 33 6 y\"}\n{:process 43, :type :invoke, :f :append, :key \"7\", :value \"x 43 0 y\"}\n{:process 36, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 yx 24 14 yx 14 5 yx 45 10 yx 45 12 yx 37 12 yx 25 9 yx 35 8 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 0 y\"}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 yx 44 15 yx 44 16 yx 44 18 yx 41 9 yx 33 6 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 y\"}\n{:process 17, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 y\"}\n{:process 27, :type :invoke, :f :append, :key \"4\", :value \"x 27 0 y\"}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 4 11 yx 3 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 y\"}\n{:process 44, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 39, :type :ok, :f :put, :key \"7\", :value \"x 39 0 y\"}\n{:process 39, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"7\", :value \"x 25 8 yx 16 13 yx 28 20 yx 0 18 yx 28 23 yx 2 13 yx 24 14 yx 14 5 yx 45 10 yx 45 12 yx 37 12 yx 25 9 yx 35 8 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 48, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 y\"}\n{:process 48, :type :invoke, :f :append, :key \"4\", :value \"x 48 0 y\"}\n{:process 46, :type :ok, :f :get, :key \"2\", :value \"x 18 16 yx 31 13 yx 2 15 yx 15 16 yx 24 17 yx 24 18 yx 44 17 yx 3 16 yx 14 7 y\"}\n{:process 46, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 y\"}\n{:process 46, :type :invoke, :f :append, :key \"6\", :value \"x 46 0 y\"}\n{:process 44, :type :ok, :f :get, :key \"8\", :value \"x 2 10 yx 24 13 yx 34 3 yx 47 13 y\"}\n{:process 44, :type :invoke, :f :append, :key \"3\", :value \"x 44 0 y\"}\n{:process 45, :type :ok, :f :append, :key \"5\", :value \"x 45 0 y\"}\n{:process 45, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 4 11 yx 3 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 0 y\"}\n{:process 16, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 y\"}\n{:process 16, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 y\"}\n{:process 1, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 y\"}\n{:process 45, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"8\", :value \"x 2 10 yx 24 13 yx 34 3 yx 47 13 y\"}\n{:process 1, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 y\"}\n{:process 7, :type :invoke, :f :append, :key \"3\", :value \"x 7 0 y\"}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 1 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 2 y\"}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 0 y\"}\n{:process 5, :type :invoke, :f :append, :key \"8\", :value \"x 5 1 y\"}\n{:process 17, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 y\"}\n{:process 17, :type :invoke, :f :append, :key \"7\", :value \"x 17 0 y\"}\n{:process 45, :type :ok, :f :get, :key \"7\", :value \"x 39 0 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 1 y\"}\n{:process 46, :type :ok, :f :append, :key \"6\", :value \"x 46 0 y\"}\n{:process 46, :type :invoke, :f :put, :key \"0\", :value \"x 46 1 y\"}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 2 y\"}\n{:process 3, :type :invoke, :f :append, :key \"4\", :value \"x 3 3 y\"}\n{:process 1, :type :ok, :f :get, :key \"7\", :value \"x 39 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 1 y\"}\n{:process 45, :type :invoke, :f :append, :key \"0\", :value \"x 45 2 y\"}\n{:process 45, :type :ok, :f :append, :key \"0\", :value \"x 45 2 y\"}\n{:process 45, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"4\", :value \"x 3 3 y\"}\n{:process 3, :type :invoke, :f :append, :key \"6\", :value \"x 3 4 y\"}\n{:process 45, :type :ok, :f :get, :key \"8\", :value \"x 2 10 yx 24 13 yx 34 3 yx 47 13 yx 5 1 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 3 y\"}\n{:process 2, :type :ok, :f :append, :key \"6\", :value \"x 2 0 y\"}\n{:process 2, :type :invoke, :f :append, :key \"5\", :value \"x 2 1 y\"}\n{:process 3, :type :ok, :f :append, :key \"6\", :value \"x 3 4 y\"}\n{:process 3, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"8\", :value \"x 2 10 yx 24 13 yx 34 3 yx 47 13 yx 5 1 y\"}\n{:process 3, :type :invoke, :f :append, :key \"2\", :value \"x 3 5 y\"}\n{:process 21, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 yx 45 0 yx 47 0 y\"}\n{:process 21, :type :invoke, :f :append, :key \"5\", :value \"x 21 0 y\"}\n{:process 34, :type :ok, :f :append, :key \"4\", :value \"x 34 0 y\"}\n{:process 34, :type :invoke, :f :append, :key \"9\", :value \"x 34 1 y\"}\n{:process 9, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 y\"}\n{:process 9, :type :invoke, :f :append, :key \"2\", :value \"x 9 0 y\"}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 3 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 4 y\"}\n{:process 34, :type :ok, :f :append, :key \"9\", :value \"x 34 1 y\"}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 0 y\"}\n{:process 34, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 1 y\"}\n{:process 34, :type :ok, :f :get, :key \"0\", :value \"x 46 1 yx 45 2 y\"}\n{:process 34, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"2\", :value \"x 18 16 yx 31 13 yx 2 15 yx 15 16 yx 24 17 yx 24 18 yx 44 17 yx 3 16 yx 14 7 y\"}\n{:process 16, :type :invoke, :f :put, :key \"4\", :value \"x 16 0 y\"}\n{:process 39, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 y\"}\n{:process 39, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 1 y\"}\n{:process 4, :type :invoke, :f :append, :key \"7\", :value \"x 4 2 y\"}\n{:process 39, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 yx 44 15 yx 44 16 yx 44 18 yx 41 9 yx 33 6 yx 46 0 yx 2 0 yx 3 4 y\"}\n{:process 39, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"7\", :value \"x 4 2 y\"}\n{:process 4, :type :invoke, :f :append, :key \"9\", :value \"x 4 3 y\"}\n{:process 17, :type :ok, :f :append, :key \"7\", :value \"x 17 0 y\"}\n{:process 17, :type :invoke, :f :append, :key \"5\", :value \"x 17 1 y\"}\n{:process 41, :type :ok, :f :get, :key \"8\", :value \"x 2 10 yx 24 13 yx 34 3 yx 47 13 yx 5 1 y\"}\n{:process 41, :type :invoke, :f :append, :key \"8\", :value \"x 41 0 y\"}\n{:process 4, :type :ok, :f :append, :key \"9\", :value \"x 4 3 y\"}\n{:process 4, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 yx 34 1 yx 4 3 y\"}\n{:process 4, :type :invoke, :f :append, :key \"7\", :value \"x 4 4 y\"}\n{:process 17, :type :ok, :f :append, :key \"5\", :value \"x 17 1 y\"}\n{:process 17, :type :invoke, :f :append, :key \"4\", :value \"x 17 2 y\"}\n{:process 23, :type :ok, :f :append, :key \"6\", :value \"x 23 0 y\"}\n{:process 23, :type :invoke, :f :append, :key \"9\", :value \"x 23 1 y\"}\n{:process 4, :type :ok, :f :append, :key \"7\", :value \"x 4 4 y\"}\n{:process 4, :type :invoke, :f :append, :key \"9\", :value \"x 4 5 y\"}\n{:process 17, :type :ok, :f :append, :key \"4\", :value \"x 17 2 y\"}\n{:process 17, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"7\", :value \"x 31 0 y\"}\n{:process 31, :type :invoke, :f :append, :key \"5\", :value \"x 31 1 y\"}\n{:process 18, :type :ok, :f :append, :key \"2\", :value \"x 18 0 y\"}\n{:process 18, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"4\", :value \"x 27 0 y\"}\n{:process 27, :type :invoke, :f :append, :key \"2\", :value \"x 27 1 y\"}\n{:process 30, :type :ok, :f :append, :key \"0\", :value \"x 30 0 y\"}\n{:process 30, :type :invoke, :f :put, :key \"2\", :value \"x 30 1 y\"}\n{:process 4, :type :ok, :f :append, :key \"9\", :value \"x 4 5 y\"}\n{:process 4, :type :invoke, :f :put, :key \"8\", :value \"x 4 6 y\"}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 yx 3 3 yx 34 0 yx 17 2 yx 27 0 y\"}\n{:process 17, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"0\", :value \"x 46 1 yx 45 2 yx 30 0 y\"}\n{:process 18, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"6\", :value \"x 47 7 yx 47 8 yx 43 12 yx 6 19 yx 13 17 yx 35 5 yx 31 9 yx 44 15 yx 44 16 yx 44 18 yx 41 9 yx 33 6 yx 46 0 yx 2 0 yx 3 4 yx 23 0 y\"}\n{:process 17, :type :invoke, :f :append, :key \"5\", :value \"x 17 3 y\"}\n{:process 31, :type :ok, :f :append, :key \"5\", :value \"x 31 1 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 2 y\"}\n{:process 23, :type :ok, :f :append, :key \"9\", :value \"x 23 1 y\"}\n{:process 23, :type :invoke, :f :append, :key \"3\", :value \"x 23 2 y\"}\n{:process 17, :type :ok, :f :append, :key \"5\", :value \"x 17 3 y\"}\n{:process 17, :type :invoke, :f :put, :key \"6\", :value \"x 17 4 y\"}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 27, :type :ok, :f :append, :key \"2\", :value \"x 27 1 y\"}\n{:process 27, :type :invoke, :f :append, :key \"5\", :value \"x 27 2 y\"}\n{:process 34, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 yx 34 1 yx 4 3 y\"}\n{:process 34, :type :invoke, :f :append, :key \"5\", :value \"x 34 2 y\"}\n{:process 17, :type :ok, :f :put, :key \"6\", :value \"x 17 4 y\"}\n{:process 17, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 2 y\"}\n{:process 31, :type :invoke, :f :append, :key \"9\", :value \"x 31 3 y\"}\n{:process 18, :type :ok, :f :get, :key \"7\", :value \"x 39 0 yx 45 1 yx 45 3 yx 4 2 yx 17 0 yx 4 4 yx 31 0 y\"}\n{:process 18, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 30, :type :ok, :f :put, :key \"2\", :value \"x 30 1 y\"}\n{:process 30, :type :invoke, :f :append, :key \"8\", :value \"x 30 2 y\"}\n{:process 27, :type :ok, :f :append, :key \"5\", :value \"x 27 2 y\"}\n{:process 27, :type :invoke, :f :append, :key \"9\", :value \"x 27 3 y\"}\n{:process 4, :type :ok, :f :put, :key \"8\", :value \"x 4 6 y\"}\n{:process 4, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"7\", :value \"x 39 0 yx 45 1 yx 45 3 yx 4 2 yx 17 0 yx 4 4 yx 31 0 y\"}\n{:process 39, :type :invoke, :f :append, :key \"7\", :value \"x 39 1 y\"}\n{:process 1, :type :ok, :f :get, :key \"6\", :value \"x 17 4 y\"}\n{:process 1, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"3\", :value \"x 23 2 y\"}\n{:process 23, :type :invoke, :f :append, :key \"7\", :value \"x 23 3 y\"}\n{:process 18, :type :ok, :f :get, :key \"7\", :value \"x 39 0 yx 45 1 yx 45 3 yx 4 2 yx 17 0 yx 4 4 yx 31 0 y\"}\n{:process 18, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"0\", :value \"x 46 1 yx 45 2 yx 30 0 y\"}\n{:process 17, :type :invoke, :f :append, :key \"6\", :value \"x 17 5 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 46 1 yx 45 2 yx 30 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 yx 45 0 yx 47 0 yx 2 1 yx 17 1 yx 31 1 yx 17 3 yx 27 2 y\"}\n{:process 1, :type :invoke, :f :append, :key \"9\", :value \"x 1 0 y\"}\n{:process 30, :type :ok, :f :append, :key \"8\", :value \"x 30 2 y\"}\n{:process 30, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"7\", :value \"x 23 3 y\"}\n{:process 23, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"9\", :value \"x 31 3 y\"}\n{:process 31, :type :invoke, :f :append, :key \"8\", :value \"x 31 4 y\"}\n{:process 30, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 y\"}\n{:process 30, :type :invoke, :f :append, :key \"0\", :value \"x 30 3 y\"}\n{:process 18, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 yx 3 3 yx 34 0 yx 17 2 yx 27 0 yx 31 2 y\"}\n{:process 18, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 30, :type :ok, :f :append, :key \"0\", :value \"x 30 3 y\"}\n{:process 30, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"6\", :value \"x 17 5 y\"}\n{:process 17, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 y\"}\n{:process 30, :type :invoke, :f :append, :key \"8\", :value \"x 30 4 y\"}\n{:process 17, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 yx 34 1 yx 4 3 yx 4 5 yx 23 1 yx 31 3 y\"}\n{:process 17, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"8\", :value \"x 31 4 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 5 y\"}\n{:process 18, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 y\"}\n{:process 18, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"8\", :value \"x 29 0 y\"}\n{:process 29, :type :invoke, :f :append, :key \"4\", :value \"x 29 1 y\"}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 5 y\"}\n{:process 31, :type :invoke, :f :append, :key \"0\", :value \"x 31 6 y\"}\n{:process 22, :type :ok, :f :append, :key \"9\", :value \"x 22 0 y\"}\n{:process 22, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 30, :type :ok, :f :append, :key \"8\", :value \"x 30 4 y\"}\n{:process 30, :type :invoke, :f :append, :key \"2\", :value \"x 30 5 y\"}\n{:process 13, :type :ok, :f :append, :key \"3\", :value \"x 13 0 y\"}\n{:process 13, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 30, :type :ok, :f :append, :key \"2\", :value \"x 30 5 y\"}\n{:process 30, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"x 17 4 yx 17 5 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"0\", :value \"x 31 6 y\"}\n{:process 31, :type :invoke, :f :append, :key \"6\", :value \"x 31 7 y\"}\n{:process 9, :type :ok, :f :append, :key \"2\", :value \"x 9 0 y\"}\n{:process 9, :type :invoke, :f :append, :key \"2\", :value \"x 9 1 y\"}\n{:process 29, :type :ok, :f :append, :key \"4\", :value \"x 29 1 y\"}\n{:process 29, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 yx 45 0 yx 47 0 yx 2 1 yx 17 1 yx 31 1 yx 17 3 yx 27 2 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 0 y\"}\n{:process 30, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 y\"}\n{:process 30, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"2\", :value \"x 9 1 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 2 y\"}\n{:process 31, :type :ok, :f :append, :key \"6\", :value \"x 31 7 y\"}\n{:process 31, :type :invoke, :f :append, :key \"2\", :value \"x 31 8 y\"}\n{:process 23, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 yx 3 3 yx 34 0 yx 17 2 yx 27 0 yx 31 2 yx 31 5 y\"}\n{:process 23, :type :invoke, :f :append, :key \"1\", :value \"x 23 4 y\"}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 2 y\"}\n{:process 9, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"6\", :value \"x 17 4 yx 17 5 y\"}\n{:process 4, :type :invoke, :f :append, :key \"6\", :value \"x 4 7 y\"}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 17 4 yx 17 5 yx 31 7 y\"}\n{:process 8, :type :invoke, :f :append, :key \"8\", :value \"x 8 2 y\"}\n{:process 11, :type :ok, :f :append, :key \"6\", :value \"x 11 0 y\"}\n{:process 11, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"2\", :value \"x 31 8 y\"}\n{:process 31, :type :invoke, :f :put, :key \"0\", :value \"x 31 9 y\"}\n{:process 17, :type :ok, :f :get, :key \"0\", :value \"x 46 1 yx 45 2 yx 30 0 yx 30 3 yx 31 6 y\"}\n{:process 17, :type :invoke, :f :append, :key \"8\", :value \"x 17 6 y\"}\n{:process 42, :type :ok, :f :append, :key \"2\", :value \"x 42 0 y\"}\n{:process 42, :type :invoke, :f :append, :key \"0\", :value \"x 42 1 y\"}\n{:process 28, :type :ok, :f :append, :key \"6\", :value \"x 28 0 y\"}\n{:process 28, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 y\"}\n{:process 28, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 yx 45 0 yx 47 0 yx 2 1 yx 17 1 yx 31 1 yx 17 3 yx 27 2 y\"}\n{:process 13, :type :invoke, :f :append, :key \"6\", :value \"x 13 1 y\"}\n{:process 42, :type :ok, :f :append, :key \"0\", :value \"x 42 1 y\"}\n{:process 42, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 29, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 yx 45 0 yx 47 0 yx 2 1 yx 17 1 yx 31 1 yx 17 3 yx 27 2 y\"}\n{:process 29, :type :invoke, :f :append, :key \"5\", :value \"x 29 2 y\"}\n{:process 30, :type :ok, :f :get, :key \"8\", :value \"x 4 6 yx 30 2 yx 31 4 yx 29 0 yx 30 4 y\"}\n{:process 30, :type :invoke, :f :append, :key \"5\", :value \"x 30 6 y\"}\n{:process 42, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 y\"}\n{:process 42, :type :invoke, :f :append, :key \"3\", :value \"x 42 2 y\"}\n{:process 42, :type :ok, :f :append, :key \"3\", :value \"x 42 2 y\"}\n{:process 42, :type :invoke, :f :append, :key \"1\", :value \"x 42 3 y\"}\n{:process 26, :type :ok, :f :append, :key \"0\", :value \"x 26 0 y\"}\n{:process 26, :type :invoke, :f :append, :key \"5\", :value \"x 26 1 y\"}\n{:process 18, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 yx 3 3 yx 34 0 yx 17 2 yx 27 0 yx 31 2 yx 31 5 yx 29 1 y\"}\n{:process 18, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"1\", :value \"x 42 3 y\"}\n{:process 42, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"9\", :value \"x 1 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"5\", :value \"x 26 1 y\"}\n{:process 26, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"8\", :value \"x 4 6 yx 30 2 yx 31 4 yx 29 0 yx 30 4 y\"}\n{:process 18, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 y\"}\n{:process 22, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 y\"}\n{:process 42, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"2\", :value \"x 38 0 y\"}\n{:process 38, :type :invoke, :f :put, :key \"7\", :value \"x 38 1 y\"}\n{:process 26, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 yx 13 0 yx 15 0 yx 42 2 y\"}\n{:process 26, :type :invoke, :f :append, :key \"3\", :value \"x 26 2 y\"}\n{:process 18, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 y\"}\n{:process 18, :type :invoke, :f :append, :key \"7\", :value \"x 18 1 y\"}\n{:process 37, :type :ok, :f :append, :key \"5\", :value \"x 37 0 y\"}\n{:process 37, :type :invoke, :f :append, :key \"6\", :value \"x 37 1 y\"}\n{:process 22, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 y\"}\n{:process 22, :type :invoke, :f :append, :key \"1\", :value \"x 22 1 y\"}\n{:process 44, :type :ok, :f :append, :key \"3\", :value \"x 44 0 y\"}\n{:process 44, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"3\", :value \"x 26 2 y\"}\n{:process 26, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"6\", :value \"x 17 4 yx 17 5 yx 31 7 yx 11 0 yx 28 0 y\"}\n{:process 42, :type :invoke, :f :put, :key \"0\", :value \"x 42 4 y\"}\n{:process 38, :type :ok, :f :put, :key \"7\", :value \"x 38 1 y\"}\n{:process 38, :type :invoke, :f :append, :key \"7\", :value \"x 38 2 y\"}\n{:process 26, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 yx 13 0 yx 15 0 yx 42 2 yx 44 0 yx 26 2 y\"}\n{:process 26, :type :invoke, :f :append, :key \"2\", :value \"x 26 3 y\"}\n{:process 32, :type :ok, :f :append, :key \"6\", :value \"x 32 0 y\"}\n{:process 32, :type :invoke, :f :append, :key \"8\", :value \"x 32 1 y\"}\n{:process 9, :type :ok, :f :get, :key \"6\", :value \"x 17 4 yx 17 5 yx 31 7 yx 11 0 yx 28 0 y\"}\n{:process 9, :type :invoke, :f :append, :key \"3\", :value \"x 9 3 y\"}\n{:process 38, :type :ok, :f :append, :key \"7\", :value \"x 38 2 y\"}\n{:process 38, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"3\", :value \"x 19 0 y\"}\n{:process 19, :type :invoke, :f :append, :key \"1\", :value \"x 19 1 y\"}\n{:process 38, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 yx 13 0 yx 15 0 yx 42 2 yx 44 0 yx 26 2 yx 19 0 y\"}\n{:process 38, :type :invoke, :f :append, :key \"4\", :value \"x 38 3 y\"}\n{:process 26, :type :ok, :f :append, :key \"2\", :value \"x 26 3 y\"}\n{:process 26, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"1\", :value \"x 19 1 y\"}\n{:process 19, :type :invoke, :f :append, :key \"2\", :value \"x 19 2 y\"}\n{:process 11, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 yx 13 0 yx 15 0 yx 42 2 yx 44 0 yx 26 2 y\"}\n{:process 11, :type :invoke, :f :append, :key \"8\", :value \"x 11 1 y\"}\n{:process 14, :type :ok, :f :append, :key \"5\", :value \"x 14 0 y\"}\n{:process 14, :type :invoke, :f :append, :key \"2\", :value \"x 14 1 y\"}\n{:process 32, :type :ok, :f :append, :key \"8\", :value \"x 32 1 y\"}\n{:process 32, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"6\", :value \"x 35 0 y\"}\n{:process 35, :type :invoke, :f :append, :key \"0\", :value \"x 35 1 y\"}\n{:process 49, :type :ok, :f :append, :key \"3\", :value \"x 49 0 y\"}\n{:process 49, :type :invoke, :f :append, :key \"8\", :value \"x 49 1 y\"}\n{:process 25, :type :ok, :f :append, :key \"5\", :value \"x 25 0 y\"}\n{:process 25, :type :invoke, :f :append, :key \"4\", :value \"x 25 1 y\"}\n{:process 14, :type :ok, :f :append, :key \"2\", :value \"x 14 1 y\"}\n{:process 14, :type :invoke, :f :append, :key \"7\", :value \"x 14 2 y\"}\n{:process 26, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 yx 3 3 yx 34 0 yx 17 2 yx 27 0 yx 31 2 yx 31 5 yx 29 1 yx 38 3 y\"}\n{:process 26, :type :invoke, :f :append, :key \"9\", :value \"x 26 4 y\"}\n{:process 12, :type :ok, :f :append, :key \"5\", :value \"x 12 0 y\"}\n{:process 12, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"2\", :value \"x 19 2 y\"}\n{:process 19, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 y\"}\n{:process 32, :type :invoke, :f :append, :key \"2\", :value \"x 32 2 y\"}\n{:process 35, :type :ok, :f :append, :key \"0\", :value \"x 35 1 y\"}\n{:process 35, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 yx 35 1 y\"}\n{:process 35, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"2\", :value \"x 6 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"2\", :value \"x 6 1 y\"}\n{:process 19, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 yx 13 0 yx 15 0 yx 42 2 yx 44 0 yx 26 2 yx 19 0 yx 49 0 y\"}\n{:process 19, :type :invoke, :f :append, :key \"1\", :value \"x 19 3 y\"}\n{:process 28, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 y\"}\n{:process 28, :type :invoke, :f :append, :key \"0\", :value \"x 28 1 y\"}\n{:process 49, :type :ok, :f :append, :key \"8\", :value \"x 49 1 y\"}\n{:process 49, :type :invoke, :f :append, :key \"3\", :value \"x 49 2 y\"}\n{:process 14, :type :ok, :f :append, :key \"7\", :value \"x 14 2 y\"}\n{:process 14, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 yx 42 3 yx 19 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 y\"}\n{:process 35, :type :invoke, :f :append, :key \"5\", :value \"x 35 2 y\"}\n{:process 26, :type :ok, :f :append, :key \"9\", :value \"x 26 4 y\"}\n{:process 26, :type :invoke, :f :append, :key \"6\", :value \"x 26 5 y\"}\n{:process 25, :type :ok, :f :append, :key \"4\", :value \"x 25 1 y\"}\n{:process 25, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"2\", :value \"x 6 1 y\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 2 y\"}\n{:process 7, :type :ok, :f :append, :key \"3\", :value \"x 7 0 y\"}\n{:process 7, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"3\", :value \"x 49 2 y\"}\n{:process 49, :type :invoke, :f :append, :key \"2\", :value \"x 49 3 y\"}\n{:process 32, :type :ok, :f :append, :key \"2\", :value \"x 32 2 y\"}\n{:process 32, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 yx 3 3 yx 34 0 yx 17 2 yx 27 0 yx 31 2 yx 31 5 yx 29 1 yx 38 3 yx 25 1 y\"}\n{:process 32, :type :invoke, :f :append, :key \"2\", :value \"x 32 3 y\"}\n{:process 7, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 yx 34 1 yx 4 3 yx 4 5 yx 23 1 yx 31 3 yx 22 0 yx 1 0 yx 26 4 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"6\", :value \"x 26 5 y\"}\n{:process 26, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"6\", :value \"x 17 4 yx 17 5 yx 31 7 yx 11 0 yx 28 0 yx 32 0 yx 35 0 y\"}\n{:process 44, :type :invoke, :f :append, :key \"6\", :value \"x 44 1 y\"}\n{:process 1, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 y\"}\n{:process 1, :type :invoke, :f :append, :key \"0\", :value \"x 1 1 y\"}\n{:process 25, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 yx 35 1 y\"}\n{:process 25, :type :invoke, :f :append, :key \"9\", :value \"x 25 2 y\"}\n{:process 35, :type :ok, :f :append, :key \"5\", :value \"x 35 2 y\"}\n{:process 35, :type :invoke, :f :append, :key \"4\", :value \"x 35 3 y\"}\n{:process 26, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 yx 45 0 yx 47 0 yx 2 1 yx 17 1 yx 31 1 yx 17 3 yx 27 2 yx 26 1 yx 37 0 yx 14 0 yx 25 0 yx 12 0 yx 35 2 y\"}\n{:process 26, :type :invoke, :f :append, :key \"5\", :value \"x 26 6 y\"}\n{:process 25, :type :ok, :f :append, :key \"9\", :value \"x 25 2 y\"}\n{:process 25, :type :invoke, :f :append, :key \"0\", :value \"x 25 3 y\"}\n{:process 35, :type :ok, :f :append, :key \"4\", :value \"x 35 3 y\"}\n{:process 35, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 y\"}\n{:process 35, :type :invoke, :f :append, :key \"4\", :value \"x 35 4 y\"}\n{:process 26, :type :ok, :f :append, :key \"5\", :value \"x 26 6 y\"}\n{:process 26, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"0\", :value \"x 25 3 y\"}\n{:process 25, :type :invoke, :f :append, :key \"8\", :value \"x 25 4 y\"}\n{:process 35, :type :ok, :f :append, :key \"4\", :value \"x 35 4 y\"}\n{:process 35, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"5\", :value \"x 45 11 yx 29 7 yx 45 0 yx 47 0 yx 2 1 yx 17 1 yx 31 1 yx 17 3 yx 27 2 yx 26 1 yx 37 0 yx 14 0 yx 25 0 yx 12 0 yx 35 2 yx 26 6 y\"}\n{:process 35, :type :invoke, :f :append, :key \"6\", :value \"x 35 5 y\"}\n{:process 25, :type :ok, :f :append, :key \"8\", :value \"x 25 4 y\"}\n{:process 25, :type :invoke, :f :append, :key \"3\", :value \"x 25 5 y\"}\n{:process 10, :type :ok, :f :append, :key \"9\", :value \"x 10 0 y\"}\n{:process 10, :type :invoke, :f :append, :key \"6\", :value \"x 10 1 y\"}\n{:process 12, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 yx 42 3 yx 19 1 yx 19 3 y\"}\n{:process 12, :type :invoke, :f :append, :key \"9\", :value \"x 12 1 y\"}\n{:process 14, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 yx 13 0 yx 15 0 yx 42 2 yx 44 0 yx 26 2 yx 19 0 yx 49 0 yx 7 0 yx 49 2 y\"}\n{:process 14, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"3\", :value \"x 25 5 y\"}\n{:process 25, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"6\", :value \"x 10 1 y\"}\n{:process 10, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"6\", :value \"x 35 5 y\"}\n{:process 35, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 yx 3 3 yx 34 0 yx 17 2 yx 27 0 yx 31 2 yx 31 5 yx 29 1 yx 38 3 yx 25 1 yx 35 3 yx 35 4 y\"}\n{:process 25, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 yx 35 1 yx 25 3 y\"}\n{:process 25, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 y\"}\n{:process 35, :type :invoke, :f :put, :key \"5\", :value \"x 35 6 y\"}\n{:process 25, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 yx 35 1 yx 25 3 y\"}\n{:process 25, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"4\", :value \"x 31 14 yx 24 15 yx 36 15 yx 45 13 yx 10 23 yx 19 5 yx 25 10 yx 16 14 yx 3 3 yx 34 0 yx 17 2 yx 27 0 yx 31 2 yx 31 5 yx 29 1 yx 38 3 yx 25 1 yx 35 3 yx 35 4 y\"}\n{:process 25, :type :invoke, :f :append, :key \"0\", :value \"x 25 6 y\"}\n{:process 35, :type :ok, :f :put, :key \"5\", :value \"x 35 6 y\"}\n{:process 35, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"8\", :value \"x 4 6 yx 30 2 yx 31 4 yx 29 0 yx 30 4 yx 32 1 yx 49 1 yx 25 4 y\"}\n{:process 35, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 yx 34 1 yx 4 3 yx 4 5 yx 23 1 yx 31 3 yx 22 0 yx 1 0 yx 26 4 yx 25 2 yx 10 0 y\"}\n{:process 26, :type :invoke, :f :append, :key \"0\", :value \"x 26 7 y\"}\n{:process 24, :type :ok, :f :put, :key \"4\", :value \"x 24 0 y\"}\n{:process 24, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"8\", :value \"x 4 6 yx 30 2 yx 31 4 yx 29 0 yx 30 4 yx 32 1 yx 49 1 yx 25 4 y\"}\n{:process 35, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"0\", :value \"x 25 6 y\"}\n{:process 25, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"5\", :value \"x 35 6 y\"}\n{:process 35, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 y\"}\n{:process 35, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 y\"}\n{:process 25, :type :invoke, :f :append, :key \"4\", :value \"x 25 7 y\"}\n{:process 10, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 y\"}\n{:process 10, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 yx 42 3 yx 19 1 yx 19 3 y\"}\n{:process 14, :type :invoke, :f :append, :key \"4\", :value \"x 14 3 y\"}\n{:process 35, :type :ok, :f :get, :key \"8\", :value \"x 4 6 yx 30 2 yx 31 4 yx 29 0 yx 30 4 yx 32 1 yx 49 1 yx 25 4 y\"}\n{:process 35, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"6\", :value \"x 17 4 yx 17 5 yx 31 7 yx 11 0 yx 28 0 yx 32 0 yx 35 0 yx 26 5 yx 10 1 yx 35 5 y\"}\n{:process 10, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 yx 35 1 yx 25 3 yx 25 6 y\"}\n{:process 7, :type :invoke, :f :append, :key \"6\", :value \"x 7 1 y\"}\n{:process 25, :type :ok, :f :append, :key \"4\", :value \"x 25 7 y\"}\n{:process 25, :type :invoke, :f :append, :key \"3\", :value \"x 25 8 y\"}\n{:process 10, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 yx 35 1 yx 25 3 yx 25 6 y\"}\n{:process 10, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"4\", :value \"x 24 0 yx 25 7 y\"}\n{:process 35, :type :invoke, :f :append, :key \"6\", :value \"x 35 7 y\"}\n{:process 24, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 yx 35 1 yx 25 3 yx 25 6 y\"}\n{:process 24, :type :invoke, :f :append, :key \"9\", :value \"x 24 1 y\"}\n{:process 10, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 yx 13 0 yx 15 0 yx 42 2 yx 44 0 yx 26 2 yx 19 0 yx 49 0 yx 7 0 yx 49 2 yx 25 5 y\"}\n{:process 10, :type :invoke, :f :append, :key \"1\", :value \"x 10 2 y\"}\n{:process 32, :type :ok, :f :append, :key \"2\", :value \"x 32 3 y\"}\n{:process 32, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 y\"}\n{:process 32, :type :invoke, :f :append, :key \"5\", :value \"x 32 4 y\"}\n{:process 7, :type :ok, :f :append, :key \"6\", :value \"x 7 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"3\", :value \"x 7 2 y\"}\n{:process 7, :type :ok, :f :append, :key \"3\", :value \"x 7 2 y\"}\n{:process 7, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"6\", :value \"x 17 4 yx 17 5 yx 31 7 yx 11 0 yx 28 0 yx 32 0 yx 35 0 yx 26 5 yx 10 1 yx 35 5 yx 7 1 yx 44 1 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 31 9 yx 42 1 yx 36 0 yx 26 0 yx 35 1 yx 25 3 yx 25 6 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 3 y\"}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 3 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 3 y\"}\n{:process 6, :type :invoke, :f :append, :key \"7\", :value \"x 6 4 y\"}\n{:process 6, :type :ok, :f :append, :key \"7\", :value \"x 6 4 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 42, :type :ok, :f :put, :key \"0\", :value \"x 42 4 y\"}\n{:process 42, :type :invoke, :f :put, :key \"6\", :value \"x 42 5 y\"}\n{:process 14, :type :ok, :f :append, :key \"4\", :value \"x 14 3 y\"}\n{:process 14, :type :invoke, :f :append, :key \"5\", :value \"x 14 4 y\"}\n{:process 14, :type :ok, :f :append, :key \"5\", :value \"x 14 4 y\"}\n{:process 14, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"6\", :value \"x 42 5 y\"}\n{:process 14, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"2\", :value \"x 49 3 y\"}\n{:process 49, :type :invoke, :f :append, :key \"4\", :value \"x 49 4 y\"}\n{:process 8, :type :ok, :f :append, :key \"8\", :value \"x 8 2 y\"}\n{:process 8, :type :invoke, :f :append, :key \"8\", :value \"x 8 3 y\"}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 yx 34 1 yx 4 3 yx 4 5 yx 23 1 yx 31 3 yx 22 0 yx 1 0 yx 26 4 yx 25 2 yx 10 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"4\", :value \"x 49 4 y\"}\n{:process 49, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"4\", :value \"x 24 0 yx 25 7 yx 7 3 yx 14 3 yx 49 4 y\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 5 y\"}\n{:process 20, :type :ok, :f :append, :key \"7\", :value \"x 20 0 y\"}\n{:process 20, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 20, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 yx 34 1 yx 4 3 yx 4 5 yx 23 1 yx 31 3 yx 22 0 yx 1 0 yx 26 4 yx 25 2 yx 10 0 y\"}\n{:process 20, :type :invoke, :f :append, :key \"9\", :value \"x 20 1 y\"}\n{:process 14, :type :ok, :f :get, :key \"1\", :value \"x 36 14 yx 8 18 yx 39 19 yx 28 24 yx 0 20 yx 22 13 yx 31 17 yx 42 3 yx 19 1 yx 19 3 yx 22 1 y\"}\n{:process 14, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"9\", :value \"x 20 1 y\"}\n{:process 20, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 20, :type :ok, :f :get, :key \"6\", :value \"x 42 5 y\"}\n{:process 20, :type :invoke, :f :append, :key \"8\", :value \"x 20 2 y\"}\n{:process 14, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 yx 13 0 yx 15 0 yx 42 2 yx 44 0 yx 26 2 yx 19 0 yx 49 0 yx 7 0 yx 49 2 yx 25 5 yx 7 2 y\"}\n{:process 14, :type :invoke, :f :append, :key \"0\", :value \"x 14 5 y\"}\n{:process 26, :type :ok, :f :append, :key \"0\", :value \"x 26 7 y\"}\n{:process 26, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 4 y\"}\n{:process 45, :type :invoke, :f :put, :key \"3\", :value \"x 45 5 y\"}\n{:process 49, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 yx 34 1 yx 4 3 yx 4 5 yx 23 1 yx 31 3 yx 22 0 yx 1 0 yx 26 4 yx 25 2 yx 10 0 y\"}\n{:process 49, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"8\", :value \"x 20 2 y\"}\n{:process 20, :type :invoke, :f :append, :key \"4\", :value \"x 20 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"5\", :value \"x 47 0 y\"}\n{:process 47, :type :invoke, :f :append, :key \"1\", :value \"x 47 1 y\"}\n{:process 26, :type :ok, :f :get, :key \"5\", :value \"x 35 6 yx 6 3 yx 14 4 y\"}\n{:process 26, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"1\", :value \"x 10 2 y\"}\n{:process 10, :type :invoke, :f :put, :key \"0\", :value \"x 10 3 y\"}\n{:process 49, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 y\"}\n{:process 49, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"3\", :value \"x 40 0 y\"}\n{:process 40, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"3\", :value \"x 6 21 yx 11 20 yx 26 14 yx 40 0 yx 5 0 yx 3 2 yx 4 0 yx 4 1 yx 8 0 yx 23 2 yx 13 0 yx 15 0 yx 42 2 yx 44 0 yx 26 2 yx 19 0 yx 49 0 yx 7 0 yx 49 2 yx 25 5 y\"}\n{:process 49, :type :invoke, :f :append, :key \"0\", :value \"x 49 5 y\"}\n{:process 45, :type :ok, :f :put, :key \"3\", :value \"x 45 5 y\"}\n{:process 45, :type :invoke, :f :append, :key \"3\", :value \"x 45 6 y\"}\n{:process 10, :type :ok, :f :put, :key \"0\", :value \"x 10 3 y\"}\n{:process 10, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"1\", :value \"x 47 1 y\"}\n{:process 47, :type :invoke, :f :put, :key \"1\", :value \"x 47 2 y\"}\n{:process 26, :type :ok, :f :get, :key \"4\", :value \"x 24 0 yx 25 7 yx 7 3 yx 14 3 yx 49 4 y\"}\n{:process 26, :type :invoke, :f :append, :key \"6\", :value \"x 26 8 y\"}\n{:process 10, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 y\"}\n{:process 10, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 40, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 y\"}\n{:process 40, :type :invoke, :f :append, :key \"2\", :value \"x 40 1 y\"}\n{:process 43, :type :ok, :f :append, :key \"7\", :value \"x 43 0 y\"}\n{:process 43, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"3\", :value \"x 45 6 y\"}\n{:process 45, :type :invoke, :f :append, :key \"0\", :value \"x 45 7 y\"}\n{:process 43, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 yx 6 4 yx 20 0 yx 45 4 y\"}\n{:process 43, :type :invoke, :f :append, :key \"3\", :value \"x 43 1 y\"}\n{:process 47, :type :ok, :f :put, :key \"1\", :value \"x 47 2 y\"}\n{:process 47, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"0\", :value \"x 10 3 y\"}\n{:process 47, :type :invoke, :f :append, :key \"8\", :value \"x 47 3 y\"}\n{:process 26, :type :ok, :f :append, :key \"6\", :value \"x 26 8 y\"}\n{:process 26, :type :invoke, :f :append, :key \"7\", :value \"x 26 9 y\"}\n{:process 45, :type :ok, :f :append, :key \"0\", :value \"x 45 7 y\"}\n{:process 45, :type :invoke, :f :append, :key \"9\", :value \"x 45 8 y\"}\n{:process 47, :type :ok, :f :append, :key \"8\", :value \"x 47 3 y\"}\n{:process 47, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 43, :type :ok, :f :append, :key \"3\", :value \"x 43 1 y\"}\n{:process 43, :type :invoke, :f :append, :key \"1\", :value \"x 43 2 y\"}\n{:process 26, :type :ok, :f :append, :key \"7\", :value \"x 26 9 y\"}\n{:process 26, :type :invoke, :f :append, :key \"9\", :value \"x 26 10 y\"}\n{:process 47, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 y\"}\n{:process 47, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"9\", :value \"x 45 8 y\"}\n{:process 45, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 yx 6 4 yx 20 0 yx 45 4 yx 26 9 y\"}\n{:process 47, :type :invoke, :f :append, :key \"4\", :value \"x 47 4 y\"}\n{:process 43, :type :ok, :f :append, :key \"1\", :value \"x 43 2 y\"}\n{:process 43, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 yx 6 4 yx 20 0 yx 45 4 yx 26 9 y\"}\n{:process 43, :type :invoke, :f :append, :key \"8\", :value \"x 43 3 y\"}\n{:process 26, :type :ok, :f :append, :key \"9\", :value \"x 26 10 y\"}\n{:process 26, :type :invoke, :f :append, :key \"6\", :value \"x 26 11 y\"}\n{:process 43, :type :ok, :f :append, :key \"8\", :value \"x 43 3 y\"}\n{:process 43, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 y\"}\n{:process 43, :type :invoke, :f :put, :key \"5\", :value \"x 43 4 y\"}\n{:process 47, :type :ok, :f :append, :key \"4\", :value \"x 47 4 y\"}\n{:process 47, :type :invoke, :f :append, :key \"5\", :value \"x 47 5 y\"}\n{:process 10, :type :ok, :f :get, :key \"8\", :value \"x 4 6 yx 30 2 yx 31 4 yx 29 0 yx 30 4 yx 32 1 yx 49 1 yx 25 4 y\"}\n{:process 10, :type :invoke, :f :append, :key \"8\", :value \"x 10 4 y\"}\n{:process 26, :type :ok, :f :append, :key \"6\", :value \"x 26 11 y\"}\n{:process 26, :type :invoke, :f :append, :key \"1\", :value \"x 26 12 y\"}\n{:process 43, :type :ok, :f :put, :key \"5\", :value \"x 43 4 y\"}\n{:process 43, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"5\", :value \"x 21 0 y\"}\n{:process 21, :type :invoke, :f :append, :key \"4\", :value \"x 21 1 y\"}\n{:process 25, :type :ok, :f :append, :key \"3\", :value \"x 25 8 y\"}\n{:process 25, :type :invoke, :f :append, :key \"5\", :value \"x 25 9 y\"}\n{:process 47, :type :ok, :f :append, :key \"5\", :value \"x 47 5 y\"}\n{:process 47, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"8\", :value \"x 4 6 yx 30 2 yx 31 4 yx 29 0 yx 30 4 yx 32 1 yx 49 1 yx 25 4 yx 8 2 yx 20 2 yx 47 3 yx 43 3 y\"}\n{:process 43, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"1\", :value \"x 26 12 y\"}\n{:process 26, :type :invoke, :f :append, :key \"5\", :value \"x 26 13 y\"}\n{:process 47, :type :ok, :f :get, :key \"4\", :value \"x 24 0 yx 25 7 yx 7 3 yx 14 3 yx 49 4 yx 47 4 y\"}\n{:process 47, :type :invoke, :f :put, :key \"9\", :value \"x 47 6 y\"}\n{:process 21, :type :ok, :f :append, :key \"4\", :value \"x 21 1 y\"}\n{:process 21, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"5\", :value \"x 26 13 y\"}\n{:process 26, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"9\", :value \"x 10 15 yx 8 12 yx 49 19 yx 49 20 yx 28 8 yx 3 12 yx 28 10 yx 36 5 yx 36 6 yx 45 4 yx 22 9 yx 13 12 yx 0 16 yx 7 5 yx 15 15 yx 33 3 yx 18 13 yx 40 2 yx 43 8 yx 28 21 yx 21 9 yx 41 7 yx 42 13 yx 45 9 yx 48 7 yx 21 11 yx 35 7 yx 23 10 yx 31 12 yx 8 17 yx 31 15 yx 24 12 yx 24 16 yx 14 6 yx 9 2 yx 32 7 yx 23 11 yx 20 9 yx 3 1 yx 34 1 yx 4 3 yx 4 5 yx 23 1 yx 31 3 yx 22 0 yx 1 0 yx 26 4 yx 25 2 yx 10 0 yx 20 1 yx 45 8 yx 26 10 y\"}\n{:process 26, :type :invoke, :f :append, :key \"8\", :value \"x 26 14 y\"}\n{:process 21, :type :ok, :f :get, :key \"8\", :value \"x 4 6 yx 30 2 yx 31 4 yx 29 0 yx 30 4 yx 32 1 yx 49 1 yx 25 4 yx 8 2 yx 20 2 yx 47 3 yx 43 3 y\"}\n{:process 21, :type :invoke, :f :append, :key \"3\", :value \"x 21 2 y\"}\n{:process 47, :type :ok, :f :put, :key \"9\", :value \"x 47 6 y\"}\n{:process 47, :type :invoke, :f :append, :key \"1\", :value \"x 47 7 y\"}\n{:process 21, :type :ok, :f :append, :key \"3\", :value \"x 21 2 y\"}\n{:process 21, :type :invoke, :f :append, :key \"0\", :value \"x 21 3 y\"}\n{:process 26, :type :ok, :f :append, :key \"8\", :value \"x 26 14 y\"}\n{:process 26, :type :invoke, :f :append, :key \"4\", :value \"x 26 15 y\"}\n{:process 47, :type :ok, :f :append, :key \"1\", :value \"x 47 7 y\"}\n{:process 47, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"4\", :value \"x 26 15 y\"}\n{:process 26, :type :invoke, :f :append, :key \"6\", :value \"x 26 16 y\"}\n{:process 43, :type :ok, :f :get, :key \"5\", :value \"x 35 6 y\"}\n{:process 43, :type :invoke, :f :append, :key \"2\", :value \"x 43 5 y\"}\n{:process 26, :type :ok, :f :append, :key \"6\", :value \"x 26 16 y\"}\n{:process 26, :type :invoke, :f :append, :key \"2\", :value \"x 26 17 y\"}\n{:process 39, :type :ok, :f :append, :key \"7\", :value \"x 39 1 y\"}\n{:process 39, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"1\", :value \"x 47 2 yx 43 2 yx 26 12 yx 47 7 y\"}\n{:process 47, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 y\"}\n{:process 39, :type :invoke, :f :append, :key \"7\", :value \"x 39 2 y\"}\n{:process 47, :type :ok, :f :get, :key \"1\", :value \"x 47 2 yx 43 2 yx 26 12 yx 47 7 y\"}\n{:process 47, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 y\"}\n{:process 47, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"9\", :value \"x 47 6 y\"}\n{:process 47, :type :invoke, :f :append, :key \"6\", :value \"x 47 8 y\"}\n{:process 45, :type :ok, :f :get, :key \"1\", :value \"x 47 2 yx 43 2 yx 26 12 yx 47 7 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 9 y\"}\n{:process 22, :type :ok, :f :append, :key \"1\", :value \"x 22 1 y\"}\n{:process 22, :type :invoke, :f :append, :key \"7\", :value \"x 22 2 y\"}\n{:process 44, :type :ok, :f :append, :key \"6\", :value \"x 44 1 y\"}\n{:process 44, :type :invoke, :f :append, :key \"5\", :value \"x 44 2 y\"}\n{:process 22, :type :ok, :f :append, :key \"7\", :value \"x 22 2 y\"}\n{:process 22, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 y\"}\n{:process 22, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 0 y\"}\n{:process 36, :type :invoke, :f :append, :key \"1\", :value \"x 36 1 y\"}\n{:process 36, :type :ok, :f :append, :key \"1\", :value \"x 36 1 y\"}\n{:process 36, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 44, :type :ok, :f :append, :key \"5\", :value \"x 44 2 y\"}\n{:process 44, :type :invoke, :f :append, :key \"9\", :value \"x 44 3 y\"}\n{:process 36, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 y\"}\n{:process 36, :type :invoke, :f :append, :key \"6\", :value \"x 36 2 y\"}\n{:process 44, :type :ok, :f :append, :key \"9\", :value \"x 44 3 y\"}\n{:process 44, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"6\", :value \"x 36 2 y\"}\n{:process 36, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 y\"}\n{:process 36, :type :invoke, :f :append, :key \"6\", :value \"x 36 3 y\"}\n{:process 22, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 y\"}\n{:process 22, :type :invoke, :f :append, :key \"4\", :value \"x 22 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"6\", :value \"x 47 8 y\"}\n{:process 47, :type :invoke, :f :append, :key \"2\", :value \"x 47 9 y\"}\n{:process 36, :type :ok, :f :append, :key \"6\", :value \"x 36 3 y\"}\n{:process 36, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 y\"}\n{:process 36, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 y\"}\n{:process 36, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 32, :type :ok, :f :append, :key \"5\", :value \"x 32 4 y\"}\n{:process 32, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"2\", :value \"x 47 9 y\"}\n{:process 47, :type :invoke, :f :append, :key \"3\", :value \"x 47 10 y\"}\n{:process 44, :type :ok, :f :get, :key \"1\", :value \"x 47 2 yx 43 2 yx 26 12 yx 47 7 y\"}\n{:process 44, :type :invoke, :f :append, :key \"9\", :value \"x 44 4 y\"}\n{:process 47, :type :ok, :f :append, :key \"3\", :value \"x 47 10 y\"}\n{:process 47, :type :invoke, :f :append, :key \"7\", :value \"x 47 11 y\"}\n{:process 32, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 y\"}\n{:process 32, :type :invoke, :f :append, :key \"0\", :value \"x 32 5 y\"}\n{:process 29, :type :ok, :f :append, :key \"5\", :value \"x 29 2 y\"}\n{:process 29, :type :invoke, :f :append, :key \"1\", :value \"x 29 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"7\", :value \"x 47 11 y\"}\n{:process 47, :type :invoke, :f :append, :key \"4\", :value \"x 47 12 y\"}\n{:process 49, :type :ok, :f :append, :key \"0\", :value \"x 49 5 y\"}\n{:process 49, :type :invoke, :f :append, :key \"2\", :value \"x 49 6 y\"}\n{:process 47, :type :ok, :f :append, :key \"4\", :value \"x 47 12 y\"}\n{:process 47, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"2\", :value \"x 49 6 y\"}\n{:process 49, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"1\", :value \"x 47 2 yx 43 2 yx 26 12 yx 47 7 yx 36 1 y\"}\n{:process 49, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 y\"}\n{:process 47, :type :invoke, :f :append, :key \"2\", :value \"x 47 13 y\"}\n{:process 36, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 y\"}\n{:process 36, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 y\"}\n{:process 36, :type :invoke, :f :append, :key \"1\", :value \"x 36 4 y\"}\n{:process 47, :type :ok, :f :append, :key \"2\", :value \"x 47 13 y\"}\n{:process 47, :type :invoke, :f :append, :key \"4\", :value \"x 47 14 y\"}\n{:process 47, :type :ok, :f :append, :key \"4\", :value \"x 47 14 y\"}\n{:process 47, :type :invoke, :f :append, :key \"8\", :value \"x 47 15 y\"}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 3 y\"}\n{:process 7, :type :invoke, :f :append, :key \"8\", :value \"x 7 4 y\"}\n{:process 47, :type :ok, :f :append, :key \"8\", :value \"x 47 15 y\"}\n{:process 47, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"8\", :value \"x 7 4 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 y\"}\n{:process 47, :type :invoke, :f :append, :key \"8\", :value \"x 47 16 y\"}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 y\"}\n{:process 7, :type :invoke, :f :append, :key \"2\", :value \"x 7 5 y\"}\n{:process 7, :type :ok, :f :append, :key \"2\", :value \"x 7 5 y\"}\n{:process 7, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"8\", :value \"x 47 16 y\"}\n{:process 47, :type :invoke, :f :append, :key \"7\", :value \"x 47 17 y\"}\n{:process 7, :type :ok, :f :get, :key \"7\", :value \"x 38 1 yx 38 2 yx 43 0 yx 14 2 yx 6 4 yx 20 0 yx 45 4 yx 26 9 yx 39 1 yx 22 2 yx 47 11 y\"}\n{:process 7, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"0\", :value \"x 14 5 y\"}\n{:process 14, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"3\", :value \"x 15 0 y\"}\n{:process 15, :type :invoke, :f :append, :key \"4\", :value \"x 15 1 y\"}\n{:process 47, :type :ok, :f :append, :key \"7\", :value \"x 47 17 y\"}\n{:process 47, :type :invoke, :f :append, :key \"1\", :value \"x 47 18 y\"}\n{:process 14, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 y\"}\n{:process 14, :type :invoke, :f :append, :key \"9\", :value \"x 14 6 y\"}\n{:process 15, :type :ok, :f :append, :key \"4\", :value \"x 15 1 y\"}\n{:process 15, :type :invoke, :f :append, :key \"5\", :value \"x 15 2 y\"}\n{:process 14, :type :ok, :f :append, :key \"9\", :value \"x 14 6 y\"}\n{:process 14, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"5\", :value \"x 34 2 y\"}\n{:process 34, :type :invoke, :f :put, :key \"8\", :value \"x 34 3 y\"}\n{:process 35, :type :ok, :f :append, :key \"6\", :value \"x 35 7 y\"}\n{:process 35, :type :invoke, :f :put, :key \"7\", :value \"x 35 8 y\"}\n{:process 49, :type :ok, :f :get, :key \"4\", :value \"x 24 0 yx 25 7 yx 7 3 yx 14 3 yx 49 4 yx 47 4 yx 21 1 yx 26 15 yx 47 12 yx 47 14 yx 15 1 y\"}\n{:process 49, :type :invoke, :f :put, :key \"1\", :value \"x 49 7 y\"}\n{:process 15, :type :ok, :f :append, :key \"5\", :value \"x 15 2 y\"}\n{:process 15, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"7\", :value \"x 39 2 y\"}\n{:process 39, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 y\"}\n{:process 15, :type :invoke, :f :append, :key \"6\", :value \"x 15 3 y\"}\n{:process 39, :type :ok, :f :get, :key \"1\", :value \"x 47 2 yx 43 2 yx 26 12 yx 47 7 yx 36 1 y\"}\n{:process 39, :type :invoke, :f :append, :key \"2\", :value \"x 39 3 y\"}\n{:process 13, :type :ok, :f :append, :key \"6\", :value \"x 13 1 y\"}\n{:process 13, :type :invoke, :f :append, :key \"1\", :value \"x 13 2 y\"}\n{:process 7, :type :ok, :f :get, :key \"9\", :value \"x 47 6 y\"}\n{:process 7, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"1\", :value \"x 47 2 yx 43 2 yx 26 12 yx 47 7 y\"}\n{:process 14, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 y\"}\n{:process 14, :type :invoke, :f :append, :key \"6\", :value \"x 14 7 y\"}\n{:process 7, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 y\"}\n{:process 7, :type :invoke, :f :append, :key \"8\", :value \"x 7 6 y\"}\n{:process 35, :type :ok, :f :put, :key \"7\", :value \"x 35 8 y\"}\n{:process 35, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"8\", :value \"x 34 3 yx 33 0 yx 11 1 yx 41 0 y\"}\n{:process 35, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"8\", :value \"x 8 3 y\"}\n{:process 8, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"4\", :value \"x 38 3 y\"}\n{:process 38, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 49 7 yx 47 18 yx 36 4 y\"}\n{:process 8, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"2\", :value \"x 3 5 y\"}\n{:process 3, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 6 y\"}\n{:process 8, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 y\"}\n{:process 8, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 y\"}\n{:process 8, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"4\", :value \"x 16 0 yx 48 0 yx 0 0 yx 22 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"8\", :value \"x 8 4 y\"}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 6 y\"}\n{:process 3, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"4\", :value \"x 16 0 yx 48 0 yx 0 0 yx 22 3 y\"}\n{:process 3, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 31, :type :ok, :f :put, :key \"0\", :value \"x 31 9 y\"}\n{:process 31, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"8\", :value \"x 8 4 y\"}\n{:process 8, :type :invoke, :f :append, :key \"8\", :value \"x 8 5 y\"}\n{:process 31, :type :ok, :f :get, :key \"8\", :value \"x 34 3 yx 33 0 yx 11 1 yx 41 0 yx 8 3 yx 8 4 y\"}\n{:process 31, :type :invoke, :f :append, :key \"5\", :value \"x 31 10 y\"}\n{:process 26, :type :ok, :f :append, :key \"2\", :value \"x 26 17 y\"}\n{:process 26, :type :invoke, :f :append, :key \"4\", :value \"x 26 18 y\"}\n{:process 3, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 yx 47 10 yx 9 3 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 7 y\"}\n{:process 43, :type :ok, :f :append, :key \"2\", :value \"x 43 5 y\"}\n{:process 43, :type :invoke, :f :append, :key \"3\", :value \"x 43 6 y\"}\n{:process 8, :type :ok, :f :append, :key \"8\", :value \"x 8 5 y\"}\n{:process 8, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"5\", :value \"x 31 10 y\"}\n{:process 31, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 43, :type :ok, :f :append, :key \"3\", :value \"x 43 6 y\"}\n{:process 43, :type :invoke, :f :append, :key \"1\", :value \"x 43 7 y\"}\n{:process 8, :type :ok, :f :get, :key \"8\", :value \"x 34 3 yx 33 0 yx 11 1 yx 41 0 yx 8 3 yx 8 4 yx 8 5 y\"}\n{:process 8, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"7\", :value \"x 35 8 yx 18 1 yx 45 9 y\"}\n{:process 8, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 y\"}\n{:process 31, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 y\"}\n{:process 31, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"4\", :value \"x 16 0 yx 48 0 yx 0 0 yx 22 3 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 11 y\"}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 7 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 8 y\"}\n{:process 43, :type :ok, :f :append, :key \"1\", :value \"x 43 7 y\"}\n{:process 43, :type :invoke, :f :append, :key \"5\", :value \"x 43 8 y\"}\n{:process 35, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 y\"}\n{:process 35, :type :invoke, :f :append, :key \"1\", :value \"x 35 9 y\"}\n{:process 38, :type :ok, :f :get, :key \"4\", :value \"x 24 0 yx 25 7 yx 7 3 yx 14 3 yx 49 4 yx 47 4 yx 21 1 yx 26 15 yx 47 12 yx 47 14 yx 15 1 y\"}\n{:process 38, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 8 y\"}\n{:process 3, :type :invoke, :f :append, :key \"0\", :value \"x 3 9 y\"}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 yx 47 10 yx 9 3 yx 43 6 yx 3 8 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"1\", :value \"x 47 2 yx 43 2 yx 26 12 yx 47 7 yx 36 1 y\"}\n{:process 38, :type :invoke, :f :append, :key \"0\", :value \"x 38 4 y\"}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 11 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 12 y\"}\n{:process 27, :type :ok, :f :append, :key \"9\", :value \"x 27 3 y\"}\n{:process 27, :type :invoke, :f :append, :key \"8\", :value \"x 27 4 y\"}\n{:process 9, :type :ok, :f :append, :key \"3\", :value \"x 9 3 y\"}\n{:process 9, :type :invoke, :f :append, :key \"6\", :value \"x 9 4 y\"}\n{:process 43, :type :ok, :f :append, :key \"5\", :value \"x 43 8 y\"}\n{:process 43, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"0\", :value \"x 3 9 y\"}\n{:process 3, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 12 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 13 y\"}\n{:process 3, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 y\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 10 y\"}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 13 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 14 y\"}\n{:process 9, :type :ok, :f :append, :key \"6\", :value \"x 9 4 y\"}\n{:process 9, :type :invoke, :f :append, :key \"9\", :value \"x 9 5 y\"}\n{:process 28, :type :ok, :f :append, :key \"0\", :value \"x 28 1 y\"}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 14 y\"}\n{:process 28, :type :invoke, :f :append, :key \"4\", :value \"x 28 2 y\"}\n{:process 31, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 yx 32 5 yx 49 5 yx 14 5 yx 21 3 yx 28 1 yx 1 1 yx 3 9 y\"}\n{:process 31, :type :invoke, :f :append, :key \"3\", :value \"x 31 15 y\"}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 yx 32 5 yx 49 5 yx 14 5 yx 21 3 yx 28 1 yx 1 1 yx 3 9 y\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 6 y\"}\n{:process 9, :type :ok, :f :append, :key \"9\", :value \"x 9 5 y\"}\n{:process 9, :type :invoke, :f :append, :key \"1\", :value \"x 9 6 y\"}\n{:process 31, :type :ok, :f :append, :key \"3\", :value \"x 31 15 y\"}\n{:process 31, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"8\", :value \"x 7 6 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 7 y\"}\n{:process 43, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 y\"}\n{:process 43, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"2\", :value \"x 40 1 y\"}\n{:process 40, :type :invoke, :f :append, :key \"0\", :value \"x 40 2 y\"}\n{:process 43, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 y\"}\n{:process 43, :type :invoke, :f :append, :key \"1\", :value \"x 43 9 y\"}\n{:process 33, :type :ok, :f :append, :key \"8\", :value \"x 33 0 y\"}\n{:process 33, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"1\", :value \"x 9 6 y\"}\n{:process 9, :type :invoke, :f :put, :key \"4\", :value \"x 9 7 y\"}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 7 y\"}\n{:process 7, :type :invoke, :f :append, :key \"7\", :value \"x 7 8 y\"}\n{:process 33, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 y\"}\n{:process 33, :type :invoke, :f :append, :key \"0\", :value \"x 33 1 y\"}\n{:process 40, :type :ok, :f :append, :key \"0\", :value \"x 40 2 y\"}\n{:process 40, :type :invoke, :f :append, :key \"9\", :value \"x 40 3 y\"}\n{:process 37, :type :ok, :f :append, :key \"6\", :value \"x 37 1 y\"}\n{:process 37, :type :invoke, :f :append, :key \"1\", :value \"x 37 2 y\"}\n{:process 33, :type :ok, :f :append, :key \"0\", :value \"x 33 1 y\"}\n{:process 33, :type :invoke, :f :append, :key \"8\", :value \"x 33 2 y\"}\n{:process 7, :type :ok, :f :append, :key \"7\", :value \"x 7 8 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 9 y\"}\n{:process 46, :type :ok, :f :put, :key \"0\", :value \"x 46 1 y\"}\n{:process 46, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 yx 32 5 yx 49 5 yx 14 5 yx 21 3 yx 28 1 yx 1 1 yx 3 9 yx 40 2 yx 33 1 y\"}\n{:process 46, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 37, :type :ok, :f :append, :key \"1\", :value \"x 37 2 y\"}\n{:process 37, :type :invoke, :f :append, :key \"3\", :value \"x 37 3 y\"}\n{:process 46, :type :ok, :f :get, :key \"4\", :value \"x 9 7 y\"}\n{:process 46, :type :invoke, :f :append, :key \"8\", :value \"x 46 2 y\"}\n{:process 33, :type :ok, :f :append, :key \"8\", :value \"x 33 2 y\"}\n{:process 33, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"1\", :value \"x 19 3 y\"}\n{:process 19, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 yx 47 10 yx 9 3 yx 43 6 yx 3 8 yx 31 15 y\"}\n{:process 33, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 9 y\"}\n{:process 7, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"8\", :value \"x 46 2 y\"}\n{:process 46, :type :invoke, :f :append, :key \"1\", :value \"x 46 3 y\"}\n{:process 7, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 yx 47 10 yx 9 3 yx 43 6 yx 3 8 yx 31 15 y\"}\n{:process 7, :type :invoke, :f :append, :key \"2\", :value \"x 7 10 y\"}\n{:process 19, :type :ok, :f :get, :key \"1\", :value \"x 49 7 yx 47 18 yx 36 4 yx 43 7 yx 3 10 yx 9 6 yx 37 2 y\"}\n{:process 19, :type :invoke, :f :append, :key \"4\", :value \"x 19 4 y\"}\n{:process 23, :type :ok, :f :append, :key \"1\", :value \"x 23 4 y\"}\n{:process 23, :type :invoke, :f :append, :key \"3\", :value \"x 23 5 y\"}\n{:process 37, :type :ok, :f :append, :key \"3\", :value \"x 37 3 y\"}\n{:process 37, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"8\", :value \"x 11 1 y\"}\n{:process 11, :type :invoke, :f :append, :key \"7\", :value \"x 11 2 y\"}\n{:process 16, :type :ok, :f :put, :key \"4\", :value \"x 16 0 y\"}\n{:process 16, :type :invoke, :f :append, :key \"2\", :value \"x 16 1 y\"}\n{:process 33, :type :ok, :f :get, :key \"8\", :value \"x 34 3 yx 33 0 yx 11 1 yx 41 0 yx 8 3 yx 8 4 yx 8 5 yx 27 4 yx 7 6 yx 33 2 yx 46 2 y\"}\n{:process 33, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 y\"}\n{:process 37, :type :invoke, :f :append, :key \"7\", :value \"x 37 4 y\"}\n{:process 7, :type :ok, :f :append, :key \"2\", :value \"x 7 10 y\"}\n{:process 7, :type :invoke, :f :append, :key \"9\", :value \"x 7 11 y\"}\n{:process 16, :type :ok, :f :append, :key \"2\", :value \"x 16 1 y\"}\n{:process 16, :type :invoke, :f :append, :key \"7\", :value \"x 16 2 y\"}\n{:process 11, :type :ok, :f :append, :key \"7\", :value \"x 11 2 y\"}\n{:process 11, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"1\", :value \"x 46 3 y\"}\n{:process 46, :type :invoke, :f :append, :key \"4\", :value \"x 46 4 y\"}\n{:process 11, :type :ok, :f :get, :key \"1\", :value \"x 49 7 yx 47 18 yx 36 4 yx 43 7 yx 3 10 yx 9 6 yx 37 2 yx 46 3 y\"}\n{:process 11, :type :invoke, :f :append, :key \"1\", :value \"x 11 3 y\"}\n{:process 33, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 yx 32 5 yx 49 5 yx 14 5 yx 21 3 yx 28 1 yx 1 1 yx 3 9 yx 40 2 yx 33 1 y\"}\n{:process 33, :type :invoke, :f :append, :key \"6\", :value \"x 33 3 y\"}\n{:process 19, :type :ok, :f :append, :key \"4\", :value \"x 19 4 y\"}\n{:process 19, :type :invoke, :f :append, :key \"9\", :value \"x 19 5 y\"}\n{:process 11, :type :ok, :f :append, :key \"1\", :value \"x 11 3 y\"}\n{:process 11, :type :invoke, :f :append, :key \"9\", :value \"x 11 4 y\"}\n{:process 16, :type :ok, :f :append, :key \"7\", :value \"x 16 2 y\"}\n{:process 7, :type :ok, :f :append, :key \"9\", :value \"x 7 11 y\"}\n{:process 16, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :invoke, :f :append, :key \"2\", :value \"x 7 12 y\"}\n{:process 46, :type :ok, :f :append, :key \"4\", :value \"x 46 4 y\"}\n{:process 46, :type :invoke, :f :append, :key \"9\", :value \"x 46 5 y\"}\n{:process 19, :type :ok, :f :append, :key \"9\", :value \"x 19 5 y\"}\n{:process 19, :type :invoke, :f :put, :key \"7\", :value \"x 19 6 y\"}\n{:process 48, :type :ok, :f :append, :key \"4\", :value \"x 48 0 y\"}\n{:process 48, :type :invoke, :f :append, :key \"8\", :value \"x 48 1 y\"}\n{:process 29, :type :ok, :f :append, :key \"1\", :value \"x 29 3 y\"}\n{:process 29, :type :invoke, :f :append, :key \"7\", :value \"x 29 4 y\"}\n{:process 7, :type :ok, :f :append, :key \"2\", :value \"x 7 12 y\"}\n{:process 7, :type :invoke, :f :append, :key \"7\", :value \"x 7 13 y\"}\n{:process 11, :type :ok, :f :append, :key \"9\", :value \"x 11 4 y\"}\n{:process 7, :type :ok, :f :append, :key \"7\", :value \"x 7 13 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 14 y\"}\n{:process 11, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"9\", :value \"x 46 5 y\"}\n{:process 46, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 y\"}\n{:process 46, :type :invoke, :f :put, :key \"8\", :value \"x 46 6 y\"}\n{:process 29, :type :ok, :f :append, :key \"7\", :value \"x 29 4 y\"}\n{:process 29, :type :invoke, :f :append, :key \"4\", :value \"x 29 5 y\"}\n{:process 41, :type :ok, :f :append, :key \"8\", :value \"x 41 0 y\"}\n{:process 41, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 5 y\"}\n{:process 6, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 yx 47 10 y\"}\n{:process 31, :type :invoke, :f :append, :key \"9\", :value \"x 31 16 y\"}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 14 y\"}\n{:process 7, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"4\", :value \"x 29 5 y\"}\n{:process 29, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 y\"}\n{:process 6, :type :invoke, :f :append, :key \"9\", :value \"x 6 6 y\"}\n{:process 46, :type :ok, :f :put, :key \"8\", :value \"x 46 6 y\"}\n{:process 46, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"7\", :value \"x 18 1 y\"}\n{:process 18, :type :invoke, :f :append, :key \"0\", :value \"x 18 2 y\"}\n{:process 29, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 y\"}\n{:process 29, :type :invoke, :f :append, :key \"2\", :value \"x 29 6 y\"}\n{:process 16, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 y\"}\n{:process 16, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 y\"}\n{:process 11, :type :invoke, :f :append, :key \"3\", :value \"x 11 5 y\"}\n{:process 41, :type :ok, :f :get, :key \"4\", :value \"x 9 7 yx 7 9 yx 19 4 yx 46 4 y\"}\n{:process 41, :type :invoke, :f :append, :key \"2\", :value \"x 41 1 y\"}\n{:process 46, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 y\"}\n{:process 46, :type :invoke, :f :append, :key \"5\", :value \"x 46 7 y\"}\n{:process 7, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 y\"}\n{:process 7, :type :invoke, :f :append, :key \"9\", :value \"x 7 15 y\"}\n{:process 16, :type :ok, :f :get, :key \"1\", :value \"x 49 7 yx 47 18 yx 36 4 yx 43 7 yx 3 10 yx 9 6 yx 37 2 yx 46 3 yx 11 3 y\"}\n{:process 16, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 y\"}\n{:process 16, :type :invoke, :f :append, :key \"3\", :value \"x 16 3 y\"}\n{:process 38, :type :ok, :f :append, :key \"0\", :value \"x 38 4 y\"}\n{:process 38, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"9\", :value \"x 24 1 y\"}\n{:process 24, :type :invoke, :f :append, :key \"5\", :value \"x 24 2 y\"}\n{:process 31, :type :ok, :f :append, :key \"9\", :value \"x 31 16 y\"}\n{:process 31, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 y\"}\n{:process 31, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"8\", :value \"x 46 6 y\"}\n{:process 31, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"8\", :value \"x 10 4 y\"}\n{:process 10, :type :invoke, :f :append, :key \"1\", :value \"x 10 5 y\"}\n{:process 24, :type :ok, :f :append, :key \"5\", :value \"x 24 2 y\"}\n{:process 24, :type :invoke, :f :append, :key \"0\", :value \"x 24 3 y\"}\n{:process 41, :type :ok, :f :append, :key \"2\", :value \"x 41 1 y\"}\n{:process 41, :type :invoke, :f :append, :key \"1\", :value \"x 41 2 y\"}\n{:process 31, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 yx 47 10 yx 9 3 yx 43 6 yx 3 8 yx 31 15 yx 37 3 y\"}\n{:process 31, :type :invoke, :f :append, :key \"0\", :value \"x 31 17 y\"}\n{:process 10, :type :ok, :f :append, :key \"1\", :value \"x 10 5 y\"}\n{:process 10, :type :invoke, :f :append, :key \"8\", :value \"x 10 6 y\"}\n{:process 21, :type :ok, :f :append, :key \"0\", :value \"x 21 3 y\"}\n{:process 21, :type :invoke, :f :append, :key \"9\", :value \"x 21 4 y\"}\n{:process 41, :type :ok, :f :append, :key \"1\", :value \"x 41 2 y\"}\n{:process 41, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"0\", :value \"x 31 17 y\"}\n{:process 31, :type :invoke, :f :put, :key \"4\", :value \"x 31 18 y\"}\n{:process 17, :type :ok, :f :append, :key \"8\", :value \"x 17 6 y\"}\n{:process 17, :type :invoke, :f :append, :key \"9\", :value \"x 17 7 y\"}\n{:process 19, :type :ok, :f :put, :key \"7\", :value \"x 19 6 y\"}\n{:process 19, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"8\", :value \"x 10 6 y\"}\n{:process 10, :type :invoke, :f :append, :key \"5\", :value \"x 10 7 y\"}\n{:process 21, :type :ok, :f :append, :key \"9\", :value \"x 21 4 y\"}\n{:process 21, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 yx 41 1 y\"}\n{:process 19, :type :invoke, :f :append, :key \"0\", :value \"x 19 7 y\"}\n{:process 41, :type :ok, :f :get, :key \"3\", :value \"x 45 5 yx 45 6 yx 43 1 yx 25 8 yx 21 2 yx 47 10 yx 9 3 yx 43 6 yx 3 8 yx 31 15 yx 37 3 y\"}\n{:process 41, :type :invoke, :f :append, :key \"1\", :value \"x 41 3 y\"}\n{:process 10, :type :ok, :f :append, :key \"5\", :value \"x 10 7 y\"}\n{:process 10, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"0\", :value \"x 19 7 y\"}\n{:process 19, :type :invoke, :f :append, :key \"3\", :value \"x 19 8 y\"}\n{:process 21, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 y\"}\n{:process 21, :type :invoke, :f :append, :key \"4\", :value \"x 21 5 y\"}\n{:process 17, :type :ok, :f :append, :key \"9\", :value \"x 17 7 y\"}\n{:process 17, :type :invoke, :f :append, :key \"9\", :value \"x 17 8 y\"}\n{:process 10, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 yx 32 5 yx 49 5 yx 14 5 yx 21 3 yx 28 1 yx 1 1 yx 3 9 yx 40 2 yx 33 1 yx 7 14 yx 38 4 yx 24 3 yx 31 17 yx 19 7 y\"}\n{:process 10, :type :invoke, :f :put, :key \"3\", :value \"x 10 8 y\"}\n{:process 41, :type :ok, :f :append, :key \"1\", :value \"x 41 3 y\"}\n{:process 41, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"3\", :value \"x 19 8 y\"}\n{:process 19, :type :invoke, :f :append, :key \"6\", :value \"x 19 9 y\"}\n{:process 10, :type :ok, :f :put, :key \"3\", :value \"x 10 8 y\"}\n{:process 10, :type :invoke, :f :append, :key \"5\", :value \"x 10 9 y\"}\n{:process 38, :type :ok, :f :get, :key \"4\", :value \"x 31 18 y\"}\n{:process 38, :type :invoke, :f :append, :key \"3\", :value \"x 38 5 y\"}\n{:process 21, :type :ok, :f :append, :key \"4\", :value \"x 21 5 y\"}\n{:process 21, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"5\", :value \"x 10 9 y\"}\n{:process 10, :type :invoke, :f :append, :key \"1\", :value \"x 10 10 y\"}\n{:process 19, :type :ok, :f :append, :key \"6\", :value \"x 19 9 y\"}\n{:process 19, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 y\"}\n{:process 19, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 yx 32 5 yx 49 5 yx 14 5 yx 21 3 yx 28 1 yx 1 1 yx 3 9 yx 40 2 yx 33 1 yx 7 14 yx 38 4 yx 24 3 yx 31 17 yx 19 7 y\"}\n{:process 21, :type :invoke, :f :append, :key \"0\", :value \"x 21 6 y\"}\n{:process 21, :type :ok, :f :append, :key \"0\", :value \"x 21 6 y\"}\n{:process 21, :type :invoke, :f :append, :key \"3\", :value \"x 21 7 y\"}\n{:process 19, :type :ok, :f :get, :key \"4\", :value \"x 31 18 yx 21 5 y\"}\n{:process 19, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"1\", :value \"x 10 10 y\"}\n{:process 10, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"2\", :value \"x 29 6 y\"}\n{:process 29, :type :invoke, :f :append, :key \"7\", :value \"x 29 7 y\"}\n{:process 21, :type :ok, :f :append, :key \"3\", :value \"x 21 7 y\"}\n{:process 21, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 y\"}\n{:process 21, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 34, :type :ok, :f :put, :key \"8\", :value \"x 34 3 y\"}\n{:process 34, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"7\", :value \"x 29 7 y\"}\n{:process 29, :type :invoke, :f :append, :key \"9\", :value \"x 29 8 y\"}\n{:process 10, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 yx 41 1 yx 29 6 y\"}\n{:process 10, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 y\"}\n{:process 21, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"1\", :value \"x 13 2 y\"}\n{:process 13, :type :invoke, :f :append, :key \"2\", :value \"x 13 3 y\"}\n{:process 34, :type :ok, :f :get, :key \"4\", :value \"x 31 18 yx 21 5 y\"}\n{:process 34, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"8\", :value \"x 46 6 yx 10 4 yx 17 6 yx 10 6 y\"}\n{:process 10, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 y\"}\n{:process 41, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 y\"}\n{:process 41, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 34, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 yx 32 5 yx 49 5 yx 14 5 yx 21 3 yx 28 1 yx 1 1 yx 3 9 yx 40 2 yx 33 1 yx 7 14 yx 38 4 yx 24 3 yx 31 17 yx 19 7 yx 21 6 y\"}\n{:process 34, :type :invoke, :f :append, :key \"7\", :value \"x 34 4 y\"}\n{:process 10, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 y\"}\n{:process 10, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"9\", :value \"x 29 8 y\"}\n{:process 29, :type :invoke, :f :append, :key \"5\", :value \"x 29 9 y\"}\n{:process 10, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 yx 24 2 yx 10 7 yx 10 9 y\"}\n{:process 10, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"2\", :value \"x 13 3 y\"}\n{:process 13, :type :invoke, :f :append, :key \"5\", :value \"x 13 4 y\"}\n{:process 34, :type :ok, :f :append, :key \"7\", :value \"x 34 4 y\"}\n{:process 34, :type :invoke, :f :append, :key \"0\", :value \"x 34 5 y\"}\n{:process 13, :type :ok, :f :append, :key \"5\", :value \"x 13 4 y\"}\n{:process 13, :type :invoke, :f :append, :key \"5\", :value \"x 13 5 y\"}\n{:process 10, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 yx 19 9 y\"}\n{:process 10, :type :invoke, :f :append, :key \"0\", :value \"x 10 11 y\"}\n{:process 29, :type :ok, :f :append, :key \"5\", :value \"x 29 9 y\"}\n{:process 29, :type :invoke, :f :append, :key \"1\", :value \"x 29 10 y\"}\n{:process 47, :type :ok, :f :append, :key \"1\", :value \"x 47 18 y\"}\n{:process 47, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"5\", :value \"x 13 5 y\"}\n{:process 13, :type :invoke, :f :append, :key \"2\", :value \"x 13 6 y\"}\n{:process 34, :type :ok, :f :append, :key \"0\", :value \"x 34 5 y\"}\n{:process 34, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 34, :type :ok, :f :get, :key \"1\", :value \"x 49 7 yx 47 18 yx 36 4 yx 43 7 yx 3 10 yx 9 6 yx 37 2 yx 46 3 yx 11 3 yx 10 5 yx 41 2 yx 41 3 yx 43 9 yx 10 10 y\"}\n{:process 34, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 yx 24 2 yx 10 7 yx 10 9 yx 13 4 yx 29 9 yx 13 5 y\"}\n{:process 47, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"0\", :value \"x 10 11 y\"}\n{:process 10, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"9\", :value \"x 40 3 y\"}\n{:process 40, :type :invoke, :f :append, :key \"0\", :value \"x 40 4 y\"}\n{:process 34, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 yx 32 5 yx 49 5 yx 14 5 yx 21 3 yx 28 1 yx 1 1 yx 3 9 yx 40 2 yx 33 1 yx 7 14 yx 38 4 yx 24 3 yx 31 17 yx 19 7 yx 21 6 yx 34 5 yx 10 11 y\"}\n{:process 34, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"1\", :value \"x 29 10 y\"}\n{:process 29, :type :invoke, :f :append, :key \"3\", :value \"x 29 11 y\"}\n{:process 10, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 y\"}\n{:process 10, :type :invoke, :f :append, :key \"1\", :value \"x 10 12 y\"}\n{:process 47, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 y\"}\n{:process 47, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 yx 19 9 y\"}\n{:process 47, :type :invoke, :f :append, :key \"9\", :value \"x 47 19 y\"}\n{:process 19, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 y\"}\n{:process 19, :type :invoke, :f :append, :key \"9\", :value \"x 19 10 y\"}\n{:process 13, :type :ok, :f :append, :key \"2\", :value \"x 13 6 y\"}\n{:process 13, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"9\", :value \"x 47 19 y\"}\n{:process 47, :type :invoke, :f :append, :key \"1\", :value \"x 47 20 y\"}\n{:process 13, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 y\"}\n{:process 13, :type :invoke, :f :append, :key \"6\", :value \"x 13 7 y\"}\n{:process 34, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 y\"}\n{:process 34, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"3\", :value \"x 29 11 y\"}\n{:process 29, :type :invoke, :f :put, :key \"8\", :value \"x 29 12 y\"}\n{:process 21, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 yx 24 2 yx 10 7 yx 10 9 yx 13 4 yx 29 9 yx 13 5 y\"}\n{:process 21, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"6\", :value \"x 13 7 y\"}\n{:process 13, :type :invoke, :f :append, :key \"5\", :value \"x 13 8 y\"}\n{:process 29, :type :ok, :f :put, :key \"8\", :value \"x 29 12 y\"}\n{:process 29, :type :invoke, :f :append, :key \"1\", :value \"x 29 13 y\"}\n{:process 34, :type :ok, :f :get, :key \"4\", :value \"x 31 18 yx 21 5 y\"}\n{:process 34, :type :invoke, :f :put, :key \"2\", :value \"x 34 6 y\"}\n{:process 47, :type :ok, :f :append, :key \"1\", :value \"x 47 20 y\"}\n{:process 47, :type :invoke, :f :append, :key \"7\", :value \"x 47 21 y\"}\n{:process 21, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 yx 29 11 y\"}\n{:process 21, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"5\", :value \"x 2 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 yx 41 1 yx 29 6 yx 13 3 yx 13 6 y\"}\n{:process 21, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 yx 29 11 y\"}\n{:process 21, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 y\"}\n{:process 21, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 y\"}\n{:process 21, :type :invoke, :f :put, :key \"1\", :value \"x 21 8 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :put, :key \"1\", :value \"x 0 1 y\"}\n{:process 2, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 y\"}\n{:process 2, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 yx 29 11 y\"}\n{:process 2, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"1\", :value \"x 29 13 y\"}\n{:process 29, :type :invoke, :f :append, :key \"0\", :value \"x 29 14 y\"}\n{:process 13, :type :ok, :f :append, :key \"5\", :value \"x 13 8 y\"}\n{:process 13, :type :invoke, :f :append, :key \"3\", :value \"x 13 9 y\"}\n{:process 41, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 yx 24 2 yx 10 7 yx 10 9 yx 13 4 yx 29 9 yx 13 5 y\"}\n{:process 41, :type :invoke, :f :append, :key \"2\", :value \"x 41 4 y\"}\n{:process 48, :type :ok, :f :append, :key \"8\", :value \"x 48 1 y\"}\n{:process 48, :type :invoke, :f :append, :key \"1\", :value \"x 48 2 y\"}\n{:process 0, :type :ok, :f :put, :key \"1\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"3\", :value \"x 13 9 y\"}\n{:process 13, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"6\", :value \"x 14 7 y\"}\n{:process 14, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 y\"}\n{:process 13, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"x 29 12 yx 48 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 2 y\"}\n{:process 14, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 y\"}\n{:process 14, :type :invoke, :f :append, :key \"8\", :value \"x 14 8 y\"}\n{:process 29, :type :ok, :f :append, :key \"0\", :value \"x 29 14 y\"}\n{:process 29, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 y\"}\n{:process 13, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"8\", :value \"x 14 8 y\"}\n{:process 14, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 29, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 y\"}\n{:process 29, :type :invoke, :f :append, :key \"7\", :value \"x 29 15 y\"}\n{:process 7, :type :ok, :f :append, :key \"9\", :value \"x 7 15 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 16 y\"}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 9 y\"}\n{:process 45, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 yx 29 15 y\"}\n{:process 45, :type :invoke, :f :append, :key \"9\", :value \"x 45 10 y\"}\n{:process 45, :type :ok, :f :append, :key \"9\", :value \"x 45 10 y\"}\n{:process 45, :type :invoke, :f :append, :key \"0\", :value \"x 45 11 y\"}\n{:process 2, :type :ok, :f :get, :key \"8\", :value \"x 29 12 yx 48 1 yx 14 8 y\"}\n{:process 2, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 yx 19 9 yx 13 7 y\"}\n{:process 2, :type :invoke, :f :append, :key \"2\", :value \"x 2 2 y\"}\n{:process 46, :type :ok, :f :append, :key \"5\", :value \"x 46 7 y\"}\n{:process 46, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"0\", :value \"x 45 11 y\"}\n{:process 45, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"8\", :value \"x 29 12 yx 48 1 yx 14 8 y\"}\n{:process 46, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"4\", :value \"x 22 3 y\"}\n{:process 22, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"4\", :value \"x 31 18 yx 21 5 y\"}\n{:process 22, :type :invoke, :f :append, :key \"7\", :value \"x 22 4 y\"}\n{:process 20, :type :ok, :f :append, :key \"4\", :value \"x 20 3 y\"}\n{:process 20, :type :invoke, :f :append, :key \"9\", :value \"x 20 4 y\"}\n{:process 27, :type :ok, :f :append, :key \"8\", :value \"x 27 4 y\"}\n{:process 27, :type :invoke, :f :append, :key \"2\", :value \"x 27 5 y\"}\n{:process 4, :type :ok, :f :append, :key \"6\", :value \"x 4 7 y\"}\n{:process 4, :type :invoke, :f :append, :key \"5\", :value \"x 4 8 y\"}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 10 y\"}\n{:process 3, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 yx 24 2 yx 10 7 yx 10 9 yx 13 4 yx 29 9 yx 13 5 yx 13 8 yx 46 7 y\"}\n{:process 46, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 yx 29 15 y\"}\n{:process 46, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"9\", :value \"x 20 4 y\"}\n{:process 20, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 yx 29 15 y\"}\n{:process 46, :type :invoke, :f :put, :key \"4\", :value \"x 46 8 y\"}\n{:process 3, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 yx 7 15 yx 45 10 yx 20 4 y\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 11 y\"}\n{:process 27, :type :ok, :f :append, :key \"2\", :value \"x 27 5 y\"}\n{:process 27, :type :invoke, :f :put, :key \"4\", :value \"x 27 6 y\"}\n{:process 22, :type :ok, :f :append, :key \"7\", :value \"x 22 4 y\"}\n{:process 22, :type :invoke, :f :append, :key \"1\", :value \"x 22 5 y\"}\n{:process 20, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 yx 29 15 yx 22 4 y\"}\n{:process 20, :type :invoke, :f :append, :key \"3\", :value \"x 20 5 y\"}\n{:process 4, :type :ok, :f :append, :key \"5\", :value \"x 4 8 y\"}\n{:process 4, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 46, :type :ok, :f :put, :key \"4\", :value \"x 46 8 y\"}\n{:process 46, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 27, :type :ok, :f :put, :key \"4\", :value \"x 27 6 y\"}\n{:process 27, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"4\", :value \"x 27 6 y\"}\n{:process 46, :type :invoke, :f :append, :key \"2\", :value \"x 46 9 y\"}\n{:process 4, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 yx 7 15 yx 45 10 yx 20 4 y\"}\n{:process 4, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 11 y\"}\n{:process 3, :type :invoke, :f :append, :key \"6\", :value \"x 3 12 y\"}\n{:process 32, :type :ok, :f :append, :key \"0\", :value \"x 32 5 y\"}\n{:process 32, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 yx 29 11 yx 13 9 y\"}\n{:process 4, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"1\", :value \"x 22 5 y\"}\n{:process 22, :type :invoke, :f :append, :key \"6\", :value \"x 22 6 y\"}\n{:process 20, :type :ok, :f :append, :key \"3\", :value \"x 20 5 y\"}\n{:process 20, :type :invoke, :f :append, :key \"1\", :value \"x 20 6 y\"}\n{:process 30, :type :ok, :f :append, :key \"5\", :value \"x 30 6 y\"}\n{:process 30, :type :invoke, :f :append, :key \"5\", :value \"x 30 7 y\"}\n{:process 49, :type :ok, :f :put, :key \"1\", :value \"x 49 7 y\"}\n{:process 49, :type :invoke, :f :append, :key \"8\", :value \"x 49 8 y\"}\n{:process 18, :type :ok, :f :append, :key \"0\", :value \"x 18 2 y\"}\n{:process 18, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"4\", :value \"x 27 6 y\"}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 9 y\"}\n{:process 32, :type :ok, :f :get, :key \"8\", :value \"x 29 12 yx 48 1 yx 14 8 y\"}\n{:process 32, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"6\", :value \"x 3 12 y\"}\n{:process 3, :type :invoke, :f :append, :key \"4\", :value \"x 3 13 y\"}\n{:process 22, :type :ok, :f :append, :key \"6\", :value \"x 22 6 y\"}\n{:process 22, :type :invoke, :f :append, :key \"2\", :value \"x 22 7 y\"}\n{:process 20, :type :ok, :f :append, :key \"1\", :value \"x 20 6 y\"}\n{:process 20, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"8\", :value \"x 29 12 yx 48 1 yx 14 8 y\"}\n{:process 32, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"8\", :value \"x 49 8 y\"}\n{:process 49, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"2\", :value \"x 22 7 y\"}\n{:process 22, :type :invoke, :f :append, :key \"4\", :value \"x 22 8 y\"}\n{:process 45, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 yx 41 1 yx 29 6 yx 13 3 yx 13 6 yx 27 5 y\"}\n{:process 45, :type :invoke, :f :append, :key \"2\", :value \"x 45 12 y\"}\n{:process 3, :type :ok, :f :append, :key \"4\", :value \"x 3 13 y\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 14 y\"}\n{:process 32, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 yx 7 15 yx 45 10 yx 20 4 y\"}\n{:process 32, :type :invoke, :f :append, :key \"0\", :value \"x 32 6 y\"}\n{:process 14, :type :ok, :f :get, :key \"4\", :value \"x 27 6 y\"}\n{:process 14, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"8\", :value \"x 5 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"0\", :value \"x 5 2 y\"}\n{:process 22, :type :ok, :f :append, :key \"4\", :value \"x 22 8 y\"}\n{:process 22, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"8\", :value \"x 29 12 yx 48 1 yx 14 8 yx 49 8 y\"}\n{:process 22, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"8\", :value \"x 29 12 yx 48 1 yx 14 8 yx 49 8 y\"}\n{:process 22, :type :invoke, :f :append, :key \"3\", :value \"x 22 9 y\"}\n{:process 49, :type :ok, :f :get, :key \"8\", :value \"x 29 12 yx 48 1 yx 14 8 yx 49 8 y\"}\n{:process 49, :type :invoke, :f :append, :key \"2\", :value \"x 49 9 y\"}\n{:process 32, :type :ok, :f :append, :key \"0\", :value \"x 32 6 y\"}\n{:process 32, :type :invoke, :f :append, :key \"8\", :value \"x 32 7 y\"}\n{:process 5, :type :ok, :f :append, :key \"0\", :value \"x 5 2 y\"}\n{:process 5, :type :invoke, :f :append, :key \"7\", :value \"x 5 3 y\"}\n{:process 15, :type :ok, :f :append, :key \"6\", :value \"x 15 3 y\"}\n{:process 15, :type :invoke, :f :append, :key \"9\", :value \"x 15 4 y\"}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 14 y\"}\n{:process 3, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 yx 24 2 yx 10 7 yx 10 9 yx 13 4 yx 29 9 yx 13 5 yx 13 8 yx 46 7 yx 4 8 y\"}\n{:process 3, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 yx 29 15 yx 22 4 y\"}\n{:process 3, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 yx 41 1 yx 29 6 yx 13 3 yx 13 6 yx 27 5 yx 22 7 y\"}\n{:process 14, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"2\", :value \"x 49 9 y\"}\n{:process 49, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"9\", :value \"x 15 4 y\"}\n{:process 15, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 yx 19 9 yx 13 7 yx 3 12 yx 22 6 y\"}\n{:process 49, :type :invoke, :f :put, :key \"9\", :value \"x 49 10 y\"}\n{:process 32, :type :ok, :f :append, :key \"8\", :value \"x 32 7 y\"}\n{:process 32, :type :invoke, :f :append, :key \"9\", :value \"x 32 8 y\"}\n{:process 22, :type :ok, :f :append, :key \"3\", :value \"x 22 9 y\"}\n{:process 22, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 yx 19 9 yx 13 7 yx 3 12 yx 22 6 y\"}\n{:process 3, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"8\", :value \"x 29 12 yx 48 1 yx 14 8 yx 49 8 y\"}\n{:process 27, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"0\", :value \"x 10 3 yx 45 7 yx 32 5 yx 49 5 yx 14 5 yx 21 3 yx 28 1 yx 1 1 yx 3 9 yx 40 2 yx 33 1 yx 7 14 yx 38 4 yx 24 3 yx 31 17 yx 19 7 yx 21 6 yx 34 5 yx 10 11 yx 29 14 yx 0 2 yx 7 16 yx 45 11 yx 18 2 yx 32 6 yx 5 2 y\"}\n{:process 3, :type :invoke, :f :put, :key \"8\", :value \"x 3 15 y\"}\n{:process 27, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 yx 29 15 yx 22 4 y\"}\n{:process 27, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 yx 24 2 yx 10 7 yx 10 9 yx 13 4 yx 29 9 yx 13 5 yx 13 8 yx 46 7 yx 4 8 y\"}\n{:process 27, :type :invoke, :f :append, :key \"8\", :value \"x 27 7 y\"}\n{:process 14, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 yx 29 15 yx 22 4 y\"}\n{:process 14, :type :invoke, :f :append, :key \"0\", :value \"x 14 9 y\"}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 6 y\"}\n{:process 8, :type :invoke, :f :append, :key \"6\", :value \"x 8 7 y\"}\n{:process 15, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 yx 7 15 yx 45 10 yx 20 4 yx 15 4 y\"}\n{:process 15, :type :invoke, :f :append, :key \"0\", :value \"x 15 5 y\"}\n{:process 5, :type :ok, :f :append, :key \"7\", :value \"x 5 3 y\"}\n{:process 5, :type :invoke, :f :append, :key \"6\", :value \"x 5 4 y\"}\n{:process 3, :type :ok, :f :put, :key \"8\", :value \"x 3 15 y\"}\n{:process 3, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"6\", :value \"x 8 7 y\"}\n{:process 8, :type :invoke, :f :append, :key \"9\", :value \"x 8 8 y\"}\n{:process 32, :type :ok, :f :append, :key \"9\", :value \"x 32 8 y\"}\n{:process 32, :type :invoke, :f :put, :key \"8\", :value \"x 32 9 y\"}\n{:process 15, :type :ok, :f :append, :key \"0\", :value \"x 15 5 y\"}\n{:process 15, :type :invoke, :f :append, :key \"5\", :value \"x 15 6 y\"}\n{:process 22, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 yx 7 15 yx 45 10 yx 20 4 yx 15 4 yx 32 8 y\"}\n{:process 22, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"9\", :value \"x 47 6 yx 6 5 yx 44 3 yx 14 6 yx 27 3 yx 24 1 yx 44 4 yx 3 7 yx 9 5 yx 7 11 yx 19 5 yx 11 4 yx 46 5 yx 31 16 yx 21 4 yx 17 7 yx 17 8 yx 29 8 yx 40 3 yx 47 19 yx 7 15 yx 45 10 yx 20 4 yx 15 4 yx 32 8 y\"}\n{:process 3, :type :invoke, :f :put, :key \"0\", :value \"x 3 16 y\"}\n{:process 32, :type :ok, :f :put, :key \"8\", :value \"x 32 9 y\"}\n{:process 49, :type :ok, :f :put, :key \"9\", :value \"x 49 10 y\"}\n{:process 49, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 32, :type :invoke, :f :append, :key \"3\", :value \"x 32 10 y\"}\n{:process 49, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 yx 41 1 yx 29 6 yx 13 3 yx 13 6 yx 27 5 yx 22 7 yx 49 9 y\"}\n{:process 49, :type :invoke, :f :append, :key \"1\", :value \"x 49 11 y\"}\n{:process 15, :type :ok, :f :append, :key \"5\", :value \"x 15 6 y\"}\n{:process 15, :type :invoke, :f :append, :key \"2\", :value \"x 15 7 y\"}\n{:process 22, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 yx 19 9 yx 13 7 yx 3 12 yx 22 6 yx 8 7 y\"}\n{:process 22, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"6\", :value \"x 5 4 y\"}\n{:process 5, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"9\", :value \"x 8 8 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 3, :type :ok, :f :put, :key \"0\", :value \"x 3 16 y\"}\n{:process 3, :type :invoke, :f :append, :key \"6\", :value \"x 3 17 y\"}\n{:process 15, :type :ok, :f :append, :key \"2\", :value \"x 15 7 y\"}\n{:process 15, :type :invoke, :f :append, :key \"9\", :value \"x 15 8 y\"}\n{:process 49, :type :ok, :f :append, :key \"1\", :value \"x 49 11 y\"}\n{:process 49, :type :invoke, :f :append, :key \"5\", :value \"x 49 12 y\"}\n{:process 6, :type :ok, :f :append, :key \"9\", :value \"x 6 6 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 3 16 y\"}\n{:process 8, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"0\", :value \"x 1 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"5\", :value \"x 49 12 y\"}\n{:process 49, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"4\", :value \"x 27 6 yx 3 13 yx 22 8 y\"}\n{:process 8, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"6\", :value \"x 3 17 y\"}\n{:process 33, :type :ok, :f :append, :key \"6\", :value \"x 33 3 y\"}\n{:process 33, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 3, :type :invoke, :f :append, :key \"2\", :value \"x 3 18 y\"}\n{:process 15, :type :ok, :f :append, :key \"9\", :value \"x 15 8 y\"}\n{:process 15, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"9\", :value \"x 49 10 yx 8 8 yx 6 6 yx 15 8 y\"}\n{:process 15, :type :invoke, :f :append, :key \"9\", :value \"x 15 9 y\"}\n{:process 49, :type :ok, :f :get, :key \"1\", :value \"x 0 1 yx 3 11 yx 22 5 yx 20 6 yx 3 14 yx 49 11 y\"}\n{:process 49, :type :invoke, :f :append, :key \"3\", :value \"x 49 13 y\"}\n{:process 28, :type :ok, :f :append, :key \"4\", :value \"x 28 2 y\"}\n{:process 28, :type :invoke, :f :append, :key \"7\", :value \"x 28 3 y\"}\n{:process 8, :type :ok, :f :get, :key \"9\", :value \"x 49 10 yx 8 8 yx 6 6 yx 15 8 y\"}\n{:process 8, :type :invoke, :f :append, :key \"8\", :value \"x 8 9 y\"}\n{:process 3, :type :ok, :f :append, :key \"2\", :value \"x 3 18 y\"}\n{:process 3, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 yx 29 11 yx 13 9 yx 20 5 yx 22 9 y\"}\n{:process 33, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 yx 41 1 yx 29 6 yx 13 3 yx 13 6 yx 27 5 yx 22 7 yx 49 9 yx 15 7 yx 3 18 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 19 y\"}\n{:process 33, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 yx 24 2 yx 10 7 yx 10 9 yx 13 4 yx 29 9 yx 13 5 yx 13 8 yx 46 7 yx 4 8 yx 15 6 yx 49 12 y\"}\n{:process 33, :type :invoke, :f :append, :key \"8\", :value \"x 33 4 y\"}\n{:process 16, :type :ok, :f :append, :key \"3\", :value \"x 16 3 y\"}\n{:process 16, :type :invoke, :f :append, :key \"8\", :value \"x 16 4 y\"}\n{:process 28, :type :ok, :f :append, :key \"7\", :value \"x 28 3 y\"}\n{:process 28, :type :invoke, :f :append, :key \"0\", :value \"x 28 4 y\"}\n{:process 15, :type :ok, :f :append, :key \"9\", :value \"x 15 9 y\"}\n{:process 15, :type :invoke, :f :append, :key \"8\", :value \"x 15 10 y\"}\n{:process 33, :type :ok, :f :append, :key \"8\", :value \"x 33 4 y\"}\n{:process 33, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 19 y\"}\n{:process 3, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"8\", :value \"x 8 9 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"2\", :value \"x 30 1 yx 8 1 yx 30 5 yx 9 0 yx 9 1 yx 31 8 yx 42 0 yx 38 0 yx 26 3 yx 14 1 yx 19 2 yx 6 0 yx 6 1 yx 32 2 yx 32 3 yx 49 3 yx 40 1 yx 26 17 yx 47 9 yx 49 6 yx 47 13 yx 7 5 yx 39 3 yx 3 5 yx 43 5 yx 7 10 yx 16 1 yx 7 12 yx 41 1 yx 29 6 yx 13 3 yx 13 6 yx 27 5 yx 22 7 yx 49 9 yx 15 7 yx 3 18 y\"}\n{:process 22, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 yx 19 9 yx 13 7 yx 3 12 yx 22 6 yx 8 7 yx 5 4 yx 3 17 y\"}\n{:process 33, :type :invoke, :f :append, :key \"4\", :value \"x 33 5 y\"}\n{:process 22, :type :ok, :f :get, :key \"5\", :value \"x 43 4 yx 21 0 yx 47 5 yx 26 13 yx 44 2 yx 32 4 yx 29 2 yx 34 2 yx 15 2 yx 25 9 yx 30 6 yx 3 6 yx 31 10 yx 43 8 yx 24 2 yx 10 7 yx 10 9 yx 13 4 yx 29 9 yx 13 5 yx 13 8 yx 46 7 yx 4 8 yx 15 6 yx 49 12 y\"}\n{:process 22, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"8\", :value \"x 16 4 y\"}\n{:process 16, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"8\", :value \"x 15 10 y\"}\n{:process 15, :type :invoke, :f :append, :key \"6\", :value \"x 15 11 y\"}\n{:process 28, :type :ok, :f :append, :key \"0\", :value \"x 28 4 y\"}\n{:process 28, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"8\", :value \"x 32 9 yx 33 4 yx 8 9 yx 16 4 yx 15 10 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 20 y\"}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 3 16 yx 28 4 y\"}\n{:process 8, :type :invoke, :f :append, :key \"9\", :value \"x 8 10 y\"}\n{:process 5, :type :ok, :f :get, :key \"0\", :value \"x 3 16 y\"}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 5 y\"}\n{:process 28, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 yx 19 9 yx 13 7 yx 3 12 yx 22 6 yx 8 7 yx 5 4 yx 3 17 y\"}\n{:process 28, :type :invoke, :f :append, :key \"5\", :value \"x 28 5 y\"}\n{:process 33, :type :ok, :f :append, :key \"4\", :value \"x 33 5 y\"}\n{:process 33, :type :invoke, :f :append, :key \"8\", :value \"x 33 6 y\"}\n{:process 15, :type :ok, :f :append, :key \"6\", :value \"x 15 11 y\"}\n{:process 15, :type :invoke, :f :append, :key \"4\", :value \"x 15 12 y\"}\n{:process 16, :type :ok, :f :get, :key \"0\", :value \"x 3 16 yx 28 4 y\"}\n{:process 16, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"5\", :value \"x 28 5 y\"}\n{:process 28, :type :invoke, :f :append, :key \"5\", :value \"x 28 6 y\"}\n{:process 8, :type :ok, :f :append, :key \"9\", :value \"x 8 10 y\"}\n{:process 8, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 20 y\"}\n{:process 3, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"4\", :value \"x 15 12 y\"}\n{:process 15, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"0\", :value \"x 3 16 yx 28 4 y\"}\n{:process 16, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"6\", :value \"x 42 5 yx 26 8 yx 26 11 yx 26 16 yx 36 2 yx 47 8 yx 36 3 yx 35 7 yx 13 1 yx 15 3 yx 37 1 yx 4 7 yx 14 7 yx 9 4 yx 33 3 yx 19 9 yx 13 7 yx 3 12 yx 22 6 yx 8 7 yx 5 4 yx 3 17 y\"}\n{:process 13, :type :invoke, :f :append, :key \"0\", :value \"x 13 10 y\"}\n{:process 8, :type :ok, :f :get, :key \"4\", :value \"x 27 6 yx 3 13 yx 22 8 yx 28 2 yx 33 5 yx 15 12 y\"}\n{:process 8, :type :invoke, :f :append, :key \"4\", :value \"x 8 11 y\"}\n{:process 3, :type :ok, :f :get, :key \"7\", :value \"x 19 6 yx 29 7 yx 34 4 yx 29 15 yx 22 4 yx 5 3 yx 28 3 y\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 21 y\"}\n{:process 28, :type :ok, :f :append, :key \"5\", :value \"x 28 6 y\"}\n{:process 28, :type :invoke, :f :append, :key \"7\", :value \"x 28 7 y\"}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 49 10 yx 8 8 yx 6 6 yx 15 8 yx 15 9 yx 3 19 yx 8 10 y\"}\n{:process 6, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 10 8 yx 21 7 yx 29 11 yx 13 9 yx 20 5 yx 22 9 yx 16 3 yx 11 5 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 3 16 yx 28 4 y\"}\n{:process 1, :type :invoke, :f :append, :key \"4\", :value \"x 1 2 y\"}\n{:process 15, :type :ok, :f :get, :key \"1\", :value \"x 0 1 yx 3 11 yx 22 5 yx 20 6 yx 3 14 yx 49 11 y\"}\n{:process 15, :type :invoke, :f :append, :key \"1\", :value \"x 15 13 y\"}\n{:process 22, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 16, :type :ok, :f :get, :key \"9\", :value \"\"}\n{:process 18, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 6, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 20, :type :ok, :f :get, :key \"1\", :value \"\"}\n{:process 17, :type :ok, :f :append, :key \"9\", :value \"x 17 8 y\"}\n{:process 38, :type :ok, :f :append, :key \"3\", :value \"x 38 5 y\"}\n{:process 41, :type :ok, :f :append, :key \"2\", :value \"x 41 4 y\"}\n{:process 19, :type :ok, :f :append, :key \"9\", :value \"x 19 10 y\"}\n{:process 24, :type :ok, :f :append, :key \"0\", :value \"x 24 3 y\"}\n{:process 12, :type :ok, :f :append, :key \"9\", :value \"x 12 1 y\"}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 16 y\"}\n{:process 29, :type :ok, :f :append, :key \"7\", :value \"x 29 15 y\"}\n{:process 47, :type :ok, :f :append, :key \"7\", :value \"x 47 21 y\"}\n{:process 34, :type :ok, :f :put, :key \"2\", :value \"x 34 6 y\"}\n{:process 40, :type :ok, :f :append, :key \"0\", :value \"x 40 4 y\"}\n{:process 48, :type :ok, :f :append, :key \"1\", :value \"x 48 2 y\"}\n{:process 2, :type :ok, :f :append, :key \"2\", :value \"x 2 2 y\"}\n{:process 39, :type :ok, :f :append, :key \"2\", :value \"x 39 3 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 2 y\"}\n{:process 13, :type :ok, :f :append, :key \"0\", :value \"x 13 10 y\"}\n{:process 45, :type :ok, :f :append, :key \"2\", :value \"x 45 12 y\"}\n{:process 23, :type :ok, :f :append, :key \"3\", :value \"x 23 5 y\"}\n{:process 27, :type :ok, :f :append, :key \"8\", :value \"x 27 7 y\"}\n{:process 46, :type :ok, :f :append, :key \"2\", :value \"x 46 9 y\"}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 9 y\"}\n{:process 30, :type :ok, :f :append, :key \"5\", :value \"x 30 7 y\"}\n{:process 36, :type :ok, :f :append, :key \"1\", :value \"x 36 4 y\"}\n{:process 44, :type :ok, :f :append, :key \"9\", :value \"x 44 4 y\"}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 5 y\"}\n{:process 49, :type :ok, :f :append, :key \"3\", :value \"x 49 13 y\"}\n{:process 1, :type :ok, :f :append, :key \"4\", :value \"x 1 2 y\"}\n{:process 33, :type :ok, :f :append, :key \"8\", :value \"x 33 6 y\"}\n{:process 11, :type :ok, :f :append, :key \"3\", :value \"x 11 5 y\"}\n{:process 8, :type :ok, :f :append, :key \"4\", :value \"x 8 11 y\"}\n{:process 37, :type :ok, :f :append, :key \"7\", :value \"x 37 4 y\"}\n{:process 35, :type :ok, :f :append, :key \"1\", :value \"x 35 9 y\"}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 21 y\"}\n{:process 28, :type :ok, :f :append, :key \"7\", :value \"x 28 7 y\"}\n{:process 9, :type :ok, :f :put, :key \"4\", :value \"x 9 7 y\"}\n{:process 15, :type :ok, :f :append, :key \"1\", :value \"x 15 13 y\"}\n{:process 31, :type :ok, :f :put, :key \"4\", :value \"x 31 18 y\"}\n{:process 21, :type :ok, :f :put, :key \"1\", :value \"x 21 8 y\"}\n{:process 10, :type :ok, :f :append, :key \"1\", :value \"x 10 12 y\"}\n{:process 14, :type :ok, :f :append, :key \"0\", :value \"x 14 9 y\"}\n{:process 42, :type :ok, :f :put, :key \"6\", :value \"x 42 5 y\"}\n{:process 32, :type :ok, :f :append, :key \"3\", :value \"x 32 10 y\"}\n{:process 26, :type :ok, :f :append, :key \"4\", :value \"x 26 18 y\"}\n{:process 25, :type :ok, :f :append, :key \"5\", :value \"x 25 9 y\"}\n{:process 43, :type :ok, :f :append, :key \"1\", :value \"x 43 9 y\"}"
  },
  {
    "path": "courses/dss/linearizability/test_data/c50-ok.txt",
    "content": "{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 0 y\"}\n{:process 18, :type :invoke, :f :append, :key \"1\", :value \"x 18 0 y\"}\n{:process 7, :type :invoke, :f :append, :key \"0\", :value \"x 7 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 9, :type :invoke, :f :append, :key \"9\", :value \"x 9 0 y\"}\n{:process 10, :type :invoke, :f :append, :key \"9\", :value \"x 10 0 y\"}\n{:process 11, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 12, :type :invoke, :f :append, :key \"5\", :value \"x 12 0 y\"}\n{:process 13, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 14, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 15, :type :invoke, :f :append, :key \"2\", :value \"x 15 0 y\"}\n{:process 2, :type :invoke, :f :append, :key \"4\", :value \"x 2 0 y\"}\n{:process 16, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 17, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 32, :type :invoke, :f :append, :key \"6\", :value \"x 32 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 19, :type :invoke, :f :append, :key \"6\", :value \"x 19 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 0 y\"}\n{:process 20, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 21, :type :invoke, :f :append, :key \"1\", :value \"x 21 0 y\"}\n{:process 3, :type :invoke, :f :put, :key \"7\", :value \"x 3 0 y\"}\n{:process 22, :type :invoke, :f :append, :key \"1\", :value \"x 22 0 y\"}\n{:process 23, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 39, :type :invoke, :f :append, :key \"2\", :value \"x 39 0 y\"}\n{:process 24, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 33, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 25, :type :invoke, :f :append, :key \"7\", :value \"x 25 0 y\"}\n{:process 34, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 26, :type :invoke, :f :put, :key \"7\", :value \"x 26 0 y\"}\n{:process 35, :type :invoke, :f :append, :key \"9\", :value \"x 35 0 y\"}\n{:process 36, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 37, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 38, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 27, :type :invoke, :f :append, :key \"9\", :value \"x 27 0 y\"}\n{:process 42, :type :invoke, :f :append, :key \"0\", :value \"x 42 0 y\"}\n{:process 28, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 40, :type :invoke, :f :append, :key \"5\", :value \"x 40 0 y\"}\n{:process 29, :type :invoke, :f :put, :key \"5\", :value \"x 29 0 y\"}\n{:process 41, :type :invoke, :f :append, :key \"0\", :value \"x 41 0 y\"}\n{:process 30, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 44, :type :invoke, :f :append, :key \"9\", :value \"x 44 0 y\"}\n{:process 43, :type :invoke, :f :append, :key \"3\", :value \"x 43 0 y\"}\n{:process 31, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :invoke, :f :append, :key \"7\", :value \"x 5 0 y\"}\n{:process 46, :type :invoke, :f :append, :key \"9\", :value \"x 46 0 y\"}\n{:process 49, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 45, :type :invoke, :f :put, :key \"2\", :value \"x 45 0 y\"}\n{:process 48, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 47, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"2\", :value \"x 39 0 y\"}\n{:process 39, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 11, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"1\", :value \"x 21 0 y\"}\n{:process 21, :type :invoke, :f :append, :key \"4\", :value \"x 21 1 y\"}\n{:process 11, :type :ok, :f :get, :key \"2\", :value \"x 39 0 y\"}\n{:process 11, :type :invoke, :f :append, :key \"8\", :value \"x 11 0 y\"}\n{:process 21, :type :ok, :f :append, :key \"4\", :value \"x 21 1 y\"}\n{:process 21, :type :invoke, :f :append, :key \"0\", :value \"x 21 2 y\"}\n{:process 21, :type :ok, :f :append, :key \"0\", :value \"x 21 2 y\"}\n{:process 21, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"5\", :value \"\"}\n{:process 21, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"5\", :value \"\"}\n{:process 47, :type :invoke, :f :append, :key \"5\", :value \"x 47 0 y\"}\n{:process 21, :type :ok, :f :get, :key \"7\", :value \"\"}\n{:process 21, :type :invoke, :f :append, :key \"3\", :value \"x 21 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"5\", :value \"x 47 0 y\"}\n{:process 47, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"3\", :value \"x 21 3 y\"}\n{:process 21, :type :invoke, :f :append, :key \"0\", :value \"x 21 4 y\"}\n{:process 21, :type :ok, :f :append, :key \"0\", :value \"x 21 4 y\"}\n{:process 21, :type :invoke, :f :append, :key \"4\", :value \"x 21 5 y\"}\n{:process 3, :type :ok, :f :put, :key \"7\", :value \"x 3 0 y\"}\n{:process 3, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"4\", :value \"x 21 5 y\"}\n{:process 21, :type :invoke, :f :append, :key \"9\", :value \"x 21 6 y\"}\n{:process 30, :type :ok, :f :get, :key \"1\", :value \"x 21 0 y\"}\n{:process 30, :type :invoke, :f :append, :key \"2\", :value \"x 30 0 y\"}\n{:process 3, :type :ok, :f :get, :key \"6\", :value \"\"}\n{:process 3, :type :invoke, :f :append, :key \"8\", :value \"x 3 1 y\"}\n{:process 21, :type :ok, :f :append, :key \"9\", :value \"x 21 6 y\"}\n{:process 21, :type :invoke, :f :append, :key \"8\", :value \"x 21 7 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"8\", :value \"x 21 7 y\"}\n{:process 21, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"5\", :value \"x 47 0 y\"}\n{:process 21, :type :invoke, :f :append, :key \"8\", :value \"x 21 8 y\"}\n{:process 8, :type :ok, :f :get, :key \"9\", :value \"x 46 0 yx 21 6 yx 44 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 6 0 yx 21 2 yx 21 4 yx 0 0 y\"}\n{:process 8, :type :invoke, :f :put, :key \"3\", :value \"x 8 0 y\"}\n{:process 21, :type :ok, :f :append, :key \"8\", :value \"x 21 8 y\"}\n{:process 21, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 y\"}\n{:process 13, :type :invoke, :f :append, :key \"0\", :value \"x 13 0 y\"}\n{:process 8, :type :ok, :f :put, :key \"3\", :value \"x 8 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"3\", :value \"x 8 0 y\"}\n{:process 21, :type :invoke, :f :append, :key \"3\", :value \"x 21 9 y\"}\n{:process 5, :type :ok, :f :append, :key \"7\", :value \"x 5 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"9\", :value \"x 27 0 y\"}\n{:process 27, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"3\", :value \"x 8 0 y\"}\n{:process 24, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"0\", :value \"x 13 0 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"3\", :value \"x 21 9 y\"}\n{:process 21, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 1 y\"}\n{:process 24, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 y\"}\n{:process 24, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"9\", :value \"x 35 0 y\"}\n{:process 35, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"6\", :value \"x 19 0 y\"}\n{:process 19, :type :invoke, :f :append, :key \"9\", :value \"x 19 1 y\"}\n{:process 21, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 y\"}\n{:process 21, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 1 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"6\", :value \"x 19 0 y\"}\n{:process 35, :type :invoke, :f :put, :key \"9\", :value \"x 35 1 y\"}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 47 0 yx 8 1 y\"}\n{:process 13, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 21 9 y\"}\n{:process 21, :type :invoke, :f :append, :key \"7\", :value \"x 21 10 y\"}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 19 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 2 y\"}\n{:process 1, :type :ok, :f :get, :key \"6\", :value \"x 19 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 35, :type :ok, :f :put, :key \"9\", :value \"x 35 1 y\"}\n{:process 35, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 y\"}\n{:process 13, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"5\", :value \"x 40 0 y\"}\n{:process 40, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"7\", :value \"x 21 10 y\"}\n{:process 21, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 2 y\"}\n{:process 8, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"7\", :value \"x 3 0 yx 5 0 yx 21 10 y\"}\n{:process 13, :type :invoke, :f :append, :key \"8\", :value \"x 13 1 y\"}\n{:process 1, :type :ok, :f :get, :key \"7\", :value \"x 3 0 yx 5 0 yx 21 10 y\"}\n{:process 1, :type :invoke, :f :append, :key \"0\", :value \"x 1 0 y\"}\n{:process 35, :type :ok, :f :get, :key \"1\", :value \"x 21 0 y\"}\n{:process 35, :type :invoke, :f :append, :key \"4\", :value \"x 35 2 y\"}\n{:process 21, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 21 9 y\"}\n{:process 21, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 32, :type :ok, :f :append, :key \"6\", :value \"x 32 0 y\"}\n{:process 32, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 40, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 y\"}\n{:process 40, :type :invoke, :f :append, :key \"7\", :value \"x 40 1 y\"}\n{:process 41, :type :ok, :f :append, :key \"0\", :value \"x 41 0 y\"}\n{:process 41, :type :invoke, :f :append, :key \"4\", :value \"x 41 1 y\"}\n{:process 35, :type :ok, :f :append, :key \"4\", :value \"x 35 2 y\"}\n{:process 35, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"5\", :value \"x 47 0 yx 8 1 yx 40 0 y\"}\n{:process 21, :type :invoke, :f :append, :key \"5\", :value \"x 21 11 y\"}\n{:process 13, :type :ok, :f :append, :key \"8\", :value \"x 13 1 y\"}\n{:process 13, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"0\", :value \"x 1 0 y\"}\n{:process 1, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"7\", :value \"x 40 1 y\"}\n{:process 40, :type :invoke, :f :append, :key \"9\", :value \"x 40 2 y\"}\n{:process 15, :type :ok, :f :append, :key \"2\", :value \"x 15 0 y\"}\n{:process 15, :type :invoke, :f :append, :key \"2\", :value \"x 15 1 y\"}\n{:process 34, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 yx 35 2 y\"}\n{:process 34, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 y\"}\n{:process 35, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 12, :type :ok, :f :append, :key \"5\", :value \"x 12 0 y\"}\n{:process 12, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"2\", :value \"x 15 1 y\"}\n{:process 15, :type :invoke, :f :append, :key \"6\", :value \"x 15 2 y\"}\n{:process 21, :type :ok, :f :append, :key \"5\", :value \"x 21 11 y\"}\n{:process 21, :type :invoke, :f :append, :key \"8\", :value \"x 21 12 y\"}\n{:process 35, :type :ok, :f :get, :key \"1\", :value \"x 21 0 y\"}\n{:process 35, :type :invoke, :f :append, :key \"5\", :value \"x 35 3 y\"}\n{:process 40, :type :ok, :f :append, :key \"9\", :value \"x 40 2 y\"}\n{:process 40, :type :invoke, :f :append, :key \"5\", :value \"x 40 3 y\"}\n{:process 41, :type :ok, :f :append, :key \"4\", :value \"x 41 1 y\"}\n{:process 41, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"6\", :value \"x 15 2 y\"}\n{:process 15, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 34, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 y\"}\n{:process 34, :type :invoke, :f :append, :key \"7\", :value \"x 34 0 y\"}\n{:process 1, :type :ok, :f :get, :key \"7\", :value \"x 3 0 yx 5 0 yx 21 10 yx 40 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"5\", :value \"x 35 3 y\"}\n{:process 35, :type :invoke, :f :append, :key \"8\", :value \"x 35 4 y\"}\n{:process 40, :type :ok, :f :append, :key \"5\", :value \"x 40 3 y\"}\n{:process 40, :type :invoke, :f :append, :key \"0\", :value \"x 40 4 y\"}\n{:process 36, :type :ok, :f :get, :key \"5\", :value \"x 47 0 yx 8 1 yx 40 0 yx 12 0 yx 21 11 yx 35 3 yx 40 3 y\"}\n{:process 36, :type :invoke, :f :append, :key \"7\", :value \"x 36 0 y\"}\n{:process 15, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 y\"}\n{:process 15, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"7\", :value \"x 34 0 y\"}\n{:process 34, :type :invoke, :f :append, :key \"2\", :value \"x 34 1 y\"}\n{:process 41, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 yx 35 2 yx 41 1 y\"}\n{:process 41, :type :invoke, :f :append, :key \"4\", :value \"x 41 2 y\"}\n{:process 35, :type :ok, :f :append, :key \"8\", :value \"x 35 4 y\"}\n{:process 35, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"0\", :value \"x 40 4 y\"}\n{:process 40, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 y\"}\n{:process 1, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"1\", :value \"x 21 0 y\"}\n{:process 15, :type :invoke, :f :append, :key \"1\", :value \"x 15 3 y\"}\n{:process 40, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 y\"}\n{:process 36, :type :ok, :f :append, :key \"7\", :value \"x 36 0 y\"}\n{:process 40, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 36, :type :invoke, :f :append, :key \"1\", :value \"x 36 1 y\"}\n{:process 1, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 yx 15 0 yx 15 1 y\"}\n{:process 1, :type :invoke, :f :append, :key \"8\", :value \"x 1 1 y\"}\n{:process 41, :type :ok, :f :append, :key \"4\", :value \"x 41 2 y\"}\n{:process 41, :type :invoke, :f :append, :key \"3\", :value \"x 41 3 y\"}\n{:process 2, :type :ok, :f :append, :key \"4\", :value \"x 2 0 y\"}\n{:process 2, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"1\", :value \"x 15 3 y\"}\n{:process 15, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"3\", :value \"x 41 3 y\"}\n{:process 41, :type :invoke, :f :append, :key \"7\", :value \"x 41 4 y\"}\n{:process 40, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 y\"}\n{:process 40, :type :invoke, :f :append, :key \"8\", :value \"x 40 5 y\"}\n{:process 36, :type :ok, :f :append, :key \"1\", :value \"x 36 1 y\"}\n{:process 36, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"7\", :value \"x 41 4 y\"}\n{:process 41, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"8\", :value \"x 40 5 y\"}\n{:process 40, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 20, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 yx 15 0 yx 15 1 y\"}\n{:process 20, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"8\", :value \"x 1 1 y\"}\n{:process 1, :type :invoke, :f :append, :key \"7\", :value \"x 1 2 y\"}\n{:process 41, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 21 9 yx 41 3 y\"}\n{:process 41, :type :invoke, :f :append, :key \"1\", :value \"x 41 5 y\"}\n{:process 15, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 21 9 yx 41 3 y\"}\n{:process 15, :type :invoke, :f :append, :key \"7\", :value \"x 15 4 y\"}\n{:process 36, :type :ok, :f :get, :key \"7\", :value \"x 3 0 yx 5 0 yx 21 10 yx 40 1 yx 34 0 yx 36 0 yx 41 4 y\"}\n{:process 36, :type :invoke, :f :append, :key \"1\", :value \"x 36 2 y\"}\n{:process 40, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 yx 35 2 yx 41 1 yx 41 2 yx 2 0 y\"}\n{:process 40, :type :invoke, :f :append, :key \"1\", :value \"x 40 6 y\"}\n{:process 20, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 y\"}\n{:process 20, :type :invoke, :f :append, :key \"6\", :value \"x 20 0 y\"}\n{:process 1, :type :ok, :f :append, :key \"7\", :value \"x 1 2 y\"}\n{:process 1, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"1\", :value \"x 41 5 y\"}\n{:process 41, :type :invoke, :f :put, :key \"0\", :value \"x 41 6 y\"}\n{:process 15, :type :ok, :f :append, :key \"7\", :value \"x 15 4 y\"}\n{:process 15, :type :invoke, :f :append, :key \"0\", :value \"x 15 5 y\"}\n{:process 36, :type :ok, :f :append, :key \"1\", :value \"x 36 2 y\"}\n{:process 36, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 41, :type :ok, :f :put, :key \"0\", :value \"x 41 6 y\"}\n{:process 41, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"0\", :value \"x 15 5 y\"}\n{:process 15, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 y\"}\n{:process 36, :type :invoke, :f :append, :key \"4\", :value \"x 36 3 y\"}\n{:process 23, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 yx 15 0 yx 15 1 y\"}\n{:process 23, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 48, :type :ok, :f :get, :key \"0\", :value \"x 41 6 yx 15 5 y\"}\n{:process 31, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 y\"}\n{:process 48, :type :invoke, :f :append, :key \"7\", :value \"x 48 0 y\"}\n{:process 31, :type :invoke, :f :append, :key \"9\", :value \"x 31 0 y\"}\n{:process 18, :type :ok, :f :append, :key \"1\", :value \"x 18 0 y\"}\n{:process 18, :type :invoke, :f :append, :key \"4\", :value \"x 18 1 y\"}\n{:process 48, :type :ok, :f :append, :key \"7\", :value \"x 48 0 y\"}\n{:process 48, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"9\", :value \"x 31 0 y\"}\n{:process 31, :type :invoke, :f :append, :key \"7\", :value \"x 31 1 y\"}\n{:process 39, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 y\"}\n{:process 39, :type :invoke, :f :append, :key \"0\", :value \"x 39 1 y\"}\n{:process 39, :type :ok, :f :append, :key \"0\", :value \"x 39 1 y\"}\n{:process 39, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"8\", :value \"x 21 7 yx 21 8 yx 13 1 yx 21 12 yx 35 4 yx 1 1 yx 40 5 y\"}\n{:process 32, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 y\"}\n{:process 24, :type :invoke, :f :append, :key \"1\", :value \"x 24 0 y\"}\n{:process 39, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 yx 35 2 yx 41 1 yx 41 2 yx 2 0 yx 18 1 y\"}\n{:process 39, :type :invoke, :f :append, :key \"3\", :value \"x 39 2 y\"}\n{:process 28, :type :ok, :f :get, :key \"3\", :value \"x 8 0 yx 21 9 yx 41 3 y\"}\n{:process 28, :type :invoke, :f :append, :key \"6\", :value \"x 28 0 y\"}\n{:process 24, :type :ok, :f :append, :key \"1\", :value \"x 24 0 y\"}\n{:process 24, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 y\"}\n{:process 14, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"3\", :value \"x 39 2 y\"}\n{:process 39, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"6\", :value \"x 28 0 y\"}\n{:process 28, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 yx 35 2 yx 41 1 yx 41 2 yx 2 0 yx 18 1 y\"}\n{:process 24, :type :invoke, :f :append, :key \"4\", :value \"x 24 1 y\"}\n{:process 14, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 yx 35 2 yx 41 1 yx 41 2 yx 2 0 yx 18 1 y\"}\n{:process 14, :type :invoke, :f :append, :key \"7\", :value \"x 14 0 y\"}\n{:process 28, :type :ok, :f :get, :key \"5\", :value \"x 47 0 yx 8 1 yx 40 0 yx 12 0 yx 21 11 yx 35 3 yx 40 3 y\"}\n{:process 28, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"4\", :value \"x 24 1 y\"}\n{:process 24, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 y\"}\n{:process 39, :type :invoke, :f :append, :key \"4\", :value \"x 39 3 y\"}\n{:process 14, :type :ok, :f :append, :key \"7\", :value \"x 14 0 y\"}\n{:process 14, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"6\", :value \"x 20 0 y\"}\n{:process 20, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"9\", :value \"x 19 1 y\"}\n{:process 19, :type :invoke, :f :append, :key \"6\", :value \"x 19 2 y\"}\n{:process 28, :type :ok, :f :get, :key \"0\", :value \"x 41 6 yx 15 5 yx 39 1 y\"}\n{:process 28, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 yx 35 2 yx 41 1 yx 41 2 yx 2 0 yx 18 1 yx 24 1 y\"}\n{:process 35, :type :invoke, :f :append, :key \"3\", :value \"x 35 5 y\"}\n{:process 27, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 y\"}\n{:process 27, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 yx 35 2 yx 41 1 yx 41 2 yx 2 0 yx 18 1 yx 24 1 y\"}\n{:process 14, :type :invoke, :f :append, :key \"6\", :value \"x 14 1 y\"}\n{:process 35, :type :ok, :f :append, :key \"3\", :value \"x 35 5 y\"}\n{:process 20, :type :ok, :f :get, :key \"4\", :value \"x 21 1 yx 21 5 yx 35 2 yx 41 1 yx 41 2 yx 2 0 yx 18 1 yx 24 1 y\"}\n{:process 20, :type :invoke, :f :put, :key \"3\", :value \"x 20 1 y\"}\n{:process 35, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 y\"}\n{:process 28, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"0\", :value \"x 41 6 yx 15 5 yx 39 1 y\"}\n{:process 27, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 20, :type :ok, :f :put, :key \"3\", :value \"x 20 1 y\"}\n{:process 20, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 yx 15 0 yx 15 1 y\"}\n{:process 35, :type :invoke, :f :append, :key \"2\", :value \"x 35 6 y\"}\n{:process 28, :type :ok, :f :get, :key \"3\", :value \"x 20 1 y\"}\n{:process 28, :type :invoke, :f :append, :key \"5\", :value \"x 28 1 y\"}\n{:process 27, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 y\"}\n{:process 27, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 y\"}\n{:process 33, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"1\", :value \"x 40 6 y\"}\n{:process 40, :type :invoke, :f :append, :key \"0\", :value \"x 40 7 y\"}\n{:process 35, :type :ok, :f :append, :key \"2\", :value \"x 35 6 y\"}\n{:process 35, :type :invoke, :f :append, :key \"0\", :value \"x 35 7 y\"}\n{:process 28, :type :ok, :f :append, :key \"5\", :value \"x 28 1 y\"}\n{:process 28, :type :invoke, :f :put, :key \"7\", :value \"x 28 2 y\"}\n{:process 2, :type :ok, :f :get, :key \"8\", :value \"x 21 7 yx 21 8 yx 13 1 yx 21 12 yx 35 4 yx 1 1 yx 40 5 y\"}\n{:process 2, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"3\", :value \"x 20 1 y\"}\n{:process 41, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 y\"}\n{:process 27, :type :invoke, :f :append, :key \"3\", :value \"x 27 1 y\"}\n{:process 28, :type :ok, :f :put, :key \"7\", :value \"x 28 2 y\"}\n{:process 28, :type :invoke, :f :put, :key \"4\", :value \"x 28 3 y\"}\n{:process 27, :type :ok, :f :append, :key \"3\", :value \"x 27 1 y\"}\n{:process 27, :type :invoke, :f :append, :key \"7\", :value \"x 27 2 y\"}\n{:process 35, :type :ok, :f :append, :key \"0\", :value \"x 35 7 y\"}\n{:process 35, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"9\", :value \"x 9 0 y\"}\n{:process 40, :type :ok, :f :append, :key \"0\", :value \"x 40 7 y\"}\n{:process 9, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 40, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 y\"}\n{:process 41, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 y\"}\n{:process 33, :type :invoke, :f :append, :key \"4\", :value \"x 33 0 y\"}\n{:process 28, :type :ok, :f :put, :key \"4\", :value \"x 28 3 y\"}\n{:process 28, :type :invoke, :f :append, :key \"1\", :value \"x 28 4 y\"}\n{:process 35, :type :ok, :f :get, :key \"7\", :value \"x 28 2 y\"}\n{:process 35, :type :invoke, :f :append, :key \"5\", :value \"x 35 8 y\"}\n{:process 27, :type :ok, :f :append, :key \"7\", :value \"x 27 2 y\"}\n{:process 27, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 33, :type :ok, :f :append, :key \"4\", :value \"x 33 0 y\"}\n{:process 33, :type :invoke, :f :append, :key \"6\", :value \"x 33 1 y\"}\n{:process 35, :type :ok, :f :append, :key \"5\", :value \"x 35 8 y\"}\n{:process 35, :type :invoke, :f :append, :key \"3\", :value \"x 35 9 y\"}\n{:process 41, :type :ok, :f :get, :key \"8\", :value \"x 21 7 yx 21 8 yx 13 1 yx 21 12 yx 35 4 yx 1 1 yx 40 5 y\"}\n{:process 41, :type :invoke, :f :append, :key \"8\", :value \"x 41 7 y\"}\n{:process 28, :type :ok, :f :append, :key \"1\", :value \"x 28 4 y\"}\n{:process 28, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 y\"}\n{:process 27, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 40, :type :ok, :f :get, :key \"3\", :value \"x 20 1 yx 27 1 y\"}\n{:process 40, :type :invoke, :f :append, :key \"4\", :value \"x 40 8 y\"}\n{:process 9, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 y\"}\n{:process 9, :type :invoke, :f :append, :key \"2\", :value \"x 9 1 y\"}\n{:process 23, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 y\"}\n{:process 23, :type :invoke, :f :append, :key \"0\", :value \"x 23 0 y\"}\n{:process 31, :type :ok, :f :append, :key \"7\", :value \"x 31 1 y\"}\n{:process 31, :type :invoke, :f :append, :key \"8\", :value \"x 31 2 y\"}\n{:process 35, :type :ok, :f :append, :key \"3\", :value \"x 35 9 y\"}\n{:process 35, :type :invoke, :f :append, :key \"3\", :value \"x 35 10 y\"}\n{:process 41, :type :ok, :f :append, :key \"8\", :value \"x 41 7 y\"}\n{:process 33, :type :ok, :f :append, :key \"6\", :value \"x 33 1 y\"}\n{:process 41, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 33, :type :invoke, :f :append, :key \"5\", :value \"x 33 2 y\"}\n{:process 13, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 47 0 yx 8 1 yx 40 0 yx 12 0 yx 21 11 yx 35 3 yx 40 3 yx 28 1 yx 35 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 1 y\"}\n{:process 28, :type :ok, :f :get, :key \"7\", :value \"x 28 2 yx 27 2 yx 31 1 y\"}\n{:process 28, :type :invoke, :f :append, :key \"4\", :value \"x 28 5 y\"}\n{:process 27, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 y\"}\n{:process 27, :type :invoke, :f :append, :key \"0\", :value \"x 27 3 y\"}\n{:process 40, :type :ok, :f :append, :key \"4\", :value \"x 40 8 y\"}\n{:process 40, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"2\", :value \"x 34 1 y\"}\n{:process 34, :type :invoke, :f :append, :key \"1\", :value \"x 34 2 y\"}\n{:process 31, :type :ok, :f :append, :key \"8\", :value \"x 31 2 y\"}\n{:process 31, :type :invoke, :f :append, :key \"1\", :value \"x 31 3 y\"}\n{:process 34, :type :ok, :f :append, :key \"1\", :value \"x 34 2 y\"}\n{:process 9, :type :ok, :f :append, :key \"2\", :value \"x 9 1 y\"}\n{:process 34, :type :invoke, :f :put, :key \"4\", :value \"x 34 3 y\"}\n{:process 9, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"4\", :value \"x 28 3 yx 33 0 yx 40 8 y\"}\n{:process 49, :type :invoke, :f :append, :key \"0\", :value \"x 49 0 y\"}\n{:process 41, :type :ok, :f :get, :key \"4\", :value \"x 28 3 yx 33 0 yx 40 8 y\"}\n{:process 41, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"0\", :value \"x 23 0 y\"}\n{:process 23, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"3\", :value \"x 35 10 y\"}\n{:process 35, :type :invoke, :f :append, :key \"3\", :value \"x 35 11 y\"}\n{:process 9, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 y\"}\n{:process 9, :type :invoke, :f :append, :key \"8\", :value \"x 9 2 y\"}\n{:process 27, :type :ok, :f :append, :key \"0\", :value \"x 27 3 y\"}\n{:process 27, :type :invoke, :f :append, :key \"7\", :value \"x 27 4 y\"}\n{:process 31, :type :ok, :f :append, :key \"1\", :value \"x 31 3 y\"}\n{:process 31, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 y\"}\n{:process 41, :type :invoke, :f :append, :key \"9\", :value \"x 41 8 y\"}\n{:process 28, :type :ok, :f :append, :key \"4\", :value \"x 28 5 y\"}\n{:process 28, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"5\", :value \"x 47 0 yx 8 1 yx 40 0 yx 12 0 yx 21 11 yx 35 3 yx 40 3 yx 28 1 yx 35 8 y\"}\n{:process 23, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"7\", :value \"x 27 4 y\"}\n{:process 27, :type :invoke, :f :append, :key \"8\", :value \"x 27 5 y\"}\n{:process 40, :type :ok, :f :get, :key \"0\", :value \"x 41 6 yx 15 5 yx 39 1 yx 35 7 yx 40 7 yx 23 0 yx 27 3 yx 0 1 y\"}\n{:process 40, :type :invoke, :f :put, :key \"0\", :value \"x 40 9 y\"}\n{:process 49, :type :ok, :f :append, :key \"0\", :value \"x 49 0 y\"}\n{:process 49, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"7\", :value \"x 28 2 yx 27 2 yx 31 1 yx 27 4 y\"}\n{:process 31, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"9\", :value \"x 41 8 y\"}\n{:process 41, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 y\"}\n{:process 23, :type :invoke, :f :append, :key \"1\", :value \"x 23 1 y\"}\n{:process 35, :type :ok, :f :append, :key \"3\", :value \"x 35 11 y\"}\n{:process 35, :type :invoke, :f :append, :key \"5\", :value \"x 35 12 y\"}\n{:process 9, :type :ok, :f :append, :key \"8\", :value \"x 9 2 y\"}\n{:process 41, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 yx 15 0 yx 15 1 yx 35 6 yx 34 1 yx 9 1 y\"}\n{:process 9, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 41, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"3\", :value \"x 20 1 yx 27 1 yx 35 9 yx 35 10 yx 35 11 y\"}\n{:process 28, :type :invoke, :f :append, :key \"2\", :value \"x 28 6 y\"}\n{:process 31, :type :ok, :f :get, :key \"3\", :value \"x 20 1 yx 27 1 yx 35 9 yx 35 10 yx 35 11 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 4 y\"}\n{:process 49, :type :ok, :f :get, :key \"4\", :value \"x 34 3 y\"}\n{:process 49, :type :invoke, :f :append, :key \"0\", :value \"x 49 1 y\"}\n{:process 27, :type :ok, :f :append, :key \"8\", :value \"x 27 5 y\"}\n{:process 27, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 y\"}\n{:process 41, :type :invoke, :f :append, :key \"8\", :value \"x 41 9 y\"}\n{:process 40, :type :ok, :f :put, :key \"0\", :value \"x 40 9 y\"}\n{:process 40, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"0\", :value \"x 49 1 y\"}\n{:process 49, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"5\", :value \"x 35 12 y\"}\n{:process 35, :type :invoke, :f :put, :key \"3\", :value \"x 35 13 y\"}\n{:process 38, :type :ok, :f :get, :key \"5\", :value \"x 47 0 yx 8 1 yx 40 0 yx 12 0 yx 21 11 yx 35 3 yx 40 3 yx 28 1 yx 35 8 yx 35 12 y\"}\n{:process 38, :type :invoke, :f :append, :key \"0\", :value \"x 38 0 y\"}\n{:process 27, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 y\"}\n{:process 27, :type :invoke, :f :put, :key \"0\", :value \"x 27 6 y\"}\n{:process 38, :type :ok, :f :append, :key \"0\", :value \"x 38 0 y\"}\n{:process 38, :type :invoke, :f :append, :key \"8\", :value \"x 38 1 y\"}\n{:process 38, :type :ok, :f :append, :key \"8\", :value \"x 38 1 y\"}\n{:process 38, :type :invoke, :f :append, :key \"0\", :value \"x 38 2 y\"}\n{:process 44, :type :ok, :f :append, :key \"9\", :value \"x 44 0 y\"}\n{:process 44, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"9\", :value \"x 10 0 y\"}\n{:process 10, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"0\", :value \"x 38 2 y\"}\n{:process 38, :type :invoke, :f :append, :key \"6\", :value \"x 38 3 y\"}\n{:process 44, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 y\"}\n{:process 44, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 yx 15 0 yx 15 1 yx 35 6 yx 34 1 yx 9 1 yx 28 6 y\"}\n{:process 10, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"6\", :value \"x 38 3 y\"}\n{:process 38, :type :invoke, :f :append, :key \"7\", :value \"x 38 4 y\"}\n{:process 44, :type :ok, :f :get, :key \"8\", :value \"x 21 7 yx 21 8 yx 13 1 yx 21 12 yx 35 4 yx 1 1 yx 40 5 yx 41 7 yx 31 2 yx 9 2 yx 27 5 yx 41 9 yx 38 1 y\"}\n{:process 44, :type :invoke, :f :put, :key \"4\", :value \"x 44 1 y\"}\n{:process 8, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 3 y\"}\n{:process 10, :type :ok, :f :get, :key \"7\", :value \"x 28 2 yx 27 2 yx 31 1 yx 27 4 y\"}\n{:process 10, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"7\", :value \"x 38 4 y\"}\n{:process 38, :type :invoke, :f :append, :key \"4\", :value \"x 38 5 y\"}\n{:process 48, :type :ok, :f :get, :key \"5\", :value \"x 47 0 yx 8 1 yx 40 0 yx 12 0 yx 21 11 yx 35 3 yx 40 3 yx 28 1 yx 35 8 yx 35 12 y\"}\n{:process 48, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 3 y\"}\n{:process 8, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 44, :type :ok, :f :put, :key \"4\", :value \"x 44 1 y\"}\n{:process 44, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 yx 15 0 yx 15 1 yx 35 6 yx 34 1 yx 9 1 yx 28 6 y\"}\n{:process 10, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"4\", :value \"x 38 5 y\"}\n{:process 38, :type :invoke, :f :append, :key \"0\", :value \"x 38 6 y\"}\n{:process 8, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 y\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 4 y\"}\n{:process 44, :type :ok, :f :get, :key \"7\", :value \"x 28 2 yx 27 2 yx 31 1 yx 27 4 yx 38 4 y\"}\n{:process 44, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 48, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 y\"}\n{:process 48, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"0\", :value \"x 38 6 y\"}\n{:process 38, :type :invoke, :f :append, :key \"2\", :value \"x 38 7 y\"}\n{:process 10, :type :ok, :f :get, :key \"5\", :value \"x 47 0 yx 8 1 yx 40 0 yx 12 0 yx 21 11 yx 35 3 yx 40 3 yx 28 1 yx 35 8 yx 35 12 y\"}\n{:process 10, :type :invoke, :f :append, :key \"0\", :value \"x 10 1 y\"}\n{:process 44, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 y\"}\n{:process 44, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 48, :type :ok, :f :get, :key \"3\", :value \"x 20 1 yx 27 1 yx 35 9 yx 35 10 yx 35 11 y\"}\n{:process 48, :type :invoke, :f :append, :key \"6\", :value \"x 48 1 y\"}\n{:process 38, :type :ok, :f :append, :key \"2\", :value \"x 38 7 y\"}\n{:process 38, :type :invoke, :f :append, :key \"1\", :value \"x 38 8 y\"}\n{:process 44, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 y\"}\n{:process 44, :type :invoke, :f :append, :key \"5\", :value \"x 44 2 y\"}\n{:process 48, :type :ok, :f :append, :key \"6\", :value \"x 48 1 y\"}\n{:process 48, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"8\", :value \"x 21 12 y\"}\n{:process 21, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 y\"}\n{:process 47, :type :invoke, :f :append, :key \"8\", :value \"x 47 1 y\"}\n{:process 12, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 y\"}\n{:process 12, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"0\", :value \"x 40 9 yx 49 1 yx 38 0 yx 38 2 yx 8 3 yx 38 6 y\"}\n{:process 15, :type :invoke, :f :append, :key \"4\", :value \"x 15 6 y\"}\n{:process 44, :type :ok, :f :append, :key \"5\", :value \"x 44 2 y\"}\n{:process 44, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 30, :type :ok, :f :append, :key \"2\", :value \"x 30 0 y\"}\n{:process 30, :type :invoke, :f :append, :key \"3\", :value \"x 30 1 y\"}\n{:process 29, :type :ok, :f :put, :key \"5\", :value \"x 29 0 y\"}\n{:process 29, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 48, :type :ok, :f :get, :key \"2\", :value \"x 39 0 yx 30 0 yx 15 0 yx 15 1 yx 35 6 yx 34 1 yx 9 1 yx 28 6 yx 38 7 y\"}\n{:process 48, :type :invoke, :f :append, :key \"9\", :value \"x 48 2 y\"}\n{:process 30, :type :ok, :f :append, :key \"3\", :value \"x 30 1 y\"}\n{:process 30, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"4\", :value \"x 15 6 y\"}\n{:process 15, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"5\", :value \"x 29 0 y\"}\n{:process 12, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"3\", :value \"x 20 1 yx 27 1 yx 35 9 yx 35 10 yx 35 11 yx 30 1 y\"}\n{:process 44, :type :invoke, :f :append, :key \"4\", :value \"x 44 3 y\"}\n{:process 29, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 y\"}\n{:process 29, :type :invoke, :f :put, :key \"2\", :value \"x 29 1 y\"}\n{:process 12, :type :ok, :f :get, :key \"3\", :value \"x 20 1 yx 27 1 yx 35 9 yx 35 10 yx 35 11 yx 30 1 y\"}\n{:process 12, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 y\"}\n{:process 15, :type :invoke, :f :append, :key \"3\", :value \"x 15 7 y\"}\n{:process 44, :type :ok, :f :append, :key \"4\", :value \"x 44 3 y\"}\n{:process 44, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 29, :type :ok, :f :put, :key \"2\", :value \"x 29 1 y\"}\n{:process 29, :type :invoke, :f :append, :key \"8\", :value \"x 29 2 y\"}\n{:process 44, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 y\"}\n{:process 44, :type :invoke, :f :append, :key \"3\", :value \"x 44 4 y\"}\n{:process 29, :type :ok, :f :append, :key \"8\", :value \"x 29 2 y\"}\n{:process 29, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"3\", :value \"x 15 7 y\"}\n{:process 15, :type :invoke, :f :append, :key \"4\", :value \"x 15 8 y\"}\n{:process 5, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"7\", :value \"x 5 1 y\"}\n{:process 3, :type :ok, :f :append, :key \"8\", :value \"x 3 1 y\"}\n{:process 3, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 29, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 y\"}\n{:process 29, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 y\"}\n{:process 3, :type :invoke, :f :append, :key \"0\", :value \"x 3 2 y\"}\n{:process 44, :type :ok, :f :append, :key \"3\", :value \"x 44 4 y\"}\n{:process 44, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"0\", :value \"x 3 2 y\"}\n{:process 3, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 29, :type :ok, :f :get, :key \"7\", :value \"x 28 2 yx 27 2 yx 31 1 yx 27 4 yx 38 4 yx 5 1 y\"}\n{:process 29, :type :invoke, :f :append, :key \"2\", :value \"x 29 3 y\"}\n{:process 3, :type :ok, :f :get, :key \"5\", :value \"x 29 0 y\"}\n{:process 3, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"0\", :value \"x 7 0 y\"}\n{:process 7, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 29, :type :ok, :f :append, :key \"2\", :value \"x 29 3 y\"}\n{:process 29, :type :invoke, :f :append, :key \"2\", :value \"x 29 4 y\"}\n{:process 7, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"2\", :value \"x 7 1 y\"}\n{:process 3, :type :ok, :f :get, :key \"3\", :value \"x 20 1 yx 27 1 yx 35 9 yx 35 10 yx 35 11 yx 30 1 yx 15 7 yx 44 4 y\"}\n{:process 3, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"2\", :value \"x 7 1 y\"}\n{:process 7, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"8\", :value \"x 21 7 yx 21 8 yx 13 1 yx 21 12 yx 35 4 yx 1 1 yx 40 5 yx 41 7 yx 31 2 yx 9 2 yx 27 5 yx 41 9 yx 38 1 yx 47 1 yx 29 2 yx 3 1 y\"}\n{:process 17, :type :invoke, :f :append, :key \"2\", :value \"x 17 0 y\"}\n{:process 11, :type :ok, :f :append, :key \"8\", :value \"x 11 0 y\"}\n{:process 11, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"0\", :value \"x 40 9 yx 49 1 yx 38 0 yx 38 2 yx 8 3 yx 38 6 yx 3 2 yx 7 0 y\"}\n{:process 3, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"6\", :value \"x 19 2 y\"}\n{:process 19, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 y\"}\n{:process 7, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 26, :type :ok, :f :put, :key \"7\", :value \"x 26 0 y\"}\n{:process 26, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"0\", :value \"x 40 9 yx 49 1 yx 38 0 yx 38 2 yx 8 3 yx 38 6 yx 3 2 yx 7 0 y\"}\n{:process 19, :type :invoke, :f :append, :key \"1\", :value \"x 19 3 y\"}\n{:process 17, :type :ok, :f :append, :key \"2\", :value \"x 17 0 y\"}\n{:process 17, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 y\"}\n{:process 11, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 y\"}\n{:process 26, :type :invoke, :f :append, :key \"6\", :value \"x 26 1 y\"}\n{:process 14, :type :ok, :f :append, :key \"6\", :value \"x 14 1 y\"}\n{:process 14, :type :invoke, :f :append, :key \"8\", :value \"x 14 2 y\"}\n{:process 7, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 2 y\"}\n{:process 11, :type :ok, :f :get, :key \"0\", :value \"x 40 9 yx 49 1 yx 38 0 yx 38 2 yx 8 3 yx 38 6 yx 3 2 yx 7 0 y\"}\n{:process 14, :type :ok, :f :append, :key \"8\", :value \"x 14 2 y\"}\n{:process 14, :type :invoke, :f :append, :key \"8\", :value \"x 14 3 y\"}\n{:process 11, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 2 y\"}\n{:process 7, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"6\", :value \"x 26 1 y\"}\n{:process 26, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"0\", :value \"x 42 0 y\"}\n{:process 42, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 y\"}\n{:process 11, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"8\", :value \"x 21 7 yx 21 8 yx 13 1 yx 21 12 yx 35 4 yx 1 1 yx 40 5 yx 41 7 yx 31 2 yx 9 2 yx 27 5 yx 41 9 yx 38 1 yx 47 1 yx 29 2 yx 3 1 yx 11 0 yx 14 2 y\"}\n{:process 7, :type :invoke, :f :append, :key \"4\", :value \"x 7 3 y\"}\n{:process 26, :type :ok, :f :get, :key \"0\", :value \"x 40 9 yx 49 1 yx 38 0 yx 38 2 yx 8 3 yx 38 6 yx 3 2 yx 7 0 yx 42 0 y\"}\n{:process 26, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 yx 19 2 yx 14 1 yx 26 1 y\"}\n{:process 42, :type :invoke, :f :append, :key \"5\", :value \"x 42 1 y\"}\n{:process 43, :type :ok, :f :append, :key \"3\", :value \"x 43 0 y\"}\n{:process 43, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"8\", :value \"x 14 3 y\"}\n{:process 14, :type :invoke, :f :put, :key \"8\", :value \"x 14 4 y\"}\n{:process 7, :type :ok, :f :append, :key \"4\", :value \"x 7 3 y\"}\n{:process 7, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"5\", :value \"x 29 0 yx 7 2 y\"}\n{:process 43, :type :invoke, :f :append, :key \"0\", :value \"x 43 1 y\"}\n{:process 6, :type :ok, :f :get, :key \"5\", :value \"x 29 0 yx 7 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 1 y\"}\n{:process 26, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 y\"}\n{:process 26, :type :invoke, :f :put, :key \"5\", :value \"x 26 2 y\"}\n{:process 46, :type :ok, :f :append, :key \"9\", :value \"x 46 0 y\"}\n{:process 46, :type :invoke, :f :append, :key \"3\", :value \"x 46 1 y\"}\n{:process 14, :type :ok, :f :put, :key \"8\", :value \"x 14 4 y\"}\n{:process 14, :type :invoke, :f :append, :key \"0\", :value \"x 14 5 y\"}\n{:process 26, :type :ok, :f :put, :key \"5\", :value \"x 26 2 y\"}\n{:process 26, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"0\", :value \"x 14 5 y\"}\n{:process 14, :type :invoke, :f :append, :key \"2\", :value \"x 14 6 y\"}\n{:process 43, :type :ok, :f :append, :key \"0\", :value \"x 43 1 y\"}\n{:process 46, :type :ok, :f :append, :key \"3\", :value \"x 46 1 y\"}\n{:process 43, :type :invoke, :f :append, :key \"8\", :value \"x 43 2 y\"}\n{:process 46, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 45, :type :ok, :f :put, :key \"2\", :value \"x 45 0 y\"}\n{:process 45, :type :invoke, :f :append, :key \"8\", :value \"x 45 1 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 1 y\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 2 y\"}\n{:process 43, :type :ok, :f :append, :key \"8\", :value \"x 43 2 y\"}\n{:process 43, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 y\"}\n{:process 14, :type :ok, :f :append, :key \"2\", :value \"x 14 6 y\"}\n{:process 14, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 46, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 y\"}\n{:process 43, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 3 y\"}\n{:process 46, :type :ok, :f :get, :key \"7\", :value \"x 26 0 y\"}\n{:process 46, :type :invoke, :f :append, :key \"4\", :value \"x 46 2 y\"}\n{:process 14, :type :ok, :f :get, :key \"0\", :value \"x 40 9 yx 49 1 yx 38 0 yx 38 2 yx 8 3 yx 38 6 yx 3 2 yx 7 0 yx 42 0 yx 43 1 yx 14 5 yx 6 2 y\"}\n{:process 14, :type :invoke, :f :append, :key \"0\", :value \"x 14 7 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 3 y\"}\n{:process 6, :type :invoke, :f :append, :key \"0\", :value \"x 6 4 y\"}\n{:process 34, :type :ok, :f :put, :key \"4\", :value \"x 34 3 y\"}\n{:process 34, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 y\"}\n{:process 24, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 1 y\"}\n{:process 32, :type :ok, :f :get, :key \"3\", :value \"x 20 1 yx 27 1 yx 35 9 yx 35 10 yx 35 11 yx 30 1 yx 15 7 yx 44 4 yx 43 0 yx 46 1 y\"}\n{:process 32, :type :invoke, :f :append, :key \"4\", :value \"x 32 1 y\"}\n{:process 25, :type :ok, :f :append, :key \"7\", :value \"x 25 0 y\"}\n{:process 25, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"0\", :value \"x 6 4 y\"}\n{:process 6, :type :invoke, :f :append, :key \"3\", :value \"x 6 5 y\"}\n{:process 46, :type :ok, :f :append, :key \"4\", :value \"x 46 2 y\"}\n{:process 46, :type :invoke, :f :append, :key \"0\", :value \"x 46 3 y\"}\n{:process 34, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 y\"}\n{:process 34, :type :invoke, :f :append, :key \"7\", :value \"x 34 4 y\"}\n{:process 35, :type :ok, :f :put, :key \"3\", :value \"x 35 13 y\"}\n{:process 35, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"3\", :value \"x 35 13 y\"}\n{:process 25, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"4\", :value \"x 36 3 y\"}\n{:process 36, :type :invoke, :f :append, :key \"4\", :value \"x 36 4 y\"}\n{:process 46, :type :ok, :f :append, :key \"0\", :value \"x 46 3 y\"}\n{:process 46, :type :invoke, :f :append, :key \"8\", :value \"x 46 4 y\"}\n{:process 27, :type :ok, :f :put, :key \"0\", :value \"x 27 6 y\"}\n{:process 27, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 y\"}\n{:process 9, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"3\", :value \"x 35 13 yx 6 5 y\"}\n{:process 49, :type :invoke, :f :append, :key \"4\", :value \"x 49 2 y\"}\n{:process 35, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 y\"}\n{:process 35, :type :invoke, :f :append, :key \"1\", :value \"x 35 14 y\"}\n{:process 34, :type :ok, :f :append, :key \"7\", :value \"x 34 4 y\"}\n{:process 34, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"2\", :value \"x 28 6 y\"}\n{:process 28, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 yx 19 2 yx 14 1 yx 26 1 y\"}\n{:process 25, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 y\"}\n{:process 27, :type :invoke, :f :append, :key \"7\", :value \"x 27 7 y\"}\n{:process 41, :type :ok, :f :append, :key \"8\", :value \"x 41 9 y\"}\n{:process 41, :type :invoke, :f :append, :key \"7\", :value \"x 41 10 y\"}\n{:process 9, :type :ok, :f :get, :key \"3\", :value \"x 35 13 yx 6 5 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 3 y\"}\n{:process 23, :type :ok, :f :append, :key \"1\", :value \"x 23 1 y\"}\n{:process 23, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"7\", :value \"x 27 7 y\"}\n{:process 27, :type :invoke, :f :append, :key \"5\", :value \"x 27 8 y\"}\n{:process 35, :type :ok, :f :append, :key \"1\", :value \"x 35 14 y\"}\n{:process 35, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 34, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 y\"}\n{:process 34, :type :invoke, :f :put, :key \"2\", :value \"x 34 5 y\"}\n{:process 49, :type :ok, :f :append, :key \"4\", :value \"x 49 2 y\"}\n{:process 49, :type :invoke, :f :append, :key \"4\", :value \"x 49 3 y\"}\n{:process 23, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 y\"}\n{:process 25, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 y\"}\n{:process 23, :type :invoke, :f :append, :key \"9\", :value \"x 23 2 y\"}\n{:process 25, :type :invoke, :f :append, :key \"0\", :value \"x 25 1 y\"}\n{:process 27, :type :ok, :f :append, :key \"5\", :value \"x 27 8 y\"}\n{:process 27, :type :invoke, :f :append, :key \"7\", :value \"x 27 9 y\"}\n{:process 49, :type :ok, :f :append, :key \"4\", :value \"x 49 3 y\"}\n{:process 49, :type :invoke, :f :append, :key \"7\", :value \"x 49 4 y\"}\n{:process 41, :type :ok, :f :append, :key \"7\", :value \"x 41 10 y\"}\n{:process 41, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 y\"}\n{:process 35, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 34, :type :ok, :f :put, :key \"2\", :value \"x 34 5 y\"}\n{:process 34, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"7\", :value \"x 27 9 y\"}\n{:process 27, :type :invoke, :f :append, :key \"7\", :value \"x 27 10 y\"}\n{:process 23, :type :ok, :f :append, :key \"9\", :value \"x 23 2 y\"}\n{:process 23, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"0\", :value \"x 25 1 y\"}\n{:process 25, :type :invoke, :f :append, :key \"6\", :value \"x 25 2 y\"}\n{:process 18, :type :ok, :f :append, :key \"4\", :value \"x 18 1 y\"}\n{:process 18, :type :invoke, :f :append, :key \"2\", :value \"x 18 2 y\"}\n{:process 41, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 y\"}\n{:process 41, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 y\"}\n{:process 23, :type :invoke, :f :append, :key \"5\", :value \"x 23 3 y\"}\n{:process 35, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 y\"}\n{:process 35, :type :invoke, :f :append, :key \"1\", :value \"x 35 15 y\"}\n{:process 18, :type :ok, :f :append, :key \"2\", :value \"x 18 2 y\"}\n{:process 18, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"7\", :value \"x 27 10 y\"}\n{:process 27, :type :invoke, :f :append, :key \"8\", :value \"x 27 11 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 2 y\"}\n{:process 18, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 y\"}\n{:process 18, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"6\", :value \"x 25 2 y\"}\n{:process 25, :type :invoke, :f :append, :key \"1\", :value \"x 25 3 y\"}\n{:process 27, :type :ok, :f :append, :key \"8\", :value \"x 27 11 y\"}\n{:process 41, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 y\"}\n{:process 27, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 41, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"1\", :value \"x 25 3 y\"}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 2 y\"}\n{:process 25, :type :invoke, :f :append, :key \"0\", :value \"x 25 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 3 y\"}\n{:process 18, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 yx 19 2 yx 14 1 yx 26 1 yx 25 2 y\"}\n{:process 18, :type :invoke, :f :append, :key \"3\", :value \"x 18 3 y\"}\n{:process 39, :type :ok, :f :append, :key \"4\", :value \"x 39 3 y\"}\n{:process 39, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 y\"}\n{:process 39, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 3 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"0\", :value \"x 25 4 y\"}\n{:process 25, :type :invoke, :f :append, :key \"0\", :value \"x 25 5 y\"}\n{:process 39, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 y\"}\n{:process 39, :type :invoke, :f :append, :key \"6\", :value \"x 39 4 y\"}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 yx 25 3 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 4 y\"}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 0 y\"}\n{:process 4, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"2\", :value \"x 34 5 yx 18 2 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 3 y\"}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 3 y\"}\n{:process 3, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 y\"}\n{:process 4, :type :invoke, :f :append, :key \"1\", :value \"x 4 1 y\"}\n{:process 3, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 4 y\"}\n{:process 19, :type :ok, :f :append, :key \"1\", :value \"x 19 3 y\"}\n{:process 19, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 20, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 yx 27 8 y\"}\n{:process 20, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"1\", :value \"x 4 1 y\"}\n{:process 4, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 4 y\"}\n{:process 3, :type :invoke, :f :append, :key \"1\", :value \"x 3 5 y\"}\n{:process 20, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 y\"}\n{:process 19, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 y\"}\n{:process 20, :type :invoke, :f :append, :key \"3\", :value \"x 20 2 y\"}\n{:process 19, :type :invoke, :f :append, :key \"5\", :value \"x 19 4 y\"}\n{:process 4, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 yx 27 8 yx 3 4 y\"}\n{:process 4, :type :invoke, :f :append, :key \"7\", :value \"x 4 2 y\"}\n{:process 1, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 y\"}\n{:process 1, :type :invoke, :f :put, :key \"3\", :value \"x 1 3 y\"}\n{:process 7, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 yx 25 3 yx 4 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"6\", :value \"x 7 4 y\"}\n{:process 3, :type :ok, :f :append, :key \"1\", :value \"x 3 5 y\"}\n{:process 3, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"5\", :value \"x 42 1 y\"}\n{:process 42, :type :invoke, :f :append, :key \"3\", :value \"x 42 2 y\"}\n{:process 20, :type :ok, :f :append, :key \"3\", :value \"x 20 2 y\"}\n{:process 20, :type :invoke, :f :append, :key \"6\", :value \"x 20 3 y\"}\n{:process 17, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 yx 27 8 yx 3 4 yx 42 1 y\"}\n{:process 17, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"5\", :value \"x 19 4 y\"}\n{:process 19, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"7\", :value \"x 4 2 y\"}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 3 y\"}\n{:process 7, :type :ok, :f :append, :key \"6\", :value \"x 7 4 y\"}\n{:process 17, :type :ok, :f :get, :key \"2\", :value \"x 34 5 yx 18 2 y\"}\n{:process 17, :type :invoke, :f :append, :key \"5\", :value \"x 17 1 y\"}\n{:process 7, :type :invoke, :f :append, :key \"6\", :value \"x 7 5 y\"}\n{:process 42, :type :ok, :f :append, :key \"3\", :value \"x 42 2 y\"}\n{:process 42, :type :invoke, :f :append, :key \"2\", :value \"x 42 3 y\"}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 3 y\"}\n{:process 4, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"6\", :value \"x 20 3 y\"}\n{:process 20, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"5\", :value \"x 17 1 y\"}\n{:process 17, :type :invoke, :f :append, :key \"6\", :value \"x 17 2 y\"}\n{:process 7, :type :ok, :f :append, :key \"6\", :value \"x 7 5 y\"}\n{:process 7, :type :invoke, :f :append, :key \"6\", :value \"x 7 6 y\"}\n{:process 42, :type :ok, :f :append, :key \"2\", :value \"x 42 3 y\"}\n{:process 42, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 yx 27 8 yx 3 4 yx 42 1 yx 19 4 yx 17 1 y\"}\n{:process 13, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 20, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 y\"}\n{:process 7, :type :ok, :f :append, :key \"6\", :value \"x 7 6 y\"}\n{:process 17, :type :ok, :f :append, :key \"6\", :value \"x 17 2 y\"}\n{:process 20, :type :invoke, :f :append, :key \"1\", :value \"x 20 4 y\"}\n{:process 7, :type :invoke, :f :append, :key \"2\", :value \"x 7 7 y\"}\n{:process 17, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 y\"}\n{:process 42, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 yx 27 8 yx 3 4 yx 42 1 yx 19 4 yx 17 1 y\"}\n{:process 13, :type :invoke, :f :append, :key \"2\", :value \"x 13 2 y\"}\n{:process 42, :type :ok, :f :get, :key \"3\", :value \"x 35 13 yx 6 5 yx 3 3 yx 20 2 yx 42 2 yx 4 3 y\"}\n{:process 42, :type :invoke, :f :append, :key \"5\", :value \"x 42 4 y\"}\n{:process 7, :type :ok, :f :append, :key \"2\", :value \"x 7 7 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 8 y\"}\n{:process 20, :type :ok, :f :append, :key \"1\", :value \"x 20 4 y\"}\n{:process 20, :type :invoke, :f :append, :key \"0\", :value \"x 20 5 y\"}\n{:process 42, :type :ok, :f :append, :key \"5\", :value \"x 42 4 y\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 y\"}\n{:process 26, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 32, :type :ok, :f :append, :key \"4\", :value \"x 32 1 y\"}\n{:process 32, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"8\", :value \"x 45 1 y\"}\n{:process 24, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 y\"}\n{:process 45, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 24, :type :invoke, :f :append, :key \"8\", :value \"x 24 2 y\"}\n{:process 13, :type :ok, :f :append, :key \"2\", :value \"x 13 2 y\"}\n{:process 13, :type :invoke, :f :append, :key \"6\", :value \"x 13 3 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 8 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"6\", :value \"x 13 3 y\"}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 y\"}\n{:process 42, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 13, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"0\", :value \"x 14 7 y\"}\n{:process 14, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 yx 19 2 yx 14 1 yx 26 1 yx 25 2 yx 39 4 yx 7 4 yx 20 3 yx 7 5 yx 17 2 yx 7 6 yx 13 3 y\"}\n{:process 32, :type :invoke, :f :append, :key \"7\", :value \"x 32 2 y\"}\n{:process 20, :type :ok, :f :append, :key \"0\", :value \"x 20 5 y\"}\n{:process 20, :type :invoke, :f :append, :key \"9\", :value \"x 20 6 y\"}\n{:process 26, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 yx 27 8 yx 3 4 yx 42 1 yx 19 4 yx 17 1 yx 42 4 yx 7 8 y\"}\n{:process 26, :type :invoke, :f :append, :key \"9\", :value \"x 26 3 y\"}\n{:process 24, :type :ok, :f :append, :key \"8\", :value \"x 24 2 y\"}\n{:process 24, :type :invoke, :f :append, :key \"7\", :value \"x 24 3 y\"}\n{:process 32, :type :ok, :f :append, :key \"7\", :value \"x 32 2 y\"}\n{:process 32, :type :invoke, :f :put, :key \"6\", :value \"x 32 3 y\"}\n{:process 45, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 yx 25 3 yx 4 1 yx 3 5 yx 20 4 y\"}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 yx 27 8 yx 3 4 yx 42 1 yx 19 4 yx 17 1 yx 42 4 yx 7 8 y\"}\n{:process 45, :type :invoke, :f :append, :key \"8\", :value \"x 45 2 y\"}\n{:process 7, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 y\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 y\"}\n{:process 13, :type :invoke, :f :append, :key \"8\", :value \"x 13 4 y\"}\n{:process 14, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 y\"}\n{:process 14, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"9\", :value \"x 26 3 y\"}\n{:process 26, :type :invoke, :f :append, :key \"7\", :value \"x 26 4 y\"}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 4 y\"}\n{:process 31, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 yx 19 2 yx 14 1 yx 26 1 yx 25 2 yx 39 4 yx 7 4 yx 20 3 yx 7 5 yx 17 2 yx 7 6 yx 13 3 y\"}\n{:process 7, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"8\", :value \"x 45 2 y\"}\n{:process 45, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"7\", :value \"x 24 3 y\"}\n{:process 24, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 y\"}\n{:process 14, :type :invoke, :f :append, :key \"0\", :value \"x 14 8 y\"}\n{:process 13, :type :ok, :f :append, :key \"8\", :value \"x 13 4 y\"}\n{:process 13, :type :invoke, :f :append, :key \"8\", :value \"x 13 5 y\"}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 y\"}\n{:process 42, :type :invoke, :f :append, :key \"3\", :value \"x 42 5 y\"}\n{:process 32, :type :ok, :f :put, :key \"6\", :value \"x 32 3 y\"}\n{:process 26, :type :ok, :f :append, :key \"7\", :value \"x 26 4 y\"}\n{:process 7, :type :ok, :f :get, :key \"6\", :value \"x 19 0 yx 32 0 yx 15 2 yx 20 0 yx 28 0 yx 33 1 yx 38 3 yx 48 1 yx 19 2 yx 14 1 yx 26 1 yx 25 2 yx 39 4 yx 7 4 yx 20 3 yx 7 5 yx 17 2 yx 7 6 yx 13 3 y\"}\n{:process 26, :type :invoke, :f :append, :key \"2\", :value \"x 26 5 y\"}\n{:process 7, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 32, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"3\", :value \"x 6 5 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 6 y\"}\n{:process 14, :type :ok, :f :append, :key \"0\", :value \"x 14 8 y\"}\n{:process 14, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 y\"}\n{:process 45, :type :invoke, :f :append, :key \"4\", :value \"x 45 3 y\"}\n{:process 28, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 yx 14 8 y\"}\n{:process 28, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"6\", :value \"x 32 3 y\"}\n{:process 32, :type :invoke, :f :append, :key \"4\", :value \"x 32 4 y\"}\n{:process 13, :type :ok, :f :append, :key \"8\", :value \"x 13 5 y\"}\n{:process 13, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"3\", :value \"x 42 5 y\"}\n{:process 42, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 yx 14 8 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 5 y\"}\n{:process 14, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 y\"}\n{:process 14, :type :invoke, :f :append, :key \"6\", :value \"x 14 9 y\"}\n{:process 24, :type :ok, :f :get, :key \"2\", :value \"x 34 5 yx 18 2 yx 42 3 yx 7 7 yx 13 2 y\"}\n{:process 24, :type :invoke, :f :append, :key \"1\", :value \"x 24 4 y\"}\n{:process 42, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 yx 25 3 yx 4 1 yx 3 5 yx 20 4 y\"}\n{:process 42, :type :invoke, :f :append, :key \"3\", :value \"x 42 6 y\"}\n{:process 7, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"4\", :value \"x 45 3 y\"}\n{:process 45, :type :invoke, :f :append, :key \"9\", :value \"x 45 4 y\"}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 5 y\"}\n{:process 31, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 1 y\"}\n{:process 2, :type :invoke, :f :append, :key \"2\", :value \"x 2 2 y\"}\n{:process 32, :type :ok, :f :append, :key \"4\", :value \"x 32 4 y\"}\n{:process 32, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"2\", :value \"x 26 5 y\"}\n{:process 26, :type :invoke, :f :append, :key \"9\", :value \"x 26 6 y\"}\n{:process 28, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 yx 13 5 y\"}\n{:process 28, :type :invoke, :f :append, :key \"4\", :value \"x 28 7 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 6 y\"}\n{:process 6, :type :invoke, :f :append, :key \"7\", :value \"x 6 7 y\"}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 yx 14 8 yx 2 1 y\"}\n{:process 7, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"2\", :value \"x 2 2 y\"}\n{:process 2, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"4\", :value \"x 28 7 y\"}\n{:process 28, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"9\", :value \"x 26 6 y\"}\n{:process 26, :type :invoke, :f :append, :key \"9\", :value \"x 26 7 y\"}\n{:process 42, :type :ok, :f :append, :key \"3\", :value \"x 42 6 y\"}\n{:process 42, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"9\", :value \"x 45 4 y\"}\n{:process 45, :type :invoke, :f :append, :key \"1\", :value \"x 45 5 y\"}\n{:process 42, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 yx 14 8 yx 2 1 y\"}\n{:process 42, :type :invoke, :f :append, :key \"1\", :value \"x 42 7 y\"}\n{:process 46, :type :ok, :f :append, :key \"8\", :value \"x 46 4 y\"}\n{:process 46, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 yx 25 3 yx 4 1 yx 3 5 yx 20 4 y\"}\n{:process 31, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 y\"}\n{:process 2, :type :invoke, :f :append, :key \"7\", :value \"x 2 3 y\"}\n{:process 7, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 y\"}\n{:process 7, :type :invoke, :f :append, :key \"9\", :value \"x 7 9 y\"}\n{:process 28, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 yx 13 5 y\"}\n{:process 28, :type :invoke, :f :append, :key \"7\", :value \"x 28 8 y\"}\n{:process 6, :type :ok, :f :append, :key \"7\", :value \"x 6 7 y\"}\n{:process 6, :type :invoke, :f :append, :key \"8\", :value \"x 6 8 y\"}\n{:process 45, :type :ok, :f :append, :key \"1\", :value \"x 45 5 y\"}\n{:process 45, :type :invoke, :f :append, :key \"4\", :value \"x 45 6 y\"}\n{:process 31, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 yx 13 5 y\"}\n{:process 34, :type :ok, :f :get, :key \"6\", :value \"x 32 3 y\"}\n{:process 31, :type :invoke, :f :append, :key \"9\", :value \"x 31 6 y\"}\n{:process 34, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"9\", :value \"x 26 7 y\"}\n{:process 26, :type :invoke, :f :append, :key \"2\", :value \"x 26 8 y\"}\n{:process 28, :type :ok, :f :append, :key \"7\", :value \"x 28 8 y\"}\n{:process 28, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"6\", :value \"x 32 3 y\"}\n{:process 46, :type :invoke, :f :append, :key \"3\", :value \"x 46 5 y\"}\n{:process 42, :type :ok, :f :append, :key \"1\", :value \"x 42 7 y\"}\n{:process 7, :type :ok, :f :append, :key \"9\", :value \"x 7 9 y\"}\n{:process 42, :type :invoke, :f :append, :key \"1\", :value \"x 42 8 y\"}\n{:process 2, :type :ok, :f :append, :key \"7\", :value \"x 2 3 y\"}\n{:process 2, :type :invoke, :f :append, :key \"1\", :value \"x 2 4 y\"}\n{:process 7, :type :invoke, :f :put, :key \"2\", :value \"x 7 10 y\"}\n{:process 23, :type :ok, :f :append, :key \"5\", :value \"x 23 3 y\"}\n{:process 23, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"2\", :value \"x 26 8 y\"}\n{:process 26, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 34, :type :ok, :f :get, :key \"6\", :value \"x 32 3 y\"}\n{:process 34, :type :invoke, :f :append, :key \"6\", :value \"x 34 6 y\"}\n{:process 6, :type :ok, :f :append, :key \"8\", :value \"x 6 8 y\"}\n{:process 6, :type :invoke, :f :append, :key \"7\", :value \"x 6 9 y\"}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 3 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 4 y\"}\n{:process 46, :type :ok, :f :append, :key \"3\", :value \"x 46 5 y\"}\n{:process 46, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"4\", :value \"x 45 6 y\"}\n{:process 45, :type :invoke, :f :append, :key \"1\", :value \"x 45 7 y\"}\n{:process 26, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 yx 14 8 yx 2 1 y\"}\n{:process 26, :type :invoke, :f :append, :key \"9\", :value \"x 26 9 y\"}\n{:process 42, :type :ok, :f :append, :key \"1\", :value \"x 42 8 y\"}\n{:process 42, :type :invoke, :f :append, :key \"8\", :value \"x 42 9 y\"}\n{:process 7, :type :ok, :f :put, :key \"2\", :value \"x 7 10 y\"}\n{:process 7, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"7\", :value \"x 49 4 y\"}\n{:process 49, :type :invoke, :f :append, :key \"2\", :value \"x 49 5 y\"}\n{:process 6, :type :ok, :f :append, :key \"7\", :value \"x 6 9 y\"}\n{:process 6, :type :invoke, :f :append, :key \"6\", :value \"x 6 10 y\"}\n{:process 46, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 yx 14 8 yx 2 1 y\"}\n{:process 2, :type :ok, :f :append, :key \"1\", :value \"x 2 4 y\"}\n{:process 46, :type :invoke, :f :append, :key \"9\", :value \"x 46 6 y\"}\n{:process 2, :type :invoke, :f :append, :key \"2\", :value \"x 2 5 y\"}\n{:process 23, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 yx 25 3 yx 4 1 yx 3 5 yx 20 4 yx 45 5 yx 42 7 yx 42 8 yx 2 4 y\"}\n{:process 23, :type :invoke, :f :append, :key \"2\", :value \"x 23 4 y\"}\n{:process 49, :type :ok, :f :append, :key \"2\", :value \"x 49 5 y\"}\n{:process 45, :type :ok, :f :append, :key \"1\", :value \"x 45 7 y\"}\n{:process 49, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 45, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"8\", :value \"x 42 9 y\"}\n{:process 42, :type :invoke, :f :append, :key \"9\", :value \"x 42 10 y\"}\n{:process 7, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 yx 13 5 yx 6 8 yx 42 9 y\"}\n{:process 7, :type :invoke, :f :append, :key \"6\", :value \"x 7 11 y\"}\n{:process 26, :type :ok, :f :append, :key \"9\", :value \"x 26 9 y\"}\n{:process 26, :type :invoke, :f :append, :key \"5\", :value \"x 26 10 y\"}\n{:process 23, :type :ok, :f :append, :key \"2\", :value \"x 23 4 y\"}\n{:process 23, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"6\", :value \"x 6 10 y\"}\n{:process 6, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"9\", :value \"x 42 10 y\"}\n{:process 42, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"2\", :value \"x 2 5 y\"}\n{:process 2, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 yx 14 8 yx 2 1 y\"}\n{:process 49, :type :invoke, :f :append, :key \"5\", :value \"x 49 6 y\"}\n{:process 7, :type :ok, :f :append, :key \"6\", :value \"x 7 11 y\"}\n{:process 7, :type :invoke, :f :put, :key \"5\", :value \"x 7 12 y\"}\n{:process 45, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 yx 32 1 yx 31 5 yx 45 3 yx 32 4 yx 28 7 yx 45 6 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 8 y\"}\n{:process 27, :type :ok, :f :get, :key \"5\", :value \"x 26 2 yx 6 1 yx 6 3 yx 27 8 yx 3 4 yx 42 1 yx 19 4 yx 17 1 yx 42 4 yx 7 8 yx 6 6 yx 33 2 yx 23 3 y\"}\n{:process 27, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"2\", :value \"x 7 10 yx 49 5 yx 23 4 yx 2 5 y\"}\n{:process 23, :type :invoke, :f :append, :key \"2\", :value \"x 23 5 y\"}\n{:process 26, :type :ok, :f :append, :key \"5\", :value \"x 26 10 y\"}\n{:process 26, :type :invoke, :f :put, :key \"1\", :value \"x 26 11 y\"}\n{:process 27, :type :ok, :f :get, :key \"6\", :value \"x 32 3 yx 6 10 yx 7 11 y\"}\n{:process 27, :type :invoke, :f :append, :key \"4\", :value \"x 27 12 y\"}\n{:process 42, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 yx 32 1 yx 31 5 yx 45 3 yx 32 4 yx 28 7 yx 45 6 y\"}\n{:process 42, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 8 y\"}\n{:process 45, :type :invoke, :f :append, :key \"3\", :value \"x 45 9 y\"}\n{:process 6, :type :ok, :f :get, :key \"1\", :value \"x 21 0 yx 15 3 yx 36 1 yx 41 5 yx 36 2 yx 18 0 yx 24 0 yx 40 6 yx 28 4 yx 34 2 yx 31 3 yx 23 1 yx 22 0 yx 38 8 yx 19 3 yx 35 14 yx 25 3 yx 4 1 yx 3 5 yx 20 4 yx 45 5 yx 42 7 yx 42 8 yx 2 4 yx 45 7 y\"}\n{:process 6, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"5\", :value \"x 49 6 y\"}\n{:process 49, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 7, :type :ok, :f :put, :key \"5\", :value \"x 7 12 y\"}\n{:process 7, :type :invoke, :f :append, :key \"8\", :value \"x 7 13 y\"}\n{:process 45, :type :ok, :f :append, :key \"3\", :value \"x 45 9 y\"}\n{:process 45, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"5\", :value \"x 7 12 y\"}\n{:process 41, :type :invoke, :f :append, :key \"7\", :value \"x 41 11 y\"}\n{:process 26, :type :ok, :f :put, :key \"1\", :value \"x 26 11 y\"}\n{:process 26, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"2\", :value \"x 23 5 y\"}\n{:process 23, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 yx 13 5 yx 6 8 yx 42 9 y\"}\n{:process 45, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"1\", :value \"x 26 11 y\"}\n{:process 42, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"7\", :value \"x 41 11 y\"}\n{:process 41, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 27, :type :ok, :f :append, :key \"4\", :value \"x 27 12 y\"}\n{:process 27, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 y\"}\n{:process 23, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"1\", :value \"x 26 11 y\"}\n{:process 49, :type :invoke, :f :append, :key \"8\", :value \"x 49 7 y\"}\n{:process 7, :type :ok, :f :append, :key \"8\", :value \"x 7 13 y\"}\n{:process 7, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 yx 14 8 yx 2 1 y\"}\n{:process 45, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"5\", :value \"x 7 12 y\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"3\", :value \"x 35 13 yx 6 5 yx 3 3 yx 20 2 yx 42 2 yx 4 3 yx 42 5 yx 42 6 yx 46 5 yx 18 3 yx 45 9 y\"}\n{:process 26, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"3\", :value \"x 35 13 yx 6 5 yx 3 3 yx 20 2 yx 42 2 yx 4 3 yx 42 5 yx 42 6 yx 46 5 yx 18 3 yx 45 9 y\"}\n{:process 41, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"2\", :value \"x 7 10 yx 49 5 yx 23 4 yx 2 5 yx 23 5 y\"}\n{:process 23, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"3\", :value \"x 35 13 yx 6 5 yx 3 3 yx 20 2 yx 42 2 yx 4 3 yx 42 5 yx 42 6 yx 46 5 yx 18 3 yx 45 9 y\"}\n{:process 23, :type :invoke, :f :append, :key \"1\", :value \"x 23 6 y\"}\n{:process 45, :type :ok, :f :get, :key \"2\", :value \"x 7 10 yx 49 5 yx 23 4 yx 2 5 yx 23 5 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 10 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 yx 32 1 yx 31 5 yx 45 3 yx 32 4 yx 28 7 yx 45 6 yx 27 12 yx 0 4 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 14 y\"}\n{:process 41, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 yx 32 1 yx 31 5 yx 45 3 yx 32 4 yx 28 7 yx 45 6 yx 27 12 yx 0 4 y\"}\n{:process 41, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 48, :type :ok, :f :append, :key \"9\", :value \"x 48 2 y\"}\n{:process 48, :type :invoke, :f :append, :key \"8\", :value \"x 48 3 y\"}\n{:process 16, :type :ok, :f :get, :key \"4\", :value \"x 44 1 yx 38 5 yx 15 6 yx 44 3 yx 4 0 yx 7 3 yx 46 2 yx 36 3 yx 49 2 yx 49 3 yx 39 3 yx 32 1 yx 31 5 yx 45 3 yx 32 4 yx 28 7 yx 45 6 yx 27 12 yx 0 4 y\"}\n{:process 16, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"7\", :value \"x 5 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"5\", :value \"x 5 2 y\"}\n{:process 5, :type :ok, :f :append, :key \"5\", :value \"x 5 2 y\"}\n{:process 5, :type :invoke, :f :append, :key \"2\", :value \"x 5 3 y\"}\n{:process 16, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 y\"}\n{:process 16, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"2\", :value \"x 5 3 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"6\", :value \"x 32 3 yx 6 10 yx 7 11 y\"}\n{:process 16, :type :invoke, :f :append, :key \"6\", :value \"x 16 0 y\"}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 7 10 yx 49 5 yx 23 4 yx 2 5 yx 23 5 yx 5 3 y\"}\n{:process 5, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"4\", :value \"x 15 8 y\"}\n{:process 15, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"2\", :value \"x 7 10 yx 49 5 yx 23 4 yx 2 5 yx 23 5 yx 5 3 y\"}\n{:process 5, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"1\", :value \"x 26 11 y\"}\n{:process 15, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"6\", :value \"x 16 0 y\"}\n{:process 16, :type :invoke, :f :append, :key \"6\", :value \"x 16 1 y\"}\n{:process 5, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 yx 13 5 yx 6 8 yx 42 9 yx 7 13 yx 49 7 yx 48 3 y\"}\n{:process 5, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"6\", :value \"x 16 1 y\"}\n{:process 16, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"2\", :value \"x 7 10 yx 49 5 yx 23 4 yx 2 5 yx 23 5 yx 5 3 y\"}\n{:process 15, :type :invoke, :f :put, :key \"0\", :value \"x 15 9 y\"}\n{:process 16, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 yx 13 5 yx 6 8 yx 42 9 yx 7 13 yx 49 7 yx 48 3 y\"}\n{:process 16, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 15, :type :ok, :f :put, :key \"0\", :value \"x 15 9 y\"}\n{:process 5, :type :ok, :f :get, :key \"0\", :value \"x 27 6 yx 46 3 yx 25 1 yx 0 2 yx 25 4 yx 25 5 yx 20 5 yx 14 8 yx 2 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 4 y\"}\n{:process 15, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"5\", :value \"x 7 12 yx 5 2 y\"}\n{:process 16, :type :invoke, :f :append, :key \"2\", :value \"x 16 2 y\"}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 4 y\"}\n{:process 5, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"2\", :value \"x 16 2 y\"}\n{:process 16, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 y\"}\n{:process 5, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"0\", :value \"x 15 9 y\"}\n{:process 16, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 y\"}\n{:process 16, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 1, :type :ok, :f :put, :key \"3\", :value \"x 1 3 y\"}\n{:process 1, :type :invoke, :f :append, :key \"4\", :value \"x 1 4 y\"}\n{:process 16, :type :ok, :f :get, :key \"1\", :value \"x 26 11 y\"}\n{:process 16, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 y\"}\n{:process 19, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"4\", :value \"x 1 4 y\"}\n{:process 1, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"0\", :value \"x 15 9 y\"}\n{:process 19, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 y\"}\n{:process 4, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 y\"}\n{:process 1, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"0\", :value \"x 15 9 y\"}\n{:process 19, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"2\", :value \"x 7 10 yx 49 5 yx 23 4 yx 2 5 yx 23 5 yx 5 3 yx 16 2 y\"}\n{:process 3, :type :invoke, :f :append, :key \"8\", :value \"x 3 6 y\"}\n{:process 1, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"3\", :value \"x 1 3 y\"}\n{:process 4, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"1\", :value \"x 26 11 y\"}\n{:process 17, :type :invoke, :f :append, :key \"7\", :value \"x 17 3 y\"}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 15 9 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"2\", :value \"x 7 10 yx 49 5 yx 23 4 yx 2 5 yx 23 5 yx 5 3 yx 16 2 y\"}\n{:process 11, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"7\", :value \"x 17 3 y\"}\n{:process 17, :type :invoke, :f :append, :key \"5\", :value \"x 17 4 y\"}\n{:process 17, :type :ok, :f :append, :key \"5\", :value \"x 17 4 y\"}\n{:process 17, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 4, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 y\"}\n{:process 4, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 15 9 y\"}\n{:process 1, :type :invoke, :f :put, :key \"4\", :value \"x 1 5 y\"}\n{:process 4, :type :ok, :f :get, :key \"0\", :value \"x 15 9 y\"}\n{:process 4, :type :invoke, :f :append, :key \"6\", :value \"x 4 4 y\"}\n{:process 43, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 y\"}\n{:process 43, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"9\", :value \"x 20 6 y\"}\n{:process 20, :type :invoke, :f :append, :key \"2\", :value \"x 20 7 y\"}\n{:process 4, :type :ok, :f :append, :key \"6\", :value \"x 4 4 y\"}\n{:process 4, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 1, :type :ok, :f :put, :key \"4\", :value \"x 1 5 y\"}\n{:process 1, :type :invoke, :f :append, :key \"9\", :value \"x 1 6 y\"}\n{:process 17, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 yx 13 5 yx 6 8 yx 42 9 yx 7 13 yx 49 7 yx 48 3 y\"}\n{:process 17, :type :invoke, :f :append, :key \"1\", :value \"x 17 5 y\"}\n{:process 43, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 y\"}\n{:process 43, :type :invoke, :f :append, :key \"7\", :value \"x 43 3 y\"}\n{:process 4, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 y\"}\n{:process 4, :type :invoke, :f :put, :key \"3\", :value \"x 4 5 y\"}\n{:process 1, :type :ok, :f :append, :key \"9\", :value \"x 1 6 y\"}\n{:process 1, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"1\", :value \"x 17 5 y\"}\n{:process 17, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"4\", :value \"x 36 4 y\"}\n{:process 36, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"6\", :value \"x 14 9 y\"}\n{:process 14, :type :invoke, :f :append, :key \"0\", :value \"x 14 10 y\"}\n{:process 32, :type :ok, :f :get, :key \"6\", :value \"x 32 3 yx 6 10 yx 7 11 yx 16 0 yx 16 1 yx 4 4 yx 14 9 y\"}\n{:process 32, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 y\"}\n{:process 36, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"0\", :value \"x 14 10 y\"}\n{:process 14, :type :invoke, :f :append, :key \"2\", :value \"x 14 11 y\"}\n{:process 13, :type :ok, :f :get, :key \"0\", :value \"x 15 9 yx 14 10 y\"}\n{:process 13, :type :invoke, :f :append, :key \"1\", :value \"x 13 6 y\"}\n{:process 32, :type :ok, :f :get, :key \"5\", :value \"x 7 12 yx 5 2 yx 17 4 y\"}\n{:process 32, :type :invoke, :f :append, :key \"4\", :value \"x 32 5 y\"}\n{:process 33, :type :ok, :f :append, :key \"5\", :value \"x 33 2 y\"}\n{:process 33, :type :invoke, :f :put, :key \"0\", :value \"x 33 3 y\"}\n{:process 14, :type :ok, :f :append, :key \"2\", :value \"x 14 11 y\"}\n{:process 14, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 33, :type :ok, :f :put, :key \"0\", :value \"x 33 3 y\"}\n{:process 33, :type :invoke, :f :append, :key \"3\", :value \"x 33 4 y\"}\n{:process 36, :type :ok, :f :get, :key \"0\", :value \"x 33 3 y\"}\n{:process 36, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 40, :type :ok, :f :get, :key \"4\", :value \"x 1 5 yx 36 4 y\"}\n{:process 40, :type :invoke, :f :append, :key \"5\", :value \"x 40 10 y\"}\n{:process 32, :type :ok, :f :append, :key \"4\", :value \"x 32 5 y\"}\n{:process 32, :type :invoke, :f :append, :key \"3\", :value \"x 32 6 y\"}\n{:process 14, :type :ok, :f :get, :key \"6\", :value \"x 32 3 yx 6 10 yx 7 11 yx 16 0 yx 16 1 yx 4 4 yx 14 9 y\"}\n{:process 14, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 33, :type :ok, :f :append, :key \"3\", :value \"x 33 4 y\"}\n{:process 33, :type :invoke, :f :append, :key \"4\", :value \"x 33 5 y\"}\n{:process 32, :type :ok, :f :append, :key \"3\", :value \"x 32 6 y\"}\n{:process 32, :type :invoke, :f :append, :key \"6\", :value \"x 32 7 y\"}\n{:process 40, :type :ok, :f :append, :key \"5\", :value \"x 40 10 y\"}\n{:process 40, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"6\", :value \"x 32 3 yx 6 10 yx 7 11 yx 16 0 yx 16 1 yx 4 4 yx 14 9 y\"}\n{:process 36, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 y\"}\n{:process 28, :type :invoke, :f :append, :key \"4\", :value \"x 28 9 y\"}\n{:process 14, :type :ok, :f :get, :key \"1\", :value \"x 26 11 yx 17 5 yx 24 4 yx 13 6 y\"}\n{:process 14, :type :invoke, :f :append, :key \"6\", :value \"x 14 12 y\"}\n{:process 33, :type :ok, :f :append, :key \"4\", :value \"x 33 5 y\"}\n{:process 33, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"6\", :value \"x 34 6 y\"}\n{:process 34, :type :invoke, :f :append, :key \"5\", :value \"x 34 7 y\"}\n{:process 32, :type :ok, :f :append, :key \"6\", :value \"x 32 7 y\"}\n{:process 32, :type :invoke, :f :append, :key \"8\", :value \"x 32 8 y\"}\n{:process 31, :type :ok, :f :append, :key \"9\", :value \"x 31 6 y\"}\n{:process 31, :type :invoke, :f :put, :key \"3\", :value \"x 31 7 y\"}\n{:process 28, :type :ok, :f :append, :key \"4\", :value \"x 28 9 y\"}\n{:process 28, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 40, :type :ok, :f :get, :key \"3\", :value \"x 1 3 yx 33 4 yx 32 6 y\"}\n{:process 40, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 31, :type :ok, :f :put, :key \"3\", :value \"x 31 7 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 8 y\"}\n{:process 28, :type :ok, :f :get, :key \"0\", :value \"x 33 3 y\"}\n{:process 28, :type :invoke, :f :append, :key \"2\", :value \"x 28 10 y\"}\n{:process 34, :type :ok, :f :append, :key \"5\", :value \"x 34 7 y\"}\n{:process 32, :type :ok, :f :append, :key \"8\", :value \"x 32 8 y\"}\n{:process 34, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"6\", :value \"x 14 12 y\"}\n{:process 14, :type :invoke, :f :put, :key \"2\", :value \"x 14 13 y\"}\n{:process 32, :type :invoke, :f :append, :key \"8\", :value \"x 32 9 y\"}\n{:process 33, :type :ok, :f :get, :key \"6\", :value \"x 32 3 yx 6 10 yx 7 11 yx 16 0 yx 16 1 yx 4 4 yx 14 9 yx 34 6 yx 32 7 yx 14 12 y\"}\n{:process 33, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"9\", :value \"x 46 6 y\"}\n{:process 46, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"3\", :value \"x 31 7 y\"}\n{:process 33, :type :invoke, :f :append, :key \"5\", :value \"x 33 6 y\"}\n{:process 35, :type :ok, :f :append, :key \"1\", :value \"x 35 15 y\"}\n{:process 35, :type :invoke, :f :put, :key \"1\", :value \"x 35 16 y\"}\n{:process 40, :type :ok, :f :get, :key \"8\", :value \"x 14 4 yx 43 2 yx 45 1 yx 46 4 yx 27 11 yx 0 3 yx 24 2 yx 45 2 yx 13 4 yx 13 5 yx 6 8 yx 42 9 yx 7 13 yx 49 7 yx 48 3 yx 32 8 y\"}\n{:process 40, :type :invoke, :f :append, :key \"4\", :value \"x 40 11 y\"}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 4 y\"}\n{:process 9, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"2\", :value \"x 28 10 y\"}\n{:process 28, :type :invoke, :f :append, :key \"4\", :value \"x 28 11 y\"}\n{:process 32, :type :ok, :f :append, :key \"8\", :value \"x 32 9 y\"}\n{:process 32, :type :invoke, :f :append, :key \"3\", :value \"x 32 10 y\"}\n{:process 46, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 yx 43 3 yx 9 4 y\"}\n{:process 46, :type :invoke, :f :put, :key \"8\", :value \"x 46 7 y\"}\n{:process 33, :type :ok, :f :append, :key \"5\", :value \"x 33 6 y\"}\n{:process 33, :type :invoke, :f :append, :key \"7\", :value \"x 33 7 y\"}\n{:process 14, :type :ok, :f :put, :key \"2\", :value \"x 14 13 y\"}\n{:process 14, :type :invoke, :f :append, :key \"7\", :value \"x 14 14 y\"}\n{:process 9, :type :ok, :f :get, :key \"1\", :value \"x 26 11 yx 17 5 yx 24 4 yx 13 6 yx 35 15 y\"}\n{:process 9, :type :invoke, :f :append, :key \"6\", :value \"x 9 5 y\"}\n{:process 49, :type :ok, :f :append, :key \"8\", :value \"x 49 7 y\"}\n{:process 49, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 35, :type :ok, :f :put, :key \"1\", :value \"x 35 16 y\"}\n{:process 35, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 y\"}\n{:process 2, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 32, :type :ok, :f :append, :key \"3\", :value \"x 32 10 y\"}\n{:process 32, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 33, :type :ok, :f :append, :key \"7\", :value \"x 33 7 y\"}\n{:process 33, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"6\", :value \"x 9 5 y\"}\n{:process 9, :type :invoke, :f :append, :key \"4\", :value \"x 9 6 y\"}\n{:process 14, :type :ok, :f :append, :key \"7\", :value \"x 14 14 y\"}\n{:process 14, :type :invoke, :f :append, :key \"6\", :value \"x 14 15 y\"}\n{:process 46, :type :ok, :f :put, :key \"8\", :value \"x 46 7 y\"}\n{:process 46, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"3\", :value \"x 18 3 y\"}\n{:process 18, :type :invoke, :f :append, :key \"3\", :value \"x 18 4 y\"}\n{:process 6, :type :ok, :f :get, :key \"4\", :value \"x 1 5 yx 36 4 yx 32 5 yx 33 5 yx 28 9 yx 28 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"0\", :value \"x 33 3 y\"}\n{:process 49, :type :invoke, :f :append, :key \"0\", :value \"x 49 8 y\"}\n{:process 32, :type :ok, :f :get, :key \"2\", :value \"x 14 13 y\"}\n{:process 32, :type :invoke, :f :append, :key \"2\", :value \"x 32 11 y\"}\n{:process 35, :type :ok, :f :get, :key \"6\", :value \"x 32 3 yx 6 10 yx 7 11 yx 16 0 yx 16 1 yx 4 4 yx 14 9 yx 34 6 yx 32 7 yx 14 12 yx 9 5 y\"}\n{:process 35, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 y\"}\n{:process 26, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"6\", :value \"x 14 15 y\"}\n{:process 14, :type :invoke, :f :append, :key \"9\", :value \"x 14 16 y\"}\n{:process 18, :type :ok, :f :append, :key \"3\", :value \"x 18 4 y\"}\n{:process 18, :type :invoke, :f :put, :key \"2\", :value \"x 18 5 y\"}\n{:process 46, :type :ok, :f :get, :key \"4\", :value \"x 1 5 yx 36 4 yx 32 5 yx 33 5 yx 28 9 yx 28 11 yx 9 6 y\"}\n{:process 46, :type :invoke, :f :append, :key \"1\", :value \"x 46 8 y\"}\n{:process 6, :type :ok, :f :get, :key \"4\", :value \"x 1 5 yx 36 4 yx 32 5 yx 33 5 yx 28 9 yx 28 11 yx 9 6 y\"}\n{:process 35, :type :ok, :f :get, :key \"1\", :value \"x 35 16 y\"}\n{:process 35, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :invoke, :f :put, :key \"6\", :value \"x 6 11 y\"}\n{:process 49, :type :ok, :f :append, :key \"0\", :value \"x 49 8 y\"}\n{:process 49, :type :invoke, :f :append, :key \"8\", :value \"x 49 9 y\"}\n{:process 23, :type :ok, :f :append, :key \"1\", :value \"x 23 6 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 14 y\"}\n{:process 6, :type :ok, :f :put, :key \"6\", :value \"x 6 11 y\"}\n{:process 25, :type :ok, :f :append, :key \"0\", :value \"x 25 5 y\"}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 4 y\"}\n{:process 39, :type :ok, :f :append, :key \"6\", :value \"x 39 4 y\"}\n{:process 21, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 y\"}\n{:process 22, :type :ok, :f :append, :key \"1\", :value \"x 22 0 y\"}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 33 3 yx 49 8 yx 8 4 y\"}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 10 y\"}\n{:process 10, :type :ok, :f :append, :key \"0\", :value \"x 10 1 y\"}\n{:process 37, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 y\"}\n{:process 44, :type :ok, :f :get, :key \"5\", :value \"x 7 12 yx 5 2 yx 17 4 yx 40 10 yx 34 7 yx 33 6 yx 7 14 y\"}\n{:process 48, :type :ok, :f :append, :key \"8\", :value \"x 48 3 y\"}\n{:process 29, :type :ok, :f :append, :key \"2\", :value \"x 29 4 y\"}\n{:process 15, :type :ok, :f :get, :key \"0\", :value \"x 33 3 yx 49 8 yx 8 4 yx 10 1 y\"}\n{:process 5, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 y\"}\n{:process 19, :type :ok, :f :get, :key \"0\", :value \"x 33 3 yx 49 8 yx 8 4 yx 10 1 y\"}\n{:process 17, :type :ok, :f :get, :key \"3\", :value \"x 31 7 yx 32 10 yx 18 4 y\"}\n{:process 4, :type :ok, :f :put, :key \"3\", :value \"x 4 5 y\"}\n{:process 20, :type :ok, :f :append, :key \"2\", :value \"x 20 7 y\"}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 8 y\"}\n{:process 24, :type :ok, :f :append, :key \"1\", :value \"x 24 4 y\"}\n{:process 13, :type :ok, :f :append, :key \"1\", :value \"x 13 6 y\"}\n{:process 34, :type :ok, :f :get, :key \"2\", :value \"x 14 13 yx 32 11 y\"}\n{:process 36, :type :ok, :f :get, :key \"0\", :value \"x 33 3 yx 49 8 yx 8 4 yx 10 1 y\"}\n{:process 28, :type :ok, :f :append, :key \"4\", :value \"x 28 11 y\"}\n{:process 2, :type :ok, :f :get, :key \"3\", :value \"x 4 5 y\"}\n{:process 26, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 y\"}\n{:process 35, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 y\"}\n{:process 49, :type :ok, :f :append, :key \"8\", :value \"x 49 9 y\"}\n{:process 9, :type :ok, :f :append, :key \"4\", :value \"x 9 6 y\"}\n{:process 40, :type :ok, :f :append, :key \"4\", :value \"x 40 11 y\"}\n{:process 18, :type :ok, :f :put, :key \"2\", :value \"x 18 5 y\"}\n{:process 38, :type :ok, :f :append, :key \"1\", :value \"x 38 8 y\"}\n{:process 14, :type :ok, :f :append, :key \"9\", :value \"x 14 16 y\"}\n{:process 30, :type :ok, :f :get, :key \"0\", :value \"x 33 3 yx 49 8 yx 8 4 yx 10 1 y\"}\n{:process 46, :type :ok, :f :append, :key \"1\", :value \"x 46 8 y\"}\n{:process 33, :type :ok, :f :get, :key \"3\", :value \"x 4 5 y\"}\n{:process 41, :type :ok, :f :get, :key \"0\", :value \"x 33 3 yx 49 8 yx 8 4 yx 10 1 y\"}\n{:process 47, :type :ok, :f :append, :key \"8\", :value \"x 47 1 y\"}\n{:process 12, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 yx 43 3 yx 9 4 yx 33 7 yx 14 14 y\"}\n{:process 11, :type :ok, :f :get, :key \"5\", :value \"x 7 12 yx 5 2 yx 17 4 yx 40 10 yx 34 7 yx 33 6 yx 7 14 y\"}\n{:process 3, :type :ok, :f :append, :key \"8\", :value \"x 3 6 y\"}\n{:process 16, :type :ok, :f :get, :key \"2\", :value \"x 18 5 y\"}\n{:process 1, :type :ok, :f :get, :key \"2\", :value \"x 18 5 y\"}\n{:process 43, :type :ok, :f :append, :key \"7\", :value \"x 43 3 y\"}\n{:process 27, :type :ok, :f :get, :key \"6\", :value \"x 6 11 y\"}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 yx 43 3 yx 9 4 yx 33 7 yx 14 14 y\"}\n{:process 32, :type :ok, :f :append, :key \"2\", :value \"x 32 11 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 1, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 2, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 3, :type :invoke, :f :put, :key \"8\", :value \"x 3 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"2\", :value \"x 4 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 6, :type :invoke, :f :append, :key \"3\", :value \"x 6 0 y\"}\n{:process 7, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 22, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 10, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 11, :type :invoke, :f :append, :key \"4\", :value \"x 11 0 y\"}\n{:process 12, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 13, :type :invoke, :f :append, :key \"9\", :value \"x 13 0 y\"}\n{:process 14, :type :invoke, :f :append, :key \"1\", :value \"x 14 0 y\"}\n{:process 15, :type :invoke, :f :append, :key \"6\", :value \"x 15 0 y\"}\n{:process 16, :type :invoke, :f :append, :key \"2\", :value \"x 16 0 y\"}\n{:process 17, :type :invoke, :f :append, :key \"7\", :value \"x 17 0 y\"}\n{:process 18, :type :invoke, :f :append, :key \"7\", :value \"x 18 0 y\"}\n{:process 19, :type :invoke, :f :append, :key \"7\", :value \"x 19 0 y\"}\n{:process 20, :type :invoke, :f :append, :key \"3\", :value \"x 20 0 y\"}\n{:process 49, :type :invoke, :f :append, :key \"1\", :value \"x 49 0 y\"}\n{:process 21, :type :invoke, :f :append, :key \"3\", :value \"x 21 0 y\"}\n{:process 23, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 36, :type :invoke, :f :append, :key \"2\", :value \"x 36 0 y\"}\n{:process 37, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 24, :type :invoke, :f :append, :key \"1\", :value \"x 24 0 y\"}\n{:process 38, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 25, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 39, :type :invoke, :f :put, :key \"0\", :value \"x 39 0 y\"}\n{:process 26, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 27, :type :invoke, :f :append, :key \"3\", :value \"x 27 0 y\"}\n{:process 40, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 41, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 28, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 29, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 30, :type :invoke, :f :append, :key \"8\", :value \"x 30 0 y\"}\n{:process 43, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 31, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 32, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 44, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 33, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 45, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 34, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 46, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 35, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 47, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 48, :type :invoke, :f :append, :key \"1\", :value \"x 48 0 y\"}\n{:process 1, :type :ok, :f :get, :key \"8\", :value \"x 46 7 yx 49 9 yx 3 6 y\"}\n{:process 1, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 39, :type :ok, :f :put, :key \"0\", :value \"x 39 0 y\"}\n{:process 39, :type :invoke, :f :append, :key \"6\", :value \"x 39 1 y\"}\n{:process 24, :type :ok, :f :append, :key \"1\", :value \"x 24 0 y\"}\n{:process 24, :type :invoke, :f :append, :key \"8\", :value \"x 24 1 y\"}\n{:process 32, :type :ok, :f :get, :key \"8\", :value \"x 46 7 yx 49 9 yx 3 6 y\"}\n{:process 32, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 y\"}\n{:process 1, :type :invoke, :f :append, :key \"7\", :value \"x 1 0 y\"}\n{:process 39, :type :ok, :f :append, :key \"6\", :value \"x 39 1 y\"}\n{:process 39, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"8\", :value \"x 24 1 y\"}\n{:process 24, :type :invoke, :f :append, :key \"0\", :value \"x 24 2 y\"}\n{:process 32, :type :ok, :f :get, :key \"3\", :value \"x 4 5 y\"}\n{:process 32, :type :invoke, :f :append, :key \"6\", :value \"x 32 0 y\"}\n{:process 1, :type :ok, :f :append, :key \"7\", :value \"x 1 0 y\"}\n{:process 1, :type :invoke, :f :append, :key \"8\", :value \"x 1 1 y\"}\n{:process 32, :type :ok, :f :append, :key \"6\", :value \"x 32 0 y\"}\n{:process 32, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"0\", :value \"x 24 2 y\"}\n{:process 24, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"8\", :value \"x 1 1 y\"}\n{:process 1, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"8\", :value \"x 46 7 yx 49 9 yx 3 6 yx 24 1 yx 1 1 y\"}\n{:process 32, :type :invoke, :f :append, :key \"2\", :value \"x 32 1 y\"}\n{:process 24, :type :ok, :f :get, :key \"8\", :value \"x 46 7 yx 49 9 yx 3 6 yx 24 1 yx 1 1 y\"}\n{:process 24, :type :invoke, :f :append, :key \"6\", :value \"x 24 3 y\"}\n{:process 34, :type :ok, :f :get, :key \"8\", :value \"x 46 7 yx 49 9 yx 3 6 yx 24 1 yx 1 1 yx 30 0 y\"}\n{:process 34, :type :invoke, :f :append, :key \"1\", :value \"x 34 0 y\"}\n{:process 30, :type :ok, :f :append, :key \"8\", :value \"x 30 0 y\"}\n{:process 30, :type :invoke, :f :append, :key \"7\", :value \"x 30 1 y\"}\n{:process 32, :type :ok, :f :append, :key \"2\", :value \"x 32 1 y\"}\n{:process 32, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"6\", :value \"x 15 0 y\"}\n{:process 15, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 48, :type :ok, :f :append, :key \"1\", :value \"x 48 0 y\"}\n{:process 48, :type :invoke, :f :append, :key \"6\", :value \"x 48 1 y\"}\n{:process 30, :type :ok, :f :append, :key \"7\", :value \"x 30 1 y\"}\n{:process 30, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"1\", :value \"x 34 0 y\"}\n{:process 34, :type :invoke, :f :append, :key \"3\", :value \"x 34 1 y\"}\n{:process 35, :type :ok, :f :get, :key \"3\", :value \"x 4 5 y\"}\n{:process 15, :type :ok, :f :get, :key \"8\", :value \"x 46 7 yx 49 9 yx 3 6 yx 24 1 yx 1 1 yx 30 0 y\"}\n{:process 35, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 15, :type :invoke, :f :append, :key \"0\", :value \"x 15 1 y\"}\n{:process 23, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 yx 43 3 yx 9 4 yx 33 7 yx 14 14 yx 1 0 yx 30 1 y\"}\n{:process 23, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"6\", :value \"x 24 3 y\"}\n{:process 24, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"0\", :value \"x 39 0 yx 24 2 y\"}\n{:process 23, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 y\"}\n{:process 28, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"3\", :value \"x 34 1 y\"}\n{:process 34, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"3\", :value \"x 4 5 yx 34 1 y\"}\n{:process 30, :type :invoke, :f :append, :key \"9\", :value \"x 30 2 y\"}\n{:process 15, :type :ok, :f :append, :key \"0\", :value \"x 15 1 y\"}\n{:process 15, :type :invoke, :f :append, :key \"5\", :value \"x 15 2 y\"}\n{:process 24, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 y\"}\n{:process 24, :type :invoke, :f :append, :key \"0\", :value \"x 24 4 y\"}\n{:process 28, :type :ok, :f :get, :key \"4\", :value \"x 1 5 yx 36 4 yx 32 5 yx 33 5 yx 28 9 yx 28 11 yx 9 6 yx 31 8 yx 40 11 y\"}\n{:process 28, :type :invoke, :f :append, :key \"1\", :value \"x 28 0 y\"}\n{:process 15, :type :ok, :f :append, :key \"5\", :value \"x 15 2 y\"}\n{:process 15, :type :invoke, :f :append, :key \"8\", :value \"x 15 3 y\"}\n{:process 24, :type :ok, :f :append, :key \"0\", :value \"x 24 4 y\"}\n{:process 24, :type :invoke, :f :append, :key \"2\", :value \"x 24 5 y\"}\n{:process 28, :type :ok, :f :append, :key \"1\", :value \"x 28 0 y\"}\n{:process 28, :type :invoke, :f :append, :key \"2\", :value \"x 28 1 y\"}\n{:process 24, :type :ok, :f :append, :key \"2\", :value \"x 24 5 y\"}\n{:process 24, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"6\", :value \"x 6 11 yx 39 1 yx 32 0 yx 15 0 yx 24 3 y\"}\n{:process 7, :type :invoke, :f :append, :key \"8\", :value \"x 7 0 y\"}\n{:process 28, :type :ok, :f :append, :key \"2\", :value \"x 28 1 y\"}\n{:process 28, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"3\", :value \"x 4 5 yx 34 1 y\"}\n{:process 12, :type :invoke, :f :append, :key \"0\", :value \"x 12 0 y\"}\n{:process 15, :type :ok, :f :append, :key \"8\", :value \"x 15 3 y\"}\n{:process 15, :type :invoke, :f :append, :key \"6\", :value \"x 15 4 y\"}\n{:process 21, :type :ok, :f :append, :key \"3\", :value \"x 21 0 y\"}\n{:process 21, :type :invoke, :f :append, :key \"0\", :value \"x 21 1 y\"}\n{:process 12, :type :ok, :f :append, :key \"0\", :value \"x 12 0 y\"}\n{:process 12, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 y\"}\n{:process 22, :type :invoke, :f :append, :key \"8\", :value \"x 22 0 y\"}\n{:process 49, :type :ok, :f :append, :key \"1\", :value \"x 49 0 y\"}\n{:process 49, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"6\", :value \"x 15 4 y\"}\n{:process 15, :type :invoke, :f :put, :key \"5\", :value \"x 15 5 y\"}\n{:process 24, :type :ok, :f :get, :key \"4\", :value \"x 1 5 yx 36 4 yx 32 5 yx 33 5 yx 28 9 yx 28 11 yx 9 6 yx 31 8 yx 40 11 y\"}\n{:process 24, :type :invoke, :f :append, :key \"9\", :value \"x 24 6 y\"}\n{:process 44, :type :ok, :f :get, :key \"5\", :value \"x 7 12 yx 5 2 yx 17 4 yx 40 10 yx 34 7 yx 33 6 yx 7 14 yx 15 2 y\"}\n{:process 44, :type :invoke, :f :put, :key \"6\", :value \"x 44 0 y\"}\n{:process 21, :type :ok, :f :append, :key \"0\", :value \"x 21 1 y\"}\n{:process 21, :type :invoke, :f :append, :key \"3\", :value \"x 21 2 y\"}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 0 y\"}\n{:process 9, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 yx 43 3 yx 9 4 yx 33 7 yx 14 14 yx 1 0 yx 30 1 yx 9 0 y\"}\n{:process 12, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 y\"}\n{:process 49, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"9\", :value \"x 24 6 y\"}\n{:process 24, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 15, :type :ok, :f :put, :key \"5\", :value \"x 15 5 y\"}\n{:process 15, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"3\", :value \"x 21 2 y\"}\n{:process 22, :type :ok, :f :append, :key \"8\", :value \"x 22 0 y\"}\n{:process 21, :type :invoke, :f :append, :key \"9\", :value \"x 21 3 y\"}\n{:process 22, :type :invoke, :f :append, :key \"8\", :value \"x 22 1 y\"}\n{:process 24, :type :ok, :f :get, :key \"3\", :value \"x 4 5 yx 34 1 yx 21 0 yx 21 2 y\"}\n{:process 24, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 44, :type :ok, :f :put, :key \"6\", :value \"x 44 0 y\"}\n{:process 44, :type :invoke, :f :append, :key \"2\", :value \"x 44 1 y\"}\n{:process 9, :type :ok, :f :get, :key \"0\", :value \"x 39 0 yx 24 2 yx 15 1 yx 24 4 yx 12 0 yx 21 1 y\"}\n{:process 9, :type :invoke, :f :append, :key \"0\", :value \"x 9 1 y\"}\n{:process 24, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 y\"}\n{:process 24, :type :invoke, :f :append, :key \"6\", :value \"x 24 7 y\"}\n{:process 49, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 yx 43 3 yx 9 4 yx 33 7 yx 14 14 yx 1 0 yx 30 1 yx 9 0 y\"}\n{:process 49, :type :invoke, :f :append, :key \"2\", :value \"x 49 1 y\"}\n{:process 44, :type :ok, :f :append, :key \"2\", :value \"x 44 1 y\"}\n{:process 44, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 y\"}\n{:process 15, :type :invoke, :f :put, :key \"5\", :value \"x 15 6 y\"}\n{:process 24, :type :ok, :f :append, :key \"6\", :value \"x 24 7 y\"}\n{:process 24, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"8\", :value \"x 22 1 y\"}\n{:process 22, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"2\", :value \"x 49 1 y\"}\n{:process 49, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 15, :type :ok, :f :put, :key \"5\", :value \"x 15 6 y\"}\n{:process 15, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"5\", :value \"x 15 5 y\"}\n{:process 44, :type :invoke, :f :append, :key \"6\", :value \"x 44 2 y\"}\n{:process 3, :type :ok, :f :put, :key \"8\", :value \"x 3 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"7\", :value \"x 3 1 y\"}\n{:process 5, :type :ok, :f :get, :key \"8\", :value \"x 3 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"3\", :value \"x 4 5 yx 34 1 yx 21 0 yx 21 2 y\"}\n{:process 15, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 y\"}\n{:process 22, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 44, :type :ok, :f :append, :key \"6\", :value \"x 44 2 y\"}\n{:process 44, :type :invoke, :f :append, :key \"5\", :value \"x 44 3 y\"}\n{:process 37, :type :ok, :f :get, :key \"4\", :value \"x 1 5 yx 36 4 yx 32 5 yx 33 5 yx 28 9 yx 28 11 yx 9 6 yx 31 8 yx 40 11 y\"}\n{:process 37, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"3\", :value \"x 4 5 yx 34 1 yx 21 0 yx 21 2 y\"}\n{:process 49, :type :invoke, :f :append, :key \"6\", :value \"x 49 2 y\"}\n{:process 40, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 y\"}\n{:process 40, :type :invoke, :f :append, :key \"1\", :value \"x 40 0 y\"}\n{:process 15, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 y\"}\n{:process 15, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 44, :type :ok, :f :append, :key \"5\", :value \"x 44 3 y\"}\n{:process 44, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 y\"}\n{:process 37, :type :invoke, :f :put, :key \"4\", :value \"x 37 0 y\"}\n{:process 5, :type :ok, :f :get, :key \"8\", :value \"x 3 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"7\", :value \"x 3 1 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 2 y\"}\n{:process 49, :type :ok, :f :append, :key \"6\", :value \"x 49 2 y\"}\n{:process 49, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 37, :type :ok, :f :put, :key \"4\", :value \"x 37 0 y\"}\n{:process 37, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"7\", :value \"x 26 0 yx 25 0 yx 34 4 yx 27 7 yx 41 10 yx 9 3 yx 27 9 yx 49 4 yx 27 10 yx 4 2 yx 32 2 yx 24 3 yx 26 4 yx 6 7 yx 28 8 yx 2 3 yx 6 9 yx 45 8 yx 41 11 yx 45 10 yx 17 3 yx 43 3 yx 9 4 yx 33 7 yx 14 14 yx 1 0 yx 30 1 yx 9 0 yx 3 1 y\"}\n{:process 44, :type :invoke, :f :append, :key \"8\", :value \"x 44 4 y\"}\n{:process 22, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 y\"}\n{:process 22, :type :invoke, :f :append, :key \"2\", :value \"x 22 2 y\"}\n{:process 44, :type :ok, :f :append, :key \"8\", :value \"x 44 4 y\"}\n{:process 44, :type :invoke, :f :put, :key \"7\", :value \"x 44 5 y\"}\n{:process 15, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 y\"}\n{:process 15, :type :invoke, :f :append, :key \"0\", :value \"x 15 7 y\"}\n{:process 44, :type :ok, :f :put, :key \"7\", :value \"x 44 5 y\"}\n{:process 44, :type :invoke, :f :append, :key \"1\", :value \"x 44 6 y\"}\n{:process 37, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 y\"}\n{:process 49, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 y\"}\n{:process 37, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :invoke, :f :append, :key \"1\", :value \"x 49 3 y\"}\n{:process 15, :type :ok, :f :append, :key \"0\", :value \"x 15 7 y\"}\n{:process 15, :type :invoke, :f :append, :key \"3\", :value \"x 15 8 y\"}\n{:process 37, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 y\"}\n{:process 37, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 44, :type :ok, :f :append, :key \"1\", :value \"x 44 6 y\"}\n{:process 44, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"4\", :value \"x 37 0 y\"}\n{:process 37, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"3\", :value \"x 15 8 y\"}\n{:process 15, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 y\"}\n{:process 44, :type :invoke, :f :append, :key \"6\", :value \"x 44 7 y\"}\n{:process 37, :type :ok, :f :get, :key \"0\", :value \"x 39 0 yx 24 2 yx 15 1 yx 24 4 yx 12 0 yx 21 1 yx 15 7 y\"}\n{:process 37, :type :invoke, :f :append, :key \"7\", :value \"x 37 1 y\"}\n{:process 44, :type :ok, :f :append, :key \"6\", :value \"x 44 7 y\"}\n{:process 44, :type :invoke, :f :append, :key \"7\", :value \"x 44 8 y\"}\n{:process 15, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 y\"}\n{:process 15, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"7\", :value \"x 44 5 y\"}\n{:process 10, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 44, :type :ok, :f :append, :key \"7\", :value \"x 44 8 y\"}\n{:process 44, :type :invoke, :f :append, :key \"2\", :value \"x 44 9 y\"}\n{:process 31, :type :ok, :f :get, :key \"7\", :value \"x 44 5 yx 44 8 y\"}\n{:process 31, :type :invoke, :f :append, :key \"3\", :value \"x 31 0 y\"}\n{:process 37, :type :ok, :f :append, :key \"7\", :value \"x 37 1 y\"}\n{:process 37, :type :invoke, :f :append, :key \"1\", :value \"x 37 2 y\"}\n{:process 10, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 yx 49 3 yx 44 6 y\"}\n{:process 10, :type :invoke, :f :append, :key \"8\", :value \"x 10 0 y\"}\n{:process 44, :type :ok, :f :append, :key \"2\", :value \"x 44 9 y\"}\n{:process 44, :type :invoke, :f :append, :key \"3\", :value \"x 44 10 y\"}\n{:process 10, :type :ok, :f :append, :key \"8\", :value \"x 10 0 y\"}\n{:process 10, :type :invoke, :f :put, :key \"8\", :value \"x 10 1 y\"}\n{:process 44, :type :ok, :f :append, :key \"3\", :value \"x 44 10 y\"}\n{:process 44, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 10, :type :ok, :f :put, :key \"8\", :value \"x 10 1 y\"}\n{:process 10, :type :invoke, :f :append, :key \"8\", :value \"x 10 2 y\"}\n{:process 44, :type :ok, :f :get, :key \"3\", :value \"x 4 5 yx 34 1 yx 21 0 yx 21 2 yx 3 2 yx 15 8 yx 44 10 y\"}\n{:process 44, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"3\", :value \"x 20 0 y\"}\n{:process 20, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"7\", :value \"x 17 0 y\"}\n{:process 17, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 yx 49 3 yx 44 6 y\"}\n{:process 41, :type :invoke, :f :append, :key \"5\", :value \"x 41 0 y\"}\n{:process 20, :type :ok, :f :get, :key \"7\", :value \"x 44 5 yx 44 8 yx 37 1 yx 17 0 y\"}\n{:process 20, :type :invoke, :f :append, :key \"3\", :value \"x 20 1 y\"}\n{:process 44, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 yx 49 3 yx 44 6 y\"}\n{:process 44, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"2\", :value \"x 36 0 y\"}\n{:process 36, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 44 5 yx 44 8 yx 37 1 yx 17 0 y\"}\n{:process 42, :type :invoke, :f :append, :key \"4\", :value \"x 42 0 y\"}\n{:process 17, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 y\"}\n{:process 17, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"5\", :value \"x 41 0 y\"}\n{:process 36, :type :ok, :f :get, :key \"3\", :value \"x 4 5 yx 34 1 yx 21 0 yx 21 2 yx 3 2 yx 15 8 yx 44 10 yx 20 0 yx 27 0 y\"}\n{:process 41, :type :invoke, :f :append, :key \"0\", :value \"x 41 1 y\"}\n{:process 36, :type :invoke, :f :append, :key \"6\", :value \"x 36 1 y\"}\n{:process 44, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 yx 49 3 yx 44 6 y\"}\n{:process 44, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"0\", :value \"x 41 1 y\"}\n{:process 41, :type :invoke, :f :append, :key \"9\", :value \"x 41 2 y\"}\n{:process 17, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 y\"}\n{:process 42, :type :ok, :f :append, :key \"4\", :value \"x 42 0 y\"}\n{:process 17, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 42, :type :invoke, :f :append, :key \"3\", :value \"x 42 1 y\"}\n{:process 36, :type :ok, :f :append, :key \"6\", :value \"x 36 1 y\"}\n{:process 36, :type :invoke, :f :append, :key \"4\", :value \"x 36 2 y\"}\n{:process 17, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 yx 49 3 yx 44 6 y\"}\n{:process 17, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"9\", :value \"x 41 2 y\"}\n{:process 41, :type :invoke, :f :append, :key \"1\", :value \"x 41 3 y\"}\n{:process 4, :type :ok, :f :append, :key \"2\", :value \"x 4 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"7\", :value \"x 4 1 y\"}\n{:process 36, :type :ok, :f :append, :key \"4\", :value \"x 36 2 y\"}\n{:process 36, :type :invoke, :f :append, :key \"1\", :value \"x 36 3 y\"}\n{:process 42, :type :ok, :f :append, :key \"3\", :value \"x 42 1 y\"}\n{:process 42, :type :invoke, :f :append, :key \"1\", :value \"x 42 2 y\"}\n{:process 4, :type :ok, :f :append, :key \"7\", :value \"x 4 1 y\"}\n{:process 4, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"1\", :value \"x 36 3 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 4 y\"}\n{:process 41, :type :ok, :f :append, :key \"1\", :value \"x 41 3 y\"}\n{:process 41, :type :invoke, :f :append, :key \"3\", :value \"x 41 4 y\"}\n{:process 19, :type :ok, :f :append, :key \"7\", :value \"x 19 0 y\"}\n{:process 19, :type :invoke, :f :append, :key \"4\", :value \"x 19 1 y\"}\n{:process 17, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 y\"}\n{:process 17, :type :invoke, :f :append, :key \"6\", :value \"x 17 1 y\"}\n{:process 4, :type :ok, :f :get, :key \"0\", :value \"x 39 0 yx 24 2 yx 15 1 yx 24 4 yx 12 0 yx 21 1 yx 15 7 yx 41 1 y\"}\n{:process 4, :type :invoke, :f :append, :key \"6\", :value \"x 4 2 y\"}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 4 y\"}\n{:process 36, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 y\"}\n{:process 38, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"3\", :value \"x 41 4 y\"}\n{:process 41, :type :invoke, :f :append, :key \"2\", :value \"x 41 5 y\"}\n{:process 8, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 y\"}\n{:process 8, :type :invoke, :f :put, :key \"7\", :value \"x 8 0 y\"}\n{:process 17, :type :ok, :f :append, :key \"6\", :value \"x 17 1 y\"}\n{:process 17, :type :invoke, :f :append, :key \"2\", :value \"x 17 2 y\"}\n{:process 36, :type :ok, :f :get, :key \"0\", :value \"x 39 0 yx 24 2 yx 15 1 yx 24 4 yx 12 0 yx 21 1 yx 15 7 yx 41 1 yx 36 4 y\"}\n{:process 36, :type :invoke, :f :append, :key \"1\", :value \"x 36 5 y\"}\n{:process 41, :type :ok, :f :append, :key \"2\", :value \"x 41 5 y\"}\n{:process 41, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 8, :type :ok, :f :put, :key \"7\", :value \"x 8 0 y\"}\n{:process 8, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"1\", :value \"x 36 5 y\"}\n{:process 36, :type :invoke, :f :append, :key \"2\", :value \"x 36 6 y\"}\n{:process 36, :type :ok, :f :append, :key \"2\", :value \"x 36 6 y\"}\n{:process 36, :type :invoke, :f :append, :key \"5\", :value \"x 36 7 y\"}\n{:process 41, :type :ok, :f :get, :key \"8\", :value \"x 10 1 y\"}\n{:process 41, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"2\", :value \"x 17 2 y\"}\n{:process 17, :type :invoke, :f :append, :key \"5\", :value \"x 17 3 y\"}\n{:process 8, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 y\"}\n{:process 8, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"5\", :value \"x 17 3 y\"}\n{:process 17, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 y\"}\n{:process 46, :type :invoke, :f :append, :key \"1\", :value \"x 46 0 y\"}\n{:process 8, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 yx 49 3 yx 44 6 yx 36 3 yx 41 3 yx 36 5 y\"}\n{:process 8, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"1\", :value \"x 14 0 y\"}\n{:process 14, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 y\"}\n{:process 2, :type :invoke, :f :append, :key \"6\", :value \"x 2 0 y\"}\n{:process 47, :type :ok, :f :get, :key \"0\", :value \"x 39 0 yx 24 2 yx 15 1 yx 24 4 yx 12 0 yx 21 1 yx 15 7 yx 41 1 yx 36 4 y\"}\n{:process 47, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 yx 44 7 yx 36 1 yx 17 1 y\"}\n{:process 17, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"1\", :value \"x 46 0 y\"}\n{:process 46, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 y\"}\n{:process 17, :type :invoke, :f :append, :key \"4\", :value \"x 17 4 y\"}\n{:process 8, :type :ok, :f :get, :key \"8\", :value \"x 10 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 46, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 y\"}\n{:process 46, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"6\", :value \"x 2 0 y\"}\n{:process 2, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 yx 49 3 yx 44 6 yx 36 3 yx 41 3 yx 36 5 yx 14 0 yx 46 0 y\"}\n{:process 47, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"4\", :value \"x 17 4 y\"}\n{:process 17, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 1 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 2 y\"}\n{:process 47, :type :ok, :f :get, :key \"0\", :value \"x 39 0 yx 24 2 yx 15 1 yx 24 4 yx 12 0 yx 21 1 yx 15 7 yx 41 1 yx 36 4 y\"}\n{:process 47, :type :invoke, :f :append, :key \"2\", :value \"x 47 0 y\"}\n{:process 46, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 y\"}\n{:process 46, :type :invoke, :f :append, :key \"8\", :value \"x 46 1 y\"}\n{:process 2, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 1 y\"}\n{:process 17, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 y\"}\n{:process 17, :type :invoke, :f :append, :key \"6\", :value \"x 17 5 y\"}\n{:process 46, :type :ok, :f :append, :key \"8\", :value \"x 46 1 y\"}\n{:process 46, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 2 y\"}\n{:process 8, :type :invoke, :f :append, :key \"0\", :value \"x 8 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"2\", :value \"x 47 0 y\"}\n{:process 47, :type :invoke, :f :append, :key \"5\", :value \"x 47 1 y\"}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 1 y\"}\n{:process 2, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"7\", :value \"x 8 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 y\"}\n{:process 45, :type :invoke, :f :append, :key \"0\", :value \"x 45 0 y\"}\n{:process 8, :type :ok, :f :append, :key \"0\", :value \"x 8 3 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 4 y\"}\n{:process 17, :type :ok, :f :append, :key \"6\", :value \"x 17 5 y\"}\n{:process 17, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"7\", :value \"x 8 0 y\"}\n{:process 17, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"9\", :value \"x 0 0 y\"}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 4 y\"}\n{:process 47, :type :ok, :f :append, :key \"5\", :value \"x 47 1 y\"}\n{:process 8, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 47, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"0\", :value \"x 39 0 yx 24 2 yx 15 1 yx 24 4 yx 12 0 yx 21 1 yx 15 7 yx 41 1 yx 36 4 yx 2 1 yx 8 3 y\"}\n{:process 2, :type :invoke, :f :append, :key \"4\", :value \"x 2 2 y\"}\n{:process 47, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 y\"}\n{:process 8, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 y\"}\n{:process 47, :type :invoke, :f :append, :key \"4\", :value \"x 47 2 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 5 y\"}\n{:process 45, :type :ok, :f :append, :key \"0\", :value \"x 45 0 y\"}\n{:process 45, :type :invoke, :f :put, :key \"0\", :value \"x 45 1 y\"}\n{:process 2, :type :ok, :f :append, :key \"4\", :value \"x 2 2 y\"}\n{:process 2, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 y\"}\n{:process 26, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 5 y\"}\n{:process 8, :type :invoke, :f :append, :key \"8\", :value \"x 8 6 y\"}\n{:process 45, :type :ok, :f :put, :key \"0\", :value \"x 45 1 y\"}\n{:process 45, :type :invoke, :f :append, :key \"5\", :value \"x 45 2 y\"}\n{:process 2, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 y\"}\n{:process 2, :type :invoke, :f :append, :key \"8\", :value \"x 2 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"4\", :value \"x 47 2 y\"}\n{:process 47, :type :invoke, :f :append, :key \"0\", :value \"x 47 3 y\"}\n{:process 45, :type :ok, :f :append, :key \"5\", :value \"x 45 2 y\"}\n{:process 45, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"8\", :value \"x 2 3 y\"}\n{:process 2, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 y\"}\n{:process 45, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"8\", :value \"x 8 6 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 7 y\"}\n{:process 26, :type :ok, :f :get, :key \"0\", :value \"x 45 1 y\"}\n{:process 26, :type :invoke, :f :put, :key \"3\", :value \"x 26 0 y\"}\n{:process 47, :type :ok, :f :append, :key \"0\", :value \"x 47 3 y\"}\n{:process 47, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 2, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 yx 44 7 yx 36 1 yx 17 1 yx 2 0 yx 17 5 y\"}\n{:process 2, :type :invoke, :f :append, :key \"1\", :value \"x 2 4 y\"}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 7 y\"}\n{:process 8, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 yx 44 7 yx 36 1 yx 17 1 yx 2 0 yx 17 5 y\"}\n{:process 45, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 3 y\"}\n{:process 26, :type :ok, :f :put, :key \"3\", :value \"x 26 0 y\"}\n{:process 26, :type :invoke, :f :append, :key \"3\", :value \"x 26 1 y\"}\n{:process 47, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 y\"}\n{:process 47, :type :invoke, :f :append, :key \"3\", :value \"x 47 4 y\"}\n{:process 2, :type :ok, :f :append, :key \"1\", :value \"x 2 4 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 5 y\"}\n{:process 26, :type :ok, :f :append, :key \"3\", :value \"x 26 1 y\"}\n{:process 26, :type :invoke, :f :append, :key \"5\", :value \"x 26 2 y\"}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 3 y\"}\n{:process 45, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"3\", :value \"x 47 4 y\"}\n{:process 47, :type :invoke, :f :append, :key \"1\", :value \"x 47 5 y\"}\n{:process 29, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 y\"}\n{:process 29, :type :invoke, :f :append, :key \"0\", :value \"x 29 0 y\"}\n{:process 45, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 y\"}\n{:process 45, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"1\", :value \"x 47 5 y\"}\n{:process 47, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 y\"}\n{:process 45, :type :invoke, :f :append, :key \"5\", :value \"x 45 4 y\"}\n{:process 47, :type :ok, :f :get, :key \"1\", :value \"x 35 16 yx 46 8 yx 23 6 yx 24 0 yx 48 0 yx 34 0 yx 28 0 yx 49 0 yx 49 3 yx 44 6 yx 36 3 yx 41 3 yx 36 5 yx 14 0 yx 46 0 yx 8 2 yx 2 4 yx 47 5 y\"}\n{:process 47, :type :invoke, :f :append, :key \"4\", :value \"x 47 6 y\"}\n{:process 6, :type :ok, :f :append, :key \"3\", :value \"x 6 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"7\", :value \"x 8 0 yx 45 3 y\"}\n{:process 39, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"5\", :value \"x 45 4 y\"}\n{:process 45, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"4\", :value \"x 47 6 y\"}\n{:process 47, :type :invoke, :f :put, :key \"1\", :value \"x 47 7 y\"}\n{:process 6, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 y\"}\n{:process 45, :type :invoke, :f :append, :key \"4\", :value \"x 45 5 y\"}\n{:process 39, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 y\"}\n{:process 39, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 47, :type :ok, :f :put, :key \"1\", :value \"x 47 7 y\"}\n{:process 47, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"3\", :value \"x 26 0 yx 26 1 yx 47 4 yx 6 0 y\"}\n{:process 39, :type :invoke, :f :append, :key \"5\", :value \"x 39 2 y\"}\n{:process 23, :type :ok, :f :get, :key \"8\", :value \"x 10 1 yx 46 1 yx 2 3 yx 8 6 y\"}\n{:process 23, :type :invoke, :f :append, :key \"1\", :value \"x 23 0 y\"}\n{:process 25, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 y\"}\n{:process 25, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"4\", :value \"x 45 5 y\"}\n{:process 45, :type :invoke, :f :append, :key \"6\", :value \"x 45 6 y\"}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 y\"}\n{:process 35, :type :invoke, :f :append, :key \"7\", :value \"x 35 0 y\"}\n{:process 47, :type :ok, :f :get, :key \"3\", :value \"x 26 0 yx 26 1 yx 47 4 yx 6 0 y\"}\n{:process 47, :type :invoke, :f :append, :key \"1\", :value \"x 47 8 y\"}\n{:process 48, :type :ok, :f :append, :key \"6\", :value \"x 48 1 y\"}\n{:process 48, :type :invoke, :f :append, :key \"9\", :value \"x 48 2 y\"}\n{:process 45, :type :ok, :f :append, :key \"6\", :value \"x 45 6 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 7 y\"}\n{:process 23, :type :ok, :f :append, :key \"1\", :value \"x 23 0 y\"}\n{:process 23, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"7\", :value \"x 35 0 y\"}\n{:process 35, :type :invoke, :f :append, :key \"3\", :value \"x 35 1 y\"}\n{:process 25, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 y\"}\n{:process 25, :type :invoke, :f :append, :key \"2\", :value \"x 25 0 y\"}\n{:process 6, :type :ok, :f :get, :key \"3\", :value \"x 26 0 yx 26 1 yx 47 4 yx 6 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 1 y\"}\n{:process 25, :type :ok, :f :append, :key \"2\", :value \"x 25 0 y\"}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 7 y\"}\n{:process 25, :type :invoke, :f :append, :key \"4\", :value \"x 25 1 y\"}\n{:process 45, :type :invoke, :f :append, :key \"9\", :value \"x 45 8 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 1 y\"}\n{:process 6, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 yx 44 7 yx 36 1 yx 17 1 yx 2 0 yx 17 5 yx 48 1 yx 45 6 y\"}\n{:process 23, :type :invoke, :f :append, :key \"9\", :value \"x 23 1 y\"}\n{:process 25, :type :ok, :f :append, :key \"4\", :value \"x 25 1 y\"}\n{:process 25, :type :invoke, :f :append, :key \"1\", :value \"x 25 2 y\"}\n{:process 45, :type :ok, :f :append, :key \"9\", :value \"x 45 8 y\"}\n{:process 45, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"9\", :value \"x 23 1 y\"}\n{:process 23, :type :invoke, :f :append, :key \"6\", :value \"x 23 2 y\"}\n{:process 6, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"3\", :value \"x 6 2 y\"}\n{:process 25, :type :ok, :f :append, :key \"1\", :value \"x 25 2 y\"}\n{:process 30, :type :ok, :f :append, :key \"9\", :value \"x 30 2 y\"}\n{:process 30, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 25, :type :invoke, :f :append, :key \"2\", :value \"x 25 3 y\"}\n{:process 7, :type :ok, :f :append, :key \"8\", :value \"x 7 0 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 1 y\"}\n{:process 23, :type :ok, :f :append, :key \"6\", :value \"x 23 2 y\"}\n{:process 23, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 y\"}\n{:process 45, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 y\"}\n{:process 23, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"3\", :value \"x 6 2 y\"}\n{:process 6, :type :invoke, :f :append, :key \"1\", :value \"x 6 3 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 1 y\"}\n{:process 7, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"9\", :value \"x 21 3 y\"}\n{:process 21, :type :invoke, :f :put, :key \"3\", :value \"x 21 4 y\"}\n{:process 30, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 yx 44 7 yx 36 1 yx 17 1 yx 2 0 yx 17 5 yx 48 1 yx 45 6 yx 23 2 y\"}\n{:process 30, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"1\", :value \"x 6 3 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 yx 44 7 yx 36 1 yx 17 1 yx 2 0 yx 17 5 yx 48 1 yx 45 6 yx 23 2 y\"}\n{:process 28, :type :invoke, :f :append, :key \"6\", :value \"x 28 2 y\"}\n{:process 45, :type :ok, :f :get, :key \"3\", :value \"x 26 0 yx 26 1 yx 47 4 yx 6 0 yx 35 1 yx 6 2 y\"}\n{:process 45, :type :invoke, :f :append, :key \"9\", :value \"x 45 9 y\"}\n{:process 21, :type :ok, :f :put, :key \"3\", :value \"x 21 4 y\"}\n{:process 21, :type :invoke, :f :append, :key \"8\", :value \"x 21 5 y\"}\n{:process 12, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 y\"}\n{:process 12, :type :invoke, :f :append, :key \"8\", :value \"x 12 1 y\"}\n{:process 45, :type :ok, :f :append, :key \"9\", :value \"x 45 9 y\"}\n{:process 45, :type :invoke, :f :append, :key \"9\", :value \"x 45 10 y\"}\n{:process 24, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 y\"}\n{:process 30, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 y\"}\n{:process 24, :type :invoke, :f :append, :key \"2\", :value \"x 24 8 y\"}\n{:process 30, :type :invoke, :f :append, :key \"2\", :value \"x 30 3 y\"}\n{:process 28, :type :ok, :f :append, :key \"6\", :value \"x 28 2 y\"}\n{:process 28, :type :invoke, :f :append, :key \"5\", :value \"x 28 3 y\"}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 y\"}\n{:process 6, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"1\", :value \"x 40 0 y\"}\n{:process 40, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"8\", :value \"x 21 5 y\"}\n{:process 21, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"5\", :value \"x 28 3 y\"}\n{:process 12, :type :ok, :f :append, :key \"8\", :value \"x 12 1 y\"}\n{:process 28, :type :invoke, :f :append, :key \"5\", :value \"x 28 4 y\"}\n{:process 12, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"9\", :value \"x 45 10 y\"}\n{:process 45, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 2 y\"}\n{:process 3, :type :invoke, :f :append, :key \"5\", :value \"x 3 3 y\"}\n{:process 30, :type :ok, :f :append, :key \"2\", :value \"x 30 3 y\"}\n{:process 30, :type :invoke, :f :append, :key \"5\", :value \"x 30 4 y\"}\n{:process 24, :type :ok, :f :append, :key \"2\", :value \"x 24 8 y\"}\n{:process 24, :type :invoke, :f :append, :key \"3\", :value \"x 24 9 y\"}\n{:process 6, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 y\"}\n{:process 6, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"7\", :value \"x 8 0 yx 45 3 yx 35 0 yx 45 7 y\"}\n{:process 5, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 y\"}\n{:process 45, :type :invoke, :f :append, :key \"4\", :value \"x 45 11 y\"}\n{:process 40, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 y\"}\n{:process 40, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 y\"}\n{:process 43, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"5\", :value \"x 28 4 y\"}\n{:process 28, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 5, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 y\"}\n{:process 21, :type :invoke, :f :append, :key \"9\", :value \"x 21 6 y\"}\n{:process 3, :type :ok, :f :append, :key \"5\", :value \"x 3 3 y\"}\n{:process 3, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"2\", :value \"x 22 2 y\"}\n{:process 22, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 30, :type :ok, :f :append, :key \"5\", :value \"x 30 4 y\"}\n{:process 30, :type :invoke, :f :append, :key \"7\", :value \"x 30 5 y\"}\n{:process 24, :type :ok, :f :append, :key \"3\", :value \"x 24 9 y\"}\n{:process 24, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"9\", :value \"x 21 6 y\"}\n{:process 21, :type :invoke, :f :append, :key \"8\", :value \"x 21 7 y\"}\n{:process 5, :type :ok, :f :get, :key \"7\", :value \"x 8 0 yx 45 3 yx 35 0 yx 45 7 y\"}\n{:process 5, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 y\"}\n{:process 28, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 y\"}\n{:process 22, :type :invoke, :f :append, :key \"0\", :value \"x 22 3 y\"}\n{:process 45, :type :ok, :f :append, :key \"4\", :value \"x 45 11 y\"}\n{:process 45, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 yx 44 7 yx 36 1 yx 17 1 yx 2 0 yx 17 5 yx 48 1 yx 45 6 yx 23 2 yx 28 2 y\"}\n{:process 43, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 y\"}\n{:process 5, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 y\"}\n{:process 3, :type :invoke, :f :append, :key \"0\", :value \"x 3 4 y\"}\n{:process 5, :type :invoke, :f :append, :key \"5\", :value \"x 5 0 y\"}\n{:process 40, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 y\"}\n{:process 43, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 yx 44 7 yx 36 1 yx 17 1 yx 2 0 yx 17 5 yx 48 1 yx 45 6 yx 23 2 yx 28 2 y\"}\n{:process 40, :type :invoke, :f :append, :key \"8\", :value \"x 40 1 y\"}\n{:process 43, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"8\", :value \"x 21 7 y\"}\n{:process 21, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 y\"}\n{:process 6, :type :invoke, :f :append, :key \"6\", :value \"x 6 4 y\"}\n{:process 3, :type :ok, :f :append, :key \"0\", :value \"x 3 4 y\"}\n{:process 3, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 y\"}\n{:process 45, :type :invoke, :f :append, :key \"5\", :value \"x 45 12 y\"}\n{:process 28, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 y\"}\n{:process 28, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"5\", :value \"x 5 0 y\"}\n{:process 5, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"0\", :value \"x 22 3 y\"}\n{:process 22, :type :invoke, :f :append, :key \"2\", :value \"x 22 4 y\"}\n{:process 28, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 y\"}\n{:process 28, :type :invoke, :f :append, :key \"0\", :value \"x 28 5 y\"}\n{:process 45, :type :ok, :f :append, :key \"5\", :value \"x 45 12 y\"}\n{:process 45, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"7\", :value \"x 8 0 yx 45 3 yx 35 0 yx 45 7 y\"}\n{:process 21, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 y\"}\n{:process 43, :type :invoke, :f :append, :key \"8\", :value \"x 43 0 y\"}\n{:process 3, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 y\"}\n{:process 3, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 15, :type :ok, :f :get, :key \"8\", :value \"x 10 1 yx 46 1 yx 2 3 yx 8 6 yx 21 5 yx 12 1 yx 21 7 yx 40 1 y\"}\n{:process 15, :type :invoke, :f :append, :key \"2\", :value \"x 15 9 y\"}\n{:process 31, :type :ok, :f :append, :key \"3\", :value \"x 31 0 y\"}\n{:process 22, :type :ok, :f :append, :key \"2\", :value \"x 22 4 y\"}\n{:process 31, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 22, :type :invoke, :f :append, :key \"7\", :value \"x 22 5 y\"}\n{:process 21, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 y\"}\n{:process 21, :type :invoke, :f :append, :key \"4\", :value \"x 21 8 y\"}\n{:process 5, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 y\"}\n{:process 5, :type :invoke, :f :append, :key \"9\", :value \"x 5 1 y\"}\n{:process 3, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 y\"}\n{:process 3, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 43, :type :ok, :f :append, :key \"8\", :value \"x 43 0 y\"}\n{:process 43, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 yx 3 4 yx 22 3 y\"}\n{:process 45, :type :invoke, :f :append, :key \"2\", :value \"x 45 13 y\"}\n{:process 28, :type :ok, :f :append, :key \"0\", :value \"x 28 5 y\"}\n{:process 22, :type :ok, :f :append, :key \"7\", :value \"x 22 5 y\"}\n{:process 28, :type :invoke, :f :append, :key \"3\", :value \"x 28 6 y\"}\n{:process 22, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 yx 3 4 yx 22 3 yx 28 5 y\"}\n{:process 31, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 y\"}\n{:process 3, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"2\", :value \"x 45 13 y\"}\n{:process 45, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 y\"}\n{:process 43, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"9\", :value \"x 5 1 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 2 y\"}\n{:process 28, :type :ok, :f :append, :key \"3\", :value \"x 28 6 y\"}\n{:process 28, :type :invoke, :f :append, :key \"1\", :value \"x 28 7 y\"}\n{:process 31, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 yx 3 4 yx 22 3 yx 28 5 y\"}\n{:process 43, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 y\"}\n{:process 31, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 43, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 2 y\"}\n{:process 5, :type :invoke, :f :append, :key \"7\", :value \"x 5 3 y\"}\n{:process 22, :type :ok, :f :get, :key \"7\", :value \"x 8 0 yx 45 3 yx 35 0 yx 45 7 yx 22 5 y\"}\n{:process 22, :type :invoke, :f :put, :key \"6\", :value \"x 22 6 y\"}\n{:process 20, :type :ok, :f :append, :key \"3\", :value \"x 20 1 y\"}\n{:process 20, :type :invoke, :f :append, :key \"7\", :value \"x 20 2 y\"}\n{:process 45, :type :ok, :f :get, :key \"6\", :value \"x 44 0 yx 24 7 yx 44 2 yx 49 2 yx 44 7 yx 36 1 yx 17 1 yx 2 0 yx 17 5 yx 48 1 yx 45 6 yx 23 2 yx 28 2 y\"}\n{:process 45, :type :invoke, :f :append, :key \"9\", :value \"x 45 14 y\"}\n{:process 43, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 y\"}\n{:process 43, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 y\"}\n{:process 31, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 y\"}\n{:process 33, :type :invoke, :f :append, :key \"5\", :value \"x 33 0 y\"}\n{:process 22, :type :ok, :f :put, :key \"6\", :value \"x 22 6 y\"}\n{:process 22, :type :invoke, :f :append, :key \"9\", :value \"x 22 7 y\"}\n{:process 45, :type :ok, :f :append, :key \"9\", :value \"x 45 14 y\"}\n{:process 45, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 y\"}\n{:process 31, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"7\", :value \"x 20 2 y\"}\n{:process 20, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 y\"}\n{:process 44, :type :invoke, :f :put, :key \"3\", :value \"x 44 11 y\"}\n{:process 33, :type :ok, :f :append, :key \"5\", :value \"x 33 0 y\"}\n{:process 33, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"9\", :value \"x 22 7 y\"}\n{:process 22, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 20, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 y\"}\n{:process 20, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"7\", :value \"x 8 0 yx 45 3 yx 35 0 yx 45 7 yx 22 5 yx 20 2 y\"}\n{:process 31, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"3\", :value \"x 21 4 yx 24 9 yx 31 0 yx 28 6 yx 5 2 y\"}\n{:process 33, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 22, :type :ok, :f :get, :key \"6\", :value \"x 22 6 y\"}\n{:process 22, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 y\"}\n{:process 31, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 20, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 y\"}\n{:process 20, :type :invoke, :f :append, :key \"1\", :value \"x 20 3 y\"}\n{:process 19, :type :ok, :f :append, :key \"4\", :value \"x 19 1 y\"}\n{:process 19, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 yx 3 4 yx 22 3 yx 28 5 y\"}\n{:process 33, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 y\"}\n{:process 38, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 33, :type :invoke, :f :append, :key \"5\", :value \"x 33 1 y\"}\n{:process 31, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 y\"}\n{:process 31, :type :invoke, :f :append, :key \"5\", :value \"x 31 1 y\"}\n{:process 22, :type :ok, :f :get, :key \"7\", :value \"x 8 0 yx 45 3 yx 35 0 yx 45 7 yx 22 5 yx 20 2 y\"}\n{:process 22, :type :invoke, :f :append, :key \"2\", :value \"x 22 8 y\"}\n{:process 18, :type :ok, :f :append, :key \"7\", :value \"x 18 0 y\"}\n{:process 20, :type :ok, :f :append, :key \"1\", :value \"x 20 3 y\"}\n{:process 18, :type :invoke, :f :append, :key \"9\", :value \"x 18 1 y\"}\n{:process 20, :type :invoke, :f :append, :key \"6\", :value \"x 20 4 y\"}\n{:process 33, :type :ok, :f :append, :key \"5\", :value \"x 33 1 y\"}\n{:process 33, :type :invoke, :f :append, :key \"1\", :value \"x 33 2 y\"}\n{:process 38, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 y\"}\n{:process 38, :type :invoke, :f :append, :key \"0\", :value \"x 38 0 y\"}\n{:process 42, :type :ok, :f :append, :key \"1\", :value \"x 42 2 y\"}\n{:process 42, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"6\", :value \"x 20 4 y\"}\n{:process 20, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"5\", :value \"x 31 1 y\"}\n{:process 31, :type :invoke, :f :append, :key \"0\", :value \"x 31 2 y\"}\n{:process 18, :type :ok, :f :append, :key \"9\", :value \"x 18 1 y\"}\n{:process 18, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"6\", :value \"x 4 2 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 3 y\"}\n{:process 16, :type :ok, :f :append, :key \"2\", :value \"x 16 0 y\"}\n{:process 16, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 y\"}\n{:process 42, :type :invoke, :f :append, :key \"9\", :value \"x 42 3 y\"}\n{:process 16, :type :ok, :f :get, :key \"3\", :value \"x 21 4 yx 24 9 yx 31 0 yx 28 6 yx 5 2 y\"}\n{:process 16, :type :invoke, :f :append, :key \"9\", :value \"x 16 1 y\"}\n{:process 31, :type :ok, :f :append, :key \"0\", :value \"x 31 2 y\"}\n{:process 31, :type :invoke, :f :append, :key \"2\", :value \"x 31 3 y\"}\n{:process 20, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 y\"}\n{:process 20, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"6\", :value \"x 22 6 yx 20 4 yx 4 2 y\"}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 3 y\"}\n{:process 18, :type :invoke, :f :append, :key \"1\", :value \"x 18 2 y\"}\n{:process 4, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"0\", :value \"x 38 0 y\"}\n{:process 38, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"9\", :value \"x 42 3 y\"}\n{:process 42, :type :invoke, :f :append, :key \"5\", :value \"x 42 4 y\"}\n{:process 41, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 y\"}\n{:process 41, :type :invoke, :f :put, :key \"8\", :value \"x 41 6 y\"}\n{:process 4, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 yx 3 4 yx 22 3 yx 28 5 yx 31 2 yx 38 0 y\"}\n{:process 4, :type :invoke, :f :append, :key \"1\", :value \"x 4 4 y\"}\n{:process 16, :type :ok, :f :append, :key \"9\", :value \"x 16 1 y\"}\n{:process 16, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"5\", :value \"x 36 7 y\"}\n{:process 36, :type :invoke, :f :append, :key \"4\", :value \"x 36 8 y\"}\n{:process 18, :type :ok, :f :append, :key \"1\", :value \"x 18 2 y\"}\n{:process 18, :type :invoke, :f :append, :key \"5\", :value \"x 18 3 y\"}\n{:process 41, :type :ok, :f :put, :key \"8\", :value \"x 41 6 y\"}\n{:process 41, :type :invoke, :f :append, :key \"7\", :value \"x 41 7 y\"}\n{:process 36, :type :ok, :f :append, :key \"4\", :value \"x 36 8 y\"}\n{:process 36, :type :invoke, :f :append, :key \"7\", :value \"x 36 9 y\"}\n{:process 4, :type :ok, :f :append, :key \"1\", :value \"x 4 4 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 5 y\"}\n{:process 16, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 y\"}\n{:process 16, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"7\", :value \"x 8 0 yx 45 3 yx 35 0 yx 45 7 yx 22 5 yx 20 2 yx 18 0 y\"}\n{:process 14, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"5\", :value \"x 18 3 y\"}\n{:process 18, :type :invoke, :f :append, :key \"0\", :value \"x 18 4 y\"}\n{:process 18, :type :ok, :f :append, :key \"0\", :value \"x 18 4 y\"}\n{:process 36, :type :ok, :f :append, :key \"7\", :value \"x 36 9 y\"}\n{:process 18, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 36, :type :invoke, :f :append, :key \"3\", :value \"x 36 10 y\"}\n{:process 41, :type :ok, :f :append, :key \"7\", :value \"x 41 7 y\"}\n{:process 41, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 y\"}\n{:process 16, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 5 y\"}\n{:process 4, :type :invoke, :f :append, :key \"9\", :value \"x 4 6 y\"}\n{:process 11, :type :ok, :f :append, :key \"4\", :value \"x 11 0 y\"}\n{:process 11, :type :invoke, :f :append, :key \"4\", :value \"x 11 1 y\"}\n{:process 14, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 yx 18 3 y\"}\n{:process 14, :type :invoke, :f :append, :key \"4\", :value \"x 14 1 y\"}\n{:process 18, :type :ok, :f :get, :key \"7\", :value \"x 8 0 yx 45 3 yx 35 0 yx 45 7 yx 22 5 yx 20 2 yx 18 0 yx 41 7 yx 36 9 y\"}\n{:process 18, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"3\", :value \"x 36 10 y\"}\n{:process 36, :type :invoke, :f :append, :key \"1\", :value \"x 36 11 y\"}\n{:process 11, :type :ok, :f :append, :key \"4\", :value \"x 11 1 y\"}\n{:process 11, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 y\"}\n{:process 18, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"3\", :value \"x 21 4 yx 24 9 yx 31 0 yx 28 6 yx 5 2 yx 36 10 y\"}\n{:process 41, :type :invoke, :f :append, :key \"3\", :value \"x 41 8 y\"}\n{:process 16, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 yx 4 3 yx 36 8 yx 4 5 yx 11 0 yx 11 1 y\"}\n{:process 16, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"4\", :value \"x 14 1 y\"}\n{:process 14, :type :invoke, :f :append, :key \"7\", :value \"x 14 2 y\"}\n{:process 4, :type :ok, :f :append, :key \"9\", :value \"x 4 6 y\"}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 7 y\"}\n{:process 0, :type :ok, :f :append, :key \"9\", :value \"x 0 0 y\"}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 11, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 yx 18 3 y\"}\n{:process 17, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 y\"}\n{:process 17, :type :invoke, :f :append, :key \"4\", :value \"x 17 6 y\"}\n{:process 11, :type :invoke, :f :append, :key \"8\", :value \"x 11 2 y\"}\n{:process 14, :type :ok, :f :append, :key \"7\", :value \"x 14 2 y\"}\n{:process 14, :type :invoke, :f :append, :key \"2\", :value \"x 14 3 y\"}\n{:process 41, :type :ok, :f :append, :key \"3\", :value \"x 41 8 y\"}\n{:process 41, :type :invoke, :f :append, :key \"9\", :value \"x 41 9 y\"}\n{:process 18, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 yx 18 3 y\"}\n{:process 18, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 7 y\"}\n{:process 4, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"x 41 6 y\"}\n{:process 0, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"8\", :value \"x 11 2 y\"}\n{:process 11, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"4\", :value \"x 17 6 y\"}\n{:process 17, :type :invoke, :f :append, :key \"1\", :value \"x 17 7 y\"}\n{:process 11, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 y\"}\n{:process 11, :type :invoke, :f :append, :key \"2\", :value \"x 11 3 y\"}\n{:process 41, :type :ok, :f :append, :key \"9\", :value \"x 41 9 y\"}\n{:process 41, :type :invoke, :f :append, :key \"6\", :value \"x 41 10 y\"}\n{:process 12, :type :ok, :f :get, :key \"6\", :value \"x 22 6 yx 20 4 yx 4 2 yx 41 10 y\"}\n{:process 12, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 y\"}\n{:process 24, :type :invoke, :f :append, :key \"9\", :value \"x 24 10 y\"}\n{:process 34, :type :ok, :f :get, :key \"3\", :value \"x 21 4 yx 24 9 yx 31 0 yx 28 6 yx 5 2 yx 36 10 yx 41 8 yx 4 7 y\"}\n{:process 34, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"9\", :value \"x 24 10 y\"}\n{:process 24, :type :invoke, :f :put, :key \"6\", :value \"x 24 11 y\"}\n{:process 16, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 y\"}\n{:process 16, :type :invoke, :f :append, :key \"5\", :value \"x 16 2 y\"}\n{:process 13, :type :ok, :f :append, :key \"9\", :value \"x 13 0 y\"}\n{:process 13, :type :invoke, :f :append, :key \"6\", :value \"x 13 1 y\"}\n{:process 46, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 y\"}\n{:process 46, :type :invoke, :f :append, :key \"0\", :value \"x 46 2 y\"}\n{:process 16, :type :ok, :f :append, :key \"5\", :value \"x 16 2 y\"}\n{:process 16, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 24, :type :ok, :f :put, :key \"6\", :value \"x 24 11 y\"}\n{:process 24, :type :invoke, :f :append, :key \"9\", :value \"x 24 12 y\"}\n{:process 45, :type :ok, :f :get, :key \"6\", :value \"x 24 11 yx 13 1 y\"}\n{:process 45, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"1\", :value \"x 17 7 y\"}\n{:process 17, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"0\", :value \"x 46 2 y\"}\n{:process 46, :type :invoke, :f :append, :key \"0\", :value \"x 46 3 y\"}\n{:process 28, :type :ok, :f :append, :key \"1\", :value \"x 28 7 y\"}\n{:process 32, :type :ok, :f :get, :key \"8\", :value \"x 41 6 yx 11 2 y\"}\n{:process 28, :type :invoke, :f :append, :key \"6\", :value \"x 28 8 y\"}\n{:process 32, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"9\", :value \"x 24 12 y\"}\n{:process 24, :type :invoke, :f :append, :key \"5\", :value \"x 24 13 y\"}\n{:process 45, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 y\"}\n{:process 45, :type :invoke, :f :append, :key \"1\", :value \"x 45 15 y\"}\n{:process 18, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 yx 18 3 yx 16 2 y\"}\n{:process 18, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"5\", :value \"x 24 13 y\"}\n{:process 24, :type :invoke, :f :put, :key \"7\", :value \"x 24 14 y\"}\n{:process 17, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 yx 3 4 yx 22 3 yx 28 5 yx 31 2 yx 38 0 yx 18 4 yx 46 2 y\"}\n{:process 17, :type :invoke, :f :append, :key \"2\", :value \"x 17 8 y\"}\n{:process 45, :type :ok, :f :append, :key \"1\", :value \"x 45 15 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 16 y\"}\n{:process 49, :type :ok, :f :append, :key \"1\", :value \"x 49 3 y\"}\n{:process 49, :type :invoke, :f :put, :key \"6\", :value \"x 49 4 y\"}\n{:process 17, :type :ok, :f :append, :key \"2\", :value \"x 17 8 y\"}\n{:process 17, :type :invoke, :f :append, :key \"9\", :value \"x 17 9 y\"}\n{:process 18, :type :ok, :f :get, :key \"3\", :value \"x 21 4 yx 24 9 yx 31 0 yx 28 6 yx 5 2 yx 36 10 yx 41 8 yx 4 7 y\"}\n{:process 18, :type :invoke, :f :append, :key \"6\", :value \"x 18 5 y\"}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 16 y\"}\n{:process 45, :type :invoke, :f :append, :key \"6\", :value \"x 45 17 y\"}\n{:process 24, :type :ok, :f :put, :key \"7\", :value \"x 24 14 y\"}\n{:process 24, :type :invoke, :f :append, :key \"4\", :value \"x 24 15 y\"}\n{:process 49, :type :ok, :f :put, :key \"6\", :value \"x 49 4 y\"}\n{:process 49, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"7\", :value \"x 24 14 y\"}\n{:process 3, :type :invoke, :f :append, :key \"9\", :value \"x 3 5 y\"}\n{:process 17, :type :ok, :f :append, :key \"9\", :value \"x 17 9 y\"}\n{:process 17, :type :invoke, :f :append, :key \"1\", :value \"x 17 10 y\"}\n{:process 49, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 y\"}\n{:process 49, :type :invoke, :f :append, :key \"6\", :value \"x 49 5 y\"}\n{:process 24, :type :ok, :f :append, :key \"4\", :value \"x 24 15 y\"}\n{:process 24, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"6\", :value \"x 45 17 y\"}\n{:process 45, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"9\", :value \"x 3 5 y\"}\n{:process 3, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"1\", :value \"x 17 10 y\"}\n{:process 17, :type :invoke, :f :append, :key \"9\", :value \"x 17 11 y\"}\n{:process 49, :type :ok, :f :append, :key \"6\", :value \"x 49 5 y\"}\n{:process 49, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 yx 18 3 yx 16 2 yx 24 13 y\"}\n{:process 0, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 y\"}\n{:process 24, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"6\", :value \"x 49 4 yx 45 17 yx 49 5 y\"}\n{:process 3, :type :invoke, :f :append, :key \"8\", :value \"x 3 6 y\"}\n{:process 21, :type :ok, :f :append, :key \"4\", :value \"x 21 8 y\"}\n{:process 21, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 yx 4 3 yx 36 8 yx 4 5 yx 11 0 yx 11 1 yx 14 1 yx 17 6 yx 24 15 yx 21 8 y\"}\n{:process 0, :type :invoke, :f :put, :key \"6\", :value \"x 0 1 y\"}\n{:process 45, :type :ok, :f :get, :key \"6\", :value \"x 49 4 yx 45 17 yx 49 5 y\"}\n{:process 45, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"8\", :value \"x 3 6 y\"}\n{:process 3, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"9\", :value \"x 17 11 y\"}\n{:process 17, :type :invoke, :f :append, :key \"2\", :value \"x 17 12 y\"}\n{:process 24, :type :ok, :f :get, :key \"3\", :value \"x 21 4 yx 24 9 yx 31 0 yx 28 6 yx 5 2 yx 36 10 yx 41 8 yx 4 7 y\"}\n{:process 24, :type :invoke, :f :append, :key \"8\", :value \"x 24 16 y\"}\n{:process 49, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 yx 18 3 yx 16 2 yx 24 13 y\"}\n{:process 49, :type :invoke, :f :append, :key \"8\", :value \"x 49 6 y\"}\n{:process 11, :type :ok, :f :append, :key \"2\", :value \"x 11 3 y\"}\n{:process 11, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"3\", :value \"x 21 4 yx 24 9 yx 31 0 yx 28 6 yx 5 2 yx 36 10 yx 41 8 yx 4 7 y\"}\n{:process 21, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"8\", :value \"x 41 6 yx 11 2 yx 3 6 y\"}\n{:process 38, :type :invoke, :f :append, :key \"9\", :value \"x 38 1 y\"}\n{:process 0, :type :ok, :f :put, :key \"6\", :value \"x 0 1 y\"}\n{:process 0, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"6\", :value \"x 6 4 y\"}\n{:process 6, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 y\"}\n{:process 45, :type :invoke, :f :append, :key \"0\", :value \"x 45 18 y\"}\n{:process 27, :type :ok, :f :append, :key \"3\", :value \"x 27 0 y\"}\n{:process 27, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"7\", :value \"x 24 14 y\"}\n{:process 21, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"8\", :value \"x 49 6 y\"}\n{:process 49, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"9\", :value \"x 38 1 y\"}\n{:process 38, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 y\"}\n{:process 0, :type :invoke, :f :append, :key \"2\", :value \"x 0 2 y\"}\n{:process 24, :type :ok, :f :append, :key \"8\", :value \"x 24 16 y\"}\n{:process 24, :type :invoke, :f :append, :key \"6\", :value \"x 24 17 y\"}\n{:process 9, :type :ok, :f :append, :key \"0\", :value \"x 9 1 y\"}\n{:process 9, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 y\"}\n{:process 49, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"0\", :value \"x 45 18 y\"}\n{:process 45, :type :invoke, :f :append, :key \"6\", :value \"x 45 19 y\"}\n{:process 24, :type :ok, :f :append, :key \"6\", :value \"x 24 17 y\"}\n{:process 24, :type :invoke, :f :append, :key \"7\", :value \"x 24 18 y\"}\n{:process 15, :type :ok, :f :append, :key \"2\", :value \"x 15 9 y\"}\n{:process 21, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 yx 4 3 yx 36 8 yx 4 5 yx 11 0 yx 11 1 yx 14 1 yx 17 6 yx 24 15 yx 21 8 y\"}\n{:process 15, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 21, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 27, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 yx 4 3 yx 36 8 yx 4 5 yx 11 0 yx 11 1 yx 14 1 yx 17 6 yx 24 15 yx 21 8 y\"}\n{:process 27, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 yx 4 3 yx 36 8 yx 4 5 yx 11 0 yx 11 1 yx 14 1 yx 17 6 yx 24 15 yx 21 8 y\"}\n{:process 0, :type :ok, :f :append, :key \"2\", :value \"x 0 2 y\"}\n{:process 38, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 0, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 10, :type :ok, :f :append, :key \"8\", :value \"x 10 2 y\"}\n{:process 10, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"7\", :value \"x 24 18 y\"}\n{:process 24, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 yx 3 4 yx 22 3 yx 28 5 yx 31 2 yx 38 0 yx 18 4 yx 46 2 yx 46 3 yx 9 1 yx 45 18 y\"}\n{:process 27, :type :ok, :f :get, :key \"8\", :value \"x 41 6 yx 11 2 yx 3 6 yx 49 6 yx 24 16 y\"}\n{:process 10, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 27, :type :invoke, :f :append, :key \"6\", :value \"x 27 1 y\"}\n{:process 0, :type :ok, :f :get, :key \"8\", :value \"x 41 6 yx 11 2 yx 3 6 yx 49 6 yx 24 16 y\"}\n{:process 0, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 y\"}\n{:process 21, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 1, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 y\"}\n{:process 1, :type :invoke, :f :put, :key \"4\", :value \"x 1 2 y\"}\n{:process 15, :type :ok, :f :get, :key \"4\", :value \"x 37 0 yx 42 0 yx 36 2 yx 19 1 yx 17 4 yx 2 2 yx 47 2 yx 47 6 yx 45 5 yx 25 1 yx 45 11 yx 4 3 yx 36 8 yx 4 5 yx 11 0 yx 11 1 yx 14 1 yx 17 6 yx 24 15 yx 21 8 y\"}\n{:process 15, :type :invoke, :f :append, :key \"6\", :value \"x 15 10 y\"}\n{:process 27, :type :ok, :f :append, :key \"6\", :value \"x 27 1 y\"}\n{:process 38, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 y\"}\n{:process 27, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 38, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 yx 3 4 yx 22 3 yx 28 5 yx 31 2 yx 38 0 yx 18 4 yx 46 2 yx 46 3 yx 9 1 yx 45 18 y\"}\n{:process 24, :type :invoke, :f :append, :key \"0\", :value \"x 24 19 y\"}\n{:process 27, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 y\"}\n{:process 27, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 y\"}\n{:process 38, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 21, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 yx 18 3 yx 16 2 yx 24 13 y\"}\n{:process 21, :type :invoke, :f :append, :key \"8\", :value \"x 21 9 y\"}\n{:process 15, :type :ok, :f :append, :key \"6\", :value \"x 15 10 y\"}\n{:process 15, :type :invoke, :f :append, :key \"8\", :value \"x 15 11 y\"}\n{:process 1, :type :ok, :f :put, :key \"4\", :value \"x 1 2 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"3\", :value \"x 21 4 yx 24 9 yx 31 0 yx 28 6 yx 5 2 yx 36 10 yx 41 8 yx 4 7 y\"}\n{:process 38, :type :invoke, :f :append, :key \"8\", :value \"x 38 2 y\"}\n{:process 27, :type :ok, :f :get, :key \"0\", :value \"x 45 1 yx 47 3 yx 29 0 yx 3 4 yx 22 3 yx 28 5 yx 31 2 yx 38 0 yx 18 4 yx 46 2 yx 46 3 yx 9 1 yx 45 18 y\"}\n{:process 27, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 24, :type :ok, :f :append, :key \"0\", :value \"x 24 19 y\"}\n{:process 42, :type :ok, :f :append, :key \"5\", :value \"x 42 4 y\"}\n{:process 42, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 24, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"8\", :value \"x 21 9 y\"}\n{:process 21, :type :invoke, :f :append, :key \"1\", :value \"x 21 10 y\"}\n{:process 5, :type :ok, :f :append, :key \"7\", :value \"x 5 3 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 24, :type :ok, :f :get, :key \"8\", :value \"x 41 6 yx 11 2 yx 3 6 yx 49 6 yx 24 16 yx 21 9 y\"}\n{:process 24, :type :invoke, :f :append, :key \"0\", :value \"x 24 20 y\"}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 21 4 yx 24 9 yx 31 0 yx 28 6 yx 5 2 yx 36 10 yx 41 8 yx 4 7 y\"}\n{:process 1, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"8\", :value \"x 15 11 y\"}\n{:process 15, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"8\", :value \"x 38 2 y\"}\n{:process 38, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 21, :type :ok, :f :append, :key \"1\", :value \"x 21 10 y\"}\n{:process 21, :type :invoke, :f :append, :key \"4\", :value \"x 21 11 y\"}\n{:process 42, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 yx 18 3 yx 16 2 yx 24 13 y\"}\n{:process 42, :type :invoke, :f :append, :key \"8\", :value \"x 42 5 y\"}\n{:process 15, :type :ok, :f :get, :key \"5\", :value \"x 15 6 yx 44 3 yx 41 0 yx 36 7 yx 17 3 yx 47 1 yx 45 2 yx 26 2 yx 45 4 yx 6 1 yx 7 1 yx 28 3 yx 28 4 yx 3 3 yx 30 4 yx 5 0 yx 45 12 yx 33 0 yx 33 1 yx 31 1 yx 42 4 yx 18 3 yx 16 2 yx 24 13 y\"}\n{:process 15, :type :invoke, :f :append, :key \"5\", :value \"x 15 12 y\"}\n{:process 22, :type :ok, :f :append, :key \"2\", :value \"x 22 8 y\"}\n{:process 22, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 y\"}\n{:process 38, :type :invoke, :f :append, :key \"6\", :value \"x 38 3 y\"}\n{:process 1, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 yx 27 1 yx 15 10 y\"}\n{:process 1, :type :invoke, :f :append, :key \"6\", :value \"x 1 3 y\"}\n{:process 24, :type :ok, :f :append, :key \"0\", :value \"x 24 20 y\"}\n{:process 24, :type :invoke, :f :append, :key \"7\", :value \"x 24 21 y\"}\n{:process 21, :type :ok, :f :append, :key \"4\", :value \"x 21 11 y\"}\n{:process 21, :type :invoke, :f :append, :key \"2\", :value \"x 21 12 y\"}\n{:process 1, :type :ok, :f :append, :key \"6\", :value \"x 1 3 y\"}\n{:process 1, :type :invoke, :f :append, :key \"1\", :value \"x 1 4 y\"}\n{:process 20, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 y\"}\n{:process 20, :type :invoke, :f :append, :key \"0\", :value \"x 20 5 y\"}\n{:process 15, :type :ok, :f :append, :key \"5\", :value \"x 15 12 y\"}\n{:process 15, :type :invoke, :f :append, :key \"8\", :value \"x 15 13 y\"}\n{:process 42, :type :ok, :f :append, :key \"8\", :value \"x 42 5 y\"}\n{:process 42, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"2\", :value \"x 14 3 y\"}\n{:process 14, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 30, :type :ok, :f :append, :key \"7\", :value \"x 30 5 y\"}\n{:process 30, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 25, :type :ok, :f :append, :key \"2\", :value \"x 25 3 y\"}\n{:process 25, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"5\", :value \"x 26 2 y\"}\n{:process 26, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 30, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 y\"}\n{:process 30, :type :invoke, :f :append, :key \"2\", :value \"x 30 6 y\"}\n{:process 43, :type :ok, :f :get, :key \"4\", :value \"x 1 2 yx 21 11 y\"}\n{:process 43, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"8\", :value \"x 41 6 yx 11 2 yx 3 6 yx 49 6 yx 24 16 yx 21 9 yx 15 11 yx 38 2 yx 42 5 y\"}\n{:process 14, :type :invoke, :f :append, :key \"6\", :value \"x 14 4 y\"}\n{:process 30, :type :ok, :f :append, :key \"2\", :value \"x 30 6 y\"}\n{:process 30, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 y\"}\n{:process 43, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 y\"}\n{:process 26, :type :invoke, :f :append, :key \"3\", :value \"x 26 3 y\"}\n{:process 14, :type :ok, :f :append, :key \"6\", :value \"x 14 4 y\"}\n{:process 14, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 26, :type :ok, :f :append, :key \"3\", :value \"x 26 3 y\"}\n{:process 26, :type :invoke, :f :put, :key \"0\", :value \"x 26 4 y\"}\n{:process 14, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 y\"}\n{:process 14, :type :invoke, :f :put, :key \"5\", :value \"x 14 5 y\"}\n{:process 26, :type :ok, :f :put, :key \"0\", :value \"x 26 4 y\"}\n{:process 26, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 14, :type :ok, :f :put, :key \"5\", :value \"x 14 5 y\"}\n{:process 14, :type :invoke, :f :append, :key \"7\", :value \"x 14 6 y\"}\n{:process 26, :type :ok, :f :get, :key \"8\", :value \"x 41 6 yx 11 2 yx 3 6 yx 49 6 yx 24 16 yx 21 9 yx 15 11 yx 38 2 yx 42 5 y\"}\n{:process 26, :type :invoke, :f :append, :key \"7\", :value \"x 26 5 y\"}\n{:process 42, :type :ok, :f :get, :key \"7\", :value \"x 24 14 yx 24 18 yx 5 3 yx 30 5 y\"}\n{:process 42, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"7\", :value \"x 14 6 y\"}\n{:process 14, :type :invoke, :f :append, :key \"0\", :value \"x 14 7 y\"}\n{:process 26, :type :ok, :f :append, :key \"7\", :value \"x 26 5 y\"}\n{:process 26, :type :invoke, :f :append, :key \"1\", :value \"x 26 6 y\"}\n{:process 14, :type :ok, :f :append, :key \"0\", :value \"x 14 7 y\"}\n{:process 14, :type :invoke, :f :append, :key \"1\", :value \"x 14 8 y\"}\n{:process 35, :type :ok, :f :append, :key \"3\", :value \"x 35 1 y\"}\n{:process 35, :type :invoke, :f :append, :key \"7\", :value \"x 35 2 y\"}\n{:process 31, :type :ok, :f :append, :key \"2\", :value \"x 31 3 y\"}\n{:process 31, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"7\", :value \"x 24 14 yx 24 18 yx 5 3 yx 30 5 yx 14 6 yx 26 5 y\"}\n{:process 23, :type :invoke, :f :append, :key \"3\", :value \"x 23 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"1\", :value \"x 47 8 y\"}\n{:process 47, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"6\", :value \"x 38 3 y\"}\n{:process 38, :type :invoke, :f :append, :key \"7\", :value \"x 38 4 y\"}\n{:process 26, :type :ok, :f :append, :key \"1\", :value \"x 26 6 y\"}\n{:process 26, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"3\", :value \"x 23 3 y\"}\n{:process 23, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"7\", :value \"x 38 4 y\"}\n{:process 38, :type :invoke, :f :append, :key \"5\", :value \"x 38 5 y\"}\n{:process 23, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 yx 27 1 yx 15 10 yx 1 3 yx 38 3 yx 14 4 y\"}\n{:process 23, :type :invoke, :f :append, :key \"7\", :value \"x 23 4 y\"}\n{:process 26, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 y\"}\n{:process 26, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 y\"}\n{:process 47, :type :invoke, :f :append, :key \"1\", :value \"x 47 9 y\"}\n{:process 38, :type :ok, :f :append, :key \"5\", :value \"x 38 5 y\"}\n{:process 38, :type :invoke, :f :append, :key \"9\", :value \"x 38 6 y\"}\n{:process 4, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 y\"}\n{:process 4, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"1\", :value \"x 47 9 y\"}\n{:process 47, :type :invoke, :f :append, :key \"3\", :value \"x 47 10 y\"}\n{:process 23, :type :ok, :f :append, :key \"7\", :value \"x 23 4 y\"}\n{:process 23, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 48, :type :ok, :f :append, :key \"9\", :value \"x 48 2 y\"}\n{:process 48, :type :invoke, :f :append, :key \"4\", :value \"x 48 3 y\"}\n{:process 26, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 y\"}\n{:process 26, :type :invoke, :f :put, :key \"4\", :value \"x 26 7 y\"}\n{:process 4, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 y\"}\n{:process 4, :type :invoke, :f :append, :key \"6\", :value \"x 4 8 y\"}\n{:process 23, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 y\"}\n{:process 23, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"8\", :value \"x 41 6 yx 11 2 yx 3 6 yx 49 6 yx 24 16 yx 21 9 yx 15 11 yx 38 2 yx 42 5 y\"}\n{:process 19, :type :invoke, :f :append, :key \"3\", :value \"x 19 2 y\"}\n{:process 38, :type :ok, :f :append, :key \"9\", :value \"x 38 6 y\"}\n{:process 38, :type :invoke, :f :append, :key \"0\", :value \"x 38 7 y\"}\n{:process 47, :type :ok, :f :append, :key \"3\", :value \"x 47 10 y\"}\n{:process 47, :type :invoke, :f :append, :key \"5\", :value \"x 47 11 y\"}\n{:process 48, :type :ok, :f :append, :key \"4\", :value \"x 48 3 y\"}\n{:process 48, :type :invoke, :f :append, :key \"1\", :value \"x 48 4 y\"}\n{:process 38, :type :ok, :f :append, :key \"0\", :value \"x 38 7 y\"}\n{:process 38, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 26, :type :ok, :f :put, :key \"4\", :value \"x 26 7 y\"}\n{:process 26, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 23, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 y\"}\n{:process 23, :type :invoke, :f :append, :key \"2\", :value \"x 23 5 y\"}\n{:process 19, :type :ok, :f :append, :key \"3\", :value \"x 19 2 y\"}\n{:process 19, :type :invoke, :f :append, :key \"7\", :value \"x 19 3 y\"}\n{:process 47, :type :ok, :f :append, :key \"5\", :value \"x 47 11 y\"}\n{:process 47, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 y\"}\n{:process 38, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 yx 38 7 y\"}\n{:process 7, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 38, :type :invoke, :f :append, :key \"1\", :value \"x 38 8 y\"}\n{:process 26, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 yx 27 1 yx 15 10 yx 1 3 yx 38 3 yx 14 4 y\"}\n{:process 26, :type :invoke, :f :append, :key \"0\", :value \"x 26 8 y\"}\n{:process 47, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 yx 38 7 y\"}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 5 y\"}\n{:process 2, :type :invoke, :f :append, :key \"7\", :value \"x 2 6 y\"}\n{:process 47, :type :invoke, :f :append, :key \"8\", :value \"x 47 12 y\"}\n{:process 26, :type :ok, :f :append, :key \"0\", :value \"x 26 8 y\"}\n{:process 26, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 19, :type :ok, :f :append, :key \"7\", :value \"x 19 3 y\"}\n{:process 19, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 47, :type :ok, :f :append, :key \"8\", :value \"x 47 12 y\"}\n{:process 7, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 yx 38 7 yx 2 5 yx 26 8 y\"}\n{:process 47, :type :invoke, :f :put, :key \"8\", :value \"x 47 13 y\"}\n{:process 7, :type :invoke, :f :append, :key \"7\", :value \"x 7 2 y\"}\n{:process 19, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 y\"}\n{:process 19, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"1\", :value \"x 38 8 y\"}\n{:process 38, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 41, :type :ok, :f :append, :key \"6\", :value \"x 41 10 y\"}\n{:process 41, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 47, :type :ok, :f :put, :key \"8\", :value \"x 47 13 y\"}\n{:process 47, :type :invoke, :f :append, :key \"4\", :value \"x 47 14 y\"}\n{:process 7, :type :ok, :f :append, :key \"7\", :value \"x 7 2 y\"}\n{:process 7, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 y\"}\n{:process 38, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"7\", :value \"x 2 6 y\"}\n{:process 2, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 y\"}\n{:process 38, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 y\"}\n{:process 38, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 yx 38 7 yx 2 5 yx 26 8 y\"}\n{:process 38, :type :invoke, :f :append, :key \"7\", :value \"x 38 9 y\"}\n{:process 38, :type :ok, :f :append, :key \"7\", :value \"x 38 9 y\"}\n{:process 38, :type :invoke, :f :append, :key \"2\", :value \"x 38 10 y\"}\n{:process 38, :type :ok, :f :append, :key \"2\", :value \"x 38 10 y\"}\n{:process 38, :type :invoke, :f :append, :key \"6\", :value \"x 38 11 y\"}\n{:process 12, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 yx 27 1 yx 15 10 yx 1 3 yx 38 3 yx 14 4 y\"}\n{:process 12, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"6\", :value \"x 38 11 y\"}\n{:process 38, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 y\"}\n{:process 38, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"6\", :value \"x 13 1 y\"}\n{:process 13, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"1\", :value \"x 36 11 y\"}\n{:process 36, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 34, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 y\"}\n{:process 34, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 38, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 y\"}\n{:process 38, :type :invoke, :f :append, :key \"5\", :value \"x 38 12 y\"}\n{:process 34, :type :ok, :f :get, :key \"3\", :value \"x 44 11 yx 23 3 yx 47 10 yx 19 2 y\"}\n{:process 34, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 13, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 y\"}\n{:process 13, :type :invoke, :f :append, :key \"7\", :value \"x 13 2 y\"}\n{:process 38, :type :ok, :f :append, :key \"5\", :value \"x 38 12 y\"}\n{:process 38, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"6\", :value \"x 18 5 y\"}\n{:process 18, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 34, :type :ok, :f :get, :key \"8\", :value \"x 47 13 y\"}\n{:process 34, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 y\"}\n{:process 32, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 yx 27 1 yx 15 10 yx 1 3 yx 38 3 yx 14 4 yx 38 11 yx 18 5 y\"}\n{:process 18, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"6\", :value \"x 28 8 y\"}\n{:process 28, :type :invoke, :f :append, :key \"7\", :value \"x 28 9 y\"}\n{:process 34, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 y\"}\n{:process 34, :type :invoke, :f :append, :key \"1\", :value \"x 34 2 y\"}\n{:process 18, :type :ok, :f :get, :key \"3\", :value \"x 44 11 yx 23 3 yx 47 10 yx 19 2 y\"}\n{:process 18, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"7\", :value \"x 28 9 y\"}\n{:process 28, :type :invoke, :f :append, :key \"2\", :value \"x 28 10 y\"}\n{:process 34, :type :ok, :f :append, :key \"1\", :value \"x 34 2 y\"}\n{:process 34, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"2\", :value \"x 28 10 y\"}\n{:process 28, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"0\", :value \"x 46 3 y\"}\n{:process 46, :type :invoke, :f :append, :key \"0\", :value \"x 46 4 y\"}\n{:process 34, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 y\"}\n{:process 34, :type :invoke, :f :append, :key \"7\", :value \"x 34 3 y\"}\n{:process 28, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 y\"}\n{:process 28, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"0\", :value \"x 46 4 y\"}\n{:process 46, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"7\", :value \"x 24 14 yx 24 18 yx 5 3 yx 30 5 yx 14 6 yx 26 5 yx 38 4 yx 35 2 yx 23 4 yx 19 3 yx 7 2 yx 2 6 yx 38 9 yx 13 2 yx 28 9 y\"}\n{:process 28, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 3, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 y\"}\n{:process 3, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"7\", :value \"x 34 3 y\"}\n{:process 34, :type :invoke, :f :append, :key \"1\", :value \"x 34 4 y\"}\n{:process 3, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 y\"}\n{:process 3, :type :invoke, :f :append, :key \"8\", :value \"x 3 7 y\"}\n{:process 34, :type :ok, :f :append, :key \"1\", :value \"x 34 4 y\"}\n{:process 34, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 46, :type :ok, :f :get, :key \"7\", :value \"x 24 14 yx 24 18 yx 5 3 yx 30 5 yx 14 6 yx 26 5 yx 38 4 yx 35 2 yx 23 4 yx 19 3 yx 7 2 yx 2 6 yx 38 9 yx 13 2 yx 28 9 yx 34 3 y\"}\n{:process 46, :type :invoke, :f :append, :key \"6\", :value \"x 46 5 y\"}\n{:process 6, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 yx 27 1 yx 15 10 yx 1 3 yx 38 3 yx 14 4 yx 38 11 yx 18 5 yx 28 8 y\"}\n{:process 6, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 y\"}\n{:process 28, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"6\", :value \"x 45 19 y\"}\n{:process 45, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 9, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 y\"}\n{:process 9, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 y\"}\n{:process 28, :type :invoke, :f :append, :key \"6\", :value \"x 28 11 y\"}\n{:process 34, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 yx 27 1 yx 15 10 yx 1 3 yx 38 3 yx 14 4 yx 38 11 yx 18 5 yx 28 8 y\"}\n{:process 34, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 yx 38 10 yx 28 10 y\"}\n{:process 6, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"6\", :value \"x 46 5 y\"}\n{:process 46, :type :invoke, :f :append, :key \"3\", :value \"x 46 6 y\"}\n{:process 45, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 yx 38 10 yx 28 10 y\"}\n{:process 45, :type :invoke, :f :append, :key \"3\", :value \"x 45 20 y\"}\n{:process 9, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 y\"}\n{:process 9, :type :invoke, :f :append, :key \"2\", :value \"x 9 2 y\"}\n{:process 28, :type :ok, :f :append, :key \"6\", :value \"x 28 11 y\"}\n{:process 28, :type :invoke, :f :append, :key \"8\", :value \"x 28 12 y\"}\n{:process 34, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 yx 38 12 y\"}\n{:process 34, :type :invoke, :f :append, :key \"2\", :value \"x 34 5 y\"}\n{:process 28, :type :ok, :f :append, :key \"8\", :value \"x 28 12 y\"}\n{:process 28, :type :invoke, :f :append, :key \"1\", :value \"x 28 13 y\"}\n{:process 45, :type :ok, :f :append, :key \"3\", :value \"x 45 20 y\"}\n{:process 45, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"2\", :value \"x 9 2 y\"}\n{:process 9, :type :invoke, :f :append, :key \"9\", :value \"x 9 3 y\"}\n{:process 11, :type :ok, :f :get, :key \"8\", :value \"x 47 13 yx 28 12 y\"}\n{:process 11, :type :invoke, :f :append, :key \"9\", :value \"x 11 4 y\"}\n{:process 46, :type :ok, :f :append, :key \"3\", :value \"x 46 6 y\"}\n{:process 46, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 28, :type :ok, :f :append, :key \"1\", :value \"x 28 13 y\"}\n{:process 28, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 45, :type :ok, :f :get, :key \"8\", :value \"x 47 13 yx 28 12 y\"}\n{:process 45, :type :invoke, :f :append, :key \"8\", :value \"x 45 21 y\"}\n{:process 10, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 y\"}\n{:process 10, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"2\", :value \"x 17 12 y\"}\n{:process 17, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"9\", :value \"x 9 3 y\"}\n{:process 9, :type :invoke, :f :append, :key \"5\", :value \"x 9 4 y\"}\n{:process 34, :type :ok, :f :append, :key \"2\", :value \"x 34 5 y\"}\n{:process 34, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"9\", :value \"x 11 4 y\"}\n{:process 11, :type :invoke, :f :append, :key \"8\", :value \"x 11 5 y\"}\n{:process 10, :type :ok, :f :get, :key \"6\", :value \"x 0 1 yx 6 4 yx 24 17 yx 45 19 yx 27 1 yx 15 10 yx 1 3 yx 38 3 yx 14 4 yx 38 11 yx 18 5 yx 28 8 yx 46 5 yx 28 11 y\"}\n{:process 10, :type :invoke, :f :put, :key \"3\", :value \"x 10 3 y\"}\n{:process 17, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 yx 38 12 y\"}\n{:process 17, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 y\"}\n{:process 28, :type :invoke, :f :append, :key \"3\", :value \"x 28 14 y\"}\n{:process 49, :type :ok, :f :get, :key \"8\", :value \"x 47 13 yx 28 12 y\"}\n{:process 49, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 40, :type :ok, :f :append, :key \"8\", :value \"x 40 1 y\"}\n{:process 40, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"5\", :value \"x 9 4 y\"}\n{:process 9, :type :invoke, :f :append, :key \"9\", :value \"x 9 5 y\"}\n{:process 34, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 y\"}\n{:process 34, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 40, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 y\"}\n{:process 40, :type :invoke, :f :put, :key \"6\", :value \"x 40 2 y\"}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 y\"}\n{:process 0, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 yx 38 7 yx 2 5 yx 26 8 yx 46 4 y\"}\n{:process 5, :type :invoke, :f :append, :key \"3\", :value \"x 5 4 y\"}\n{:process 0, :type :invoke, :f :append, :key \"8\", :value \"x 0 3 y\"}\n{:process 49, :type :ok, :f :get, :key \"7\", :value \"x 24 14 yx 24 18 yx 5 3 yx 30 5 yx 14 6 yx 26 5 yx 38 4 yx 35 2 yx 23 4 yx 19 3 yx 7 2 yx 2 6 yx 38 9 yx 13 2 yx 28 9 yx 34 3 y\"}\n{:process 49, :type :invoke, :f :append, :key \"4\", :value \"x 49 7 y\"}\n{:process 10, :type :ok, :f :put, :key \"3\", :value \"x 10 3 y\"}\n{:process 10, :type :invoke, :f :append, :key \"0\", :value \"x 10 4 y\"}\n{:process 28, :type :ok, :f :append, :key \"3\", :value \"x 28 14 y\"}\n{:process 28, :type :invoke, :f :put, :key \"7\", :value \"x 28 15 y\"}\n{:process 11, :type :ok, :f :append, :key \"8\", :value \"x 11 5 y\"}\n{:process 0, :type :ok, :f :append, :key \"8\", :value \"x 0 3 y\"}\n{:process 11, :type :invoke, :f :append, :key \"0\", :value \"x 11 6 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 4 y\"}\n{:process 34, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 yx 38 12 yx 9 4 y\"}\n{:process 34, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 4 y\"}\n{:process 0, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 5, :type :ok, :f :append, :key \"3\", :value \"x 5 4 y\"}\n{:process 5, :type :invoke, :f :append, :key \"0\", :value \"x 5 5 y\"}\n{:process 40, :type :ok, :f :put, :key \"6\", :value \"x 40 2 y\"}\n{:process 40, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"0\", :value \"x 11 6 y\"}\n{:process 11, :type :invoke, :f :append, :key \"9\", :value \"x 11 7 y\"}\n{:process 28, :type :ok, :f :put, :key \"7\", :value \"x 28 15 y\"}\n{:process 28, :type :invoke, :f :put, :key \"3\", :value \"x 28 16 y\"}\n{:process 5, :type :ok, :f :append, :key \"0\", :value \"x 5 5 y\"}\n{:process 5, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 5 y\"}\n{:process 28, :type :ok, :f :put, :key \"3\", :value \"x 28 16 y\"}\n{:process 28, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"1\", :value \"x 1 4 y\"}\n{:process 1, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 5 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 6 y\"}\n{:process 15, :type :ok, :f :append, :key \"8\", :value \"x 15 13 y\"}\n{:process 15, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 20, :type :ok, :f :append, :key \"0\", :value \"x 20 5 y\"}\n{:process 20, :type :invoke, :f :append, :key \"9\", :value \"x 20 6 y\"}\n{:process 5, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 y\"}\n{:process 5, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 28, :type :ok, :f :get, :key \"7\", :value \"x 28 15 y\"}\n{:process 28, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 6 y\"}\n{:process 0, :type :invoke, :f :append, :key \"1\", :value \"x 0 7 y\"}\n{:process 1, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 yx 38 7 yx 2 5 yx 26 8 yx 46 4 yx 10 4 yx 11 6 yx 5 5 yx 20 5 yx 0 6 y\"}\n{:process 1, :type :invoke, :f :append, :key \"2\", :value \"x 1 5 y\"}\n{:process 29, :type :ok, :f :append, :key \"0\", :value \"x 29 0 y\"}\n{:process 29, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"6\", :value \"x 40 2 y\"}\n{:process 43, :type :invoke, :f :append, :key \"6\", :value \"x 43 1 y\"}\n{:process 44, :type :ok, :f :put, :key \"3\", :value \"x 44 11 y\"}\n{:process 44, :type :invoke, :f :append, :key \"7\", :value \"x 44 12 y\"}\n{:process 37, :type :ok, :f :append, :key \"1\", :value \"x 37 2 y\"}\n{:process 43, :type :ok, :f :append, :key \"6\", :value \"x 43 1 y\"}\n{:process 37, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 43, :type :invoke, :f :append, :key \"0\", :value \"x 43 2 y\"}\n{:process 8, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 8 y\"}\n{:process 44, :type :ok, :f :append, :key \"7\", :value \"x 44 12 y\"}\n{:process 44, :type :invoke, :f :append, :key \"4\", :value \"x 44 13 y\"}\n{:process 43, :type :ok, :f :append, :key \"0\", :value \"x 43 2 y\"}\n{:process 43, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"1\", :value \"x 14 8 y\"}\n{:process 14, :type :invoke, :f :append, :key \"2\", :value \"x 14 9 y\"}\n{:process 37, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 yx 38 7 yx 2 5 yx 26 8 yx 46 4 yx 10 4 yx 11 6 yx 5 5 yx 20 5 yx 0 6 yx 43 2 y\"}\n{:process 31, :type :ok, :f :get, :key \"8\", :value \"x 47 13 yx 28 12 yx 0 3 yx 11 5 yx 15 13 y\"}\n{:process 37, :type :invoke, :f :put, :key \"6\", :value \"x 37 3 y\"}\n{:process 31, :type :invoke, :f :append, :key \"3\", :value \"x 31 4 y\"}\n{:process 43, :type :ok, :f :get, :key \"0\", :value \"x 26 4 yx 14 7 yx 38 7 yx 2 5 yx 26 8 yx 46 4 yx 10 4 yx 11 6 yx 5 5 yx 20 5 yx 0 6 yx 43 2 y\"}\n{:process 43, :type :invoke, :f :append, :key \"3\", :value \"x 43 3 y\"}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 8 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 9 y\"}\n{:process 35, :type :ok, :f :append, :key \"7\", :value \"x 35 2 y\"}\n{:process 35, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"3\", :value \"x 31 4 y\"}\n{:process 39, :type :ok, :f :append, :key \"5\", :value \"x 39 2 y\"}\n{:process 31, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 39, :type :invoke, :f :put, :key \"0\", :value \"x 39 3 y\"}\n{:process 37, :type :ok, :f :put, :key \"6\", :value \"x 37 3 y\"}\n{:process 37, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 9 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 43, :type :ok, :f :append, :key \"3\", :value \"x 43 3 y\"}\n{:process 43, :type :invoke, :f :append, :key \"3\", :value \"x 43 4 y\"}\n{:process 14, :type :ok, :f :append, :key \"2\", :value \"x 14 9 y\"}\n{:process 14, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 37, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 y\"}\n{:process 37, :type :invoke, :f :append, :key \"5\", :value \"x 37 4 y\"}\n{:process 31, :type :ok, :f :get, :key \"8\", :value \"x 47 13 yx 28 12 yx 0 3 yx 11 5 yx 15 13 y\"}\n{:process 31, :type :invoke, :f :append, :key \"8\", :value \"x 31 5 y\"}\n{:process 39, :type :ok, :f :put, :key \"0\", :value \"x 39 3 y\"}\n{:process 39, :type :invoke, :f :put, :key \"8\", :value \"x 39 4 y\"}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 39 3 y\"}\n{:process 8, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"0\", :value \"x 39 3 y\"}\n{:process 35, :type :invoke, :f :append, :key \"0\", :value \"x 35 3 y\"}\n{:process 4, :type :ok, :f :append, :key \"6\", :value \"x 4 8 y\"}\n{:process 4, :type :invoke, :f :append, :key \"2\", :value \"x 4 9 y\"}\n{:process 43, :type :ok, :f :append, :key \"3\", :value \"x 43 4 y\"}\n{:process 14, :type :ok, :f :get, :key \"6\", :value \"x 37 3 yx 4 8 y\"}\n{:process 43, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 48, :type :ok, :f :append, :key \"1\", :value \"x 48 4 y\"}\n{:process 14, :type :invoke, :f :put, :key \"7\", :value \"x 14 10 y\"}\n{:process 48, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"0\", :value \"x 35 3 y\"}\n{:process 35, :type :invoke, :f :append, :key \"3\", :value \"x 35 4 y\"}\n{:process 31, :type :ok, :f :append, :key \"8\", :value \"x 31 5 y\"}\n{:process 31, :type :invoke, :f :append, :key \"0\", :value \"x 31 6 y\"}\n{:process 8, :type :ok, :f :get, :key \"8\", :value \"x 47 13 yx 28 12 yx 0 3 yx 11 5 yx 15 13 yx 31 5 y\"}\n{:process 8, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 43, :type :ok, :f :get, :key \"6\", :value \"x 37 3 yx 4 8 y\"}\n{:process 43, :type :invoke, :f :append, :key \"6\", :value \"x 43 5 y\"}\n{:process 14, :type :ok, :f :put, :key \"7\", :value \"x 14 10 y\"}\n{:process 14, :type :invoke, :f :append, :key \"6\", :value \"x 14 11 y\"}\n{:process 39, :type :ok, :f :put, :key \"8\", :value \"x 39 4 y\"}\n{:process 39, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 48, :type :ok, :f :get, :key \"8\", :value \"x 39 4 y\"}\n{:process 48, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"0\", :value \"x 39 3 yx 35 3 y\"}\n{:process 35, :type :ok, :f :append, :key \"3\", :value \"x 35 4 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 10 y\"}\n{:process 35, :type :invoke, :f :append, :key \"0\", :value \"x 35 5 y\"}\n{:process 39, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 yx 38 10 yx 28 10 yx 9 2 yx 34 5 yx 1 5 yx 8 9 yx 14 9 yx 4 9 y\"}\n{:process 39, :type :invoke, :f :append, :key \"5\", :value \"x 39 5 y\"}\n{:process 43, :type :ok, :f :append, :key \"6\", :value \"x 43 5 y\"}\n{:process 43, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"6\", :value \"x 37 3 yx 4 8 yx 43 5 y\"}\n{:process 26, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 48, :type :ok, :f :get, :key \"6\", :value \"x 37 3 yx 4 8 yx 43 5 y\"}\n{:process 48, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 35, :type :ok, :f :append, :key \"0\", :value \"x 35 5 y\"}\n{:process 35, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"6\", :value \"x 14 11 y\"}\n{:process 14, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"5\", :value \"x 39 5 y\"}\n{:process 39, :type :invoke, :f :append, :key \"4\", :value \"x 39 6 y\"}\n{:process 47, :type :ok, :f :append, :key \"4\", :value \"x 47 14 y\"}\n{:process 47, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 33, :type :ok, :f :append, :key \"1\", :value \"x 33 2 y\"}\n{:process 33, :type :invoke, :f :append, :key \"1\", :value \"x 33 3 y\"}\n{:process 2, :type :ok, :f :get, :key \"0\", :value \"x 39 3 yx 35 3 yx 35 5 y\"}\n{:process 2, :type :invoke, :f :append, :key \"0\", :value \"x 2 7 y\"}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 10 y\"}\n{:process 8, :type :invoke, :f :append, :key \"9\", :value \"x 8 11 y\"}\n{:process 35, :type :ok, :f :get, :key \"7\", :value \"x 14 10 y\"}\n{:process 35, :type :invoke, :f :append, :key \"6\", :value \"x 35 6 y\"}\n{:process 26, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 yx 1 4 yx 48 4 y\"}\n{:process 26, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"6\", :value \"x 37 3 yx 4 8 yx 43 5 yx 14 11 y\"}\n{:process 47, :type :invoke, :f :append, :key \"8\", :value \"x 47 15 y\"}\n{:process 33, :type :ok, :f :append, :key \"1\", :value \"x 33 3 y\"}\n{:process 14, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 yx 38 10 yx 28 10 yx 9 2 yx 34 5 yx 1 5 yx 8 9 yx 14 9 yx 4 9 yx 23 5 y\"}\n{:process 33, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 14, :type :invoke, :f :append, :key \"5\", :value \"x 14 12 y\"}\n{:process 47, :type :ok, :f :append, :key \"8\", :value \"x 47 15 y\"}\n{:process 47, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"9\", :value \"x 8 11 y\"}\n{:process 8, :type :invoke, :f :append, :key \"5\", :value \"x 8 12 y\"}\n{:process 33, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 yx 38 10 yx 28 10 yx 9 2 yx 34 5 yx 1 5 yx 8 9 yx 14 9 yx 4 9 yx 23 5 y\"}\n{:process 33, :type :invoke, :f :append, :key \"9\", :value \"x 33 4 y\"}\n{:process 35, :type :ok, :f :append, :key \"6\", :value \"x 35 6 y\"}\n{:process 35, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 14, :type :ok, :f :append, :key \"5\", :value \"x 14 12 y\"}\n{:process 14, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 47, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 y\"}\n{:process 47, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 33, :type :ok, :f :append, :key \"9\", :value \"x 33 4 y\"}\n{:process 33, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"5\", :value \"x 8 12 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 35, :type :ok, :f :get, :key \"8\", :value \"x 39 4 yx 47 15 y\"}\n{:process 35, :type :invoke, :f :append, :key \"5\", :value \"x 35 7 y\"}\n{:process 47, :type :ok, :f :get, :key \"6\", :value \"x 37 3 yx 4 8 yx 43 5 yx 14 11 yx 35 6 y\"}\n{:process 47, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 y\"}\n{:process 8, :type :invoke, :f :append, :key \"3\", :value \"x 8 13 y\"}\n{:process 35, :type :ok, :f :append, :key \"5\", :value \"x 35 7 y\"}\n{:process 35, :type :invoke, :f :put, :key \"8\", :value \"x 35 8 y\"}\n{:process 47, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 yx 1 4 yx 48 4 yx 33 3 y\"}\n{:process 47, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 yx 38 10 yx 28 10 yx 9 2 yx 34 5 yx 1 5 yx 8 9 yx 14 9 yx 4 9 yx 23 5 y\"}\n{:process 33, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 8, :type :ok, :f :append, :key \"3\", :value \"x 8 13 y\"}\n{:process 8, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 yx 1 4 yx 48 4 yx 33 3 y\"}\n{:process 16, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 8, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 y\"}\n{:process 8, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 y\"}\n{:process 33, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 35, :type :ok, :f :put, :key \"8\", :value \"x 35 8 y\"}\n{:process 35, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"6\", :value \"x 37 3 yx 4 8 yx 43 5 yx 14 11 yx 35 6 y\"}\n{:process 16, :type :invoke, :f :append, :key \"3\", :value \"x 16 3 y\"}\n{:process 33, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 y\"}\n{:process 33, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 13, :type :ok, :f :append, :key \"7\", :value \"x 13 2 y\"}\n{:process 13, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"7\", :value \"x 14 10 y\"}\n{:process 32, :type :invoke, :f :append, :key \"1\", :value \"x 32 2 y\"}\n{:process 8, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 yx 38 10 yx 28 10 yx 9 2 yx 34 5 yx 1 5 yx 8 9 yx 14 9 yx 4 9 yx 23 5 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 14 y\"}\n{:process 36, :type :ok, :f :get, :key \"8\", :value \"x 35 8 y\"}\n{:process 36, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"3\", :value \"x 16 3 y\"}\n{:process 16, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 33, :type :ok, :f :get, :key \"0\", :value \"x 39 3 yx 35 3 yx 35 5 yx 2 7 y\"}\n{:process 33, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 16, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 yx 38 12 yx 9 4 yx 39 5 yx 8 10 yx 14 12 yx 8 12 yx 35 7 y\"}\n{:process 16, :type :invoke, :f :append, :key \"9\", :value \"x 16 4 y\"}\n{:process 38, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 y\"}\n{:process 38, :type :invoke, :f :append, :key \"7\", :value \"x 38 13 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 14 y\"}\n{:process 8, :type :invoke, :f :append, :key \"1\", :value \"x 8 15 y\"}\n{:process 32, :type :ok, :f :append, :key \"1\", :value \"x 32 2 y\"}\n{:process 32, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"9\", :value \"x 16 4 y\"}\n{:process 16, :type :invoke, :f :append, :key \"0\", :value \"x 16 5 y\"}\n{:process 38, :type :ok, :f :append, :key \"7\", :value \"x 38 13 y\"}\n{:process 38, :type :invoke, :f :append, :key \"9\", :value \"x 38 14 y\"}\n{:process 8, :type :ok, :f :append, :key \"1\", :value \"x 8 15 y\"}\n{:process 8, :type :invoke, :f :append, :key \"2\", :value \"x 8 16 y\"}\n{:process 32, :type :ok, :f :get, :key \"6\", :value \"x 37 3 yx 4 8 yx 43 5 yx 14 11 yx 35 6 y\"}\n{:process 32, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"0\", :value \"x 16 5 y\"}\n{:process 16, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 18, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 y\"}\n{:process 18, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 38, :type :ok, :f :append, :key \"9\", :value \"x 38 14 y\"}\n{:process 38, :type :invoke, :f :append, :key \"5\", :value \"x 38 15 y\"}\n{:process 32, :type :ok, :f :get, :key \"2\", :value \"x 18 5 yx 32 1 yx 24 5 yx 28 1 yx 44 1 yx 49 1 yx 44 9 yx 36 0 yx 4 0 yx 16 0 yx 41 5 yx 36 6 yx 17 2 yx 8 1 yx 47 0 yx 25 0 yx 24 8 yx 30 3 yx 22 2 yx 22 4 yx 45 13 yx 22 8 yx 14 3 yx 17 8 yx 11 3 yx 17 12 yx 15 9 yx 0 2 yx 31 3 yx 25 3 yx 30 6 yx 38 10 yx 28 10 yx 9 2 yx 34 5 yx 1 5 yx 8 9 yx 14 9 yx 4 9 yx 23 5 yx 8 14 yx 8 16 y\"}\n{:process 32, :type :invoke, :f :append, :key \"1\", :value \"x 32 3 y\"}\n{:process 16, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 y\"}\n{:process 16, :type :invoke, :f :append, :key \"8\", :value \"x 16 6 y\"}\n{:process 18, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 yx 1 4 yx 48 4 yx 33 3 yx 32 2 yx 8 15 y\"}\n{:process 18, :type :invoke, :f :append, :key \"3\", :value \"x 18 6 y\"}\n{:process 32, :type :ok, :f :append, :key \"1\", :value \"x 32 3 y\"}\n{:process 32, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 3, :type :ok, :f :append, :key \"8\", :value \"x 3 7 y\"}\n{:process 3, :type :invoke, :f :append, :key \"3\", :value \"x 3 8 y\"}\n{:process 16, :type :ok, :f :append, :key \"8\", :value \"x 16 6 y\"}\n{:process 16, :type :invoke, :f :append, :key \"7\", :value \"x 16 7 y\"}\n{:process 18, :type :ok, :f :append, :key \"3\", :value \"x 18 6 y\"}\n{:process 6, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 y\"}\n{:process 18, :type :invoke, :f :append, :key \"2\", :value \"x 18 7 y\"}\n{:process 6, :type :invoke, :f :put, :key \"2\", :value \"x 6 5 y\"}\n{:process 3, :type :ok, :f :append, :key \"3\", :value \"x 3 8 y\"}\n{:process 3, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 32, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 y\"}\n{:process 32, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 6, :type :ok, :f :put, :key \"2\", :value \"x 6 5 y\"}\n{:process 6, :type :invoke, :f :append, :key \"8\", :value \"x 6 6 y\"}\n{:process 45, :type :ok, :f :append, :key \"8\", :value \"x 45 21 y\"}\n{:process 45, :type :invoke, :f :append, :key \"6\", :value \"x 45 22 y\"}\n{:process 16, :type :ok, :f :append, :key \"7\", :value \"x 16 7 y\"}\n{:process 16, :type :invoke, :f :append, :key \"8\", :value \"x 16 8 y\"}\n{:process 18, :type :ok, :f :append, :key \"2\", :value \"x 18 7 y\"}\n{:process 18, :type :invoke, :f :append, :key \"2\", :value \"x 18 8 y\"}\n{:process 32, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 y\"}\n{:process 32, :type :invoke, :f :append, :key \"3\", :value \"x 32 4 y\"}\n{:process 6, :type :ok, :f :append, :key \"8\", :value \"x 6 6 y\"}\n{:process 6, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 45, :type :ok, :f :append, :key \"6\", :value \"x 45 22 y\"}\n{:process 45, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"8\", :value \"x 16 8 y\"}\n{:process 16, :type :invoke, :f :put, :key \"6\", :value \"x 16 9 y\"}\n{:process 18, :type :ok, :f :append, :key \"2\", :value \"x 18 8 y\"}\n{:process 18, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"2\", :value \"x 6 5 yx 18 7 yx 18 8 y\"}\n{:process 17, :type :invoke, :f :append, :key \"3\", :value \"x 17 13 y\"}\n{:process 45, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 yx 38 12 yx 9 4 yx 39 5 yx 8 10 yx 14 12 yx 8 12 yx 35 7 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 23 y\"}\n{:process 46, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 y\"}\n{:process 46, :type :invoke, :f :append, :key \"7\", :value \"x 46 7 y\"}\n{:process 10, :type :ok, :f :append, :key \"0\", :value \"x 10 4 y\"}\n{:process 10, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 17, :type :ok, :f :append, :key \"3\", :value \"x 17 13 y\"}\n{:process 17, :type :invoke, :f :append, :key \"6\", :value \"x 17 14 y\"}\n{:process 6, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 7 y\"}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 23 y\"}\n{:process 45, :type :invoke, :f :append, :key \"7\", :value \"x 45 24 y\"}\n{:process 16, :type :ok, :f :put, :key \"6\", :value \"x 16 9 y\"}\n{:process 16, :type :invoke, :f :append, :key \"1\", :value \"x 16 10 y\"}\n{:process 18, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 y\"}\n{:process 18, :type :invoke, :f :append, :key \"3\", :value \"x 18 9 y\"}\n{:process 17, :type :ok, :f :append, :key \"6\", :value \"x 17 14 y\"}\n{:process 17, :type :invoke, :f :append, :key \"1\", :value \"x 17 15 y\"}\n{:process 34, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 y\"}\n{:process 34, :type :invoke, :f :append, :key \"2\", :value \"x 34 6 y\"}\n{:process 40, :type :ok, :f :get, :key \"0\", :value \"x 39 3 yx 35 3 yx 35 5 yx 2 7 yx 16 5 y\"}\n{:process 40, :type :invoke, :f :append, :key \"0\", :value \"x 40 3 y\"}\n{:process 10, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 yx 17 13 y\"}\n{:process 10, :type :invoke, :f :append, :key \"8\", :value \"x 10 5 y\"}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 7 y\"}\n{:process 6, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"9\", :value \"x 9 5 y\"}\n{:process 9, :type :invoke, :f :append, :key \"8\", :value \"x 9 6 y\"}\n{:process 45, :type :ok, :f :append, :key \"7\", :value \"x 45 24 y\"}\n{:process 45, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"7\", :value \"x 46 7 y\"}\n{:process 46, :type :invoke, :f :append, :key \"0\", :value \"x 46 8 y\"}\n{:process 16, :type :ok, :f :append, :key \"1\", :value \"x 16 10 y\"}\n{:process 16, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"2\", :value \"x 34 6 y\"}\n{:process 27, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 yx 11 7 y\"}\n{:process 34, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 27, :type :invoke, :f :append, :key \"1\", :value \"x 27 2 y\"}\n{:process 40, :type :ok, :f :append, :key \"0\", :value \"x 40 3 y\"}\n{:process 40, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 11, :type :ok, :f :append, :key \"9\", :value \"x 11 7 y\"}\n{:process 11, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 18, :type :ok, :f :append, :key \"3\", :value \"x 18 9 y\"}\n{:process 18, :type :invoke, :f :append, :key \"5\", :value \"x 18 10 y\"}\n{:process 45, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 y\"}\n{:process 45, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 9, :type :ok, :f :append, :key \"8\", :value \"x 9 6 y\"}\n{:process 15, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 yx 1 4 yx 48 4 yx 33 3 yx 32 2 yx 8 15 yx 32 3 yx 16 10 y\"}\n{:process 15, :type :invoke, :f :append, :key \"5\", :value \"x 15 14 y\"}\n{:process 9, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 6, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 y\"}\n{:process 6, :type :invoke, :f :append, :key \"8\", :value \"x 6 8 y\"}\n{:process 16, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 yx 17 13 yx 18 9 y\"}\n{:process 16, :type :invoke, :f :append, :key \"3\", :value \"x 16 11 y\"}\n{:process 11, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 yx 38 12 yx 9 4 yx 39 5 yx 8 10 yx 14 12 yx 8 12 yx 35 7 yx 6 7 y\"}\n{:process 11, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 34, :type :ok, :f :get, :key \"0\", :value \"x 39 3 yx 35 3 yx 35 5 yx 2 7 yx 16 5 yx 40 3 yx 46 8 y\"}\n{:process 34, :type :invoke, :f :append, :key \"2\", :value \"x 34 7 y\"}\n{:process 18, :type :ok, :f :append, :key \"5\", :value \"x 18 10 y\"}\n{:process 18, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 15, :type :ok, :f :append, :key \"5\", :value \"x 15 14 y\"}\n{:process 9, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 yx 11 7 y\"}\n{:process 9, :type :invoke, :f :append, :key \"7\", :value \"x 9 7 y\"}\n{:process 15, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"8\", :value \"x 6 8 y\"}\n{:process 11, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 yx 1 4 yx 48 4 yx 33 3 yx 32 2 yx 8 15 yx 32 3 yx 16 10 y\"}\n{:process 40, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 y\"}\n{:process 11, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 6, :type :invoke, :f :append, :key \"7\", :value \"x 6 9 y\"}\n{:process 40, :type :invoke, :f :put, :key \"6\", :value \"x 40 4 y\"}\n{:process 34, :type :ok, :f :append, :key \"2\", :value \"x 34 7 y\"}\n{:process 34, :type :invoke, :f :append, :key \"8\", :value \"x 34 8 y\"}\n{:process 27, :type :ok, :f :append, :key \"1\", :value \"x 27 2 y\"}\n{:process 27, :type :invoke, :f :append, :key \"7\", :value \"x 27 3 y\"}\n{:process 29, :type :ok, :f :get, :key \"2\", :value \"x 6 5 yx 18 7 yx 18 8 yx 34 6 yx 34 7 y\"}\n{:process 20, :type :ok, :f :append, :key \"9\", :value \"x 20 6 y\"}\n{:process 29, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 20, :type :invoke, :f :append, :key \"1\", :value \"x 20 7 y\"}\n{:process 9, :type :ok, :f :append, :key \"7\", :value \"x 9 7 y\"}\n{:process 9, :type :invoke, :f :append, :key \"4\", :value \"x 9 8 y\"}\n{:process 6, :type :ok, :f :append, :key \"7\", :value \"x 6 9 y\"}\n{:process 6, :type :invoke, :f :append, :key \"5\", :value \"x 6 10 y\"}\n{:process 11, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 yx 38 12 yx 9 4 yx 39 5 yx 8 10 yx 14 12 yx 8 12 yx 35 7 yx 6 7 yx 18 10 yx 15 14 y\"}\n{:process 11, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 40, :type :ok, :f :put, :key \"6\", :value \"x 40 4 y\"}\n{:process 40, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 34, :type :ok, :f :append, :key \"8\", :value \"x 34 8 y\"}\n{:process 34, :type :invoke, :f :append, :key \"7\", :value \"x 34 9 y\"}\n{:process 29, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 yx 9 8 y\"}\n{:process 29, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 40, :type :ok, :f :get, :key \"2\", :value \"x 6 5 yx 18 7 yx 18 8 yx 34 6 yx 34 7 y\"}\n{:process 40, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"1\", :value \"x 0 7 y\"}\n{:process 0, :type :invoke, :f :append, :key \"6\", :value \"x 0 8 y\"}\n{:process 29, :type :ok, :f :get, :key \"0\", :value \"x 39 3 yx 35 3 yx 35 5 yx 2 7 yx 16 5 yx 40 3 yx 46 8 y\"}\n{:process 11, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 yx 1 4 yx 48 4 yx 33 3 yx 32 2 yx 8 15 yx 32 3 yx 16 10 yx 27 2 yx 0 7 y\"}\n{:process 29, :type :invoke, :f :append, :key \"1\", :value \"x 29 1 y\"}\n{:process 11, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 6, :type :ok, :f :append, :key \"5\", :value \"x 6 10 y\"}\n{:process 6, :type :invoke, :f :append, :key \"4\", :value \"x 6 11 y\"}\n{:process 34, :type :ok, :f :append, :key \"7\", :value \"x 34 9 y\"}\n{:process 34, :type :invoke, :f :append, :key \"9\", :value \"x 34 10 y\"}\n{:process 0, :type :ok, :f :append, :key \"6\", :value \"x 0 8 y\"}\n{:process 0, :type :invoke, :f :append, :key \"0\", :value \"x 0 9 y\"}\n{:process 29, :type :ok, :f :append, :key \"1\", :value \"x 29 1 y\"}\n{:process 29, :type :invoke, :f :append, :key \"2\", :value \"x 29 2 y\"}\n{:process 11, :type :ok, :f :get, :key \"2\", :value \"x 6 5 yx 18 7 yx 18 8 yx 34 6 yx 34 7 y\"}\n{:process 11, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"2\", :value \"x 1 5 y\"}\n{:process 1, :type :invoke, :f :append, :key \"4\", :value \"x 1 6 y\"}\n{:process 22, :type :ok, :f :get, :key \"0\", :value \"x 39 3 yx 35 3 yx 35 5 yx 2 7 yx 16 5 yx 40 3 yx 46 8 y\"}\n{:process 22, :type :invoke, :f :append, :key \"2\", :value \"x 22 9 y\"}\n{:process 24, :type :ok, :f :append, :key \"7\", :value \"x 24 21 y\"}\n{:process 24, :type :invoke, :f :append, :key \"7\", :value \"x 24 22 y\"}\n{:process 1, :type :ok, :f :append, :key \"4\", :value \"x 1 6 y\"}\n{:process 1, :type :invoke, :f :append, :key \"2\", :value \"x 1 7 y\"}\n{:process 6, :type :ok, :f :append, :key \"4\", :value \"x 6 11 y\"}\n{:process 6, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 yx 38 12 yx 9 4 yx 39 5 yx 8 10 yx 14 12 yx 8 12 yx 35 7 yx 6 7 yx 18 10 yx 15 14 yx 6 10 y\"}\n{:process 25, :type :invoke, :f :append, :key \"5\", :value \"x 25 4 y\"}\n{:process 24, :type :ok, :f :append, :key \"7\", :value \"x 24 22 y\"}\n{:process 24, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 0, :type :ok, :f :append, :key \"0\", :value \"x 0 9 y\"}\n{:process 0, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 22, :type :ok, :f :append, :key \"2\", :value \"x 22 9 y\"}\n{:process 22, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"2\", :value \"x 1 7 y\"}\n{:process 1, :type :invoke, :f :append, :key \"5\", :value \"x 1 8 y\"}\n{:process 25, :type :ok, :f :append, :key \"5\", :value \"x 25 4 y\"}\n{:process 25, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 0, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 yx 9 8 yx 1 6 yx 6 11 y\"}\n{:process 0, :type :invoke, :f :append, :key \"4\", :value \"x 0 10 y\"}\n{:process 6, :type :ok, :f :get, :key \"0\", :value \"x 39 3 yx 35 3 yx 35 5 yx 2 7 yx 16 5 yx 40 3 yx 46 8 yx 0 9 y\"}\n{:process 6, :type :invoke, :f :append, :key \"8\", :value \"x 6 12 y\"}\n{:process 24, :type :ok, :f :get, :key \"1\", :value \"x 47 7 yx 23 0 yx 25 2 yx 6 3 yx 40 0 yx 37 2 yx 20 3 yx 42 2 yx 33 2 yx 18 2 yx 4 4 yx 36 11 yx 17 7 yx 28 7 yx 45 15 yx 17 10 yx 21 10 yx 26 6 yx 47 8 yx 14 8 yx 47 9 yx 38 8 yx 34 2 yx 34 4 yx 28 13 yx 1 4 yx 48 4 yx 33 3 yx 32 2 yx 8 15 yx 32 3 yx 16 10 yx 27 2 yx 0 7 yx 29 1 y\"}\n{:process 24, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 yx 9 8 yx 1 6 yx 6 11 y\"}\n{:process 25, :type :invoke, :f :append, :key \"6\", :value \"x 25 5 y\"}\n{:process 6, :type :ok, :f :append, :key \"8\", :value \"x 6 12 y\"}\n{:process 6, :type :invoke, :f :put, :key \"1\", :value \"x 6 13 y\"}\n{:process 1, :type :ok, :f :append, :key \"5\", :value \"x 1 8 y\"}\n{:process 1, :type :invoke, :f :append, :key \"9\", :value \"x 1 9 y\"}\n{:process 25, :type :ok, :f :append, :key \"6\", :value \"x 25 5 y\"}\n{:process 25, :type :invoke, :f :append, :key \"7\", :value \"x 25 6 y\"}\n{:process 25, :type :ok, :f :append, :key \"7\", :value \"x 25 6 y\"}\n{:process 25, :type :invoke, :f :append, :key \"6\", :value \"x 25 7 y\"}\n{:process 1, :type :ok, :f :append, :key \"9\", :value \"x 1 9 y\"}\n{:process 1, :type :invoke, :f :append, :key \"9\", :value \"x 1 10 y\"}\n{:process 25, :type :ok, :f :append, :key \"6\", :value \"x 25 7 y\"}\n{:process 25, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 y\"}\n{:process 25, :type :invoke, :f :append, :key \"4\", :value \"x 25 8 y\"}\n{:process 1, :type :ok, :f :append, :key \"9\", :value \"x 1 10 y\"}\n{:process 1, :type :invoke, :f :append, :key \"7\", :value \"x 1 11 y\"}\n{:process 25, :type :ok, :f :append, :key \"4\", :value \"x 25 8 y\"}\n{:process 25, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 1, :type :ok, :f :append, :key \"7\", :value \"x 1 11 y\"}\n{:process 1, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"1\", :value \"x 6 13 y\"}\n{:process 25, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 yx 9 7 yx 6 9 yx 34 9 yx 24 22 yx 25 6 yx 1 11 y\"}\n{:process 25, :type :invoke, :f :append, :key \"7\", :value \"x 25 9 y\"}\n{:process 1, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 yx 17 13 yx 18 9 y\"}\n{:process 1, :type :invoke, :f :append, :key \"8\", :value \"x 1 12 y\"}\n{:process 42, :type :ok, :f :get, :key \"0\", :value \"x 39 3 yx 35 3 yx 35 5 yx 2 7 yx 16 5 yx 40 3 yx 46 8 yx 0 9 y\"}\n{:process 42, :type :invoke, :f :append, :key \"7\", :value \"x 42 6 y\"}\n{:process 1, :type :ok, :f :append, :key \"8\", :value \"x 1 12 y\"}\n{:process 1, :type :invoke, :f :append, :key \"2\", :value \"x 1 13 y\"}\n{:process 25, :type :ok, :f :append, :key \"7\", :value \"x 25 9 y\"}\n{:process 25, :type :invoke, :f :put, :key \"0\", :value \"x 25 10 y\"}\n{:process 25, :type :ok, :f :put, :key \"0\", :value \"x 25 10 y\"}\n{:process 25, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"7\", :value \"x 42 6 y\"}\n{:process 42, :type :invoke, :f :append, :key \"2\", :value \"x 42 7 y\"}\n{:process 44, :type :ok, :f :append, :key \"4\", :value \"x 44 13 y\"}\n{:process 44, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 25, :type :ok, :f :get, :key \"0\", :value \"x 25 10 y\"}\n{:process 25, :type :invoke, :f :append, :key \"5\", :value \"x 25 11 y\"}\n{:process 42, :type :ok, :f :append, :key \"2\", :value \"x 42 7 y\"}\n{:process 42, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 42, :type :ok, :f :get, :key \"1\", :value \"x 6 13 y\"}\n{:process 42, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 44, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 yx 9 8 yx 1 6 yx 6 11 yx 25 8 y\"}\n{:process 44, :type :invoke, :f :append, :key \"3\", :value \"x 44 14 y\"}\n{:process 42, :type :ok, :f :get, :key \"1\", :value \"x 6 13 y\"}\n{:process 42, :type :invoke, :f :append, :key \"4\", :value \"x 42 8 y\"}\n{:process 42, :type :ok, :f :append, :key \"4\", :value \"x 42 8 y\"}\n{:process 42, :type :invoke, :f :put, :key \"0\", :value \"x 42 9 y\"}\n{:process 44, :type :ok, :f :append, :key \"3\", :value \"x 44 14 y\"}\n{:process 44, :type :invoke, :f :append, :key \"6\", :value \"x 44 15 y\"}\n{:process 19, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 yx 9 7 yx 6 9 yx 34 9 yx 24 22 yx 25 6 yx 1 11 yx 25 9 yx 42 6 y\"}\n{:process 19, :type :invoke, :f :append, :key \"2\", :value \"x 19 4 y\"}\n{:process 37, :type :ok, :f :append, :key \"5\", :value \"x 37 4 y\"}\n{:process 37, :type :invoke, :f :append, :key \"0\", :value \"x 37 5 y\"}\n{:process 42, :type :ok, :f :put, :key \"0\", :value \"x 42 9 y\"}\n{:process 42, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 7, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 yx 9 7 yx 6 9 yx 34 9 yx 24 22 yx 25 6 yx 1 11 yx 25 9 yx 42 6 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 3 y\"}\n{:process 31, :type :ok, :f :append, :key \"0\", :value \"x 31 6 y\"}\n{:process 31, :type :invoke, :f :append, :key \"6\", :value \"x 31 7 y\"}\n{:process 44, :type :ok, :f :append, :key \"6\", :value \"x 44 15 y\"}\n{:process 44, :type :invoke, :f :append, :key \"1\", :value \"x 44 16 y\"}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 3 y\"}\n{:process 7, :type :invoke, :f :append, :key \"5\", :value \"x 7 4 y\"}\n{:process 42, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 yx 11 7 yx 20 6 yx 1 9 yx 1 10 y\"}\n{:process 42, :type :invoke, :f :append, :key \"7\", :value \"x 42 10 y\"}\n{:process 4, :type :ok, :f :append, :key \"2\", :value \"x 4 9 y\"}\n{:process 4, :type :invoke, :f :append, :key \"7\", :value \"x 4 10 y\"}\n{:process 19, :type :ok, :f :append, :key \"2\", :value \"x 19 4 y\"}\n{:process 19, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 4, :type :ok, :f :append, :key \"7\", :value \"x 4 10 y\"}\n{:process 4, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"6\", :value \"x 31 7 y\"}\n{:process 31, :type :invoke, :f :append, :key \"1\", :value \"x 31 8 y\"}\n{:process 39, :type :ok, :f :append, :key \"4\", :value \"x 39 6 y\"}\n{:process 39, :type :invoke, :f :append, :key \"4\", :value \"x 39 7 y\"}\n{:process 23, :type :ok, :f :append, :key \"2\", :value \"x 23 5 y\"}\n{:process 23, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 19, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 yx 11 7 yx 20 6 yx 1 9 yx 1 10 y\"}\n{:process 19, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 7, :type :ok, :f :append, :key \"5\", :value \"x 7 4 y\"}\n{:process 7, :type :invoke, :f :append, :key \"2\", :value \"x 7 5 y\"}\n{:process 4, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 yx 11 7 yx 20 6 yx 1 9 yx 1 10 y\"}\n{:process 4, :type :invoke, :f :append, :key \"8\", :value \"x 4 11 y\"}\n{:process 42, :type :ok, :f :append, :key \"7\", :value \"x 42 10 y\"}\n{:process 42, :type :invoke, :f :append, :key \"4\", :value \"x 42 11 y\"}\n{:process 31, :type :ok, :f :append, :key \"1\", :value \"x 31 8 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 9 y\"}\n{:process 41, :type :ok, :f :get, :key \"1\", :value \"x 6 13 yx 31 8 y\"}\n{:process 41, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 39, :type :ok, :f :append, :key \"4\", :value \"x 39 7 y\"}\n{:process 39, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 9 y\"}\n{:process 31, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"1\", :value \"x 6 13 yx 31 8 y\"}\n{:process 41, :type :invoke, :f :get, :key \"6\", :value nil}\n{:process 42, :type :ok, :f :append, :key \"4\", :value \"x 42 11 y\"}\n{:process 42, :type :invoke, :f :append, :key \"1\", :value \"x 42 12 y\"}\n{:process 23, :type :ok, :f :get, :key \"1\", :value \"x 6 13 yx 31 8 y\"}\n{:process 23, :type :invoke, :f :append, :key \"2\", :value \"x 23 6 y\"}\n{:process 4, :type :ok, :f :append, :key \"8\", :value \"x 4 11 y\"}\n{:process 4, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 39, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 y\"}\n{:process 39, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 yx 9 8 yx 1 6 yx 6 11 yx 25 8 yx 42 8 yx 39 6 yx 39 7 yx 31 9 yx 42 11 y\"}\n{:process 31, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"0\", :value \"x 2 7 y\"}\n{:process 2, :type :invoke, :f :append, :key \"7\", :value \"x 2 8 y\"}\n{:process 41, :type :ok, :f :get, :key \"6\", :value \"x 40 4 yx 0 8 yx 25 5 yx 25 7 yx 44 15 yx 31 7 y\"}\n{:process 41, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"2\", :value \"x 23 6 y\"}\n{:process 23, :type :invoke, :f :append, :key \"9\", :value \"x 23 7 y\"}\n{:process 4, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 y\"}\n{:process 4, :type :invoke, :f :append, :key \"5\", :value \"x 4 12 y\"}\n{:process 4, :type :ok, :f :append, :key \"5\", :value \"x 4 12 y\"}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 13 y\"}\n{:process 2, :type :ok, :f :append, :key \"7\", :value \"x 2 8 y\"}\n{:process 2, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 23, :type :ok, :f :append, :key \"9\", :value \"x 23 7 y\"}\n{:process 23, :type :invoke, :f :append, :key \"5\", :value \"x 23 8 y\"}\n{:process 31, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 yx 9 7 yx 6 9 yx 34 9 yx 24 22 yx 25 6 yx 1 11 yx 25 9 yx 42 6 yx 4 10 yx 42 10 yx 2 8 y\"}\n{:process 31, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 41, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 yx 17 13 yx 18 9 yx 44 14 y\"}\n{:process 41, :type :invoke, :f :append, :key \"2\", :value \"x 41 11 y\"}\n{:process 2, :type :ok, :f :get, :key \"5\", :value \"x 14 5 yx 38 5 yx 39 2 yx 47 11 yx 38 12 yx 9 4 yx 39 5 yx 8 10 yx 14 12 yx 8 12 yx 35 7 yx 6 7 yx 18 10 yx 15 14 yx 6 10 yx 25 4 yx 1 8 yx 37 4 yx 7 3 yx 7 4 yx 4 12 y\"}\n{:process 2, :type :invoke, :f :append, :key \"3\", :value \"x 2 9 y\"}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 13 y\"}\n{:process 4, :type :invoke, :f :append, :key \"3\", :value \"x 4 14 y\"}\n{:process 41, :type :ok, :f :append, :key \"2\", :value \"x 41 11 y\"}\n{:process 31, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 y\"}\n{:process 41, :type :invoke, :f :append, :key \"9\", :value \"x 41 12 y\"}\n{:process 31, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 yx 17 13 yx 18 9 yx 44 14 yx 4 13 y\"}\n{:process 26, :type :invoke, :f :append, :key \"4\", :value \"x 26 9 y\"}\n{:process 2, :type :ok, :f :append, :key \"3\", :value \"x 2 9 y\"}\n{:process 2, :type :invoke, :f :put, :key \"5\", :value \"x 2 10 y\"}\n{:process 4, :type :ok, :f :append, :key \"3\", :value \"x 4 14 y\"}\n{:process 4, :type :invoke, :f :append, :key \"4\", :value \"x 4 15 y\"}\n{:process 14, :type :ok, :f :get, :key \"1\", :value \"x 6 13 yx 31 8 yx 42 12 y\"}\n{:process 14, :type :invoke, :f :append, :key \"6\", :value \"x 14 13 y\"}\n{:process 31, :type :ok, :f :get, :key \"2\", :value \"x 6 5 yx 18 7 yx 18 8 yx 34 6 yx 34 7 yx 29 2 yx 22 9 yx 1 7 yx 1 13 yx 42 7 yx 19 4 yx 7 5 yx 23 6 yx 41 11 y\"}\n{:process 31, :type :invoke, :f :append, :key \"6\", :value \"x 31 10 y\"}\n{:process 4, :type :ok, :f :append, :key \"4\", :value \"x 4 15 y\"}\n{:process 4, :type :invoke, :f :append, :key \"6\", :value \"x 4 16 y\"}\n{:process 2, :type :ok, :f :put, :key \"5\", :value \"x 2 10 y\"}\n{:process 2, :type :invoke, :f :append, :key \"4\", :value \"x 2 11 y\"}\n{:process 26, :type :ok, :f :append, :key \"4\", :value \"x 26 9 y\"}\n{:process 26, :type :invoke, :f :append, :key \"4\", :value \"x 26 10 y\"}\n{:process 26, :type :ok, :f :append, :key \"4\", :value \"x 26 10 y\"}\n{:process 26, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 31, :type :ok, :f :append, :key \"6\", :value \"x 31 10 y\"}\n{:process 31, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 2, :type :ok, :f :append, :key \"4\", :value \"x 2 11 y\"}\n{:process 2, :type :invoke, :f :append, :key \"8\", :value \"x 2 12 y\"}\n{:process 14, :type :ok, :f :append, :key \"6\", :value \"x 14 13 y\"}\n{:process 14, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 14, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 yx 9 7 yx 6 9 yx 34 9 yx 24 22 yx 25 6 yx 1 11 yx 25 9 yx 42 6 yx 4 10 yx 42 10 yx 2 8 y\"}\n{:process 14, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 26, :type :ok, :f :get, :key \"0\", :value \"x 42 9 yx 37 5 yx 31 6 y\"}\n{:process 26, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"0\", :value \"x 42 9 yx 37 5 yx 31 6 y\"}\n{:process 31, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 12, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 yx 9 7 yx 6 9 yx 34 9 yx 24 22 yx 25 6 yx 1 11 yx 25 9 yx 42 6 yx 4 10 yx 42 10 yx 2 8 y\"}\n{:process 12, :type :invoke, :f :append, :key \"6\", :value \"x 12 2 y\"}\n{:process 14, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 y\"}\n{:process 14, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 31, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 yx 11 7 yx 20 6 yx 1 9 yx 1 10 yx 23 7 yx 41 12 y\"}\n{:process 31, :type :invoke, :f :append, :key \"4\", :value \"x 31 11 y\"}\n{:process 47, :type :ok, :f :get, :key \"6\", :value \"x 40 4 yx 0 8 yx 25 5 yx 25 7 yx 44 15 yx 31 7 yx 31 10 yx 14 13 yx 4 16 y\"}\n{:process 47, :type :invoke, :f :append, :key \"5\", :value \"x 47 16 y\"}\n{:process 31, :type :ok, :f :append, :key \"4\", :value \"x 31 11 y\"}\n{:process 31, :type :invoke, :f :append, :key \"9\", :value \"x 31 12 y\"}\n{:process 14, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 yx 9 8 yx 1 6 yx 6 11 yx 25 8 yx 42 8 yx 39 6 yx 39 7 yx 31 9 yx 42 11 yx 4 15 yx 26 9 yx 26 10 yx 2 11 yx 31 11 y\"}\n{:process 14, :type :invoke, :f :append, :key \"6\", :value \"x 14 14 y\"}\n{:process 47, :type :ok, :f :append, :key \"5\", :value \"x 47 16 y\"}\n{:process 47, :type :invoke, :f :append, :key \"9\", :value \"x 47 17 y\"}\n{:process 14, :type :ok, :f :append, :key \"6\", :value \"x 14 14 y\"}\n{:process 14, :type :invoke, :f :append, :key \"3\", :value \"x 14 15 y\"}\n{:process 33, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 y\"}\n{:process 33, :type :invoke, :f :append, :key \"6\", :value \"x 33 5 y\"}\n{:process 36, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 y\"}\n{:process 36, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 33, :type :ok, :f :append, :key \"6\", :value \"x 33 5 y\"}\n{:process 33, :type :invoke, :f :get, :key \"8\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 yx 11 7 yx 20 6 yx 1 9 yx 1 10 yx 23 7 yx 41 12 yx 31 12 yx 47 17 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 12 y\"}\n{:process 8, :type :ok, :f :append, :key \"2\", :value \"x 8 16 y\"}\n{:process 8, :type :invoke, :f :append, :key \"6\", :value \"x 8 17 y\"}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 12 y\"}\n{:process 36, :type :invoke, :f :append, :key \"2\", :value \"x 36 13 y\"}\n{:process 38, :type :ok, :f :append, :key \"5\", :value \"x 38 15 y\"}\n{:process 38, :type :invoke, :f :get, :key \"4\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"2\", :value \"x 36 13 y\"}\n{:process 36, :type :invoke, :f :append, :key \"3\", :value \"x 36 14 y\"}\n{:process 36, :type :ok, :f :append, :key \"3\", :value \"x 36 14 y\"}\n{:process 36, :type :invoke, :f :get, :key \"5\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"5\", :value \"x 2 10 yx 47 16 yx 38 15 y\"}\n{:process 36, :type :invoke, :f :put, :key \"0\", :value \"x 36 15 y\"}\n{:process 36, :type :ok, :f :put, :key \"0\", :value \"x 36 15 y\"}\n{:process 36, :type :invoke, :f :append, :key \"2\", :value \"x 36 16 y\"}\n{:process 36, :type :ok, :f :append, :key \"2\", :value \"x 36 16 y\"}\n{:process 36, :type :invoke, :f :append, :key \"0\", :value \"x 36 17 y\"}\n{:process 36, :type :ok, :f :append, :key \"0\", :value \"x 36 17 y\"}\n{:process 36, :type :invoke, :f :append, :key \"8\", :value \"x 36 18 y\"}\n{:process 32, :type :ok, :f :append, :key \"3\", :value \"x 32 4 y\"}\n{:process 32, :type :invoke, :f :get, :key \"3\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"8\", :value \"x 36 18 y\"}\n{:process 36, :type :invoke, :f :get, :key \"7\", :value nil}\n{:process 36, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 yx 9 7 yx 6 9 yx 34 9 yx 24 22 yx 25 6 yx 1 11 yx 25 9 yx 42 6 yx 4 10 yx 42 10 yx 2 8 y\"}\n{:process 36, :type :invoke, :f :append, :key \"5\", :value \"x 36 19 y\"}\n{:process 17, :type :ok, :f :append, :key \"1\", :value \"x 17 15 y\"}\n{:process 17, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 36, :type :ok, :f :append, :key \"5\", :value \"x 36 19 y\"}\n{:process 36, :type :invoke, :f :append, :key \"8\", :value \"x 36 20 y\"}\n{:process 21, :type :ok, :f :append, :key \"2\", :value \"x 21 12 y\"}\n{:process 21, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"4\", :value \"x 49 7 y\"}\n{:process 49, :type :invoke, :f :append, :key \"9\", :value \"x 49 8 y\"}\n{:process 10, :type :ok, :f :append, :key \"8\", :value \"x 10 5 y\"}\n{:process 10, :type :invoke, :f :get, :key \"0\", :value nil}\n{:process 17, :type :ok, :f :get, :key \"1\", :value \"x 6 13 yx 31 8 yx 42 12 yx 17 15 y\"}\n{:process 17, :type :invoke, :f :append, :key \"9\", :value \"x 17 16 y\"}\n{:process 21, :type :ok, :f :get, :key \"0\", :value \"x 36 15 yx 36 17 y\"}\n{:process 21, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 10, :type :ok, :f :get, :key \"0\", :value \"x 36 15 yx 36 17 y\"}\n{:process 10, :type :invoke, :f :get, :key \"1\", :value nil}\n{:process 49, :type :ok, :f :append, :key \"9\", :value \"x 49 8 y\"}\n{:process 49, :type :invoke, :f :append, :key \"5\", :value \"x 49 9 y\"}\n{:process 28, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 yx 9 7 yx 6 9 yx 34 9 yx 24 22 yx 25 6 yx 1 11 yx 25 9 yx 42 6 yx 4 10 yx 42 10 yx 2 8 y\"}\n{:process 28, :type :invoke, :f :get, :key \"2\", :value nil}\n{:process 46, :type :ok, :f :append, :key \"0\", :value \"x 46 8 y\"}\n{:process 46, :type :invoke, :f :get, :key \"9\", :value nil}\n{:process 16, :type :ok, :f :append, :key \"3\", :value \"x 16 11 y\"}\n{:process 16, :type :invoke, :f :append, :key \"1\", :value \"x 16 12 y\"}\n{:process 17, :type :ok, :f :append, :key \"9\", :value \"x 17 16 y\"}\n{:process 17, :type :invoke, :f :append, :key \"0\", :value \"x 17 17 y\"}\n{:process 10, :type :ok, :f :get, :key \"1\", :value \"x 6 13 yx 31 8 yx 42 12 yx 17 15 y\"}\n{:process 10, :type :invoke, :f :append, :key \"4\", :value \"x 10 6 y\"}\n{:process 45, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 yx 9 8 yx 1 6 yx 6 11 yx 25 8 yx 42 8 yx 39 6 yx 39 7 yx 31 9 yx 42 11 yx 4 15 yx 26 9 yx 26 10 yx 2 11 yx 31 11 y\"}\n{:process 18, :type :ok, :f :get, :key \"6\", :value \"x 40 4 yx 0 8 yx 25 5 yx 25 7 yx 44 15 yx 31 7 yx 31 10 yx 14 13 yx 4 16 yx 14 14 yx 33 5 yx 8 17 y\"}\n{:process 8, :type :ok, :f :append, :key \"6\", :value \"x 8 17 y\"}\n{:process 21, :type :ok, :f :get, :key \"1\", :value \"x 6 13 yx 31 8 yx 42 12 yx 17 15 y\"}\n{:process 49, :type :ok, :f :append, :key \"5\", :value \"x 49 9 y\"}\n{:process 23, :type :ok, :f :append, :key \"5\", :value \"x 23 8 y\"}\n{:process 28, :type :ok, :f :get, :key \"2\", :value \"x 6 5 yx 18 7 yx 18 8 yx 34 6 yx 34 7 yx 29 2 yx 22 9 yx 1 7 yx 1 13 yx 42 7 yx 19 4 yx 7 5 yx 23 6 yx 41 11 yx 36 13 yx 36 16 yx 21 12 y\"}\n{:process 9, :type :ok, :f :append, :key \"4\", :value \"x 9 8 y\"}\n{:process 38, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 yx 9 8 yx 1 6 yx 6 11 yx 25 8 yx 42 8 yx 39 6 yx 39 7 yx 31 9 yx 42 11 yx 4 15 yx 26 9 yx 26 10 yx 2 11 yx 31 11 y\"}\n{:process 43, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 yx 17 13 yx 18 9 yx 44 14 yx 4 13 yx 2 9 yx 4 14 yx 14 15 yx 36 14 yx 32 4 yx 16 11 y\"}\n{:process 20, :type :ok, :f :append, :key \"1\", :value \"x 20 7 y\"}\n{:process 19, :type :ok, :f :get, :key \"0\", :value \"x 36 15 yx 36 17 y\"}\n{:process 22, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 yx 36 18 yx 36 20 yx 10 5 y\"}\n{:process 2, :type :ok, :f :append, :key \"8\", :value \"x 2 12 y\"}\n{:process 24, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 yx 17 13 yx 18 9 yx 44 14 yx 4 13 yx 2 9 yx 4 14 yx 14 15 yx 36 14 yx 32 4 yx 16 11 y\"}\n{:process 12, :type :ok, :f :append, :key \"6\", :value \"x 12 2 y\"}\n{:process 48, :type :ok, :f :get, :key \"0\", :value \"x 36 15 yx 36 17 y\"}\n{:process 32, :type :ok, :f :get, :key \"3\", :value \"x 28 16 yx 8 8 yx 31 4 yx 43 3 yx 43 4 yx 35 4 yx 8 13 yx 16 3 yx 18 6 yx 3 8 yx 17 13 yx 18 9 yx 44 14 yx 4 13 yx 2 9 yx 4 14 yx 14 15 yx 36 14 yx 32 4 yx 16 11 y\"}\n{:process 36, :type :ok, :f :append, :key \"8\", :value \"x 36 20 y\"}\n{:process 42, :type :ok, :f :append, :key \"1\", :value \"x 42 12 y\"}\n{:process 39, :type :ok, :f :get, :key \"5\", :value \"x 2 10 yx 47 16 yx 38 15 yx 36 19 yx 49 9 y\"}\n{:process 16, :type :ok, :f :append, :key \"1\", :value \"x 16 12 y\"}\n{:process 15, :type :ok, :f :get, :key \"1\", :value \"x 6 13 yx 31 8 yx 42 12 yx 17 15 yx 20 7 yx 16 12 y\"}\n{:process 4, :type :ok, :f :append, :key \"6\", :value \"x 4 16 y\"}\n{:process 13, :type :ok, :f :get, :key \"4\", :value \"x 26 7 yx 47 14 yx 49 7 yx 0 5 yx 44 13 yx 9 8 yx 1 6 yx 6 11 yx 25 8 yx 42 8 yx 39 6 yx 39 7 yx 31 9 yx 42 11 yx 4 15 yx 26 9 yx 26 10 yx 2 11 yx 31 11 yx 0 10 yx 10 6 y\"}\n{:process 40, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 yx 11 7 yx 20 6 yx 1 9 yx 1 10 yx 23 7 yx 41 12 yx 31 12 yx 47 17 yx 49 8 yx 17 16 y\"}\n{:process 46, :type :ok, :f :get, :key \"9\", :value \"x 35 1 yx 19 1 yx 40 2 yx 31 0 yx 9 0 yx 41 8 yx 10 0 yx 23 2 yx 26 3 yx 26 6 yx 45 4 yx 26 7 yx 7 9 yx 31 6 yx 26 9 yx 46 6 yx 42 10 yx 48 2 yx 20 6 yx 1 6 yx 14 16 yx 24 6 yx 41 2 yx 45 8 yx 23 1 yx 30 2 yx 21 3 yx 45 9 yx 45 10 yx 21 6 yx 5 1 yx 45 14 yx 22 7 yx 18 1 yx 42 3 yx 16 1 yx 4 6 yx 0 0 yx 41 9 yx 24 10 yx 13 0 yx 24 12 yx 17 9 yx 3 5 yx 17 11 yx 38 1 yx 48 2 yx 38 6 yx 9 3 yx 11 4 yx 9 5 yx 8 11 yx 33 4 yx 16 4 yx 38 14 yx 11 7 yx 20 6 yx 1 9 yx 1 10 yx 23 7 yx 41 12 yx 31 12 yx 47 17 yx 49 8 yx 17 16 y\"}\n{:process 7, :type :ok, :f :append, :key \"2\", :value \"x 7 5 y\"}\n{:process 17, :type :ok, :f :append, :key \"0\", :value \"x 17 17 y\"}\n{:process 27, :type :ok, :f :append, :key \"7\", :value \"x 27 3 y\"}\n{:process 44, :type :ok, :f :append, :key \"1\", :value \"x 44 16 y\"}\n{:process 47, :type :ok, :f :append, :key \"9\", :value \"x 47 17 y\"}\n{:process 37, :type :ok, :f :append, :key \"0\", :value \"x 37 5 y\"}\n{:process 26, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 yx 36 18 yx 36 20 yx 10 5 yx 2 12 y\"}\n{:process 25, :type :ok, :f :append, :key \"5\", :value \"x 25 11 y\"}\n{:process 34, :type :ok, :f :append, :key \"9\", :value \"x 34 10 y\"}\n{:process 35, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 yx 36 18 yx 36 20 yx 10 5 yx 2 12 y\"}\n{:process 6, :type :ok, :f :put, :key \"1\", :value \"x 6 13 y\"}\n{:process 30, :type :ok, :f :get, :key \"7\", :value \"x 14 10 yx 38 13 yx 16 7 yx 45 23 yx 46 7 yx 45 24 yx 9 7 yx 6 9 yx 34 9 yx 24 22 yx 25 6 yx 1 11 yx 25 9 yx 42 6 yx 4 10 yx 42 10 yx 2 8 yx 27 3 y\"}\n{:process 41, :type :ok, :f :append, :key \"9\", :value \"x 41 12 y\"}\n{:process 31, :type :ok, :f :append, :key \"9\", :value \"x 31 12 y\"}\n{:process 1, :type :ok, :f :append, :key \"2\", :value \"x 1 13 y\"}\n{:process 0, :type :ok, :f :append, :key \"4\", :value \"x 0 10 y\"}\n{:process 29, :type :ok, :f :append, :key \"2\", :value \"x 29 2 y\"}\n{:process 3, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 yx 36 18 yx 36 20 yx 10 5 yx 2 12 y\"}\n{:process 10, :type :ok, :f :append, :key \"4\", :value \"x 10 6 y\"}\n{:process 14, :type :ok, :f :append, :key \"3\", :value \"x 14 15 y\"}\n{:process 11, :type :ok, :f :get, :key \"2\", :value \"x 6 5 yx 18 7 yx 18 8 yx 34 6 yx 34 7 yx 29 2 yx 22 9 yx 1 7 yx 1 13 yx 42 7 yx 19 4 yx 7 5 yx 23 6 yx 41 11 yx 36 13 yx 36 16 yx 21 12 y\"}\n{:process 33, :type :ok, :f :get, :key \"8\", :value \"x 35 8 yx 16 6 yx 3 7 yx 45 21 yx 6 6 yx 16 8 yx 9 6 yx 6 8 yx 34 8 yx 6 12 yx 1 12 yx 4 11 yx 36 18 yx 36 20 yx 10 5 yx 2 12 y\"}\n{:process 5, :type :ok, :f :get, :key \"6\", :value \"x 40 4 yx 0 8 yx 25 5 yx 25 7 yx 44 15 yx 31 7 yx 31 10 yx 14 13 yx 4 16 yx 14 14 yx 33 5 yx 8 17 yx 12 2 y\"}"
  },
  {
    "path": "courses/dss/percolator/Cargo.toml",
    "content": "[package]\nname = \"percolator\"\nversion = \"0.1.0\"\nauthors = [\"Ryan Leung <rleungx@gmail.com>\"]\nedition = \"2018\"\nbuild = \"build.rs\"\npublish = false\n\n[dependencies]\nasync-trait = \"0.1\"\nfutures = \"0.3\"\nfutures-timer = \"3.0\"\nlog = \"0.4\"\nprost = \"0.6\"\nprost-derive = \"0.6\"\n\nlabrpc = { path = \"../labrpc\" }\nlabcodec = { path = \"../labcodec\" }\n\n[build-dependencies]\nprost-build = \"0.6\"\n\n[dev-dependencies]\nenv_logger = \"0.7\"\n"
  },
  {
    "path": "courses/dss/percolator/README.md",
    "content": "# The Percolator lab\n\n## What is Percolator\n\nPercolator is a system built by Google for incremental processing on a very\nlarge data set. Percolator also provides a distributed transaction protocol with\nACID snapshot-isolation semantics. You can find more details in the paper:\n[Large-scale Incremental Processing Using Distributed Transactions and Notifications](https://storage.googleapis.com/pub-tools-public-publication-data/pdf/36726.pdf).\n\n## Lab prerequisites\n\nTo start this lab, there are some prerequisites you need to:\n\n1. be familiar with Rust (You can also learn something from our Rust training\ncourse)\n\n2. know about how protobuf works\n\n3. have basic knowledge of how RPC works\n\n4. have basic knowledge of what is the distributed transaction\n\n## Concepts of the lab\n\n### Server\n\nThere are two kinds of servers which provide different services in this lab: the\nTSO server and the storage server.\n\n#### TSO server\n\nPercolator relies on a service named *timestamp oracle*. The TSO server\nimplemented by `TimestampOracle` can produce timestamps in a strictly increasing\norder. All transactions need to get the unique timestamp to indicate the\nexecution order.\n\n#### Storage server\n\nPercolator is built upon the Bigtable, which presents a multi-dimensional sorted\nmap to users. In this lab, the storage server implemented by `MemoryStorage`,\nwhich consists of three columns, is used to simulate the Bigtable. These columns\nwhich implemented by `BTreeMap` are similar to the column in the Bigtable. In\nparticular, the `MemoryStorage` has three columns: `Write`, `Data`, `Lock` to\nkeep consistent with the Bigtable.\n\nBesides, the storage also needs to provide the basic operations like `read`,\n`write` and `erase` to manipulate the data stored in it.\n\n### Client\n\nThe client will `begin` a transaction which contains a set of operations, like\n`get` and `set`, and call `commit` to commit a transaction. Also, the client\nwill call `get_timestamp` to obtain a timestamp.\n\nMore implementation details can be found in the paper.\n\n## Writing your own implementation\n\nThere are some comments leaving in this project such as \"Your definitions here\"\nor \"Your code here\". You need to write the code by yourself according to the paper.\nThere are not many strict restrictions, and thus you can define as many variables\nin both *struct* and *proto* as required to implement the functionality.\n\n## Testing your work\n\nYou can directly run the following command in the current directory:\n\n```sh\nmake test_percolator\n```\n"
  },
  {
    "path": "courses/dss/percolator/build.rs",
    "content": "fn main() {\n    prost_build::compile_protos(&[\"proto/msg.proto\"], &[\"proto\"]).unwrap();\n    println!(\"cargo:rerun-if-changed=proto\");\n}\n"
  },
  {
    "path": "courses/dss/percolator/proto/msg.proto",
    "content": "// Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data.\n// You can define how you want your data to be structured.\n// Details can be found in https://developers.google.com/protocol-buffers/docs/proto3.\n\n// Once you have defined the message, the `build.rs` will generate the corresponding data structure in `OUT_DIR`.\n// You can use the structure by importing the `msg` module.\n// Example:\n// use crate::msg::CommitRequest;\n\nsyntax = \"proto3\";\n\npackage msg;\n\nmessage TimestampRequest {}\n\nmessage TimestampResponse {}\n\nmessage GetRequest {}\n\nmessage GetResponse {}\n\nmessage PrewriteRequest {}\n\nmessage PrewriteResponse {}\n\nmessage CommitRequest {\n    bool is_primary = 1;\n}\n\nmessage CommitResponse {}\n"
  },
  {
    "path": "courses/dss/percolator/src/client.rs",
    "content": "use labrpc::*;\n\nuse crate::service::{TSOClient, TransactionClient};\n\n// BACKOFF_TIME_MS is the wait time before retrying to send the request.\n// It should be exponential growth. e.g.\n//|  retry time  |  backoff time  |\n//|--------------|----------------|\n//|      1       |       100      |\n//|      2       |       200      |\n//|      3       |       400      |\nconst BACKOFF_TIME_MS: u64 = 100;\n// RETRY_TIMES is the maximum number of times a client attempts to send a request.\nconst RETRY_TIMES: usize = 3;\n\n/// Client mainly has two purposes:\n/// One is getting a monotonically increasing timestamp from TSO (Timestamp Oracle).\n/// The other is do the transaction logic.\n#[derive(Clone)]\npub struct Client {\n    // Your definitions here.\n}\n\nimpl Client {\n    /// Creates a new Client.\n    pub fn new(tso_client: TSOClient, txn_client: TransactionClient) -> Client {\n        // Your code here.\n        Client {}\n    }\n\n    /// Gets a timestamp from a TSO.\n    pub fn get_timestamp(&self) -> Result<u64> {\n        // Your code here.\n        unimplemented!()\n    }\n\n    /// Begins a new transaction.\n    pub fn begin(&mut self) {\n        // Your code here.\n        unimplemented!()\n    }\n\n    /// Gets the value for a given key.\n    pub fn get(&self, key: Vec<u8>) -> Result<Vec<u8>> {\n        // Your code here.\n        unimplemented!()\n    }\n\n    /// Sets keys in a buffer until commit time.\n    pub fn set(&mut self, key: Vec<u8>, value: Vec<u8>) {\n        // Your code here.\n        unimplemented!()\n    }\n\n    /// Commits a transaction.\n    pub fn commit(&self) -> Result<bool> {\n        // Your code here.\n        unimplemented!()\n    }\n}\n"
  },
  {
    "path": "courses/dss/percolator/src/lib.rs",
    "content": "#[allow(unused_imports)]\n#[macro_use]\nextern crate log;\n\n// After you finish the implementation, `#[allow(unused)]` should be removed.\n#[allow(dead_code, unused)]\nmod client;\n#[allow(unused)]\nmod server;\nmod service;\n#[cfg(test)]\nmod tests;\n\n// This is related to protobuf as described in `msg.proto`.\nmod msg {\n    include!(concat!(env!(\"OUT_DIR\"), \"/msg.rs\"));\n}\n"
  },
  {
    "path": "courses/dss/percolator/src/server.rs",
    "content": "use std::collections::BTreeMap;\nuse std::sync::{Arc, Mutex};\nuse std::time::Duration;\n\nuse crate::msg::*;\nuse crate::service::*;\nuse crate::*;\n\n// TTL is used for a lock key.\n// If the key's lifetime exceeds this value, it should be cleaned up.\n// Otherwise, the operation should back off.\nconst TTL: u64 = Duration::from_millis(100).as_nanos() as u64;\n\n#[derive(Clone, Default)]\npub struct TimestampOracle {\n    // You definitions here if needed.\n}\n\n#[async_trait::async_trait]\nimpl timestamp::Service for TimestampOracle {\n    // example get_timestamp RPC handler.\n    async fn get_timestamp(&self, _: TimestampRequest) -> labrpc::Result<TimestampResponse> {\n        // Your code here.\n        unimplemented!()\n    }\n}\n\n// Key is a tuple (raw key, timestamp).\npub type Key = (Vec<u8>, u64);\n\n#[derive(Clone, PartialEq)]\npub enum Value {\n    Timestamp(u64),\n    Vector(Vec<u8>),\n}\n\n#[derive(Debug, Clone)]\npub struct Write(Vec<u8>, Vec<u8>);\n\npub enum Column {\n    Write,\n    Data,\n    Lock,\n}\n\n// KvTable is used to simulate Google's Bigtable.\n// It provides three columns: Write, Data, and Lock.\n#[derive(Clone, Default)]\npub struct KvTable {\n    write: BTreeMap<Key, Value>,\n    data: BTreeMap<Key, Value>,\n    lock: BTreeMap<Key, Value>,\n}\n\nimpl KvTable {\n    // Reads the latest key-value record from a specified column\n    // in MemoryStorage with a given key and a timestamp range.\n    #[inline]\n    fn read(\n        &self,\n        key: Vec<u8>,\n        column: Column,\n        ts_start_inclusive: Option<u64>,\n        ts_end_inclusive: Option<u64>,\n    ) -> Option<(&Key, &Value)> {\n        // Your code here.\n        unimplemented!()\n    }\n\n    // Writes a record to a specified column in MemoryStorage.\n    #[inline]\n    fn write(&mut self, key: Vec<u8>, column: Column, ts: u64, value: Value) {\n        // Your code here.\n        unimplemented!()\n    }\n\n    #[inline]\n    // Erases a record from a specified column in MemoryStorage.\n    fn erase(&mut self, key: Vec<u8>, column: Column, commit_ts: u64) {\n        // Your code here.\n        unimplemented!()\n    }\n}\n\n// MemoryStorage is used to wrap a KvTable.\n// You may need to get a snapshot from it.\n#[derive(Clone, Default)]\npub struct MemoryStorage {\n    data: Arc<Mutex<KvTable>>,\n}\n\n#[async_trait::async_trait]\nimpl transaction::Service for MemoryStorage {\n    // example get RPC handler.\n    async fn get(&self, req: GetRequest) -> labrpc::Result<GetResponse> {\n        // Your code here.\n        unimplemented!()\n    }\n\n    // example prewrite RPC handler.\n    async fn prewrite(&self, req: PrewriteRequest) -> labrpc::Result<PrewriteResponse> {\n        // Your code here.\n        unimplemented!()\n    }\n\n    // example commit RPC handler.\n    async fn commit(&self, req: CommitRequest) -> labrpc::Result<CommitResponse> {\n        // Your code here.\n        unimplemented!()\n    }\n}\n\nimpl MemoryStorage {\n    fn back_off_maybe_clean_up_lock(&self, start_ts: u64, key: Vec<u8>) {\n        // Your code here.\n        unimplemented!()\n    }\n}\n"
  },
  {
    "path": "courses/dss/percolator/src/service.rs",
    "content": "use crate::msg::{\n    CommitRequest, CommitResponse, GetRequest, GetResponse, PrewriteRequest, PrewriteResponse,\n    TimestampRequest, TimestampResponse,\n};\n\nlabrpc::service! {\n    service timestamp {\n        rpc get_timestamp(TimestampRequest) returns (TimestampResponse);\n    }\n}\n\npub use timestamp::{add_service as add_tso_service, Client as TSOClient, Service};\n\nlabrpc::service! {\n    service transaction {\n        rpc get(GetRequest) returns (GetResponse);\n        rpc prewrite(PrewriteRequest) returns (PrewriteResponse);\n        rpc commit(CommitRequest) returns (CommitResponse);\n    }\n}\n\npub use transaction::{add_service as add_transaction_service, Client as TransactionClient};\n"
  },
  {
    "path": "courses/dss/percolator/src/tests.rs",
    "content": "use std::sync::{\n    atomic::{AtomicBool, Ordering},\n    Arc,\n};\nuse std::thread;\nuse std::time::Duration;\n\nuse labrpc::*;\nuse prost::Message;\n\nuse crate::client::Client;\nuse crate::server::{MemoryStorage, TimestampOracle};\nuse crate::service::{add_transaction_service, add_tso_service, TSOClient, TransactionClient};\n\nstruct CommitHooks {\n    drop_req: AtomicBool,\n    drop_resp: AtomicBool,\n    fail_primary: AtomicBool,\n}\n\nimpl RpcHooks for CommitHooks {\n    fn before_dispatch(&self, fq_name: &str, req: &[u8]) -> Result<()> {\n        if self.drop_req.load(Ordering::Relaxed) && fq_name == \"transaction.commit\" {\n            let m = crate::msg::CommitRequest::decode(req).unwrap();\n            if m.is_primary && !self.fail_primary.load(Ordering::Relaxed) {\n                return Ok(());\n            }\n            return Err(Error::Other(\"reqhook\".to_owned()));\n        }\n        Ok(())\n    }\n    fn after_dispatch(&self, fq_name: &str, resp: Result<Vec<u8>>) -> Result<Vec<u8>> {\n        if self.drop_resp.load(Ordering::Relaxed) && fq_name == \"transaction.commit\" {\n            return Err(Error::Other(\"resphook\".to_owned()));\n        }\n        resp\n    }\n}\n\nfn init_logger() {\n    use std::sync::Once;\n    static LOGGER_INIT: Once = Once::new();\n    LOGGER_INIT.call_once(env_logger::init);\n}\n\nfn init(num_clinet: usize) -> (Network, Vec<Client>, Arc<CommitHooks>) {\n    init_logger();\n\n    let mut clients = vec![];\n    let rn = Network::new();\n    let tso_server_name = \"tso_server\";\n    let mut tso_server_builder = ServerBuilder::new(tso_server_name.to_owned());\n    let server_name = \"server\";\n    let mut server_builder = ServerBuilder::new(server_name.to_owned());\n    let tso: TimestampOracle = Default::default();\n    add_tso_service(tso, &mut tso_server_builder).unwrap();\n    let store: MemoryStorage = Default::default();\n    add_transaction_service(store, &mut server_builder).unwrap();\n    let tso_server = tso_server_builder.build();\n    let server = server_builder.build();\n    rn.add_server(tso_server);\n    rn.add_server(server);\n    let hook = Arc::new(CommitHooks {\n        drop_req: AtomicBool::new(false),\n        drop_resp: AtomicBool::new(false),\n        fail_primary: AtomicBool::new(false),\n    });\n    for i in 0..num_clinet {\n        let txn_name_string = format!(\"txn{}\", i);\n        let txn_name = txn_name_string.as_str();\n        let cli = rn.create_client(txn_name.to_owned());\n        cli.set_hooks(hook.clone());\n        let txn_client = TransactionClient::new(cli);\n        rn.enable(txn_name, true);\n        rn.connect(txn_name, server_name);\n        let tso_name_string = format!(\"tso{}\", i);\n        let tso_name = tso_name_string.as_str();\n        let cli = rn.create_client(tso_name.to_owned());\n        let tso_client = TSOClient::new(cli);\n        rn.enable(tso_name, true);\n        rn.connect(tso_name, tso_server_name);\n        clients.push(crate::client::Client::new(tso_client, txn_client));\n    }\n\n    (rn, clients, hook)\n}\n\n#[test]\nfn test_get_timestamp_under_unreliable_network() {\n    let (rn, clients, _) = init(3);\n    let mut children = vec![];\n\n    for (i, _) in clients.iter().enumerate() {\n        let client = clients[i].to_owned();\n        let tso_name_string = format!(\"tso{}\", i);\n        rn.enable(tso_name_string.as_str(), false);\n        children.push(thread::spawn(move || {\n            let res = client.get_timestamp();\n            if i == 2 {\n                assert_eq!(res, Err(Error::Timeout));\n            } else {\n                assert!(res.is_ok());\n            }\n        }));\n    }\n\n    thread::sleep(Duration::from_millis(100));\n    rn.enable(\"tso0\", true);\n    thread::sleep(Duration::from_millis(200));\n    rn.enable(\"tso1\", true);\n    thread::sleep(Duration::from_millis(400));\n    rn.enable(\"tso2\", true);\n\n    for child in children {\n        child.join().unwrap();\n    }\n}\n\n#[test]\n// https://github.com/ept/hermitage/blob/master/sqlserver.md#predicate-many-preceders-pmp\nfn test_predicate_many_preceders_read_predicates() {\n    let (_, clients, _) = init(3);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"1\".to_vec(), b\"10\".to_vec());\n    client0.set(b\"2\".to_vec(), b\"20\".to_vec());\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n    assert_eq!(client1.get(b\"3\".to_vec()), Ok(Vec::new()));\n\n    let mut client2 = clients[2].to_owned();\n    client2.begin();\n    client2.set(b\"3\".to_vec(), b\"30\".to_vec());\n    assert_eq!(client2.commit(), Ok(true));\n\n    assert_eq!(client1.get(b\"3\".to_vec()), Ok(Vec::new()));\n}\n\n#[test]\n// https://github.com/ept/hermitage/blob/master/sqlserver.md#predicate-many-preceders-pmp\nfn test_predicate_many_preceders_write_predicates() {\n    let (_, clients, _) = init(3);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"1\".to_vec(), b\"10\".to_vec());\n    client0.set(b\"2\".to_vec(), b\"20\".to_vec());\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n\n    let mut client2 = clients[2].to_owned();\n    client2.begin();\n\n    client1.set(b\"1\".to_vec(), b\"20\".to_vec());\n    client1.set(b\"2\".to_vec(), b\"30\".to_vec());\n    assert_eq!(client1.get(b\"2\".to_vec()), Ok(b\"20\".to_vec()));\n\n    client2.set(b\"2\".to_vec(), b\"40\".to_vec());\n    assert_eq!(client1.commit(), Ok(true));\n    assert_eq!(client2.commit(), Ok(false));\n}\n\n#[test]\n// https://github.com/ept/hermitage/blob/master/sqlserver.md#lost-update-p4\nfn test_lost_update() {\n    let (_, clients, _) = init(3);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"1\".to_vec(), b\"10\".to_vec());\n    client0.set(b\"2\".to_vec(), b\"20\".to_vec());\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n\n    let mut client2 = clients[2].to_owned();\n    client2.begin();\n\n    assert_eq!(client1.get(b\"1\".to_vec()), Ok(b\"10\".to_vec()));\n    assert_eq!(client2.get(b\"1\".to_vec()), Ok(b\"10\".to_vec()));\n\n    client1.set(b\"1\".to_vec(), b\"11\".to_vec());\n    client2.set(b\"1\".to_vec(), b\"11\".to_vec());\n    assert_eq!(client1.commit(), Ok(true));\n    assert_eq!(client2.commit(), Ok(false));\n}\n\n#[test]\n// https://github.com/ept/hermitage/blob/master/sqlserver.md#read-skew-g-single\nfn test_read_skew_read_only() {\n    let (_, clients, _) = init(3);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"1\".to_vec(), b\"10\".to_vec());\n    client0.set(b\"2\".to_vec(), b\"20\".to_vec());\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n\n    let mut client2 = clients[2].to_owned();\n    client2.begin();\n\n    assert_eq!(client1.get(b\"1\".to_vec()), Ok(b\"10\".to_vec()));\n    assert_eq!(client2.get(b\"1\".to_vec()), Ok(b\"10\".to_vec()));\n    assert_eq!(client2.get(b\"2\".to_vec()), Ok(b\"20\".to_vec()));\n\n    client2.set(b\"1\".to_vec(), b\"12\".to_vec());\n    client2.set(b\"2\".to_vec(), b\"18\".to_vec());\n    assert_eq!(client2.commit(), Ok(true));\n\n    assert_eq!(client1.get(b\"2\".to_vec()), Ok(b\"20\".to_vec()));\n}\n\n#[test]\n// https://github.com/ept/hermitage/blob/master/sqlserver.md#read-skew-g-single\nfn test_read_skew_predicate_dependencies() {\n    let (_, clients, _) = init(3);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"1\".to_vec(), b\"10\".to_vec());\n    client0.set(b\"2\".to_vec(), b\"20\".to_vec());\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n\n    let mut client2 = clients[2].to_owned();\n    client2.begin();\n\n    assert_eq!(client1.get(b\"1\".to_vec()), Ok(b\"10\".to_vec()));\n    assert_eq!(client1.get(b\"2\".to_vec()), Ok(b\"20\".to_vec()));\n\n    client2.set(b\"3\".to_vec(), b\"30\".to_vec());\n    assert_eq!(client2.commit(), Ok(true));\n\n    assert_eq!(client1.get(b\"3\".to_vec()), Ok(Vec::new()));\n}\n\n#[test]\n// https://github.com/ept/hermitage/blob/master/sqlserver.md#read-skew-g-single\nfn test_read_skew_write_predicate() {\n    let (_, clients, _) = init(3);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"1\".to_vec(), b\"10\".to_vec());\n    client0.set(b\"2\".to_vec(), b\"20\".to_vec());\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n\n    let mut client2 = clients[2].to_owned();\n    client2.begin();\n\n    assert_eq!(client1.get(b\"1\".to_vec()), Ok(b\"10\".to_vec()));\n    assert_eq!(client2.get(b\"1\".to_vec()), Ok(b\"10\".to_vec()));\n    assert_eq!(client2.get(b\"2\".to_vec()), Ok(b\"20\".to_vec()));\n\n    client2.set(b\"1\".to_vec(), b\"12\".to_vec());\n    client2.set(b\"2\".to_vec(), b\"18\".to_vec());\n    assert_eq!(client2.commit(), Ok(true));\n\n    client1.set(b\"2\".to_vec(), b\"30\".to_vec());\n    assert_eq!(client1.commit(), Ok(false));\n}\n\n#[test]\n// https://github.com/ept/hermitage/blob/master/sqlserver.md#write-skew-g2-item\nfn test_write_skew() {\n    let (_, clients, _) = init(3);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"1\".to_vec(), b\"10\".to_vec());\n    client0.set(b\"2\".to_vec(), b\"20\".to_vec());\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n\n    let mut client2 = clients[2].to_owned();\n    client2.begin();\n\n    assert_eq!(client1.get(b\"1\".to_vec()), Ok(b\"10\".to_vec()));\n    assert_eq!(client1.get(b\"2\".to_vec()), Ok(b\"20\".to_vec()));\n    assert_eq!(client2.get(b\"1\".to_vec()), Ok(b\"10\".to_vec()));\n    assert_eq!(client2.get(b\"2\".to_vec()), Ok(b\"20\".to_vec()));\n\n    client1.set(b\"1\".to_vec(), b\"11\".to_vec());\n    client2.set(b\"2\".to_vec(), b\"21\".to_vec());\n\n    assert_eq!(client1.commit(), Ok(true));\n    assert_eq!(client2.commit(), Ok(true));\n}\n\n#[test]\n// https://github.com/ept/hermitage/blob/master/sqlserver.md#anti-dependency-cycles-g2\nfn test_anti_dependency_cycles() {\n    let (_, clients, _) = init(4);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"1\".to_vec(), b\"10\".to_vec());\n    client0.set(b\"2\".to_vec(), b\"20\".to_vec());\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n\n    let mut client2 = clients[2].to_owned();\n    client2.begin();\n\n    client1.set(b\"3\".to_vec(), b\"30\".to_vec());\n    client2.set(b\"4\".to_vec(), b\"42\".to_vec());\n\n    assert_eq!(client1.commit(), Ok(true));\n    assert_eq!(client2.commit(), Ok(true));\n\n    let mut client3 = clients[3].to_owned();\n    client3.begin();\n    assert_eq!(client3.get(b\"3\".to_vec()), Ok(b\"30\".to_vec()));\n    assert_eq!(client3.get(b\"4\".to_vec()), Ok(b\"42\".to_vec()));\n}\n\n#[test]\nfn test_commit_primary_drop_secondary_requests() {\n    let (_, clients, hook) = init(2);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"3\".to_vec(), b\"30\".to_vec());\n    client0.set(b\"4\".to_vec(), b\"40\".to_vec());\n    client0.set(b\"5\".to_vec(), b\"50\".to_vec());\n    hook.drop_req.store(true, Ordering::Relaxed);\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n    assert_eq!(client1.get(b\"3\".to_vec()).unwrap(), b\"30\");\n    assert_eq!(client1.get(b\"4\".to_vec()).unwrap(), b\"40\");\n    assert_eq!(client1.get(b\"5\".to_vec()).unwrap(), b\"50\");\n}\n\n#[test]\nfn test_commit_primary_success() {\n    let (_, clients, hook) = init(2);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"3\".to_vec(), b\"30\".to_vec());\n    client0.set(b\"4\".to_vec(), b\"40\".to_vec());\n    client0.set(b\"5\".to_vec(), b\"50\".to_vec());\n    hook.drop_req.store(true, Ordering::Relaxed);\n    assert_eq!(client0.commit(), Ok(true));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n    assert_eq!(client1.get(b\"3\".to_vec()).unwrap(), b\"30\");\n    assert_eq!(client1.get(b\"4\".to_vec()).unwrap(), b\"40\");\n    assert_eq!(client1.get(b\"5\".to_vec()).unwrap(), b\"50\");\n}\n\n#[test]\nfn test_commit_primary_success_without_response() {\n    let (_, clients, hook) = init(2);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"3\".to_vec(), b\"30\".to_vec());\n    client0.set(b\"4\".to_vec(), b\"40\".to_vec());\n    client0.set(b\"5\".to_vec(), b\"50\".to_vec());\n    hook.drop_resp.store(true, Ordering::Relaxed);\n    assert_eq!(client0.commit(), Err(Error::Other(\"resphook\".to_owned())));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n    assert_eq!(client1.get(b\"3\".to_vec()).unwrap(), b\"30\");\n    assert_eq!(client1.get(b\"4\".to_vec()).unwrap(), b\"40\");\n    assert_eq!(client1.get(b\"5\".to_vec()).unwrap(), b\"50\");\n}\n\n#[test]\nfn test_commit_primary_fail() {\n    let (_, clients, hook) = init(2);\n\n    let mut client0 = clients[0].to_owned();\n    client0.begin();\n    client0.set(b\"3\".to_vec(), b\"30\".to_vec());\n    client0.set(b\"4\".to_vec(), b\"40\".to_vec());\n    client0.set(b\"5\".to_vec(), b\"50\".to_vec());\n    hook.drop_req.store(true, Ordering::Relaxed);\n    hook.fail_primary.store(true, Ordering::Relaxed);\n    assert_eq!(client0.commit(), Ok(false));\n\n    let mut client1 = clients[1].to_owned();\n    client1.begin();\n    assert_eq!(client1.get(b\"3\".to_vec()), Ok(Vec::new()));\n    assert_eq!(client1.get(b\"4\".to_vec()), Ok(Vec::new()));\n    assert_eq!(client1.get(b\"5\".to_vec()), Ok(Vec::new()));\n}\n"
  },
  {
    "path": "courses/dss/raft/Cargo.toml",
    "content": "[package]\nname = \"raft\"\nversion = \"0.1.0\"\nauthors = [\n    \"Neil Shen <overvenus@gmail.com>\",\n    \"ShuNing <nolouch@gmail.com>\",\n    \"Connor <zbk602423539@gmail.com>\",\n    \"庄天翼 <zty0826@gmail.com>\",\n    \"MIT 6.824 <6824-staff@lists.csail.mit.edu>\"\n]\nedition = \"2018\"\npublish = false\n\n[dependencies]\nasync-trait = \"0.1\"\nfutures = \"0.3\"\nfutures-timer = \"3.0\"\nlog = \"0.4\"\nprost = \"0.6\"\nprost-derive = \"0.6\"\nrand = \"0.7\"\n\nlabcodec = { path = \"../labcodec\" }\nlabrpc = { path = \"../labrpc\" }\nlinearizability = { path = \"../linearizability\"}\n\n[dev-dependencies]\nenv_logger = \"0.7\"\n\n[build-dependencies]\nprost-build = \"0.6\"\n"
  },
  {
    "path": "courses/dss/raft/README.md",
    "content": "# The Raft lab\n\nThis is a series of labs on a key/value storage system built with the Raft\nconsensus algorithm. These labs are derived from the [lab2:raft][6824lab2] and\n[lab3:kvraft][6824lab3] from the famous [MIT 6.824][6824] course but rewritten\nin Rust. The following text material is also very influenced by the text\nmaterial there.\n\n[6824lab2]:http://nil.csail.mit.edu/6.824/2018/labs/lab-raft.html\n[6824lab3]:http://nil.csail.mit.edu/6.824/2018/labs/lab-kvraft.html\n[6824]:http://nil.csail.mit.edu/6.824/2018/index.html\n\nIn these labs you will first implement the raft consensus algorithm in the\nlab2:raft, and then build a key/value service in the lab3:kvraft.\n\nRaft is a consensus algorithm that is designed to be easy to understand.You can\nread material about the Raft itself at [the Raft site][raftsite], including\n[the extended Raft paper][raftpaper], an interactive visualization of the Raft,\nand other resource. Those material should be helpful for you to complete this lab.\n\n[raftsite]:https://raft.github.io/\n\n## Getting started\n\nFirst, please clone this repository with `git` to get the source code of the labs.\n\nThen, make sure you have `rustup` installed. Also, to make things simpler you\nshould have `make` installed.\n\nNow you can run `make test_others` to check that things are going right. You\nshould see all tests passed.\n\n(If you are a Windows user, you may have to figure out how to use `make` on\nWindows, or type the commands from the makefile in the console manually, or just\nuse the Windows Subsystem for Linux)\n\n## The lab2: Raft\n\nIn this lab you will implement the Raft consensus algorithm. This lab has 3 parts\nnamed with 2A, 2B and 2C.\n\nTo run all the test in this lab, run `make test_2`. Please run the tests multiple\ntimes to mak sure your are not passing the tests just by luck.\n\nTo run just a single test, run `make cargo_test_<insert test name here>`.\n\n### The code structure\n\nAll your codes in this lab should be in the `src/proto/mod.rs`,\n`src/proto/raft.proto` and `src/raft/mod.rs`.\n\nThe `src/raft/mod.rs` file should contains your main implementation of Raft.\nThe tester (and your key/value server in lab3) will call methods in this file\nto use your Raft module.\n\nA service calls `Raft::new` to create a Raft peer, and then calls `Node::new` to\nstart the Raft peer. The `Node::get_state`, `Node::is_leader` and `Node::term`\nwill be called to get the current term of the node and whether it thinks it is\nleader.\n\nThe `Node::start` will be called when the server need to append the command into\nthe log. `Node::start` should returns immediately without waiting for the log\nappends to complete. A channel (`apply_ch`) is passed into `Raft::new` and you\nshould send a `ApplyMsg` to the channel for each newly committed log entry.\n\nYour implements should use the provided `labrpc` crate to exchange RPCs. The\n`labrpc` use channels to simulate sockets internally. This makes it easy to test\nyour code under challenging network conditions. Your definition of the RPCs\nshould in `src/proto/mod.rs` and you should implement the RPC server in\n`impl RaftService for Node`. A set of RPC clients (`peers`) is pass into\n`Raft::new` for you to send RPCs to other nodes.\n\n### Part 2A\n\nIn this part you should implement the leader election and heartbeats\n(`AppendEntries` RPCs without log entries). You should make a single leader to be\nelected, make leader to remain leader when there are no failures, and have a new\nleader when old leader fails or packets to/from old leader is lost.\n\nTo run all the test in this lab, run `make test_2a`.\n\nHere are some hints on this part:\n\n- Add any state you need to the `Raft` struct.\n- The `request_vote` RPC is already defined, you just need to fill the\n`RequestVoteArgs` and `RequestVoteReply` struct. The lab use `labcodec` crate to\nencode and decode messages in RPC, which internally use the `prost` external\ncrate. See the [prost document][prost] to know how to define structs that is used\nas messages with `#[Derive(Message)]` and `#[prost(...)]`.\n- You need to define the `append_entries` RPC by yourself. `labrpc` use a\n`labrpc::service!` macro to define RPC service and generate server and client\ntraits from your definition. There is an example in `labrpc/examples/echo.rs`\nwhich may help you to define new RPCs.\n- This lab use things from the `futures` external crate heavily like the channels\nand the `Future` trait. Read things about futures [here][futures].\n- You need to make your code take actions periodically or after delays in time.\nYou can use lots of threads and call `std::thread::sleep` ([doc][sleep]), but you\ncan also use the `futures_timer::Delay` and other utilities from the\n`futures-timer` external crate ([doc][futures-timer]).\n- Don't forget that you need to make sure that the election timeouts in different\npeers don't always fire at the same time, or else all peers will vote only for\nthemselves and no one will become the leader. You can generate random numbers\nusing the `rand` external crate ([doc][rand]).\n- The tester limits the frequency of RPC calls to 10 times per second for each\npair of sender and receiver. Please do not just send RPCs repeatedly without wait\nfor a timeout.\n- The tester requires your Raft to elect a new leader within five seconds of the\nfailure of the old leader (if a majority of peers can still communicate). However,\nleader election may require multiple rounds in case of a split vote (which can\nhappen if packets are lost or if candidates unluckily choose the same random\nbackoff times). You must pick election timeouts (and thus heartbeat intervals)\nthat are short enough that it's very likely that an election will complete in less\nthan five seconds even if it requires multiple rounds.\n- But also, since the tester limits the frequency of RPC calls, your election\ntimeout should not be too small, and larger than the 150~300 milliseconds in the\npaper's Section 5.2. Choose the values wisely.\n- In Rust we lock data instead of code. Think carefully about what data should be\nin the same lock.\n- The Figure 2 in the [Raft paper][raftpaper] is useful when you are in trouble\npassing the test.\n- It's useful to debug by printing log messages. We use the external\n`log` crate ([doc][log]) to print logs in different levels. you can configure\nthe log level and scope by set LOG_LEVEL environment variable like\n`LOG_LEVEL=labs6824=debug make test_2a`. This feature is provided by the\n`env_logger` external crate ([doc][env_logger]), read it's documentation for\nsyntax of the log level. Also, you can collect the output in a file by redirecting\nthe output to a file like `make test_2a 2>test.log`\n\n[prost]:https://github.com/danburkert/prost\n[futures]:https://docs.rs/futures/0.3/futures/index.html\n[sleep]:https://doc.rust-lang.org/std/thread/fn.sleep.html\n[futures-timer]:https://docs.rs/futures-timer/3.0/futures_timer/index.html\n[rand]:https://docs.rs/rand/0.7/rand/index.html\n[log]:https://docs.rs/log/0.4/log/\n[env_logger]:https://docs.rs/env_logger/0.7/env_logger/\n\n### Part 2B\n\nIn this part you should implement the log replication. You should implement the\n`Node::Start` method, complete the rest fields in the `append_entries` RPC and\nsend them, and advance `commit_index` at leader.\n\nTo run all the test in this lab, run `make test_2b`. You can try to pass the\n`test_basic_agree_2b` test first.\n\nHere are some hints on this part:\n\n- Don't forget election restriction, see section 5.4.1 in the\n[Raft paper][raftpaper].\n- Every server commit new entries independently by write to `apply_ch` in the\ncorrect order. `apply_ch` is a `UnboundedSender` which will buffering the messages\nuntil out of memory, so it is not that easy to create deadlocks as the original\ngo version.\n- Give yourself enough time to rewrite your implementation because only after\nwriting a first implementation will you realize how to organize your code cleanly.\n- The `test_count_2b` requires your number of RPCs to be not too much when there\nis no failure. So you should optimize the number of RPCs to the minimum.\n- You may need to write code that waits for certain events to occur. In that case\nyou can just use channels and wait on it.\n\n### Part 2C\n\nIn this part you should implement persistence by first adding code that saves and\nrestores persistent state to `Persister`, like in `Raft::persist` and\n`Raft::restore` using `labcodec`. You also need to determine what and when to\npersist, and call `Raft::restore` in `Raft::new`.\n\nTo run all the test in this lab, run `make test_2c`. You can try to pass the\n`test_persist1_2c` test first.\n\nHere are some hints on this part:\n- The usage of `labcodec` is covered in the hints of part 2A.\n- This part also introduce various challenging test that involving servers failing\nand the network losing RPC requests or replies. Check your implementation\ncarefully to find bugs that only present in this situation.\n- In order to pass some of the challenging tests towards the end, such as those\nmarked \"unreliable\", you will need to implement the optimization to allow a\nfollower to back up the leader's nextIndex by more than one entry at a time. See\nthe description in the [Raft paper][raftpaper] starting at the bottom of page 7\nand top of page 8 (marked by a gray line). However, the paper do not have many\ndetails on this. You will need to fill in the gaps, perhaps with the help of\n[this 6.824 Raft lectures][optimize-hint].\n\n[optimize-hint]:http://nil.csail.mit.edu/6.824/2018/notes/l-raft2.txt\n\n## The lab3: KvRaft\n\nIn this lab you will build a fault-tolerant key-value storage service using the\nRaft module in lab 2. This lab has 2 parts named with 3A and 3B.\n\nTo run all the test in this lab, run `make test_3`. Please run the tests multiple\ntimes to mak sure your are not passing the tests just by luck.\n\nTo run just a single test, run `make cargo_test_<insert test name here>`.\n\n### The code structure\n\nAll your codes in this lab should be in the `src/proto/mod.rs`, `src/proto/kvraft.proto`,\n`src/kvraft/server.rs` and `src/kvraft/client.rs`. The file name explains what\nthey are. Also, you need to modify the files you touched in lab2:raft.\n\n### Part 3A\n\nIn this part you should first implement a solution that works when there are no\ndropped messages, and no failed servers. Your service must ensure that `get(...)`\nand `put_append(...)` are [linearizable][linearizable].\n\n[linearizable]:https://en.wikipedia.org/wiki/Linearizability\n\nThat means, completed application calls to the methods on the `Clerk` struct in\n`src/kvraft/client.rs` must appear to all clients to have affected the service in\nthe same linear order, even in there are failures and leader changes. A\n`Clerk::Get` that starts after a completed `Clerk::Put` or `Clerk::Append` should\nsee the value written by the most recent `Clerk::Put` or `Clerk::Append` in the\nlinear order. Completed calls should have exactly-once semantics.\n\nA reasonable plan of implementation should be:\n\n- Client send RPC request in the `src/kvraft/client.rs`\n- Enter the operation from client into the Raft log by `raft::Node::start` in the\nRPC handler of `KvServer`\n- Execute the operation when the raft log committed, and then reply to RPC\n\nAfter implement that you should pass the basic one client test, run\n`make cargo_test_basic_3a` to check it.\n\nHere are some hints on this part:\n\n- You should receive commit message from Raft by `apply_ch` at the same time you\nreceives RPC.\n- If a leader has called `Raft::start` for a Clerk's RPC, but loses its leadership\nbefore the request is committed to the log, you should make the client to re-send\nthe RPC request to other servers until it finds the new leader. You can detect\nthis by check things received from `apply_ch`.\n- The `Clerk` client should remember who is the last leader, and try the last\nleader first. This will avoid wasting time searching for the leader on every RPC.\n- The server should not complete a `get` RPC if it is not part of a majority and\ndo not has up-to-date data. You can just put the get operation into the log, or\nimplement the optimization for read-only operations that is described in Section 8\nin the [Raft paper][raftpaper].\n- Think how to use lock at the beginning.\n\nThen, you should deal with duplicate client requests, including situations where\nthe client sends a request to a server leader in one term, times out waiting for a\nreply, and re-sends the request to a new leader in another term. The request\nshould always execute just once.\n\nAfter this you should pass all tests in this part. To run all the test in\nthis lab, run `make test_3a`.\n\nHere are some hints on this part:\n\n- You will need to uniquely identify client operations to ensure that the key/\nvalue service executes each one just once.\n- Your scheme for duplicate detection should free server memory quickly, like\nusing a hashtable for and only for uncommitted logs.\n\n### Part 3B\n\nIn your current implementation, a rebooting server replays the complete Raft log\nin order to restore its state. However, it's not practical for a long-running\nserver to remember the complete Raft log forever.\n\nInstead, you'll modify Raft and kvserver to cooperate to save space: from time to\ntime kvserver will persistently store a \"snapshot\" of its current state, and Raft\nwill discard log entries that precede the snapshot. When a server restarts (or\nfalls far behind the leader and must catch up), the server first installs a\nsnapshot and then replays log entries from after the point at which the snapshot\nwas created. Section 7 of the [Raft paper][raftpaper] outlines the scheme; you\nwill have to design the details.\n\nThe tester passes a `maxraftstate` to the `KvServer::new` indicating the maximum\nallowed size of your persistent Raft state in bytes (including the log, but not\nincluding snapshots). You should check the size of Raft state and when Raft state\nsize is approaching this threshold, it should save a snapshot, and tell the Raft\nlibrary that it has snapshotted, so that Raft can discard old log entries.\nThe `maxraftstate` is a `Option<usize>` and you do not have to snapshot when it\nis `None`.\n\nFirst you should modify the Raft implement to accept a compaction request and\ndiscard entries before the given index, and continue operating while storing only\nlog entries after that index. The tests from lab2:raft should still pass.\n\nThen you should modify the kvserver so that it can hands snapshots to Raft and\nrequest compaction when Raft state grows too large. The snapshots should be saved\nin `raft::Persister`\n\nHere are some hints on this part:\n\n- You are allowed to add methods to your Raft so that kvserver can manage the\nprocess of trimming the Raft log and manage kvserver snapshots.\n- You can test your Raft and kvserver's ability to operate with a trimmed log,\nand its ability to re-start from the combination of a kvserver snapshot and\npersisted Raft state, by running the Lab 3A tests while overriding `maxraftstate`\nto `Some(1)`.\n- Think about what should be in the snapshot. You should save new snapshot and\nrestore latest snapshot with `raft::Persister`.\n- Uncommitted logs can also in snapshots, so your kvserver must still be able to\ndetect duplicated operations under this situation.\n\nAfter that, you should define the `install_snapshot` RPC and the leader should\nsend this RPC when the leader has discarded the log entries the follower needs.\nWhen a follower receives an `install_snapshot` RPC, it should send the snapshot to\nkvserver (maybe in `apply_ch`).\n\nAfter this you should pass all tests in this part. To run all the test in\nthis lab, run `make test_3b`.\n\nHere are some hints on this part:\n\n- You do not need to send the snapshots in multiple RPCs. Just send the entire\nsnapshot in a single `install_snapshot` RPC and that should be enough for this lab.\n- You can try `test_snapshot_rpc_3b` first\n\n[raftpaper]:https://raft.github.io/raft.pdf\n"
  },
  {
    "path": "courses/dss/raft/build.rs",
    "content": "fn main() {\n    let includes = &[std::path::PathBuf::from(\"src/proto\")];\n    let mut protos = Vec::new();\n    for include in includes {\n        for file in std::fs::read_dir(include).unwrap() {\n            let file = file.unwrap();\n            if file.file_type().unwrap().is_dir() {\n                continue;\n            }\n            let path = file.path();\n            if path.extension().unwrap() == \"proto\" {\n                protos.push(path);\n            }\n        }\n    }\n    prost_build::compile_protos(&protos, includes).unwrap();\n    for p in protos {\n        println!(\"cargo:rerun-if-changed={}\", p.display());\n    }\n}\n"
  },
  {
    "path": "courses/dss/raft/src/kvraft/client.rs",
    "content": "use std::fmt;\n\nuse crate::proto::kvraftpb::*;\n\nenum Op {\n    Put(String, String),\n    Append(String, String),\n}\n\npub struct Clerk {\n    pub name: String,\n    pub servers: Vec<KvClient>,\n    // You will have to modify this struct.\n}\n\nimpl fmt::Debug for Clerk {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"Clerk\").field(\"name\", &self.name).finish()\n    }\n}\n\nimpl Clerk {\n    pub fn new(name: String, servers: Vec<KvClient>) -> Clerk {\n        // You'll have to add code here.\n        // Clerk { name, servers }\n        crate::your_code_here((name, servers))\n    }\n\n    /// fetch the current value for a key.\n    /// returns \"\" if the key does not exist.\n    /// keeps trying forever in the face of all other errors.\n    //\n    // you can send an RPC with code like this:\n    // if let Some(reply) = self.servers[i].get(args).wait() { /* do something */ }\n    pub fn get(&self, key: String) -> String {\n        // You will have to modify this function.\n        crate::your_code_here(key)\n    }\n\n    /// shared by Put and Append.\n    //\n    // you can send an RPC with code like this:\n    // let reply = self.servers[i].put_append(args).unwrap();\n    fn put_append(&self, op: Op) {\n        // You will have to modify this function.\n        crate::your_code_here(op)\n    }\n\n    pub fn put(&self, key: String, value: String) {\n        self.put_append(Op::Put(key, value))\n    }\n\n    pub fn append(&self, key: String, value: String) {\n        self.put_append(Op::Append(key, value))\n    }\n}\n"
  },
  {
    "path": "courses/dss/raft/src/kvraft/config.rs",
    "content": "use std::collections::HashMap;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::{Arc, Mutex};\nuse std::time::{Duration, Instant};\n\nuse rand::seq::SliceRandom;\n\nuse crate::kvraft::errors::{Error, Result};\nuse crate::kvraft::{client, server};\nuse crate::proto::kvraftpb::*;\nuse crate::proto::raftpb::*;\nuse crate::raft;\nuse crate::raft::persister::*;\n\nstatic ID: AtomicUsize = AtomicUsize::new(300_000);\n\nfn uniqstring() -> String {\n    format!(\"{}\", ID.fetch_add(1, Ordering::Relaxed))\n}\n\nstruct Servers {\n    kvservers: Vec<Option<server::Node>>,\n    saved: Vec<Arc<SimplePersister>>,\n    endnames: Vec<Vec<String>>,\n}\n\nfn init_logger() {\n    use std::sync::Once;\n    static LOGGER_INIT: Once = Once::new();\n    LOGGER_INIT.call_once(env_logger::init);\n}\n\npub struct Config {\n    pub net: labrpc::Network,\n    pub n: usize,\n    servers: Mutex<Servers>,\n    clerks: Mutex<HashMap<String, Vec<String>>>,\n    next_client_id: AtomicUsize,\n    maxraftstate: Option<usize>,\n\n    // time at which the Config was created.\n    start: Instant,\n\n    // begin()/end() statistics\n    // time at which test_test.go called cfg.begin()\n    t0: Mutex<Instant>,\n    // rpc_total() at start of test\n    rpcs0: AtomicUsize,\n    // number of agreements\n    ops: AtomicUsize,\n}\n\nimpl Config {\n    pub fn new(n: usize, unreliable: bool, maxraftstate: Option<usize>) -> Config {\n        init_logger();\n\n        let servers = Servers {\n            kvservers: vec![None; n],\n            saved: (0..n).map(|_| Arc::new(SimplePersister::new())).collect(),\n            endnames: vec![vec![String::new(); n]; n],\n        };\n        let cfg = Config {\n            n,\n            net: labrpc::Network::new(),\n            servers: Mutex::new(servers),\n            clerks: Mutex::new(HashMap::new()),\n            // client ids start 1000 above the highest serverid,\n            next_client_id: AtomicUsize::new(n + 1000),\n            maxraftstate,\n            start: Instant::now(),\n            t0: Mutex::new(Instant::now()),\n            rpcs0: AtomicUsize::new(0),\n            ops: AtomicUsize::new(0),\n        };\n\n        // create a full set of KV servers.\n        for i in 0..cfg.n {\n            cfg.start_server(i);\n        }\n\n        cfg.connect_all();\n\n        cfg.net.set_reliable(!unreliable);\n\n        cfg\n    }\n\n    pub fn op(&self) {\n        self.ops.fetch_add(1, Ordering::Relaxed);\n    }\n\n    fn rpc_total(&self) -> usize {\n        self.net.total_count()\n    }\n\n    pub fn check_timeout(&self) {\n        // enforce a two minute real-time limit on each test\n        if self.start.elapsed() > Duration::from_secs(120) {\n            panic!(\"test took longer than 120 seconds\");\n        }\n    }\n\n    /// Maximum log size across all servers\n    pub fn log_size(&self) -> usize {\n        let servers = self.servers.lock().unwrap();\n        let mut logsize = 0;\n        for save in &servers.saved {\n            let n = save.raft_state().len();\n            if n > logsize {\n                logsize = n;\n            }\n        }\n        logsize\n    }\n\n    /// Maximum snapshot size across all servers\n    pub fn snapshot_size(&self) -> usize {\n        let mut snapshotsize = 0;\n        let servers = self.servers.lock().unwrap();\n        for save in &servers.saved {\n            let n = save.snapshot().len();\n            if n > snapshotsize {\n                snapshotsize = n;\n            }\n        }\n        snapshotsize\n    }\n\n    /// Attach server i to servers listed in to\n    fn connect(&self, i: usize, to: &[usize], servers: &Servers) {\n        debug!(\"connect peer {} to {:?}\", i, to);\n        // outgoing socket files\n        for j in to {\n            let endname = &servers.endnames[i][*j];\n            self.net.enable(endname, true);\n        }\n\n        // incoming socket files\n        for j in to {\n            let endname = &servers.endnames[*j][i];\n            self.net.enable(endname, true);\n        }\n    }\n\n    /// Detach server i from the servers listed in from\n    fn disconnect(&self, i: usize, from: &[usize], servers: &Servers) {\n        debug!(\"disconnect peer {} from {:?}\", i, from);\n        // outgoing socket files\n        for j in from {\n            if !servers.endnames[i].is_empty() {\n                let endname = &servers.endnames[i][*j];\n                self.net.enable(endname, false);\n            }\n        }\n\n        // incoming socket files\n        for j in from {\n            if !servers.endnames[*j].is_empty() {\n                let endname = &servers.endnames[*j][i];\n                self.net.enable(endname, false);\n            }\n        }\n    }\n\n    pub fn all(&self) -> Vec<usize> {\n        (0..self.n).collect()\n    }\n\n    pub fn connect_all(&self) {\n        let servers = self.servers.lock().unwrap();\n        for i in 0..self.n {\n            self.connect(i, &self.all(), &*servers);\n        }\n    }\n\n    /// Sets up 2 partitions with connectivity between servers in each  partition.\n    pub fn partition(&self, p1: &[usize], p2: &[usize]) {\n        debug!(\"partition servers into: {:?} {:?}\", p1, p2);\n        let servers = self.servers.lock().unwrap();\n        for i in p1 {\n            self.disconnect(*i, p2, &*servers);\n            self.connect(*i, p1, &*servers);\n        }\n        for i in p2 {\n            self.disconnect(*i, p1, &*servers);\n            self.connect(*i, p2, &*servers);\n        }\n    }\n\n    // Create a clerk with clerk specific server names.\n    // Give it connections to all of the servers, but for\n    // now enable only connections to servers in to[].\n    pub fn make_client(&self, to: &[usize]) -> client::Clerk {\n        // a fresh set of ClientEnds.\n        let mut ends = Vec::with_capacity(self.n);\n        let mut endnames = Vec::with_capacity(self.n);\n        for j in 0..self.n {\n            let name = uniqstring();\n            endnames.push(name.clone());\n            let cli = self.net.create_client(name.clone());\n            ends.push(KvClient::new(cli));\n            self.net.connect(&name, &format!(\"{}\", j));\n        }\n\n        ends.shuffle(&mut rand::thread_rng());\n        let ck_name = uniqstring();\n        let ck = client::Clerk::new(ck_name.clone(), ends);\n        self.clerks.lock().unwrap().insert(ck_name, endnames);\n        self.next_client_id.fetch_add(1, Ordering::Relaxed);\n        self.connect_client(&ck, to);\n        ck\n    }\n\n    pub fn delete_client(&self, ck: &client::Clerk) {\n        self.clerks.lock().unwrap().remove(&ck.name);\n    }\n\n    pub fn connect_client(&self, ck: &client::Clerk, to: &[usize]) {\n        self.connect_client_by_name(&ck.name, to);\n    }\n\n    pub fn connect_client_by_name(&self, ck_name: &str, to: &[usize]) {\n        debug!(\"connect_client {:?} to {:?}\", ck_name, to);\n        let clerks = self.clerks.lock().unwrap();\n        let endnames = &clerks[ck_name];\n        for j in to {\n            let s = &endnames[*j];\n            self.net.enable(s, true);\n        }\n    }\n\n    /// Shutdown a server by isolating it\n    pub fn shutdown_server(&self, i: usize) {\n        let mut servers = self.servers.lock().unwrap();\n        self.disconnect(i, &self.all(), &*servers);\n\n        // disable client connections to the server.\n        // it's important to do this before creating\n        // the new Persister in saved[i], to avoid\n        // the possibility of the server returning a\n        // positive reply to an Append but persisting\n        // the result in the superseded Persister.\n        self.net.delete_server(&format!(\"{}\", i));\n\n        // a fresh persister, in case old instance\n        // continues to update the Persister.\n        // but copy old persister's content so that we always\n        // pass Make() the last persisted state.\n        let p = raft::persister::SimplePersister::new();\n        p.save_state_and_snapshot(servers.saved[i].raft_state(), servers.saved[i].snapshot());\n        servers.saved[i] = Arc::new(p);\n\n        if let Some(kv) = servers.kvservers[i].take() {\n            kv.kill();\n        }\n    }\n\n    /// Start a server i.\n    /// If restart servers, first call shutdown_server\n    pub fn start_server(&self, i: usize) {\n        // a fresh set of outgoing ClientEnd names.\n        let mut servers = self.servers.lock().unwrap();\n        servers.endnames[i] = (0..self.n).map(|_| uniqstring()).collect();\n\n        // a fresh set of ClientEnds.\n        let mut ends = Vec::with_capacity(self.n);\n        for (j, name) in servers.endnames[i].iter().enumerate() {\n            let cli = self.net.create_client(name.clone());\n            ends.push(RaftClient::new(cli));\n            self.net.connect(name, &format!(\"{}\", j));\n        }\n\n        // a fresh persister, so old instance doesn't overwrite\n        // new instance's persisted state.\n        // give the fresh persister a copy of the old persister's\n        // state, so that the spec is that we pass StartKVServer()\n        // the last persisted state.\n        let sp = raft::persister::SimplePersister::new();\n        sp.save_state_and_snapshot(servers.saved[i].raft_state(), servers.saved[i].snapshot());\n        let p = Arc::new(sp);\n        servers.saved[i] = p.clone();\n\n        let kv = server::KvServer::new(ends, i, Box::new(p), self.maxraftstate);\n        let rf_node = kv.rf.clone();\n        let kv_node = server::Node::new(kv);\n        servers.kvservers[i] = Some(kv_node.clone());\n\n        let mut builder = labrpc::ServerBuilder::new(format!(\"{}\", i));\n        add_raft_service(rf_node, &mut builder).unwrap();\n        add_kv_service(kv_node, &mut builder).unwrap();\n        let srv = builder.build();\n        self.net.add_server(srv);\n    }\n\n    pub fn leader(&self) -> Result<usize> {\n        let servers = self.servers.lock().unwrap();\n        for (i, kv) in servers.kvservers.iter().enumerate() {\n            if let Some(kv) = kv {\n                if kv.is_leader() {\n                    return Ok(i);\n                }\n            }\n        }\n        Err(Error::NoLeader)\n    }\n\n    /// Partition servers into 2 groups and put current leader in minority\n    pub fn make_partition(&self) -> (Vec<usize>, Vec<usize>) {\n        let l = self.leader().unwrap_or(0);\n        let mut p1 = Vec::with_capacity(self.n / 2 + 1);\n        let mut p2 = Vec::with_capacity(self.n / 2);\n        for i in 0..self.n {\n            if i != l {\n                if p1.len() < self.n / 2 + 1 {\n                    p1.push(i);\n                } else {\n                    p2.push(i);\n                }\n            }\n        }\n        p2.push(l);\n        (p1, p2)\n    }\n\n    /// Start a Test.\n    /// print the Test message.\n    /// e.g. cfg.begin(\"Test (2B): RPC counts aren't too high\")\n    pub fn begin(&self, description: &str) {\n        println!(); // Force the log starts at a new line.\n        info!(\"{} ...\", description);\n        *self.t0.lock().unwrap() = Instant::now();\n        self.rpcs0.store(self.rpc_total(), Ordering::Relaxed);\n        self.ops.store(0, Ordering::Relaxed);\n    }\n\n    /// End a Test -- the fact that we got here means there\n    /// was no failure.\n    /// print the Passed message,\n    /// and some performance numbers.\n    pub fn end(&self) {\n        self.check_timeout();\n\n        // real time\n        let t = self.t0.lock().unwrap().elapsed();\n        // number of Raft peers\n        let npeers = self.n;\n        // number of RPC sends\n        let nrpc = self.rpc_total() - self.rpcs0.load(Ordering::Relaxed);\n        // number of clerk get/put/append calls\n        let nops = self.ops.load(Ordering::Relaxed);\n\n        info!(\"  ... Passed --\");\n        info!(\"  {:?}  {} {} {}\", t, npeers, nrpc, nops);\n    }\n}\n\nimpl Drop for Config {\n    fn drop(&mut self) {\n        let servers = self.servers.lock().unwrap();\n        for s in servers.kvservers.iter().flatten() {\n            s.kill();\n        }\n    }\n}\n"
  },
  {
    "path": "courses/dss/raft/src/kvraft/errors.rs",
    "content": "use std::{error, fmt, result};\n\n#[derive(Clone, Debug, PartialEq, Eq)]\npub enum Error {\n    NoLeader,\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{:?}\", self)\n    }\n}\n\nimpl error::Error for Error {\n    fn source(&self) -> Option<&(dyn error::Error + 'static)> {\n        match *self {\n            Error::NoLeader => None,\n        }\n    }\n}\n\npub type Result<T> = result::Result<T, Error>;\n"
  },
  {
    "path": "courses/dss/raft/src/kvraft/mod.rs",
    "content": "pub mod client;\n#[cfg(test)]\npub mod config;\npub mod errors;\npub mod server;\n#[cfg(test)]\nmod tests;\n"
  },
  {
    "path": "courses/dss/raft/src/kvraft/server.rs",
    "content": "use futures::channel::mpsc::unbounded;\n\nuse crate::proto::kvraftpb::*;\nuse crate::raft;\n\npub struct KvServer {\n    pub rf: raft::Node,\n    me: usize,\n    // snapshot if log grows this big\n    maxraftstate: Option<usize>,\n    // Your definitions here.\n}\n\nimpl KvServer {\n    pub fn new(\n        servers: Vec<crate::proto::raftpb::RaftClient>,\n        me: usize,\n        persister: Box<dyn raft::persister::Persister>,\n        maxraftstate: Option<usize>,\n    ) -> KvServer {\n        // You may need initialization code here.\n\n        let (tx, apply_ch) = unbounded();\n        let rf = raft::Raft::new(servers, me, persister, tx);\n\n        crate::your_code_here((rf, maxraftstate, apply_ch))\n    }\n}\n\nimpl KvServer {\n    /// Only for suppressing deadcode warnings.\n    #[doc(hidden)]\n    pub fn __suppress_deadcode(&mut self) {\n        let _ = &self.me;\n        let _ = &self.maxraftstate;\n    }\n}\n\n// Choose concurrency paradigm.\n//\n// You can either drive the kv server by the rpc framework,\n//\n// ```rust\n// struct Node { server: Arc<Mutex<KvServer>> }\n// ```\n//\n// or spawn a new thread runs the kv server and communicate via\n// a channel.\n//\n// ```rust\n// struct Node { sender: Sender<Msg> }\n// ```\n#[derive(Clone)]\npub struct Node {\n    // Your definitions here.\n}\n\nimpl Node {\n    pub fn new(kv: KvServer) -> Node {\n        // Your code here.\n        crate::your_code_here(kv);\n    }\n\n    /// the tester calls kill() when a KVServer instance won't\n    /// be needed again. you are not required to do anything\n    /// in kill(), but it might be convenient to (for example)\n    /// turn off debug output from this instance.\n    pub fn kill(&self) {\n        // If you want to free some resources by `raft::Node::kill` method,\n        // you should call `raft::Node::kill` here also to prevent resource leaking.\n        // Since the test framework will call kvraft::Node::kill only.\n        // self.server.kill();\n\n        // Your code here, if desired.\n    }\n\n    /// The current term of this peer.\n    pub fn term(&self) -> u64 {\n        self.get_state().term()\n    }\n\n    /// Whether this peer believes it is the leader.\n    pub fn is_leader(&self) -> bool {\n        self.get_state().is_leader()\n    }\n\n    pub fn get_state(&self) -> raft::State {\n        // Your code here.\n        raft::State {\n            ..Default::default()\n        }\n    }\n}\n\n#[async_trait::async_trait]\nimpl KvService for Node {\n    // CAVEATS: Please avoid locking or sleeping here, it may jam the network.\n    async fn get(&self, arg: GetRequest) -> labrpc::Result<GetReply> {\n        // Your code here.\n        crate::your_code_here(arg)\n    }\n\n    // CAVEATS: Please avoid locking or sleeping here, it may jam the network.\n    async fn put_append(&self, arg: PutAppendRequest) -> labrpc::Result<PutAppendReply> {\n        // Your code here.\n        crate::your_code_here(arg)\n    }\n}\n"
  },
  {
    "path": "courses/dss/raft/src/kvraft/tests.rs",
    "content": "use std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::mpsc;\nuse std::sync::Arc;\nuse std::sync::Mutex;\nuse std::task::Poll;\nuse std::thread;\nuse std::time::{Duration, Instant};\n\nuse futures::channel::oneshot;\nuse futures::executor::block_on;\nuse futures::future;\nuse futures::{Future, FutureExt};\nuse futures_timer::Delay;\nuse rand::{seq::SliceRandom, Rng};\n\nuse linearizability::check_operations_timeout;\nuse linearizability::model::Operation;\nuse linearizability::models::{KvInput, KvModel, KvOutput, Op};\n\nuse crate::kvraft::client::Clerk;\nuse crate::kvraft::config::Config;\n\n/// The tester generously allows solutions to complete elections in one second\n/// (much more than the paper's range of timeouts).\nconst RAFT_ELECTION_TIMEOUT: Duration = Duration::from_millis(1000);\n\nconst LINEARIZABILITY_CHECK_TIMEOUT: Duration = Duration::from_millis(1000);\n\n// get/put/append that keep counts\nfn get(cfg: &Config, ck: &Clerk, key: &str) -> String {\n    let v = ck.get(key.to_owned());\n    cfg.op();\n    v\n}\n\nfn put(cfg: &Config, ck: &Clerk, key: &str, value: &str) {\n    ck.put(key.to_owned(), value.to_owned());\n    cfg.op();\n}\n\nfn append(cfg: &Config, ck: &Clerk, key: &str, value: &str) {\n    ck.append(key.to_owned(), value.to_owned());\n    cfg.op();\n}\n\nfn check(cfg: &Config, ck: &Clerk, key: &str, value: &str) {\n    let v = get(cfg, ck, key);\n    if v != value {\n        panic!(\"get({:?}): expected:\\n{:?}\\nreceived:\\n{:?}\", key, value, v);\n    }\n}\n\n// spawn ncli clients and wait until they are all done\nfn spawn_clients_and_wait<Func, Fact>(\n    cfg: Arc<Config>,\n    ncli: usize,\n    fact: Fact,\n) -> impl Future<Output = ()> + Send + 'static\nwhere\n    Fact: Fn() -> Func + Send + 'static,\n    Func: Fn(usize, &Clerk) + Send + 'static,\n{\n    let mut cas = Vec::with_capacity(ncli);\n    for cli in 0..ncli {\n        let (tx, rx) = oneshot::channel();\n        cas.push(rx.map(move |_| {\n            debug!(\"spawn_clients_and_wait: client {} is done\", cli);\n        }));\n\n        let cfg_ = cfg.clone();\n        // a client runs the function func and then signals it is done\n        let func = fact();\n        thread::spawn(move || {\n            let ck = cfg_.make_client(&cfg_.all());\n            func(cli, &ck);\n            cfg_.delete_client(&ck);\n            tx.send(())\n        });\n    }\n    debug!(\"spawn_clients_and_wait: waiting for clients\");\n    future::join_all(cas).map(|_| ())\n}\n\n// predict effect of append(k, val) if old value is prev.\nfn next_value(prev: String, val: &str) -> String {\n    prev + val\n}\n\n// check that for a specific client all known appends are present in a value,\n// and in order\nfn check_clnt_appends(clnt: usize, v: String, count: usize) {\n    let mut lastoff = None;\n    for j in 0..count {\n        let wanted = format!(\"x {} {} y\", clnt, j);\n        if let Some(off) = v.find(&wanted) {\n            let off1 = v.rfind(&wanted).unwrap();\n            assert_eq!(off1, off, \"duplicate element {:?} in Append result\", wanted);\n\n            if let Some(lastoff) = lastoff {\n                assert!(\n                    off > lastoff,\n                    \"wrong order for element {:?} in Append result\",\n                    wanted\n                );\n            }\n            lastoff = Some(off);\n        } else {\n            panic!(\n                \"{:?} missing element {:?} in Append result {:?}\",\n                clnt, wanted, v\n            )\n        }\n    }\n}\n\n// check that all known appends are present in a value,\n// and are in order for each concurrent client.\n#[allow(clippy::needless_range_loop)]\nfn check_concurrent_appends(v: String, counts: &[usize]) {\n    let nclients = counts.len();\n    for i in 0..nclients {\n        let mut lastoff = None;\n        for j in 0..counts[i] {\n            let wanted = format!(\"x {} {} y\", i, j);\n            if let Some(off) = v.find(&wanted) {\n                let off1 = v.rfind(&wanted).unwrap();\n                assert_eq!(off1, off, \"duplicate element {:?} in Append result\", wanted);\n\n                if let Some(lastoff) = lastoff {\n                    assert!(\n                        off > lastoff,\n                        \"wrong order for element {:?} in Append result\",\n                        wanted\n                    );\n                }\n                lastoff = Some(off);\n            } else {\n                panic!(\n                    \"{:?} missing element {:?} in Append result {:?}\",\n                    i, wanted, v\n                )\n            }\n        }\n    }\n}\n\n// repartition the servers periodically\nfn partitioner(\n    cfg: Arc<Config>,\n    ch: mpsc::Sender<bool>,\n    done: Arc<AtomicUsize>,\n) -> impl Future<Output = ()> + Send + 'static {\n    fn delay(r: u64) -> Delay {\n        Delay::new(RAFT_ELECTION_TIMEOUT + Duration::from_millis(r % 200))\n    }\n\n    // Context of the poll_fn.\n    let mut all = cfg.all();\n    let mut sleep = None;\n    let mut is_parked = false;\n    future::poll_fn(move |cx| {\n        let mut rng = rand::thread_rng();\n        while done.load(Ordering::Relaxed) == 0 {\n            if !is_parked {\n                all.shuffle(&mut rng);\n                let offset = rng.gen_range(0, cfg.n);\n                cfg.partition(&all[..offset], &all[offset..]);\n                sleep = Some(delay(rng.gen::<u64>()));\n            }\n            is_parked = true;\n            let sleep = sleep.as_mut().unwrap();\n            futures::pin_mut!(sleep);\n            futures::ready!(sleep.poll(cx));\n            is_parked = false;\n        }\n        ch.send(true).unwrap();\n        Poll::Ready(())\n    })\n}\n\n// Basic test is as follows: one or more clients submitting Append/Get\n// operations to set of servers for some period of time.  After the period is\n// over, test checks that all appended values are present and in order for a\n// particular key.  If unreliable is set, RPCs may fail.  If crash is set, the\n// servers crash after the period is over and restart.  If partitions is set,\n// the test repartitions the network concurrently with the clients and servers. If\n// maxraftstate is a positive number, the size of the state for Raft (i.e., log\n// size) shouldn't exceed 2*maxraftstate.\nfn generic_test(\n    part: &str,\n    nclients: usize,\n    unreliable: bool,\n    crash: bool,\n    partitions: bool,\n    maxraftstate: Option<usize>,\n) {\n    let mut title = \"Test: \".to_owned();\n    if unreliable {\n        // the network drops RPC requests and replies.\n        title += \"unreliable net, \";\n    }\n    if crash {\n        // peers re-start, and thus persistence must work.\n        title += \"restarts, \";\n    }\n    if partitions {\n        // the network may partition\n        title += \"partitions, \";\n    }\n    if maxraftstate.is_some() {\n        title += \"snapshots, \";\n    }\n    if nclients > 1 {\n        title += \"many clients\";\n    } else {\n        title += \"one client\";\n    }\n    title = format!(\"{} ({})\", title, part); // 3A or 3B\n\n    const NSERVERS: usize = 5;\n    let cfg = Arc::new(Config::new(NSERVERS, unreliable, maxraftstate));\n\n    cfg.begin(&title);\n\n    let ck = cfg.make_client(&cfg.all());\n\n    let done_partitioner = Arc::new(AtomicUsize::new(0));\n    let done_clients = Arc::new(AtomicUsize::new(0));\n    let mut clnt_txs = vec![];\n    let mut clnt_rxs = vec![];\n    for _ in 0..nclients {\n        let (tx, rx) = mpsc::channel();\n        clnt_txs.push(tx);\n        clnt_rxs.push(rx);\n    }\n    for i in 0..3 {\n        let (partitioner_tx, partitioner_rx) = mpsc::channel();\n        debug!(\"Iteration {}\", i);\n        done_clients.store(0, Ordering::Relaxed);\n        done_partitioner.store(0, Ordering::Relaxed);\n        let clnt_txs_ = clnt_txs.clone();\n        let cfg_ = cfg.clone();\n        let done_clients_ = done_clients.clone();\n        thread::spawn(move || {\n            block_on(async {\n                spawn_clients_and_wait(cfg_.clone(), nclients, move || {\n                    let cfg1 = cfg_.clone();\n                    let clnt_txs1 = clnt_txs_.clone();\n                    let done_clients1 = done_clients_.clone();\n                    move |cli, myck| {\n                        // TODO: change the closure to a future.\n                        let mut j = 0;\n                        let mut rng = rand::thread_rng();\n                        let mut last = String::new();\n                        let key = format!(\"{}\", cli);\n                        put(&cfg1, myck, &key, &last);\n                        while done_clients1.load(Ordering::Relaxed) == 0 {\n                            if (rng.gen::<u32>() % 1000) < 500 {\n                                let nv = format!(\"x {} {} y\", cli, j);\n                                debug!(\"{}: client new append {}\", cli, nv);\n                                last = next_value(last, &nv);\n                                append(&cfg1, myck, &key, &nv);\n                                j += 1;\n                            } else {\n                                debug!(\"{}: client new get {:?}\", cli, key);\n                                let v = get(&cfg1, myck, &key);\n                                if v != last {\n                                    panic!(\n                                        \"get wrong value, key {:?}, wanted:\\n{:?}\\n, got\\n{:?}\",\n                                        key, last, v\n                                    );\n                                }\n                            }\n                        }\n                        clnt_txs1[cli].send(j).unwrap();\n                    }\n                })\n                .await\n            })\n        });\n\n        if partitions {\n            // Allow the clients to perform some operations without interruption\n            thread::sleep(Duration::from_secs(1));\n            cfg.net.spawn_poller(partitioner(\n                cfg.clone(),\n                partitioner_tx,\n                done_partitioner.clone(),\n            ));\n        }\n        thread::sleep(Duration::from_secs(5));\n\n        // tell clients to quit\n        done_clients.store(1, Ordering::Relaxed);\n        // tell partitioner to quit\n        done_partitioner.store(1, Ordering::Relaxed);\n\n        if partitions {\n            debug!(\"wait for partitioner\");\n            partitioner_rx.recv().unwrap();\n            // reconnect network and submit a request. A client may\n            // have submitted a request in a minority.  That request\n            // won't return until that server discovers a new term\n            // has started.\n            cfg.connect_all();\n            // wait for a while so that we have a new term\n            thread::sleep(RAFT_ELECTION_TIMEOUT);\n        }\n\n        if crash {\n            debug!(\"shutdown servers\");\n            for i in 0..NSERVERS {\n                cfg.shutdown_server(i)\n            }\n            // Wait for a while for servers to shutdown, since\n            // shutdown isn't a real crash and isn't instantaneous\n            thread::sleep(RAFT_ELECTION_TIMEOUT);\n            debug!(\"restart servers\");\n            // crash and re-start all\n            for i in 0..NSERVERS {\n                cfg.start_server(i);\n            }\n            cfg.connect_all();\n        }\n\n        debug!(\"wait for clients\");\n        for (i, clnt_rx) in clnt_rxs.iter().enumerate() {\n            debug!(\"read from clients {}\", i);\n            let j = clnt_rx.recv().unwrap();\n            if j < 10 {\n                debug!(\n                    \"Warning: client {} managed to perform only {} put operations in 1 sec?\",\n                    i, j\n                );\n            }\n            let key = format!(\"{}\", i);\n            debug!(\"Check {:?} for client {}\", j, i);\n            let v = get(&cfg, &ck, &key);\n            check_clnt_appends(i, v, j);\n        }\n\n        if let Some(maxraftstate) = maxraftstate {\n            // Check maximum after the servers have processed all client\n            // requests and had time to checkpoint.\n            if cfg.log_size() > 2 * maxraftstate {\n                panic!(\n                    \"logs were not trimmed ({} > 2*{})\",\n                    cfg.log_size(),\n                    maxraftstate\n                )\n            }\n        }\n    }\n\n    cfg.check_timeout();\n    cfg.end();\n}\n\nfn generic_test_linearizability(\n    part: &str,\n    nclients: usize,\n    nservers: usize,\n    unreliable: bool,\n    crash: bool,\n    partitions: bool,\n    maxraftstate: Option<usize>,\n) {\n    let mut title = \"Test: \".to_owned();\n    if unreliable {\n        // the network drops RPC requests and replies.\n        title += \"unreliable net, \";\n    }\n    if crash {\n        // peers re-start, and thus persistence must work.\n        title += \"restarts, \";\n    }\n    if partitions {\n        // the network may partition\n        title += \"partitions, \";\n    }\n    if maxraftstate.is_some() {\n        title += \"snapshots, \";\n    }\n    if nclients > 1 {\n        title += \"many clients\";\n    } else {\n        title += \"one client\";\n    }\n    title = format!(\"{}, linearizability checks ({})\", title, part); // 3A or 3B\n\n    let cfg = Arc::new(Config::new(nservers, unreliable, maxraftstate));\n\n    cfg.begin(&title);\n\n    let begin = Instant::now();\n    let operations = Arc::new(Mutex::new(vec![]));\n\n    let done_partitioner = Arc::new(AtomicUsize::new(0));\n    let done_clients = Arc::new(AtomicUsize::new(0));\n    let mut clnt_txs = vec![];\n    let mut clnt_rxs = vec![];\n    for _ in 0..nclients {\n        let (tx, rx) = mpsc::channel();\n        clnt_txs.push(tx);\n        clnt_rxs.push(rx);\n    }\n    for i in 0..3 {\n        let (partitioner_tx, partitioner_rx) = mpsc::channel();\n        debug!(\"Iteration {}\", i);\n        done_clients.store(0, Ordering::Relaxed);\n        done_partitioner.store(0, Ordering::Relaxed);\n        let clnt_txs_ = clnt_txs.clone();\n        let cfg_ = cfg.clone();\n        let done_clients_ = done_clients.clone();\n        let operations_ = operations.clone();\n        cfg.net\n            .spawn_poller(spawn_clients_and_wait(cfg.clone(), nclients, move || {\n                let cfg1 = cfg_.clone();\n                let clnt_txs1 = clnt_txs_.clone();\n                let done_clients1 = done_clients_.clone();\n                let operations1 = operations_.clone();\n                move |cli, myck| {\n                    // TODO: change the closure to a future.\n                    let mut j = 0;\n                    let mut rng = rand::thread_rng();\n                    while done_clients1.load(Ordering::Relaxed) == 0 {\n                        let key = format!(\"{}\", rng.gen::<usize>() % nclients);\n                        let nv = format!(\"x {} {} y\", cli, j);\n\n                        let start = begin.elapsed().as_nanos() as i64;\n                        let (inp, out) = if rng.gen::<usize>() % 1000 < 500 {\n                            append(&cfg1, myck, &key, &nv);\n                            j += 1;\n                            (\n                                KvInput {\n                                    op: Op::Append,\n                                    key,\n                                    value: nv,\n                                },\n                                KvOutput {\n                                    value: \"\".to_string(),\n                                },\n                            )\n                        } else if rng.gen::<usize>() % 1000 < 100 {\n                            put(&cfg1, myck, &key, &nv);\n                            j += 1;\n                            (\n                                KvInput {\n                                    op: Op::Put,\n                                    key,\n                                    value: nv,\n                                },\n                                KvOutput {\n                                    value: \"\".to_string(),\n                                },\n                            )\n                        } else {\n                            let v = get(&cfg1, myck, &key);\n                            (\n                                KvInput {\n                                    op: Op::Get,\n                                    key,\n                                    value: \"\".to_string(),\n                                },\n                                KvOutput { value: v },\n                            )\n                        };\n\n                        let end = begin.elapsed().as_nanos() as i64;\n                        let op = Operation {\n                            input: inp,\n                            call: start,\n                            output: out,\n                            finish: end,\n                        };\n                        let mut data = operations1.lock().unwrap();\n                        data.push(op);\n                    }\n                    clnt_txs1[cli].send(j).unwrap();\n                }\n            }));\n\n        if partitions {\n            // Allow the clients to perform some operations without interruption\n            thread::sleep(Duration::from_secs(1));\n            cfg.net.spawn_poller(partitioner(\n                cfg.clone(),\n                partitioner_tx,\n                done_partitioner.clone(),\n            ));\n        }\n        thread::sleep(Duration::from_secs(5));\n\n        // tell clients to quit\n        done_clients.store(1, Ordering::Relaxed);\n        // tell partitioner to quit\n        done_partitioner.store(1, Ordering::Relaxed);\n\n        if partitions {\n            debug!(\"wait for partitioner\");\n            partitioner_rx.recv().unwrap();\n            // reconnect network and submit a request. A client may\n            // have submitted a request in a minority.  That request\n            // won't return until that server discovers a new term\n            // has started.\n            cfg.connect_all();\n            // wait for a while so that we have a new term\n            thread::sleep(RAFT_ELECTION_TIMEOUT);\n        }\n\n        if crash {\n            debug!(\"shutdown servers\");\n            for i in 0..nservers {\n                cfg.shutdown_server(i)\n            }\n            // Wait for a while for servers to shutdown, since\n            // shutdown isn't a real crash and isn't instantaneous\n            thread::sleep(RAFT_ELECTION_TIMEOUT);\n            debug!(\"restart servers\");\n            // crash and re-start all\n            for i in 0..nservers {\n                cfg.start_server(i);\n            }\n            cfg.connect_all();\n        }\n\n        // wait for clients.\n        for clnt_rx in &clnt_rxs {\n            clnt_rx.recv().unwrap();\n        }\n\n        if let Some(maxraftstate) = maxraftstate {\n            // Check maximum after the servers have processed all client\n            // requests and had time to checkpoint.\n            if cfg.log_size() > 2 * maxraftstate {\n                panic!(\n                    \"logs were not trimmed ({} > 2*{})\",\n                    cfg.log_size(),\n                    maxraftstate\n                )\n            }\n        }\n    }\n\n    cfg.check_timeout();\n    cfg.end();\n\n    if !check_operations_timeout(\n        KvModel {},\n        Arc::try_unwrap(operations).unwrap().into_inner().unwrap(),\n        LINEARIZABILITY_CHECK_TIMEOUT,\n    ) {\n        panic!(\"history is not linearizable\");\n    }\n}\n\n#[test]\nfn test_basic_3a() {\n    // Test: one client (3A) ...\n    generic_test(\"3A\", 1, false, false, false, None)\n}\n\n#[test]\nfn test_concurrent_3a() {\n    // Test: many clients (3A) ...\n    generic_test(\"3A\", 5, false, false, false, None)\n}\n\n#[test]\nfn test_unreliable_3a() {\n    // Test: unreliable net, many clients (3A) ...\n    generic_test(\"3A\", 5, true, false, false, None)\n}\n\n#[test]\nfn test_unreliable_one_key_3a() {\n    let nservers = 3;\n    let cfg = {\n        let cfg = Config::new(nservers, true, None);\n        cfg.begin(\"Test: concurrent append to same key, unreliable (3A)\");\n        Arc::new(cfg)\n    };\n\n    let all = cfg.all();\n    let ck = cfg.make_client(&all);\n\n    put(&cfg, &ck, \"k\", \"\");\n\n    let cfg_ = cfg.clone();\n    let nclient = 5;\n    let upto = 10;\n    block_on(async {\n        spawn_clients_and_wait(cfg.clone(), nclient, move || {\n            let cfg1 = cfg_.clone();\n            move |me, myck| {\n                for n in 0..upto {\n                    append(&cfg1, myck, \"k\", &format!(\"x {} {} y\", me, n));\n                }\n            }\n        })\n        .await\n    });\n\n    let counts = vec![upto; nclient];\n\n    let vx = get(&cfg, &ck, \"k\");\n    check_concurrent_appends(vx, &counts);\n\n    cfg.check_timeout();\n    cfg.end();\n}\n\n// Submit a request in the minority partition and check that the requests\n// doesn't go through until the partition heals. The leader in the original\n// network ends up in the minority partition.\n#[test]\nfn test_one_partition_3a() {\n    let nservers = 5;\n    let cfg = Config::new(nservers, false, None);\n\n    let all = cfg.all();\n    let ck = cfg.make_client(&all);\n\n    put(&cfg, &ck, \"1\", \"13\");\n\n    cfg.begin(\"Test: progress in majority (3A)\");\n\n    let (p1, p2) = cfg.make_partition();\n    cfg.partition(&p1, &p2);\n\n    // connect ckp1 to p1\n    let ckp1 = cfg.make_client(&p1);\n    // connect ckp2a to p2\n    let ckp2a = cfg.make_client(&p2);\n    let ckp2a_name = ckp2a.name.clone();\n    // connect ckp2b to p2\n    let ckp2b = cfg.make_client(&p2);\n    let ckp2b_name = ckp2b.name.clone();\n\n    put(&cfg, &ckp1, \"1\", \"14\");\n    check(&cfg, &ckp1, \"1\", \"14\");\n\n    cfg.end();\n\n    let (done0_tx, done0_rx) = oneshot::channel::<&'static str>();\n    let (done1_tx, done1_rx) = oneshot::channel::<&'static str>();\n\n    cfg.begin(\"Test: no progress in minority (3A)\");\n    cfg.net.spawn(future::lazy(move |_| {\n        ckp2a.put(\"1\".to_owned(), \"15\".to_owned());\n        done0_tx\n            .send(\"put\")\n            .map_err(|e| {\n                warn!(\"done0 send failed: {:?}\", e);\n            })\n            .unwrap();\n    }));\n    let done0_rx = done0_rx.map(|op| {\n        cfg.op();\n        op\n    });\n\n    cfg.net.spawn(future::lazy(move |_| {\n        // different clerk in p2\n        ckp2b.get(\"1\".to_owned());\n        done1_tx\n            .send(\"get\")\n            .map_err(|e| {\n                warn!(\"done0 send failed: {:?}\", e);\n            })\n            .unwrap();\n    }));\n    let done1_rx = done1_rx.map(|op| {\n        cfg.op();\n        op\n    });\n\n    let timeout = Delay::new(Duration::from_secs(1));\n\n    let dones = block_on(\n        future::select(timeout, future::select(done0_rx, done1_rx)).map(|res| match res {\n            future::Either::Left((_, dones)) => dones,\n            future::Either::Right((future::Either::Left((op, _)), _)) => {\n                panic!(\"{} in minority completed\", op.unwrap())\n            }\n            future::Either::Right((future::Either::Right((op, _)), _)) => {\n                panic!(\"{} in minority completed\", op.unwrap())\n            }\n        }),\n    );\n\n    check(&cfg, &ckp1, \"1\", \"14\");\n    put(&cfg, &ckp1, \"1\", \"16\");\n    check(&cfg, &ckp1, \"1\", \"16\");\n\n    cfg.end();\n\n    cfg.begin(\"Test: completion after heal (3A)\");\n\n    cfg.connect_all();\n    cfg.connect_client_by_name(&ckp2a_name, &all);\n    cfg.connect_client_by_name(&ckp2b_name, &all);\n\n    thread::sleep(RAFT_ELECTION_TIMEOUT);\n\n    let timeout = Delay::new(Duration::from_secs(3));\n    let (timeout, next) = block_on(async {\n        future::select(timeout, dones)\n            .map(|res| match res {\n                future::Either::Left(_) => panic!(\"put/get did not complete\"),\n                future::Either::Right((future::Either::Left((op, next)), timeout)) => {\n                    info!(\"{} completes\", op.unwrap());\n                    (timeout, future::Either::Left(next))\n                }\n                future::Either::Right((future::Either::Right((op, next)), timeout)) => {\n                    info!(\"{} completes\", op.unwrap());\n                    (timeout, future::Either::Right(next))\n                }\n            })\n            .await\n    });\n\n    block_on(async {\n        future::select(timeout, next)\n            .map(|res| match res {\n                future::Either::Left(_) => panic!(\"put/get did not complete\"),\n                future::Either::Right((op, _)) => info!(\"{} completes\", op.unwrap()),\n            })\n            .await\n    });\n\n    check(&cfg, &ck, \"1\", \"15\");\n\n    cfg.end();\n}\n\n#[test]\nfn test_many_partitions_one_client_3a() {\n    // Test: partitions, one client (3A) ...\n    generic_test(\"3A\", 1, false, false, true, None)\n}\n\n#[test]\nfn test_many_partitions_many_clients_3a() {\n    // Test: partitions, many clients (3A) ...\n    generic_test(\"3A\", 5, false, false, true, None)\n}\n\n#[test]\nfn test_persist_one_client_3a() {\n    // Test: restarts, one client (3A) ...\n    generic_test(\"3A\", 1, false, true, false, None)\n}\n\n#[test]\nfn test_persist_concurrent_3a() {\n    // Test: restarts, many clients (3A) ...\n    generic_test(\"3A\", 5, false, true, false, None)\n}\n\n#[test]\nfn test_persist_concurrent_unreliable_3a() {\n    // Test: unreliable net, restarts, many clients (3A) ...\n    generic_test(\"3A\", 5, true, true, false, None)\n}\n\n#[test]\nfn test_persist_partition_3a() {\n    // Test: restarts, partitions, many clients (3A) ...\n    generic_test(\"3A\", 5, false, true, true, None)\n}\n\n#[test]\nfn test_persist_partition_unreliable_3a() {\n    // Test: unreliable net, restarts, partitions, many clients (3A) ...\n    generic_test(\"3A\", 5, true, true, true, None)\n}\n\n#[test]\nfn test_persist_partition_unreliable_linearizable_3a() {\n    // Test: unreliable net, restarts, partitions, linearizability checks (3A) ...\n    generic_test_linearizability(\"3A\", 15, 7, true, true, true, None)\n}\n\n// if one server falls behind, then rejoins, does it\n// recover by using the InstallSnapshot RPC?\n// also checks that majority discards committed log entries\n// even if minority doesn't respond.\n#[test]\nfn test_snapshot_rpc_3b() {\n    let nservers = 3;\n    let maxraftstate = 1000;\n    let cfg = Config::new(nservers, false, Some(maxraftstate));\n\n    let all = cfg.all();\n    let ck = cfg.make_client(&all);\n\n    cfg.begin(\"Test: InstallSnapshot RPC (3B)\");\n\n    put(&cfg, &ck, \"a\", \"A\");\n    check(&cfg, &ck, \"a\", \"A\");\n\n    // a bunch of puts into the majority partition.\n    cfg.partition(&[0, 1], &[2]);\n    {\n        let ck1 = cfg.make_client(&[0, 1]);\n        for i in 0..50 {\n            put(&cfg, &ck1, &format!(\"{}\", i), &format!(\"{}\", i));\n        }\n        thread::sleep(RAFT_ELECTION_TIMEOUT);\n        put(&cfg, &ck1, \"b\", \"B\");\n    }\n\n    // check that the majority partition has thrown away\n    // most of its log entries.\n    if cfg.log_size() > 2 * maxraftstate {\n        panic!(\n            \"logs were not trimmed ({} > 2*{})\",\n            cfg.log_size(),\n            maxraftstate\n        );\n    }\n\n    // now make group that requires participation of\n    // lagging server, so that it has to catch up.\n    cfg.partition(&[0, 2], &[1]);\n    {\n        let ck1 = cfg.make_client(&[0, 2]);\n        put(&cfg, &ck1, \"c\", \"C\");\n        put(&cfg, &ck1, \"d\", \"D\");\n        check(&cfg, &ck1, \"a\", \"A\");\n        check(&cfg, &ck1, \"b\", \"B\");\n        check(&cfg, &ck1, \"1\", \"1\");\n        check(&cfg, &ck1, \"49\", \"49\");\n    }\n\n    // now everybody\n    cfg.partition(&[0, 1, 2], &[]);\n\n    put(&cfg, &ck, \"e\", \"E\");\n    check(&cfg, &ck, \"c\", \"C\");\n    check(&cfg, &ck, \"e\", \"E\");\n    check(&cfg, &ck, \"1\", \"1\");\n\n    cfg.check_timeout();\n    cfg.end();\n}\n\n// are the snapshots not too huge? 500 bytes is a generous bound for the\n// operations we're doing here.\n#[test]\nfn test_snapshot_size_3b() {\n    let nservers = 3;\n    let maxraftstate = 1000;\n    let maxsnapshotstate = 500;\n    let cfg = Config::new(nservers, false, Some(maxraftstate));\n\n    let all = cfg.all();\n    let ck = cfg.make_client(&all);\n\n    cfg.begin(\"Test: snapshot size is reasonable (3B)\");\n\n    for _ in 0..200 {\n        put(&cfg, &ck, \"x\", \"0\");\n        check(&cfg, &ck, \"x\", \"0\");\n        put(&cfg, &ck, \"x\", \"1\");\n        check(&cfg, &ck, \"x\", \"1\");\n    }\n\n    // check that servers have thrown away most of their log entries\n    if cfg.log_size() > 2 * maxraftstate {\n        panic!(\n            \"logs were not trimmed ({} > 2*{})\",\n            cfg.log_size(),\n            maxraftstate,\n        )\n    }\n\n    // check that the snapshots are not unreasonably large\n    if cfg.snapshot_size() > maxsnapshotstate {\n        panic!(\n            \"snapshot too large ({} > {})\",\n            cfg.snapshot_size(),\n            maxsnapshotstate,\n        )\n    }\n\n    cfg.check_timeout();\n    cfg.end();\n}\n\n#[test]\nfn test_snapshot_recover_3b() {\n    // Test: restarts, snapshots, one client (3B) ...\n    generic_test(\"3B\", 1, false, true, false, Some(1000))\n}\n\n#[test]\nfn test_snapshot_recover_many_clients_3b() {\n    // Test: restarts, snapshots, many clients (3B) ...\n    generic_test(\"3B\", 20, false, true, false, Some(1000))\n}\n\n#[test]\nfn test_snapshot_unreliable_3b() {\n    // Test: unreliable net, snapshots, many clients (3B) ...\n    generic_test(\"3B\", 5, true, false, false, Some(1000))\n}\n\n#[test]\nfn test_snapshot_unreliable_recover_3b() {\n    // Test: unreliable net, restarts, snapshots, many clients (3B) ...\n    generic_test(\"3B\", 5, true, true, false, Some(1000))\n}\n\n#[test]\nfn test_snapshot_unreliable_recover_concurrent_partition_3b() {\n    // Test: unreliable net, restarts, partitions, snapshots, many clients (3B) ...\n    generic_test(\"3B\", 5, true, true, true, Some(1000))\n}\n\n#[test]\nfn test_snapshot_unreliable_recover_concurrent_partition_linearizable_3b() {\n    // Test: unreliable net, restarts, partitions, snapshots, linearizability checks (3B) ...\n    generic_test_linearizability(\"3B\", 15, 7, true, true, true, Some(1000))\n}\n"
  },
  {
    "path": "courses/dss/raft/src/lib.rs",
    "content": "#[allow(unused_imports)]\n#[macro_use]\nextern crate log;\n#[allow(unused_imports)]\n#[macro_use]\nextern crate prost_derive;\n\npub mod kvraft;\nmod proto;\npub mod raft;\n\n/// A place holder for suppressing unused_variables warning.\nfn your_code_here<T>(_: T) -> ! {\n    unimplemented!()\n}\n"
  },
  {
    "path": "courses/dss/raft/src/proto/kvraft.proto",
    "content": "syntax = \"proto3\";\n\npackage kvraftpb;\n\nenum Op {\n    Unknown = 0;\n    Put = 1;\n    Append = 2;\n}\n\n/// Put or Append\nmessage PutAppendRequest {\n    string key = 1;\n    string value = 2;\n    // \"Put\" or \"Append\"\n    Op op = 3;\n    // You'll have to add definitions here.\n}\n\nmessage PutAppendReply {\n    bool wrong_leader = 1;\n    string err = 2;\n}\n\nmessage GetRequest {\n    string key = 1;\n    // You'll have to add definitions here.\n}\n\nmessage GetReply {\n    bool wrong_leader = 1;\n    string err = 2;\n    string value = 3;\n}\n"
  },
  {
    "path": "courses/dss/raft/src/proto/mod.rs",
    "content": "pub mod raftpb {\n    include!(concat!(env!(\"OUT_DIR\"), \"/raftpb.rs\"));\n\n    labrpc::service! {\n        service raft {\n            rpc request_vote(RequestVoteArgs) returns (RequestVoteReply);\n\n            // Your code here if more rpc desired.\n            // rpc xxx(yyy) returns (zzz)\n        }\n    }\n    pub use self::raft::{\n        add_service as add_raft_service, Client as RaftClient, Service as RaftService,\n    };\n}\n\npub mod kvraftpb {\n    include!(concat!(env!(\"OUT_DIR\"), \"/kvraftpb.rs\"));\n\n    labrpc::service! {\n        service kv {\n            rpc get(GetRequest) returns (GetReply);\n            rpc put_append(PutAppendRequest) returns (PutAppendReply);\n\n            // Your code here if more rpc desired.\n            // rpc xxx(yyy) returns (zzz)\n        }\n    }\n    pub use self::kv::{add_service as add_kv_service, Client as KvClient, Service as KvService};\n}\n"
  },
  {
    "path": "courses/dss/raft/src/proto/raft.proto",
    "content": "syntax = \"proto3\";\n\npackage raftpb;\n\n// Example RequestVote RPC arguments structure.\nmessage RequestVoteArgs {\n    // Your data here (2A, 2B).\n}\n\n// Example RequestVote RPC reply structure.\nmessage RequestVoteReply {\n    // Your data here (2A).\n}\n"
  },
  {
    "path": "courses/dss/raft/src/raft/config.rs",
    "content": "use std::collections::HashMap;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::{Arc, Mutex};\nuse std::thread;\nuse std::time::{Duration, Instant};\n\nuse futures::channel::mpsc::unbounded;\nuse futures::future;\nuse futures::stream::StreamExt;\nuse rand::Rng;\n\nuse crate::proto::raftpb::*;\nuse crate::raft;\nuse crate::raft::persister::*;\n\npub const SNAPSHOT_INTERVAL: u64 = 10;\n\nfn uniqstring() -> String {\n    static ID: AtomicUsize = AtomicUsize::new(0);\n    format!(\"{}\", ID.fetch_add(1, Ordering::Relaxed))\n}\n\n/// A log entry.\n#[derive(Clone, PartialEq, Message)]\npub struct Entry {\n    #[prost(uint64, tag = \"100\")]\n    pub x: u64,\n}\n\npub struct Storage {\n    // copy of each server's committed entries\n    logs: Vec<HashMap<u64, Entry>>,\n    max_index: u64,\n    max_index0: u64,\n}\n\nimpl Storage {\n    /// how many servers think a log entry is committed?\n    pub fn n_committed(&self, index: u64) -> (usize, Option<Entry>) {\n        let mut count = 0;\n        let mut cmd = None;\n        for log in &self.logs {\n            let cmd1 = log.get(&index).cloned();\n            if cmd1.is_some() {\n                if count > 0 && cmd != cmd1 {\n                    panic!(\n                        \"committed values do not match: index {:?}, {:?}, {:?}\",\n                        index, cmd, cmd1\n                    );\n                }\n                count += 1;\n                cmd = cmd1;\n            }\n        }\n        (count, cmd)\n    }\n}\n\nfn init_logger() {\n    use std::sync::Once;\n    static LOGGER_INIT: Once = Once::new();\n    LOGGER_INIT.call_once(env_logger::init);\n}\n\npub struct Config {\n    pub net: labrpc::Network,\n    n: usize,\n    // use boxed slice to prohibit grow capacity.\n    pub rafts: Arc<Mutex<Box<[Option<raft::Node>]>>>,\n    // whether each server is on the net\n    pub connected: Box<[bool]>,\n    saved: Box<[Arc<SimplePersister>]>,\n    // the port file names each sends to\n    endnames: Box<[Box<[String]>]>,\n\n    pub storage: Arc<Mutex<Storage>>,\n\n    // time at which make_config() was called\n    start: Instant,\n\n    // begin()/end() statistics\n\n    // time at which test_test.go called cfg.begin()\n    t0: Instant,\n    // rpc_total() at start of test\n    rpcs0: usize,\n    // number of agreements\n    cmds0: usize,\n}\n\nimpl Config {\n    pub fn new(n: usize) -> Config {\n        Config::new_with(n, false, false)\n    }\n\n    pub fn new_with(n: usize, unreliable: bool, snapshot: bool) -> Config {\n        init_logger();\n\n        let net = labrpc::Network::new();\n        net.set_reliable(!unreliable);\n        net.set_long_delays(true);\n        let storage = Storage {\n            logs: vec![HashMap::new(); n],\n            max_index: 0,\n            max_index0: 0,\n        };\n        let mut saved = vec![];\n        let mut endnames = vec![];\n        for _ in 0..n {\n            endnames.push(vec![String::new(); n].into_boxed_slice());\n            saved.push(Arc::new(SimplePersister::new()));\n        }\n        let mut cfg = Config {\n            net,\n            n,\n            rafts: Arc::new(Mutex::new(vec![None; n].into_boxed_slice())),\n            connected: vec![true; n].into_boxed_slice(),\n            saved: saved.into_boxed_slice(),\n            endnames: endnames.into_boxed_slice(),\n            storage: Arc::new(Mutex::new(storage)),\n\n            start: Instant::now(),\n            t0: Instant::now(),\n            rpcs0: 0,\n            cmds0: 0,\n        };\n\n        for i in 0..n {\n            cfg.start1_ext(i, snapshot);\n        }\n\n        for i in 0..n {\n            cfg.connect(i);\n        }\n\n        cfg\n    }\n\n    pub fn rpc_count(&self, server: usize) -> usize {\n        self.net.count(&format!(\"{}\", server))\n    }\n\n    fn rpc_total(&self) -> usize {\n        self.net.total_count()\n    }\n\n    /// Maximum log size across all servers\n    pub fn log_size(&self) -> usize {\n        self.saved\n            .iter()\n            .map(|s| s.raft_state().len())\n            .max()\n            .unwrap()\n    }\n\n    // check that there's exactly one leader.\n    // try a few times in case re-elections are needed.\n    pub fn check_one_leader(&self) -> usize {\n        let mut random = rand::thread_rng();\n        let mut leaders = HashMap::new();\n        for _iters in 0..10 {\n            let ms = 450 + (random.gen::<u64>() % 100);\n            thread::sleep(Duration::from_millis(ms));\n\n            for (i, connected) in self.connected.iter().enumerate() {\n                if *connected {\n                    let state = self.rafts.lock().unwrap()[i]\n                        .as_ref()\n                        .unwrap()\n                        .get_state()\n                        .clone();\n                    let term = state.term();\n                    let is_leader = state.is_leader();\n                    if is_leader {\n                        leaders.entry(term).or_insert_with(Vec::new).push(i);\n                    }\n                }\n            }\n\n            let mut last_term_with_leader = 0;\n            for (term, leaders) in &leaders {\n                if leaders.len() > 1 {\n                    panic!(\"term {} has {:?} (>1) leaders\", term, leaders);\n                }\n                if *term > last_term_with_leader {\n                    last_term_with_leader = *term;\n                }\n            }\n\n            if !leaders.is_empty() {\n                return leaders[&last_term_with_leader][0];\n            }\n        }\n\n        panic!(\"expected one leader, got none\")\n    }\n\n    /// check that everyone agrees on the term.\n    pub fn check_terms(&self) -> u64 {\n        let mut term = 0;\n        for (i, connected) in self.connected.iter().enumerate() {\n            if *connected {\n                let xterm = self.rafts.lock().unwrap()[i].as_ref().unwrap().term();\n                if term == 0 {\n                    term = xterm;\n                } else if term != xterm {\n                    panic!(\"servers disagree on term\");\n                }\n            }\n        }\n        term\n    }\n\n    /// check that there's no leader\n    pub fn check_no_leader(&self) {\n        for (i, connected) in self.connected.iter().enumerate() {\n            if *connected {\n                let is_leader = self.rafts.lock().unwrap()[i].as_ref().unwrap().is_leader();\n                if is_leader {\n                    panic!(\"expected no leader, but {} claims to be leader\", i);\n                }\n            }\n        }\n    }\n\n    pub fn check_timeout(&self) {\n        // enforce a two minute real-time limit on each test\n        if self.start.elapsed() > Duration::from_secs(120) {\n            panic!(\"test took longer than 120 seconds\");\n        }\n    }\n\n    /// how many servers think a log entry is committed?\n    pub fn n_committed(&self, index: u64) -> (usize, Option<Entry>) {\n        let s = self.storage.lock().unwrap();\n        s.n_committed(index)\n    }\n\n    // wait for at least n servers to commit.\n    // but don't wait forever.\n    pub fn wait(&self, index: u64, n: usize, start_term: Option<u64>) -> Option<Entry> {\n        let mut to = Duration::from_millis(10);\n        for _ in 0..30 {\n            let (nd, _) = self.n_committed(index);\n            if nd >= n {\n                break;\n            }\n            thread::sleep(to);\n            if to < Duration::from_secs(1) {\n                to *= 2;\n            }\n            if let Some(start_term) = start_term {\n                let rafts = self.rafts.lock().unwrap();\n                for r in rafts.iter().flatten() {\n                    let term = r.term();\n                    if term > start_term {\n                        // someone has moved on\n                        // can no longer guarantee that we'll \"win\"\n                        return None;\n                    }\n                }\n            }\n        }\n        let (nd, cmd) = self.n_committed(index);\n        if nd < n {\n            panic!(\"only {} decided for index {}; wanted {}\", nd, index, n);\n        }\n        cmd\n    }\n\n    /// do a complete agreement.\n    /// it might choose the wrong leader initially,\n    /// and have to re-submit after giving up.\n    /// entirely gives up after about 10 seconds.\n    /// indirectly checks that the servers agree on the\n    /// same value, since n_committed() checks this,\n    /// as do the threads that read from applyCh.\n    /// returns index.\n    /// if retry==true, may submit the command multiple\n    /// times, in case a leader fails just after Start().\n    /// if retry==false, calls start() only once, in order\n    /// to simplify the early Lab 2B tests.\n    pub fn one(&self, cmd: Entry, expected_servers: usize, retry: bool) -> u64 {\n        let t0 = Instant::now();\n        let mut starts = 0;\n        while t0.elapsed() < Duration::from_secs(10) {\n            // try all the servers, maybe one is the leader.\n            let mut index = None;\n            for _ in 0..self.n {\n                starts = (starts + 1) % self.n;\n                if self.connected[starts] {\n                    let rafts = self.rafts.lock().unwrap();\n                    if let Some(ref rf) = &rafts[starts] {\n                        match rf.start(&cmd) {\n                            Ok((index1, _)) => {\n                                index = Some(index1);\n                                break;\n                            }\n                            Err(e) => debug!(\"start cmd {:?} failed: {:?}\", cmd, e),\n                        }\n                    }\n                }\n            }\n\n            if let Some(index) = index {\n                // somebody claimed to be the leader and to have\n                // submitted our command; wait a while for agreement.\n                let t1 = Instant::now();\n                while t1.elapsed() < Duration::from_secs(2) {\n                    let (nd, cmd1) = self.n_committed(index);\n                    if nd > 0 && nd >= expected_servers {\n                        // committed\n                        if let Some(cmd2) = cmd1 {\n                            if cmd2 == cmd {\n                                // and it was the command we submitted.\n                                return index;\n                            }\n                        }\n                    }\n                    thread::sleep(Duration::from_millis(20));\n                }\n                if !retry {\n                    panic!(\"one({:?}) failed to reach agreement\", cmd);\n                }\n            } else {\n                thread::sleep(Duration::from_millis(50));\n            }\n        }\n        panic!(\"one({:?}) failed to reach agreement\", cmd);\n    }\n\n    /// start a Test.\n    /// print the Test message.\n    /// e.g. cfg.begin(\"Test (2B): RPC counts aren't too high\")\n    pub fn begin(&mut self, description: &str) {\n        println!(); // Force the log starts at a new line.\n        info!(\"{} ...\", description);\n        self.t0 = Instant::now();\n        self.rpcs0 = self.rpc_total();\n        self.cmds0 = 0;\n\n        let mut s = self.storage.lock().unwrap();\n        s.max_index0 = s.max_index;\n    }\n\n    /// end a Test -- the fact that we got here means there was no failure.\n    /// print the Passed message, and some performance numbers.\n    pub fn end(&self) {\n        self.check_timeout();\n\n        // real time\n        let t = self.t0.elapsed();\n        // number of Raft peers\n        let npeers = self.n;\n        // number of RPC sends\n        let nrpc = self.rpc_total() - self.rpcs0;\n\n        // number of Raft agreements reported\n        let s = self.storage.lock().unwrap();\n        let ncmds = s.max_index - s.max_index0;\n\n        info!(\"  ... Passed --\");\n        info!(\"  {:?}  {} {} {}\", t, npeers, nrpc, ncmds);\n    }\n\n    /// start or re-start a Raft.\n    /// if one already exists, \"kill\" it first.\n    /// allocate new outgoing port file names, and a new\n    /// state persister, to isolate previous instance of\n    /// this server. since we cannot really kill it.\n    pub fn start1(&mut self, i: usize) {\n        self.start1_ext(i, false);\n    }\n\n    pub fn start1_snapshot(&mut self, i: usize) {\n        self.start1_ext(i, true);\n    }\n\n    fn start1_ext(&mut self, i: usize, snapshot: bool) {\n        self.crash1(i);\n\n        // a fresh set of outgoing ClientEnd names.\n        // so that old crashed instance's ClientEnds can't send.\n        self.endnames[i] = vec![String::new(); self.n].into_boxed_slice();\n        for j in 0..self.n {\n            self.endnames[i][j] = uniqstring();\n        }\n\n        // a fresh set of ClientEnds.\n        let mut clients = Vec::with_capacity(self.n);\n        for (j, name) in self.endnames[i].iter().enumerate() {\n            let cli = self.net.create_client(name.to_string());\n            let client = RaftClient::new(cli);\n            clients.push(client);\n            self.net.connect(name, &format!(\"{}\", j));\n        }\n\n        let (tx, apply_ch) = unbounded();\n        let rf = raft::Raft::new(clients, i, Box::new(self.saved[i].clone()), tx);\n        let node = raft::Node::new(rf);\n        self.rafts.lock().unwrap()[i] = Some(node.clone());\n\n        // listen to messages from Raft indicating newly committed messages.\n        let storage = self.storage.clone();\n        let rafts = self.rafts.clone();\n        let apply = apply_ch.for_each(move |cmd: raft::ApplyMsg| match cmd {\n            raft::ApplyMsg::Command { data, index } => {\n                // debug!(\"apply {}\", index);\n                let entry = labcodec::decode(&data).expect(\"committed command is not an entry\");\n                let mut s = storage.lock().unwrap();\n                for (j, log) in s.logs.iter().enumerate() {\n                    if let Some(old) = log.get(&index) {\n                        if *old != entry {\n                            // some server has already committed a different value for this entry!\n                            panic!(\n                                \"commit index={:?} server={:?} {:?} != server={:?} {:?}\",\n                                index, i, entry, j, old\n                            );\n                        }\n                    }\n                }\n                let log = &mut s.logs[i];\n                if index > 1 && log.get(&(index - 1)).is_none() {\n                    panic!(\"server {} apply out of order {}\", i, index);\n                }\n                log.insert(index, entry);\n                if index > s.max_index {\n                    s.max_index = index;\n                }\n                if snapshot && (index + 1) % SNAPSHOT_INTERVAL == 0 {\n                    rafts.lock().unwrap()[i]\n                        .as_ref()\n                        .unwrap()\n                        .snapshot(index, &data);\n                }\n                future::ready(())\n            }\n            raft::ApplyMsg::Snapshot { data, index, term } if snapshot => {\n                // debug!(\"install snapshot {}\", index);\n                if rafts.lock().unwrap()[i]\n                    .as_ref()\n                    .unwrap()\n                    .cond_install_snapshot(term, index, &data)\n                {\n                    let mut s = storage.lock().unwrap();\n                    let log = &mut s.logs[i];\n                    log.clear();\n                    let entry = labcodec::decode(&data).unwrap();\n                    log.insert(index, entry);\n                }\n                future::ready(())\n            }\n            // ignore other types of ApplyMsg\n            _ => future::ready(()),\n        });\n        self.net.spawn_poller(apply);\n\n        let mut builder = labrpc::ServerBuilder::new(format!(\"{}\", i));\n        raft::add_raft_service(node, &mut builder).unwrap();\n        let srv = builder.build();\n        self.net.add_server(srv);\n    }\n\n    /// shut down a Raft server but save its persistent state.\n    pub fn crash1(&mut self, i: usize) {\n        self.disconnect(i);\n        // disable client connections to the server.\n        self.net.delete_server(&format!(\"{}\", i));\n\n        // a fresh persister, in case old instance\n        // continues to update the Persister.\n        // but copy old persister's content so that we always\n        // pass Make() the last persisted state.\n        let raft_state = self.saved[i].raft_state();\n        let snapshot = self.saved[i].snapshot();\n        let p = SimplePersister::new();\n        p.save_state_and_snapshot(raft_state, snapshot);\n        self.saved[i] = Arc::new(p);\n\n        if let Some(rf) = self.rafts.lock().unwrap()[i].take() {\n            rf.kill();\n        }\n    }\n\n    /// detach server i from the net.\n    pub fn disconnect(&mut self, i: usize) {\n        debug!(\"disconnect({})\", i);\n\n        self.connected[i] = false;\n\n        // outgoing ClientEnds\n        for endname in &*self.endnames[i] {\n            self.net.enable(endname, false);\n        }\n\n        // incoming ClientEnds\n        for names in &*self.endnames {\n            let endname = &names[i];\n            self.net.enable(endname, false);\n        }\n    }\n\n    /// attach server i to the net.\n    pub fn connect(&mut self, i: usize) {\n        debug!(\"connect({})\", i);\n\n        self.connected[i] = true;\n\n        // outgoing ClientEnds\n        for (j, connected) in self.connected.iter().enumerate() {\n            if *connected {\n                let endname = &*self.endnames[i][j];\n                self.net.enable(endname, true);\n            }\n        }\n\n        // incoming ClientEnds\n        for (j, connected) in self.connected.iter().enumerate() {\n            if *connected {\n                let endname = &*self.endnames[j][i];\n                self.net.enable(endname, true);\n            }\n        }\n    }\n}\n\nimpl Drop for Config {\n    fn drop(&mut self) {\n        if let Ok(rafts) = self.rafts.try_lock() {\n            for r in rafts.iter().flatten() {\n                r.kill();\n            }\n        }\n\n        // FIXME: we should not panic in a drop method.\n        self.check_timeout();\n    }\n}\n"
  },
  {
    "path": "courses/dss/raft/src/raft/errors.rs",
    "content": "use std::{error, fmt, result};\n\n#[derive(Clone, Debug, PartialEq, Eq)]\npub enum Error {\n    Encode(labcodec::EncodeError),\n    Decode(labcodec::DecodeError),\n    Rpc(labrpc::Error),\n    NotLeader,\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{:?}\", self)\n    }\n}\n\nimpl error::Error for Error {\n    fn source(&self) -> Option<&(dyn error::Error + 'static)> {\n        match *self {\n            Error::Encode(ref e) => Some(e),\n            Error::Decode(ref e) => Some(e),\n            Error::Rpc(ref e) => Some(e),\n            _ => None,\n        }\n    }\n}\n\npub type Result<T> = result::Result<T, Error>;\n"
  },
  {
    "path": "courses/dss/raft/src/raft/mod.rs",
    "content": "use std::sync::mpsc::{sync_channel, Receiver};\nuse std::sync::Arc;\n\nuse futures::channel::mpsc::UnboundedSender;\n\n#[cfg(test)]\npub mod config;\npub mod errors;\npub mod persister;\n#[cfg(test)]\nmod tests;\n\nuse self::errors::*;\nuse self::persister::*;\nuse crate::proto::raftpb::*;\n\n/// As each Raft peer becomes aware that successive log entries are committed,\n/// the peer should send an `ApplyMsg` to the service (or tester) on the same\n/// server, via the `apply_ch` passed to `Raft::new`.\npub enum ApplyMsg {\n    Command {\n        data: Vec<u8>,\n        index: u64,\n    },\n    // For 2D:\n    Snapshot {\n        data: Vec<u8>,\n        term: u64,\n        index: u64,\n    },\n}\n\n/// State of a raft peer.\n#[derive(Default, Clone, Debug)]\npub struct State {\n    pub term: u64,\n    pub is_leader: bool,\n}\n\nimpl State {\n    /// The current term of this peer.\n    pub fn term(&self) -> u64 {\n        self.term\n    }\n    /// Whether this peer believes it is the leader.\n    pub fn is_leader(&self) -> bool {\n        self.is_leader\n    }\n}\n\n// A single Raft peer.\npub struct Raft {\n    // RPC end points of all peers\n    peers: Vec<RaftClient>,\n    // Object to hold this peer's persisted state\n    persister: Box<dyn Persister>,\n    // this peer's index into peers[]\n    me: usize,\n    state: Arc<State>,\n    // Your data here (2A, 2B, 2C).\n    // Look at the paper's Figure 2 for a description of what\n    // state a Raft server must maintain.\n}\n\nimpl Raft {\n    /// the service or tester wants to create a Raft server. the ports\n    /// of all the Raft servers (including this one) are in peers. this\n    /// server's port is peers[me]. all the servers' peers arrays\n    /// have the same order. persister is a place for this server to\n    /// save its persistent state, and also initially holds the most\n    /// recent saved state, if any. apply_ch is a channel on which the\n    /// tester or service expects Raft to send ApplyMsg messages.\n    /// This method must return quickly.\n    pub fn new(\n        peers: Vec<RaftClient>,\n        me: usize,\n        persister: Box<dyn Persister>,\n        apply_ch: UnboundedSender<ApplyMsg>,\n    ) -> Raft {\n        let raft_state = persister.raft_state();\n\n        // Your initialization code here (2A, 2B, 2C).\n        let mut rf = Raft {\n            peers,\n            persister,\n            me,\n            state: Arc::default(),\n        };\n\n        // initialize from state persisted before a crash\n        rf.restore(&raft_state);\n\n        crate::your_code_here((rf, apply_ch))\n    }\n\n    /// save Raft's persistent state to stable storage,\n    /// where it can later be retrieved after a crash and restart.\n    /// see paper's Figure 2 for a description of what should be persistent.\n    fn persist(&mut self) {\n        // Your code here (2C).\n        // Example:\n        // labcodec::encode(&self.xxx, &mut data).unwrap();\n        // labcodec::encode(&self.yyy, &mut data).unwrap();\n        // self.persister.save_raft_state(data);\n    }\n\n    /// restore previously persisted state.\n    fn restore(&mut self, data: &[u8]) {\n        if data.is_empty() {\n            // bootstrap without any state?\n        }\n        // Your code here (2C).\n        // Example:\n        // match labcodec::decode(data) {\n        //     Ok(o) => {\n        //         self.xxx = o.xxx;\n        //         self.yyy = o.yyy;\n        //     }\n        //     Err(e) => {\n        //         panic!(\"{:?}\", e);\n        //     }\n        // }\n    }\n\n    /// example code to send a RequestVote RPC to a server.\n    /// server is the index of the target server in peers.\n    /// expects RPC arguments in args.\n    ///\n    /// The labrpc package simulates a lossy network, in which servers\n    /// may be unreachable, and in which requests and replies may be lost.\n    /// This method sends a request and waits for a reply. If a reply arrives\n    /// within a timeout interval, This method returns Ok(_); otherwise\n    /// this method returns Err(_). Thus this method may not return for a while.\n    /// An Err(_) return can be caused by a dead server, a live server that\n    /// can't be reached, a lost request, or a lost reply.\n    ///\n    /// This method is guaranteed to return (perhaps after a delay) *except* if\n    /// the handler function on the server side does not return.  Thus there\n    /// is no need to implement your own timeouts around this method.\n    ///\n    /// look at the comments in ../labrpc/src/lib.rs for more details.\n    fn send_request_vote(\n        &self,\n        server: usize,\n        args: RequestVoteArgs,\n    ) -> Receiver<Result<RequestVoteReply>> {\n        // Your code here if you want the rpc becomes async.\n        // Example:\n        // ```\n        // let peer = &self.peers[server];\n        // let peer_clone = peer.clone();\n        // let (tx, rx) = channel();\n        // peer.spawn(async move {\n        //     let res = peer_clone.request_vote(&args).await.map_err(Error::Rpc);\n        //     tx.send(res);\n        // });\n        // rx\n        // ```\n        let (tx, rx) = sync_channel::<Result<RequestVoteReply>>(1);\n        crate::your_code_here((server, args, tx, rx))\n    }\n\n    fn start<M>(&self, command: &M) -> Result<(u64, u64)>\n    where\n        M: labcodec::Message,\n    {\n        let index = 0;\n        let term = 0;\n        let is_leader = true;\n        let mut buf = vec![];\n        labcodec::encode(command, &mut buf).map_err(Error::Encode)?;\n        // Your code here (2B).\n\n        if is_leader {\n            Ok((index, term))\n        } else {\n            Err(Error::NotLeader)\n        }\n    }\n\n    fn cond_install_snapshot(\n        &mut self,\n        last_included_term: u64,\n        last_included_index: u64,\n        snapshot: &[u8],\n    ) -> bool {\n        // Your code here (2D).\n        crate::your_code_here((last_included_term, last_included_index, snapshot));\n    }\n\n    fn snapshot(&mut self, index: u64, snapshot: &[u8]) {\n        // Your code here (2D).\n        crate::your_code_here((index, snapshot));\n    }\n}\n\nimpl Raft {\n    /// Only for suppressing deadcode warnings.\n    #[doc(hidden)]\n    pub fn __suppress_deadcode(&mut self) {\n        let _ = self.start(&0);\n        let _ = self.cond_install_snapshot(0, 0, &[]);\n        self.snapshot(0, &[]);\n        let _ = self.send_request_vote(0, Default::default());\n        self.persist();\n        let _ = &self.state;\n        let _ = &self.me;\n        let _ = &self.persister;\n        let _ = &self.peers;\n    }\n}\n\n// Choose concurrency paradigm.\n//\n// You can either drive the raft state machine by the rpc framework,\n//\n// ```rust\n// struct Node { raft: Arc<Mutex<Raft>> }\n// ```\n//\n// or spawn a new thread runs the raft state machine and communicate via\n// a channel.\n//\n// ```rust\n// struct Node { sender: Sender<Msg> }\n// ```\n#[derive(Clone)]\npub struct Node {\n    // Your code here.\n}\n\nimpl Node {\n    /// Create a new raft service.\n    pub fn new(raft: Raft) -> Node {\n        // Your code here.\n        crate::your_code_here(raft)\n    }\n\n    /// the service using Raft (e.g. a k/v server) wants to start\n    /// agreement on the next command to be appended to Raft's log. if this\n    /// server isn't the leader, returns [`Error::NotLeader`]. otherwise start\n    /// the agreement and return immediately. there is no guarantee that this\n    /// command will ever be committed to the Raft log, since the leader\n    /// may fail or lose an election. even if the Raft instance has been killed,\n    /// this function should return gracefully.\n    ///\n    /// the first value of the tuple is the index that the command will appear\n    /// at if it's ever committed. the second is the current term.\n    ///\n    /// This method must return without blocking on the raft.\n    pub fn start<M>(&self, command: &M) -> Result<(u64, u64)>\n    where\n        M: labcodec::Message,\n    {\n        // Your code here.\n        // Example:\n        // self.raft.start(command)\n        crate::your_code_here(command)\n    }\n\n    /// The current term of this peer.\n    pub fn term(&self) -> u64 {\n        // Your code here.\n        // Example:\n        // self.raft.term\n        crate::your_code_here(())\n    }\n\n    /// Whether this peer believes it is the leader.\n    pub fn is_leader(&self) -> bool {\n        // Your code here.\n        // Example:\n        // self.raft.leader_id == self.id\n        crate::your_code_here(())\n    }\n\n    /// The current state of this peer.\n    pub fn get_state(&self) -> State {\n        State {\n            term: self.term(),\n            is_leader: self.is_leader(),\n        }\n    }\n\n    /// the tester calls kill() when a Raft instance won't be\n    /// needed again. you are not required to do anything in\n    /// kill(), but it might be convenient to (for example)\n    /// turn off debug output from this instance.\n    /// In Raft paper, a server crash is a PHYSICAL crash,\n    /// A.K.A all resources are reset. But we are simulating\n    /// a VIRTUAL crash in tester, so take care of background\n    /// threads you generated with this Raft Node.\n    pub fn kill(&self) {\n        // Your code here, if desired.\n    }\n\n    /// A service wants to switch to snapshot.  \n    ///\n    /// Only do so if Raft hasn't have more recent info since it communicate\n    /// the snapshot on `apply_ch`.\n    pub fn cond_install_snapshot(\n        &self,\n        last_included_term: u64,\n        last_included_index: u64,\n        snapshot: &[u8],\n    ) -> bool {\n        // Your code here.\n        // Example:\n        // self.raft.cond_install_snapshot(last_included_term, last_included_index, snapshot)\n        crate::your_code_here((last_included_term, last_included_index, snapshot));\n    }\n\n    /// The service says it has created a snapshot that has all info up to and\n    /// including index. This means the service no longer needs the log through\n    /// (and including) that index. Raft should now trim its log as much as\n    /// possible.\n    pub fn snapshot(&self, index: u64, snapshot: &[u8]) {\n        // Your code here.\n        // Example:\n        // self.raft.snapshot(index, snapshot)\n        crate::your_code_here((index, snapshot));\n    }\n}\n\n#[async_trait::async_trait]\nimpl RaftService for Node {\n    // example RequestVote RPC handler.\n    //\n    // CAVEATS: Please avoid locking or sleeping here, it may jam the network.\n    async fn request_vote(&self, args: RequestVoteArgs) -> labrpc::Result<RequestVoteReply> {\n        // Your code here (2A, 2B).\n        crate::your_code_here(args)\n    }\n}\n"
  },
  {
    "path": "courses/dss/raft/src/raft/persister.rs",
    "content": "//! Support for Raft and kvraft to save persistent\n//! Raft state (log &c) and k/v server snapshots.\n//!\n//! we will use the original persister.rs to test your code for grading.\n//! so, while you can modify this code to help you debug, please\n//! test with the original before submitting.\n\nuse std::sync::{Arc, Mutex};\n\npub trait Persister: Send + 'static {\n    fn raft_state(&self) -> Vec<u8>;\n    fn save_raft_state(&self, state: Vec<u8>);\n    fn save_state_and_snapshot(&self, state: Vec<u8>, snapshot: Vec<u8>);\n    fn snapshot(&self) -> Vec<u8>;\n}\n\nimpl<T: ?Sized + Persister> Persister for Box<T> {\n    fn raft_state(&self) -> Vec<u8> {\n        (**self).raft_state()\n    }\n    fn save_raft_state(&self, state: Vec<u8>) {\n        (**self).save_raft_state(state)\n    }\n    fn save_state_and_snapshot(&self, state: Vec<u8>, snapshot: Vec<u8>) {\n        (**self).save_state_and_snapshot(state, snapshot)\n    }\n    fn snapshot(&self) -> Vec<u8> {\n        (**self).snapshot()\n    }\n}\n\nimpl<T: ?Sized + Sync + Persister> Persister for Arc<T> {\n    fn raft_state(&self) -> Vec<u8> {\n        (**self).raft_state()\n    }\n    fn save_raft_state(&self, state: Vec<u8>) {\n        (**self).save_raft_state(state)\n    }\n    fn save_state_and_snapshot(&self, state: Vec<u8>, snapshot: Vec<u8>) {\n        (**self).save_state_and_snapshot(state, snapshot)\n    }\n    fn snapshot(&self) -> Vec<u8> {\n        (**self).snapshot()\n    }\n}\n\n#[derive(Default)]\npub struct SimplePersister {\n    states: Mutex<(\n        Vec<u8>, // raft state\n        Vec<u8>, // snapshot\n    )>,\n}\n\nimpl SimplePersister {\n    pub fn new() -> SimplePersister {\n        SimplePersister {\n            states: Mutex::default(),\n        }\n    }\n}\n\nimpl Persister for SimplePersister {\n    fn raft_state(&self) -> Vec<u8> {\n        self.states.lock().unwrap().0.clone()\n    }\n\n    fn save_raft_state(&self, state: Vec<u8>) {\n        self.states.lock().unwrap().0 = state;\n    }\n\n    fn save_state_and_snapshot(&self, state: Vec<u8>, snapshot: Vec<u8>) {\n        self.states.lock().unwrap().0 = state;\n        self.states.lock().unwrap().1 = snapshot;\n    }\n\n    fn snapshot(&self) -> Vec<u8> {\n        self.states.lock().unwrap().1.clone()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_object_safety() {\n        let sp = SimplePersister::new();\n        sp.save_raft_state(vec![111]);\n        let obj: Box<dyn Persister + Sync> = Box::new(sp);\n        assert_eq!(obj.raft_state(), vec![111]);\n        obj.save_state_and_snapshot(vec![222], vec![123]);\n        assert_eq!(obj.raft_state(), vec![222]);\n        assert_eq!(obj.snapshot(), vec![123]);\n\n        let cloneable_obj: Arc<dyn Persister> = Arc::new(obj);\n        assert_eq!(cloneable_obj.raft_state(), vec![222]);\n        assert_eq!(cloneable_obj.snapshot(), vec![123]);\n\n        let cloneable_obj_ = cloneable_obj.clone();\n        cloneable_obj.save_raft_state(vec![233]);\n        assert_eq!(cloneable_obj_.raft_state(), vec![233]);\n        assert_eq!(cloneable_obj_.snapshot(), vec![123]);\n\n        let sp = SimplePersister::new();\n        let obj: Arc<dyn Persister + Sync> = Arc::new(sp);\n        let _box_obj: Box<dyn Persister> = Box::new(obj);\n    }\n}\n"
  },
  {
    "path": "courses/dss/raft/src/raft/tests.rs",
    "content": "#![allow(clippy::identity_op)]\n\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::mpsc::{channel, Sender};\nuse std::sync::{Arc, Mutex};\nuse std::thread;\nuse std::time::Duration;\n\nuse futures::channel::oneshot;\nuse futures::executor::block_on;\nuse futures::future;\nuse rand::{rngs::ThreadRng, Rng};\n\nuse crate::raft::config::{Config, Entry, Storage, SNAPSHOT_INTERVAL};\nuse crate::raft::Node;\n\n/// The tester generously allows solutions to complete elections in one second\n/// (much more than the paper's range of timeouts).\nconst RAFT_ELECTION_TIMEOUT: Duration = Duration::from_millis(1000);\n\nfn random_entry(rnd: &mut ThreadRng) -> Entry {\n    Entry {\n        x: rnd.gen::<u64>(),\n    }\n}\n\n#[test]\nfn test_initial_election_2a() {\n    let servers = 3;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2A): initial election\");\n\n    // is a leader elected?\n    cfg.check_one_leader();\n\n    // sleep a bit to avoid racing with followers learning of the\n    // election, then check that all peers agree on the term.\n    thread::sleep(Duration::from_millis(50));\n    let term1 = cfg.check_terms();\n\n    // does the leader+term stay the same if there is no network failure?\n    thread::sleep(2 * RAFT_ELECTION_TIMEOUT);\n    let term2 = cfg.check_terms();\n    if term1 != term2 {\n        warn!(\"warning: term changed even though there were no failures\")\n    }\n\n    // there should still be a leader.\n    cfg.check_one_leader();\n\n    cfg.end();\n}\n\n#[test]\nfn test_reelection_2a() {\n    let servers = 3;\n    let mut cfg = Config::new(servers);\n    cfg.begin(\"Test (2A): election after network failure\");\n\n    let leader1 = cfg.check_one_leader();\n    // if the leader disconnects, a new one should be elected.\n    cfg.disconnect(leader1);\n    cfg.check_one_leader();\n\n    // if the old leader rejoins, that shouldn't\n    // disturb the new leader.\n    cfg.connect(leader1);\n    let leader2 = cfg.check_one_leader();\n\n    // if there's no quorum, no leader should\n    // be elected.\n    cfg.disconnect(leader2);\n    cfg.disconnect((leader2 + 1) % servers);\n    thread::sleep(2 * RAFT_ELECTION_TIMEOUT);\n    cfg.check_no_leader();\n\n    // if a quorum arises, it should elect a leader.\n    cfg.connect((leader2 + 1) % servers);\n    cfg.check_one_leader();\n\n    // re-join of last node shouldn't prevent leader from existing.\n    cfg.connect(leader2);\n    cfg.check_one_leader();\n\n    cfg.end();\n}\n\n#[test]\nfn test_many_election_2a() {\n    let servers = 7;\n    let iters = 10;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2A): multiple elections\");\n\n    cfg.check_one_leader();\n\n    let mut random = rand::thread_rng();\n    for _ in 0..iters {\n        // disconnect three nodes\n        let i1 = random.gen::<usize>() % servers;\n        let i2 = random.gen::<usize>() % servers;\n        let i3 = random.gen::<usize>() % servers;\n        cfg.disconnect(i1);\n        cfg.disconnect(i2);\n        cfg.disconnect(i3);\n\n        // either the current leader should still be alive,\n        // or the remaining four should elect a new one.\n        cfg.check_one_leader();\n\n        cfg.connect(i1);\n        cfg.connect(i2);\n        cfg.connect(i3);\n    }\n\n    cfg.check_one_leader();\n\n    cfg.end();\n}\n\n#[test]\nfn test_basic_agree_2b() {\n    let servers = 5;\n    let mut cfg = Config::new(servers);\n    cfg.begin(\"Test (2B): basic agreement\");\n\n    let iters = 3;\n    for index in 1..=iters {\n        let (nd, _) = cfg.n_committed(index);\n        if nd > 0 {\n            panic!(\"some have committed before start()\");\n        }\n\n        let xindex = cfg.one(Entry { x: index * 100 }, servers, false);\n        if xindex != index {\n            panic!(\"got index {} but expected {}\", xindex, index);\n        }\n    }\n\n    cfg.end()\n}\n\n#[test]\nfn test_fail_agree_2b() {\n    let servers = 3;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2B): agreement despite follower disconnection\");\n\n    cfg.one(Entry { x: 101 }, servers, false);\n\n    // follower network disconnection\n    let leader = cfg.check_one_leader();\n    cfg.disconnect((leader + 1) % servers);\n\n    // agree despite one disconnected server?\n    cfg.one(Entry { x: 102 }, servers - 1, false);\n    cfg.one(Entry { x: 103 }, servers - 1, false);\n    thread::sleep(RAFT_ELECTION_TIMEOUT);\n    cfg.one(Entry { x: 104 }, servers - 1, false);\n    cfg.one(Entry { x: 105 }, servers - 1, false);\n\n    // re-connect\n    cfg.connect((leader + 1) % servers);\n\n    // agree with full set of servers?\n    cfg.one(Entry { x: 106 }, servers, true);\n    thread::sleep(RAFT_ELECTION_TIMEOUT);\n    cfg.one(Entry { x: 107 }, servers, true);\n\n    cfg.end();\n}\n\n#[test]\nfn test_fail_no_agree_2b() {\n    let servers = 5;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2B): no agreement if too many followers disconnect\");\n\n    cfg.one(Entry { x: 10 }, servers, false);\n\n    // 3 of 5 followers disconnect\n    let leader = cfg.check_one_leader();\n    cfg.disconnect((leader + 1) % servers);\n    cfg.disconnect((leader + 2) % servers);\n    cfg.disconnect((leader + 3) % servers);\n    let (index, _) = cfg.rafts.lock().unwrap()[leader]\n        .as_ref()\n        .unwrap()\n        .start(&Entry { x: 20 })\n        .expect(\"leader rejected start\");\n    if index != 2 {\n        panic!(\"expected index 2, got {}\", index);\n    }\n\n    thread::sleep(2 * RAFT_ELECTION_TIMEOUT);\n\n    let (n, _) = cfg.n_committed(index);\n    if n > 0 {\n        panic!(\"{} committed but no majority\", n);\n    }\n\n    // repair\n    cfg.connect((leader + 1) % servers);\n    cfg.connect((leader + 2) % servers);\n    cfg.connect((leader + 3) % servers);\n\n    // the disconnected majority may have chosen a leader from\n    // among their own ranks, forgetting index 2.\n    let leader2 = cfg.check_one_leader();\n    let (index2, _) = cfg.rafts.lock().unwrap()[leader2]\n        .as_ref()\n        .unwrap()\n        .start(&Entry { x: 30 })\n        .expect(\"leader2 rejected start\");\n    if !(2..=3).contains(&index2) {\n        panic!(\"unexpected index {}\", index2);\n    }\n\n    cfg.one(Entry { x: 1000 }, servers, true);\n\n    cfg.end();\n}\n\n#[test]\nfn test_concurrent_starts_2b() {\n    let servers = 3;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2B): concurrent start()s\");\n    let mut success = false;\n    'outer: for tried in 0..5 {\n        if tried > 0 {\n            // give solution some time to settle\n            thread::sleep(Duration::from_secs(3));\n        }\n\n        let leader = cfg.check_one_leader();\n        let term = match cfg.rafts.lock().unwrap()[leader]\n            .as_ref()\n            .unwrap()\n            .start(&Entry { x: 1 })\n        {\n            Err(err) => {\n                warn!(\"start leader {} meet error {:?}\", leader, err);\n                continue;\n            }\n            Ok((_, term)) => term,\n        };\n\n        let mut idx_rxs = vec![];\n        for ii in 0..5 {\n            let (tx, rx) = oneshot::channel();\n            idx_rxs.push(rx);\n            let node = cfg.rafts.lock().unwrap()[leader].clone().unwrap();\n            cfg.net.spawn(future::lazy(move |_| {\n                let idx = match node.start(&Entry { x: 100 + ii }) {\n                    Err(err) => {\n                        warn!(\"start leader {} meet error {:?}\", leader, err);\n                        None\n                    }\n                    Ok((idx, term1)) => {\n                        if term1 != term {\n                            None\n                        } else {\n                            Some(idx)\n                        }\n                    }\n                };\n                tx.send(idx)\n                    .map_err(|e| panic!(\"send failed: {:?}\", e))\n                    .unwrap();\n            }));\n        }\n        let idxes = block_on(async {\n            future::join_all(idx_rxs)\n                .await\n                .into_iter()\n                .map(|idx_rx| idx_rx.unwrap())\n                .collect::<Vec<_>>()\n        });\n\n        for j in 0..servers {\n            let t = cfg.rafts.lock().unwrap()[j].as_ref().unwrap().term();\n            if t != term {\n                // term changed -- can't expect low RPC counts\n                continue 'outer;\n            }\n        }\n\n        let mut cmds = vec![];\n        for index in idxes.into_iter().flatten() {\n            if let Some(cmd) = cfg.wait(index, servers, Some(term)) {\n                cmds.push(cmd.x);\n            } else {\n                // peers have moved on to later terms\n                // so we can't expect all Start()s to\n                // have succeeded\n                continue;\n            }\n        }\n\n        for ii in 0..5 {\n            let x = 100 + ii;\n            let mut ok = false;\n            for cmd in &cmds {\n                if *cmd == x {\n                    ok = true;\n                }\n            }\n            assert!(ok, \"cmd {} missing in {:?}\", x, cmds)\n        }\n\n        success = true;\n        break;\n    }\n\n    assert!(success, \"term changed too often\");\n\n    cfg.end();\n}\n\n#[test]\nfn test_rejoin_2b() {\n    let servers = 3;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2B): rejoin of partitioned leader\");\n\n    cfg.one(Entry { x: 101 }, servers, true);\n\n    // leader network failure\n    let leader1 = cfg.check_one_leader();\n    cfg.disconnect(leader1);\n\n    // make old leader try to agree on some entries\n    let _ = cfg.rafts.lock().unwrap()[leader1]\n        .as_ref()\n        .unwrap()\n        .start(&Entry { x: 102 });\n    let _ = cfg.rafts.lock().unwrap()[leader1]\n        .as_ref()\n        .unwrap()\n        .start(&Entry { x: 103 });\n    let _ = cfg.rafts.lock().unwrap()[leader1]\n        .as_ref()\n        .unwrap()\n        .start(&Entry { x: 104 });\n\n    // new leader commits, also for index=2\n    cfg.one(Entry { x: 103 }, 2, true);\n\n    // new leader network failure\n    let leader2 = cfg.check_one_leader();\n    cfg.disconnect(leader2);\n\n    // old leader connected again\n    cfg.connect(leader1);\n\n    cfg.one(Entry { x: 104 }, 2, true);\n\n    // all together now\n    cfg.connect(leader2);\n\n    cfg.one(Entry { x: 105 }, servers, true);\n\n    cfg.end();\n}\n\n#[test]\nfn test_backup_2b() {\n    let servers = 5;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2B): leader backs up quickly over incorrect follower logs\");\n\n    let mut random = rand::thread_rng();\n    cfg.one(random_entry(&mut random), servers, true);\n\n    // put leader and one follower in a partition\n    let leader1 = cfg.check_one_leader();\n    cfg.disconnect((leader1 + 2) % servers);\n    cfg.disconnect((leader1 + 3) % servers);\n    cfg.disconnect((leader1 + 4) % servers);\n\n    // submit lots of commands that won't commit\n    for _i in 0..50 {\n        let _ = cfg.rafts.lock().unwrap()[leader1]\n            .as_ref()\n            .unwrap()\n            .start(&random_entry(&mut random));\n    }\n\n    thread::sleep(RAFT_ELECTION_TIMEOUT / 2);\n\n    cfg.disconnect((leader1 + 0) % servers);\n    cfg.disconnect((leader1 + 1) % servers);\n\n    // allow other partition to recover\n    cfg.connect((leader1 + 2) % servers);\n    cfg.connect((leader1 + 3) % servers);\n    cfg.connect((leader1 + 4) % servers);\n\n    // lots of successful commands to new group.\n    for _i in 0..50 {\n        cfg.one(random_entry(&mut random), 3, true);\n    }\n\n    // now another partitioned leader and one follower\n    let leader2 = cfg.check_one_leader();\n    let mut other = (leader1 + 2) % servers;\n    if leader2 == other {\n        other = (leader2 + 1) % servers;\n    }\n    cfg.disconnect(other);\n\n    // lots more commands that won't commit\n    for _i in 0..50 {\n        let _ = cfg.rafts.lock().unwrap()[leader2]\n            .as_ref()\n            .unwrap()\n            .start(&random_entry(&mut random));\n    }\n\n    thread::sleep(RAFT_ELECTION_TIMEOUT / 2);\n\n    // bring original leader back to life,\n    for i in 0..servers {\n        cfg.disconnect(i);\n    }\n    cfg.connect((leader1 + 0) % servers);\n    cfg.connect((leader1 + 1) % servers);\n    cfg.connect(other);\n\n    // lots of successful commands to new group.\n    for _i in 0..50 {\n        cfg.one(random_entry(&mut random), 3, true);\n    }\n\n    // now everyone\n    for i in 0..servers {\n        cfg.connect(i);\n    }\n    cfg.one(random_entry(&mut random), servers, true);\n\n    cfg.end();\n}\n\n#[test]\nfn test_count_2b() {\n    const SERVERS: usize = 3;\n    fn rpcs(cfg: &Config) -> usize {\n        let mut n: usize = 0;\n        for j in 0..SERVERS {\n            n += cfg.rpc_count(j);\n        }\n        n\n    }\n\n    let mut cfg = Config::new(SERVERS);\n\n    cfg.begin(\"Test (2B): RPC counts aren't too high\");\n\n    cfg.check_one_leader();\n    let mut total1 = rpcs(&cfg);\n\n    if !(1..=30).contains(&total1) {\n        panic!(\"too many or few RPCs ({}) to elect initial leader\", total1);\n    }\n\n    let mut total2 = 0;\n    let mut success = false;\n    'outer: for tried in 0..5 {\n        if tried > 0 {\n            // give solution some time to settle\n            thread::sleep(Duration::from_secs(3));\n        }\n\n        let leader = cfg.check_one_leader();\n        total1 = rpcs(&cfg);\n\n        let iters = 10;\n        let (starti, term) = match cfg.rafts.lock().unwrap()[leader]\n            .as_ref()\n            .unwrap()\n            .start(&Entry { x: 1 })\n        {\n            Ok((starti, term)) => (starti, term),\n            Err(err) => {\n                warn!(\"start leader {} meet error {:?}\", leader, err);\n                continue;\n            }\n        };\n\n        let mut cmds = vec![];\n        let mut random = rand::thread_rng();\n        for i in 1..iters + 2 {\n            let x = random.gen::<u64>();\n            cmds.push(x);\n            match cfg.rafts.lock().unwrap()[leader]\n                .as_ref()\n                .unwrap()\n                .start(&Entry { x })\n            {\n                Ok((index1, term1)) => {\n                    if term1 != term {\n                        // Term changed while starting\n                        continue 'outer;\n                    }\n                    if starti + i != index1 {\n                        panic!(\"start failed\");\n                    }\n                }\n                Err(err) => {\n                    warn!(\"start leader {} meet error {:?}\", leader, err);\n                    continue 'outer;\n                }\n            }\n        }\n\n        for i in 1..=iters {\n            if let Some(ix) = cfg.wait(starti + i, SERVERS, Some(term)) {\n                if ix.x != cmds[(i - 1) as usize] {\n                    panic!(\n                        \"wrong value {:?} committed for index {}; expected {:?}\",\n                        ix,\n                        starti + i,\n                        cmds\n                    );\n                }\n            }\n        }\n\n        let mut failed = false;\n        total2 = 0;\n        for j in 0..SERVERS {\n            let t = cfg.rafts.lock().unwrap()[j].as_ref().unwrap().term();\n            if t != term {\n                // term changed -- can't expect low RPC counts\n                // need to keep going to update total2\n                failed = true;\n            }\n            total2 += cfg.rpc_count(j);\n        }\n\n        if failed {\n            continue 'outer;\n        }\n\n        if total2 - total1 > (iters as usize + 1 + 3) * 3 {\n            panic!(\"too many RPCs ({}) for {} entries\", total2 - total1, iters);\n        }\n\n        success = true;\n        break;\n    }\n\n    if !success {\n        panic!(\"term changed too often\");\n    }\n\n    thread::sleep(RAFT_ELECTION_TIMEOUT);\n\n    let mut total3 = 0;\n    for j in 0..SERVERS {\n        total3 += cfg.rpc_count(j);\n    }\n\n    if total3 - total2 > 3 * 20 {\n        panic!(\n            \"too many RPCs ({}) for 1 second of idleness\",\n            total3 - total2\n        );\n    }\n    cfg.end();\n}\n\n#[test]\nfn test_persist1_2c() {\n    let servers = 3;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2C): basic persistence\");\n\n    cfg.one(Entry { x: 11 }, servers, true);\n\n    // crash and re-start all\n    for i in 0..servers {\n        cfg.start1(i);\n    }\n    for i in 0..servers {\n        cfg.disconnect(i);\n        cfg.connect(i);\n    }\n\n    cfg.one(Entry { x: 12 }, servers, true);\n\n    let leader1 = cfg.check_one_leader();\n    cfg.disconnect(leader1);\n    cfg.start1(leader1);\n    cfg.connect(leader1);\n\n    cfg.one(Entry { x: 13 }, servers, true);\n\n    let leader2 = cfg.check_one_leader();\n    cfg.disconnect(leader2);\n    cfg.one(Entry { x: 14 }, servers - 1, true);\n    cfg.start1(leader2);\n    cfg.connect(leader2);\n\n    cfg.wait(4, servers, None); // wait for leader2 to join before killing i3\n\n    let i3 = (cfg.check_one_leader() + 1) % servers;\n    cfg.disconnect(i3);\n    cfg.one(Entry { x: 15 }, servers - 1, true);\n    cfg.start1(i3);\n    cfg.connect(i3);\n\n    cfg.one(Entry { x: 16 }, servers, true);\n\n    cfg.end();\n}\n\n#[test]\nfn test_persist2_2c() {\n    let servers = 5;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2C): more persistence\");\n\n    let mut index = 1;\n    for _ in 0..5 {\n        cfg.one(Entry { x: 10 + index }, servers, true);\n        index += 1;\n\n        let leader1 = cfg.check_one_leader();\n\n        cfg.disconnect((leader1 + 1) % servers);\n        cfg.disconnect((leader1 + 2) % servers);\n\n        cfg.one(Entry { x: 10 + index }, servers - 2, true);\n        index += 1;\n\n        cfg.disconnect((leader1 + 0) % servers);\n        cfg.disconnect((leader1 + 3) % servers);\n        cfg.disconnect((leader1 + 4) % servers);\n\n        cfg.start1((leader1 + 1) % servers);\n        cfg.start1((leader1 + 2) % servers);\n        cfg.connect((leader1 + 1) % servers);\n        cfg.connect((leader1 + 2) % servers);\n\n        thread::sleep(RAFT_ELECTION_TIMEOUT);\n\n        cfg.start1((leader1 + 3) % servers);\n        cfg.connect((leader1 + 3) % servers);\n\n        cfg.one(Entry { x: 10 + index }, servers - 2, true);\n        index += 1;\n\n        cfg.connect((leader1 + 4) % servers);\n        cfg.connect((leader1 + 0) % servers);\n    }\n\n    cfg.one(Entry { x: 1000 }, servers, true);\n\n    cfg.end();\n}\n\n#[test]\nfn test_persist3_2c() {\n    let servers = 3;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2C): partitioned leader and one follower crash, leader restarts\");\n\n    cfg.one(Entry { x: 101 }, 3, true);\n\n    let leader = cfg.check_one_leader();\n    cfg.disconnect((leader + 2) % servers);\n\n    cfg.one(Entry { x: 102 }, 2, true);\n\n    cfg.crash1((leader + 0) % servers);\n    cfg.crash1((leader + 1) % servers);\n    cfg.connect((leader + 2) % servers);\n    cfg.start1((leader + 0) % servers);\n    cfg.connect((leader + 0) % servers);\n\n    cfg.one(Entry { x: 103 }, 2, true);\n\n    cfg.start1((leader + 1) % servers);\n    cfg.connect((leader + 1) % servers);\n\n    cfg.one(Entry { x: 104 }, servers, true);\n\n    cfg.end();\n}\n\n// Test the scenarios described in Figure 8 of the extended Raft paper. Each\n// iteration asks a leader, if there is one, to insert a command in the Raft\n// log.  If there is a leader, that leader will fail quickly with a high\n// probability (perhaps without committing the command), or crash after a while\n// with low probability (most likey committing the command).  If the number of\n// alive servers isn't enough to form a majority, perhaps start a new server.\n// The leader in a new term may try to finish replicating log entries that\n// haven't been committed yet.\n#[test]\nfn test_figure_8_2c() {\n    let servers = 5;\n    let mut cfg = Config::new(servers);\n\n    cfg.begin(\"Test (2C): Figure 8\");\n\n    let mut random = rand::thread_rng();\n    cfg.one(random_entry(&mut random), 1, true);\n\n    let mut nup = servers;\n    for _iters in 0..1000 {\n        let mut leader = None;\n        for i in 0..servers {\n            let mut rafts = cfg.rafts.lock().unwrap();\n            if let Some(Some(raft)) = rafts.get_mut(i) {\n                if raft.start(&random_entry(&mut random)).is_ok() {\n                    leader = Some(i);\n                }\n            }\n        }\n\n        if (random.gen::<usize>() % 1000) < 100 {\n            let ms = random.gen::<u64>() % ((RAFT_ELECTION_TIMEOUT.as_millis() / 2) as u64);\n            thread::sleep(Duration::from_millis(ms));\n        } else {\n            let ms = random.gen::<u64>() % 13;\n            thread::sleep(Duration::from_millis(ms));\n        }\n\n        if let Some(leader) = leader {\n            cfg.crash1(leader);\n            nup -= 1;\n        }\n\n        if nup < 3 {\n            let s = random.gen::<usize>() % servers;\n            if cfg.rafts.lock().unwrap().get(s).unwrap().is_none() {\n                cfg.start1(s);\n                cfg.connect(s);\n                nup += 1;\n            }\n        }\n    }\n\n    for i in 0..servers {\n        if cfg.rafts.lock().unwrap().get(i).unwrap().is_none() {\n            cfg.start1(i);\n            cfg.connect(i);\n        }\n    }\n\n    cfg.one(random_entry(&mut random), servers, true);\n\n    cfg.end();\n}\n\n#[test]\nfn test_unreliable_agree_2c() {\n    let servers = 5;\n\n    let cfg = {\n        let mut cfg = Config::new_with(servers, true, false);\n        cfg.begin(\"Test (2C): unreliable agreement\");\n        Arc::new(cfg)\n    };\n\n    let mut dones = vec![];\n    for iters in 1..50 {\n        for j in 0..4 {\n            let c = cfg.clone();\n            let (tx, rx) = oneshot::channel();\n            thread::spawn(move || {\n                c.one(\n                    Entry {\n                        x: (100 * iters) + j,\n                    },\n                    1,\n                    true,\n                );\n                tx.send(()).map_err(|e| panic!(\"send failed: {:?}\", e))\n            });\n            dones.push(rx);\n        }\n        cfg.one(Entry { x: iters }, 1, true);\n    }\n\n    cfg.net.set_reliable(true);\n\n    block_on(async {\n        future::join_all(dones)\n            .await\n            .into_iter()\n            .for_each(|done| done.unwrap());\n    });\n\n    cfg.one(Entry { x: 100 }, servers, true);\n\n    cfg.end();\n}\n\n#[test]\nfn test_figure_8_unreliable_2c() {\n    let servers = 5;\n    let mut cfg = Config::new_with(servers, true, false);\n\n    cfg.begin(\"Test (2C): Figure 8 (unreliable)\");\n    let mut random = rand::thread_rng();\n    cfg.one(\n        Entry {\n            x: random.gen::<u64>() % 10000,\n        },\n        1,\n        true,\n    );\n\n    let mut nup = servers;\n    for iters in 0..1000 {\n        if iters == 200 {\n            cfg.net.set_long_reordering(true);\n        }\n        let mut leader = None;\n        for i in 0..servers {\n            if cfg.rafts.lock().unwrap()[i]\n                .as_ref()\n                .unwrap()\n                .start(&Entry {\n                    x: random.gen::<u64>() % 10000,\n                })\n                .is_ok()\n                && cfg.connected[i]\n            {\n                leader = Some(i);\n            }\n        }\n\n        if (random.gen::<usize>() % 1000) < 100 {\n            let ms = random.gen::<u64>() % (RAFT_ELECTION_TIMEOUT.as_millis() as u64 / 2);\n            thread::sleep(Duration::from_millis(ms as u64));\n        } else {\n            let ms = random.gen::<u64>() % 13;\n            thread::sleep(Duration::from_millis(ms));\n        }\n\n        if let Some(leader) = leader {\n            if (random.gen::<usize>() % 1000) < (RAFT_ELECTION_TIMEOUT.as_millis() as usize) / 2 {\n                cfg.disconnect(leader);\n                nup -= 1;\n            }\n        }\n\n        if nup < 3 {\n            let s = random.gen::<usize>() % servers;\n            if !cfg.connected[s] {\n                cfg.connect(s);\n                nup += 1;\n            }\n        }\n    }\n\n    for i in 0..servers {\n        if !cfg.connected[i] {\n            cfg.connect(i);\n        }\n    }\n\n    cfg.one(\n        Entry {\n            x: random.gen::<u64>() % 10000,\n        },\n        servers,\n        true,\n    );\n\n    cfg.end();\n}\n\nfn internal_churn(unreliable: bool) {\n    let servers = 5;\n    let mut cfg = Config::new_with(servers, unreliable, false);\n    if unreliable {\n        cfg.begin(\"Test (2C): unreliable churn\")\n    } else {\n        cfg.begin(\"Test (2C): churn\")\n    }\n\n    let stop = Arc::new(AtomicUsize::new(0));\n\n    // create concurrent clients\n    // TODO: change it a future\n    fn cfn(\n        me: usize,\n        stop_clone: Arc<AtomicUsize>,\n        tx: Sender<Option<Vec<u64>>>,\n        rafts: Arc<Mutex<Box<[Option<Node>]>>>,\n        storage: Arc<Mutex<Storage>>,\n    ) {\n        let mut values = vec![];\n        while stop_clone.load(Ordering::SeqCst) == 0 {\n            let mut random = rand::thread_rng();\n            let x = random.gen::<u64>();\n            let mut index: i64 = -1;\n            let mut ok = false;\n            // try them all, maybe one of them is a leader\n            let rafts: Vec<_> = rafts.lock().unwrap().iter().cloned().collect();\n            for raft in &rafts {\n                match raft {\n                    Some(rf) => {\n                        match rf.start(&Entry { x }) {\n                            Ok((index1, _)) => {\n                                index = index1 as i64;\n                                ok = true;\n                            }\n                            Err(_) => continue,\n                        };\n                    }\n                    None => continue,\n                }\n            }\n            if ok {\n                // maybe leader will commit our value, maybe not.\n                // but don't wait forever.\n                for to in &[10, 20, 50, 100, 200] {\n                    let (nd, cmd) = storage.lock().unwrap().n_committed(index as u64);\n                    if nd > 0 {\n                        match cmd {\n                            Some(xx) => {\n                                if xx.x == x {\n                                    values.push(xx.x);\n                                }\n                            }\n                            None => panic!(\"wrong command type\"),\n                        }\n                        break;\n                    }\n                    thread::sleep(Duration::from_millis(*to));\n                }\n            } else {\n                thread::sleep(Duration::from_millis((79 + me * 17) as u64));\n            }\n        }\n        if !values.is_empty() {\n            tx.send(Some(values)).unwrap();\n        } else {\n            tx.send(None).unwrap();\n        }\n    }\n\n    let ncli = 3;\n    let mut nrec = vec![];\n    for i in 0..ncli {\n        let stop_clone = stop.clone();\n        let (tx, rx) = channel();\n        let storage = cfg.storage.clone();\n        let rafts = cfg.rafts.clone();\n        thread::spawn(move || {\n            cfn(i, stop_clone, tx, rafts, storage);\n        });\n        nrec.push(rx);\n    }\n    let mut random = rand::thread_rng();\n    for _iters in 0..20 {\n        if (random.gen::<usize>() % 1000) < 200 {\n            let i = random.gen::<usize>() % servers;\n            cfg.disconnect(i);\n        }\n\n        if (random.gen::<usize>() % 1000) < 500 {\n            let i = random.gen::<usize>() % servers;\n            if cfg.rafts.lock().unwrap().get(i).unwrap().is_none() {\n                cfg.start1(i);\n            }\n            cfg.connect(i);\n        }\n\n        if (random.gen::<usize>() % 1000) < 200 {\n            let i = random.gen::<usize>() % servers;\n            if cfg.rafts.lock().unwrap().get(i).unwrap().is_some() {\n                cfg.crash1(i);\n            }\n        }\n\n        // Make crash/restart infrequent enough that the peers can often\n        // keep up, but not so infrequent that everything has settled\n        // down from one change to the next. Pick a value smaller than\n        // the election timeout, but not hugely smaller.\n        thread::sleep((RAFT_ELECTION_TIMEOUT * 7) / 10)\n    }\n\n    thread::sleep(RAFT_ELECTION_TIMEOUT);\n    cfg.net.set_reliable(true);\n    for i in 0..servers {\n        if cfg.rafts.lock().unwrap().get(i).unwrap().is_none() {\n            cfg.start1(i);\n        }\n        cfg.connect(i);\n    }\n\n    stop.store(1, Ordering::SeqCst);\n\n    let mut values = vec![];\n    for rx in &nrec {\n        let mut vv = rx.recv().unwrap().unwrap();\n        values.append(&mut vv);\n    }\n\n    thread::sleep(RAFT_ELECTION_TIMEOUT);\n\n    let last_index = cfg.one(random_entry(&mut random), servers, true);\n\n    let mut really = vec![];\n    for index in 1..=last_index {\n        let v = cfg.wait(index, servers, None).unwrap();\n        really.push(v.x);\n    }\n\n    for v1 in &values {\n        let mut ok = false;\n        for v2 in &really {\n            if v1 == v2 {\n                ok = true;\n            }\n        }\n        assert!(ok, \"didn't find a value\");\n    }\n\n    cfg.end()\n}\n\n#[test]\nfn test_reliable_churn_2c() {\n    internal_churn(false);\n}\n\n#[test]\nfn test_unreliable_churn_2c() {\n    internal_churn(true);\n}\n\nfn snap_common(name: &str, disconnect: bool, reliable: bool, crash: bool) {\n    const MAX_LOG_SIZE: usize = 2000;\n\n    let iters = 30;\n    let servers = 3;\n    let mut cfg = Config::new_with(servers, !reliable, true);\n\n    cfg.begin(name);\n\n    let mut random = rand::thread_rng();\n    cfg.one(random_entry(&mut random), servers, true);\n    let mut leader1 = cfg.check_one_leader();\n\n    for i in 0..iters {\n        let mut victim = (leader1 + 1) % servers;\n        let mut sender = leader1;\n        if i % 3 == 1 {\n            sender = (leader1 + 1) % servers;\n            victim = leader1;\n        }\n\n        if disconnect {\n            cfg.disconnect(victim);\n            cfg.one(random_entry(&mut random), servers - 1, true);\n        }\n        if crash {\n            cfg.crash1(victim);\n            cfg.one(random_entry(&mut random), servers - 1, true);\n        }\n        // send enough to get a snapshot\n        for _ in 0..=SNAPSHOT_INTERVAL {\n            let _ = cfg.rafts.lock().unwrap()[sender]\n                .as_ref()\n                .unwrap()\n                .start(&random_entry(&mut random));\n        }\n        // let applier threads catch up with the Start()'s\n        cfg.one(random_entry(&mut random), servers - 1, true);\n\n        assert!(cfg.log_size() < MAX_LOG_SIZE, \"log size too large\");\n\n        if disconnect {\n            // reconnect a follower, who maybe behind and\n            // needs to receive a snapshot to catch up.\n            cfg.connect(victim);\n            cfg.one(random_entry(&mut random), servers, true);\n            leader1 = cfg.check_one_leader();\n        }\n        if crash {\n            cfg.start1_snapshot(victim);\n            cfg.connect(victim);\n            cfg.one(random_entry(&mut random), servers, true);\n            leader1 = cfg.check_one_leader();\n        }\n    }\n    cfg.end();\n}\n\n#[test]\nfn test_snapshot_basic_2d() {\n    snap_common(\"Test (2D): snapshots basic\", false, true, false);\n}\n\n#[test]\nfn test_snapshot_install_2d() {\n    snap_common(\n        \"Test (2D): install snapshots (disconnect)\",\n        true,\n        true,\n        false,\n    );\n}\n\n#[test]\nfn test_snapshot_install_unreliable_2d() {\n    snap_common(\n        \"Test (2D): install snapshots (disconnect+unreliable)\",\n        true,\n        false,\n        false,\n    );\n}\n\n#[test]\nfn test_snapshot_install_crash_2d() {\n    snap_common(\"Test (2D): install snapshots (crash)\", false, true, true);\n}\n\n#[test]\nfn test_snapshot_install_unreliable_crash_2d() {\n    snap_common(\n        \"Test (2D): install snapshots (unreliable+crash)\",\n        false,\n        false,\n        true,\n    );\n}\n"
  },
  {
    "path": "courses/rust/.gitignore",
    "content": "*~\ntarget/\n"
  },
  {
    "path": "courses/rust/CONTRIBUTING.md",
    "content": "# Contributing to PNA Rust\n\nContributions of any kind are welcome.\n\nFile bugs on the [issue tracker], no matter how small. If something in the\ncourse didn't make sense to you then it won't make sense to somebody else and\nneeds to be fixed. That includes the language: this course is intended to be\naccessible to those with modest English-language comprehension. Non-technical\nwords should be simple, and grammar should be easy to follow.\n\nGeneral feedback and suggestions can be submitted to the issue tracker or to the\n#rust-training channel on the [TiKV Slack].\n\nWhen you see something inconsistent or confusing, consider fixing it directly\nand sending a pull request.\n\nFor those looking for something to contribute, on the issue tracker, issues for\nthe Rust course are tagged `p: rust`. The `help wanted` and `good first issue`\ntags may help you find something interesting.\n\n[issue tracker]: https://github.com/pingcap/talent-plan/issues/\n[TiKV Slack]: https://join.slack.com/t/tikv-wg/shared_invite/enQtNTUyODE4ODU2MzI0LWVlMWMzMDkyNWE5ZjY1ODAzMWUwZGVhNGNhYTc3MzJhYWE0Y2FjYjliYzY1OWJlYTc4OWVjZWM1NDkwN2QxNDE\n\n## Developing a new project\n\nEach project expands the scope of the previous, and builds off of\nlearnings from previous projects. Each project lends itself to being extended by\nthe next section's project.\n\nWhen writing a project, look for steps where the design could be specified in\nmultiple ways, where there are multiple solutions, where there is deeper\nunderstanding to be gained, and ask questions formulated to get the reader to\nthink more deeply.\n\nProjects should be written to take between 2 - 4 hours to implement.\n\nWhen writing a project, look for optional \"extension\" steps that teach\nadditional practical subjects, but which either aren't necessary to complete the\nproject or require more time and skill to implement. Extension steps usually go\nat the end of a project.\n\nProject text doesn't link directly to documentation resources containing\nsolutions - students should learn where to get the answers from the\nprevious \"building blocks\" sections.\n\nProject text may include inline links to pages that offer explanatios of terms\nand concepts.\n\nSome subjects are revisited multiple times. In particular it is common for one\nproject to introduce a subject with basic tasks, then the subsequent project to\nexpand on that same subject with deeper tasks.\n\n\n## Style notes\n\nBuilding blocks pages generally begin with the same encouraging phrase, and\nproject pages generally end with the same encouraging phrase.\n\nHeaders do not capitalize every word; words after a colon\nare capitalized:\n\n```\n## Project spec\n\n## Lesson: Tools and good bones\n```\n\nIn projects, be clear on when the student should start hacking, and what they\nshould be hacking, by writing an imperative statement. Format that command in\nitalics:\n\n```\n_Try it now._\n```\n\nIf there are project extension sections, the first one is preceeded by a\nthematic break (`---`).\n\nFor markdown readability headers are always preceeded by two line breaks.\n\nOne-paragraph side-notes are in italics and preceeded with \"Note:\", like `_Note:\nwhatever._`\n\nLarger tangents that don't move the project forward are in their own sections,\nwith their own headers, named \"Aside: ...\". They should be related to the\nsubject matter and be interesting enough to justify the large detour.\n\nInternal hyperlinks are relative to the current directory, not absolute.\n\nFor building blocks exercises, if the description spans multiple paragraphs,\nbegin the description in a paragraph separate from the exercise name:\n\n```\n- **Exercise: Write a thread pool**.\n\n  A [thread pool] runs jobs (functions) on a set of reusable threads, which can\n  be more efficient than spawning a new thread for every job.\n\n  Create a simple thread pool with the following type signature:\n```\n\n\n## Maintenace notes\n\nKeep the project summary (the `**Task**`, `**Goals**`, etc. text) synced between\nplan.md and the project description.\n\nNew documentation files that are not part of a project or building-blocks, and\nnot part of standard top-level project files go in `docs/` to keep the GitHub\ndirectory listing clean, and keep the rendered README above \"the fold\".\n\nMiscellaneous files that are not part of the user-visible projcet live in\n`docs/etc`.\n"
  },
  {
    "path": "courses/rust/README.md",
    "content": "# Practical Networked Applications in Rust\n\nA training course about practical systems software construction in [Rust].\n\nOver a series of projects, you will build a single networked, multithreaded, and\nasynchronous Rust application. Creating this application, a [key-value\ndatabase][kv], will provide opportunities to exercise the best of the crate\necosystem, a variety of concurrent data types, the world of async Rust,\ninteresting language features, and important Rust tools. In between projects are\nsmall lessons and exercises on the subjects necessary to complete the next\nproject.\n\n<!-- TODO make the above sparkle -->\n<!-- NOTE: keep the above in sync with lesson-plan.md -->\n\nSubjects covered include:\n\n- Structuring and maintaining Rust programs\n- Applying common tools like [clippy] and [rustfmt]\n- Best practices in Rust error handling\n- Serialization with [serde]\n- Simple log-structured storage, inspired by [bitcask]\n- Network programming with std and [tokio]\n- Benchmarking with [criterion]\n- Fun and foolproof parallel programming with [crossbeam] and more\n- Asyncronous programming with Rust [futures]\n- How to learn what you don't know about Rust and find the documentation and\n  crates you need to succeed\n\nAfter completing this course you will have the knowledge and experience to begin\nwriting high performance, reliable, systems software in Rust. And you might\ndiscover that doing so is simpler than you expected.\n\n_**Important note: Practical Networked Applications in Rust is in an alpha\nstate**. It contains bugs and its scope is limited. If you are taking it now you\nare brave, but you are also an early tester and your feedback is greatly\nappreciated. As you are following along please [file issues]<!-- TODO and\ncomplete the [post-project surveys] -->. You are also encouraged to fix problems\non your own and submit pull requests. See [CONTRIBUTING.md] for details.<!-- See\n[the roadmap] for details about future course subject matter.-->_\n\n**[View the lesson plan][plan]**.\n\n\n## The goal of this course\n\nThe goal of this course is to teach new Rust programmers how to build real-world\n[systems programs][sp], with all the desirable Rust characteristics, including\nhigh-performance, reliability, and easy concurrency; and to do so using the best\npractices that might not be evident to newcomers.\n\nNon-goals of this course include teaching installation, syntax, and other Rust\nbasics; teaching basic data structures and algorithms; teaching basic parallel\nand asynchronous programming concepts; and being a comprehensive resource on the\nRust language. That information is easily found in [The Rust Book] and\nelsewhere.\n\n**[View the lesson plan][plan]**.\n\n\n## Who is this for?\n\nPractical Networked Applications in Rust is for novice _Rust_ programmers, but it\nis not for novice programmers.\n\nThe primary audience of this course is recent graduates and near-graduates of\nan undergraduate computer science program who are considering starting a career\nas a Rust systems programmer. Others will also likely benefit, including\nexperienced developers without systems programming experience.\n\n\n## Prerequisites\n\nThose taking this course should:\n\n- [ ] have the equivalent of an undergraduate computer science education,\n- [ ] have intermediate-level experience in some programming language,\n- [ ] be comfortable working in the terminal and command line,\n- [ ] know how to use [git],\n- [ ] have novice-level experience with [parallel programming] in some language,\n- [ ] have novice-level experience with [asynchronous programming] in some language,\n- [ ] have novice-level experience writing code to query a database, [SQL],\n  [NoSQL], [NewSQL], [key-value][kv], or otherwise.\n- [ ] **have read [The Rust Book] in its entirety**,\n- [ ] have written _some_ Rust code, including the projects from the book:\n  - [programming a guessing game],\n  - [building a command-line program] and\n  - [building a multithreaded web server].\n\nTo reiterate &mdash; read [The Rust Book] _before_ taking this course. It is not\nnecessary to have more than novice-level knowledge or experience with Rust, but\nthis course does not teach Rust basics.\n\nIf you can check all the above boxes then you are ready for this course. If not,\nwe have some [suggestions][pre] for how to learn the prerequisites.\n\nGet started now - **[view the lesson plan][plan]**.\n\n\n## Other courses in this series\n\nThis course is part of a [series of courses] initiated by [PingCAP] to train\nstudents, contributors, new hires, and existing employees in Rust for\ndistributed systems. Those who complete this one may wish to continue\nto [Distributed Systems in Rust].\n\n\n## A PingCAP-specific note\n\nThis course, combined with [Deep Dive TiKV], and the [Distributed Systems in\nRust] course is intended to be enough to enable programmers to meaningfully\ncontribute to [TiKV]. It is most specifically designed to teach those in the\nChinese Rust community enough Rust to work on TiKV. The language used is\nintended to be simple so that those who read only a little English can follow.\nIf you find any of the language difficult to understand please [file issues].\n\n\n## Contributing\n\nSee [CONTRIBUTING.md].\n\n\n## License\n\nAll text and code for this course is dual licensed [CC-BY 4.0] and [MIT]. You\nmay freely reuse any material here under the terms of either or both, at your\ndiscretion.\n\n\n<!-- links -->\n\n[CONTRIBUTING.md]: CONTRIBUTING.md\n[CC-BY 4.0]: https://opendefinition.org/licenses/cc-by/\n[MIT]: https://opensource.org/licenses/MIT\n[Deep Dive TiKV]: https://tikv.org/deep-dive/introduction/\n[Distributed Systems in Rust]: https://github.com/pingcap/talent-plan/tree/master/courses/dss\n[NewSQL]: https://en.wikipedia.org/wiki/NewSQL\n[NoSQL]: https://www.thoughtworks.com/insights/blog/nosql-databases-overview\n[PingCAP]: https://pingcap.com/\n[SQL]: https://en.wikipedia.org/wiki/SQL\n[The Rust Book]: https://doc.rust-lang.org/book/\n[The Rust Book]: https://doc.rust-lang.org/stable/book/\n[TiKV]: https://github.com/tikv/tikv/\n[asynchronous programming]: todo\n[bitcask]: https://github.com/basho/bitcask/blob/develop/doc/bitcask-intro.pdf\n[building a command-line program]: https://doc.rust-lang.org/stable/book/ch12-00-an-io-project.html\n[building a multithreaded web server]: https://doc.rust-lang.org/stable/book/ch20-00-final-project-a-web-server.html\n[clippy]: https://github.com/rust-lang/rust-clippy/\n[criterion]: https://github.com/bheisler/criterion.rs\n[crossbeam]: https://github.com/crossbeam-rs/crossbeam\n[file issues]: https://github.com/pingcap/talent-plan/issues/\n[futures]: https://docs.rs/futures/0.1.27/futures/\n[git]: https://git-scm.com/\n[kv]: https://en.wikipedia.org/wiki/Key-value_database\n[parallel programming]: todo\n[plan]: ./docs/lesson-plan.md\n[post-project surveys]: ./docs/lesson-plan.md#user-content-making-pna-rust-better\n[pre]: ./docs/prerequisites.md\n[programming a guessing game]: https://doc.rust-lang.org/stable/book/ch02-00-guessing-game-tutorial.html\n[rustfmt]: https://github.com/rust-lang/rustfmt/\n[serde]: https://github.com/serde-rs/serde\n[series of courses]: https://github.com/pingcap/talent-plan/\n[sp]: https://en.wikipedia.org/wiki/System_programming\n[the roadmap]: ./docs/roadmap.md\n[tokio]: https://github.com/tokio-rs/tokio\n[Rust]: https://www.rust-lang.org/\n"
  },
  {
    "path": "courses/rust/building-blocks/bb-1.md",
    "content": "# PNA Rust &mdash; Building Blocks 1\n\nLet's learn some building blocks!\n\nPut your other projects and concerns aside. Take a breath and relax. Here\nare some fun resources for you to explore.\n\nRead all the readings and perform all the exercises.\n\n- **[Exercise: Write a Good CLI Program]**. Writing a CLI program in Rust. This\n  is a good warmup to the CLI program you'll be writing in this course, and the\n  techniques used by this author may provide an interesting contrast to those we\n  suggest. Follow along and write the same code. Can you reproduce their\n  results?\n\n- **[Reading: The Cargo manifest format]**. A single page in [The Cargo Book],\n  this will give you an idea of how your project can be customized a bit if you\n  so choose. This is a page you will come back to repeatedly as a Rust\n  programmer.\n\n- **[Reading: Cargo environment variables]**. Also from The Cargo Book, and also\n  a page that you will see many times in the future. Environment variables are\n  one way that it communicates with rustc, allowing it to set the various\n  [`env!`] macros at build time, in both your program source code and build\n  scripts. It is also a way for scripts and other systems to communicate to\n  Cargo.\n\n- **[Reading: Rust API Guidelines: Documentation]**. The Rust project is\n  opinionated about how Rust source is written. This page is on how to document\n  Rust projects, but the whole book is worth reading. These are written by\n  experienced Rust developers, but are in an incomplete state. Note the GitHub\n  organization it belongs to &mdash; [`rust-lang-nursery`]. It contains many\n  interesting projects.\n\n\n[Reading: Rust API Guidelines: Documentation]: https://rust-lang-nursery.github.io/api-guidelines/documentation.html\n[Reading: The Cargo manifest format]: https://doc.rust-lang.org/cargo/reference/manifest.html\n[Reading: Cargo environment variables]: https://doc.rust-lang.org/cargo/reference/environment-variables.html\n[The Cargo Book]: https://doc.rust-lang.org/cargo/reference/manifest.html\n[`env!`]: https://doc.rust-lang.org/std/macro.env.html\n[`rust-lang-nursery`]: https://github.com/rust-lang-nursery\n[Reading: The rustup documentation]: https://github.com/rust-lang/rustup.rs/blob/master/README.md\n[Exercise: Write a Good CLI Program]: https://qiita.com/tigercosmos/items/678f39b1209e60843cc3\n\n"
  },
  {
    "path": "courses/rust/building-blocks/bb-2.md",
    "content": "# PNA Rust &mdash; Building Blocks 2\n\nLet's learn some building blocks!\n\nPut your other projects and concerns aside. Take a breath and relax. Here\nare some fun resources for you to explore.\n\nRead all the readings and perform all the exercises.\n\n- **[Reading: Damn Cool Algorithms: Log structured storage][lss]**. A simple\n  overview of the basic concept of log-structured storage. There are many\n  log-structured storage algorithms, and the particular one described here is\n  not the one you will be using.\n\n- **[Reading: The Design and Implementation of a Log-Structured File\n  System][lsfs]**. The influential paper.\n\n- **[Reading: Bitcask: A Log-Structured Hash Table for Fast Key/Value Data][bc]**.\n  A simple but effective design for a key-value database, and one that uses\n  log-structured storage.\n\n- **[Reading: Error Handling in Rust][e]**. Rust error handling is powerful, and\n  many Rust programmers adore it once they have gotten the hang of it. But it is\n  complex, and has a complex history of trial and error. This is a classic\n  in-depth article on best-practices for error handling in Rust. It is from\n  2015, and there have been some minor changes to error handling since then, but\n  there is a lot of wisdom in here. The author, [BurntSushi], has done much\n  experimenting with Rust error handling, and is considered an authority on that\n  and [other things].\n\n- **[Reading: `std::collections`][c]**. As a systems programmer it is crucial to\n  know the behavior of a variety of data structures well, if not their\n  implementations. The standard library's `collections` module has a pretty\n  amazing overview of the tradeoffs between a number of the most common\n  collection types in computer science. For this, you only need to read the\n  module docs.\n\n- **[Reading: `std::io`][io]**. Again, you need to know your I/O tools, and\n  again the Rust `io` module docs, while not as brilliant reading as the\n  `collections` docs, provide a good overview of your toolset. You only need to\n  read the module docs.\n\n- **Exercise: Serialize and deserialize a data structure with `serde` (JSON)**.\n\n  This exercise and the next two will introduce basic serialization and\n  deserialization with [`serde`]. `serde` serializes data quickly and is easy to\n  use, while also being extensible and expressive.\n\n  For your serializable data structure, imagine a flat game-playing surface\n  covered in a grid of squares, like a chess board. Imagine you have a game\n  character that every turn may move any number of squares in a single\n  direction. Define a type, `Move` that represents a single move of that\n  character.\n\n  Derive the [`Debug`] trait so `Move` is easily printable with the `{:?}`\n  format specifier.\n\n  Write a `main` function that defines a variable, `a`, of type `Move`,\n  serializes it with [`serde`] to a [`File`], then deserializes it back again to a\n  variable, `b`, also of type `Move`.\n\n  Use [JSON] as the serialization format.\n\n  Print `a` and `b` with `println!` and the `{:?}` format specifier to verify\n  successful deserialization.\n\n  Note that the `serde` book has many [examples] to work off of.\n\n- **Exercise: Serialize and deserialize a data structure to a buffer with\n    `serde` (RON)**.\n\n  Do the same as above, except this time, instead of serializing to a `File`,\n  serialize to a `Vec<u8>` buffer, and after that try using [RON] instead of\n  JSON as the format. Are there any differences in serialization to a `Vec`\n  instead of a `File`? What about in using the RON crate vs the JSON crate?\n\n  Convert the `Vec<u8>` to `String` with [`str::from_utf8`], unwrapping the\n  result, then print that serialized string representation to see what `Move`\n  looks like serialized to RON.\n\n- **Exercise: Serialize and deserialize 1000 data structures with `serde` (BSON)**.\n\n  This one is slightly different. Where the previous exercises serialized and\n  deserialized a single value to a buffer, in this one serialize 1000 different\n  `Move` values to a single file, back-to-back, then deserialize them again.\n  This time use the [BSON] format.\n\n  Things to discover here are whether serde automatically maintains the correct\n  file offsets (the \"cursor\") to deserialize multiple values in sequence, or if\n  you need to parse your own \"frames\" around each value to define their size,\n  and how to detect that there are no more values to parse at the end of the\n  file.\n\n  After you've succeeded at serializing and deserializing multiple values to a\n  file, try it again with a `Vec<u8>`. Serializing and deserializing generally\n  requires the destination implement the [`Write`] and [`Read`] traits. Does\n  `Vec<u8>` implement either or both? What is the behavior of those\n  implementations? You may need to wrap your buffer in wrapper types that\n  implement these traits in order to get the correct behavior &mdash; the\n  API docs for the traits list all their implementors in the standard library,\n  and whatever you need will be in there somewhere.\n\n\n[`File`]: https://doc.rust-lang.org/std/fs/struct.File.html\n[`Write`]: https://doc.rust-lang.org/std/io/trait.Write.html\n[`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html\n[BSON]: https://github.com/zonyitoo/bson-rs\n[RON]: https://github.com/ron-rs/ron\n[`str::from_utf8`]: https://doc.rust-lang.org/std/str/fn.from_utf8.html\n[JSON]: https://github.com/serde-rs/json\n[`Debug`]: https://doc.rust-lang.org/std/fmt/trait.Debug.html\n[examples]: https://serde.rs/examples.html\n[`serde`]: https://serde.rs/\n[lss]: http://blog.notdot.net/2009/12/Damn-Cool-Algorithms-Log-structured-storage\n[lsfs]: https://people.eecs.berkeley.edu/~brewer/cs262/LFS.pdf\n[io]: https://doc.rust-lang.org/std/io/\n[c]: https://doc.rust-lang.org/std/collections/\n[e]: https://blog.burntsushi.net/rust-error-handling/\n[bc]: https://github.com/basho/bitcask/blob/develop/doc/bitcask-intro.pdf\n[BurntSushi]: https://github.com/BurntSushi\n[other things]: https://github.com/BurntSushi/ripgrep\n\n<!-- TODO: better LSS paper -->\n<!-- TODO: want a general non-wikipedia survey of how databases and/or key/value dbs work -->\n"
  },
  {
    "path": "courses/rust/building-blocks/bb-3.md",
    "content": "# PNA Rust &mdash; Building Blocks 3\n\nLet's learn some building blocks!\n\nPut your other projects and concerns aside. Take a breath and relax. Here\nare some fun resources for you to explore.\n\nRead all the readings and perform all the exercises.\n\n- **[Reading: `log` crate API][l]**. The original Rust logging crate. Just read\n  the crate-level documentation (the front page). You may need to click little `[+]`\n  or `[-]` buttons to make the crate docs visible. This will give you an idea\n  about how logging works in Rust.\n\n- **[Reading: `slog` crate API][sl]**. Another popular logging crate, designed\n  for \"structured logging\". Again, just read the crate-level docs, to compare to\n  `log`. You might also want to look at [\"Introduction to structured logging\n  with slog\"][sli].\n\n- **[Reading: Benefits of Structured Logging vs basic logging][lvsl]**. A\n  StackOverflow discussion about the differences between traditional,\n  text-oriented, line logging and structured logging.\n\n- **[Reading: Redis Protocol specification][rp]**. The protocol spec for\n  [Redis], an in-memory key-value store. Think about what their design\n  priorities were. When reading this it also helps to have the Redis [commands]\n  on hand.\n\n- **Exercise: Write a Redis ping-pong client and server using `std::io`**. Write\n  a simple client and server that speaks the Redis protocol, with the client\n  issuing [PING] commands and the server responding appropriately. Use the\n  [`std::io`] APIs to read and write bytes directly. Does your client work with\n  an actual Redis server?\n\n- **Exercise: Write a Redis ping-pong client and server with serialized\n  messages**. Same as above, but this time define the protocol with types and\n  write a [`serde` data format][df] to indirectly read and write messages\n  through serialization.\n\n- **[Reading: Statistically Rigorous Java Performance Evaluation][pe]**.\n  Although it is specifically about Java, and discusses topics relevant to\n  garbage-collected languages, it is a good example of the kind of thinking\n  necessary to create effective benchmarks.\n\n<!-- TODO: better benchmarking reading -->\n<!-- TODO: something about traits? -->\n\n[pe]: https://dri.es/files/oopsla07-georges.pdf\n[df]: https://serde.rs/data-format.html\n[`std::io`]: https://doc.rust-lang.org/std/io/\n[PING]: https://redis.io/commands/ping\n[commands]: https://redis.io/commands\n[Redis]: https://redis.io/\n[rp]: https://redis.io/topics/protocol\n[l]: https://docs.rs/log/\n[sl]: https://docs.rs/slog/\n[sli]: https://github.com/slog-rs/slog/wiki/Introduction-to-structured-logging-with-slog\n[lvsl]: https://softwareengineering.stackexchange.com/questions/312197/benefits-of-structured-logging-vs-basic-logging\n"
  },
  {
    "path": "courses/rust/building-blocks/bb-4.md",
    "content": "# PNA Rust &mdash; Building Blocks 4\n\nLet's learn some building blocks!\n\nPut your other projects and concerns aside. Take a breath and relax. Here\nare some fun resources for you to explore.\n\nRead all the readings and perform all the exercises. Also watch the video.\n\n- **[Reading: Fearless Concurrency with Rust][f]**. This is a classic Rust blog\n  post from [Aaron Turon][at] that clearly explains why concurrency is so easy\n  in Rust. The title is also the origin of using the word \"fearless\" to describe\n  various Rust properties.\n  \n- **[Reading: What is the difference between concurrency and parallelism?][d]**.\n  This is a 10 second read, but something to keep in mind. The two words are\n  often used interchangably. We'll mostly use the word \"concurrent\" since it is\n  more general than \"parallel\". Sometimes we'll use the word \"parallel\" to be\n  more specific, sometimes because it sounds better…\n\n- **[Reading: Rust: A unique perspective][ru]**. An explanation of the dangers\n  of mutable aliasing and how Rust solves the problem. This one is by [Matt\n  Brubeck][mb], from the [Servo] team.\n\n- **[Video: Rust Concurrency Explained][ex]**. A more in-depth talk by [Alex\n  Crichton][ac]. Aaron and Alex wrote many of the concurrent data structures in\n  the standard library. Alex has given versions of this talk for years, and it\n  is a pretty great overview of what Rust can do.\n\n- **[Reading: `std::sync`][ss]**. Once again, the standard library documentation\n  provides not only good documentation about the library, but about the subject\n  in general. This provides an overview of most of the concurrent types provided\n  by the standard library.\n\n- **[Exercise: Basic multithreading][bmt]**. This is a simple multithreading\n  exercise from the [rustlings] project. It is small enough that it can be\n  completed on [play.rust-lang.org].\n\n- **Exercise: Write a thread pool**.\n\n  A [thread pool] runs jobs (functions) on a set of reusable threads, which can\n  be more efficient than spawning a new thread for every job.\n\n  Create a simple thread pool with the following type signature:\n\n  ```rust\n  impl ThreadPool {\n    fn new(threads: u32) -> Result<Self>;\n\n    fn spawn<F>(&self, job: F) where F: FnOnce() + Send + 'static;\n  }\n  ```\n\n  The `new` function should immediately spawn `threads` number of threads, and\n  then those threads will wait for jobs to be spawned. When a thread recieves a\n  job, it runs it to completion, then waits for the next job.\n\n  The [`threadpool`][tp1] crate and Rayon's [`ThreadPool`][tp2] may provide inspiration.\n\n- **[Reading: Lock-free vs wait-free concurrency][lf]**. It seems like everybody\n  wants their code to be \"lock-free\". What's that mean?\n\n<!--\n\nTODO\n\noverview of concurrent data structures\ncode reordering\n\nhttps://en.wikipedia.org/wiki/Concurrent_data_structure\nhttps://preshing.com/20120625/memory-ordering-at-compile-time/\nhttps://www.cl.cam.ac.uk/~jp622/the_problem_of_programming_language_concurrency_semantics.pdf\nconcurrent maps https://gitlab.nebulanet.cc/xacrimon/rs-hm-bench\n\n-->\n\n[lf]: https://rethinkdb.com/blog/lock-free-vs-wait-free-concurrency/\n[play.rust-lang.org]: https://play.rust-lang.org/\n[tp1]: https://docs.rs/threadpool/1.7.1/threadpool/struct.ThreadPool.html\n[tp2]: https://docs.rs/rayon/1.0.3/rayon/struct.ThreadPool.html\n[thread pool]: https://softwareengineering.stackexchange.com/questions/173575/what-is-a-thread-pool#173581\n[ss]: https://doc.rust-lang.org/std/sync/index.html\n[Servo]: https://github.com/servo/servo\n[mb]: https://github.com/mbrubeck/\n[ru]: https://limpet.net/mbrubeck/2019/02/07/rust-a-unique-perspective.html\n[ac]: https://github.com/alexcrichton/\n[ex]: https://www.youtube.com/watch?v=Dbytx0ivH7Q\n[f]: https://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html\n[d]: https://stackoverflow.com/questions/1050222/what-is-the-difference-between-concurrency-and-parallelism#1050257\n[at]: https://github.com/aturon\n[bmt]: https://github.com/rust-lang/rustlings/blob/master/exercises/threads/threads1.rs\n[rustlings]: https://github.com/rust-lang/rustlings/\n"
  },
  {
    "path": "courses/rust/building-blocks/bb-5.md",
    "content": "# PNA Rust &mdash; Building Blocks 5\n\nLet's learn some building blocks!\n\nPut your other projects and concerns aside. Take a breath and relax. Here\nare some fun resources for you to explore.\n\nRead all the readings and perform all the exercises.\n\nComing soon! <!-- TODO -->\n"
  },
  {
    "path": "courses/rust/docs/etc/notes.md",
    "content": "# Implementors' notes\n\n## Desired subjects\n\nThis is a more full list of topics to cover than\nin the README.\n\n- error handling\n  - simple vs. complex, Fail vs StdError, etc\n  - `fn main() -> Result`\n  - `panic!` and unwinding\n- logging w/ log and slog\n  - how env_logger works?\n- trees vs maps\n- async vs sync networking\n  - `std` networking\n  - TCP vs UDP\n  - `reqwest`\n  - blocking HTTP serving w/ Iron\n- sync file io and solutions to blocking\n- buffered vs unbuffered i/o\n- benchmarking, criterion and critcmp, black_box\n- RUST_BACKTRACE\n- where to ask questions\n- futures\n- tokio\n- mio?\n- async/await? - maybe future iterations\n- Pin?\n- generic placeholder idiom - let foo: Vec<_> =\n- construction w/ iterators idiom\n- semver trick\n- impl trait, the Into<Option<_>> trick\n- Rust history, culture, design principles\n- rustfmt, clippy, configuring both\n- rust 2018?\n  - we'll just asume rust 2018 and not mention 2015 unless necessary\n- tools most rust programmers should know\n- build scripts\n  - protobuf compilation example\n  - getting rustc version\n  - in-depth examples of crates that rely on build scripts\n- using RUSTFLAGS\n- debugging\n- profiling\n- how not to write Rust (bad practices from other languages)\n  - Ana likes this\n- variable shadowing\n- DSTs\n- configuring clippy / rustfmt\n- scripting clippy / rustfmt for CI\n- CI setup\n- when to use which struct types, impls, ctor patterns, dtors, reprs,\n  padding demo, packed structs, size and alignment in depth, enum\n  implementation and optimizations\n- importing crates, features, debugging and fixing dependencies,\n  std vs crate philosophy and history, finding crates\n- how does testing work?\n- what does `cargo run` do?\n- cargo / rustc wrapping pattern in depth (ex rustup, `RUSTC_WRAPPER`)\n- formatting tips, derive Debug in depth, how does `format!` work?\n- mutable aliasing bugs, how ownership prevents mutable aliasing\n- Sync / Send, uniq / shared vs immutable / mutable\n- `Rc` and `Arc`, interior mutability in depth\n- when to use pass-by-value, the performance impact of moves\n- reference-bearing structs\n- sharing vs message passing\n- thread pools\n- workspaces\n- refactoring\n- https://github.com/altsysrq/proptest\n- fuzzing\n- dbg!\n- shadowing\n\n## Sources\n\n- https://pdos.csail.mit.edu/6.824/schedule.html\n  - The MIT distributed systems course this course\n    is inspired by and intended to precede\n- https://github.com/ferrous-systems/rust-three-days-course\n- https://github.com/nrc/talks\n- RustBridge\n\n## Pedagogy\n\n- https://launchschool.com/pedagogy\n- https://launchschool.com/is_this_for_me\n\n## Reading sources\n\n- previous reading ideas https://github.com/pingcap/talent-plan/blob/32311e6999a2a5b7db25cd2b4dd96491d5181165/rust/plan.md\n- http://highscalability.com/blog/2011/1/10/riaks-bitcask-a-log-structured-hash-table-for-fast-keyvalue.html\n- https://github.com/brson/rust-anthology/blob/master/master-list.md\n- https://github.com/ctjhoa/rust-learning\n- https://github.com/basho/bitcask/blob/develop/doc/bitcask-intro.pdf\n- https://rust-lang-nursery.github.io/failure/\n- https://serde.rs/\n- https://doc.rust-lang.org/cargo/\n- https://medium.com/rabiprasadpadhy/google-spanner-a-newsql-journey-or-beginning-of-the-end-of-the-nosql-era-3785be8e5c38\n- https://github.com/Hexilee/async-io-demo\n- https://stjepang.github.io/2019/01/29/lock-free-rust-crossbeam-in-2019.html\n- https://limpet.net/mbrubeck/2019/02/07/rust-a-unique-perspective.html\n- https://doc.rust-lang.org/nomicon/aliasing.html\n- https://manishearth.github.io/blog/2015/05/17/the-problem-with-shared-mutability/\n- https://www.youtube.com/watch?v=9_3krAQtD2k (futures async await)\n- https://shipilev.net/blog/2014/java-scala-divided-we-fail/\n- https://www.internalpointers.com/post/lock-free-multithreading-atomic-operations\n\n## Exercise sources\n\n- https://github.com/rust-lang/rustlings\n- https://exercism.io/tracks/rust\n- https://doc.rust-lang.org/rust-by-example/index.html\n\n## Subjects to potentially cut\n\n- Parallelism section\n- Formatting lesson\n- Build time lesson\n- Collections and iterators\n\n## Grading\n\n- automated text-based cheat detection\n- automated grading of test cases\n- automated grading of non-unit-test requirements via python script\n- how to grade freeform answers?\n\n## TODO\n\n- do survey of other sources' subject progression\n- lessons and labs pose questions\n- have a chinese native identify and remove 'hard' words and phrases\n- mention somewhere that we're using rust 2018 only, how to verify\n- change slides.html URLS to link to the hosted file\n- add more description of how to treat the projects\n  - note that improvements beyond the scope of the project are encouraged - comment them\n- add TOC to each project\n- use fail-rs for consistency tests\n- mention the test names that should be focused on each part of each project\n- find a way to use specialization via the KvsEngine trait\n- use imperative \"part\" titles? \"creating\" vs \"create\"\n- add explanation of \"blocking\" to parallelism / thread pool project\n- per readme, make parallelism project \"fun and foolproof\"\n- per readme, incorporate critcmp\n- deleted from readme:\n  - Build scripts and the interaction between build-time and run-time\n  - Insights into inner workings of the language and libraries\n  - to look \"under the hood\" and understand how and why Rust works like it does\n  - the course can be delivered offline\n  - _lessons_ - focused coverage of subjects required for writing practical\n    software of the type developed in the corresponding projects, including\n    advanced tips, best practices, and deep dives. This are in the form of slides,\n    speaker notes, and short _writeups_.\n  - removed goal of teaching how to find information on your own about rust\n    - it's now an implicit goal\n- be clearer about crate deps\n- consistent formatting for crate names (code or not?) (yes, to offset them as crates when not explicitly mentioned)\n- do better at identifing and explaining the individual problems being solved\n- add tips for finding documentation and crates\n- mention mdbook when first linking to a book\n- rustup doc and cargo doc and where both draw their content from\n- make project contents more consistent\n  - projects contain sections that are unrelated to the main subject\n- change project.md to description.md, to get rid of the path stuttering\n- replace wikipedia, docs.rs, official rust, readings with blog posts, papers\n  and other more specific, harder to find resources\n- create place to submit solutions\n- compare criterion to bench\n- move all links to ends of documents and explain in contributing.md\n- sort lines of links\n- how to find the names and descriptions of all lints\n- consider adding links to project source code somewhere\n- add note encouraging reading the rustfmt / rustclippy docs\n- replace \"_Note: ...\" with \"_**Note**: ...\"\n- describe in more depth the final product\n- put a reminder about building blocks at top of every project\n- add back-links in some non-intrusive way, somehow\n- to p1 just add a list of useful Rust cli tools!\n- sort deps in manifests\n- after p1 link first uses of crate names to docs.rs\n- say why we're doing each exercise or diversion\n- publishing on crates.io\n- critcmp\n\n# Future projects\n\n- 5 - use futures + http, use standard http bench tools\n- 6 - use async/await\n- 7 - use grpc\n- 8 - focus on data integrity\n- 9 - try to match performance of the production components\n- ? - streaming scan operation with lifetimes and streaming network api\n\n# survey\n\n- time to complete\n"
  },
  {
    "path": "courses/rust/docs/etc/parallel-diagrams.txt",
    "content": "Used in p4. Edited with asciiflow.com.\n\n\n           --> read/write reqs over time -->                         --> read/write reqs over time -->\n thread                                                    thread\n        +  +--------+--------+--------+--------+                  +  +--------+\n   T1   |  |   R1   |   R2   |   W1   |   W2   |             T1   |  |   R1   |\n        +  +--------+--------+--------+--------+                  |  +-----------------+\n                                                             T2   |           |   R2   |\n          --> read/write reqs over time -->                       |           +-----------------+\nthread                                                       T3   |                    |   W1   |\n       +  +--------+                                              |                    +-----------------+\n  T1   |  |   R1   |                                         T4   |                             |   W2   |\n       |  +--------+                                              +                             +--------+\n  T2   |  |   R2   |\n       |  +-----------------+\n  T3   |           |   W1   |                                      --> read/write reqs over time -->\n       |           +-----------------+                   thread\n  T4   |                    |   W2   |                          +  +--------+\n       +                    +--------+                     T1   |  |   R1   |\n                                                                |  +--------+\n            --> read/write reqs over time -->              T2   |  |   R2   |\n  thread                                                        |  +--------+\n         +  +--------+                                     T3   |  |   W1   |\n    T1   |  |   R1   |                                          |  +-----------------+\n         |  +--------+                                     T4   |           |   W2   |\n    T2   |  |   R2   |                                          +           +--------+\n         |  +--------+\n    T3   |  |   W1   |\n         |  +--------+\n    T4   |  |   W2   |\n         +  +--------+\n"
  },
  {
    "path": "courses/rust/docs/lesson-plan.md",
    "content": "# PNA Rust Lesson plan\n\nA training course about practical systems software construction in Rust.\n\nOver a series of projects, you will build a networked [key-value database][kv],\nwith multithreading and asynchronous I/O. In between projects you will study and\npractice individual subjects necessary to complete the next project. Along the\nway you will explore multiple designs and their tradeoffs.\n\n<!-- NOTE: keep the above in sync with README.md -->\n\nSee [README.md] for the overview, goals, audience, and prerequisites.\n\n- [Prerequisites](#user-content-prerequisites)\n- [Getting the materials](#user-content-getting-the-materials)\n- [Course structure](#user-content-course-structure)\n- [Getting help](#user-content-getting-help)\n- [Making PNA Rust Better](#user-content-making-pna-rust-better)\n- [Practical Networked Applications in Rust](#user-content-practical-networked-applications-in-rust)\n  - [Building Blocks 1](#user-content-building-blocks-1)\n  - [Project 1: The Rust toolbox](#user-content-project-1-the-rust-toolbox)\n  - [Building Blocks 2](#user-content-building-blocks-2)\n  - [Project 2: Log-structured file I/O](#user-content-project-2-log-structured-file-io)\n  - [Building Blocks 3](#user-content-building-blocks-3)\n  - [Project 3: Synchronous client-server networking](#user-content-project-3-synchronous-client-server-networking)\n  - [Building Blocks 4](#user-content-building-blocks-4)\n  - [Project 4: Concurrency and Parallelism](#user-content-project-4-concurrency-and-parallelism)\n  - [Building Blocks 5](#user-content-building-blocks-5)\n  - [Project 5: Asynchronous programming in Rust](#user-content-project-5-asynchronous-programming-in-rust)\n- [What next?](#user-content-what-next)\n\n\n## Prerequisites\n\nAs [described in the README.md][pre], this is not a course for novice\nprogrammers, and there are significant prerequisites. Ensure that you meet them\nall before proceeding.\n\n\n## Getting the materials\n\nAll material for this course is in the\n\n> https://github.com/pingcap/talent-plan\n\ngit repository on GitHub, in the [`rust` subdirectory][rs]. You will want a copy\nof it on your local computer, particularly for easy access to the conformance\ntests for each project.\n\n\n## Course structure\n\nThe overall arc of the course is defined by a series of coding projects that\nincrementally introduce new subjects important to systems programming in Rust.\nEach project extends the previous project, so it is reasonable to simply start\nyour work on each project in the same git repository where you left off on the\nprevious (though you may want to add a [git tag] indicating where the previous\nproject ended).\n\n[git tag]: https://git-scm.com/book/en/v2/Git-Basics-Tagging\n\nBecause building an entire database from scratch while also learning all the\nconcepts involved is a daunting task, each project is preceded by a \"building\nblocks\" section, where individual concepts are explored individually. These\nbuilding blocks will consist of external readings, external programming\nproblems, and other single-subject content.\n\nThe building blocks sections are an opportunity to clear your mind, step away\nfrom the larger project, and focus your attention on learning and practicing a\nsingle subject in isolation. **Do not pass them up**.\n\nEach project builds on the last &mdash; the APIs, command-line interfaces, and\nparts of the implementation will often remain the same between projects, while\nyou only integrate new features and improvements related to a project's subject\nmatter. As such, it is ok to begin each project by copying your source code from\nthe last.\n\nThe projects live in the [`projects` subdirectory][psd], each in their own\ndirectories, and consist of a project description in `README.md`, and a Cargo\nproject containing a complete example solution, and the project test suite. Each\nproject comes with a test suite, and the project should not be considered\nfinished until it passes with `cargo test`.\n\n**You should not read the example code for any project until completing the\nproject yourself** &mdash; good learning requires trying on your own and failing, over\nand over until you succeed. You are encouraged though to learn from and apply\ntechniques they contain to your own projects retroactively. Keep in mind though\nthat the example projects are not the only way &mdash; or even the best way\n&mdash; to solve the problems. Trust yourself and your own creativity.\n\n<!-- TODO this is pretty harsh\n\n> RE plagiarism (this is mostly relevant to students being evaluated on their\ncoursework): The line between applying techniques learned by code-reading and\ncopying code outright can be hard to identify. But as a professional you have\nethical responsibilites, and only you can know if you are upholding them. For\nthose not being evaluated for their coursework, simply copying from the example\nisn't ; for those who are being evaluated, your instructors and evaluators are\nexpecting you to use your own skills.\n\n-->\n\nYou will receive further instruction about setting up the source code and test\nsuite, as well as project specifications, as you progress through the individual\nprojects.\n\nThe expected time to complete each section is not currently well-estimated, but\nboth \"building blocks\" and \"project\" will probably take hours, not days, with\nthe projects taking more time. If you are spending much less time than that, or\nare spending more time, don't worry: these are just bad estimates, and\neverybody's experience is different.\n\n\n## Getting help\n\nYou will run into problems that you don't know how to solve. Don't suffer in\nsilence. Everybody needs help sometimes.\n\nAnd fortunately the Rust community is amazing and welcoming, and wants to help\nyou. As you are progressing through this course, you are _strongly_ encouraged\nto join the Rust community experience.\n\nHere are the resources you should consider turning to first:\n\n- The #rust-training channel on the [TiKV Slack]. This channel exists just for\n  this course. Please consider joining to support your fellow students and other\n  course-takers. There will always be someone there to answer questions, but\n  there may be a delay due to time zones and other factors. Both English and\n  Chinese languages are welcome here.\n\n- The `#beginners` channel on the official [Rust Discord]. You are almost\n  guaranteed to get some answer here, and if not, don't hesitate to ask again.\n  The people who hang out here are there specifically to help. Because of time\n  zone differences it may take time for somebody to respond. Only English will\n  be consistently understood here.\n\n- The QQ Rust group #1 ([QR code][qq]). For Chinese students, this is one of the\n  major Rust communities in China. This is a great place to hang out generally,\n  and for those unconfident in their English skills, a great place to ask\n  for help. There are also WeChat groups, but with their low population caps\n  and invite requirements, they are more difficult to deal with here.\n\n- The QQ Rust group #2 ([QR code][qq2]). Like the above. If group 1 is\n  at capacity you can get into this one.\n\nThese resources may also be helpful:\n\n- The official [users forum]. Apply the \"help\" tag to your post. Questions\n  usually receive an answer here, but the responses can be limited.\n\n- [StackOverflow]. Apply the \"rust\" tag. You may or may not receive a satisfying\n  answer.\n\nYou are also welcome to email the primary author of this course, [Brian\nAnderson][brson], at brian@pingcap.com. I will happily answer questions, and am\neager to hear your experience with the course.\n\nFinally, if there is a [Rust meetup] near you, go check it out. As a Rust programmer\nthese groups are where you will build some of your strongest connections. (Note\nthat that link goes to the old Rust website and may not be up to date).\n\n\n## Making PNA Rust better\n\n<!-- TODO At the end of each project is a link to a survey about your experience. Please\ntake a few minutes to complete it, and be comfortable expressing the challenges\nyou faced, and your criticisms of the course. The survey results are not seen by\nanybody but the [primary author of the course][author], though aggregate\nstatistics may be reported publicly. -->\n\nAs you work through the course content, please be on the lookout for things you\nwould improve about the course, and either [submit issues][si] explaining, or\n[submit pull requests][spr] with improvements. (If you are being graded,\naccepted pull requests to this or any other repo used in the course _may_ count\ntoward extra credit during final evaluation &mdash; let your instructor or\nevaluator know!). This is an opportunity to gain experience contributing to an\nopen-source Rust project. Make this a better course for the next person to take\nit than it was for you.\n\nSee [CONTRIBUTING.md] for more.\n\n\n## Practical Networked Applications in Rust\n\nThis is an outline of the course. Clicking each header will take you to the\ninstructions for that section.\n\n### [Building Blocks 1][b1]\n\n**Topics**: CLI programming, the cargo manifest and environment variables,\ndocumenting Rust projects.\n\n\n### [Project 1: The Rust toolbox][p1]\n\n**Task**: Create an in-memory key/value store that passes simple tests and responds\nto command-line arguments.\n\n**Goals**:\n\n- Install the Rust compiler and tools\n- Learn the project structure used throughout this course\n- Use `cargo init` / `run` / `test` / `clippy` / `fmt`\n- Learn how to find and import crates from crates.io\n- Define an appropriate data type for a key-value store\n\n**Topics**: testing, the `clap` crate, `CARGO_VERSION` etc., the `clippy` and\n  `rustfmt` tools.\n\n**Extensions**: the `structopt` crate.\n\n\n### [Building Blocks 2][b2]\n\n**Topics**: log-structured file I/O, the bitcask algorithm, Rust error handling,\ncomparing collection types.\n\n\n### [Project 2: Log-structured file I/O][p2]\n\n**Task**: Create a persistent key/value store that can be accessed from the\ncommand line.\n\n**Goals**:\n\n- Handle and report errors robustly\n- Use serde for serialization\n- Write data to disk as a log using standard file APIs\n- Read the state of the key/value store from disk\n- Map in-memory key-indexes to on-disk values\n- Periodically compact the log to remove stale data\n\n**Topics**: log-structured file I/O, bitcask, the `failure` crate, `Read` /\n`Write` traits, the `serde` crate.\n\n\n### [Building Blocks 3][b3]\n\n**Topics**: unstructured vs. structured logging, the Redis protocol,\n  benchmarking.\n\n\n### [Project 3: Synchronous client-server networking][p3]\n\n**Task**: Create a single-threaded, persistent key/value store server and client\nwith synchronous networking over a custom protocol.\n\n**Goals**:\n\n- Create a client-server application\n- Write a custom protocol with `std` networking APIs\n- Introduce logging to the server\n- Implement pluggable backends with traits\n- Benchmark the hand-written backend against `sled`\n\n**Topics**: `std::net`, logging, traits, benchmarking.\n\n\n### [Building Blocks 4][b4]\n\n**Topics**: multithreading, thread pools, aliasing and mutability, concurrent\ndata types.\n\n\n### [Project 4: Concurrency and parallelism][p4]\n\n**Task**: Create a multithreaded, persistent key/value store server and client\nwith synchronous networking over a custom protocol.\n\n**Goals**:\n\n- Write a simple thread pool\n- Use channels for cross-thread communication\n- Share data structures with locks\n- Perform read operations without locks\n- Benchmark single-threaded vs multithreaded\n\n**Topics**: thread pools, channels, locks, lock-free data structures,\n  atomics, parameterized benchmarking.\n\n\n### Building Blocks 5\n\nComing soon! ([preview][b5])\n\n\n### Project 5: Asynchronous programming in Rust\n\nComing soon! ([preview][p5])\n\n\n## What next?\n\nSo you have completed Practical Networked Applications in Rust. That's a Rusty\naccomplishment! Now you are on the path to being a great Rust programmer. Want\nto know where to go next on that path? We've got [some ideas][n].\n\n\n<!-- building block links -->\n\n[b1]: ../building-blocks/bb-1.md\n[b2]: ../building-blocks/bb-2.md\n[b3]: ../building-blocks/bb-3.md\n[b4]: ../building-blocks/bb-4.md\n[b5]: ../building-blocks/bb-5.md\n\n\n<!-- project links -->\n\n[p1]: ../projects/project-1/README.md\n[p2]: ../projects/project-2/README.md\n[p3]: ../projects/project-3/README.md\n[p4]: ../projects/project-4/README.md\n[p5]: ../projects/project-5/README.md\n\n\n<!-- other links -->\n\n[CONTRIBUTING.md]: ../CONTRIBUTING.md\n[README.md]: ../README.md\n[Rust Discord]: https://discord.gg/rust-lang\n[Rust meetup]: https://www.meetup.com/topics/rust\n[StackOverflow]: https://stackoverflow.com/questions/tagged/rust\n[TiKV Slack]: https://join.slack.com/t/tikv-wg/shared_invite/enQtNTUyODE4ODU2MzI0LWVlMWMzMDkyNWE5ZjY1ODAzMWUwZGVhNGNhYTc3MzJhYWE0Y2FjYjliYzY1OWJlYTc4OWVjZWM1NDkwN2QxNDE\n[author]: https://github.com/brson/\n[brson]: https://github.com/brson/\n[kv]: https://en.wikipedia.org/wiki/Key-value_database\n[pre]: ../README.md#user-content-prerequisites\n[psd]: https://github.com/pingcap/talent-plan/tree/master/courses/rust/projects\n[qq]: ./qq-qr.jpg\n[qq2]: ./qq2-qr.jpg\n[rs]: https://github.com/pingcap/talent-plan/tree/master/courses/rust\n[si]: https://github.com/pingcap/talent-plan/issues\n[spr]: https://github.com/pingcap/talent-plan/pulls\n[users forum]: https://users.rust-lang.org/\n[n]: ./what-next.md\n"
  },
  {
    "path": "courses/rust/docs/prerequisites.md",
    "content": "# PNA Rust Prerequisites\n\nDon't meet all the [prerequisites][pre] to take this course? Here are some ideas\nfor how to proceed.\n\n* A crash course on Rust by Michael Snoyman (Oct 2018) - [blog series][snoyman-blog] | [print friendly][snoyman-html]\n\n[pre]: ../README.md#user-content-prerequisites\n[snoyman-blog]: https://www.snoyman.com/blog/2018/10/introducing-rust-crash-course\n[snoyman-html]: https://www.snoyman.com/series/rust-crash-course\n"
  },
  {
    "path": "courses/rust/docs/roadmap.md",
    "content": "# PNA Rust Roadmap\n\nWe've got a lot of ideas about how to extend and expand this course. But the\nroadmap isn't written yet. In the meantime, [notes.md] contains a bunch of\nunorganized thoughts about the matter.\n\n[notes.md]: ./etc/notes.md\n"
  },
  {
    "path": "courses/rust/docs/what-next.md",
    "content": "# What's next now that you've completed PNA Rust?\n\nComing soon!\n"
  },
  {
    "path": "courses/rust/projects/project-1/Cargo.toml",
    "content": "[package]\nname = \"kvs\"\nversion = \"0.1.0\"\nauthors = [\"Yilin Chen <sticnarf@gmail.com>\"]\ndescription = \"A key-value store\"\nedition = \"2018\"\n\n[dependencies]\nclap = \"2.32.0\"\n\n[dev-dependencies]\nassert_cmd = \"0.11.0\"\npredicates = \"1.0.0\"\n"
  },
  {
    "path": "courses/rust/projects/project-1/README.md",
    "content": "# PNA Rust Project 1: The Rust toolbox\n\n**Task**: Create an in-memory key/value store that passes simple tests and responds\nto command-line arguments.\n\n**Goals**:\n\n- Install the Rust compiler and tools\n- Learn the project structure used throughout this course\n- Use `cargo init` / `run` / `test` / `clippy` / `fmt`\n- Learn how to find and import crates from crates.io\n- Define an appropriate data type for a key-value store\n\n**Topics**: testing, the `clap` crate, `CARGO_VERSION` etc., the `clippy` and\n  `rustfmt` tools.\n\n**Extensions**: the `structopt` crate.\n\n- [Introduction](#user-content-introduction)\n- [Project spec](#user-content-project-spec)\n- [Installation](#user-content-installation)\n- [Project setup](#user-content-project-setup)\n- [Part 1: Make the tests compile](#user-content-part-1-make-the-tests-compile)\n  - [Aside: Testing tips](#user-content-aside-testing-tips)\n- [Part 2: Accept command line arguments](#user-content-part-2-accept-command-line-arguments)\n- [Part 3: Cargo environment variables](#user-content-part-3-cargo-environment-variables)\n- [Part 4: Store values in memory](#user-content-part-4-store-values-in-memory)\n- [Part 5: Documentation](#user-content-part-5-documentation)\n- [Part 6: Ensure good style with `clippy` and `rustfmt`](#user-content-part-6-ensure-good-style-with-clippy-and-rustfmt)\n- [Extension 1: `structopt`](#user-content-extension-1-structopt)\n\n\n## Introduction\n\nIn this project you will create a simple in-memory key/value store that maps\nstrings to strings, and that passes some tests and responds to command line\narguments. The focus of this project is on the tooling and setup that goes into\na typical Rust project.\n\nIf this sounds basic to you, please do the project anyway as it discusses some\ngeneral patterns that will be used throughout the course.\n\n\n## Project spec\n\nThe cargo project, `kvs`, builds a command-line key-value store client called\n`kvs`, which in turn calls into a library called `kvs`.\n\nThe `kvs` executable supports the following command line arguments:\n\n- `kvs set <KEY> <VALUE>`\n\n  Set the value of a string key to a string\n\n- `kvs get <KEY>`\n\n  Get the string value of a given string key\n\n- `kvs rm <KEY>`\n\n  Remove a given key\n\n- `kvs -V`\n\n  Print the version\n\nThe `kvs` library contains a type, `KvStore`, that supports the following\nmethods:\n\n- `KvStore::set(&mut self, key: String, value: String)`\n\n  Set the value of a string key to a string\n\n- `KvStore::get(&self, key: String) -> Option<String>`\n\n  Get the string value of the a string key. If the key does not exist,\n  return `None`.\n\n- `KvStore::remove(&mut self, key: String)`\n\n  Remove a given key.\n\nThe `KvStore` type stores values in-memory, and thus the command-line client can\ndo little more than print the version. The `get`/ `set` / `rm` commands will \nreturn an \"unimplemented\" error when run from the command line. Future projects \nwill store values on disk and have a working command line interface.\n\n\n## Installation\n\nAt this point in your Rust programming experience you should know\nhow to install Rust via [rustup].\n\n[rustup]: https://www.rustup.rs\n\nIf you haven't already, do so now by running\n\n```\ncurl https://sh.rustup.rs -sSf | sh\n```\n\n(If you are running Windows then follow the instructions on rustup.rs. Note\nthough that you will face more challenges than others during this course, as it\nwas developed on Unix. In general, Rust development on Windows is a less\npolished experience than on Unix).\n\nVerify that the toolchain works by typing `rustc -V`. If that doesn't work, log\nout and log in again so that changes to the login profile made during\ninstallation can take effect.\n\n\n## Project setup\n\nYou will do the work for this project in your own git repository, with your own\nCargo project. You will import the test cases for the project from the [source\nrepository for this course][course].\n\n[course]: https://github.com/pingcap/talent-plan\n\nNote that within that repository, all content related to this course is within\nthe `rust` subdirectory. You may ignore any other directories.\n\nThe projects in this course contain both libraries and executables. They are\nexecutables because we are developing an application that can be run. They are\nlibraries because the supplied test cases must link to them.\n\nWe'll use the same setup for each project in this course.\n\nThe directory layout we will use is:\n\n```\n├── Cargo.toml\n├── src\n│   ├── bin\n│   │   └── kvs.rs\n│   └── lib.rs\n└── tests\n    └── tests.rs\n```\n\nThe `Cargo.toml`, `lib.rs` and `kvs.rs` files look as follows:\n\n`Cargo.toml`:\n\n```toml\n[package]\nname = \"kvs\"\nversion = \"0.1.0\"\nauthors = [\"Brian Anderson <andersrb@gmail.com>\"]\ndescription = \"A key-value store\"\nedition = \"2018\"\n```\n\n`lib.rs`:\n\n```rust\n// just leave it empty for now\n```\n\n`kvs.rs`:\n\n```rust\nfn main() {\n    println!(\"Hello, world!\");\n}\n```\n\nThe author should be yourself, but the name needs to be `kvs` in order for the\ntest cases to work. That's because the project name is also the name of the\nlibrary it contains. Likewise the name of the binary (the command line\napplication) needs to be `kvs`. In the above setup it will be `kvs` implicitly\nbased on the file name, but you could name the file whatever you wanted by\nputting the appropriate information in the manifest (`Cargo.toml`).\n\nYou may set up this project with `cargo new --lib`, `cargo init --lib` (in a\nclean directory), or manually. You'll probably also want to initialize a git\nrepository in the same directory.\n\nFinally, the `tests` directory is copied from the course materials. In this case,\ncopy from the course repository the file `rust/projects/project-1/tests`\ninto your own repository, as `tests`.\n\nAt this point you should be able to run the program with `cargo run`.\n\n_Try it now._\n\nYou are set up for this project and ready to start hacking.\n\n\n## Part 1: Make the tests compile\n\nYou've been provided with a suite of unit tests in `tests/tests.rs`. Open it up\nand take a look.\n\n_Try to run the tests with `cargo test`._ What happens? Why?\n\nYour first task for this project is to make the tests _compile_. Fun!\n\nIf your project is like mine you probably saw a huge spew of build errors. Look\nat the first few. In general, when you see a bunch of errors, the first are the\nmost important &mdash; `rustc` will keep trying to compile even after hitting\nerrors, so errors can cascade, the later ones being pretty meaningless. Your\nfirst few errors probably look like:\n\n```\nerror[E0433]: failed to resolve: use of undeclared type or module `assert_cmd`\n --> tests/tests.rs:1:5\n  |\n1 | use assert_cmd::prelude::*;\n  |     ^^^^^^^^^^ use of undeclared type or module `assert_cmd`\n\nerror[E0432]: unresolved import\n --> tests/tests.rs:3:5\n  |\n3 | use predicates::str::contains;\n  |     ^^^^^^^^^^^^^^^^^^^^^^^^^\n```\n\n(If you are seeing something else, please file an issue).\n\nThese two errors are quite hard to diagnose to a new Rust programmer so I'll\njust tell you what's going on here: you are missing [dev-dependency] crates\nin your manifest.\n\n[dev-dependency]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#development-dependencies\n\nFor this project your `Cargo.toml` file needs to contain these lines:\n\n```toml\n[dev-dependencies]\nassert_cmd = \"0.11.0\"\npredicates = \"1.0.0\"\n```\n\nThe details of these dependencies are not important to you completing the\nproject, but you might want to investigate them on your own. We didn't tell you\nabout the need for dev-deps earlier just so you would experience these errors\nyourself. In future projects, the setup text will tell you the dev-deps you\nneed.\n\nOne quick note: how can you figure out that these errors are due to missing\ndependencies in your manifest and not due to errors in your source code? Here's\none big clue, from the error shown previously:\n\n```\n1 | use assert_cmd::prelude::*;\n  |     ^^^^^^^^^^ use of undeclared type or module `assert_cmd`\n```\n\nIn `use` statements the first path element is always the name of a crate. The\nexception to this is when the first path element references a name that was\npreviously brought into scope with _another_ `use` statement. In other words, if\nthere had been another `use` statement in this file like `use foo::assert_cmd`,\nthen use `assert_cmd::prelude::*` would refer to _that_ `assert_cmd`. There is\nmore that could be said about this but we shouldn't go deeper into the nuances\nof path resolution here. Just know that, in general, in a `use` statement, if\nthe first element in the path isn't found (i.e. cannot be resolved), the problem\nis probably that the crate hasn't been named in the manifest.\n\nWhew. That is an unfortunate diversion in the very first project. But hopefully\ninstructive.\n\n_Go ahead and add the appropriate dev-deps to your manifest._\n\nTry again to run the tests with `cargo test`. What happens? Why?\n\nHopefully those _previous_ errors are gone. Now the errors are all about the\ntest cases not being able to find all the code it expects in your own code.\n\n_So now your task is to outline all the types, methods, etc. necessary to make\nthe tests build._\n\nDuring this course you will read the test cases a lot. The test cases tell you\nexactly what is expected of your code. If the text and the tests don't agree,\nthe tests are right (file a bug!). This is true in the real world too. The test\ncases demonstrate what the software _actually_ does. They are reality. Get used\nto reading test cases.\n\nAnd, bonus &mdash; test cases are often the poorest-written code in any project,\nsloppy and undocumented.\n\nAgain, try to run the tests with `cargo test`. What happens? Why?\n\nIn `src/lib.rs` write the type and method definitions necessary to make `cargo\ntest --no-run` complete successfully. Don't write any method bodies yet &mdash;\ninstead write `panic!()`. This is the way to sketch out your APIs without\nknowing or caring about the implementation (there's also the [`unimplemented!`]\nmacro, but since typing it is longer, it's common to simply use `panic!`, a\npossible exception being if you are releasing software that contains\nunimplemented methods).\n\n[`unimplemented!`]: https://doc.rust-lang.org/std/macro.unimplemented.html\n\n_Do that now before moving on._\n\nOnce that is done, if you run `cargo test` (without `--no-run`),\nyou should see that some of your tests are failing, like\n\n```\n    Finished dev [unoptimized + debuginfo] target(s) in 2.32s\n     Running target/debug/deps/kvs-b03a01e7008067f6\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out\n\n     Running target/debug/deps/kvs-a3b5a004932c6715\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out\n\n     Running target/debug/deps/tests-5e1c2e20bd1fa377\n\nrunning 13 tests\ntest cli_get ... FAILED\ntest cli_invalid_get ... FAILED\ntest cli_invalid_rm ... FAILED\ntest cli_invalid_set ... FAILED\ntest cli_no_args ... FAILED\ntest cli_invalid_subcommand ... FAILED\n... more lines of spew ...\n```\n\n... followed by many more lines. That's great! That's all we need right now.\nYou'll make those pass throughout the rest of this project.\n\n\n### Aside: Testing tips\n\nIf you look again at the output from `cargo test` you'll see something\ninteresting:\n\n```\n     Running target/debug/deps/kvs-b03a01e7008067f6\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out\n\n     Running target/debug/deps/kvs-a3b5a004932c6715\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out\n\n     Running target/debug/deps/tests-5e1c2e20bd1fa377\n\n\nrunning 13 tests\ntest cli_get ... FAILED\n```\n\nCargo says \"Running ...\" three times. And the first two of those times it in\nfact did not run any tests. And furthermore, if all those tests hadn't failed,\ncargo would have run _yet another_ set of tests.\n\nWhy is this?\n\nWell, it is because there are many places you can write tests in Rust:\n\n- Inside the source of your library\n- Inside the source of each of your binaries\n- Inside each test file\n- In the doc comments of your library\n\nAnd cargo doesn't know which of these actually contain tests, so it just builds\nand runs them all.\n\nSo those two sets of empty tests:\n\n```\n     Running target/debug/deps/kvs-b03a01e7008067f6\nrunning 0 tests\n     Running target/debug/deps/kvs-a3b5a004932c6715\nrunning 0 tests\n```\n\nWell, this is a bit confusing, but one of them is your library, compiled for\ntesting, and the other is your binary, compiled for testing. Neither contains\nany tests. The reason both have \"kvs\" in their names is because both your\nlibrary and your binary are called \"kvs\".\n\nAll this test spew gets annoying, and there are two ways to quiet cargo:\nwith command line arguments, and with changes to the manifest.\n\nHere are the relevant command line flags:\n\n- `cargo test --lib` &mdash; test just the tests inside the library\n- `cargo test --doc` &mdash; test the doc tests in the library\n- `cargo test --bins` &mdash; test all the bins in the project\n- `cargo test --bin foo` &mdash; test just the `foo` bin\n- `cargo test --test foo` &mdash; test the tests in test file `foo`\n\nThese are convenient to quickly hide test spew, but if a project doesn't contain\na type of tests it's probably best to just never deal with them. If you recall\nfrom The Cargo Book's [manifest description][m], there are two keys that can be\napplied: `test = false` and `doctest = false`. They go in the `[lib]` and\n`[[bin]]` sections. Consider updating your manifest.\n\n[m]: https://doc.rust-lang.org/cargo/reference/manifest.html\n\nAnother quick thing to do if you haven't before. Run this:\n\n```\ncargo test -- --help\n```\n\nJust do it. It's cool. What you are seeing there is the help information for\n_the executable containing your compiled tests_ (that `--` surrounded by spaces\ntells cargo to pass all following arguments to the test binary). It's not\nthe same info displayed when you run `cargo test --help`. They are two different\nthings: cargo is running your test bin by passing it all these various arguments.\n\nIf you want you can do exactly the same thing. Let's go back one more time\nto our `cargo test` example. We saw this line:\n\n```\n     Running target/debug/deps/kvs-b03a01e7008067f6\n```\n\nThat's cargo telling you the name of the test binary. You can run it\nyourself, like `target/debug/deps/kvs-b03a01e7008067f6 --help`.\n\nThe `target` directory contains lots of cool stuff. Digging through it can teach\nyou a lot about what the Rust toolchain is actually doing.\n\nIn practice, particularly with large projects, you won't run the entire test\nsuite while developing a single feature. To narrow down the set of tests to the\nones we care about, run the following:\n\n```\ncargo test cli_no_args\n```\n\nThis will run the test called `cli_no_args`. In fact, it will run any test\ncontaining `cli_no_args` in the name, so if, e.g., you want to run all the CLI\ntests, you can run `cargo test cli`. That's probably how you will be running the\ntests yourself as you work through the project, otherwise you will be distracted\nby the many failing tests that you have not yet fixed. Unfortunately that\npattern is a simple substring match, not something fancy like a regular\nexpression.\n\n<!-- TODO: need an excuse to explain `cargo test --test suite`.\nPer https://github.com/pingcap/talent-plan/pull/129#issuecomment-498477590\nwe might organize the the test suite into test files by project section.\nThen we could talk about `cargo test --test part-1` -->\n\nNote that, as of this writing, the test cases for the projects in this course\nare not organized in a way that makes it clear which test cases should complete\nfor any particular section of a project &mdash; only that by the end the entire\nsuite should pass. You'll need to read the names and implementations of the\ntests to figure out which you _think_ should pass at any particular time.\n\n\n## Part 2: Accept command line arguments\n\nThe key / value stores throughout this course are all controlled through a\ncommand-line client. In this project the command-line client is very simple\nbecause the state of the key-value store is only stored in memory, not persisted\nto disk.\n\nIn this part you will make the `cli_*` test cases pass.\n\nRecall how to run individual test cases from previous sections\nof \n\nAgain, the interface for the CLI is:\n\n- `kvs set <KEY> <VALUE>`\n\n  Set the value of a string key to a string\n\n- `kvs get <KEY>`\n\n  Get the string value of a given string key\n\n- `kvs rm <KEY>`\n\n  Remove a given key\n\n- `kvs -V`\n\n  Print the version\n\nIn this iteration though, the `get` and `set` commands will print to stderr the\nstring, \"unimplemented\", and exiting with a non-zero exit code, indicating an\nerror.\n\nYou will use the `clap` crate to handle command-line arguments.\n\n_Find the latest version of the `clap` crate and add it to your dependencies in\n`Cargo.toml`._ There are a number of ways to find and import a crate, but\npro-tip: check out the built-in [`cargo search`] and the plug-in [`cargo edit`].\n\n[`cargo search`]: https://doc.rust-lang.org/cargo/commands/cargo-search.html\n[`cargo edit`]: https://github.com/killercup/cargo-edit\n\n<!-- note: above is basically assuming that by now they know about\ncrates.io, so expanding their world with the two CLI commands. -->\n\n<i>Next use [crates.io], [lib.rs], or [docs.rs] to find the documentation for\nthe `clap` crate, and implement the command line interface such that the `cli_*`\ntest cases pass.</i>\n\n<!-- note: above casually mentioning lib.rs and docs.rs to make sure they are aware. -->\n\nWhen you are testing, use `cargo run`; do not run the executable directly from\nthe `target/` directory. When passing arguments to the program, separate them\nfrom the `cargo run` command with two dashes, `--`, like `cargo run -- get\nkey1`.\n\n[crates.io]: https://crates.io\n[lib.rs]: https://lib.rs\n[docs.rs]: https://docs.rs\n\n\n## Part 3: Cargo environment variables\n\nWhen you set up `clap` to parse your command line arguments, you probably set\nthe name, version, authors, and description (if not, do so). This information is\nredundant w/ values provided in `Cargo.toml`. Cargo sets environment variables\nthat can be accessed through Rust source code, at build time.\n\n_Modify your `clap` setup to set these values from standard cargo environment\nvariables._\n\n\n## Part 4: Store values in memory\n\nNow that your command line scaffolding is done, let's turn to the implementation\nof `KvStore`, and make the remaining test cases pass.\n\nThe behavior of `KvStore`'s methods are fully-defined through the test cases\nthemselves &mdash; you don't need any further description to complete the\ncode for this project.\n\n_Make the remaining test cases pass by implementing methods on `KvStore`._\n\n\n## Part 5: Documentation\n\nYou have implemented the project's functionality, but there are still a few more\nthings to do before it is a polished piece of Rust software, ready for\ncontributions or publication.\n\nFirst, public items should generally have doc comments.\n\nDoc comments are displayed in a crate's API documentation. API documentation can\nbe generated with the command, `cargo doc`, which will render them as HTML to\nthe `target/doc` folder. Note though that `target/doc` folder does not contain\nan `index.html`. In this project, your crate's documentation will be located at\n`target/doc/kvs/index.html`. You can launch a web browser at that location with\n`cargo doc --open`. `cargo doc --open` doesn't always work, e.g. if you are\nssh'd into a cloud instance. If it doesn't though the command will print the\nname of the html file it couldn't open &mdash; useful simply for finding the\nlocation of your API docs.\n\n[Good doc comments][gdc] do not just repeat the name of the function, nor repeat\ninformation gathered from the type signature. They explain why and how one would\nuse a function, what the return value is on both success and failure, error and\npanic conditions. The library you have written is very simple so the\ndocumentation can be simple as well. If you truly cannot think of anything\nuseful to add through doc comments then it can be ok to not add a doc comment\n(this is a matter of preference). With no doc comments it should be obvious how\nthe type or function is used from the name and type signature alone.\n\nDoc comments contain examples, and those examples can be tested with `cargo test\n--doc`.\n\n_Add `#![deny(missing_docs)]` to the top of `src/lib.rs` to enforce that all\npublic items have doc comments. Then add doc comments to the types and methods\nin your library. Follow the [documentation guidelines][gdc]. Give each an\nexample and make sure they pass `cargo test --doc`._\n\n[gdc]: https://rust-lang-nursery.github.io/api-guidelines/documentation.html\n\n\n## Part 6: Ensure good style with `clippy` and `rustfmt`\n\n[`clippy`] and [`rustfmt`] are tools for enforcing common Rust style. `clippy`\nhelps ensure that code uses modern idioms, and prevents patterns that commonly\nlead to errors. `rustfmt` enforces that code is formatted consistently. It's not\nnecessary right now, but you might click those links and read their\ndocumentation. They are both sophisticated tools capable of much more than\ndescribed below.\n\n[`clippy`]: https://github.com/rust-lang/rust-clippy\n[`rustfmt`]: https://github.com/rust-lang/rustfmt\n\nBoth tools are included in the Rust toolchain, but not installed by default.\nThey can be installed with the following [`rustup`] commands:\n\n```\nrustup component add clippy\nrustup component add rustfmt\n```\n\n[`rustup`]: https://github.com/rust-lang/rustup.rs/blob/master/README.md\n\n_Do that now._\n\nBoth tools are invoked as cargo subcommands, `clippy` as `cargo clippy` and\n`rustfmt` as `cargo fmt`. Note that `cargo fmt` modifies your source code, so\ncommit your work before making before running it to avoid accidentally making\nunwanted changes, after which you can either include the changes as part of the\nprevious commit with `git commit --amend`. Or just commit them as their own\nformatting commit &mdash; it's common to rust both `clippy` and `rustfmt` after\na series of commits, e.g. before submitting a pull request.\n\n_Run `cargo clippy` against your project and make any suggested changes. Run\n`cargo fmt` against your project and commit any changes it makes._\n\nIt's worth reading the [`rustup`], [`clippy`], and [`rustfmt`] documentation, as\nthese are tools you will be using frequently.\n\nCongratulations, you are done with your first project! If you like you\nmay complete the remaining \"extensions\". They are optional.\n\n<!-- TODO add text about discovering components, and filtering with rg -->\n\nNice coding, friend. Enjoy a nice break.\n\n\n---\n\n\n<!--\n\nTODO ## Aside: exploring Rust toolchain components\n\nrust component list\nrust component list | rg -v std # opportunity to introduce rg\n\n-->\n\n\n## Extension 1: `structopt`\n\nIn this project we used `clap` to parse command line arguments. It's typical to\nrepresent a program's parsed command line arguments as a struct, perhaps named\n`Config` or `Options`. Doing so requires calling the appropriate methods on\n`clap`'s `ArgMatches` type. Both steps, for larger programs, require _a lot_ of\nboilerplate code. The `structopt` crate greatly reduces boilerplate by allowing\nyou to define a `Config` struct, annotated to automatically produce a `clap`\ncommand line parser that produces that struct. Some find this approach nicer\nthan writing the `clap` code explicitly.\n\n_Modify your program to use `structopt` for parsing command line\narguments instead of using `clap` directly._\n\n\n<!--\n\n## TODOs\n\n- set the binary's name\n- ask about pros / cons of this main.rs setup\n  - explain why we're doing this setup\n    (makes main testable) though this will\n\tbecome evident as they work through the tests\n- doc comments\n- make sure there's enough background reading to support the project\n- resources (whether / where to put these?)\n  - https://docs.rs/clap/2.32.0/clap/\n  - https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo\n  - https://rust-lang-nursery.github.io/api-guidelines/documentation.html#documentation\n  - https://doc.rust-lang.org/std/macro.env.html\n  - https://github.com/rust-lang/rust-clippy/blob/master/README.md\n  - https://github.com/rust-lang/rustfmt/blob/master/README.md\n- do range lookups (`scan`)?\n- README.md?\n- GitHub CI setup?\n- Add suggestions to read clippy and rustfmt documentation\n- Make clippy / rustfmt docs readings?\n\n-->\n"
  },
  {
    "path": "courses/rust/projects/project-1/src/bin/kvs.rs",
    "content": "use clap::{App, AppSettings, Arg, SubCommand};\nuse std::process::exit;\n\nfn main() {\n    let matches = App::new(env!(\"CARGO_PKG_NAME\"))\n        .version(env!(\"CARGO_PKG_VERSION\"))\n        .author(env!(\"CARGO_PKG_AUTHORS\"))\n        .about(env!(\"CARGO_PKG_DESCRIPTION\"))\n        .setting(AppSettings::DisableHelpSubcommand)\n        .setting(AppSettings::SubcommandRequiredElseHelp)\n        .setting(AppSettings::VersionlessSubcommands)\n        .subcommand(\n            SubCommand::with_name(\"set\")\n                .about(\"Set the value of a string key to a string\")\n                .arg(Arg::with_name(\"KEY\").help(\"A string key\").required(true))\n                .arg(\n                    Arg::with_name(\"VALUE\")\n                        .help(\"The string value of the key\")\n                        .required(true),\n                ),\n        )\n        .subcommand(\n            SubCommand::with_name(\"get\")\n                .about(\"Get the string value of a given string key\")\n                .arg(Arg::with_name(\"KEY\").help(\"A string key\").required(true)),\n        )\n        .subcommand(\n            SubCommand::with_name(\"rm\")\n                .about(\"Remove a given key\")\n                .arg(Arg::with_name(\"KEY\").help(\"A string key\").required(true)),\n        )\n        .get_matches();\n\n    match matches.subcommand() {\n        (\"set\", Some(_matches)) => {\n            eprintln!(\"unimplemented\");\n            exit(1);\n        }\n        (\"get\", Some(_matches)) => {\n            eprintln!(\"unimplemented\");\n            exit(1);\n        }\n        (\"rm\", Some(_matches)) => {\n            eprintln!(\"unimplemented\");\n            exit(1);\n        }\n        _ => unreachable!(),\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-1/src/kv.rs",
    "content": "use std::collections::HashMap;\n\n/// The `KvStore` stores string key/value pairs.\n///\n/// Key/value pairs are stored in a `HashMap` in memory and not persisted to disk.\n///\n/// Example:\n///\n/// ```rust\n/// # use kvs::KvStore;\n/// let mut store = KvStore::new();\n/// store.set(\"key\".to_owned(), \"value\".to_owned());\n/// let val = store.get(\"key\".to_owned());\n/// assert_eq!(val, Some(\"value\".to_owned()));\n/// ```\n#[derive(Default)]\npub struct KvStore {\n    map: HashMap<String, String>,\n}\n\nimpl KvStore {\n    /// Creates a `KvStore`.\n    pub fn new() -> KvStore {\n        KvStore {\n            map: HashMap::new(),\n        }\n    }\n\n    /// Sets the value of a string key to a string.\n    ///\n    /// If the key already exists, the previous value will be overwritten.\n    pub fn set(&mut self, key: String, value: String) {\n        self.map.insert(key, value);\n    }\n\n    /// Gets the string value of a given string key.\n    ///\n    /// Returns `None` if the given key does not exist.\n    pub fn get(&self, key: String) -> Option<String> {\n        self.map.get(&key).cloned()\n    }\n\n    /// Remove a given key.\n    pub fn remove(&mut self, key: String) {\n        self.map.remove(&key);\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-1/src/lib.rs",
    "content": "#![deny(missing_docs)]\n//! A simple key/value store.\n\npub use kv::KvStore;\n\nmod kv;\n"
  },
  {
    "path": "courses/rust/projects/project-1/tests/tests.rs",
    "content": "use assert_cmd::prelude::*;\nuse kvs::KvStore;\nuse predicates::str::contains;\nuse std::process::Command;\n\n// `kvs` with no args should exit with a non-zero code.\n#[test]\nfn cli_no_args() {\n    Command::cargo_bin(\"kvs\").unwrap().assert().failure();\n}\n\n// `kvs -V` should print the version\n#[test]\nfn cli_version() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"-V\"])\n        .assert()\n        .stdout(contains(env!(\"CARGO_PKG_VERSION\")));\n}\n\n// `kvs get <KEY>` should print \"unimplemented\" to stderr and exit with non-zero code\n#[test]\nfn cli_get() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"get\", \"key1\"])\n        .assert()\n        .failure()\n        .stderr(contains(\"unimplemented\"));\n}\n\n// `kvs set <KEY> <VALUE>` should print \"unimplemented\" to stderr and exit with non-zero code\n#[test]\nfn cli_set() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"set\", \"key1\", \"value1\"])\n        .assert()\n        .failure()\n        .stderr(contains(\"unimplemented\"));\n}\n\n// `kvs rm <KEY>` should print \"unimplemented\" to stderr and exit with non-zero code\n#[test]\nfn cli_rm() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"rm\", \"key1\"])\n        .assert()\n        .failure()\n        .stderr(contains(\"unimplemented\"));\n}\n\n#[test]\nfn cli_invalid_get() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"get\"])\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"get\", \"extra\", \"field\"])\n        .assert()\n        .failure();\n}\n\n#[test]\nfn cli_invalid_set() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"set\"])\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"set\", \"missing_field\"])\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"set\", \"extra\", \"extra\", \"field\"])\n        .assert()\n        .failure();\n}\n\n#[test]\nfn cli_invalid_rm() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"rm\"])\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"rm\", \"extra\", \"field\"])\n        .assert()\n        .failure();\n}\n\n#[test]\nfn cli_invalid_subcommand() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"unknown\", \"subcommand\"])\n        .assert()\n        .failure();\n}\n\n// Should get previously stored value\n#[test]\nfn get_stored_value() {\n    let mut store = KvStore::new();\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned());\n    store.set(\"key2\".to_owned(), \"value2\".to_owned());\n\n    assert_eq!(store.get(\"key1\".to_owned()), Some(\"value1\".to_owned()));\n    assert_eq!(store.get(\"key2\".to_owned()), Some(\"value2\".to_owned()));\n}\n\n// Should overwrite existent value\n#[test]\nfn overwrite_value() {\n    let mut store = KvStore::new();\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned());\n    assert_eq!(store.get(\"key1\".to_owned()), Some(\"value1\".to_owned()));\n\n    store.set(\"key1\".to_owned(), \"value2\".to_owned());\n    assert_eq!(store.get(\"key1\".to_owned()), Some(\"value2\".to_owned()));\n}\n\n// Should get `None` when getting a non-existent key\n#[test]\nfn get_non_existent_value() {\n    let mut store = KvStore::new();\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned());\n    assert_eq!(store.get(\"key2\".to_owned()), None);\n}\n\n#[test]\nfn remove_key() {\n    let mut store = KvStore::new();\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned());\n    store.remove(\"key1\".to_owned());\n    assert_eq!(store.get(\"key1\".to_owned()), None);\n}\n"
  },
  {
    "path": "courses/rust/projects/project-2/Cargo.toml",
    "content": "[package]\nname = \"kvs\"\nversion = \"0.1.0\"\nauthors = [\"Yilin Chen <sticnarf@gmail.com>\"]\ndescription = \"A key-value store\"\nedition = \"2018\"\n\n[dependencies]\nclap = \"2.32.0\"\nfailure = \"0.1.5\"\nserde = { version = \"1.0.89\", features = [\"derive\"] }\nserde_json = \"1.0.39\"\n\n[dev-dependencies]\nassert_cmd = \"0.11.0\"\npredicates = \"1.0.0\"\ntempfile = \"3.0.7\"\nwalkdir = \"2.2.7\"\n"
  },
  {
    "path": "courses/rust/projects/project-2/README.md",
    "content": "# PNA Rust Project 2: Log-structured file I/O\n\n**Task**: Create a _persistent_ key/value store that _can be accessed from the\ncommand line_.\n\n**Goals**:\n\n- Handle and report errors robustly\n- Use serde for serialization\n- Write data to disk as a log using standard file APIs\n- Read the state of the key/value store from disk\n- Map in-memory key-indexes to on-disk values\n- Periodically compact the log to remove stale data\n\n**Topics**: log-structured file I/O, bitcask, the `failure` crate, `Read` /\n`Write` traits, the `serde` crate.\n\n- [Introduction](#user-content-introduction)\n- [Terminology](#user-content-terminology)\n- [Project spec](#user-content-project-spec)\n- [Project setup](#user-content-project-setup)\n- [Part 1: Error handling](#user-content-part-1-error-handling)\n- [Part 2: How the log behaves](#user-content-part-2-how-the-log-behaves)\n- [Part 3: Writing to the log](#user-content-part-3-writing-to-the-log)\n- [Part 4: Reading from the log](#user-content-part-4-reading-from-the-log)\n- [Part 5: Storing log pointers in the index](#user-content-part-5-storing-log-pointers-in-the-index)\n- [Part 6: Stateless vs. stateful `KvStore`](#user-content-part-6-stateless-vs-stateful-kvstore)\n- [Part 7: Compacting the log](#user-content-part-7-compacting-the-log)\n\n\n## Introduction\n\nIn this project you will create a simple on-disk key/value store that can be\nmodified and queried from the command line. It will use a simplification of the\nstorage algorithm used by [bitcask], chosen for its combination of simplicity\nand effectiveness. You will start by maintaining a _log_ (sometimes called a\n[\"write-ahead log\"][wal] or \"WAL\") on disk of previous write commands that is\nevaluated on startup to re-create the state of the database in memory. Then you\nwill extend that by storing only the keys in memory, along with offsets into the\non-disk log. Finally, you will introduce log compaction so that it does not grow\nindefinitely. At the end of this project you will have built a simple, but\nwell-architected database using Rust file APIs.\n\n[wal]: https://en.wikipedia.org/wiki/Write-ahead_logging\n[bitcask]: https://github.com/basho/bitcask\n\n\n<!--\n## Basic database architecture\n\nTODO\n\n- Basic description and terminology of log, memtable, blocks, etc\n- good opportunity for a diagram\n- find a good background reading\n- using the os page cache for caching\n-->\n\n## Terminology\n\nSome terminology we will use in this course. It is the same as or inspired by\n[bitcask]. Different databases will have slightly different terminology.\n\n- _command_ - A request or the representation of a request made to the database.\n  These are issued on the command line or over the network. They have an\n  in-memory representation, a textual representation, and a machine-readable\n  serialized representation.\n- _log_ - An on-disk sequence of commands, in the order originally received and\n  executed. Our database's on-disk format is almost entirely made up of logs. It\n  will be simple, but also surprisingly efficient.\n- _log pointer_ - A file offset into the log. Sometimes we'll just call this a\n  \"file offset\".\n- _log compaction_ - As writes are issued to the database they sometimes\n  invalidate old log entries. For example, writing key/value `a = 0` then\n  writing `a = 1`, makes the first log entry for \"a\" useless. Compaction &mdash;\n  in our database at least &mdash; is the process of reducing the size of the\n  database by remove stale commands from the log.\n- _in-memory index_ (or _index_) - A map of keys to log pointers. When a read\n  request is issued, the in-memory index is searched for the appropriate log\n  pointer, and when it is found the value is retrieved from the on-disk log. In\n  our key/value store, like in bitcask, the index for the _entire database_ is\n  stored in memory.\n- _index file_ - The on-disk representation of the in-memory index. Without this\n  the log would need to be completely replayed to restore the state of the\n  in-memory index each time the database is started.\n\n\n## Project spec\n\nThe cargo project, `kvs`, builds a command-line key-value store client called\n`kvs`, which in turn calls into a library called `kvs`.\n\nThe `kvs` executable supports the following command line arguments:\n\n- `kvs set <KEY> <VALUE>`\n\n  Set the value of a string key to a string.\n  Print an error and return a non-zero exit code on failure.\n\n- `kvs get <KEY>`\n\n  Get the string value of a given string key.\n  Print an error and return a non-zero exit code on failure.\n\n- `kvs rm <KEY>`\n\n  Remove a given key.\n  Print an error and return a non-zero exit code on failure.\n\n- `kvs -V`\n\n  Print the version\n\nThe `kvs` library contains a type, `KvStore`, that supports the following\nmethods:\n\n- `KvStore::set(&mut self, key: String, value: String) -> Result<()>`\n\n  Set the value of a string key to a string.\n  Return an error if the value is not written successfully.\n\n- `KvStore::get(&mut self, key: String) -> Result<Option<String>>`\n\n  Get the string value of a string key.\n  If the key does not exist, return `None`.\n  Return an error if the value is not read successfully.\n\n- `KvStore::remove(&mut self, key: String) -> Result<()>`\n\n  Remove a given key.\n  Return an error if the key does not exist or is not removed successfully.\n\n- `KvStore::open(path: impl Into<PathBuf>) -> Result<KvStore>`\n\n  Open the KvStore at a given path.\n  Return the KvStore.\n\nWhen setting a key to a value, `kvs` writes the `set` command to disk in a\nsequential log, then stores the log pointer (file offset) of that command in the\nin-memory index from key to pointer. When removing a key, similarly, `kvs`\nwrites the `rm` command in the log, then removes the key from the in-memory\nindex.  When retrieving a value for a key with the `get` command, it searches\nthe index, and if found then loads from the log the command at the corresponding\nlog pointer, evaluates the command and returns the result.\n\nOn startup, the commands in the log are traversed from oldest to newest, and the\nin-memory index rebuilt.\n\nWhen the size of the uncompacted log entries reach a given threshold, `kvs`\ncompacts it into a new log, removing redundent entries to reclaim disk space.\n\nNote that our `kvs` project is both a stateless command-line program, and a\nlibrary containing a stateful `KvStore` type: for CLI use the `KvStore` type\nwill load the index, execute the command, then exit; for library use it will\nload the index, then execute multiple commands, maintaining the index state,\nuntil it is dropped.\n\n\n## Project setup\n\nContinuing from your previous project, delete your previous `tests` directory and\ncopy this project's `tests` directory into its place. Like the previous project,\nthis project should contain a library and an executable, both named `kvs`.\n\nYou need the following dev-dependencies in your `Cargo.toml`:\n\n```toml\n[dev-dependencies]\nassert_cmd = \"0.11.0\"\npredicates = \"1.0.0\"\ntempfile = \"3.0.7\"\nwalkdir = \"2.2.7\"\n```\n\nAs with the previous project, go ahead and write enough empty or panicking\ndefinitions to make the test cases build.\n\n_Do that now._\n\n\n## Part 1: Error handling\n\nIn this project it will be possible for the code to fail due to I/O errors. So\nbefore we get started implementing a database we need to do one more thing that\nis crucial to Rust projects: decide on an error handling strategy.\n\n<!-- TODO outline strategies? -->\n\nRust's error handling is powerful, but involves a lot of boilerplate to use\ncorrectly. For this project the [`failure`] crate will provide the tools to\neasily handle errors of all kinds.\n\n[`failure`]: https://docs.rs/failure/0.1.5/failure/\n\nThe [failure guide][fg] describes [several] error handling patterns.\n\n[fg]: https://boats.gitlab.io/failure/\n[several]: https://boats.gitlab.io/failure/guidance.html\n\nPick one of those strategies and, in your library, either define your own error\ntype or import `failure`s `Error`. This is the error type you will use in all of\nyour `Result`s, converting error types from other crates to your own with the\n`?` operator.\n\nAfter that, define a type alias for `Result` that includes your concrete error\ntype, so that you don't need to type `Result<T, YourErrorType>` everywhere, but\ncan simply type `Result<T>`. This is a common Rust pattern.\n\nFinally, import those types into your executable with `use` statements, and\nchange `main`s function signature to return `Result<()>`. All functions in your\nlibrary that may fail will pass these `Results` back down the stack all the way\nto `main`, and then to the Rust runtime, which will print an error.\n\nRun `cargo check` to look for compiler errors, then fix them. For now it's\nok to end `main` with `panic!()` to make the project build.\n\n_Set up your error handling strategy before continuing._\n\nAs with the previous project, you'll want to create placeholder data structures\nand methods so that the tests compile. Now that you have defined an error type\nthis should be straightforward. Add panics anywhere necessary to get the test\nsuite to compile (`cargo test --no-run`).\n\n\n<!--\n## Aside: The history of Rust error handling\n-->\n\n_Note: Error-handling practices in Rust are still evolving. This course\ncurrently uses the [`failure`] crate to make defining error types easier. While\n`failure` has a good design, its use is [arguably not a best practice][nbp]. It\nmay not continue to be viewed favorably by Rust experts. Future iterations\nof the course will likely not use `failure`. In the meantime, it is fine, and\npresents an opportunity to learn more of the history and nuance of Rust error\nhandling._\n\n[nbp]: https://github.com/rust-lang-nursery/rust-cookbook/issues/502#issue-387418261\n\n<!--\nRust error handling has a long and winding history. Expert Rust programmers will\nbe aware of it, as that history informs and explains modern Rust error handling.\n\nTODO\n-->\n\n\n## Part 2: How the log behaves\n\nNow we are finally going to begin implementing the beginnings of a real database\nby reading and writing from disk. You will use [`serde`] to serialize the \"set\"\nand \"rm\" commands to a string, and the standard file I/O APIs to write it to\ndisk.\n\n[`serde`]: https://serde.rs/\n\nThis is the basic behavior of `kvs` with a log:\n\n- \"set\"\n  - The user invokes `kvs set mykey myvalue`\n   - `kvs` creates a value representing the \"set\" command, containing its key and\n    value\n  - It then serializes that command to a `String`\n  - It then appends the serialized command to a file containing the log\n  - If that succeeds, it exits silently with error code 0\n  - If it fails, it exits by printing the error and returning a non-zero error code\n- \"get\"\n  - The user invokes `kvs get mykey`\n  - `kvs` reads the entire log, one command at a time, recording the \n   affected key and file offset of the command to an in-memory _key -> log\n    pointer_ map\n  - It then checks the map for the log pointer\n  - If it fails, it prints \"Key not found\", and exits with exit code 0\n  - If it succeeds\n    - It deserializes the command to get the last recorded value of the key\n    - It prints the value to stdout and exits with exit code 0\n- \"rm\"\n  - The user invokes `kvs rm mykey`\n  - Same as the \"get\" command, `kvs` reads the entire log to build the in-memory\n    index\n  - It then checks the map if the given key exists\n  - If the key does not exist, it prints \"Key not found\", and exits with a\n    non-zero error code\n  - If it succeeds\n    - It creates a value representing the \"rm\" command, containing its key\n    - It then appends the serialized command to the log\n    - If that succeeds, it exits silently with error code 0\n\nThe log is a record of the transactions committed to the database. By\n\"replaying\" the records in the log on startup we reconstruct the previous state\nof the database.\n\nIn this iteration you may store the value of the keys directly in memory (and\nthus never read from the log after initial startup and log replay). In a future\niteration you will store only \"log pointers\" (file offsets) into the log.\n\n\n## Part 3: Writing to the log\n\nYou will start by implementing the \"set\" flow. There are a number of steps here.\nMost of them are straightforward to implement and you can verify you've done so\nby running the appropriate `cli_*` test cases.\n\n`serde` is a large library, with many options, and supporting many serialization\nformats. Basic serialization and deserialization only requires annotating\nyour data structure correctly, and calling a function to write it\neither to a `String` or a stream implementing `Write`.\n\nYou need to pick a serialization format. Think about the properties you want in\nyour serialization format &mdash; do you want to prioritize performance? Do you\nwant to be able to read the content of the log in plain text? It's your choice,\nbut maybe you should include a comment in the code explaining it.\n\nOther things to consider include: where is the system performing buffering and\nwhere do you need buffering? What is the impact of buffering on subsequent\nreads? When should you open and close file handles? For each command? For the\nlifetime of the `KvStore`?\n\nSome of the APIs you will call may fail, and return a `Result` of some error type.\nMake sure that your calling functions return a `Result` of _your own_ error type,\nand that you convert between the two with `?`.\n\nIt is similar to implementing the \"rm\" command, but you should additionally\ncheck if the key exists before writing the command to the log. As we have two\ndifferent commands that must be distinguished, you may use variants of a single\nenum type to represent each command. `serde` just works perfectly with enums.\n\nYou may implement the \"set\" and \"rm\" commands now, focusing on the `set` / `rm`\ntest cases, or you can proceed to the next section to read about the \"get\"\ncommand. It may help to keep both in mind, or to implement them both\nsimultaneously. It is your choice.\n\n\n## Part 4: Reading from the log\n\nNow it's time to implement \"get\". In this part, you don't need to store\nlog pointers in the index, we will leave the work to the next part. Instead,\njust read each command in the log on startup, executing them to save every key\nand value in the memory. Then read from the memory.\n\nShould you read all records in the log into memory at once and then replay\nthem into your map type; or should you read them one at a time while\nreplaying them into your map? Should you read into a buffer before deserializing\nor deserialize from a file stream? Think about the memory usage of your approach.\nThink about the way reading from I/O streams interacts with the kernel.\n\nRemember that \"get\" may not find a value and that case has to be handled\nspecially. Here, our API returns `None` and our command line client prints\na particular message and exits with a zero exit code.\n\nThere's one complication to reading the log, and you may have already considered\nit while writing the \"set\" code: how do you distinguish between each record in\nthe log? That is, how do you know when to stop reading one record, and start\nreading the next? Do you even need to? Maybe serde will deserialize a record\ndirectly from an I/O stream and stop reading when it's done, leaving the\nfile cursor in the correct place to read subsequent records. Maybe serde will\nreport an error when it sees two records back-to-back. Maybe you need to insert\nadditional information to distinguish the length of each record. Maybe not.\n\n[`serde`]: https://serde.rs/\n\n_Implement \"get\" now_.\n\n\n## Part 5: Storing log pointers in the index\n\nAt this point most, if not all (besides the compaction test), other test suite should all pass. The changes\nintroduced in the next steps are simple optimizations, necessary for fast\nperformance and reduced storage. As you implement them, pay attention to what\nexactly they are optimizing for.\n\nAs we've described, the database you are building maintains an in-memory index\nof all keys in the database. That index maps from string keys to log pointers,\nnot the values themselves.\n\nThis change introduces the need to perform reads from the log\nat arbitrary offsets. Consider how that might impact the way\nyou manage file handles.\n\n_If, in the previous steps, you elected to store the string values directly in\nmemory, now is the time to update your code to store log pointers instead,\nloading from disk on demand._\n\n\n## Part 6: Stateless vs. stateful `KvStore`\n\nRemember that our project is both a library and a command-line program.\nThey have sligtly different requirements: the `kvs` CLI commits a single change\nto disk, then exits (it is stateless); the `KvStore` type commits\nchanges to disk, then stays resident in memory to service future\nqueries (it is stateful).\n\nIs your `KvStore` stateful or stateless?\n\n_Make your `KvStore` retain the index in memory so it doesn't need to\nre-evaluate it for every call to `get`._\n\n\n## Part 7: Compacting the log\n\nAt this point the database works just fine, but the log grows indefinitely. That\nis appropriate for some databases, but not the one we're building &mdash; we\nwant to minimize disk usage as much as we can.\n\nSo the final step in creating your database is to compact the log. Consider\nthat as the log grows that multiple entries may set the value of a given key.\nConsider also that only the most recent command that modified a given key has\nany effect on the current value of that key:\n\n| idx | command |\n|:---:|:--------|\n| 0 | ~Command::Set(\"key-1\", \"value-1a\")~ |\n| 20 | Command::Set(\"key-2\", \"value-2\") |\n| | ... |\n| 100 | Command::Set(\"key-1\", \"value-1b\") |\n\nIn this example obviously the command at index 0 is redundant, so it doesn't\nneed to be stored. Log compaction then is about rebuilding the log to remove\nredundancy:\n\n| idx | command |\n|:---:|:--------|\n| 0 | Command::Set(\"key-2\", \"value-2\") |\n| | ... |\n| 99 | Command::Set(\"key-1\", \"value-1b\") |\n\nHere's the basic algorithm you will use:\n\n<!-- TODO: Think about this. should the algorithm be specified? what _is_ a\ngood heuristic to rebuild the log? always rebuild the entire log? -->\n\n_How_ you re-build the log is up to you. Consider questions like: what is the\nnaive solution? How much memory do you need? What is the minimum amount of\ncopying necessary to compact the log? Can the compaction be done in-place? How\ndo you maintain data-integrity if compaction fails?\n\nSo far we've been refering to \"the log\", but in actuallity it is common for a\ndatabase to store many logs, in different files. You may find it easier to\ncompact the log if you split your log across files.\n\n_Implement log compaction for your database._\n\nCongratulations! You have written a fully-functional database.\n\nIf you are curious, now is a good time to start comparing the performance of\nyour key/value store to others, like [sled], [bitcask], [badger], or [RocksDB].\nYou might enjoy investigating their architectures, thinking about how theirs\ncompare to yours, and how architecture affects performance. The next few\nprojects will give you opportunities to optimize.\n\n[sled]: https://github.com/spacejam/sled\n[badger]: https://github.com/dgraph-io/badger\n[RocksDB]: https://rocksdb.org/\n\nNice coding, friend. Enjoy a nice break.\n\n\n<!--\n\n- Potential readings\n  - error handling https://github.com/rust-lang-nursery/rust-cookbook/issues/502#issue-387418261\n\n## TODOs\n\n- should flushing the log be part of the main project or an extension?\n- check terminology\n  - what's the correct term for the in-memory representation of the executed log?\n- is there a term for converting a log to it's permanent format?\n- custom main error handling\n- limits on k/v size?\n- maintaining data integrity on failure\n  - _must_ call flush at least\n- todo: `Result<Option<String>>` vs `Result<String>`\n  - is \"not found\" exit code 0 or !0?\n- error context\n- serialize directly to file stream\n- need readings for WAL\n- add code samples and digarams to illustrate the text and\n  be less monotonous\n- maintain the index file!\n- specify where data should be stored\n- caching the index\n\n-->\n"
  },
  {
    "path": "courses/rust/projects/project-2/src/bin/kvs.rs",
    "content": "use clap::{App, AppSettings, Arg, SubCommand};\nuse kvs::{KvStore, KvsError, Result};\nuse std::env::current_dir;\nuse std::process::exit;\n\nfn main() -> Result<()> {\n    let matches = App::new(env!(\"CARGO_PKG_NAME\"))\n        .version(env!(\"CARGO_PKG_VERSION\"))\n        .author(env!(\"CARGO_PKG_AUTHORS\"))\n        .about(env!(\"CARGO_PKG_DESCRIPTION\"))\n        .setting(AppSettings::DisableHelpSubcommand)\n        .setting(AppSettings::SubcommandRequiredElseHelp)\n        .setting(AppSettings::VersionlessSubcommands)\n        .subcommand(\n            SubCommand::with_name(\"set\")\n                .about(\"Set the value of a string key to a string\")\n                .arg(Arg::with_name(\"KEY\").help(\"A string key\").required(true))\n                .arg(\n                    Arg::with_name(\"VALUE\")\n                        .help(\"The string value of the key\")\n                        .required(true),\n                ),\n        )\n        .subcommand(\n            SubCommand::with_name(\"get\")\n                .about(\"Get the string value of a given string key\")\n                .arg(Arg::with_name(\"KEY\").help(\"A string key\").required(true)),\n        )\n        .subcommand(\n            SubCommand::with_name(\"rm\")\n                .about(\"Remove a given key\")\n                .arg(Arg::with_name(\"KEY\").help(\"A string key\").required(true)),\n        )\n        .get_matches();\n\n    match matches.subcommand() {\n        (\"set\", Some(matches)) => {\n            let key = matches.value_of(\"KEY\").unwrap();\n            let value = matches.value_of(\"VALUE\").unwrap();\n\n            let mut store = KvStore::open(current_dir()?)?;\n            store.set(key.to_string(), value.to_string())?;\n        }\n        (\"get\", Some(matches)) => {\n            let key = matches.value_of(\"KEY\").unwrap();\n\n            let mut store = KvStore::open(current_dir()?)?;\n            if let Some(value) = store.get(key.to_string())? {\n                println!(\"{}\", value);\n            } else {\n                println!(\"Key not found\");\n            }\n        }\n        (\"rm\", Some(matches)) => {\n            let key = matches.value_of(\"KEY\").unwrap();\n\n            let mut store = KvStore::open(current_dir()?)?;\n            match store.remove(key.to_string()) {\n                Ok(()) => {}\n                Err(KvsError::KeyNotFound) => {\n                    println!(\"Key not found\");\n                    exit(1);\n                }\n                Err(e) => return Err(e),\n            }\n        }\n        _ => unreachable!(),\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "courses/rust/projects/project-2/src/error.rs",
    "content": "use failure::Fail;\nuse std::io;\n\n/// Error type for kvs.\n#[derive(Fail, Debug)]\npub enum KvsError {\n    /// IO error.\n    #[fail(display = \"{}\", _0)]\n    Io(#[cause] io::Error),\n    /// Serialization or deserialization error.\n    #[fail(display = \"{}\", _0)]\n    Serde(#[cause] serde_json::Error),\n    /// Removing non-existent key error.\n    #[fail(display = \"Key not found\")]\n    KeyNotFound,\n    /// Unexpected command type error.\n    /// It indicated a corrupted log or a program bug.\n    #[fail(display = \"Unexpected command type\")]\n    UnexpectedCommandType,\n}\n\nimpl From<io::Error> for KvsError {\n    fn from(err: io::Error) -> KvsError {\n        KvsError::Io(err)\n    }\n}\n\nimpl From<serde_json::Error> for KvsError {\n    fn from(err: serde_json::Error) -> KvsError {\n        KvsError::Serde(err)\n    }\n}\n\n/// Result type for kvs.\npub type Result<T> = std::result::Result<T, KvsError>;\n"
  },
  {
    "path": "courses/rust/projects/project-2/src/kv.rs",
    "content": "use std::collections::{BTreeMap, HashMap};\nuse std::fs::{self, File, OpenOptions};\nuse std::io::{self, BufReader, BufWriter, Read, Seek, SeekFrom, Write};\nuse std::ops::Range;\nuse std::path::{Path, PathBuf};\n\nuse serde::{Deserialize, Serialize};\nuse serde_json::Deserializer;\n\nuse crate::{KvsError, Result};\nuse std::ffi::OsStr;\n\nconst COMPACTION_THRESHOLD: u64 = 1024 * 1024;\n\n/// The `KvStore` stores string key/value pairs.\n///\n/// Key/value pairs are persisted to disk in log files. Log files are named after\n/// monotonically increasing generation numbers with a `log` extension name.\n/// A `BTreeMap` in memory stores the keys and the value locations for fast query.\n///\n/// ```rust\n/// # use kvs::{KvStore, Result};\n/// # fn try_main() -> Result<()> {\n/// use std::env::current_dir;\n/// let mut store = KvStore::open(current_dir()?)?;\n/// store.set(\"key\".to_owned(), \"value\".to_owned())?;\n/// let val = store.get(\"key\".to_owned())?;\n/// assert_eq!(val, Some(\"value\".to_owned()));\n/// # Ok(())\n/// # }\n/// ```\npub struct KvStore {\n    // directory for the log and other data.\n    path: PathBuf,\n    // map generation number to the file reader.\n    readers: HashMap<u64, BufReaderWithPos<File>>,\n    // writer of the current log.\n    writer: BufWriterWithPos<File>,\n    current_gen: u64,\n    index: BTreeMap<String, CommandPos>,\n    // the number of bytes representing \"stale\" commands that could be\n    // deleted during a compaction.\n    uncompacted: u64,\n}\n\nimpl KvStore {\n    /// Opens a `KvStore` with the given path.\n    ///\n    /// This will create a new directory if the given one does not exist.\n    ///\n    /// # Errors\n    ///\n    /// It propagates I/O or deserialization errors during the log replay.\n    pub fn open(path: impl Into<PathBuf>) -> Result<KvStore> {\n        let path = path.into();\n        fs::create_dir_all(&path)?;\n\n        let mut readers = HashMap::new();\n        let mut index = BTreeMap::new();\n\n        let gen_list = sorted_gen_list(&path)?;\n        let mut uncompacted = 0;\n\n        for &gen in &gen_list {\n            let mut reader = BufReaderWithPos::new(File::open(log_path(&path, gen))?)?;\n            uncompacted += load(gen, &mut reader, &mut index)?;\n            readers.insert(gen, reader);\n        }\n\n        let current_gen = gen_list.last().unwrap_or(&0) + 1;\n        let writer = new_log_file(&path, current_gen, &mut readers)?;\n\n        Ok(KvStore {\n            path,\n            readers,\n            writer,\n            current_gen,\n            index,\n            uncompacted,\n        })\n    }\n\n    /// Sets the value of a string key to a string.\n    ///\n    /// If the key already exists, the previous value will be overwritten.\n    ///\n    /// # Errors\n    ///\n    /// It propagates I/O or serialization errors during writing the log.\n    pub fn set(&mut self, key: String, value: String) -> Result<()> {\n        let cmd = Command::set(key, value);\n        let pos = self.writer.pos;\n        serde_json::to_writer(&mut self.writer, &cmd)?;\n        self.writer.flush()?;\n        if let Command::Set { key, .. } = cmd {\n            if let Some(old_cmd) = self\n                .index\n                .insert(key, (self.current_gen, pos..self.writer.pos).into())\n            {\n                self.uncompacted += old_cmd.len;\n            }\n        }\n\n        if self.uncompacted > COMPACTION_THRESHOLD {\n            self.compact()?;\n        }\n        Ok(())\n    }\n\n    /// Gets the string value of a given string key.\n    ///\n    /// Returns `None` if the given key does not exist.\n    ///\n    /// # Errors\n    ///\n    /// It returns `KvsError::UnexpectedCommandType` if the given command type unexpected.\n    pub fn get(&mut self, key: String) -> Result<Option<String>> {\n        if let Some(cmd_pos) = self.index.get(&key) {\n            let reader = self\n                .readers\n                .get_mut(&cmd_pos.gen)\n                .expect(\"Cannot find log reader\");\n            reader.seek(SeekFrom::Start(cmd_pos.pos))?;\n            let cmd_reader = reader.take(cmd_pos.len);\n            if let Command::Set { value, .. } = serde_json::from_reader(cmd_reader)? {\n                Ok(Some(value))\n            } else {\n                Err(KvsError::UnexpectedCommandType)\n            }\n        } else {\n            Ok(None)\n        }\n    }\n\n    /// Removes a given key.\n    ///\n    /// # Errors\n    ///\n    /// It returns `KvsError::KeyNotFound` if the given key is not found.\n    ///\n    /// It propagates I/O or serialization errors during writing the log.\n    pub fn remove(&mut self, key: String) -> Result<()> {\n        if self.index.contains_key(&key) {\n            let cmd = Command::remove(key);\n            serde_json::to_writer(&mut self.writer, &cmd)?;\n            self.writer.flush()?;\n            if let Command::Remove { key } = cmd {\n                let old_cmd = self.index.remove(&key).expect(\"key not found\");\n                self.uncompacted += old_cmd.len;\n            }\n            Ok(())\n        } else {\n            Err(KvsError::KeyNotFound)\n        }\n    }\n\n    /// Clears stale entries in the log.\n    pub fn compact(&mut self) -> Result<()> {\n        // increase current gen by 2. current_gen + 1 is for the compaction file.\n        let compaction_gen = self.current_gen + 1;\n        self.current_gen += 2;\n        self.writer = self.new_log_file(self.current_gen)?;\n\n        let mut compaction_writer = self.new_log_file(compaction_gen)?;\n\n        let mut new_pos = 0; // pos in the new log file.\n        for cmd_pos in &mut self.index.values_mut() {\n            let reader = self\n                .readers\n                .get_mut(&cmd_pos.gen)\n                .expect(\"Cannot find log reader\");\n            if reader.pos != cmd_pos.pos {\n                reader.seek(SeekFrom::Start(cmd_pos.pos))?;\n            }\n\n            let mut entry_reader = reader.take(cmd_pos.len);\n            let len = io::copy(&mut entry_reader, &mut compaction_writer)?;\n            *cmd_pos = (compaction_gen, new_pos..new_pos + len).into();\n            new_pos += len;\n        }\n        compaction_writer.flush()?;\n\n        // remove stale log files.\n        let stale_gens: Vec<_> = self\n            .readers\n            .keys()\n            .filter(|&&gen| gen < compaction_gen)\n            .cloned()\n            .collect();\n        for stale_gen in stale_gens {\n            self.readers.remove(&stale_gen);\n            fs::remove_file(log_path(&self.path, stale_gen))?;\n        }\n        self.uncompacted = 0;\n\n        Ok(())\n    }\n\n    /// Create a new log file with given generation number and add the reader to the readers map.\n    ///\n    /// Returns the writer to the log.\n    fn new_log_file(&mut self, gen: u64) -> Result<BufWriterWithPos<File>> {\n        new_log_file(&self.path, gen, &mut self.readers)\n    }\n}\n\n/// Create a new log file with given generation number and add the reader to the readers map.\n///\n/// Returns the writer to the log.\nfn new_log_file(\n    path: &Path,\n    gen: u64,\n    readers: &mut HashMap<u64, BufReaderWithPos<File>>,\n) -> Result<BufWriterWithPos<File>> {\n    let path = log_path(&path, gen);\n    let writer = BufWriterWithPos::new(\n        OpenOptions::new()\n            .create(true)\n            .write(true)\n            .append(true)\n            .open(&path)?,\n    )?;\n    readers.insert(gen, BufReaderWithPos::new(File::open(&path)?)?);\n    Ok(writer)\n}\n\n/// Returns sorted generation numbers in the given directory.\nfn sorted_gen_list(path: &Path) -> Result<Vec<u64>> {\n    let mut gen_list: Vec<u64> = fs::read_dir(&path)?\n        .flat_map(|res| -> Result<_> { Ok(res?.path()) })\n        .filter(|path| path.is_file() && path.extension() == Some(\"log\".as_ref()))\n        .flat_map(|path| {\n            path.file_name()\n                .and_then(OsStr::to_str)\n                .map(|s| s.trim_end_matches(\".log\"))\n                .map(str::parse::<u64>)\n        })\n        .flatten()\n        .collect();\n    gen_list.sort_unstable();\n    Ok(gen_list)\n}\n\n/// Load the whole log file and store value locations in the index map.\n///\n/// Returns how many bytes can be saved after a compaction.\nfn load(\n    gen: u64,\n    reader: &mut BufReaderWithPos<File>,\n    index: &mut BTreeMap<String, CommandPos>,\n) -> Result<u64> {\n    // To make sure we read from the beginning of the file.\n    let mut pos = reader.seek(SeekFrom::Start(0))?;\n    let mut stream = Deserializer::from_reader(reader).into_iter::<Command>();\n    let mut uncompacted = 0; // number of bytes that can be saved after a compaction.\n    while let Some(cmd) = stream.next() {\n        let new_pos = stream.byte_offset() as u64;\n        match cmd? {\n            Command::Set { key, .. } => {\n                if let Some(old_cmd) = index.insert(key, (gen, pos..new_pos).into()) {\n                    uncompacted += old_cmd.len;\n                }\n            }\n            Command::Remove { key } => {\n                if let Some(old_cmd) = index.remove(&key) {\n                    uncompacted += old_cmd.len;\n                }\n                // the \"remove\" command itself can be deleted in the next compaction.\n                // so we add its length to `uncompacted`.\n                uncompacted += new_pos - pos;\n            }\n        }\n        pos = new_pos;\n    }\n    Ok(uncompacted)\n}\n\nfn log_path(dir: &Path, gen: u64) -> PathBuf {\n    dir.join(format!(\"{}.log\", gen))\n}\n\n/// Struct representing a command.\n#[derive(Serialize, Deserialize, Debug)]\nenum Command {\n    Set { key: String, value: String },\n    Remove { key: String },\n}\n\nimpl Command {\n    fn set(key: String, value: String) -> Command {\n        Command::Set { key, value }\n    }\n\n    fn remove(key: String) -> Command {\n        Command::Remove { key }\n    }\n}\n\n/// Represents the position and length of a json-serialized command in the log.\nstruct CommandPos {\n    gen: u64,\n    pos: u64,\n    len: u64,\n}\n\nimpl From<(u64, Range<u64>)> for CommandPos {\n    fn from((gen, range): (u64, Range<u64>)) -> Self {\n        CommandPos {\n            gen,\n            pos: range.start,\n            len: range.end - range.start,\n        }\n    }\n}\n\nstruct BufReaderWithPos<R: Read + Seek> {\n    reader: BufReader<R>,\n    pos: u64,\n}\n\nimpl<R: Read + Seek> BufReaderWithPos<R> {\n    fn new(mut inner: R) -> Result<Self> {\n        let pos = inner.seek(SeekFrom::Current(0))?;\n        Ok(BufReaderWithPos {\n            reader: BufReader::new(inner),\n            pos,\n        })\n    }\n}\n\nimpl<R: Read + Seek> Read for BufReaderWithPos<R> {\n    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {\n        let len = self.reader.read(buf)?;\n        self.pos += len as u64;\n        Ok(len)\n    }\n}\n\nimpl<R: Read + Seek> Seek for BufReaderWithPos<R> {\n    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {\n        self.pos = self.reader.seek(pos)?;\n        Ok(self.pos)\n    }\n}\n\nstruct BufWriterWithPos<W: Write + Seek> {\n    writer: BufWriter<W>,\n    pos: u64,\n}\n\nimpl<W: Write + Seek> BufWriterWithPos<W> {\n    fn new(mut inner: W) -> Result<Self> {\n        let pos = inner.seek(SeekFrom::Current(0))?;\n        Ok(BufWriterWithPos {\n            writer: BufWriter::new(inner),\n            pos,\n        })\n    }\n}\n\nimpl<W: Write + Seek> Write for BufWriterWithPos<W> {\n    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n        let len = self.writer.write(buf)?;\n        self.pos += len as u64;\n        Ok(len)\n    }\n\n    fn flush(&mut self) -> io::Result<()> {\n        self.writer.flush()\n    }\n}\n\nimpl<W: Write + Seek> Seek for BufWriterWithPos<W> {\n    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {\n        self.pos = self.writer.seek(pos)?;\n        Ok(self.pos)\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-2/src/lib.rs",
    "content": "#![deny(missing_docs)]\n//! A simple key/value store.\n\npub use error::{KvsError, Result};\npub use kv::KvStore;\n\nmod error;\nmod kv;\n"
  },
  {
    "path": "courses/rust/projects/project-2/tests/tests.rs",
    "content": "use assert_cmd::prelude::*;\nuse kvs::{KvStore, Result};\nuse predicates::ord::eq;\nuse predicates::str::{contains, is_empty, PredicateStrExt};\nuse std::process::Command;\nuse tempfile::TempDir;\nuse walkdir::WalkDir;\n\n// `kvs` with no args should exit with a non-zero code.\n#[test]\nfn cli_no_args() {\n    Command::cargo_bin(\"kvs\").unwrap().assert().failure();\n}\n\n// `kvs -V` should print the version\n#[test]\nfn cli_version() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"-V\"])\n        .assert()\n        .stdout(contains(env!(\"CARGO_PKG_VERSION\")));\n}\n\n// `kvs get <KEY>` should print \"Key not found\" for a non-existent key and exit with zero.\n#[test]\nfn cli_get_non_existent_key() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"get\", \"key1\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(eq(\"Key not found\").trim());\n}\n\n// `kvs rm <KEY>` should print \"Key not found\" for an empty database and exit with non-zero code.\n#[test]\nfn cli_rm_non_existent_key() {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"rm\", \"key1\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure()\n        .stdout(eq(\"Key not found\").trim());\n}\n\n// `kvs set <KEY> <VALUE>` should print nothing and exit with zero.\n#[test]\nfn cli_set() {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"set\", \"key1\", \"value1\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n}\n\n#[test]\nfn cli_get_stored() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n\n    let mut store = KvStore::open(temp_dir.path())?;\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    store.set(\"key2\".to_owned(), \"value2\".to_owned())?;\n    drop(store);\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"get\", \"key1\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(eq(\"value1\").trim());\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"get\", \"key2\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(eq(\"value2\").trim());\n\n    Ok(())\n}\n\n// `kvs rm <KEY>` should print nothing and exit with zero.\n#[test]\nfn cli_rm_stored() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n\n    let mut store = KvStore::open(temp_dir.path())?;\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    drop(store);\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"rm\", \"key1\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"get\", \"key1\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(eq(\"Key not found\").trim());\n\n    Ok(())\n}\n\n#[test]\nfn cli_invalid_get() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"get\"])\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"get\", \"extra\", \"field\"])\n        .assert()\n        .failure();\n}\n\n#[test]\nfn cli_invalid_set() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"set\"])\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"set\", \"missing_field\"])\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"set\", \"extra\", \"extra\", \"field\"])\n        .assert()\n        .failure();\n}\n\n#[test]\nfn cli_invalid_rm() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"rm\"])\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"rm\", \"extra\", \"field\"])\n        .assert()\n        .failure();\n}\n\n#[test]\nfn cli_invalid_subcommand() {\n    Command::cargo_bin(\"kvs\")\n        .unwrap()\n        .args(&[\"unknown\", \"subcommand\"])\n        .assert()\n        .failure();\n}\n\n// Should get previously stored value.\n#[test]\nfn get_stored_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    store.set(\"key2\".to_owned(), \"value2\".to_owned())?;\n\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value1\".to_owned()));\n    assert_eq!(store.get(\"key2\".to_owned())?, Some(\"value2\".to_owned()));\n\n    // Open from disk again and check persistent data.\n    drop(store);\n    let mut store = KvStore::open(temp_dir.path())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value1\".to_owned()));\n    assert_eq!(store.get(\"key2\".to_owned())?, Some(\"value2\".to_owned()));\n\n    Ok(())\n}\n\n// Should overwrite existent value.\n#[test]\nfn overwrite_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value1\".to_owned()));\n    store.set(\"key1\".to_owned(), \"value2\".to_owned())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value2\".to_owned()));\n\n    // Open from disk again and check persistent data.\n    drop(store);\n    let mut store = KvStore::open(temp_dir.path())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value2\".to_owned()));\n    store.set(\"key1\".to_owned(), \"value3\".to_owned())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value3\".to_owned()));\n\n    Ok(())\n}\n\n// Should get `None` when getting a non-existent key.\n#[test]\nfn get_non_existent_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    assert_eq!(store.get(\"key2\".to_owned())?, None);\n\n    // Open from disk again and check persistent data.\n    drop(store);\n    let mut store = KvStore::open(temp_dir.path())?;\n    assert_eq!(store.get(\"key2\".to_owned())?, None);\n\n    Ok(())\n}\n\n#[test]\nfn remove_non_existent_key() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n    assert!(store.remove(\"key1\".to_owned()).is_err());\n    Ok(())\n}\n\n#[test]\nfn remove_key() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    assert!(store.remove(\"key1\".to_owned()).is_ok());\n    assert_eq!(store.get(\"key1\".to_owned())?, None);\n    Ok(())\n}\n\n// Insert data until total size of the directory decreases.\n// Test data correctness after compaction.\n#[test]\nfn compaction() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n\n    let dir_size = || {\n        let entries = WalkDir::new(temp_dir.path()).into_iter();\n        let len: walkdir::Result<u64> = entries\n            .map(|res| {\n                res.and_then(|entry| entry.metadata())\n                    .map(|metadata| metadata.len())\n            })\n            .sum();\n        len.expect(\"fail to get directory size\")\n    };\n\n    let mut current_size = dir_size();\n    for iter in 0..1000 {\n        for key_id in 0..1000 {\n            let key = format!(\"key{}\", key_id);\n            let value = format!(\"{}\", iter);\n            store.set(key, value)?;\n        }\n\n        let new_size = dir_size();\n        if new_size > current_size {\n            current_size = new_size;\n            continue;\n        }\n        // Compaction triggered.\n\n        drop(store);\n        // reopen and check content.\n        let mut store = KvStore::open(temp_dir.path())?;\n        for key_id in 0..1000 {\n            let key = format!(\"key{}\", key_id);\n            assert_eq!(store.get(key)?, Some(format!(\"{}\", iter)));\n        }\n        return Ok(());\n    }\n\n    panic!(\"No compaction detected\");\n}\n"
  },
  {
    "path": "courses/rust/projects/project-3/Cargo.toml",
    "content": "[package]\nname = \"kvs\"\nversion = \"0.1.0\"\nauthors = [\"Yilin Chen <sticnarf@gmail.com>\"]\ndescription = \"A key-value store\"\nedition = \"2018\"\n\n[dependencies]\nclap = \"2.33.0\"\nstructopt = \"0.2.15\"\nfailure = \"0.1.5\"\nserde = { version = \"1.0.89\", features = [\"derive\"] }\nserde_json = \"1.0.39\"\nlog = \"0.4.6\"\nenv_logger = \"0.6.1\"\nsled = \"0.34.6\"\n\n[dev-dependencies]\nassert_cmd = \"0.11\"\ncriterion = \"0.3\"\npredicates = \"1.0.0\"\nrand = \"0.6.5\"\ntempfile = \"3.0.7\"\nwalkdir = \"2.2.7\"\n\n[[bench]]\nname = \"engine_bench\"\nharness = false"
  },
  {
    "path": "courses/rust/projects/project-3/README.md",
    "content": "# PNA Rust Project 3: Synchronous client-server networking\n\n**Task**: Create a _single-threaded_, persistent key/value store _server and client\nwith synchronous networking over a custom protocol_.\n\n**Goals**:\n\n- Create a client-server application\n- Write a custom protocol with `std` networking APIs\n- Introduce logging to the server\n- Implement pluggable backends with traits\n- Benchmark the hand-written backend against `sled`\n\n**Topics**: `std::net`, logging, traits, benchmarking.\n\n<!-- TODO **Extensions**: shutdown on signal. -->\n\n- [Introduction](#user-content-introduction)\n- [Project spec](#user-content-project-spec)\n- [Project setup](#user-content-project-setup)\n- [Part 1: Command line parsing](#user-content-part-1-command-line-parsing)\n- [Part 2: Logging](#user-content-part-2-logging)\n- [Part 3: Client-server networking setup](#user-content-part-3-client-server-networking-setup)\n- [Part 4: Implementing commands across the network](#user-content-part-4-implementing-commands-across-the-network)\n- [Part 5: Pluggable storage engines](#user-content-part-5-pluggable-storage-engines)\n- [Part 6: Benchmarking](#user-content-part-6-benchmarking)\n\n## Introduction\n\nIn this project you will create a simple key/value server and client. They will\ncommunicate with a custom networking protocol of your design. You will emit logs\nusing standard logging crates, and handle errors correctly across the network\nboundary. Once you have a working client-server architecture,\nthen you will abstract the storage engine behind traits, and compare\nthe performance of yours to the [`sled`] engine.\n\n## Project spec\n\nThe cargo project, `kvs`, builds a command-line key-value store client called\n`kvs-client`, and a key-value store server called `kvs-server`, both of which in\nturn call into a library called `kvs`. The client speaks to the server over\na custom protocol.\n\nThe `kvs-server` executable supports the following command line arguments:\n\n- `kvs-server [--addr IP-PORT] [--engine ENGINE-NAME]`\n\n  Start the server and begin listening for incoming connections. `--addr`\n  accepts an IP address, either v4 or v6, and a port number, with the format\n  `IP:PORT`. If `--addr` is not specified then listen on `127.0.0.1:4000`.\n\n  If `--engine` is specified, then `ENGINE-NAME` must be either \"kvs\", in which\n  case the built-in engine is used, or \"sled\", in which case sled is used. If\n  this is the first run (there is no data previously persisted) then the default\n  value is \"kvs\"; if there is previously persisted data then the default is the\n  engine already in use. If data was previously persisted with a different\n  engine than selected, print an error and exit with a non-zero exit code.\n\n  Print an error and return a non-zero exit code on failure to bind a socket, if\n  `ENGINE-NAME` is invalid, if `IP-PORT` does not parse as an address.\n\n- `kvs-server -V`\n\n  Print the version.\n\nThe `kvs-client` executable supports the following command line arguments:\n\n- `kvs-client set <KEY> <VALUE> [--addr IP-PORT]`\n\n  Set the value of a string key to a string.\n\n  `--addr` accepts an IP address, either v4 or v6, and a port number, with the\n  format `IP:PORT`. If `--addr` is not specified then connect on\n  `127.0.0.1:4000`.\n\n  Print an error and return a non-zero exit code on server error,\n  or if `IP-PORT` does not parse as an address.\n\n- `kvs-client get <KEY> [--addr IP-PORT]`\n\n  Get the string value of a given string key.\n\n  `--addr` accepts an IP address, either v4 or v6, and a port number, with the\n  format `IP:PORT`. If `--addr` is not specified then connect on\n  `127.0.0.1:4000`.\n\n  Print an error and return a non-zero exit code on server error,\n  or if `IP-PORT` does not parse as an address.\n\n- `kvs-client rm <KEY> [--addr IP-PORT]`\n\n  Remove a given string key.\n\n  `--addr` accepts an IP address, either v4 or v6, and a port number, with the\n  format `IP:PORT`. If `--addr` is not specified then connect on\n  `127.0.0.1:4000`.\n\n  Print an error and return a non-zero exit code on server error,\n  or if `IP-PORT` does not parse as an address. A \"key not found\" is also\n  treated as an error in the \"rm\" command.\n\n- `kvs-client -V`\n\n  Print the version.\n\nAll error messages should be printed to stderr.\n\nThe `kvs` library contains four types:\n\n- `KvsClient` - implements the functionality required for `kvs-client` to speak\n  to `kvs-server`\n- `KvsServer` - implements the functionality to serve responses to `kvs-client`\n  from `kvs-server`\n- `KvsEngine` trait - defines the storage interface called by `KvsServer`\n- `KvStore` - implements by hand the `KvsEngine` trait\n- `SledKvsEngine` - implements `KvsEngine` for the [`sled`] storage engine.\n\n[`sled`]: https://github.com/spacejam/sled\n\nThe design of `KvsClient` and `KvsServer` are up to you, and will be informed by\nthe design of your network protocol. The test suite does not directly use either\ntype, but only exercises them via the CLI.\n\nThe `KvsEngine` trait supports the following methods:\n\n- `KvsEngine::set(&mut self, key: String, value: String) -> Result<()>`\n\n  Set the value of a string key to a string.\n\n  Return an error if the value is not written successfully.\n\n- `KvsEngine::get(&mut self, key: String) -> Result<Option<String>>`\n\n  Get the string value of a string key.\n  If the key does not exist, return `None`.\n\n  Return an error if the value is not read successfully.\n\n- `KvsEngine::remove(&mut self, key: String) -> Result<()>`\n\n  Remove a given string key.\n\n  Return an error if the key does not exit or value is not read successfully.\n\nWhen setting a key to a value, `KvStore` writes the `set` command to disk in\na sequential log. When removing a key, `KvStore` writes the `rm` command to\nthe log. On startup, the commands in the log are re-evaluated and the\nlog pointer (file offset) of the last command to set each key recorded in the\nin-memory index.\n\nWhen retrieving a value for a key with the `get` command, it searches the index,\nand if found then loads from the log, and evaluates, the command at the\ncorresponding log pointer.\n\nWhen the size of the uncompacted log entries reach a given threshold, `KvStore`\ncompacts it into a new log, removing redundant entries to reclaim disk space.\n\n\n\n## Project setup\n\nContinuing from your previous project, delete your previous `tests` directory and\ncopy this project's `tests` directory into its place. This project should\ncontain a library named `kvs`, and two executables, `kvs-server` and\n`kvs-client`. <!-- TODO explain how to reconcile the two bins with the existing\ncode -->\n\nYou need the following dev-dependencies in your `Cargo.toml`:\n\n```toml\n[dev-dependencies]\nassert_cmd = \"0.11\"\ncriterion = \"0.3\"\npredicates = \"1.0.0\"\nrand = \"0.6.5\"\ntempfile = \"3.0.7\"\nwalkdir = \"2.2.7\"\n```\n\nAs with previous projects, add enough definitions that the test suite builds.\n\n\n## Part 1: Command line parsing\n\nThere's little new about the command line parsing in this project compared to\nprevious projects. The `kvs-client` binary accepts the same command line\narguments as in previous projects. And now `kvs-server` has its own set of\ncommand line arguments to handle, as described previously in the spec.\n\n_Stub out the `kvs-server` command line handling._\n\n\n## Part 2: Logging\n\nProduction server applications tend to have robust and configurable logging. So\nnow we're going to add logging to `kvs-server`, and as we continue will look\nfor useful information to log. During development it is common to use logging\nat the `debug!` and `trace!` levels for \"println debugging\".\n\nThere are two prominent logging systems in Rust: [`log`] and [`slog`]. Both\nexport similar macros for logging at different levels, like `error!`, `info!`\netc. Both are extensible, supporting different backends, for logging to the\nconsole, logging to file, logging to the system log, etc.\n\n[`log`]: https://docs.rs/log/\n[`slog`]: https://docs.rs/slog/\n\nThe major difference is that `log` is fairly simple, logging only formatted\nstrings; `slog` is feature-rich, and supports \"structured logging\", where log\nentries are typed and serialized in easily-parsed formats.\n\n`log` dates from the very earliest days of Rust, where it was part of the\ncompiler, then part of the standard library, and finally released as its own\ncrate. It is maintained by the Rust Project. `slog` is newer and maintained\nindependently. Both are widely used.\n\nFor both systems, one needs to select a \"sink\" crate, one that the logger\nsends logs to for display or storage.\n\n_Read about both of them, choose the one that appeals to you, add them as\ndependencies, then modify `kvs-server` to initialize logging on startup, prior\nto command-line parsing._ Set it up to output to stderr (sending the logs\nelsewhere additionally is fine, but they must go to stderr to pass the tests in\nthis project).\n\nOn startup log the server's version number. Also log the configuration. For now\nthat means the IP address and port, and the name of the storage engine.\n\n\n## Part 3: Client-server networking setup\n\nNext we're going to set up the networking. For this project you are going to be\nusing the basic TCP/IP networking APIs in `std::net`: [`TcpListener`] and\n[`TcpStream`].\n\n[`TcpListener`]: https://doc.rust-lang.org/std/net/struct.TcpListener.html\n[`TcpStream`]: https://doc.rust-lang.org/std/net/struct.TcpStream.html\n\nFor this project, the server is synchronous and single-threaded. That means that\nyou will listen on a socket, then accept connections, and execute and respond to\ncommands one at a time. In the future we will re-visit this decision multiple\ntimes on our journey toward an asynchronous, multi-threaded, and\nhigh-performance database.\n\nThink about your manual testing workflow. Now that there are two executables to\ndeal with, you'll need a way to run them both at the same time. If you are like\nmany, you will use two terminals, running `cargo run --bin kvs-server` in\none, where it runs until you press CTRL-D, and `cargo run --bin kvs-client`\nin the other.\n\nThis is a good opportunity to use the logging macros for debugging. Go ahead and\nlog information about every accepted connection.\n\n_Before thinking about the protocol, modify `kvs-server` to listen\nfor and accept connections, and `kvs-client` to initiate connections._\n\n\n## Part 4: Implementing commands across the network\n\nIn the last project you defined the commands your database accepts, and learned\nhow to serialize and deserialize them to and from the log with `serde`.\n\n<!-- the above is to hint that they already have the two tools they need -->\n\nNow it's time to implement the key/value store over the network, remotely\nexecuting commands that until now have been implemented within a single process.\nAs with the file I/O you worked on in the last project to create the log, you\nwill be serializing and streaming commands with the `Read` and `Write` traits.\n\nYou are going to design a network protocol. There are a number of ways to get\ndata in and out of a TCP stream, and a number of decisions to make. Is it a\ntext-based protocol, binary? How is the data translated from its format in\nmemory to its format byte-stream format? Is there a single request per\nconnection, or many?\n\nKeep in mind that it must support successful results and errors, and there are\ntwo kinds of errors now: the ones generated by your storage engine, as well as\nnetwork errors.\n\nAll the details of the protocol are up to you. The test suite does not care at\nall how the data gets from one end to the other, just that the results are\ncorrect.\n\n_Write your network protocol._\n\n\n<!-- ## Part 5: More error handling\n\nTODO write this section\n\n- handle error responses by converting errors to a serializable format\n- add context to errors\n- replace `fn main() -> Result` with custom error reporting\n-->\n\n\n## Part 5: Pluggable storage engines\n\nYour database has a storage engine, `KvStore`, implemented by you.\nNow you are going to add a second storage engine.\n\nThere are multiple reasons to do so:\n\n- Different workloads require different performance characteristics. Some\n  storage engines may work better than other based on the workload.\n\n- It creates a familiar framework for comparing different backends.\n\n- It gives us an excuse to create and work with traits.\n\n- It gives us an excuse to write some comparative benchmarks!\n\nSo you are going to _extract_ a new trait, `KvsEngine`, from the `KvStore`\ninterface. This is a classic _refactoring_, where existing code is transformed\ninto a new form incrementally. When refactoring you will generally want to break\nthe work up into the smallest changes that will continue to build and work.\n\nHere is the API you need to end up with:\n\n- `trait KvsEngine` has `get`, `set` and `remove` methods with the same signatures\n  as `KvStore`.\n\n- `KvStore` implements `KvsEngine`, and no longer has `get`, `set` and `remove`\n  methods of its own.\n\n- There is a new implementation of `KvsEngine`, `SledKvsEngine`. You need to fill\n  its `get` and `set` methods using the `sled` library later.\n\nIt's likely that you have already stubbed out the definitions for these if your\ntests are building. _Now is the time to fill them in._ Break down your\nrefactoring into an intentional sequence of changes, and make sure the project\ncontinues to build and pass previously-passing tests before continuing.\n\nAs one final step, you need to consider what happens when `kvs-server` is\nstarted with one engine, is killed, then restarted with a different engine. This\ncase can only result in an error, and you need to figure out how to detect the\ncase to report the error. The test `cli_wrong_engine` reflects this scenario.\n\n\n## Part 6: Benchmarking\n\nAs the course progresses we will increasingly concern ourselves with the\nperformance of the database, exploring the impact of different architectures.\nYou are encouraged to go beyond the model described herein and experiment with\nyour own optimizations.\n\nPerformance work requires benchmarking, so now we're going to get started\non that. There are many ways to benchmark databases, with standard test\nsuites like [ycsb] and [sysbench]. In Rust benchmarking starts with\nthe builtin tooling, so we will start there.\n\n[ycsb]: https://github.com/brianfrankcooper/YCSB\n[sysbench]: https://github.com/akopytov/sysbench\n\nCargo supports benchmarking with `cargo bench`. The benchmarks may either be\nwritten using Rust's built in benchmark harness, or an external one.\n\nThe built-in harness creates benchmarks from functions with the `#[bench]`\nattribute. It cannot be used on the Rust stable channel though, and is only\ndocumented briefly in [the unstable book][tb] and the [`test` crate docs][tc].\nIt is though widely used throughout the Rust ecosystem &mdash; crates that use\nit, even if they compile with stable releases, do benchmarking with nightly\nreleases.\n\n[tb]: https://doc.rust-lang.org/stable/unstable-book/library-features/test.html\n[tc]: https://doc.rust-lang.org/stable/test/index.html\n\nThat system though is effectively deprecated &mdash; it is not being updated and\nwill seemingly never be promoted to the stable release channel.\n\nThere are better benchmark harnesses for Rust anyway. The one you will use is\n[criterion]. And you will use it to satisfy your curiosity about the\nperformance of your `kvs` engine compared to the `sled` engine.\n\nThese benchmarking tools work by defining a benchmarking function, and within\nthat function iterating through a loop that performs the operation to be\nbenchmarking. The benchmarking tool will iterate as many times as it needs to in\norder to know the duration of the operation with statistical significance.\n\nSee this basic example from the criterion guide:\n\n```rust\nfn criterion_benchmark(c: &mut Criterion) {\n    c.bench_function(\"fib 20\", |b| {\n\t    b.iter(|| {\n\t\t    fibonacci(20)\n\t\t});\n\t});\n}\n```\n\nThe call to `bench_function` defines the benchmark, and the call to `iter`\ndefines the code that is run for the benchmark. Code before and after the call\nto `iter` is not timed.\n\n[criterion]: https://docs.rs/criterion\n\nPrepare for writing benchmarks by creating a file called `benches/benches.rs`.\nLike `tests/tests.rs`, cargo will automatically find this file and compile it as\na benchmark.\n\nStart by writing the following benchmarks:\n\n- `kvs_write` - With the kvs engine, write 100 values with random keys of length\n  1-100000 bytes and random values of length 1-100000 bytes.\n\n- `sled_write`- With the sled engine, write 100 values with random keys of\n  length 1-100000 bytes and random values of length 1-100000 bytes.\n\n- `kvs_read` - With the kvs engine, read 1000 values from previously written keys,\n  with keys and values of random length.\n\n- `sled_read` - With the sled engine, read 1000 values from previously written keys,\n  with keys and values of random length.\n\n(As an alternative to writing 4 benchmarks, you may also choose to write 2\nbenchmarks parameterized over the engine, as [described in the criterion\nmanual][pb]).\n\n[pb]: https://bheisler.github.io/criterion.rs/book/user_guide/benchmarking_with_inputs.html\n\nThese are underspecified, and there's a fair bit of nuance to implementing them\nin a useful way. We need to consider at least three factors:\n\n- What code should be timed (and be written inside the benchmark loop), and what\n  code should not (and be written outside the benchmark loop)?\n\n- How to make the loop run identically for each iteration, despite using\n  \"random\" numbers.\n\n- In the \"read\" benchmarks, how to read from the same set of \"random\" keys\n  that were written previously.\n\nThese are all inter-related: some code needs to be carefully selected as\nun-timed setup code, and the seed values for random number generators need\nto be re-used appropriately.\n\nIn all cases, operations that may return errors should assert (with `assert!`)\nthat they did not return an error; and in the read case, \"get\" operations should\nassert that the key was found.\n\nRandom numbers can be generated with the [`rand`] crate.\n\n[`rand`]: https://docs.rs/crate/rand/\n\nOnce you have your benchmarks, run them with `cargo bench`.\n\n_Write the above benchmarks, and compare the results between `kvs` and `sled`._\n\n_Note: please run the benchmarks on an otherwise unloaded machine. Benchmark\nresults are very sensitive to the environment they are run in, and while the\ncriterion library does its best to compensate for \"noise\", benchmarks are best\ndone on a clean machine without other active processes. If you have a spare\nmachine just for development, use that. If not, an AWS or other cloud instance\nmay produce more consistent results than your local desktop._\n\n<!-- TODO: criterion output example -->\n\nNice coding, friend. Enjoy a nice break.\n\n\n<!-- TODO\n## Extension 1: Signal handling\n\n- Shutdown on KILL\n- TODO need to figure out how to interrupt the tcp listener\n-->\n\n<!--\n\n## Background reading ideas\n\n- log docs\n- slog docs\n- TCP/IP basics\n- refactoring overview\n- traits and impl trait\n- https://bheisler.github.io/post/benchmarking-with-criterion-rs/\n- general overview of benchmarking\n- conditional compilation of engines?\n\n## TODOs\n\n- consider `Kvs_Engine_` trait vs `Kv_Store_` impl\n\n-->\n"
  },
  {
    "path": "courses/rust/projects/project-3/benches/engine_bench.rs",
    "content": "use criterion::{criterion_group, criterion_main, BatchSize, Criterion};\nuse kvs::{KvStore, KvsEngine, SledKvsEngine};\nuse rand::prelude::*;\nuse sled;\nuse tempfile::TempDir;\n\nfn set_bench(c: &mut Criterion) {\n    let mut group = c.benchmark_group(\"set_bench\");\n    group.bench_function(\"kvs\", |b| {\n        b.iter_batched(\n            || {\n                let temp_dir = TempDir::new().unwrap();\n                (KvStore::open(temp_dir.path()).unwrap(), temp_dir)\n            },\n            |(mut store, _temp_dir)| {\n                for i in 1..(1 << 12) {\n                    store.set(format!(\"key{}\", i), \"value\".to_string()).unwrap();\n                }\n            },\n            BatchSize::SmallInput,\n        )\n    });\n    group.bench_function(\"sled\", |b| {\n        b.iter_batched(\n            || {\n                let temp_dir = TempDir::new().unwrap();\n                (SledKvsEngine::new(sled::open(&temp_dir).unwrap()), temp_dir)\n            },\n            |(mut db, _temp_dir)| {\n                for i in 1..(1 << 12) {\n                    db.set(format!(\"key{}\", i), \"value\".to_string()).unwrap();\n                }\n            },\n            BatchSize::SmallInput,\n        )\n    });\n    group.finish();\n}\n\nfn get_bench(c: &mut Criterion) {\n    let mut group = c.benchmark_group(\"get_bench\");\n    for i in &vec![8, 12, 16, 20] {\n        group.bench_with_input(format!(\"kvs_{}\", i), i, |b, i| {\n            let temp_dir = TempDir::new().unwrap();\n            let mut store = KvStore::open(temp_dir.path()).unwrap();\n            for key_i in 1..(1 << i) {\n                store\n                    .set(format!(\"key{}\", key_i), \"value\".to_string())\n                    .unwrap();\n            }\n            let mut rng = SmallRng::from_seed([0; 16]);\n            b.iter(|| {\n                store\n                    .get(format!(\"key{}\", rng.gen_range(1, 1 << i)))\n                    .unwrap();\n            })\n        });\n    }\n    for i in &vec![8, 12, 16, 20] {\n        group.bench_with_input(format!(\"sled_{}\", i), i, |b, i| {\n            let temp_dir = TempDir::new().unwrap();\n            let mut db = SledKvsEngine::new(sled::open(&temp_dir).unwrap());\n            for key_i in 1..(1 << i) {\n                db.set(format!(\"key{}\", key_i), \"value\".to_string())\n                    .unwrap();\n            }\n            let mut rng = SmallRng::from_seed([0; 16]);\n            b.iter(|| {\n                db.get(format!(\"key{}\", rng.gen_range(1, 1 << i))).unwrap();\n            })\n        });\n    }\n    group.finish();\n}\n\ncriterion_group!(benches, set_bench, get_bench);\ncriterion_main!(benches);\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/bin/kvs-client.rs",
    "content": "use clap::AppSettings;\nuse kvs::{KvsClient, Result};\nuse std::net::SocketAddr;\nuse std::process::exit;\nuse structopt::StructOpt;\n\nconst DEFAULT_LISTENING_ADDRESS: &str = \"127.0.0.1:4000\";\nconst ADDRESS_FORMAT: &str = \"IP:PORT\";\n\n#[derive(StructOpt, Debug)]\n#[structopt(\n    name = \"kvs-client\",\n    raw(global_settings = \"&[\\\n                           AppSettings::DisableHelpSubcommand,\\\n                           AppSettings::VersionlessSubcommands]\")\n)]\nstruct Opt {\n    #[structopt(subcommand)]\n    command: Command,\n}\n\n#[derive(StructOpt, Debug)]\nenum Command {\n    #[structopt(name = \"get\", about = \"Get the string value of a given string key\")]\n    Get {\n        #[structopt(name = \"KEY\", help = \"A string key\")]\n        key: String,\n        #[structopt(\n            long,\n            help = \"Sets the server address\",\n            raw(value_name = \"ADDRESS_FORMAT\"),\n            raw(default_value = \"DEFAULT_LISTENING_ADDRESS\"),\n            parse(try_from_str)\n        )]\n        addr: SocketAddr,\n    },\n    #[structopt(name = \"set\", about = \"Set the value of a string key to a string\")]\n    Set {\n        #[structopt(name = \"KEY\", help = \"A string key\")]\n        key: String,\n        #[structopt(name = \"VALUE\", help = \"The string value of the key\")]\n        value: String,\n        #[structopt(\n            long,\n            help = \"Sets the server address\",\n            raw(value_name = \"ADDRESS_FORMAT\"),\n            raw(default_value = \"DEFAULT_LISTENING_ADDRESS\"),\n            parse(try_from_str)\n        )]\n        addr: SocketAddr,\n    },\n    #[structopt(name = \"rm\", about = \"Remove a given string key\")]\n    Remove {\n        #[structopt(name = \"KEY\", help = \"A string key\")]\n        key: String,\n        #[structopt(\n            long,\n            help = \"Sets the server address\",\n            raw(value_name = \"ADDRESS_FORMAT\"),\n            raw(default_value = \"DEFAULT_LISTENING_ADDRESS\"),\n            parse(try_from_str)\n        )]\n        addr: SocketAddr,\n    },\n}\n\nfn main() {\n    let opt = Opt::from_args();\n    if let Err(e) = run(opt) {\n        eprintln!(\"{}\", e);\n        exit(1);\n    }\n}\n\nfn run(opt: Opt) -> Result<()> {\n    match opt.command {\n        Command::Get { key, addr } => {\n            let mut client = KvsClient::connect(addr)?;\n            if let Some(value) = client.get(key)? {\n                println!(\"{}\", value);\n            } else {\n                println!(\"Key not found\");\n            }\n        }\n        Command::Set { key, value, addr } => {\n            let mut client = KvsClient::connect(addr)?;\n            client.set(key, value)?;\n        }\n        Command::Remove { key, addr } => {\n            let mut client = KvsClient::connect(addr)?;\n            client.remove(key)?;\n        }\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/bin/kvs-server.rs",
    "content": "use clap::arg_enum;\nuse kvs::*;\nuse log::LevelFilter;\nuse log::{error, info, warn};\nuse std::env::current_dir;\nuse std::fs;\nuse std::net::SocketAddr;\nuse std::process::exit;\nuse structopt::StructOpt;\n\nconst DEFAULT_LISTENING_ADDRESS: &str = \"127.0.0.1:4000\";\nconst DEFAULT_ENGINE: Engine = Engine::kvs;\n\n#[derive(StructOpt, Debug)]\n#[structopt(name = \"kvs-server\")]\nstruct Opt {\n    #[structopt(\n        long,\n        help = \"Sets the listening address\",\n        value_name = \"IP:PORT\",\n        raw(default_value = \"DEFAULT_LISTENING_ADDRESS\"),\n        parse(try_from_str)\n    )]\n    addr: SocketAddr,\n    #[structopt(\n        long,\n        help = \"Sets the storage engine\",\n        value_name = \"ENGINE-NAME\",\n        raw(possible_values = \"&Engine::variants()\")\n    )]\n    engine: Option<Engine>,\n}\n\narg_enum! {\n    #[allow(non_camel_case_types)]\n    #[derive(Debug, Copy, Clone, PartialEq, Eq)]\n    enum Engine {\n        kvs,\n        sled\n    }\n}\n\nfn main() {\n    env_logger::builder().filter_level(LevelFilter::Info).init();\n    let mut opt = Opt::from_args();\n    let res = current_engine().and_then(move |curr_engine| {\n        if opt.engine.is_none() {\n            opt.engine = curr_engine;\n        }\n        if curr_engine.is_some() && opt.engine != curr_engine {\n            error!(\"Wrong engine!\");\n            exit(1);\n        }\n        run(opt)\n    });\n    if let Err(e) = res {\n        error!(\"{}\", e);\n        exit(1);\n    }\n}\n\nfn run(opt: Opt) -> Result<()> {\n    let engine = opt.engine.unwrap_or(DEFAULT_ENGINE);\n    info!(\"kvs-server {}\", env!(\"CARGO_PKG_VERSION\"));\n    info!(\"Storage engine: {}\", engine);\n    info!(\"Listening on {}\", opt.addr);\n\n    // write engine to engine file\n    fs::write(current_dir()?.join(\"engine\"), format!(\"{}\", engine))?;\n\n    match engine {\n        Engine::kvs => run_with_engine(KvStore::open(current_dir()?)?, opt.addr),\n        Engine::sled => run_with_engine(SledKvsEngine::new(sled::open(current_dir()?)?), opt.addr),\n    }\n}\n\nfn run_with_engine<E: KvsEngine>(engine: E, addr: SocketAddr) -> Result<()> {\n    let server = KvsServer::new(engine);\n    server.run(addr)\n}\n\nfn current_engine() -> Result<Option<Engine>> {\n    let engine = current_dir()?.join(\"engine\");\n    if !engine.exists() {\n        return Ok(None);\n    }\n\n    match fs::read_to_string(engine)?.parse() {\n        Ok(engine) => Ok(Some(engine)),\n        Err(e) => {\n            warn!(\"The content of engine file is invalid: {}\", e);\n            Ok(None)\n        }\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/client.rs",
    "content": "use crate::common::{GetResponse, RemoveResponse, Request, SetResponse};\nuse crate::{KvsError, Result};\nuse serde::Deserialize;\nuse serde_json::de::{Deserializer, IoRead};\nuse std::io::{BufReader, BufWriter, Write};\nuse std::net::{TcpStream, ToSocketAddrs};\n\n/// Key value store client\npub struct KvsClient {\n    reader: Deserializer<IoRead<BufReader<TcpStream>>>,\n    writer: BufWriter<TcpStream>,\n}\n\nimpl KvsClient {\n    /// Connect to `addr` to access `KvsServer`.\n    pub fn connect<A: ToSocketAddrs>(addr: A) -> Result<Self> {\n        let tcp_reader = TcpStream::connect(addr)?;\n        let tcp_writer = tcp_reader.try_clone()?;\n        Ok(KvsClient {\n            reader: Deserializer::from_reader(BufReader::new(tcp_reader)),\n            writer: BufWriter::new(tcp_writer),\n        })\n    }\n\n    /// Get the value of a given key from the server.\n    pub fn get(&mut self, key: String) -> Result<Option<String>> {\n        serde_json::to_writer(&mut self.writer, &Request::Get { key })?;\n        self.writer.flush()?;\n        let resp = GetResponse::deserialize(&mut self.reader)?;\n        match resp {\n            GetResponse::Ok(value) => Ok(value),\n            GetResponse::Err(msg) => Err(KvsError::StringError(msg)),\n        }\n    }\n\n    /// Set the value of a string key in the server.\n    pub fn set(&mut self, key: String, value: String) -> Result<()> {\n        serde_json::to_writer(&mut self.writer, &Request::Set { key, value })?;\n        self.writer.flush()?;\n        let resp = SetResponse::deserialize(&mut self.reader)?;\n        match resp {\n            SetResponse::Ok(_) => Ok(()),\n            SetResponse::Err(msg) => Err(KvsError::StringError(msg)),\n        }\n    }\n\n    /// Remove a string key in the server.\n    pub fn remove(&mut self, key: String) -> Result<()> {\n        serde_json::to_writer(&mut self.writer, &Request::Remove { key })?;\n        self.writer.flush()?;\n        let resp = RemoveResponse::deserialize(&mut self.reader)?;\n        match resp {\n            RemoveResponse::Ok(_) => Ok(()),\n            RemoveResponse::Err(msg) => Err(KvsError::StringError(msg)),\n        }\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/common.rs",
    "content": "use serde::{Deserialize, Serialize};\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum Request {\n    Get { key: String },\n    Set { key: String, value: String },\n    Remove { key: String },\n}\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum GetResponse {\n    Ok(Option<String>),\n    Err(String),\n}\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum SetResponse {\n    Ok(()),\n    Err(String),\n}\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum RemoveResponse {\n    Ok(()),\n    Err(String),\n}\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/engines/kvs.rs",
    "content": "use std::collections::{BTreeMap, HashMap};\nuse std::fs::{self, File, OpenOptions};\nuse std::io::{self, BufReader, BufWriter, Read, Seek, SeekFrom, Write};\nuse std::ops::Range;\nuse std::path::{Path, PathBuf};\n\nuse serde::{Deserialize, Serialize};\nuse serde_json::Deserializer;\n\nuse super::KvsEngine;\nuse crate::{KvsError, Result};\nuse std::ffi::OsStr;\n\nconst COMPACTION_THRESHOLD: u64 = 1024 * 1024;\n\n/// The `KvStore` stores string key/value pairs.\n///\n/// Key/value pairs are persisted to disk in log files. Log files are named after\n/// monotonically increasing generation numbers with a `log` extension name.\n/// A `BTreeMap` in memory stores the keys and the value locations for fast query.\n///\n/// ```rust\n/// # use kvs::{KvStore, Result};\n/// # fn try_main() -> Result<()> {\n/// use std::env::current_dir;\n/// use kvs::KvsEngine;\n/// let mut store = KvStore::open(current_dir()?)?;\n/// store.set(\"key\".to_owned(), \"value\".to_owned())?;\n/// let val = store.get(\"key\".to_owned())?;\n/// assert_eq!(val, Some(\"value\".to_owned()));\n/// # Ok(())\n/// # }\n/// ```\npub struct KvStore {\n    // directory for the log and other data\n    path: PathBuf,\n    // map generation number to the file reader\n    readers: HashMap<u64, BufReaderWithPos<File>>,\n    // writer of the current log\n    writer: BufWriterWithPos<File>,\n    current_gen: u64,\n    index: BTreeMap<String, CommandPos>,\n    // the number of bytes representing \"stale\" commands that could be\n    // deleted during a compaction\n    uncompacted: u64,\n}\n\nimpl KvStore {\n    /// Opens a `KvStore` with the given path.\n    ///\n    /// This will create a new directory if the given one does not exist.\n    ///\n    /// # Errors\n    ///\n    /// It propagates I/O or deserialization errors during the log replay.\n    pub fn open(path: impl Into<PathBuf>) -> Result<KvStore> {\n        let path = path.into();\n        fs::create_dir_all(&path)?;\n\n        let mut readers = HashMap::new();\n        let mut index = BTreeMap::new();\n\n        let gen_list = sorted_gen_list(&path)?;\n        let mut uncompacted = 0;\n\n        for &gen in &gen_list {\n            let mut reader = BufReaderWithPos::new(File::open(log_path(&path, gen))?)?;\n            uncompacted += load(gen, &mut reader, &mut index)?;\n            readers.insert(gen, reader);\n        }\n\n        let current_gen = gen_list.last().unwrap_or(&0) + 1;\n        let writer = new_log_file(&path, current_gen, &mut readers)?;\n\n        Ok(KvStore {\n            path,\n            readers,\n            writer,\n            current_gen,\n            index,\n            uncompacted,\n        })\n    }\n\n    /// Clears stale entries in the log.\n    pub fn compact(&mut self) -> Result<()> {\n        // increase current gen by 2. current_gen + 1 is for the compaction file\n        let compaction_gen = self.current_gen + 1;\n        self.current_gen += 2;\n        self.writer = self.new_log_file(self.current_gen)?;\n\n        let mut compaction_writer = self.new_log_file(compaction_gen)?;\n\n        let mut new_pos = 0; // pos in the new log file\n        for cmd_pos in &mut self.index.values_mut() {\n            let reader = self\n                .readers\n                .get_mut(&cmd_pos.gen)\n                .expect(\"Cannot find log reader\");\n            if reader.pos != cmd_pos.pos {\n                reader.seek(SeekFrom::Start(cmd_pos.pos))?;\n            }\n\n            let mut entry_reader = reader.take(cmd_pos.len);\n            let len = io::copy(&mut entry_reader, &mut compaction_writer)?;\n            *cmd_pos = (compaction_gen, new_pos..new_pos + len).into();\n            new_pos += len;\n        }\n        compaction_writer.flush()?;\n\n        // remove stale log files\n        let stale_gens: Vec<_> = self\n            .readers\n            .keys()\n            .filter(|&&gen| gen < compaction_gen)\n            .cloned()\n            .collect();\n        for stale_gen in stale_gens {\n            self.readers.remove(&stale_gen);\n            fs::remove_file(log_path(&self.path, stale_gen))?;\n        }\n\n        self.uncompacted = 0;\n\n        Ok(())\n    }\n\n    /// Create a new log file with given generation number and add the reader to the readers map.\n    ///\n    /// Returns the writer to the log.\n    fn new_log_file(&mut self, gen: u64) -> Result<BufWriterWithPos<File>> {\n        new_log_file(&self.path, gen, &mut self.readers)\n    }\n}\n\nimpl KvsEngine for KvStore {\n    /// Sets the value of a string key to a string.\n    ///\n    /// If the key already exists, the previous value will be overwritten.\n    ///\n    /// # Errors\n    ///\n    /// It propagates I/O or serialization errors during writing the log.\n    fn set(&mut self, key: String, value: String) -> Result<()> {\n        let cmd = Command::set(key, value);\n        let pos = self.writer.pos;\n        serde_json::to_writer(&mut self.writer, &cmd)?;\n        self.writer.flush()?;\n        if let Command::Set { key, .. } = cmd {\n            if let Some(old_cmd) = self\n                .index\n                .insert(key, (self.current_gen, pos..self.writer.pos).into())\n            {\n                self.uncompacted += old_cmd.len;\n            }\n        }\n\n        if self.uncompacted > COMPACTION_THRESHOLD {\n            self.compact()?;\n        }\n        Ok(())\n    }\n\n    /// Gets the string value of a given string key.\n    ///\n    /// Returns `None` if the given key does not exist.\n    fn get(&mut self, key: String) -> Result<Option<String>> {\n        if let Some(cmd_pos) = self.index.get(&key) {\n            let reader = self\n                .readers\n                .get_mut(&cmd_pos.gen)\n                .expect(\"Cannot find log reader\");\n            reader.seek(SeekFrom::Start(cmd_pos.pos))?;\n            let cmd_reader = reader.take(cmd_pos.len);\n            if let Command::Set { value, .. } = serde_json::from_reader(cmd_reader)? {\n                Ok(Some(value))\n            } else {\n                Err(KvsError::UnexpectedCommandType)\n            }\n        } else {\n            Ok(None)\n        }\n    }\n\n    /// Removes a given key.\n    ///\n    /// # Error\n    ///\n    /// It returns `KvsError::KeyNotFound` if the given key is not found.\n    ///\n    /// It propagates I/O or serialization errors during writing the log.\n    fn remove(&mut self, key: String) -> Result<()> {\n        if self.index.contains_key(&key) {\n            let cmd = Command::remove(key);\n            serde_json::to_writer(&mut self.writer, &cmd)?;\n            self.writer.flush()?;\n            if let Command::Remove { key } = cmd {\n                let old_cmd = self.index.remove(&key).expect(\"key not found\");\n                self.uncompacted += old_cmd.len;\n            }\n            Ok(())\n        } else {\n            Err(KvsError::KeyNotFound)\n        }\n    }\n}\n\n/// Create a new log file with given generation number and add the reader to the readers map.\n///\n/// Returns the writer to the log.\nfn new_log_file(\n    path: &Path,\n    gen: u64,\n    readers: &mut HashMap<u64, BufReaderWithPos<File>>,\n) -> Result<BufWriterWithPos<File>> {\n    let path = log_path(&path, gen);\n    let writer = BufWriterWithPos::new(\n        OpenOptions::new()\n            .create(true)\n            .write(true)\n            .append(true)\n            .open(&path)?,\n    )?;\n    readers.insert(gen, BufReaderWithPos::new(File::open(&path)?)?);\n    Ok(writer)\n}\n\n/// Returns sorted generation numbers in the given directory\nfn sorted_gen_list(path: &Path) -> Result<Vec<u64>> {\n    let mut gen_list: Vec<u64> = fs::read_dir(&path)?\n        .flat_map(|res| -> Result<_> { Ok(res?.path()) })\n        .filter(|path| path.is_file() && path.extension() == Some(\"log\".as_ref()))\n        .flat_map(|path| {\n            path.file_name()\n                .and_then(OsStr::to_str)\n                .map(|s| s.trim_end_matches(\".log\"))\n                .map(str::parse::<u64>)\n        })\n        .flatten()\n        .collect();\n    gen_list.sort_unstable();\n    Ok(gen_list)\n}\n\n/// Load the whole log file and store value locations in the index map.\n///\n/// Returns how many bytes can be saved after a compaction.\nfn load(\n    gen: u64,\n    reader: &mut BufReaderWithPos<File>,\n    index: &mut BTreeMap<String, CommandPos>,\n) -> Result<u64> {\n    // To make sure we read from the beginning of the file\n    let mut pos = reader.seek(SeekFrom::Start(0))?;\n    let mut stream = Deserializer::from_reader(reader).into_iter::<Command>();\n    let mut uncompacted = 0; // number of bytes that can be saved after a compaction\n    while let Some(cmd) = stream.next() {\n        let new_pos = stream.byte_offset() as u64;\n        match cmd? {\n            Command::Set { key, .. } => {\n                if let Some(old_cmd) = index.insert(key, (gen, pos..new_pos).into()) {\n                    uncompacted += old_cmd.len;\n                }\n            }\n            Command::Remove { key } => {\n                if let Some(old_cmd) = index.remove(&key) {\n                    uncompacted += old_cmd.len;\n                }\n                // the \"remove\" command itself can be deleted in the next compaction\n                // so we add its length to `uncompacted`\n                uncompacted += new_pos - pos;\n            }\n        }\n        pos = new_pos;\n    }\n    Ok(uncompacted)\n}\n\nfn log_path(dir: &Path, gen: u64) -> PathBuf {\n    dir.join(format!(\"{}.log\", gen))\n}\n\n/// Struct representing a command\n#[derive(Serialize, Deserialize, Debug)]\nenum Command {\n    Set { key: String, value: String },\n    Remove { key: String },\n}\n\nimpl Command {\n    fn set(key: String, value: String) -> Command {\n        Command::Set { key, value }\n    }\n\n    fn remove(key: String) -> Command {\n        Command::Remove { key }\n    }\n}\n\n/// Represents the position and length of a json-serialized command in the log\nstruct CommandPos {\n    gen: u64,\n    pos: u64,\n    len: u64,\n}\n\nimpl From<(u64, Range<u64>)> for CommandPos {\n    fn from((gen, range): (u64, Range<u64>)) -> Self {\n        CommandPos {\n            gen,\n            pos: range.start,\n            len: range.end - range.start,\n        }\n    }\n}\n\nstruct BufReaderWithPos<R: Read + Seek> {\n    reader: BufReader<R>,\n    pos: u64,\n}\n\nimpl<R: Read + Seek> BufReaderWithPos<R> {\n    fn new(mut inner: R) -> Result<Self> {\n        let pos = inner.seek(SeekFrom::Current(0))?;\n        Ok(BufReaderWithPos {\n            reader: BufReader::new(inner),\n            pos,\n        })\n    }\n}\n\nimpl<R: Read + Seek> Read for BufReaderWithPos<R> {\n    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {\n        let len = self.reader.read(buf)?;\n        self.pos += len as u64;\n        Ok(len)\n    }\n}\n\nimpl<R: Read + Seek> Seek for BufReaderWithPos<R> {\n    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {\n        self.pos = self.reader.seek(pos)?;\n        Ok(self.pos)\n    }\n}\n\nstruct BufWriterWithPos<W: Write + Seek> {\n    writer: BufWriter<W>,\n    pos: u64,\n}\n\nimpl<W: Write + Seek> BufWriterWithPos<W> {\n    fn new(mut inner: W) -> Result<Self> {\n        let pos = inner.seek(SeekFrom::Current(0))?;\n        Ok(BufWriterWithPos {\n            writer: BufWriter::new(inner),\n            pos,\n        })\n    }\n}\n\nimpl<W: Write + Seek> Write for BufWriterWithPos<W> {\n    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n        let len = self.writer.write(buf)?;\n        self.pos += len as u64;\n        Ok(len)\n    }\n\n    fn flush(&mut self) -> io::Result<()> {\n        self.writer.flush()\n    }\n}\n\nimpl<W: Write + Seek> Seek for BufWriterWithPos<W> {\n    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {\n        self.pos = self.writer.seek(pos)?;\n        Ok(self.pos)\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/engines/mod.rs",
    "content": "//! This module provides various key value storage engines.\n\nuse crate::Result;\n\n/// Trait for a key value storage engine.\npub trait KvsEngine {\n    /// Sets the value of a string key to a string.\n    ///\n    /// If the key already exists, the previous value will be overwritten.\n    fn set(&mut self, key: String, value: String) -> Result<()>;\n\n    /// Gets the string value of a given string key.\n    ///\n    /// Returns `None` if the given key does not exist.\n    fn get(&mut self, key: String) -> Result<Option<String>>;\n\n    /// Removes a given key.\n    ///\n    /// # Errors\n    ///\n    /// It returns `KvsError::KeyNotFound` if the given key is not found.\n    fn remove(&mut self, key: String) -> Result<()>;\n}\n\nmod kvs;\nmod sled;\n\npub use self::kvs::KvStore;\npub use self::sled::SledKvsEngine;\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/engines/sled.rs",
    "content": "use super::KvsEngine;\nuse crate::{KvsError, Result};\nuse sled::{Db, Tree};\n\n/// Wrapper of `sled::Db`\n#[derive(Clone)]\npub struct SledKvsEngine(Db);\n\nimpl SledKvsEngine {\n    /// Creates a `SledKvsEngine` from `sled::Db`.\n    pub fn new(db: Db) -> Self {\n        SledKvsEngine(db)\n    }\n}\n\nimpl KvsEngine for SledKvsEngine {\n    fn set(&mut self, key: String, value: String) -> Result<()> {\n        let tree: &Tree = &self.0;\n        tree.insert(key, value.into_bytes()).map(|_| ())?;\n        tree.flush()?;\n        Ok(())\n    }\n\n    fn get(&mut self, key: String) -> Result<Option<String>> {\n        let tree: &Tree = &self.0;\n        Ok(tree\n            .get(key)?\n            .map(|i_vec| AsRef::<[u8]>::as_ref(&i_vec).to_vec())\n            .map(String::from_utf8)\n            .transpose()?)\n    }\n\n    fn remove(&mut self, key: String) -> Result<()> {\n        let tree: &Tree = &self.0;\n        tree.remove(key)?.ok_or(KvsError::KeyNotFound)?;\n        tree.flush()?;\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/error.rs",
    "content": "use failure::Fail;\nuse std::io;\nuse std::string::FromUtf8Error;\n\n/// Error type for kvs\n#[derive(Fail, Debug)]\npub enum KvsError {\n    /// IO error\n    #[fail(display = \"IO error: {}\", _0)]\n    Io(#[cause] io::Error),\n    /// Serialization or deserialization error\n    #[fail(display = \"serde_json error: {}\", _0)]\n    Serde(#[cause] serde_json::Error),\n    /// Removing non-existent key error\n    #[fail(display = \"Key not found\")]\n    KeyNotFound,\n    /// Unexpected command type error.\n    /// It indicated a corrupted log or a program bug.\n    #[fail(display = \"Unexpected command type\")]\n    UnexpectedCommandType,\n    /// Key or value is invalid UTF-8 sequence\n    #[fail(display = \"UTF-8 error: {}\", _0)]\n    Utf8(#[cause] FromUtf8Error),\n    /// Sled error\n    #[fail(display = \"sled error: {}\", _0)]\n    Sled(#[cause] sled::Error),\n    /// Error with a string message\n    #[fail(display = \"{}\", _0)]\n    StringError(String),\n}\n\nimpl From<io::Error> for KvsError {\n    fn from(err: io::Error) -> KvsError {\n        KvsError::Io(err)\n    }\n}\n\nimpl From<serde_json::Error> for KvsError {\n    fn from(err: serde_json::Error) -> KvsError {\n        KvsError::Serde(err)\n    }\n}\n\nimpl From<FromUtf8Error> for KvsError {\n    fn from(err: FromUtf8Error) -> KvsError {\n        KvsError::Utf8(err)\n    }\n}\n\nimpl From<sled::Error> for KvsError {\n    fn from(err: sled::Error) -> KvsError {\n        KvsError::Sled(err)\n    }\n}\n\n/// Result type for kvs\npub type Result<T> = std::result::Result<T, KvsError>;\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/lib.rs",
    "content": "#![deny(missing_docs)]\n//! A simple key/value store.\n\npub use client::KvsClient;\npub use engines::{KvStore, KvsEngine, SledKvsEngine};\npub use error::{KvsError, Result};\npub use server::KvsServer;\nmod client;\nmod common;\nmod engines;\nmod error;\nmod server;\n"
  },
  {
    "path": "courses/rust/projects/project-3/src/server.rs",
    "content": "use crate::common::{GetResponse, RemoveResponse, Request, SetResponse};\nuse crate::{KvsEngine, Result};\nuse log::{debug, error};\nuse serde_json::Deserializer;\nuse std::io::{BufReader, BufWriter, Write};\nuse std::net::{TcpListener, TcpStream, ToSocketAddrs};\n\n/// The server of a key value store.\npub struct KvsServer<E: KvsEngine> {\n    engine: E,\n}\n\nimpl<E: KvsEngine> KvsServer<E> {\n    /// Create a `KvsServer` with a given storage engine.\n    pub fn new(engine: E) -> Self {\n        KvsServer { engine }\n    }\n\n    /// Run the server listening on the given address\n    pub fn run<A: ToSocketAddrs>(mut self, addr: A) -> Result<()> {\n        let listener = TcpListener::bind(addr)?;\n        for stream in listener.incoming() {\n            match stream {\n                Ok(stream) => {\n                    if let Err(e) = self.serve(stream) {\n                        error!(\"Error on serving client: {}\", e);\n                    }\n                }\n                Err(e) => error!(\"Connection failed: {}\", e),\n            }\n        }\n        Ok(())\n    }\n\n    fn serve(&mut self, tcp: TcpStream) -> Result<()> {\n        let peer_addr = tcp.peer_addr()?;\n        let reader = BufReader::new(&tcp);\n        let mut writer = BufWriter::new(&tcp);\n        let req_reader = Deserializer::from_reader(reader).into_iter::<Request>();\n\n        macro_rules! send_resp {\n            ($resp:expr) => {{\n                let resp = $resp;\n                serde_json::to_writer(&mut writer, &resp)?;\n                writer.flush()?;\n                debug!(\"Response sent to {}: {:?}\", peer_addr, resp);\n            };};\n        }\n\n        for req in req_reader {\n            let req = req?;\n            debug!(\"Receive request from {}: {:?}\", peer_addr, req);\n            match req {\n                Request::Get { key } => send_resp!(match self.engine.get(key) {\n                    Ok(value) => GetResponse::Ok(value),\n                    Err(e) => GetResponse::Err(format!(\"{}\", e)),\n                }),\n                Request::Set { key, value } => send_resp!(match self.engine.set(key, value) {\n                    Ok(_) => SetResponse::Ok(()),\n                    Err(e) => SetResponse::Err(format!(\"{}\", e)),\n                }),\n                Request::Remove { key } => send_resp!(match self.engine.remove(key) {\n                    Ok(_) => RemoveResponse::Ok(()),\n                    Err(e) => RemoveResponse::Err(format!(\"{}\", e)),\n                }),\n            };\n        }\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-3/tests/cli.rs",
    "content": "use assert_cmd::prelude::*;\nuse predicates::str::{contains, is_empty};\nuse std::fs::{self, File};\nuse std::process::Command;\nuse std::sync::mpsc;\nuse std::thread;\nuse std::time::Duration;\nuse tempfile::TempDir;\n\n// `kvs-client` with no args should exit with a non-zero code.\n#[test]\nfn client_cli_no_args() {\n    let temp_dir = TempDir::new().unwrap();\n    let mut cmd = Command::cargo_bin(\"kvs-client\").unwrap();\n    cmd.current_dir(&temp_dir).assert().failure();\n}\n\n#[test]\nfn client_cli_invalid_get() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"extra\", \"field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key\", \"--addr\", \"invalid-addr\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key\", \"--unknown-flag\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n#[test]\nfn client_cli_invalid_set() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"missing_field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key\", \"value\", \"extra_field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key\", \"value\", \"--addr\", \"invalid-addr\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key\", \"--unknown-flag\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n#[test]\nfn client_cli_invalid_rm() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"extra\", \"field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key\", \"--addr\", \"invalid-addr\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key\", \"--unknown-flag\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n#[test]\nfn client_cli_invalid_subcommand() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"unknown\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n// `kvs-client -V` should print the version\n#[test]\nfn client_cli_version() {\n    let temp_dir = TempDir::new().unwrap();\n    let mut cmd = Command::cargo_bin(\"kvs-client\").unwrap();\n    cmd.args(&[\"-V\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .stdout(contains(env!(\"CARGO_PKG_VERSION\")));\n}\n\n// `kvs-server -V` should print the version\n#[test]\nfn server_cli_version() {\n    let temp_dir = TempDir::new().unwrap();\n    let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n    cmd.args(&[\"-V\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .stdout(contains(env!(\"CARGO_PKG_VERSION\")));\n}\n\n#[test]\nfn cli_log_configuration() {\n    let temp_dir = TempDir::new().unwrap();\n    let stderr_path = temp_dir.path().join(\"stderr\");\n    let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n    let mut child = cmd\n        .args(&[\"--engine\", \"kvs\", \"--addr\", \"127.0.0.1:4001\"])\n        .current_dir(&temp_dir)\n        .stderr(File::create(&stderr_path).unwrap())\n        .spawn()\n        .unwrap();\n    thread::sleep(Duration::from_secs(1));\n    child.kill().expect(\"server exited before killed\");\n\n    let content = fs::read_to_string(&stderr_path).expect(\"unable to read from stderr file\");\n    assert!(content.contains(env!(\"CARGO_PKG_VERSION\")));\n    assert!(content.contains(\"kvs\"));\n    assert!(content.contains(\"127.0.0.1:4001\"));\n}\n\n#[test]\nfn cli_wrong_engine() {\n    // sled first, kvs second\n    {\n        let temp_dir = TempDir::new().unwrap();\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        let mut child = cmd\n            .args(&[\"--engine\", \"sled\", \"--addr\", \"127.0.0.1:4002\"])\n            .current_dir(&temp_dir)\n            .spawn()\n            .unwrap();\n        thread::sleep(Duration::from_secs(1));\n        child.kill().expect(\"server exited before killed\");\n\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        cmd.args(&[\"--engine\", \"kvs\", \"--addr\", \"127.0.0.1:4003\"])\n            .current_dir(&temp_dir)\n            .assert()\n            .failure();\n    }\n\n    // kvs first, sled second\n    {\n        let temp_dir = TempDir::new().unwrap();\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        let mut child = cmd\n            .args(&[\"--engine\", \"kvs\", \"--addr\", \"127.0.0.1:4002\"])\n            .current_dir(&temp_dir)\n            .spawn()\n            .unwrap();\n        thread::sleep(Duration::from_secs(1));\n        child.kill().expect(\"server exited before killed\");\n\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        cmd.args(&[\"--engine\", \"sled\", \"--addr\", \"127.0.0.1:4003\"])\n            .current_dir(&temp_dir)\n            .assert()\n            .failure();\n    }\n}\n\nfn cli_access_server(engine: &str, addr: &str) {\n    let (sender, receiver) = mpsc::sync_channel(0);\n    let temp_dir = TempDir::new().unwrap();\n    let mut server = Command::cargo_bin(\"kvs-server\").unwrap();\n    let mut child = server\n        .args(&[\"--engine\", engine, \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .spawn()\n        .unwrap();\n    let handle = thread::spawn(move || {\n        let _ = receiver.recv(); // wait for main thread to finish\n        child.kill().expect(\"server exited before killed\");\n    });\n    thread::sleep(Duration::from_secs(1));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key1\", \"value1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(\"value1\\n\");\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key1\", \"value2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(\"value2\\n\");\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(contains(\"Key not found\"));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure()\n        .stderr(contains(\"Key not found\"));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key2\", \"value3\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    sender.send(()).unwrap();\n    handle.join().unwrap();\n\n    // Reopen and check value\n    let (sender, receiver) = mpsc::sync_channel(0);\n    let mut server = Command::cargo_bin(\"kvs-server\").unwrap();\n    let mut child = server\n        .args(&[\"--engine\", engine, \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .spawn()\n        .unwrap();\n    let handle = thread::spawn(move || {\n        let _ = receiver.recv(); // wait for main thread to finish\n        child.kill().expect(\"server exited before killed\");\n    });\n    thread::sleep(Duration::from_secs(1));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(contains(\"value3\"));\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(contains(\"Key not found\"));\n    sender.send(()).unwrap();\n    handle.join().unwrap();\n}\n\n#[test]\nfn cli_access_server_kvs_engine() {\n    cli_access_server(\"kvs\", \"127.0.0.1:4004\");\n}\n\n#[test]\nfn cli_access_server_sled_engine() {\n    cli_access_server(\"sled\", \"127.0.0.1:4005\");\n}\n"
  },
  {
    "path": "courses/rust/projects/project-3/tests/kv_store.rs",
    "content": "use kvs::{KvStore, KvsEngine, Result};\nuse tempfile::TempDir;\nuse walkdir::WalkDir;\n\n// Should get previously stored value\n#[test]\nfn get_stored_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    store.set(\"key2\".to_owned(), \"value2\".to_owned())?;\n\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value1\".to_owned()));\n    assert_eq!(store.get(\"key2\".to_owned())?, Some(\"value2\".to_owned()));\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let mut store = KvStore::open(temp_dir.path())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value1\".to_owned()));\n    assert_eq!(store.get(\"key2\".to_owned())?, Some(\"value2\".to_owned()));\n\n    Ok(())\n}\n\n// Should overwrite existent value\n#[test]\nfn overwrite_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value1\".to_owned()));\n    store.set(\"key1\".to_owned(), \"value2\".to_owned())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value2\".to_owned()));\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let mut store = KvStore::open(temp_dir.path())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value2\".to_owned()));\n    store.set(\"key1\".to_owned(), \"value3\".to_owned())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value3\".to_owned()));\n\n    Ok(())\n}\n\n// Should get `None` when getting a non-existent key\n#[test]\nfn get_non_existent_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    assert_eq!(store.get(\"key2\".to_owned())?, None);\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let mut store = KvStore::open(temp_dir.path())?;\n    assert_eq!(store.get(\"key2\".to_owned())?, None);\n\n    Ok(())\n}\n\n#[test]\nfn remove_non_existent_key() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n    assert!(store.remove(\"key1\".to_owned()).is_err());\n    Ok(())\n}\n\n#[test]\nfn remove_key() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    assert!(store.remove(\"key1\".to_owned()).is_ok());\n    assert_eq!(store.get(\"key1\".to_owned())?, None);\n    Ok(())\n}\n\n// Insert data until total size of the directory decreases.\n// Test data correctness after compaction.\n#[test]\nfn compaction() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let mut store = KvStore::open(temp_dir.path())?;\n\n    let dir_size = || {\n        let entries = WalkDir::new(temp_dir.path()).into_iter();\n        let len: walkdir::Result<u64> = entries\n            .map(|res| {\n                res.and_then(|entry| entry.metadata())\n                    .map(|metadata| metadata.len())\n            })\n            .sum();\n        len.expect(\"fail to get directory size\")\n    };\n\n    let mut current_size = dir_size();\n    for iter in 0..1000 {\n        for key_id in 0..1000 {\n            let key = format!(\"key{}\", key_id);\n            let value = format!(\"{}\", iter);\n            store.set(key, value)?;\n        }\n\n        let new_size = dir_size();\n        if new_size > current_size {\n            current_size = new_size;\n            continue;\n        }\n        // Compaction triggered\n\n        drop(store);\n        // reopen and check content\n        let mut store = KvStore::open(temp_dir.path())?;\n        for key_id in 0..1000 {\n            let key = format!(\"key{}\", key_id);\n            assert_eq!(store.get(key)?, Some(format!(\"{}\", iter)));\n        }\n        return Ok(());\n    }\n\n    panic!(\"No compaction detected\");\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/Cargo.toml",
    "content": "[package]\nname = \"kvs\"\nversion = \"0.1.0\"\nauthors = [\"Yilin Chen <sticnarf@gmail.com>\"]\ndescription = \"A key-value store\"\nedition = \"2018\"\n\n[dependencies]\nclap = \"2.33.0\"\nstructopt = \"0.2.15\"\nfailure = \"0.1.5\"\nserde = { version = \"1.0.89\", features = [\"derive\"] }\nserde_json = \"1.0.39\"\nlog = \"0.4.6\"\nenv_logger = \"0.6.1\"\nsled = \"0.34.6\"\ncrossbeam = \"0.7.1\"\nrayon = \"1.0.3\"\nnum_cpus = \"1.10.0\"\ncrossbeam-skiplist = { git = \"https://github.com/crossbeam-rs/crossbeam.git\", branch = \"master\" }\n\n[dev-dependencies]\nassert_cmd = \"0.11\"\ncriterion = \"0.3\"\ncrossbeam-utils = \"0.6.5\"\npredicates = \"1.0.0\"\nrand = \"0.6.5\"\ntempfile = \"3.0.7\"\nwalkdir = \"2.2.7\"\npanic-control = \"0.1.4\"\n"
  },
  {
    "path": "courses/rust/projects/project-4/README.md",
    "content": "# PNA Rust Project 4: Concurrency and parallelism\n\n**Task**: Create a _multi-threaded_, persistent key/value store server and client\nwith synchronous networking over a custom protocol.\n\n**Goals**:\n\n- Write a simple thread pool\n- Use channels for cross-thread communication\n- Share data structures with locks\n- Perform read operations without locks\n- Benchmark single-threaded vs multithreaded\n\n**Topics**: thread pools, channels, locks, lock-free data structures,\n  atomics, parameterized benchmarking.\n\n- [Introduction](#user-content-introduction)\n- [Project spec](#user-content-project-spec)\n- [Project setup](#user-content-project-setup)\n- [Background: blocking and multithreading](#user-content-background-blocking-and-multithreading)\n- [Part 1: Multithreading](#user-content-part-1-multithreading)\n- [Part 2: Creating a shared `KvsEngine`](#user-content-part-2-creating-a-shared-kvsengine)\n- [Part 3: Adding multithreading to `KvServer`](#user-content-part-3-adding-multithreading-to-kvserver)\n- [Part 4: Creating a real thread pool](#user-content-part-4-creating-a-real-thread-pool)\n  - [So how do you build a thread pool?](#user-content-so-how-do-you-build-a-thread-pool)\n- [Part 5: Abstracted thread pools](#user-content-part-5-abstracted-thread-pools)\n- [Part 6: Evaluating your thread pool](#user-content-part-6-evaluating-your-thread-pool)\n  - [Ok, now to the first two benchmarks](#user-content-ok-now-to-the-first-two-benchmarks)\n- [Part 7: Evaluating other thread pools and engines](#user-content-part-7-evaluating-other-thread-pools-and-engines)\n  - [Extension 1: Comparing functions](#user-content-extension-1-comparing-functions)\n  - [Background: The limits of locks](#user-content-background-the-limits-of-locks)\n- [Part 8: Lock-free readers](#user-content-part-8-lock-free-readers)\n  - [Explaining our example data structure](#user-content-explaining-our-example-data-structure)\n  - [Strategies for breaking up locks](#user-content-strategies-for-breaking-up-locks)\n    - [Understand and maintain sequential consistency](#user-content-understand-and-maintain-sequential-consistency)\n    - [Identify immutable values](#user-content-identify-immutable-values)\n    - [Duplicate values instead of sharing](#user-content-duplicate-values-instead-of-sharing)\n    - [Break up data structures by role](#user-content-break-up-data-structures-by-role)\n    - [Use specialized concurrent data structures](#user-content-use-specialized-concurrent-data-structures)\n    - [Postpone cleanup until later](#user-content-postpone-cleanup-until-later)\n    - [Share flags and counters with atomics](#user-content-share-flags-and-counters-with-atomics)\n  - [Implement lock-free readers](#user-content-implement-lock-free-readers)\n\n\n## Introduction\n\nIn this project you will create a simple key/value server and client that\ncommunicate over a custom protocol. The server will use synchronous networking,\nand will respond to multiple requests using increasingly sophisticated\nconcurrent implementations. The in-memory index will become a concurrent\ndata structure, shared by all threads, and compaction will be done on a\ndedicated thread, to reduce latency of individual requests.\n\n\n## Project spec\n\nThe cargo project, `kvs`, builds a command-line key-value store client called\n`kvs-client`, and a key-value store server called `kvs-server`, both of which in\nturn call into a library called `kvs`. The client speaks to the server over\na custom protocol.\n\nThe interface to the CLI is the same as in the [previous project]. The\ndifference this time is in the concurrent implementation, which will be\ndescribed as we work through it.\n\n[previous project]: ../project-3/README.md\n\nThe library interface is nearly the same except for two things. First this time\nall the `KvsEngine`, `KvStore`, etc. methods take `&self` instead of `&mut\nself`, and now it implements `Clone`. This is common with concurrent\ndata structures. Why is that? It's not that we're not going to be writing\nimmutable code. It _is_ though going to be shared across threads. Why might that\npreclude using `&mut self` in the method signatures? If you don't know now,\nit will become obvious by the end of this project.\n\nThe second is that the library in this project contains a new _trait_,\n`ThreadPool`. It contains the following methods:\n\n- `ThreadPool::new(threads: u32) -> Result<ThreadPool>`\n\n  Creates a new thread pool, immediately spawning the specified number of\n  threads.\n\n  Returns an error if any thread fails to spawn. All previously-spawned threads\n  are terminated.\n\n- `ThreadPool::spawn<F>(&self, job: F) where F: FnOnce() + Send + 'static`\n\n  Spawn a function into the threadpool.\n\n  Spawning always succeeds, but if the function panics the threadpool continues\n  to operate with the same number of threads &mdash; the thread count is not\n  reduced nor is the thread pool destroyed, corrupted or invalidated.\n\nBy the end of this project there will be several implementations of this\ntrait, and you will again perform benchmarking to compare them.\n\nThis project should not require any changes at all to the client code.\n\n\n## Project setup\n\nContinuing from your previous project, delete your previous `tests` directory and\ncopy this project's `tests` directory into its place. This project should\ncontain a library named `kvs`, and two executables, `kvs-server` and\n`kvs-client`.\n\nYou need the following dev-dependencies in your `Cargo.toml`:\n\n```toml\n[dev-dependencies]\nassert_cmd = \"0.11\"\ncriterion = \"0.2.11\"\ncrossbeam-utils = \"0.6.5\"\npredicates = \"1.0.0\"\nrand = \"0.6.5\"\ntempfile = \"3.0.7\"\nwalkdir = \"2.2.7\"\npanic-control = \"0.1.4\"\n```\n\nAs with previous projects, add enough definitions that the test suite builds.\n\n\n## Background: blocking and multithreading\n\nUntil now you have serviced all of your requests, both read and write (e.g.\n\"get\" and \"set\"), on a single thread. In other words, all the requests in your\ndatabase are _serialized_. Using a diagram we are going to repeat through this\nproject, the flow of time looks like this:\n\n```\n    thread\n           +  +--------+--------+--------+--------+\n      T1   |  |   R1   |   R2   |   W1   |   W2   |\n           +  +--------+--------+--------+--------+\n\n              --> read/write reqs over time -->\n```\n\nBoth read and write operations may require _blocking_. Blocking is when a thread\nstops execution while waiting for access to a resource, like data from a file,\nor a variable protected by a lock. While a thread is blocked on one task it\ncan't make progress on another task. So in an I/O heavy system, any particular\nrequest might spend _most_ of its time just waiting on the operating system\nand memory control to move data to and from the disk:\n\n```\n          +---------+----------------------------+---------+\n      R1  | working | waiting for data ...       | working |\n          +---------+----------------------------+---------+\n\n          --> time -->\n```\n\nThe simplest way to put the CPU back to work while one request is blocked is to\nservice requests on multiple threads, so that ideally our requests are all\nprocessed concurrently, and &mdash; if we have enough CPUs &mdash; in parallel:\n\n```\n    thread\n           +  +--------+\n      T1   |  |   R1   |\n           |  +--------+\n      T2   |  |   R2   |\n           |  +--------+\n      T3   |  |   W1   |\n           |  +--------+\n      T4   |  |   W2   |\n           +  +--------+\n\n              --> read/write reqs over time -->\n```\n\nSo that will be the focus of this project &mdash; to process requests in\nparallel.\n\n\n## Part 1: Multithreading\n\nYour first try at introducing concurrency is going to be the simplest: spawning\na new thread per incoming connection, and responding to the request on that\nconnection, then letting the thread exit. What performance benefits will\ndistributing work across threads provide? How do you expect latency will be\naffected? What about throughput?\n\nThe first step is to write a `ThreadPool` implementation for this naive\napproach, where `ThreadPool::spawn` will create a new thread for each spawned\njob. Call it `NaiveThreadPool` (it's not _really_ even a thread _pool_ since\nthis implementation is not going to reuse threads between jobs, but it needs to\nconform to our trait for later comparisons).\n\nWe aren't focusing on a more sophisticated implementation now because simply\nintegrating this solution into our existing design is going to take some effort.\nNote that the `ThreadPool::new` constructor takes a `threads` argument\nspecifying the number of threads in the pool. In this implementation it will be\nunused.\n\n_Go ahead and implement this version of `ThreadPool` now_, then we'll\nintegrate it into the new `KvStore`.\n\n**Test cases to complete**:\n\n  - `thread_pool::naive_thread_pool_*`\n\n\n## Part 2: Creating a shared `KvsEngine`\n\nBefore we can integrate the `NaiveThreadPool` into `KvServer` we have to make\nthe `KvsEngine` trait and the `KvStore` implementation (for now you can ignore\nthe `SledKvsEngine` from the previous project, but you can optionally\nre-implement it as an extension to this project).\n\nRecall from the project spec that, this time, our `KvsEngine` takes `self` as\n`&self` instead of `&mut self` as previously, It also implements `Clone`, which\nmust be done explicitly for each implementation, as well as `Send + 'static`,\nimplicit properties of the definition of each implementation. More concretely,\nit looks like\n\n```rust\npub trait KvsEngine: Clone + Send + 'static {\n    fn set(&self, key: String, value: String) -> Result<()>;\n\n    fn get(&self, key: String) -> Result<Option<String>>;\n\n    fn remove(&self, key: String) -> Result<()>;\n}\n```\n\nThis gives us a lot of clues about the implementation strategy we're pursuing.\nFirst, think about why the engine needs to implement `Clone` when we have a\nmultithreaded implementation. Consider the design of other concurrent data\ntypes in Rust, like [`Arc`]. Now think about why that makes us use `&self`\ninstead of `&mut self`. What do you know about shared mutable state? By the end\nof this project be sure you understand the implications here &mdash; _this is\nwhat Rust is all about_.\n\n[`Arc`]: https://doc.rust-lang.org/std/sync/struct.Arc.html\n\nIn this model, `KvsEngine` behaves like a _handle_ to another object, and\nbecause that object is shared between threads, it probably needs to live on the\n[heap], and because that shared state can't be mutable it needs to be protected by\nsome synchronization primitive.\n\n[heap]: https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap\n\nSo, _move the data inside your implementation of `KvsEngine`, `KvStore` onto\nthe heap using a thread-safe shared pointer type and protect it behind a lock of\nyour choosing_.\n\nSince `SledKvsEngine` implements `KvsEngine` it may also need to change.\n\nAt this point your single-threaded `kvs-server` should work once again, but now\nwith a `KvsEngine` that can later be shared across threads.\n\n**Test cases to complete**:\n\n  - `kv_store::concurrent_*`\n\n\n## Part 3: Adding multithreading to `KvServer`\n\nLet's quickly review our architecture here: `KvServer` sets up a TCP socket and\nbegins listening on it; when it receives a request it deserializes it and calls\nsome implementation of the `KvsEngine` trait to store or retrieve data; then it\nsends back the response. The details of how `KvsEngine` works don't matter to\n`KvServer`.\n\nSo in the last project you probably created a loop vaguelly like:\n\n```rust\nlet listener = TcpListener::bind(addr)?;\n\nfor stream in listener.incoming() {\n\tlet cmd = self.read_cmd(&stream);\n\tlet resp = self.process_cmd(cmd);\n\tself.respond(&stream, resp);\n}\n```\n\n_Well, now you just need to do the same thing, but spawn all the work inside the\nloop into your `NaiveThreadPool`_. The database query and the response are both\nhandled on a different thread than the TCP listener. This offloads most of\nthe hard work to other threads, allowing the recieving thread to process more\nrequests. It should increase throughput, at least on multi-core machines.\n\nAgain, you should still have a working client/server key-value store, now\nmultithreaded.\n\n\n## Part 4: Creating a real thread pool\n\nSo now that you've got your multithreaded architecture in place, it's time to\nwrite a real thread pool. You probably wouldn't write your own thread pool in\npractice as there exist thread pool crates that are well-tested, but it\nis a useful exercise to gain experience with concurrency in general. Later in\nthis project you will, as we did with the engine in the previous project,\nabstract the thread pool and compare the performance of yours with an existing.\n\nSo, what is a thread pool?\n\nIt's nothing complicated. Instead of creating a new thread for every\nmultithreaded job to be performed, a thread pool maintains a \"pool\" of threads,\nand reuses those threads instead of creating a new one.\n\nBut why?\n\nIt's entirely about performance. Reusing threads saves a small amount of\nperformance, but when writing high-performance applications, every bit counts.\nImagine what it takes to make a new thread:\n\nYou've got to have a call stack for that thread to run on. That call stack must\nbe allocated. Allocations are pretty cheap, but not as cheap as no allocation.\nHow that call stack is allocated depends on details of the operating system and\nruntime, but can involve locks and syscalls. Syscalls again are not _that_\nexpensive, but they are expensive when we're dealing with Rust levels of\nperformance &mdash; reducing syscalls is a common source of easy optimizations.\nThat stack then has to be carefully initialized so that first [stack frame]\ncontains the appropriate values for the base pointer and whatever else is needed\nin the stack's initial [function prologue][fp]. In Rust the stack needs to be\nconfigured with a [guard page] to prevent stack overflows, preserving memory\nsafety. That takes two more syscalls, [to `mmap` and to `mprotect`][mp] (though\non Linux in particular, those two syscalls are avoided).\n\n[guard page]: https://docs.microsoft.com/en-us/windows/desktop/Memory/creating-guard-pages\n[fp]: https://en.wikipedia.org/wiki/Function_prologue\n[stack frame]: https://en.wikipedia.org/wiki/Stack_frame\n[2mb]: https://github.com/rust-lang/rust/blob/6635fbed4ca8c65822f99e994735bd1877fb063e/src/libstd/sys/unix/thread.rs#L12\n[mp]: https://github.com/rust-lang/rust/blob/6635fbed4ca8c65822f99e994735bd1877fb063e/src/libstd/sys/unix/thread.rs#L315\n\n<!-- TODO: illustration? -->\n\nThat's just setting up the callstack. It's at least another syscall to create\nthe new thread, at which point the kernel must do its own internal accounting\nfor the new thread.\n\nIn Rust, the C [libpthread] library handles most of this complexity.\n\nThen at some point the OS performs a [context switch] onto the new stack, and\nthe thread runs. When the thread terminates all that work needs to be undone\nagain.\n\nWith a thread pool, all that setup overhead is only done for a few threads, and\nsubsequent jobs are simply context switches into existing threads in the pool.\n\n[libpthread]: https://www.gnu.org/software/hurd/libpthread.html\n[context switch]: https://en.wikipedia.org/wiki/Context_switch\n\n\n### So how do you build a thread pool?\n\nThere are many strategies and tradeoffs, but for this exercise you are going to\nuse a single shared queue to distribute work to idle threads. That means that\nyour \"producer\", the thread that accepts network connections, sends jobs to a\nsingle queue (or channel), and the \"consumers\", every idle thread in the pool,\nread from that channel waiting for a job to execute. This is the very simplest\nwork scheduling strategy, but it can be effective. What are the downsides?\n\nYou have three important considerations here:\n\n1) _which data structure to use to distribute the work_ &mdash; it's going to be a\n  queue, and there is going to be one sender (\"producer\"), the thread listening\n  for TCP connections, and many recievers (\"consumers\"), the threads in the pool.\n\n2) _how to deal with panicking jobs_ &mdash; your pool runs arbitrary work items.\n  If a thread panics, the thread pool needs to recover in some way.\n\n3) _how to deal with shutdown_ &mdash; when the `ThreadPool` object goes out of\n  scope it needs to shut down every thread. It must not leave them idle.\n\nThese concerns are all intertwined since dealing with each of them may involve\ncommunication and synchronization between threads. Some solutions will be\nsimple, the solutions to each of these working together gracefully; some\nsolutions will be complex, the solutions being independent and convoluted.\nChoose your data structures carefully and use their capabilities wisely.\n\nYou will distribute work by sending messages over some concurrent queue type (a\nconcurrent queue in Rust typically being a data structure with two connected\ntypes: sender types, and reciever types; and that can send between the two types\nany type that implements `Send` + `'static`).\n\nMessages in Rust are typically represented as enums, with variants for each\npossible message that can be sent, like:\n\n```rust\nenum ThreadPoolMessage {\n    RunJob(Box<dyn FnOnce() + Send + 'static>),\n    Shutdown,\n}\n```\n\nThis tends to be a simpler and more efficient solution than trying to \"juggle\"\nmultiple channels for different purposes. Of course, if there is only one type\nof message, an enum is not necessary. Now, the above example may or may not be\nthe full set of messages you need to manage your thread pool, depending on the\ndesign. In particular, shutting down can often be done implicitly if your queue\nreturns a result indicating that the sender has been destroyed.\n\nThere are many types of multithreaded queues. In Rust the most common is the\n[`mpsc`] channel, because it lives in Rust's standard library. This is a\nmulti-producer, single consumer queue, so using it for your single-queue thread\npool will require a lock of some kind. What's the downside of using a lock here?\nThere are many other concurrent queue types in Rust, and each has pros and cons.\nIf you are willing to take a lock on both producer and consumer sides, then you\ncould even use a `Mutex<VecDeque>`, but there's probably no reason to do that in\nproduction when better solutions exist.\n\n[`mpsc`]: https://doc.rust-lang.org/std/sync/mpsc/index.html\n\n_Historical note: the existence of channels in Rust's standard library is a bit\nof a curiosity, and is considered a mistake by some, as it betrays Rust's\ngeneral philosophy of keeping the standard library minimal, focused on\nabstracting the operating system, and letting the crate ecosystem experiment\nwith advanced data structures. Their presence is an artifact of Rust's\ndevelopment history and origins as a message-passing language like Go. Other\nlibraries like [`crossbeam`] provide more sophisticated alternatives, and\nsometimes more suitable options_ 😉.\n\n[`crossbeam`]: https://github.com/crossbeam-rs/crossbeam\n\nYour thread pool will need to deal with the case where the spawned function\npanics &mdash; simply letting panics destroy the threads in your pool would\nquickly deplete its available threads. So if a thread in your pool panics you\nneed to make sure that the total number of threads doesn't decrease. So what\nshould you do? You have at least two options: let the thread die and spawn\nanother, or catch the panic and keep the existing thread running. What are the\ntradeoffs? You've got to pick one, but leave a comment in your code explaining\nyour choice.\n\nSome of the tools at your disposal are [`thread::spawn`], [`thread::panicking`],\n[`catch_unwind`], [`mpsc`] channels, [`Mutex`], [crossbeam's MPMC\nchannels][mpmc], and `thread`s [`JoinHandle`]. You may use any of these, but\nprobably not all.\n\n[`thread::spawn`]: https://doc.rust-lang.org/std/thread/fn.spawn.html\n[`thread::panicking`]: https://doc.rust-lang.org/std/thread/fn.panicking.html\n[`catch_unwind`]: https://doc.rust-lang.org/std/panic/fn.catch_unwind.html\n[`mpsc`]: https://doc.rust-lang.org/std/sync/mpsc/index.html\n[`Mutex`]: https://doc.rust-lang.org/std/sync/struct.Mutex.html\n[mpmc]: https://docs.rs/crossbeam/0.7.1/crossbeam/channel/index.html\n[`JoinHandle`]: https://doc.rust-lang.org/std/thread/struct.JoinHandle.html\n\n_Create the `SharedQueueThreadPool` type, implementing `ThreadPool`_.\n\n**Test cases to complete**:\n\n  - `shared_queue_thread_pool_*`\n\nReplace the `NaiveThreadPool` used by `KvServer` with `SharedQueueThreadPool`.\nAgain your `kvs-server` should still work the same as previously, now with a\nslightly more clever multithreading model. This time you'll want to call\nthe thread pool constructor with an appropriate number of threads. For\nnow you can create a thread per CPU, using the [`num_cpus`] crate. We'll\nrevisit the number of threads later.\n\n[`num_cpus`]: https://docs.rs/num_cpus/\n\n\n## Part 5: Abstracted thread pools\n\nAs in the previous project where you created a `KvsEngine` abstraction to compare\ndifferent implementations, now you are going to use the `ThreadPool` abstraction\nto do the same.\n\nIf you haven't already, add a second type parameter to `KvServer` to represent\nthe `ThreadPool` implementation, the constructor to accept the thread pool\nas its second argument, and use that threadpool to distribute the work.\n\nFinally create one more `ThreadPool` implementation, `RayonThreadPool`,\nusing the `ThreadPool` type from the [`rayon`] crate.\n\nRayon's thread pool uses a more sophisticated scheduling strategy called [\"work\nstealing\"][ws], and we'll expect it to perform better than ours, but who knows\nuntil we try!\n\n[`rayon`]: https://docs.rs/rayon/\n[ws]: https://www.dre.vanderbilt.edu/~schmidt/PDF/work-stealing-dequeue.pdf\n\n\n## Part 6: Evaluating your thread pool\n\nNow you are going to write _six_ benchmarks, one write-heavy workload comparing\nperformance of `SharedQueueThreadPool` with varying numbers of threads, one\nread-heavy workload comparing the performance of `SharedQueueThreadPool` with\nvarying number of threads; two more that use `RayonThreadPool` instead of of\n`SharedQueueThreadPool`, and finally, yet two more that use `RayonThreadPool` in\nconjunction with `SledKvsEngine`.\n\nIt's not as much as work as it sounds &mdash; four of them are essentially\nduplicates of the first two.\n\n_Note: the next two sections describe a fairly complex set of benchmarks. They\ncan be written (probably… nobody has done it yet), but it may be challenging\nboth to understand and to write efficiently. These sections do introduce some\nuseful criterion features, but if it's too overwhelming it's ok to skip\n[forward] (and file a bug about what didn't work for you). On the other hand,\nthe difficulty here may present a good learning opportunity. Finally,\nimplementing these benchmarks as described requires a way to shutdown\n`KvsServer` programmatically (i.e. without sending `SIGKILL` and letting the OS\ndo it), which we have not previously discussed._\n\n[forward]: #user-content-background-the-limit-of-locks\n\nSo as part of this you will need to make sure the `SledKvsEngine` implementation\nyou wrote as part of the previous project works again in this multithreaded\ncontext. It should be trivial as sled can be cloned and sent between threads,\njust like your engine.\n\nHopefully the results will be interesting.\n\nAgain you will use criterion.\n\nThese are going to be _parameterized_ benchmarks, that is, single benchmarks\nthat are run multiple times with different parameters. Criterion calls these\n[benchmarking with inputs][bi]. And the parameter to you benchmarks will be the\nnumber of threads in the thread pool.\n\nWhat you are attempting to test is the throughput of your server under various\nconditions. You will be sending many requests concurrently, waiting for the\nresponses, then ending. One thing you should be curious about here is how the\nnumber of threads affects your throughput compared to the number of CPUs on your\nmachine; how your threadpool compares to rayon's; and how your `KvStore`\ncompares to `SledKvsEngine` in a multithreaded context.\n\nThis will be somewhat complicated by the fact that your `KvsClient` is\n(probably) blocking, that is, it sends a request then waits for a response. If\nit was non-blocking, then you could send _many_ requests without waiting for\nresponses, then collect the responses later. With a blocking `KvsClient` you\nwill need to send each request in its own thread in order to saturate the\nserver's capacity.\n\nWhen benchmarking it is important to understand exactly what code you are trying\nto measure, and to the greatest extent possible only measure that code. A\nbenchmarker like criterion runs a single piece of code many times in a loop,\nmeasuring the time it takes through each loop. As such we want to put only the\ncode we want to measure in the loop, and leave as much outside of the loop as we\ncan.\n\n[bi]: https://bheisler.github.io/criterion.rs/book/user_guide/benchmarking_with_inputs.html\n\nSo take this simple example of a criterion benchmark with inputs:\n\n```rust\nlet c = Criterion::default();\nlet inputs = &[1, 2, 3, 4, 5];\n\nc.bench_function_over_inputs(\"example\", |b, &&num| {\n    b.iter(|| {\n        // important measured work goes here\n\t});\n}, inputs);\n```\n\nThat `iter` calls your closure many times, measuring each iteration. But since\nyou are going to need to set up a lot of threads beforehand, that is work that\nyou don't want to measure. If you can do the setup only once for multiple\niterations then the setup can go outside the closure, like\n\n```rust\nlet c = Criterion::default();\nlet inputs = &[1, 2, 3, 4, 5];\n\nc.bench_function_over_inputs(\"example\", |b, &&num| {\n    // do setup here\n    b.iter(|| {\n        // important measured work goes here\n\t});\n}, inputs);\n```\n\nThe code inside the `b.iter` closure is what is measured, setup goes before.\n\nIf the setup can't go before the loop, then another strategy is to make the\namount of setup work for smaller than the amount of work you actually want to\nmeasure, by e.g. adding loops. Also consider that \"teardown\" of the benchmark,\nwhich will often mostly consist of running `drop` implementations, also has a\ncost.\n\nIf you have a blocking client, you are going to need many threads for your\nclients, and you only have the opportunities to create those threads once, prior\nto the many iterations of your loop. So you'll need to set up a bunch of\nreusable threads before you iterate over the benchmark. Fortunately you have the\nperfect tool for that in your `SharedQueueThreadPool`. Set that up with a thread\nper request, and pair it with some channels to report back that the response is\nreceived, and you will have a suitable benchmark harness.\n\n\n### Ok, now to the first two benchmarks\n\nWe have said that this is a parameterized benchmark, and the parameter to the\nbenchmark is the number of CPUs to use in the server's thread pool. We want to\nsee what the throughput is like with just 1 thread, with 2, with 4, and then for\nevery even number up to 2x the number of cores in your computer. Why 2x? Well,\nthere may be benefits to having more threads than cores, and you are going to\nfind out experimentally.\n\nFor the write-heavy workload, during setup (the part that runs before the call\nto `b.iter(...)`), create the `KvServer<KvStore, SharedQueueThreadPool>`, with\nthe thread pool containing the parameterized number of threads. Then write a\nworkload that sets 1000 unique keys of the same length, all to the same\nvalue. Note that though the keys are different, for consistent results they\nneed to be the same keys every benchmark loop.\n\nThen after each thread sets a value they should also `assert!` that the call was\nsuccessful (to ensure there are no bugs under load), then indicate that it is\ndone. When all threads are done the benchmarking thread continues and finishes\nthat iteration. An obvious way to implement this signaling of completion is for\neach thread to send a message back to the benchmarking thread, but keep in mind\nthat the signaling code is overhead unrelated to the code you are trying to\nmeasure, so it needs to do a minimal amount of work. Can you do it with only one\nmessage, or maybe with some other concurrent type that only signals the\nbenchmarking thread once?\n\nCall this benchmark `write_queued_kvstore` (or whatever).\n\nFor the read-heavy workload, during setup, create the `KvServer<KvStore,\nSharedQueueThreadPool>`, with the thread pool containing the parameterized\nnumber of threads, and create your client thread pool containing 1000 threads.\nStill in the setup phase, create yet another client and initialize 1000 unique\nkeys of the same length, all to identical values.\n\nThen, during the benchmarking loop, from the client, spawn 1000 jobs that\nretrieve those same key/value pars, and then `assert!` that the result is\ncorrect. Finally, as before, send a message back to the benchmarking thread\nindicating that read is complete.\n\nCall this benchmark `read_queued_kvstore` (or whatever).\n\n**Whew. That was a lot of work**.\n\nSo you can run this set of criterion benchmarks as usual with `cargo bench`.\n\n<!-- TODO show example results -->\n\nBut this time you are going to do more. Since you are running the same\nbenchmark over multiple parameters, representing the number of threads\nin your threadpool, what would be really nice is if we could see the\neffect of different thread counts in a nice graph.\n\nOh, hey &mdash; criterion does that!\n\nGo back and read about [benchmarking with inputs][bi]. It explains how to see\nthe graph of your benchmark against its inputs. What do you notice? What happens\nas your number of threads approaches the number of CPUs on your machine? What\nhappens as the number of threads exceeds the number of threads on your machine?\nWhat do you think accounts for the trend you see? The results depend on many\nfactors, so your results might be different from anybody elses.\n\nThat's a good reason to always benchmark, and not speculate about performance.\nWe can make educated guesses, but we don't know until we test.\n\n\n<!-- TODO: not sure if this would actually improve perf\n\n## Extension 1: Alternatives to the thousand thread approach\n\nAs described above, to write your benchmarks, you will need to spawn 1000\nthreads, one for each client that is generating load against your server. This\nis a necessity as `KvsClient`'s `get` and `set` methods _block_ waiting for the\nresult of the operation. This is going to cause a lot of overhead, and it is\nvery likely to impact the quality of your benchmarks. The overhead here comes\nnot from spawning and destroying the threads, since you've placed that work\noutside of the benchmarking loop via your `ThreadPool` setup. _But_, because\neach requested is generated on a different thread, that means that every request\nis going to require a context switch into and out of the kernel as those threads\nare scheduled.\n\nIt would be better if a single thread could issue many requests at once,\nthen later wait for their results.\n\nThis is simple _asynchronous_ style of programming, which is _not_ the topic of\nthis project, but _is_ the topic of the next.\n\nFor this project though, if you want to create a more efficient benchmark, there\nis a simple way to do it, by having the \"set\" method return a handle that can\nlater be waited on.\n\nSo imagine that your `KvsClient` API today looks like:\n\n``rust\npub fn get(&mut self, key: String) -> Result<Option<String>>;\npub fn set(&mut self, key: String, value: String) -> Result<()>;\npub fn remove(&mut self, key: String) -> Result<()>;\n```\n\nIf you instead added a new set of methods:\n\n``rust\npub fn get_async(&mut self, key: String) -> Result<QueryHandle>;\npub fn set_async(&mut self, key: String, value: String) -> Result<QueryHandle>;\npub fn remove_async(&mut self, key: String) -> Result<QueryHandle>;\npub fn wait_for_result(&mut self, q: QueryHandle) -> Result<QueryResult>;\n```\n\nthen you could, e.g. issue many queries at once, store the handles in a vector,\neach containing an open TCP stream, then later wait on each result in turn. That\nwould let your benchmarking client thread pool contain far fewer threads\n(probably one per CPU would be persisent).\n\nWe won't explore this solution at length here, but you might want to experiment\nin this direction, particularly if you find the comparisions between your\nbenchmarks are not interesting.\n\nTODO: Can we explain how to use perf to measure context switch time?\n\n-->\n\n\n## Part 7: Evaluating other thread pools and engines\n\nOk. You've gotten the most difficult part of this benchmarking exercise out of\nthe way. Now you've just got to do almost the same thing in a few more\nconfigurations.\n\nTake those two benchmarks you wrote previously, and just copy-and-past them\nthree times. In all of them, change `SharedQueueThreadPool` to\n`RayonThreadPool`.\n\nThe third and fourth, name `read/write_rayon_kvstore` (or whatever). These you\nwill compare to the first two `SharedQueueThreadPool` implementations, to\nsee the difference between yours and `RayonThreadPool`.\n\nThe fourth and fifth, name `read/write_rayon_sledkvengine`, and change the\nengine to `SledKvsEngine`. These you will compare to the previous two to\nsee how your `KvsEngine` compares to sled's in a multithreaded environment.\n\nAs before, run and chart all these benchmarks. Compare them to each other as\ndescribed above. How does your scheduler compare to rayon under various thread\ncounts? How does your storage engine compare to sled under various thread\ncounts? Are the results surprising? Can you imagine why the differences exist?\n\n<!-- Now would be a _great_ time to read the [source of rayon] and the [source of\nsled]. Get used to reading other people's source code. That is where you will\nlearn the most. -->\n\n\n### Extension 1: Comparing functions\n\nNow you have identical benchmarks for three different thread pools, and you have\nrun them and compared their performance yourself. Criterion has built-in support\nfor comparing multiple implementations. Check out [\"comparing functions\"][cp] in\nthe Criterion User Guide and modify your benchmarks so that criterion does the\ncomparison itself. Check out those gorgeous graphs.\n\n[cp]: https://bheisler.github.io/criterion.rs/book/user_guide/comparing_functions.html\n\n\n### Background: The limits of locks\n\nEarlier in this project, we suggested making your `KvsEngine` thread-safe by\nputting its internals behind a lock, on the heap. You probably realized\nimmediately that this wasn't going to improve throughput because it\ntraded one type of blocking for another &mdash; instead of _maybe_ blocking\non disk access, it is now _definitely_ blocking on mutex access.\n\nSo all we've achieved so far is this:\n\n```\n    thread\n           +  +--------+\n      T1   |  |   R1   |\n           |  +-----------------+\n      T2   |           |   R2   |\n           |           +-----------------+\n      T3   |                    |   W1   |\n           |                    +-----------------+\n      T4   |                             |   W2   |\n           +                             +--------+\n              --> read/write reqs over time -->\n```\n\nIn the previous section you benchmarked the multithreaded throughput of your\nengine vs. the `SledKvsEngine`. Hopefully what you discovered is that your\nmultithreaded implementation performed significantly worse than the `sled`\nmultithreaded implementation (if not, well, either you are super-awesome or\n`sled` has some problems). Adding multithreading has so far resulted in\nperformance that is strictly worse than the single-threaded implementation\n&mdash; now you've got the added work of context switching between threads, and\nthe guaranteed blocking imposed by the mutex.\n\nSo for this part of the project, you are going to get a bit more sophisticated.\nProtecting the entire state behind a lock is easy &mdash; the entire state\nis always read and written atomically because only one client at a time has\naccess to the entire state. But that also means that two threads that want to\naccess the shared state must wait on each other. In other words, when\n`KvsEngine` is protected by a mutex then there is very little actual concurrency\nin the server, despite being multithreaded.\n\nHigh-performance, scalable, parallel software tends to avoid locks and lock\ncontention as much as possible. Rust makes sophisticated and high-performance\nconcurrency patterns easier than most languages (because you don't need to worry\nabout data races and crashes), but it _does not_ protect you from making logical\nmistakes that would result in incorrect behavior.\n\nSo you've still got to do some hard thinking about concurrency. Fortunately\nthere are many sophisticated parallel-programming tools in the Rust crate\necosystem, so your task is usually just to understand what they are and how to\nput them together, not to understand how to write complex lock-free data\nstructures of your own.\n\nLet's look at some progressively more sophisticated examples. We'll take an\nexample single-threaded `KvStore` and consider how to make it thread-safe.\n\nHere's an example single-threaded `KvStore` like you might have created in\nearlier projects (this is a simplified version of the one in the course example\nproject):\n\n```rust\npub struct KvStore {\n    /// Directory for the log and other data\n    path: PathBuf,\n    /// The log reader\n    reader: BufReaderWithPos<File>,\n    /// The log writer\n    writer: BufWriterWithPos<File>,\n    /// The in-memory index from key to log pointer\n    index: BTreeMap<String, CommandPos>,\n    /// The number of bytes representing \"stale\" commands that could be\n    /// deleted during a compaction\n    uncompacted: u64,\n}\n```\n\nAnd here's the simple multithreaded version, protecting everything with a lock.\nHopefully what you've already written for this project looks something like this:\n\n```rust\n#[derive(Clone)]\npub struct KvStore(Arc<Mutex<SharedKvStore>>);\n\n#[derive(Clone)]\npub struct SharedKvStore {\n    /// Directory for the log and other data\n    path: PathBuf,\n    /// The log reader\n    reader: BufReaderWithPos<File>,\n    /// The log writer\n    writer: BufWriterWithPos<File>,\n    /// The in-memory index from key to log pointer\n    index: BTreeMap<String, CommandPos>,\n    /// The number of bytes representing \"stale\" commands that could be\n    /// deleted during a compaction\n    uncompacted: u64,\n}\n```\n\nThis `Arc<Mutex<T>>` solution is trivial, correct, and common:\n\n- The [`Arc`] puts the value on the heap so it can be shared between threads,\n  and provides a `clone` method to create a \"handle\" to it for each thread.\n- The [`Mutex`] provides a way to regain write access to the value without having\n  an existing `&mut` reference.\n\n[`Arc`]: https://doc.rust-lang.org/std/sync/struct.Arc.html\n[`Mutex`]: https://doc.rust-lang.org/std/sync/struct.Mutex.html\n\nThis is a perfectly reasonable solution for many cases. But in this case that\nmutex will be a source of _contention_ under load: the `Mutex` doesn't only\nserialize write access to `SharedKvStore`, but read access as well. Any thread\nthat wants to work with `KvStore` needs to wait for the `Mutex` to be unlocked\nby another thread. Any requests will block any other concurrent request.\n\nWhat we _really_ want is to not have to take locks, or &mdash; if locks are\nnecessary &mdash; for them to rarely contend with other threads.\n\nThe next step up in sophistication from a `Mutex` is the [`RwLock`], the\n\"reader-writer lock\". This is another common type of lock that every programmer\nof parallel software must know. The improvement that a reader-writer lock makes\nover a mutex is that it allows _either_ any number of readers, _or_ a single\nwriter. So in Rust terms, a `RwLock` will hand out any number of `&` pointers\nsimultaneously, or a single `&mut` pointer. Readers still block on writers\nand writers still block on readers and other writers.\n\n[`RwLock`]: https://doc.rust-lang.org/std/sync/struct.RwLock.html\n\nIn our database that means that all read requests can be satisfied concurrently,\nbut when a single write request comes in, all other activity in the system stops\nand waits for it. Implementing this is basically as simple as swapping the\n`Mutex` for `RwLock`.\n\nAnd, considering our multi-threading diagram again, the resulting process\nflow looks like:\n\n```\n    thread\n           +  +--------+\n      T1   |  |   R1   |\n           |  +--------+\n      T2   |  |   R2   |\n           |  +-----------------+\n      T3   |           |   W1   |\n           |           +-----------------+\n      T4   |                    |   W2   |\n           +                    +--------+\n              --> read/write reqs over time -->\n```\n\nIt's better, since the readers never block each other, but you can do better\nthan that still.\n\n\n## Part 8: Lock-free readers\n\nfor this project you are challenged to create readers that never take a lock,\neven with a concurrent writer. A read request can always be serviced, regardless\nof write requests. (Writers can still block on other writers for now &mdash;\nbesides being a challenging parallel programming problem, the question of\nwhether it even makes sense to write in parallel is a difficult one to answer).\n\nYou want to end up with\n\n```\n    thread\n           +  +--------+\n      T1   |  |   R1   |\n           |  +--------+\n      T2   |  |   R2   |\n           |  +--------+\n      T3   |  |   W1   |\n           |  +-----------------+\n      T4   |           |   W2   |\n           +           +--------+\n              --> read/write reqs over time -->\n```\n\nIf we can acheive that then our readers will be lock-free: even while a single\nreader is blocked waiting for data from the filesystems all types of other\noperations, reads and writes, can proceed. Unfortunately, this will still not be\nenough to guarantee that the system can always service read requests. Think\nabout what would happen if there are `N` blocked write requests on our thread\npool of size `N`. You'll have to solve that later. For now, you are focused\non removing the locks from readers.\n\nUnlike `Mutex` and `RwLock`, there is no single wrapper type that we can apply\nto the entire arbitrary shared state to achieve the goal of reading and writing\nconcurrently (at least, not while also being performant).\n\nThat means that we need to consider how each one of the fields of\n`SharedKvStore` is used, and pick the right synchronization scheme to allow all\nthreads to make as much progress as we can, while still maintaining logical\nconsistency of the data.\n\nThis is where the difficult reasoning with multithreading really begins. If you\nremove that big lock, Rust is still going to protect you from [_data races_],\nbut it is not going to help you maintain the logical consistency between the\nfields necessary to maintain the invariants of your data store.\n\n[_data races_]: https://blog.regehr.org/archives/490\n\nSo before thinking about the solution, let's think about our requirements. We\nneed to:\n\n- Read from the index and from the disk, on multiple threads at a time;\n- Write commands to disk, while maintaining the index;\n- Read in parallel with writing, thus\n- In general, to guarantee that readers will always see a consistent state while\n  reading in parallel with a writer, which means,\n  - Maintaining an invariant that log pointers in the index always point to a\n    valid command in the log,\n  - Maintaining appropriant invariants for other bookkeeping, like the\n    `uncompacted` variable in the following example;\n- Periodically compact our on-disk data, again while maintaining invariants for\n  readers.\n\nThe rest of this section is background on a variety of subjects that will be\nhelpful to achieve the above, but that is the entire goal for the remaining\nproject: modify `KvStore` to perform reads concurrently with writes.\n\n\n### Explaining our example data structure\n\nIn order to talk about this concretely, we're going to need an example of the\ndata we're trying to protect and the invariants we're trying to maintain. So\nhere's an example of a `KvStore` implementation and its fields.\n\n```rust\npub struct KvStore {\n    /// Directory for the log and other data\n    path: PathBuf,\n    /// The log reader\n    reader: BufReaderWithPos<File>,\n    /// The log writer\n    writer: BufWriterWithPos<File>,\n    /// The in-memory index from key to log pointer\n    index: BTreeMap<String, CommandPos>,\n    /// The number of bytes representing \"stale\" commands that could be\n    /// deleted during a compaction\n    uncompacted: u64,\n}\n```\n\nThis is a simplified version of the example for this project.\n\nThe purpose of the fields should be fairly clear:\n\n`path: PathBuf` is just the path to the directory where logs are stored. It\nnever changes &mdash; it is immutable, and immutable types are `Sync` in Rust,\nso it doesn't even need any protection at all. Every thread can read it at once\nthrough a shared reference.\n\n`readers: HashMap<u64, BufReaderWithPos<File>>` is the read handle to the\ncurrent log file. It needs to change to a new log file after compaction.\n\n`writer: BufWriterWithPos<File>` is the write handle to the current log file.\nSo any write needs mutable\naccess to `writer`, and the compaction process needs to change the `writer` and\nthe `current_gen`.\n\n`index: BTreeMap<String, CommandPos>` is the in-memory index of every key in the\ndatabase to its location in the index file. It is read from every reading\nthread, and written from every writing thread, potentially including during\ncompaction.\n\n`uncompacted: u64` simply counts the number of \"stale\" commands in the logs that\nhave been superceded by subsequent write commands, to know when to trigger\ncompaction.\n\nIn previous projects we didn't have to worry much about the interaction between\nwriting, reading, and compaction producing inconsistent results, since they all\nhappened on the same thread. Now if you are not careful with your data structure\nselection and their usage, it will be easy to corrupt the state of your database.\n\n\n### Strategies for breaking up locks\n\nThe key to advanced parallel programming is to know the tools available and when\nto use them. Here are some techniques we found useful while implementing this\nproject, some of which you will need as well. They are discussed in the\ncontext of the example data structure presented above.\n\n\n#### Understand and maintain sequential consistency\n\n(Note that \"sequential consistency\" has a precise meaning, but here we're just\ntalking generally about ensuring that things that need to happen in a specific\nsequence do so).\n\nReasoning about parallel programs is mostly about understanding the\n\"happens-before\" relationships in your code. In this thread, what changes to\nshared data structures do I need to see before others? What changes to shared\ndata structures do I need to expose to other threads before others? How do I\nensure that?\n\nIn single-threaded code reasoning about what happens before any particular line\nof code is trivial &mdash; if the code is written to happen before, then it\nhappens before, if not, it happens after. But this isn't actually true at all,\neven in single-threaded code: both the CPU and the compiler will reorder code to\nmake it run faster, the CPU operating on machine code, and the compiler\noperating on its internal representation prior to generating the machine code.\nIn reality the actual code executed happens in a different order than you wrote\nit to execute, and it only appears to run the way you wrote it because both the\nCPU and compiler track _data dependencies_ and don't reorder any operations that\ndepend on another.\n\nIn multi-threaded code the compiler and CPU will _still_ reorder code under the\nsame assumptions as single-threaded code, and your code will break entirely\nunless you tell the compiler via synchronized types and operations that it must\nnot allow reordering.\n\nAny operation that must occur before or after another must be exlicitly\narranged to do so with synchronized types or operations, whether they be locks,\natomics or otherwise.\n\nIn our example it's clear that the write to the file and the write to the index\nmust be seen to occur in a specific order &mdash; what would happen if the index\nwas updated before the file? Likewise, our example contains another bit of\nstate, `uncompacted`. What's the impact of miscalculating the uncompacted size?\nIt may not be so bad if the value of `uncompacted` can be seen to change before\nthe data is committed to file, but it's a decision that has to be made for each\nvalue that is synchronized independently.\n\n\n#### Identify immutable values\n\nYou've probably read a lot about immutability in Rust, and about how immutable\nvalues can be shared trivially between theads (they are `Sync`). Immutable\nvalues are the best for concurrency &mdash; just throw them behind an `Arc` and\ndon't think about them again.\n\nIn our example, `PathBuf` is immutable.\n\n\n#### Duplicate values instead of sharing\n\nCloning sometimes has a bad reputation in Rust, particularly cloning types with\narbitrary size, like `String`, and `Vec`. But cloning is often perfectly\nreasonable: it can be quite difficult to avoid clones in some situations, and\nCPUs are _very good_ at copying buffers of memory. Furthermore, considering our\nuse case, the number of state copies needed to support the server is bounded by\nthe number of threads in the threadpool.\n\nIn our example, again `PathBuf` is easily clonable.\n\nLess obviously though, consider how to share access to files across threads. The\n[`File`] type requires mutable access for both reads and writes. So to share it\nacross threads would require a lock that grants that mutable access. What is a\n`File` though? It's not actually a file &mdash; it's just a handle to the\nphysical resource on disk, and it's fine to have multiple handles to the same\nfile open at once. Note the API for `File` though &mdash; it doesn't implement\n`Clone`, and while it does have this enticing [`try_clone`] method, its\nsemantics have some complex implications for multi-threaded applications.\nDoes seeking a `File` affect another `File` that created by `try_clone` ?\nPlease consider the differences between `File`s from `File::open` and `try_clone`.\nUsing `try_clone` or `File::open`, it's your choice. [`pread`] may help.\n\n[`File`]: https://doc.rust-lang.org/std/fs/struct.File.html\n[`try_clone`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.try_clone\n[`pread`]: https://stackoverflow.com/questions/1687275/what-is-the-difference-between-read-and-pread-in-unix\n\n\n#### Break up data structures by role\n\nIn our use case we have two clear roles: readers, and writers (and maybe a third\nfor compactors). The logical separation of readers and writers into their own\nconcurrent types is a common in Rust. Readers have their own data set to work\nwith, and writers their own, and that provides a good opportunity for\nencapsulation, with all read operations beloning to one type and all write\noperations another.\n\nMaking this distinction will further make it very obvious which resources are\naccessed by both, since the reader and writer will both carry shared handles to\nthose resources.\n\n\n#### Use specialized concurrent data structures\n\nJust knowing what tools are available and in which scenarios to use them may be\nthe most difficult part of parallel programming. Beyond the basic lock types\ntought to everybody in school, synchronized data types become increasingly\nspecialized.\n\nIn this project, since the in-memory index is some type of associative data\nstructure (a.k.a. a \"map\"), like a tree or hash table, it's natural to ask\nwhether there exist concurrent associative data structures.\n\nThere are, and using them is key to completing this project.\n\nBut how can you know that? The first step is ask whether concurrent maps exist.\nYou could do this in `#beginners` on the [Rust Discord], but in this case\nsearching \"concurrent map\" on the web will definitely give the answer.\n\nThat's the easy part, finding the right concurrent map _in Rust_ is harder. A\ngood first step is to learch [libs.rs]. libs.rs is like crates.io but where\ncrates.io contains all published libraries, libs.rs is curated to contain only\nlibraries that are well-regarded by ... well, somebody. So if it's on libs.rs\nthen that's one indication that the library is usable, another is the download\ncount on [crates.io] &mdash; in general, more downloaded crates are more tested\nthan less downloaded crates. The download count can be seen as a rough proxy for\nthe number of people who \"vouch\" for the crate. And finally, asking in chat\nis always a good idea.\n\n[Rust Discord]: https://doc.rust-lang.org/std/fs/struct.File.html#method.try_clone\n[libs.rs]: https://libs.rs\n[crates.io]: https://crates.io\n\n\n#### Postpone cleanup until later\n\nLike cloning, garbage collection is often frowned upon in Rust &mdash; avoiding\nGC is almost the entire reason Rust exists. But it's no secret that, actually,\ngarbage collection can't be avoided, \"garbage collection\" and \"memory\nreclaimation\" are practically synonymous, and every language uses a mixture of\ngarbage collection strategies. On one end of the GC spectrum, in languages with\nno automatic memory management, like C, the garbage collection is left entirely\nup to the programmer, e.g. via `malloc` and `free`. On the other end are garbage\ncollected languages, like Java, where all memory is collected by a single\ngeneral-purpose garbage collector.\n\nIn practice though, neither is all memory management and reclaimation in C done\nwith `malloc`/`free`, nor is all memory management in Java done with the GC.\nJust as a trivial example, it is common for high-performance applications in\nboth to rely on specialized [arenas], in which allocations can both be reused as\nwell as deallocated in large batches, to optimize their memory access patterns.\n\n[arenas]: https://www.quora.com/In-C++-what-is-a-memory-arena\n\nLikewise in Rust, not all memory is freed deterministically. Trivial examples\nare in the [`Rc`] and [`Arc`] types that implement [resource counting], a simple\nkind of GC.\n\n[`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html\n[`Arc`]: https://doc.rust-lang.org/std/sync/struct.Arc.html\n[reference counting]: https://en.wikipedia.org/wiki/Reference_counting\n\nOne of the greatest benefits of global garbage collectors is that they make many\nlock-free data structures possible. Many of the lock-free data structures\ndescribed in academic literature rely on the GC for their operation. The need to\nadapt lock-free algorithms to not rely on a GC is the original motivation for\nthe [`crossbeam`] library and its [`epoch`] type.\n\n[`crossbeam`]: https://github.com/crossbeam-rs/crossbeam\n[`epoch`]: https://docs.rs/crossbeam/0.7.1/crossbeam/epoch/index.html\n\nAll this is to say that garbage collection comes in many forms, and its basic\nstrategy of delaying the cleanup of resources until some future time is powerful\nin many scenarios.\n\nWhen you can't figure out how to perform some concurrent work _right now_, it\ncan be useful to ask \"can I just do this later?\"\n\n\n#### Share flags and counters with atomics\n\nUnder the hood, most concurrent data structures are implemented using [atomic\noperations], or \"atomics\". Atomics operate on a single cell of memory, usually\nbetween 8 and 128 bytes, commonly word size (the same number of bytes as a\npointer, and as the Rust `usize` type). If two threads use atomics correctly\nthen the result of a write in one thread is visible immediately to a read in the\nother thread. In addition to making reads or writes immediately visible, atomic\noperations also constrain how the compiler and CPU may reorder instructions, in\nRust via the [`Ordering`] flag.\n\n[atomic operations]: https://preshing.com/20130618/atomic-vs-non-atomic-operations/\n[`atomic`]: https://doc.rust-lang.org/std/sync/atomic/\n[`Ordering`]: https://doc.rust-lang.org/std/sync/atomic/enum.Ordering.html\n\nWhen moving from the course-grained parallelism of locks to more fine-grain\nparallelism, its often necessary to augment off-the-shelf concurrent data\nstructures with atomics.\n\n\n### Implement lock-free readers\n\nThat's a lot of background. Hopefully there is a lot there to think about and\nguide you in the right direction. Now it's your turn:\n\n_Modify `KvStore` to perform reads concurrently with writes._\n\nAnd afterward…\n\nNice coding, friend. Enjoy a nice break.\n\n\n<!--\n\n### Some ideas for sharing data without big locks\n\n\n- TODO: https://gitlab.redox-os.org/redox-os/chashmap\n- TODO: https://github.com/jonhoo/rust-evmap\n- https://github.com/4lDO2/evc\n- crossbeam-skiplist\n- atomics\n- invariants\n- concurrent maps https://gitlab.nebulanet.cc/xacrimon/rs-hm-bench\n\nSome of the data types here have equivalent concurrent types:\nfor example, a `u64` can be replaced with an `\n\n_OK, I hope you are prepared. Go remove as much locks and contention from this\ntype as you can_.\n\nThere are no new test cases to complete here, but some of the earlier ones will\nstress this new data structure in challenging ways, your previously-written\nbenchmarks will stress this implementation hard.\n\n\n## Part 9: Benchmarking lock-free data structures\n\nTODO: just do a read-write benchmark in the earlier section,\n      verify sum of keys\nTODO: make sure benchmark section always mentions to assert the results\n-->\n\n\n<!--\n---\n\n\n## Extension 1: Background compaction\n\n- discuss issues with files and concurrency\n- move compaction to a background thread\n- need to refactor previous projects to use multiple logs\n- this should be fairly challenging\n-->\n\n\n<!--\n\n## Background reading ideas\n\n- scheduling strategies\n- shared mutable state, especially in multithreaded context\n- threadpools\n- something about parallelism and concurrency\n- something that explains Arc<Mutex>\n- something about the distinction between interior and\n  exterior mutability, bonus if it includes parallelism\n- concurrent map comparison https://gitlab.nebulanet.cc/xacrimon/rs-hm-bench\n\n## TODOs\n\n- a concurrent map or skiplist would be better than a mutexed hashmap but there\n  doesn't seem to be a prod-quality crate for it\n- is there some new kind of measurement we can do\n  for thread pools in addition to criterion benchmarks?\n- panic handling for threads in the threadpool\n\n- In `KvStore(Arc<SharedKvStore>)` example discuss patterns for accessing types,\n  particular not to be tempted to use `Deref`.\n- mention condvars somewhere\n\n-->\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/bin/kvs-client.rs",
    "content": "use clap::AppSettings;\nuse kvs::{KvsClient, Result};\nuse std::net::SocketAddr;\nuse std::process::exit;\nuse structopt::StructOpt;\n\n#[derive(StructOpt, Debug)]\n#[structopt(\n    name = \"kvs-client\",\n    raw(global_settings = \"&[\\\n                           AppSettings::DisableHelpSubcommand,\\\n                           AppSettings::VersionlessSubcommands]\")\n)]\nstruct Opt {\n    #[structopt(subcommand)]\n    command: Command,\n}\n\n#[derive(StructOpt, Debug)]\nenum Command {\n    #[structopt(name = \"get\", about = \"Get the string value of a given string key\")]\n    Get {\n        #[structopt(name = \"KEY\", help = \"A string key\")]\n        key: String,\n        #[structopt(\n            long,\n            help = \"Sets the server address\",\n            value_name = \"IP:PORT\",\n            default_value = \"127.0.0.1:4000\",\n            parse(try_from_str)\n        )]\n        addr: SocketAddr,\n    },\n    #[structopt(name = \"set\", about = \"Set the value of a string key to a string\")]\n    Set {\n        #[structopt(name = \"KEY\", help = \"A string key\")]\n        key: String,\n        #[structopt(name = \"VALUE\", help = \"The string value of the key\")]\n        value: String,\n        #[structopt(\n            long,\n            help = \"Sets the server address\",\n            value_name = \"IP:PORT\",\n            default_value = \"127.0.0.1:4000\",\n            parse(try_from_str)\n        )]\n        addr: SocketAddr,\n    },\n    #[structopt(name = \"rm\", about = \"Remove a given string key\")]\n    Remove {\n        #[structopt(name = \"KEY\", help = \"A string key\")]\n        key: String,\n        #[structopt(\n            long,\n            help = \"Sets the server address\",\n            value_name = \"IP:PORT\",\n            default_value = \"127.0.0.1:4000\",\n            parse(try_from_str)\n        )]\n        addr: SocketAddr,\n    },\n}\n\nfn main() {\n    let opt = Opt::from_args();\n    if let Err(e) = run(opt) {\n        eprintln!(\"{}\", e);\n        exit(1);\n    }\n}\n\nfn run(opt: Opt) -> Result<()> {\n    match opt.command {\n        Command::Get { key, addr } => {\n            let mut client = KvsClient::connect(addr)?;\n            if let Some(value) = client.get(key)? {\n                println!(\"{}\", value);\n            } else {\n                println!(\"Key not found\");\n            }\n        }\n        Command::Set { key, value, addr } => {\n            let mut client = KvsClient::connect(addr)?;\n            client.set(key, value)?;\n        }\n        Command::Remove { key, addr } => {\n            let mut client = KvsClient::connect(addr)?;\n            client.remove(key)?;\n        }\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/bin/kvs-server.rs",
    "content": "use clap::arg_enum;\nuse kvs::thread_pool::*;\nuse kvs::*;\nuse log::LevelFilter;\nuse log::{error, info, warn};\nuse std::env;\nuse std::env::current_dir;\nuse std::fs;\nuse std::net::SocketAddr;\nuse std::process::exit;\nuse structopt::StructOpt;\n\nconst DEFAULT_LISTENING_ADDRESS: &str = \"127.0.0.1:4000\";\nconst DEFAULT_ENGINE: Engine = Engine::kvs;\n\n#[derive(StructOpt, Debug)]\n#[structopt(name = \"kvs-server\")]\nstruct Opt {\n    #[structopt(\n        long,\n        help = \"Sets the listening address\",\n        value_name = \"IP:PORT\",\n        raw(default_value = \"DEFAULT_LISTENING_ADDRESS\"),\n        parse(try_from_str)\n    )]\n    addr: SocketAddr,\n    #[structopt(\n        long,\n        help = \"Sets the storage engine\",\n        value_name = \"ENGINE-NAME\",\n        raw(possible_values = \"&Engine::variants()\")\n    )]\n    engine: Option<Engine>,\n}\n\narg_enum! {\n    #[allow(non_camel_case_types)]\n    #[derive(Debug, Copy, Clone, PartialEq, Eq)]\n    enum Engine {\n        kvs,\n        sled\n    }\n}\n\nfn main() {\n    env_logger::builder()\n        .filter_level(LevelFilter::Info)\n        .init();\n    let mut opt = Opt::from_args();\n    let res = current_engine().and_then(move |curr_engine| {\n        if opt.engine.is_none() {\n            opt.engine = curr_engine;\n        }\n        if curr_engine.is_some() && opt.engine != curr_engine {\n            error!(\"Wrong engine!\");\n            exit(1);\n        }\n        run(opt)\n    });\n    if let Err(e) = res {\n        error!(\"{}\", e);\n        exit(1);\n    }\n}\n\nfn run(opt: Opt) -> Result<()> {\n    let engine = opt.engine.unwrap_or(DEFAULT_ENGINE);\n    info!(\"kvs-server {}\", env!(\"CARGO_PKG_VERSION\"));\n    info!(\"Storage engine: {}\", engine);\n    info!(\"Listening on {}\", opt.addr);\n\n    // write engine to engine file\n    fs::write(current_dir()?.join(\"engine\"), format!(\"{}\", engine))?;\n\n    let pool = RayonThreadPool::new(num_cpus::get() as u32)?;\n\n    match engine {\n        Engine::kvs => run_with(KvStore::open(env::current_dir()?)?, pool, opt.addr),\n        Engine::sled => run_with(\n            SledKvsEngine::new(sled::open(env::current_dir()?)?),\n            pool,\n            opt.addr,\n        ),\n    }\n}\n\npub fn run_with<E: KvsEngine, P: ThreadPool>(engine: E, pool: P, addr: SocketAddr) -> Result<()> {\n    let server = KvsServer::new(engine, pool);\n    server.run(addr)\n}\n\nfn current_engine() -> Result<Option<Engine>> {\n    let engine = current_dir()?.join(\"engine\");\n    if !engine.exists() {\n        return Ok(None);\n    }\n\n    match fs::read_to_string(engine)?.parse() {\n        Ok(engine) => Ok(Some(engine)),\n        Err(e) => {\n            warn!(\"The content of engine file is invalid: {}\", e);\n            Ok(None)\n        }\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/client.rs",
    "content": "use crate::common::{GetResponse, RemoveResponse, Request, SetResponse};\nuse crate::{KvsError, Result};\nuse serde::Deserialize;\nuse serde_json::de::{Deserializer, IoRead};\nuse std::io::{BufReader, BufWriter, Write};\nuse std::net::{TcpStream, ToSocketAddrs};\n\n/// Key value store client\npub struct KvsClient {\n    reader: Deserializer<IoRead<BufReader<TcpStream>>>,\n    writer: BufWriter<TcpStream>,\n}\n\nimpl KvsClient {\n    /// Connect to `addr` to access `KvsServer`.\n    pub fn connect<A: ToSocketAddrs>(addr: A) -> Result<Self> {\n        let tcp_reader = TcpStream::connect(addr)?;\n        let tcp_writer = tcp_reader.try_clone()?;\n        Ok(KvsClient {\n            reader: Deserializer::from_reader(BufReader::new(tcp_reader)),\n            writer: BufWriter::new(tcp_writer),\n        })\n    }\n\n    /// Get the value of a given key from the server.\n    pub fn get(&mut self, key: String) -> Result<Option<String>> {\n        serde_json::to_writer(&mut self.writer, &Request::Get { key })?;\n        self.writer.flush()?;\n        let resp = GetResponse::deserialize(&mut self.reader)?;\n        match resp {\n            GetResponse::Ok(value) => Ok(value),\n            GetResponse::Err(msg) => Err(KvsError::StringError(msg)),\n        }\n    }\n\n    /// Set the value of a string key in the server.\n    pub fn set(&mut self, key: String, value: String) -> Result<()> {\n        serde_json::to_writer(&mut self.writer, &Request::Set { key, value })?;\n        self.writer.flush()?;\n        let resp = SetResponse::deserialize(&mut self.reader)?;\n        match resp {\n            SetResponse::Ok(_) => Ok(()),\n            SetResponse::Err(msg) => Err(KvsError::StringError(msg)),\n        }\n    }\n\n    /// Remove a string key in the server.\n    pub fn remove(&mut self, key: String) -> Result<()> {\n        serde_json::to_writer(&mut self.writer, &Request::Remove { key })?;\n        self.writer.flush()?;\n        let resp = RemoveResponse::deserialize(&mut self.reader)?;\n        match resp {\n            RemoveResponse::Ok(_) => Ok(()),\n            RemoveResponse::Err(msg) => Err(KvsError::StringError(msg)),\n        }\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/common.rs",
    "content": "use serde::{Deserialize, Serialize};\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum Request {\n    Get { key: String },\n    Set { key: String, value: String },\n    Remove { key: String },\n}\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum GetResponse {\n    Ok(Option<String>),\n    Err(String),\n}\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum SetResponse {\n    Ok(()),\n    Err(String),\n}\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum RemoveResponse {\n    Ok(()),\n    Err(String),\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/engines/kvs.rs",
    "content": "use std::cell::RefCell;\nuse std::collections::BTreeMap;\nuse std::ffi::OsStr;\nuse std::fs::{self, File, OpenOptions};\nuse std::io::{self, BufReader, BufWriter, Read, Seek, SeekFrom, Write};\nuse std::ops::Range;\nuse std::path::{Path, PathBuf};\nuse std::sync::atomic::{AtomicU64, Ordering};\nuse std::sync::{Arc, Mutex};\n\nuse crossbeam_skiplist::SkipMap;\nuse log::error;\nuse serde::{Deserialize, Serialize};\nuse serde_json::Deserializer;\n\nuse super::KvsEngine;\nuse crate::{KvsError, Result};\n\nconst COMPACTION_THRESHOLD: u64 = 1024 * 1024;\n\n/// The `KvStore` stores string key/value pairs.\n///\n/// Key/value pairs are persisted to disk in log files. Log files are named after\n/// monotonically increasing generation numbers with a `log` extension name.\n/// A skip list in memory stores the keys and the value locations for fast query.\n///\n/// ```rust\n/// # use kvs::{KvStore, Result};\n/// # fn try_main() -> Result<()> {\n/// use std::env::current_dir;\n/// use kvs::KvsEngine;\n/// let mut store = KvStore::open(current_dir()?)?;\n/// store.set(\"key\".to_owned(), \"value\".to_owned())?;\n/// let val = store.get(\"key\".to_owned())?;\n/// assert_eq!(val, Some(\"value\".to_owned()));\n/// # Ok(())\n/// # }\n/// ```\n#[derive(Clone)]\npub struct KvStore {\n    // directory for the log and other data\n    path: Arc<PathBuf>,\n    // map generation number to the file reader\n    index: Arc<SkipMap<String, CommandPos>>,\n    reader: KvStoreReader,\n    writer: Arc<Mutex<KvStoreWriter>>,\n}\n\nimpl KvStore {\n    /// Opens a `KvStore` with the given path.\n    ///\n    /// This will create a new directory if the given one does not exist.\n    ///\n    /// # Errors\n    ///\n    /// It propagates I/O or deserialization errors during the log replay.\n    pub fn open(path: impl Into<PathBuf>) -> Result<KvStore> {\n        let path = Arc::new(path.into());\n        fs::create_dir_all(&*path)?;\n\n        let mut readers = BTreeMap::new();\n        let index = Arc::new(SkipMap::new());\n\n        let gen_list = sorted_gen_list(&path)?;\n        let mut uncompacted = 0;\n\n        for &gen in &gen_list {\n            let mut reader = BufReaderWithPos::new(File::open(log_path(&path, gen))?)?;\n            uncompacted += load(gen, &mut reader, &*index)?;\n            readers.insert(gen, reader);\n        }\n\n        let current_gen = gen_list.last().unwrap_or(&0) + 1;\n        let writer = new_log_file(&path, current_gen)?;\n        let safe_point = Arc::new(AtomicU64::new(0));\n\n        let reader = KvStoreReader {\n            path: Arc::clone(&path),\n            safe_point,\n            readers: RefCell::new(readers),\n        };\n\n        let writer = KvStoreWriter {\n            reader: reader.clone(),\n            writer,\n            current_gen,\n            uncompacted,\n            path: Arc::clone(&path),\n            index: Arc::clone(&index),\n        };\n\n        Ok(KvStore {\n            path,\n            reader,\n            index,\n            writer: Arc::new(Mutex::new(writer)),\n        })\n    }\n}\n\nimpl KvsEngine for KvStore {\n    /// Sets the value of a string key to a string.\n    ///\n    /// If the key already exists, the previous value will be overwritten.\n    ///\n    /// # Errors\n    ///\n    /// It propagates I/O or serialization errors during writing the log.\n    fn set(&self, key: String, value: String) -> Result<()> {\n        self.writer.lock().unwrap().set(key, value)\n    }\n\n    /// Gets the string value of a given string key.\n    ///\n    /// Returns `None` if the given key does not exist.\n    fn get(&self, key: String) -> Result<Option<String>> {\n        if let Some(cmd_pos) = self.index.get(&key) {\n            if let Command::Set { value, .. } = self.reader.read_command(*cmd_pos.value())? {\n                Ok(Some(value))\n            } else {\n                Err(KvsError::UnexpectedCommandType)\n            }\n        } else {\n            Ok(None)\n        }\n    }\n\n    /// Removes a given key.\n    ///\n    /// # Error\n    ///\n    /// It returns `KvsError::KeyNotFound` if the given key is not found.\n    ///\n    /// It propagates I/O or serialization errors during writing the log.\n    fn remove(&self, key: String) -> Result<()> {\n        self.writer.lock().unwrap().remove(key)\n    }\n}\n\n/// A single thread reader.\n///\n/// Each `KvStore` instance has its own `KvStoreReader` and\n/// `KvStoreReader`s open the same files separately. So the user\n/// can read concurrently through multiple `KvStore`s in different\n/// threads.\nstruct KvStoreReader {\n    path: Arc<PathBuf>,\n    // generation of the latest compaction file\n    safe_point: Arc<AtomicU64>,\n    readers: RefCell<BTreeMap<u64, BufReaderWithPos<File>>>,\n}\n\nimpl KvStoreReader {\n    /// Close file handles with generation number less than safe_point.\n    ///\n    /// `safe_point` is updated to the latest compaction gen after a compaction finishes.\n    /// The compaction generation contains the sum of all operations before it and the\n    /// in-memory index contains no entries with generation number less than safe_point.\n    /// So we can safely close those file handles and the stale files can be deleted.\n    fn close_stale_handles(&self) {\n        let mut readers = self.readers.borrow_mut();\n        while !readers.is_empty() {\n            let first_gen = *readers.keys().next().unwrap();\n            if self.safe_point.load(Ordering::SeqCst) <= first_gen {\n                break;\n            }\n            readers.remove(&first_gen);\n        }\n    }\n\n    /// Read the log file at the given `CommandPos`.\n    fn read_and<F, R>(&self, cmd_pos: CommandPos, f: F) -> Result<R>\n    where\n        F: FnOnce(io::Take<&mut BufReaderWithPos<File>>) -> Result<R>,\n    {\n        self.close_stale_handles();\n\n        let mut readers = self.readers.borrow_mut();\n        // Open the file if we haven't opened it in this `KvStoreReader`.\n        // We don't use entry API here because we want the errors to be propogated.\n        if !readers.contains_key(&cmd_pos.gen) {\n            let reader = BufReaderWithPos::new(File::open(log_path(&self.path, cmd_pos.gen))?)?;\n            readers.insert(cmd_pos.gen, reader);\n        }\n        let reader = readers.get_mut(&cmd_pos.gen).unwrap();\n        reader.seek(SeekFrom::Start(cmd_pos.pos))?;\n        let cmd_reader = reader.take(cmd_pos.len);\n        f(cmd_reader)\n    }\n\n    // Read the log file at the given `CommandPos` and deserialize it to `Command`.\n    fn read_command(&self, cmd_pos: CommandPos) -> Result<Command> {\n        self.read_and(cmd_pos, |cmd_reader| {\n            Ok(serde_json::from_reader(cmd_reader)?)\n        })\n    }\n}\n\nimpl Clone for KvStoreReader {\n    fn clone(&self) -> KvStoreReader {\n        KvStoreReader {\n            path: Arc::clone(&self.path),\n            safe_point: Arc::clone(&self.safe_point),\n            // don't use other KvStoreReader's readers\n            readers: RefCell::new(BTreeMap::new()),\n        }\n    }\n}\n\nstruct KvStoreWriter {\n    reader: KvStoreReader,\n    writer: BufWriterWithPos<File>,\n    current_gen: u64,\n    // the number of bytes representing \"stale\" commands that could be\n    // deleted during a compaction\n    uncompacted: u64,\n    path: Arc<PathBuf>,\n    index: Arc<SkipMap<String, CommandPos>>,\n}\n\nimpl KvStoreWriter {\n    fn set(&mut self, key: String, value: String) -> Result<()> {\n        let cmd = Command::set(key, value);\n        let pos = self.writer.pos;\n        serde_json::to_writer(&mut self.writer, &cmd)?;\n        self.writer.flush()?;\n        if let Command::Set { key, .. } = cmd {\n            if let Some(old_cmd) = self.index.get(&key) {\n                self.uncompacted += old_cmd.value().len;\n            }\n            self.index\n                .insert(key, (self.current_gen, pos..self.writer.pos).into());\n        }\n\n        if self.uncompacted > COMPACTION_THRESHOLD {\n            self.compact()?;\n        }\n        Ok(())\n    }\n\n    fn remove(&mut self, key: String) -> Result<()> {\n        if self.index.contains_key(&key) {\n            let cmd = Command::remove(key);\n            let pos = self.writer.pos;\n            serde_json::to_writer(&mut self.writer, &cmd)?;\n            self.writer.flush()?;\n            if let Command::Remove { key } = cmd {\n                let old_cmd = self.index.remove(&key).expect(\"key not found\");\n                self.uncompacted += old_cmd.value().len;\n                // the \"remove\" command itself can be deleted in the next compaction\n                // so we add its length to `uncompacted`\n                self.uncompacted += self.writer.pos - pos;\n            }\n\n            if self.uncompacted > COMPACTION_THRESHOLD {\n                self.compact()?;\n            }\n            Ok(())\n        } else {\n            Err(KvsError::KeyNotFound)\n        }\n    }\n\n    /// Clears stale entries in the log.\n    fn compact(&mut self) -> Result<()> {\n        // increase current gen by 2. current_gen + 1 is for the compaction file\n        let compaction_gen = self.current_gen + 1;\n        self.current_gen += 2;\n        self.writer = new_log_file(&self.path, self.current_gen)?;\n\n        let mut compaction_writer = new_log_file(&self.path, compaction_gen)?;\n\n        let mut new_pos = 0; // pos in the new log file\n        for entry in self.index.iter() {\n            let len = self.reader.read_and(*entry.value(), |mut entry_reader| {\n                Ok(io::copy(&mut entry_reader, &mut compaction_writer)?)\n            })?;\n            self.index.insert(\n                entry.key().clone(),\n                (compaction_gen, new_pos..new_pos + len).into(),\n            );\n            new_pos += len;\n        }\n        compaction_writer.flush()?;\n\n        self.reader\n            .safe_point\n            .store(compaction_gen, Ordering::SeqCst);\n        self.reader.close_stale_handles();\n\n        // remove stale log files\n        // Note that actually these files are not deleted immediately because `KvStoreReader`s\n        // still keep open file handles. When `KvStoreReader` is used next time, it will clear\n        // its stale file handles. On Unix, the files will be deleted after all the handles\n        // are closed. On Windows, the deletions below will fail and stale files are expected\n        // to be deleted in the next compaction.\n\n        let stale_gens = sorted_gen_list(&self.path)?\n            .into_iter()\n            .filter(|&gen| gen < compaction_gen);\n        for stale_gen in stale_gens {\n            let file_path = log_path(&self.path, stale_gen);\n            if let Err(e) = fs::remove_file(&file_path) {\n                error!(\"{:?} cannot be deleted: {}\", file_path, e);\n            }\n        }\n        self.uncompacted = 0;\n\n        Ok(())\n    }\n}\n\n/// Create a new log file with given generation number and add the reader to the readers map.\n///\n/// Returns the writer to the log.\nfn new_log_file(path: &Path, gen: u64) -> Result<BufWriterWithPos<File>> {\n    let path = log_path(&path, gen);\n    let writer = BufWriterWithPos::new(\n        OpenOptions::new()\n            .create(true)\n            .write(true)\n            .append(true)\n            .open(&path)?,\n    )?;\n    Ok(writer)\n}\n\n/// Returns sorted generation numbers in the given directory\nfn sorted_gen_list(path: &Path) -> Result<Vec<u64>> {\n    let mut gen_list: Vec<u64> = fs::read_dir(&path)?\n        .flat_map(|res| -> Result<_> { Ok(res?.path()) })\n        .filter(|path| path.is_file() && path.extension() == Some(\"log\".as_ref()))\n        .flat_map(|path| {\n            path.file_name()\n                .and_then(OsStr::to_str)\n                .map(|s| s.trim_end_matches(\".log\"))\n                .map(str::parse::<u64>)\n        })\n        .flatten()\n        .collect();\n    gen_list.sort_unstable();\n    Ok(gen_list)\n}\n\n/// Load the whole log file and store value locations in the index map.\n///\n/// Returns how many bytes can be saved after a compaction.\nfn load(\n    gen: u64,\n    reader: &mut BufReaderWithPos<File>,\n    index: &SkipMap<String, CommandPos>,\n) -> Result<u64> {\n    // To make sure we read from the beginning of the file\n    let mut pos = reader.seek(SeekFrom::Start(0))?;\n    let mut stream = Deserializer::from_reader(reader).into_iter::<Command>();\n    let mut uncompacted = 0; // number of bytes that can be saved after a compaction\n    while let Some(cmd) = stream.next() {\n        let new_pos = stream.byte_offset() as u64;\n        match cmd? {\n            Command::Set { key, .. } => {\n                if let Some(old_cmd) = index.get(&key) {\n                    uncompacted += old_cmd.value().len;\n                }\n                index.insert(key, (gen, pos..new_pos).into());\n            }\n            Command::Remove { key } => {\n                if let Some(old_cmd) = index.remove(&key) {\n                    uncompacted += old_cmd.value().len;\n                }\n                // the \"remove\" command itself can be deleted in the next compaction\n                // so we add its length to `uncompacted`\n                uncompacted += new_pos - pos;\n            }\n        }\n        pos = new_pos;\n    }\n    Ok(uncompacted)\n}\n\nfn log_path(dir: &Path, gen: u64) -> PathBuf {\n    dir.join(format!(\"{}.log\", gen))\n}\n\n/// Struct representing a command\n#[derive(Serialize, Deserialize, Debug)]\nenum Command {\n    Set { key: String, value: String },\n    Remove { key: String },\n}\n\nimpl Command {\n    fn set(key: String, value: String) -> Command {\n        Command::Set { key, value }\n    }\n\n    fn remove(key: String) -> Command {\n        Command::Remove { key }\n    }\n}\n\n/// Represents the position and length of a json-serialized command in the log\n#[derive(Debug, Clone, Copy)]\nstruct CommandPos {\n    gen: u64,\n    pos: u64,\n    len: u64,\n}\n\nimpl From<(u64, Range<u64>)> for CommandPos {\n    fn from((gen, range): (u64, Range<u64>)) -> Self {\n        CommandPos {\n            gen,\n            pos: range.start,\n            len: range.end - range.start,\n        }\n    }\n}\n\nstruct BufReaderWithPos<R: Read + Seek> {\n    reader: BufReader<R>,\n    pos: u64,\n}\n\nimpl<R: Read + Seek> BufReaderWithPos<R> {\n    fn new(mut inner: R) -> Result<Self> {\n        let pos = inner.seek(SeekFrom::Current(0))?;\n        Ok(BufReaderWithPos {\n            reader: BufReader::new(inner),\n            pos,\n        })\n    }\n}\n\nimpl<R: Read + Seek> Read for BufReaderWithPos<R> {\n    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {\n        let len = self.reader.read(buf)?;\n        self.pos += len as u64;\n        Ok(len)\n    }\n}\n\nimpl<R: Read + Seek> Seek for BufReaderWithPos<R> {\n    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {\n        self.pos = self.reader.seek(pos)?;\n        Ok(self.pos)\n    }\n}\n\nstruct BufWriterWithPos<W: Write + Seek> {\n    writer: BufWriter<W>,\n    pos: u64,\n}\n\nimpl<W: Write + Seek> BufWriterWithPos<W> {\n    fn new(mut inner: W) -> Result<Self> {\n        let pos = inner.seek(SeekFrom::Current(0))?;\n        Ok(BufWriterWithPos {\n            writer: BufWriter::new(inner),\n            pos,\n        })\n    }\n}\n\nimpl<W: Write + Seek> Write for BufWriterWithPos<W> {\n    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n        let len = self.writer.write(buf)?;\n        self.pos += len as u64;\n        Ok(len)\n    }\n\n    fn flush(&mut self) -> io::Result<()> {\n        self.writer.flush()\n    }\n}\n\nimpl<W: Write + Seek> Seek for BufWriterWithPos<W> {\n    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {\n        self.pos = self.writer.seek(pos)?;\n        Ok(self.pos)\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/engines/mod.rs",
    "content": "pub use self::kvs::KvStore;\npub use self::sled::SledKvsEngine;\nuse crate::Result;\n\nmod kvs;\nmod sled;\n\n/// Trait for a key value storage engine.\npub trait KvsEngine: Clone + Send + 'static {\n    /// Sets the value of a string key to a string.\n    ///\n    /// If the key already exists, the previous value will be overwritten.\n    fn set(&self, key: String, value: String) -> Result<()>;\n\n    /// Gets the string value of a given string key.\n    ///\n    /// Returns `None` if the given key does not exist.\n    fn get(&self, key: String) -> Result<Option<String>>;\n\n    /// Removes a given key.\n    ///\n    /// # Errors\n    ///\n    /// It returns `KvsError::KeyNotFound` if the given key is not found.\n    fn remove(&self, key: String) -> Result<()>;\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/engines/sled.rs",
    "content": "use super::KvsEngine;\nuse crate::{KvsError, Result};\nuse sled::{Db, Tree};\n\n/// Wrapper of `sled::Db`\n#[derive(Clone)]\npub struct SledKvsEngine(Db);\n\nimpl SledKvsEngine {\n    /// Creates a `SledKvsEngine` from `sled::Db`.\n    pub fn new(db: Db) -> Self {\n        SledKvsEngine(db)\n    }\n}\n\nimpl KvsEngine for SledKvsEngine {\n    fn set(&self, key: String, value: String) -> Result<()> {\n        let tree: &Tree = &self.0;\n        tree.insert(key, value.into_bytes()).map(|_| ())?;\n        tree.flush()?;\n        Ok(())\n    }\n\n    fn get(&self, key: String) -> Result<Option<String>> {\n        let tree: &Tree = &self.0;\n        Ok(tree\n            .get(key)?\n            .map(|i_vec| AsRef::<[u8]>::as_ref(&i_vec).to_vec())\n            .map(String::from_utf8)\n            .transpose()?)\n    }\n\n    fn remove(&self, key: String) -> Result<()> {\n        let tree: &Tree = &self.0;\n        tree.remove(key)?.ok_or(KvsError::KeyNotFound)?;\n        tree.flush()?;\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/error.rs",
    "content": "use failure::Fail;\nuse std::io;\nuse std::string::FromUtf8Error;\n\n/// Error type for kvs\n#[derive(Fail, Debug)]\npub enum KvsError {\n    /// IO error\n    #[fail(display = \"IO error: {}\", _0)]\n    Io(#[cause] io::Error),\n    /// Serialization or deserialization error\n    #[fail(display = \"serde_json error: {}\", _0)]\n    Serde(#[cause] serde_json::Error),\n    /// Removing non-existent key error\n    #[fail(display = \"Key not found\")]\n    KeyNotFound,\n    /// Unexpected command type error.\n    /// It indicated a corrupted log or a program bug.\n    #[fail(display = \"Unexpected command type\")]\n    UnexpectedCommandType,\n    /// Key or value is invalid UTF-8 sequence\n    #[fail(display = \"UTF-8 error: {}\", _0)]\n    Utf8(#[cause] FromUtf8Error),\n    /// Sled error\n    #[fail(display = \"sled error: {}\", _0)]\n    Sled(#[cause] sled::Error),\n    /// Error with a string message\n    #[fail(display = \"{}\", _0)]\n    StringError(String),\n}\n\nimpl From<io::Error> for KvsError {\n    fn from(err: io::Error) -> KvsError {\n        KvsError::Io(err)\n    }\n}\n\nimpl From<serde_json::Error> for KvsError {\n    fn from(err: serde_json::Error) -> KvsError {\n        KvsError::Serde(err)\n    }\n}\n\nimpl From<FromUtf8Error> for KvsError {\n    fn from(err: FromUtf8Error) -> KvsError {\n        KvsError::Utf8(err)\n    }\n}\n\nimpl From<sled::Error> for KvsError {\n    fn from(err: sled::Error) -> KvsError {\n        KvsError::Sled(err)\n    }\n}\n\n/// Result type for kvs\npub type Result<T> = std::result::Result<T, KvsError>;\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/lib.rs",
    "content": "#![deny(missing_docs)]\n//! A simple key/value store.\n\npub use client::KvsClient;\npub use engines::{KvStore, KvsEngine, SledKvsEngine};\npub use error::{KvsError, Result};\npub use server::KvsServer;\n\nmod client;\nmod common;\nmod engines;\nmod error;\nmod server;\npub mod thread_pool;\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/server.rs",
    "content": "use crate::common::{GetResponse, RemoveResponse, Request, SetResponse};\nuse crate::thread_pool::ThreadPool;\nuse crate::{KvsEngine, Result};\nuse log::{debug, error};\nuse serde_json::Deserializer;\nuse std::io::{BufReader, BufWriter, Write};\nuse std::net::{TcpListener, TcpStream, ToSocketAddrs};\n\n/// The server of a key value store.\npub struct KvsServer<E: KvsEngine, P: ThreadPool> {\n    engine: E,\n    pool: P,\n}\n\nimpl<E: KvsEngine, P: ThreadPool> KvsServer<E, P> {\n    /// Create a `KvsServer` with a given storage engine.\n    pub fn new(engine: E, pool: P) -> Self {\n        KvsServer { engine, pool }\n    }\n\n    /// Run the server listening on the given address\n    pub fn run<A: ToSocketAddrs>(self, addr: A) -> Result<()> {\n        let listener = TcpListener::bind(addr)?;\n        for stream in listener.incoming() {\n            let engine = self.engine.clone();\n            self.pool.spawn(move || match stream {\n                Ok(stream) => {\n                    if let Err(e) = serve(engine, stream) {\n                        error!(\"Error on serving client: {}\", e);\n                    }\n                }\n                Err(e) => error!(\"Connection failed: {}\", e),\n            })\n        }\n        Ok(())\n    }\n}\n\nfn serve<E: KvsEngine>(engine: E, tcp: TcpStream) -> Result<()> {\n    let peer_addr = tcp.peer_addr()?;\n    let reader = BufReader::new(&tcp);\n    let mut writer = BufWriter::new(&tcp);\n    let req_reader = Deserializer::from_reader(reader).into_iter::<Request>();\n\n    macro_rules! send_resp {\n        ($resp:expr) => {{\n            let resp = $resp;\n            serde_json::to_writer(&mut writer, &resp)?;\n            writer.flush()?;\n            debug!(\"Response sent to {}: {:?}\", peer_addr, resp);\n        };};\n    }\n\n    for req in req_reader {\n        let req = req?;\n        debug!(\"Receive request from {}: {:?}\", peer_addr, req);\n        match req {\n            Request::Get { key } => send_resp!(match engine.get(key) {\n                Ok(value) => GetResponse::Ok(value),\n                Err(e) => GetResponse::Err(format!(\"{}\", e)),\n            }),\n            Request::Set { key, value } => send_resp!(match engine.set(key, value) {\n                Ok(_) => SetResponse::Ok(()),\n                Err(e) => SetResponse::Err(format!(\"{}\", e)),\n            }),\n            Request::Remove { key } => send_resp!(match engine.remove(key) {\n                Ok(_) => RemoveResponse::Ok(()),\n                Err(e) => RemoveResponse::Err(format!(\"{}\", e)),\n            }),\n        };\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/thread_pool/mod.rs",
    "content": "//! This module provides various thread pools. All thread pools should implement\n//! the `ThreadPool` trait.\n\nuse crate::Result;\n\nmod naive;\nmod rayon;\nmod shared_queue;\n\npub use self::naive::NaiveThreadPool;\npub use self::rayon::RayonThreadPool;\npub use self::shared_queue::SharedQueueThreadPool;\n\n/// The trait that all thread pools should implement.\npub trait ThreadPool {\n    /// Creates a new thread pool, immediately spawning the specified number of\n    /// threads.\n    ///\n    /// Returns an error if any thread fails to spawn. All previously-spawned threads\n    /// are terminated.\n    fn new(threads: u32) -> Result<Self>\n    where\n        Self: Sized;\n\n    /// Spawns a function into the thread pool.\n    ///\n    /// Spawning always succeeds, but if the function panics the threadpool continues\n    /// to operate with the same number of threads &mdash; the thread count is not\n    /// reduced nor is the thread pool destroyed, corrupted or invalidated.\n    fn spawn<F>(&self, job: F)\n    where\n        F: FnOnce() + Send + 'static;\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/thread_pool/naive.rs",
    "content": "use std::thread;\n\nuse super::ThreadPool;\nuse crate::Result;\n\n/// It is actually not a thread pool. It spawns a new thread every time\n/// the `spawn` method is called.\npub struct NaiveThreadPool;\n\nimpl ThreadPool for NaiveThreadPool {\n    fn new(_threads: u32) -> Result<Self> {\n        Ok(NaiveThreadPool)\n    }\n\n    fn spawn<F>(&self, job: F)\n    where\n        F: FnOnce() + Send + 'static,\n    {\n        thread::spawn(job);\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/thread_pool/rayon.rs",
    "content": "use super::ThreadPool;\nuse crate::{KvsError, Result};\n\n/// Wrapper of rayon::ThreadPool\npub struct RayonThreadPool(rayon::ThreadPool);\n\nimpl ThreadPool for RayonThreadPool {\n    fn new(threads: u32) -> Result<Self> {\n        let pool = rayon::ThreadPoolBuilder::new()\n            .num_threads(threads as usize)\n            .build()\n            .map_err(|e| KvsError::StringError(format!(\"{}\", e)))?;\n        Ok(RayonThreadPool(pool))\n    }\n\n    fn spawn<F>(&self, job: F)\n    where\n        F: FnOnce() + Send + 'static,\n    {\n        self.0.spawn(job)\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/src/thread_pool/shared_queue.rs",
    "content": "use std::thread;\n\nuse super::ThreadPool;\nuse crate::Result;\n\nuse crossbeam::channel::{self, Receiver, Sender};\n\nuse log::{debug, error};\n\n// Note for Rust training course: the thread pool is not implemented using\n// `catch_unwind` because it would require the task to be `UnwindSafe`.\n\n/// A thread pool using a shared queue inside.\n///\n/// If a spawned task panics, the old thread will be destroyed and a new one will be\n/// created. It fails silently when any failure to create the thread at the OS level\n/// is captured after the thread pool is created. So, the thread number in the pool\n/// can decrease to zero, then spawning a task to the thread pool will panic.\npub struct SharedQueueThreadPool {\n    tx: Sender<Box<dyn FnOnce() + Send + 'static>>,\n}\n\nimpl ThreadPool for SharedQueueThreadPool {\n    fn new(threads: u32) -> Result<Self> {\n        let (tx, rx) = channel::unbounded::<Box<dyn FnOnce() + Send + 'static>>();\n        for _ in 0..threads {\n            let rx = TaskReceiver(rx.clone());\n            thread::Builder::new().spawn(move || run_tasks(rx))?;\n        }\n        Ok(SharedQueueThreadPool { tx })\n    }\n\n    /// Spawns a function into the thread pool.\n    ///\n    /// # Panics\n    ///\n    /// Panics if the thread pool has no thread.\n    fn spawn<F>(&self, job: F)\n    where\n        F: FnOnce() + Send + 'static,\n    {\n        self.tx\n            .send(Box::new(job))\n            .expect(\"The thread pool has no thread.\");\n    }\n}\n\n#[derive(Clone)]\nstruct TaskReceiver(Receiver<Box<dyn FnOnce() + Send + 'static>>);\n\nimpl Drop for TaskReceiver {\n    fn drop(&mut self) {\n        if thread::panicking() {\n            let rx = self.clone();\n            if let Err(e) = thread::Builder::new().spawn(move || run_tasks(rx)) {\n                error!(\"Failed to spawn a thread: {}\", e);\n            }\n        }\n    }\n}\n\nfn run_tasks(rx: TaskReceiver) {\n    loop {\n        match rx.0.recv() {\n            Ok(task) => {\n                task();\n            }\n            Err(_) => debug!(\"Thread exits because the thread pool is destroyed.\"),\n        }\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/tests/cli.rs",
    "content": "use assert_cmd::prelude::*;\nuse predicates::str::{contains, is_empty};\nuse std::fs::{self, File};\nuse std::process::Command;\nuse std::sync::mpsc;\nuse std::thread;\nuse std::time::Duration;\nuse tempfile::TempDir;\n\n// `kvs-client` with no args should exit with a non-zero code.\n#[test]\nfn client_cli_no_args() {\n    let temp_dir = TempDir::new().unwrap();\n    let mut cmd = Command::cargo_bin(\"kvs-client\").unwrap();\n    cmd.current_dir(&temp_dir).assert().failure();\n}\n\n#[test]\nfn client_cli_invalid_get() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"extra\", \"field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key\", \"--addr\", \"invalid-addr\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key\", \"--unknown-flag\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n#[test]\nfn client_cli_invalid_set() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"missing_field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key\", \"value\", \"extra_field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key\", \"value\", \"--addr\", \"invalid-addr\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key\", \"--unknown-flag\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n#[test]\nfn client_cli_invalid_rm() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"extra\", \"field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key\", \"--addr\", \"invalid-addr\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key\", \"--unknown-flag\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n#[test]\nfn client_cli_invalid_subcommand() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"unknown\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n// `kvs-client -V` should print the version\n#[test]\nfn client_cli_version() {\n    let temp_dir = TempDir::new().unwrap();\n    let mut cmd = Command::cargo_bin(\"kvs-client\").unwrap();\n    cmd.args(&[\"-V\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .stdout(contains(env!(\"CARGO_PKG_VERSION\")));\n}\n\n// `kvs-server -V` should print the version\n#[test]\nfn server_cli_version() {\n    let temp_dir = TempDir::new().unwrap();\n    let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n    cmd.args(&[\"-V\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .stdout(contains(env!(\"CARGO_PKG_VERSION\")));\n}\n\n#[test]\nfn cli_log_configuration() {\n    let temp_dir = TempDir::new().unwrap();\n    let stderr_path = temp_dir.path().join(\"stderr\");\n    let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n    let mut child = cmd\n        .args(&[\"--engine\", \"kvs\", \"--addr\", \"127.0.0.1:4001\"])\n        .current_dir(&temp_dir)\n        .stderr(File::create(&stderr_path).unwrap())\n        .spawn()\n        .unwrap();\n    thread::sleep(Duration::from_secs(1));\n    child.kill().expect(\"server exited before killed\");\n\n    let content = fs::read_to_string(&stderr_path).expect(\"unable to read from stderr file\");\n    assert!(content.contains(env!(\"CARGO_PKG_VERSION\")));\n    assert!(content.contains(\"kvs\"));\n    assert!(content.contains(\"127.0.0.1:4001\"));\n}\n\n#[test]\nfn cli_wrong_engine() {\n    // sled first, kvs second\n    {\n        let temp_dir = TempDir::new().unwrap();\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        let mut child = cmd\n            .args(&[\"--engine\", \"sled\", \"--addr\", \"127.0.0.1:4002\"])\n            .current_dir(&temp_dir)\n            .spawn()\n            .unwrap();\n        thread::sleep(Duration::from_secs(1));\n        child.kill().expect(\"server exited before killed\");\n\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        cmd.args(&[\"--engine\", \"kvs\", \"--addr\", \"127.0.0.1:4003\"])\n            .current_dir(&temp_dir)\n            .assert()\n            .failure();\n    }\n\n    // kvs first, sled second\n    {\n        let temp_dir = TempDir::new().unwrap();\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        let mut child = cmd\n            .args(&[\"--engine\", \"kvs\", \"--addr\", \"127.0.0.1:4002\"])\n            .current_dir(&temp_dir)\n            .spawn()\n            .unwrap();\n        thread::sleep(Duration::from_secs(1));\n        child.kill().expect(\"server exited before killed\");\n\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        cmd.args(&[\"--engine\", \"sled\", \"--addr\", \"127.0.0.1:4003\"])\n            .current_dir(&temp_dir)\n            .assert()\n            .failure();\n    }\n}\n\nfn cli_access_server(engine: &str, addr: &str) {\n    let (sender, receiver) = mpsc::sync_channel(0);\n    let temp_dir = TempDir::new().unwrap();\n    let mut server = Command::cargo_bin(\"kvs-server\").unwrap();\n    let mut child = server\n        .args(&[\"--engine\", engine, \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .spawn()\n        .unwrap();\n    let handle = thread::spawn(move || {\n        let _ = receiver.recv(); // wait for main thread to finish\n        child.kill().expect(\"server exited before killed\");\n    });\n    thread::sleep(Duration::from_secs(1));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key1\", \"value1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(\"value1\\n\");\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key1\", \"value2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(\"value2\\n\");\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(contains(\"Key not found\"));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure()\n        .stderr(contains(\"Key not found\"));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key2\", \"value3\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    sender.send(()).unwrap();\n    handle.join().unwrap();\n\n    // Reopen and check value\n    let (sender, receiver) = mpsc::sync_channel(0);\n    let mut server = Command::cargo_bin(\"kvs-server\").unwrap();\n    let mut child = server\n        .args(&[\"--engine\", engine, \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .spawn()\n        .unwrap();\n    let handle = thread::spawn(move || {\n        let _ = receiver.recv(); // wait for main thread to finish\n        child.kill().expect(\"server exited before killed\");\n    });\n    thread::sleep(Duration::from_secs(1));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(contains(\"value3\"));\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(contains(\"Key not found\"));\n    sender.send(()).unwrap();\n    handle.join().unwrap();\n}\n\n#[test]\nfn cli_access_server_kvs_engine() {\n    cli_access_server(\"kvs\", \"127.0.0.1:4004\");\n}\n\n#[test]\nfn cli_access_server_sled_engine() {\n    cli_access_server(\"sled\", \"127.0.0.1:4005\");\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/tests/kv_store.rs",
    "content": "use kvs::{KvStore, KvsEngine, Result};\nuse std::sync::{Arc, Barrier};\nuse std::thread;\nuse tempfile::TempDir;\nuse walkdir::WalkDir;\n\n// Should get previously stored value\n#[test]\nfn get_stored_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::open(temp_dir.path())?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    store.set(\"key2\".to_owned(), \"value2\".to_owned())?;\n\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value1\".to_owned()));\n    assert_eq!(store.get(\"key2\".to_owned())?, Some(\"value2\".to_owned()));\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let store = KvStore::open(temp_dir.path())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value1\".to_owned()));\n    assert_eq!(store.get(\"key2\".to_owned())?, Some(\"value2\".to_owned()));\n\n    Ok(())\n}\n\n// Should overwrite existent value\n#[test]\nfn overwrite_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::open(temp_dir.path())?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value1\".to_owned()));\n    store.set(\"key1\".to_owned(), \"value2\".to_owned())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value2\".to_owned()));\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let store = KvStore::open(temp_dir.path())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value2\".to_owned()));\n    store.set(\"key1\".to_owned(), \"value3\".to_owned())?;\n    assert_eq!(store.get(\"key1\".to_owned())?, Some(\"value3\".to_owned()));\n\n    Ok(())\n}\n\n// Should get `None` when getting a non-existent key\n#[test]\nfn get_non_existent_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::open(temp_dir.path())?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    assert_eq!(store.get(\"key2\".to_owned())?, None);\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let store = KvStore::open(temp_dir.path())?;\n    assert_eq!(store.get(\"key2\".to_owned())?, None);\n\n    Ok(())\n}\n\n#[test]\nfn remove_non_existent_key() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::open(temp_dir.path())?;\n    assert!(store.remove(\"key1\".to_owned()).is_err());\n    Ok(())\n}\n\n#[test]\nfn remove_key() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::open(temp_dir.path())?;\n    store.set(\"key1\".to_owned(), \"value1\".to_owned())?;\n    assert!(store.remove(\"key1\".to_owned()).is_ok());\n    assert_eq!(store.get(\"key1\".to_owned())?, None);\n    Ok(())\n}\n\n// Insert data until total size of the directory decreases.\n// Test data correctness after compaction.\n#[test]\nfn compaction() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::open(temp_dir.path())?;\n\n    let dir_size = || {\n        let entries = WalkDir::new(temp_dir.path()).into_iter();\n        let len: walkdir::Result<u64> = entries\n            .map(|res| {\n                res.and_then(|entry| entry.metadata())\n                    .map(|metadata| metadata.len())\n            })\n            .sum();\n        len.expect(\"fail to get directory size\")\n    };\n\n    let mut current_size = dir_size();\n    for iter in 0..1000 {\n        for key_id in 0..1000 {\n            let key = format!(\"key{}\", key_id);\n            let value = format!(\"{}\", iter);\n            store.set(key, value)?;\n        }\n\n        let new_size = dir_size();\n        if new_size > current_size {\n            current_size = new_size;\n            continue;\n        }\n        // Compaction triggered\n\n        drop(store);\n        // reopen and check content\n        let store = KvStore::open(temp_dir.path())?;\n        for key_id in 0..1000 {\n            let key = format!(\"key{}\", key_id);\n            assert_eq!(store.get(key)?, Some(format!(\"{}\", iter)));\n        }\n        return Ok(());\n    }\n\n    panic!(\"No compaction detected\");\n}\n\n#[test]\nfn concurrent_set() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::open(temp_dir.path())?;\n    let barrier = Arc::new(Barrier::new(1001));\n    for i in 0..1000 {\n        let store = store.clone();\n        let barrier = barrier.clone();\n        thread::spawn(move || {\n            store\n                .set(format!(\"key{}\", i), format!(\"value{}\", i))\n                .unwrap();\n            barrier.wait();\n        });\n    }\n    barrier.wait();\n\n    for i in 0..1000 {\n        assert_eq!(store.get(format!(\"key{}\", i))?, Some(format!(\"value{}\", i)));\n    }\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let store = KvStore::open(temp_dir.path())?;\n    for i in 0..1000 {\n        assert_eq!(store.get(format!(\"key{}\", i))?, Some(format!(\"value{}\", i)));\n    }\n\n    Ok(())\n}\n\n#[test]\nfn concurrent_get() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::open(temp_dir.path())?;\n    for i in 0..100 {\n        store\n            .set(format!(\"key{}\", i), format!(\"value{}\", i))\n            .unwrap();\n    }\n\n    let mut handles = Vec::new();\n    for thread_id in 0..100 {\n        let store = store.clone();\n        let handle = thread::spawn(move || {\n            for i in 0..100 {\n                let key_id = (i + thread_id) % 100;\n                assert_eq!(\n                    store.get(format!(\"key{}\", key_id)).unwrap(),\n                    Some(format!(\"value{}\", key_id))\n                );\n            }\n        });\n        handles.push(handle);\n    }\n    for handle in handles {\n        handle.join().unwrap();\n    }\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let store = KvStore::open(temp_dir.path())?;\n    let mut handles = Vec::new();\n    for thread_id in 0..100 {\n        let store = store.clone();\n        let handle = thread::spawn(move || {\n            for i in 0..100 {\n                let key_id = (i + thread_id) % 100;\n                assert_eq!(\n                    store.get(format!(\"key{}\", key_id)).unwrap(),\n                    Some(format!(\"value{}\", key_id))\n                );\n            }\n        });\n        handles.push(handle);\n    }\n    for handle in handles {\n        handle.join().unwrap();\n    }\n\n    Ok(())\n}\n"
  },
  {
    "path": "courses/rust/projects/project-4/tests/thread_pool.rs",
    "content": "use std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::Arc;\n\nuse kvs::thread_pool::*;\nuse kvs::Result;\n\nuse crossbeam_utils::sync::WaitGroup;\n\nfn spawn_counter<P: ThreadPool>(pool: P) -> Result<()> {\n    const TASK_NUM: usize = 20;\n    const ADD_COUNT: usize = 1000;\n\n    let wg = WaitGroup::new();\n    let counter = Arc::new(AtomicUsize::new(0));\n\n    for _ in 0..TASK_NUM {\n        let counter = Arc::clone(&counter);\n        let wg = wg.clone();\n        pool.spawn(move || {\n            for _ in 0..ADD_COUNT {\n                counter.fetch_add(1, Ordering::SeqCst);\n            }\n            drop(wg);\n        })\n    }\n\n    wg.wait();\n    assert_eq!(counter.load(Ordering::SeqCst), TASK_NUM * ADD_COUNT);\n    Ok(())\n}\n\nfn spawn_panic_task<P: ThreadPool>() -> Result<()> {\n    const TASK_NUM: usize = 1000;\n\n    let pool = P::new(4)?;\n    for _ in 0..TASK_NUM {\n        pool.spawn(move || {\n            // It suppresses flood of panic messages to the console.\n            // You may find it useful to comment this out during development.\n            panic_control::disable_hook_in_current_thread();\n\n            panic!();\n        })\n    }\n\n    spawn_counter(pool)\n}\n\n#[test]\nfn naive_thread_pool_spawn_counter() -> Result<()> {\n    let pool = NaiveThreadPool::new(4)?;\n    spawn_counter(pool)\n}\n\n#[test]\nfn shared_queue_thread_pool_spawn_counter() -> Result<()> {\n    let pool = SharedQueueThreadPool::new(4)?;\n    spawn_counter(pool)\n}\n\n#[test]\nfn rayon_thread_pool_spawn_counter() -> Result<()> {\n    let pool = RayonThreadPool::new(4)?;\n    spawn_counter(pool)\n}\n\n#[test]\nfn shared_queue_thread_pool_panic_task() -> Result<()> {\n    spawn_panic_task::<SharedQueueThreadPool>()\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/Cargo.toml",
    "content": "[package]\nname = \"kvs\"\nversion = \"0.1.0\"\nauthors = [\"Yilin Chen <sticnarf@gmail.com>\"]\ndescription = \"A key-value store\"\nedition = \"2018\"\n\n[dependencies]\nclap = \"2.33.0\"\nstructopt = \"0.2.15\"\nfailure = \"0.1.5\"\nserde = { version = \"1.0.89\", features = [\"derive\"] }\nserde_json = \"1.0.39\"\nlog = \"0.4.6\"\nenv_logger = \"0.6.1\"\nsled = \"0.22.1\"\ncrossbeam = \"0.7.1\"\nrayon = \"1.0.3\"\nnum_cpus = \"1.10.0\"\ncrossbeam-skiplist = { version = \"0.0.0\", git = \"https://github.com/crossbeam-rs/crossbeam.git\", rev = \"8cc906b\" }\ntokio = \"0.1.21\"\ntokio-serde-json = \"0.2.0\"\n\n[dev-dependencies]\nassert_cmd = \"0.11\"\ncriterion = \"0.2.11\"\ncrossbeam-utils = \"0.6.5\"\npredicates = \"1.0.0\"\nrand = \"0.6.5\"\ntempfile = \"3.0.7\"\nwalkdir = \"2.2.7\"\npanic-control = \"0.1.4\""
  },
  {
    "path": "courses/rust/projects/project-5/README.md",
    "content": "# Project: Asynchrony\n\n**Task**: Create a multi-threaded, persistent key/value store server and client\nwith _asynchronous_ networking over a custom protocol.\n\n**Goals**:\n\n- Understand the patterns used when writing Rust futures\n- Understand error handling with futures\n- Learn to debug the type system\n- Perform asynchronous networking with the tokio runtime\n- Use boxed futures to handle difficult type-system problems\n- Use `impl Trait` to create anonymous `Future` types\n\n**Topics**: asynchrony, futures, tokio, `impl Trait`.\n\n**Extensions**: tokio-fs.\n\n- [Introduction](#user-content-introduction)\n- [Project spec](#user-content-project-spec)\n- [Project setup](#user-content-project-setup)\n- [Background: Thinking in futures, in Rust](#user-content-background-thinking-in-futures,-in-rust)\n- [Part 1: Introducing tokio to the client](#user-content-part-1-introducing-tokio-to-the-client)\n- [Part 2: Converting `KvsClient` to boxed futures](#user-content-part-2-converting-kvsclient-to-boxed-futures)\n- [Part 3: `KvsClient` with explicit future types](#user-content-part-3-kvsclient-with-explicit-future-types)\n- [Part 4: `KvsClient` with anonymous future types](#user-content-part-4-kvsclient-with-anonymous-future-types)\n- [Part 5: Making `ThreadPool` sharable](#user-content-part-5-making-threadpool-sharable)\n- [Part 6: Converting `KvsEngine` to futures](#user-content-part-6-converting-kvsengine-to-futures)\n- [Part 7: Driving `KvsEngine` with tokio](#user-content-part-7-driving-kvsengine-with-tokio)\n- [Extension 1: Converting to tokio-fs](#user-content-extension-1-converting-to-tokio-fs)\n\n\n## Introduction\n\n_Note: this project is only outlined, not written. If you are at this point in\nthe course email brian@pingcap.com and let me know and I will finish writing it\nASAP._\n\nIn this project you will create a simple key/value server and client that\ncommunicate over a custom protocol. The server will use asynchronous networking,\nbuilt on the tokio runtime. The key/value engine that reads and writes to files\nwill remain synchronous, scheduling work on an underlying thread pool, while\npresenting an asynchronous interface. Along the way you will experiment\nwith multiple ways of defining and working with future types.\n\nBecause learning to program with Rust futures is especially challenging, and\nexisting documentation on the subject is limited, the scope of this project is\nrelatively modest, and it contains more direct explanation than past projects.\n\nBe sure to read the background readings on this project. And if you get\nfrustrated, then forgive yourself, take a break, and try again with a fresh\nmind. Writing asynchronous Rust is difficult for everybody.\n\n\n## Project spec\n\nThe cargo project, `kvs`, builds a command-line key-value store client called\n`kvs-client`, and a key-value store server called `kvs-server`, both of which in\nturn call into a library called `kvs`. The client speaks to the server over\na custom protocol.\n\nThe interface to the CLI is the same as in the [previous project]. The engine\nimplementation is largely the same, distributing synchronous file I/O over\na thread pool.\n\nThe difference this time is that all the networking is performed asynchronously.\n\nAs part of the conversion to asynchrony, the `KvsClient` will present a\nfutures-based API, and the `KvsEngine` trait will also present a futures-based\nAPI, even while it is implemented with blocking (synchronous) I/O via a thread\npool.\n\nYour `KvsServer` will be based on the tokio runtime, which handles the\ndistribution of asynchronous work to multiple threads on its own (tokio itself\ncontains a thread pool). This means that your architecture will actually have\ntwo layers of thread pools: the first handling with the networking,\nasynchronously, one thread per core; the second handling the file I/O,\nsynchronously, with enough threads to keep the networking threads as busy as\npossible.\n\nAs a result if this architectural change, where your jobs will be spawned into\nyour thread pool from multiple threads, your `ThreadPool` trait and its\nimplementations will become shared types implementing `Clone + Send + 'sync`, as\nyour `KvsEngine` is.\n\nBecause you will be experimenting with multiple definitions of the futures\nreturned by these types, they aren't fully specified here, and instead will be\nspecified as they are called for.\n\nMore specifically, you will work with function signatures like all the\nfollowing:\n\n- `Client::get(&mut self, key: String) -> Box<Future<Item = Option<String>, Error = Error>`\n\n- `Client::get(&mut self, key: String) -> future::SomeExplicitCombinator<...>`\n\n- `Client::get(&mut self, key: String) -> impl Future<Item = Option<String>, Error = Error>`\n\n- `Client::get(&mut self, key: String) -> ClientGetFuture`\n\n\n\n## Project setup\n\nContinuing from your previous project, delete your privous `tests` directory and\ncopy this project's `tests` directory into its place. This project should\ncontain a library named `kvs`, and two executables, `kvs-server` and\n`kvs-client`.\n\nYou need the following dev-dependencies in your `Cargo.toml`:\n\n```toml\n[dev-dependencies]\nassert_cmd = \"0.11\"\ncriterion = \"0.2.11\"\ncrossbeam-utils = \"0.6.5\"\npredicates = \"1.0.0\"\nrand = \"0.6.5\"\ntempfile = \"3.0.7\"\nwalkdir = \"2.2.7\"\npanic-control = \"0.1.4\"\n```\n\nUnlike with previous projects, don't bother to fill in enough type definitions\nto make the test suite compile. Doing so would require jumping a number of steps\nahead at once. The text will indicate when to working with the test suite.\n\n\n## Background: Thinking in futures, in Rust\n\n- why futures? networking vs file/io, blocking vs non-blocking, sync vs async\n- futures from a user persective (not a poll-centric implementation perspective)\n- don't think too hard about executors and runtimes\n- method chaining and how it transforms the future type\n- debugging Rust types\n- Result vs Future vs FutureResult\n- error handling with futures\n- concrete futures vs boxed futures vs anonymous futures\n- note about futures 0.1 and futures 0.3 (we'll use futures 0.1)\n- note about async / await\n\n\n## Part 1: Introducing tokio to the client\n\nUltimately we're going to convert both the client and server to futures, but\nsince the client is so simple, that's where we'll start. And we're going to\nintroduce the tokio runtime first, while using your existing synchronous\n`KvsClient`.\n\nThe \n\nfor the client we're going to introduce the async runtime while keeping\nthe sync `KvsClient`, then convert the `KvsClient`. The `connect` method\nof `KvsClient`. note that as a library `KvsClient` can offer the most\nefficiency based on futures, but our kvs-client bin doesn't take advantage\nof it, so the bin is going to look a bit silly running a single future\nand exiting.\n\nTODO @sticnarf - see if you can write test cases that are agnostic to the\nconcrete future types, so they work with all the below strategies.\n\n\n## Part 2: Converting `KvsClient` to boxed futures\n\nthe path of least resistence for future types\n\n\n## Part 3: `KvsClient` with explicit future types\n\njust to have the experience of seeing how untenable it is\n\n\n## Part 4: `KvsClient` with anonymous future types\n\nthe final solution\n\n\n## Part 5: Making `ThreadPool` sharable\n\n\n## Part 6: Converting `KvsEngine` to futures\n\nfor the server we're going to do the opposite of what we did in the client, and\ngive `KvsEngine` an async interface. this will show that futures and the\nunderlying runtime are independent, and just general provide a spectrum of\nexperience.\n\n\n## Part 7: Driving `KvsEngine` with tokio\n\nnote that even though we have ourselves have written very little asynchronous\ncode, that tokio itself is distributing asynchronous work across num_cpus\nthreads. think about the tradeoffs of putting cpu-intensive work directly on the\nnetwork threads or the file threads, e.g. where does the serialization go?\n\nTODO\n\nNice coding, friend. Enjoy a nice break.\n\n\n---\n\n\n## Extension 1: Converting to tokio-fs\n\nnot sure if this should be required or an extension\n\n\n<!--\n\nTODO:\n- can we find an excuse to write a future by hand?\n\n- background readings\n  - something on associated types\n\nvia @sticnarf:\n\n> As there is only the outline of project 5, I write the code mostly according to\nmy own thoughts. Hope this will be a reference while you're writing the text.\n@brson\n\n> I change the concurrent_get/set tests to use async. Students should change their\nSledKvsEngine and KvStore to adapt to the KvsEngine trait with new async APIs.\nThe engines have a ThreadPool type parameter and the constructor has a\nconcurrency argument (maybe we should remove it). Students need to follow the\ndesign so that the test will work.\n\n> I don't test the client. Implementors can choose the API design of the client\nthemselves (unless we work out a perfect design so we can just give instructions\nto students).\n\n-->\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/bin/kvs-client.rs",
    "content": "use clap::AppSettings;\nuse kvs::{KvsClient, Result};\nuse std::net::SocketAddr;\nuse std::process::exit;\nuse structopt::StructOpt;\nuse tokio::prelude::*;\n\n#[derive(StructOpt, Debug)]\n#[structopt(\n    name = \"kvs-client\",\n    raw(global_settings = \"&[\\\n                           AppSettings::DisableHelpSubcommand,\\\n                           AppSettings::VersionlessSubcommands]\")\n)]\nstruct Opt {\n    #[structopt(subcommand)]\n    command: Command,\n}\n\n#[derive(StructOpt, Debug)]\nenum Command {\n    #[structopt(name = \"get\", about = \"Get the string value of a given string key\")]\n    Get {\n        #[structopt(name = \"KEY\", help = \"A string key\")]\n        key: String,\n        #[structopt(\n            long,\n            help = \"Sets the server address\",\n            value_name = \"IP:PORT\",\n            default_value = \"127.0.0.1:4000\",\n            parse(try_from_str)\n        )]\n        addr: SocketAddr,\n    },\n    #[structopt(name = \"set\", about = \"Set the value of a string key to a string\")]\n    Set {\n        #[structopt(name = \"KEY\", help = \"A string key\")]\n        key: String,\n        #[structopt(name = \"VALUE\", help = \"The string value of the key\")]\n        value: String,\n        #[structopt(\n            long,\n            help = \"Sets the server address\",\n            value_name = \"IP:PORT\",\n            default_value = \"127.0.0.1:4000\",\n            parse(try_from_str)\n        )]\n        addr: SocketAddr,\n    },\n    #[structopt(name = \"rm\", about = \"Remove a given string key\")]\n    Remove {\n        #[structopt(name = \"KEY\", help = \"A string key\")]\n        key: String,\n        #[structopt(\n            long,\n            help = \"Sets the server address\",\n            value_name = \"IP:PORT\",\n            default_value = \"127.0.0.1:4000\",\n            parse(try_from_str)\n        )]\n        addr: SocketAddr,\n    },\n}\n\nfn main() {\n    let opt = Opt::from_args();\n    if let Err(e) = run(opt) {\n        eprintln!(\"{}\", e);\n        exit(1);\n    }\n}\n\nfn run(opt: Opt) -> Result<()> {\n    match opt.command {\n        Command::Get { key, addr } => {\n            let client = KvsClient::connect(addr);\n            if let (Some(value), _) = client.and_then(move |client| client.get(key)).wait()? {\n                println!(\"{}\", value);\n            } else {\n                println!(\"Key not found\");\n            }\n        }\n        Command::Set { key, value, addr } => {\n            let client = KvsClient::connect(addr);\n            client\n                .and_then(move |client| client.set(key, value))\n                .wait()?;\n        }\n        Command::Remove { key, addr } => {\n            let client = KvsClient::connect(addr);\n            client.and_then(move |client| client.remove(key)).wait()?;\n        }\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/bin/kvs-server.rs",
    "content": "#[macro_use]\nextern crate log;\n#[macro_use]\nextern crate clap;\n\nuse kvs::thread_pool::*;\nuse kvs::{KvStore, KvsEngine, KvsServer, Result, SledKvsEngine};\nuse log::LevelFilter;\nuse std::env;\nuse std::env::current_dir;\nuse std::fs;\nuse std::net::SocketAddr;\nuse std::process::exit;\nuse structopt::StructOpt;\n\nconst DEFAULT_LISTENING_ADDRESS: &str = \"127.0.0.1:4000\";\nconst DEFAULT_ENGINE: Engine = Engine::kvs;\n\n#[derive(StructOpt, Debug)]\n#[structopt(name = \"kvs-server\")]\nstruct Opt {\n    #[structopt(\n        long,\n        help = \"Sets the listening address\",\n        value_name = \"IP:PORT\",\n        raw(default_value = \"DEFAULT_LISTENING_ADDRESS\"),\n        parse(try_from_str)\n    )]\n    addr: SocketAddr,\n    #[structopt(\n        long,\n        help = \"Sets the storage engine\",\n        value_name = \"ENGINE-NAME\",\n        raw(possible_values = \"&Engine::variants()\")\n    )]\n    engine: Option<Engine>,\n}\n\narg_enum! {\n    #[allow(non_camel_case_types)]\n    #[derive(Debug, Copy, Clone, PartialEq, Eq)]\n    enum Engine {\n        kvs,\n        sled\n    }\n}\n\nfn main() {\n    env_logger::builder().filter_level(LevelFilter::Info).init();\n    let mut opt = Opt::from_args();\n    let res = current_engine().and_then(move |curr_engine| {\n        if opt.engine.is_none() {\n            opt.engine = curr_engine;\n        }\n        if curr_engine.is_some() && opt.engine != curr_engine {\n            error!(\"Wrong engine!\");\n            exit(1);\n        }\n        run(opt)\n    });\n    if let Err(e) = res {\n        error!(\"{}\", e);\n        exit(1);\n    }\n}\n\nfn run(opt: Opt) -> Result<()> {\n    let engine = opt.engine.unwrap_or(DEFAULT_ENGINE);\n    info!(\"kvs-server {}\", env!(\"CARGO_PKG_VERSION\"));\n    info!(\"Storage engine: {}\", engine);\n    info!(\"Listening on {}\", opt.addr);\n\n    // write engine to engine file\n    fs::write(current_dir()?.join(\"engine\"), format!(\"{}\", engine))?;\n\n    let concurrency = num_cpus::get() as u32;\n    match engine {\n        Engine::kvs => run_with(\n            KvStore::<RayonThreadPool>::open(env::current_dir()?, concurrency)?,\n            opt.addr,\n        ),\n        Engine::sled => run_with(\n            SledKvsEngine::<RayonThreadPool>::new(\n                sled::Db::start_default(env::current_dir()?)?,\n                concurrency,\n            )?,\n            opt.addr,\n        ),\n    }\n}\n\npub fn run_with<E: KvsEngine>(engine: E, addr: SocketAddr) -> Result<()> {\n    let server = KvsServer::new(engine);\n    server.run(addr)\n}\n\nfn current_engine() -> Result<Option<Engine>> {\n    let engine = current_dir()?.join(\"engine\");\n    if !engine.exists() {\n        return Ok(None);\n    }\n\n    match fs::read_to_string(engine)?.parse() {\n        Ok(engine) => Ok(Some(engine)),\n        Err(e) => {\n            warn!(\"The content of engine file is invalid: {}\", e);\n            Ok(None)\n        }\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/client.rs",
    "content": "use crate::common::{Request, Response};\nuse crate::KvsError;\nuse std::net::SocketAddr;\nuse tokio::codec::{FramedRead, FramedWrite, LengthDelimitedCodec};\nuse tokio::io::{ReadHalf, WriteHalf};\nuse tokio::net::TcpStream;\nuse tokio::prelude::*;\nuse tokio_serde_json::{ReadJson, WriteJson};\n\n/// Key value store client\npub struct KvsClient {\n    read_json: ReadJson<FramedRead<ReadHalf<TcpStream>, LengthDelimitedCodec>, Response>,\n    write_json: WriteJson<FramedWrite<WriteHalf<TcpStream>, LengthDelimitedCodec>, Request>,\n}\n\nimpl KvsClient {\n    /// Connect to `addr` to access `KvsServer`.\n    pub fn connect(addr: SocketAddr) -> impl Future<Item = Self, Error = KvsError> {\n        TcpStream::connect(&addr)\n            .map(|tcp| {\n                let (read_half, write_half) = tcp.split();\n                let read_json =\n                    ReadJson::new(FramedRead::new(read_half, LengthDelimitedCodec::new()));\n                let write_json =\n                    WriteJson::new(FramedWrite::new(write_half, LengthDelimitedCodec::new()));\n                KvsClient {\n                    read_json,\n                    write_json,\n                }\n            })\n            .map_err(|e| e.into())\n    }\n\n    /// Get the value of a given key from the server.\n    pub fn get(self, key: String) -> impl Future<Item = (Option<String>, Self), Error = KvsError> {\n        self.send_request(Request::Get { key })\n            .and_then(move |(resp, client)| match resp {\n                Some(Response::Get(value)) => Ok((value, client)),\n                Some(Response::Err(msg)) => Err(KvsError::StringError(msg)),\n                Some(_) => Err(KvsError::StringError(\"Invalid response\".to_owned())),\n                None => Err(KvsError::StringError(\"No response received\".to_owned())),\n            })\n    }\n\n    /// Set the value of a string key in the server.\n    pub fn set(self, key: String, value: String) -> impl Future<Item = Self, Error = KvsError> {\n        self.send_request(Request::Set { key, value })\n            .and_then(move |(resp, client)| match resp {\n                Some(Response::Set) => Ok(client),\n                Some(Response::Err(msg)) => Err(KvsError::StringError(msg)),\n                Some(_) => Err(KvsError::StringError(\"Invalid response\".to_owned())),\n                None => Err(KvsError::StringError(\"No response received\".to_owned())),\n            })\n    }\n\n    /// Remove a string key in the server.\n    pub fn remove(self, key: String) -> impl Future<Item = Self, Error = KvsError> {\n        self.send_request(Request::Remove { key })\n            .and_then(move |(resp, client)| match resp {\n                Some(Response::Remove) => Ok(client),\n                Some(Response::Err(msg)) => Err(KvsError::StringError(msg)),\n                Some(_) => Err(KvsError::StringError(\"Invalid response\".to_owned())),\n                None => Err(KvsError::StringError(\"No response received\".to_owned())),\n            })\n    }\n\n    fn send_request(\n        self,\n        req: Request,\n    ) -> impl Future<Item = (Option<Response>, Self), Error = KvsError> {\n        let read_json = self.read_json;\n        self.write_json\n            .send(req)\n            .and_then(move |write_json| {\n                read_json\n                    .into_future()\n                    .map(move |(resp, read_json)| {\n                        let client = KvsClient {\n                            read_json,\n                            write_json,\n                        };\n                        (resp, client)\n                    })\n                    .map_err(|(err, _)| err)\n            })\n            .map_err(|e| e.into())\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/common.rs",
    "content": "use serde::{Deserialize, Serialize};\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum Request {\n    Get { key: String },\n    Set { key: String, value: String },\n    Remove { key: String },\n}\n\n#[derive(Debug, Serialize, Deserialize)]\npub enum Response {\n    Get(Option<String>),\n    Set,\n    Remove,\n    Err(String),\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/engines/kvs.rs",
    "content": "use std::cell::RefCell;\nuse std::collections::BTreeMap;\nuse std::ffi::OsStr;\nuse std::fs::{self, File, OpenOptions};\nuse std::io::{self, BufReader, BufWriter, Read, Seek, SeekFrom, Write};\nuse std::ops::Range;\nuse std::path::{Path, PathBuf};\nuse std::sync::atomic::{AtomicU64, Ordering};\nuse std::sync::{Arc, Mutex};\n\nuse crossbeam::queue::ArrayQueue;\nuse crossbeam_skiplist::SkipMap;\nuse serde::{Deserialize, Serialize};\nuse serde_json::Deserializer;\nuse tokio::prelude::*;\nuse tokio::sync::oneshot;\n\nuse super::KvsEngine;\nuse crate::thread_pool::ThreadPool;\nuse crate::{KvsError, Result};\n\nconst COMPACTION_THRESHOLD: u64 = 1024 * 1024;\n\n/// The `KvStore` stores string key/value pairs.\n///\n/// Key/value pairs are persisted to disk in log files. Log files are named after\n/// monotonically increasing generation numbers with a `log` extension name.\n/// A skip list in memory stores the keys and the value locations for fast query.\n///\n/// ```rust\n/// # use kvs::{KvStore, Result};\n/// # use kvs::thread_pool::{ThreadPool, RayonThreadPool};\n/// # use tokio::prelude::*;\n/// # fn try_main() -> Result<()> {\n/// use std::env::current_dir;\n/// use kvs::KvsEngine;\n/// let mut store: KvStore<RayonThreadPool> = KvStore::open(current_dir()?, 2)?;\n/// store.set(\"key\".to_owned(), \"value\".to_owned()).wait()?;\n/// let val = store.get(\"key\".to_owned()).wait()?;\n/// assert_eq!(val, Some(\"value\".to_owned()));\n/// # Ok(())\n/// # }\n/// ```\n#[derive(Clone)]\npub struct KvStore<P: ThreadPool> {\n    // directory for the log and other data\n    path: Arc<PathBuf>,\n    // map generation number to the file reader\n    index: Arc<SkipMap<String, CommandPos>>,\n    writer: Arc<Mutex<KvStoreWriter>>,\n    thread_pool: P,\n    reader_pool: Arc<ArrayQueue<KvStoreReader>>,\n}\n\nimpl<P: ThreadPool> KvStore<P> {\n    /// Opens a `KvStore` with the given path.\n    ///\n    /// This will create a new directory if the given one does not exist.\n    ///\n    /// `concurrency` specifies how many threads at most can read the database at the same time.\n    ///\n    /// # Errors\n    ///\n    /// It propagates I/O or deserialization errors during the log replay.\n    pub fn open(path: impl Into<PathBuf>, concurrency: u32) -> Result<Self> {\n        let path = Arc::new(path.into());\n        fs::create_dir_all(&*path)?;\n\n        let mut readers = BTreeMap::new();\n        let index = Arc::new(SkipMap::new());\n\n        let gen_list = sorted_gen_list(&path)?;\n        let mut uncompacted = 0;\n\n        for &gen in &gen_list {\n            let mut reader = BufReaderWithPos::new(File::open(log_path(&path, gen))?)?;\n            uncompacted += load(gen, &mut reader, &*index)?;\n            readers.insert(gen, reader);\n        }\n\n        let current_gen = gen_list.last().unwrap_or(&0) + 1;\n        let writer = new_log_file(&path, current_gen)?;\n        let safe_point = Arc::new(AtomicU64::new(0));\n\n        let reader = KvStoreReader {\n            path: Arc::clone(&path),\n            safe_point,\n            readers: RefCell::new(BTreeMap::new()),\n        };\n\n        let writer = KvStoreWriter {\n            reader: reader.clone(),\n            writer,\n            current_gen,\n            uncompacted,\n            path: Arc::clone(&path),\n            index: Arc::clone(&index),\n        };\n\n        let thread_pool = P::new(concurrency)?;\n        let reader_pool = Arc::new(ArrayQueue::new(concurrency as usize));\n        for _ in 1..concurrency {\n            reader_pool.push(reader.clone()).unwrap();\n        }\n        reader_pool.push(reader).unwrap();\n\n        Ok(KvStore {\n            path,\n            index,\n            writer: Arc::new(Mutex::new(writer)),\n            thread_pool,\n            reader_pool,\n        })\n    }\n}\n\nimpl<P: ThreadPool> KvsEngine for KvStore<P> {\n    /// Sets the value of a string key to a string.\n    ///\n    /// If the key already exists, the previous value will be overwritten.\n    ///\n    /// # Errors\n    ///\n    /// It propagates I/O or serialization errors during writing the log.\n    fn set(&self, key: String, value: String) -> Box<dyn Future<Item = (), Error = KvsError> + Send> {\n        let writer = self.writer.clone();\n        let (tx, rx) = oneshot::channel();\n        self.thread_pool.spawn(move || {\n            let res = writer.lock().unwrap().set(key, value);\n            if tx.send(res).is_err() {\n                error!(\"Receiving end is dropped\");\n            }\n        });\n        Box::new(\n            rx.map_err(|e| KvsError::StringError(format!(\"{}\", e)))\n                .flatten(),\n        )\n    }\n\n    /// Gets the string value of a given string key.\n    ///\n    /// Returns `None` if the given key does not exist.\n    fn get(&self, key: String) -> Box<dyn Future<Item = Option<String>, Error = KvsError> + Send> {\n        let reader_pool = self.reader_pool.clone();\n        let index = self.index.clone();\n        let (tx, rx) = oneshot::channel();\n        self.thread_pool.spawn(move || {\n            let res = (|| {\n                if let Some(cmd_pos) = index.get(&key) {\n                    let reader = reader_pool.pop().unwrap();\n                    let res = if let Command::Set { value, .. } =\n                        reader.read_command(*cmd_pos.value())?\n                    {\n                        Ok(Some(value))\n                    } else {\n                        Err(KvsError::UnexpectedCommandType)\n                    };\n                    reader_pool.push(reader).unwrap();\n                    res\n                } else {\n                    Ok(None)\n                }\n            })();\n            if tx.send(res).is_err() {\n                error!(\"Receiving end is dropped\");\n            }\n        });\n        Box::new(\n            rx.map_err(|e| KvsError::StringError(format!(\"{}\", e)))\n                .flatten(),\n        )\n    }\n\n    /// Removes a given key.\n    ///\n    /// # Error\n    ///\n    /// It returns `KvsError::KeyNotFound` if the given key is not found.\n    ///\n    /// It propagates I/O or serialization errors during writing the log.\n    fn remove(&self, key: String) -> Box<dyn Future<Item = (), Error = KvsError> + Send> {\n        let writer = self.writer.clone();\n        let (tx, rx) = oneshot::channel();\n        self.thread_pool.spawn(move || {\n            let res = writer.lock().unwrap().remove(key);\n            if tx.send(res).is_err() {\n                error!(\"Receiving end is dropped\");\n            }\n        });\n        Box::new(\n            rx.map_err(|e| KvsError::StringError(format!(\"{}\", e)))\n                .flatten(),\n        )\n    }\n}\n\n/// A single thread reader.\n///\n/// Each `KvStore` instance has its own `KvStoreReader` and\n/// `KvStoreReader`s open the same files separately. So the user\n/// can read concurrently through multiple `KvStore`s in different\n/// threads.\nstruct KvStoreReader {\n    path: Arc<PathBuf>,\n    // generation of the latest compaction file\n    safe_point: Arc<AtomicU64>,\n    readers: RefCell<BTreeMap<u64, BufReaderWithPos<File>>>,\n}\n\nimpl KvStoreReader {\n    /// Close file handles with generation number less than safe_point.\n    ///\n    /// `safe_point` is updated to the latest compaction gen after a compaction finishes.\n    /// The compaction generation contains the sum of all operations before it and the\n    /// in-memory index contains no entries with generation number less than safe_point.\n    /// So we can safely close those file handles and the stale files can be deleted.\n    fn close_stale_handles(&self) {\n        let mut readers = self.readers.borrow_mut();\n        while !readers.is_empty() {\n            let first_gen = *readers.keys().next().unwrap();\n            if self.safe_point.load(Ordering::SeqCst) <= first_gen {\n                break;\n            }\n            readers.remove(&first_gen);\n        }\n    }\n\n    /// Read the log file at the given `CommandPos`.\n    fn read_and<F, R>(&self, cmd_pos: CommandPos, f: F) -> Result<R>\n    where\n        F: FnOnce(io::Take<&mut BufReaderWithPos<File>>) -> Result<R>,\n    {\n        self.close_stale_handles();\n\n        let mut readers = self.readers.borrow_mut();\n        // Open the file if we haven't opened it in this `KvStoreReader`.\n        // We don't use entry API here because we want the errors to be propogated.\n        if !readers.contains_key(&cmd_pos.gen) {\n            let reader = BufReaderWithPos::new(File::open(log_path(&self.path, cmd_pos.gen))?)?;\n            readers.insert(cmd_pos.gen, reader);\n        }\n        let reader = readers.get_mut(&cmd_pos.gen).unwrap();\n        reader.seek(SeekFrom::Start(cmd_pos.pos))?;\n        let cmd_reader = reader.take(cmd_pos.len);\n        f(cmd_reader)\n    }\n\n    // Read the log file at the given `CommandPos` and deserialize it to `Command`.\n    fn read_command(&self, cmd_pos: CommandPos) -> Result<Command> {\n        self.read_and(cmd_pos, |cmd_reader| {\n            Ok(serde_json::from_reader(cmd_reader)?)\n        })\n    }\n}\n\nimpl Clone for KvStoreReader {\n    fn clone(&self) -> KvStoreReader {\n        KvStoreReader {\n            path: Arc::clone(&self.path),\n            safe_point: Arc::clone(&self.safe_point),\n            // don't use other KvStoreReader's readers\n            readers: RefCell::new(BTreeMap::new()),\n        }\n    }\n}\n\nstruct KvStoreWriter {\n    reader: KvStoreReader,\n    writer: BufWriterWithPos<File>,\n    current_gen: u64,\n    // the number of bytes representing \"stale\" commands that could be\n    // deleted during a compaction\n    uncompacted: u64,\n    path: Arc<PathBuf>,\n    index: Arc<SkipMap<String, CommandPos>>,\n}\n\nimpl KvStoreWriter {\n    fn set(&mut self, key: String, value: String) -> Result<()> {\n        let cmd = Command::set(key, value);\n        let pos = self.writer.pos;\n        serde_json::to_writer(&mut self.writer, &cmd)?;\n        self.writer.flush()?;\n        if let Command::Set { key, .. } = cmd {\n            if let Some(old_cmd) = self.index.get(&key) {\n                self.uncompacted += old_cmd.value().len;\n            }\n            self.index\n                .insert(key, (self.current_gen, pos..self.writer.pos).into());\n        }\n\n        if self.uncompacted > COMPACTION_THRESHOLD {\n            self.compact()?;\n        }\n        Ok(())\n    }\n\n    fn remove(&mut self, key: String) -> Result<()> {\n        if self.index.contains_key(&key) {\n            let cmd = Command::remove(key);\n            let pos = self.writer.pos;\n            serde_json::to_writer(&mut self.writer, &cmd)?;\n            self.writer.flush()?;\n            if let Command::Remove { key } = cmd {\n                let old_cmd = self.index.remove(&key).expect(\"key not found\");\n                self.uncompacted += old_cmd.value().len;\n                // the \"remove\" command itself can be deleted in the next compaction\n                // so we add its length to `uncompacted`\n                self.uncompacted += self.writer.pos - pos;\n            }\n\n            if self.uncompacted > COMPACTION_THRESHOLD {\n                self.compact()?;\n            }\n            Ok(())\n        } else {\n            Err(KvsError::KeyNotFound)\n        }\n    }\n\n    /// Clears stale entries in the log.\n    fn compact(&mut self) -> Result<()> {\n        // increase current gen by 2. current_gen + 1 is for the compaction file\n        let compaction_gen = self.current_gen + 1;\n        self.current_gen += 2;\n        self.writer = new_log_file(&self.path, self.current_gen)?;\n\n        let mut compaction_writer = new_log_file(&self.path, compaction_gen)?;\n\n        let mut new_pos = 0; // pos in the new log file\n        for entry in self.index.iter() {\n            let len = self.reader.read_and(*entry.value(), |mut entry_reader| {\n                Ok(io::copy(&mut entry_reader, &mut compaction_writer)?)\n            })?;\n            self.index.insert(\n                entry.key().clone(),\n                (compaction_gen, new_pos..new_pos + len).into(),\n            );\n            new_pos += len;\n        }\n        compaction_writer.flush()?;\n\n        self.reader\n            .safe_point\n            .store(compaction_gen, Ordering::SeqCst);\n        self.reader.close_stale_handles();\n\n        // remove stale log files\n        // Note that actually these files are not deleted immediately because `KvStoreReader`s\n        // still keep open file handles. When `KvStoreReader` is used next time, it will clear\n        // its stale file handles. On Unix, the files will be deleted after all the handles\n        // are closed. On Windows, the deletions below will fail and stale files are expected\n        // to be deleted in the next compaction.\n\n        let stale_gens = sorted_gen_list(&self.path)?\n            .into_iter()\n            .filter(|&gen| gen < compaction_gen);\n        for stale_gen in stale_gens {\n            let file_path = log_path(&self.path, stale_gen);\n            if let Err(e) = fs::remove_file(&file_path) {\n                error!(\"{:?} cannot be deleted: {}\", file_path, e);\n            }\n        }\n        self.uncompacted = 0;\n\n        Ok(())\n    }\n}\n\n/// Create a new log file with given generation number and add the reader to the readers map.\n///\n/// Returns the writer to the log.\nfn new_log_file(path: &Path, gen: u64) -> Result<BufWriterWithPos<File>> {\n    let path = log_path(&path, gen);\n    let writer = BufWriterWithPos::new(\n        OpenOptions::new()\n            .create(true)\n            .write(true)\n            .append(true)\n            .open(&path)?,\n    )?;\n    Ok(writer)\n}\n\n/// Returns sorted generation numbers in the given directory\nfn sorted_gen_list(path: &Path) -> Result<Vec<u64>> {\n    let mut gen_list: Vec<u64> = fs::read_dir(&path)?\n        .flat_map(|res| -> Result<_> { Ok(res?.path()) })\n        .filter(|path| path.is_file() && path.extension() == Some(\"log\".as_ref()))\n        .flat_map(|path| {\n            path.file_name()\n                .and_then(OsStr::to_str)\n                .map(|s| s.trim_end_matches(\".log\"))\n                .map(str::parse::<u64>)\n        })\n        .flatten()\n        .collect();\n    gen_list.sort_unstable();\n    Ok(gen_list)\n}\n\n/// Load the whole log file and store value locations in the index map.\n///\n/// Returns how many bytes can be saved after a compaction.\nfn load(\n    gen: u64,\n    reader: &mut BufReaderWithPos<File>,\n    index: &SkipMap<String, CommandPos>,\n) -> Result<u64> {\n    // To make sure we read from the beginning of the file\n    let mut pos = reader.seek(SeekFrom::Start(0))?;\n    let mut stream = Deserializer::from_reader(reader).into_iter::<Command>();\n    let mut uncompacted = 0; // number of bytes that can be saved after a compaction\n    while let Some(cmd) = stream.next() {\n        let new_pos = stream.byte_offset() as u64;\n        match cmd? {\n            Command::Set { key, .. } => {\n                if let Some(old_cmd) = index.get(&key) {\n                    uncompacted += old_cmd.value().len;\n                }\n                index.insert(key, (gen, pos..new_pos).into());\n            }\n            Command::Remove { key } => {\n                if let Some(old_cmd) = index.remove(&key) {\n                    uncompacted += old_cmd.value().len;\n                }\n                // the \"remove\" command itself can be deleted in the next compaction\n                // so we add its length to `uncompacted`\n                uncompacted += new_pos - pos;\n            }\n        }\n        pos = new_pos;\n    }\n    Ok(uncompacted)\n}\n\nfn log_path(dir: &Path, gen: u64) -> PathBuf {\n    dir.join(format!(\"{}.log\", gen))\n}\n\n/// Struct representing a command\n#[derive(Serialize, Deserialize, Debug)]\nenum Command {\n    Set { key: String, value: String },\n    Remove { key: String },\n}\n\nimpl Command {\n    fn set(key: String, value: String) -> Command {\n        Command::Set { key, value }\n    }\n\n    fn remove(key: String) -> Command {\n        Command::Remove { key }\n    }\n}\n\n/// Represents the position and length of a json-serialized command in the log\n#[derive(Debug, Clone, Copy)]\nstruct CommandPos {\n    gen: u64,\n    pos: u64,\n    len: u64,\n}\n\nimpl From<(u64, Range<u64>)> for CommandPos {\n    fn from((gen, range): (u64, Range<u64>)) -> Self {\n        CommandPos {\n            gen,\n            pos: range.start,\n            len: range.end - range.start,\n        }\n    }\n}\n\nstruct BufReaderWithPos<R: Read + Seek> {\n    reader: BufReader<R>,\n    pos: u64,\n}\n\nimpl<R: Read + Seek> BufReaderWithPos<R> {\n    fn new(mut inner: R) -> Result<Self> {\n        let pos = inner.seek(SeekFrom::Current(0))?;\n        Ok(BufReaderWithPos {\n            reader: BufReader::new(inner),\n            pos,\n        })\n    }\n}\n\nimpl<R: Read + Seek> Read for BufReaderWithPos<R> {\n    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {\n        let len = self.reader.read(buf)?;\n        self.pos += len as u64;\n        Ok(len)\n    }\n}\n\nimpl<R: Read + Seek> Seek for BufReaderWithPos<R> {\n    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {\n        self.pos = self.reader.seek(pos)?;\n        Ok(self.pos)\n    }\n}\n\nstruct BufWriterWithPos<W: Write + Seek> {\n    writer: BufWriter<W>,\n    pos: u64,\n}\n\nimpl<W: Write + Seek> BufWriterWithPos<W> {\n    fn new(mut inner: W) -> Result<Self> {\n        let pos = inner.seek(SeekFrom::Current(0))?;\n        Ok(BufWriterWithPos {\n            writer: BufWriter::new(inner),\n            pos,\n        })\n    }\n}\n\nimpl<W: Write + Seek> Write for BufWriterWithPos<W> {\n    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n        let len = self.writer.write(buf)?;\n        self.pos += len as u64;\n        Ok(len)\n    }\n\n    fn flush(&mut self) -> io::Result<()> {\n        self.writer.flush()\n    }\n}\n\nimpl<W: Write + Seek> Seek for BufWriterWithPos<W> {\n    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {\n        self.pos = self.writer.seek(pos)?;\n        Ok(self.pos)\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/engines/mod.rs",
    "content": "pub use self::kvs::KvStore;\npub use self::sled::SledKvsEngine;\nuse crate::KvsError;\n\nuse tokio::prelude::Future;\n\nmod kvs;\nmod sled;\n\n/// Trait for a key value storage engine.\npub trait KvsEngine: Clone + Send + 'static {\n    /// Sets the value of a string key to a string.\n    ///\n    /// If the key already exists, the previous value will be overwritten.\n    fn set(&self, key: String, value: String) -> Box<dyn Future<Item = (), Error = KvsError> + Send>;\n\n    /// Gets the string value of a given string key.\n    ///\n    /// Returns `None` if the given key does not exist.\n    fn get(&self, key: String) -> Box<dyn Future<Item = Option<String>, Error = KvsError> + Send>;\n\n    /// Removes a given key.\n    ///\n    /// # Errors\n    ///\n    /// It returns `KvsError::KeyNotFound` if the given key is not found.\n    fn remove(&self, key: String) -> Box<dyn Future<Item = (), Error = KvsError> + Send>;\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/engines/sled.rs",
    "content": "use crate::thread_pool::ThreadPool;\nuse crate::{KvsEngine, KvsError, Result};\nuse sled::Db;\nuse tokio::prelude::*;\nuse tokio::sync::oneshot;\n\n/// Wrapper of `sled::Db`\n#[derive(Clone)]\npub struct SledKvsEngine<P: ThreadPool> {\n    pool: P,\n    db: Db,\n}\n\nimpl<P: ThreadPool> SledKvsEngine<P> {\n    /// Creates a `SledKvsEngine` from `sled::Db`.\n    ///\n    /// Operations are run in the given thread pool. `concurrency` specifies the number of\n    /// threads in the thread pool.\n    pub fn new(db: Db, concurrency: u32) -> Result<Self> {\n        let pool = P::new(concurrency)?;\n        Ok(SledKvsEngine { pool, db })\n    }\n}\n\nimpl<P: ThreadPool> KvsEngine for SledKvsEngine<P> {\n    fn set(&self, key: String, value: String) -> Box<dyn Future<Item = (), Error = KvsError> + Send> {\n        let db = self.db.clone();\n        let (tx, rx) = oneshot::channel();\n        self.pool.spawn(move || {\n            let res = db\n                .set(key, value.into_bytes())\n                .and_then(|_| db.flush())\n                .map(|_| ())\n                .map_err(KvsError::from);\n            if tx.send(res).is_err() {\n                error!(\"Receiving end is dropped\");\n            }\n        });\n        Box::new(\n            rx.map_err(|e| KvsError::StringError(format!(\"{}\", e)))\n                .flatten(),\n        )\n    }\n\n    fn get(&self, key: String) -> Box<dyn Future<Item = Option<String>, Error = KvsError> + Send> {\n        let db = self.db.clone();\n        let (tx, rx) = oneshot::channel();\n        self.pool.spawn(move || {\n            let res = (move || {\n                Ok(db\n                    .get(key)?\n                    .map(|i_vec| AsRef::<[u8]>::as_ref(&i_vec).to_vec())\n                    .map(String::from_utf8)\n                    .transpose()?)\n            })();\n            if tx.send(res).is_err() {\n                error!(\"Receiving end is dropped\");\n            }\n        });\n        Box::new(\n            rx.map_err(|e| KvsError::StringError(format!(\"{}\", e)))\n                .flatten(),\n        )\n    }\n\n    fn remove(&self, key: String) -> Box<dyn Future<Item = (), Error = KvsError> + Send> {\n        let db = self.db.clone();\n        let (tx, rx) = oneshot::channel();\n        self.pool.spawn(move || {\n            let res = (|| {\n                db.del(key)?.ok_or(KvsError::KeyNotFound)?;\n                db.flush()?;\n                Ok(())\n            })();\n            if tx.send(res).is_err() {\n                error!(\"Receiving end is dropped\");\n            }\n        });\n        Box::new(\n            rx.map_err(|e| KvsError::StringError(format!(\"{}\", e)))\n                .flatten(),\n        )\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/error.rs",
    "content": "use failure::Fail;\nuse std::io;\nuse std::string::FromUtf8Error;\n\n/// Error type for kvs\n#[derive(Fail, Debug)]\npub enum KvsError {\n    /// IO error\n    #[fail(display = \"IO error: {}\", _0)]\n    Io(#[cause] io::Error),\n    /// Serialization or deserialization error\n    #[fail(display = \"serde_json error: {}\", _0)]\n    Serde(#[cause] serde_json::Error),\n    /// Removing non-existent key error\n    #[fail(display = \"Key not found\")]\n    KeyNotFound,\n    /// Unexpected command type error.\n    /// It indicated a corrupted log or a program bug.\n    #[fail(display = \"Unexpected command type\")]\n    UnexpectedCommandType,\n    /// Key or value is invalid UTF-8 sequence\n    #[fail(display = \"UTF-8 error: {}\", _0)]\n    Utf8(#[cause] FromUtf8Error),\n    /// Sled error\n    #[fail(display = \"sled error: {}\", _0)]\n    Sled(#[cause] sled::Error),\n    /// Error with a string message\n    #[fail(display = \"{}\", _0)]\n    StringError(String),\n}\n\nimpl From<io::Error> for KvsError {\n    fn from(err: io::Error) -> KvsError {\n        KvsError::Io(err)\n    }\n}\n\nimpl From<serde_json::Error> for KvsError {\n    fn from(err: serde_json::Error) -> KvsError {\n        KvsError::Serde(err)\n    }\n}\n\nimpl From<FromUtf8Error> for KvsError {\n    fn from(err: FromUtf8Error) -> KvsError {\n        KvsError::Utf8(err)\n    }\n}\n\nimpl From<sled::Error> for KvsError {\n    fn from(err: sled::Error) -> KvsError {\n        KvsError::Sled(err)\n    }\n}\n\n/// Result type for kvs\npub type Result<T> = std::result::Result<T, KvsError>;\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/lib.rs",
    "content": "#![deny(missing_docs)]\n//! A simple key/value store.\n\n#[macro_use]\nextern crate log;\n\npub use client::KvsClient;\npub use engines::{KvStore, KvsEngine, SledKvsEngine};\npub use error::{KvsError, Result};\npub use server::KvsServer;\n\nmod client;\nmod common;\nmod engines;\nmod error;\nmod server;\npub mod thread_pool;\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/server.rs",
    "content": "use crate::common::{Request, Response};\nuse crate::{KvsEngine, KvsError, Result};\nuse std::net::SocketAddr;\nuse tokio::codec::{FramedRead, FramedWrite, LengthDelimitedCodec};\nuse tokio::net::{TcpListener, TcpStream};\nuse tokio::prelude::*;\nuse tokio_serde_json::{ReadJson, WriteJson};\n\n/// The server of a key value store.\npub struct KvsServer<E: KvsEngine> {\n    engine: E,\n}\n\nimpl<E: KvsEngine> KvsServer<E> {\n    /// Create a `KvsServer` with a given storage engine.\n    pub fn new(engine: E) -> Self {\n        KvsServer { engine }\n    }\n\n    /// Run the server listening on the given address\n    pub fn run(self, addr: SocketAddr) -> Result<()> {\n        let listener = TcpListener::bind(&addr)?;\n        let server = listener\n            .incoming()\n            .map_err(|e| error!(\"IO error: {}\", e))\n            .for_each(move |tcp| {\n                let engine = self.engine.clone();\n                serve(engine, tcp).map_err(|e| error!(\"Error on serving client: {}\", e))\n            });\n        tokio::run(server);\n        Ok(())\n    }\n}\n\nfn serve<E: KvsEngine>(engine: E, tcp: TcpStream) -> impl Future<Item = (), Error = KvsError> {\n    let (read_half, write_half) = tcp.split();\n    let read_json = ReadJson::new(FramedRead::new(read_half, LengthDelimitedCodec::new()));\n    let resp_stream = read_json\n        .map_err(KvsError::from)\n        .and_then(\n            move |req| -> Box<dyn Future<Item = Response, Error = KvsError> + Send> {\n                match req {\n                    Request::Get { key } => Box::new(engine.get(key).map(Response::Get)),\n                    Request::Set { key, value } => {\n                        Box::new(engine.set(key, value).map(|_| Response::Set))\n                    }\n                    Request::Remove { key } => {\n                        Box::new(engine.remove(key).map(|_| Response::Remove))\n                    }\n                }\n            },\n        )\n        .then(|resp| -> Result<Response> {\n            match resp {\n                Ok(resp) => Ok(resp),\n                Err(e) => Ok(Response::Err(format!(\"{}\", e))),\n            }\n        });\n    let write_json = WriteJson::new(FramedWrite::new(write_half, LengthDelimitedCodec::new()));\n    write_json\n        .sink_map_err(KvsError::from)\n        .send_all(resp_stream)\n        .map(|_| ())\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/thread_pool/mod.rs",
    "content": "//! This module provides various thread pools. All thread pools should implement\n//! the `ThreadPool` trait.\n\nuse crate::Result;\n\nmod naive;\nmod rayon;\nmod shared_queue;\n\npub use self::naive::NaiveThreadPool;\npub use self::rayon::RayonThreadPool;\npub use self::shared_queue::SharedQueueThreadPool;\n\n/// The trait that all thread pools should implement.\npub trait ThreadPool: Clone + Send + 'static {\n    /// Creates a new thread pool, immediately spawning the specified number of\n    /// threads.\n    ///\n    /// Returns an error if any thread fails to spawn. All previously-spawned threads\n    /// are terminated.\n    fn new(threads: u32) -> Result<Self>\n    where\n        Self: Sized;\n\n    /// Spawns a function into the thread pool.\n    ///\n    /// Spawning always succeeds, but if the function panics the threadpool continues\n    /// to operate with the same number of threads &mdash; the thread count is not\n    /// reduced nor is the thread pool destroyed, corrupted or invalidated.\n    fn spawn<F>(&self, job: F)\n    where\n        F: FnOnce() + Send + 'static;\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/thread_pool/naive.rs",
    "content": "use std::thread;\n\nuse super::ThreadPool;\nuse crate::Result;\n\n/// It is actually not a thread pool. It spawns a new thread every time\n/// the `spawn` method is called.\n#[derive(Clone)]\npub struct NaiveThreadPool;\n\nimpl ThreadPool for NaiveThreadPool {\n    fn new(_threads: u32) -> Result<Self> {\n        Ok(NaiveThreadPool)\n    }\n\n    fn spawn<F>(&self, job: F)\n    where\n        F: FnOnce() + Send + 'static,\n    {\n        thread::spawn(job);\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/thread_pool/rayon.rs",
    "content": "use super::ThreadPool;\nuse crate::{KvsError, Result};\nuse std::sync::Arc;\n\n/// Wrapper of rayon::ThreadPool\n#[derive(Clone)]\npub struct RayonThreadPool(Arc<rayon::ThreadPool>);\n\nimpl ThreadPool for RayonThreadPool {\n    fn new(threads: u32) -> Result<Self> {\n        let pool = rayon::ThreadPoolBuilder::new()\n            .num_threads(threads as usize)\n            .build()\n            .map_err(|e| KvsError::StringError(format!(\"{}\", e)))?;\n        Ok(RayonThreadPool(Arc::new(pool)))\n    }\n\n    fn spawn<F>(&self, job: F)\n    where\n        F: FnOnce() + Send + 'static,\n    {\n        self.0.spawn(job)\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/src/thread_pool/shared_queue.rs",
    "content": "use std::thread;\n\nuse super::ThreadPool;\nuse crate::Result;\n\nuse crossbeam::channel::{self, Receiver, Sender};\n\n// Note for Rust training course: the thread pool is not implemented using\n// `catch_unwind` because it would require the task to be `UnwindSafe`.\n\n/// A thread pool using a shared queue inside.\n///\n/// If a spawned task panics, the old thread will be destroyed and a new one will be\n/// created. It fails silently when any failure to create the thread at the OS level\n/// is captured after the thread pool is created. So, the thread number in the pool\n/// can decrease to zero, then spawning a task to the thread pool will panic.\n#[derive(Clone)]\npub struct SharedQueueThreadPool {\n    tx: Sender<Box<dyn FnOnce() + Send + 'static>>,\n}\n\nimpl ThreadPool for SharedQueueThreadPool {\n    fn new(threads: u32) -> Result<Self> {\n        let (tx, rx) = channel::unbounded::<Box<dyn FnOnce() + Send + 'static>>();\n        for _ in 0..threads {\n            let rx = TaskReceiver(rx.clone());\n            thread::Builder::new().spawn(move || run_tasks(rx))?;\n        }\n        Ok(SharedQueueThreadPool { tx })\n    }\n\n    /// Spawns a function into the thread pool.\n    ///\n    /// # Panics\n    ///\n    /// Panics if the thread pool has no thread.\n    fn spawn<F>(&self, job: F)\n    where\n        F: FnOnce() + Send + 'static,\n    {\n        self.tx\n            .send(Box::new(job))\n            .expect(\"The thread pool has no thread.\");\n    }\n}\n\n#[derive(Clone)]\nstruct TaskReceiver(Receiver<Box<dyn FnOnce() + Send + 'static>>);\n\nimpl Drop for TaskReceiver {\n    fn drop(&mut self) {\n        if thread::panicking() {\n            let rx = self.clone();\n            if let Err(e) = thread::Builder::new().spawn(move || run_tasks(rx)) {\n                error!(\"Failed to spawn a thread: {}\", e);\n            }\n        }\n    }\n}\n\nfn run_tasks(rx: TaskReceiver) {\n    loop {\n        match rx.0.recv() {\n            Ok(task) => {\n                task();\n            }\n            Err(_) => debug!(\"Thread exits because the thread pool is destroyed.\"),\n        }\n    }\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/tests/cli.rs",
    "content": "use assert_cmd::prelude::*;\nuse predicates::str::{contains, is_empty};\nuse std::fs::{self, File};\nuse std::process::Command;\nuse std::sync::mpsc;\nuse std::thread;\nuse std::time::Duration;\nuse tempfile::TempDir;\n\n// `kvs-client` with no args should exit with a non-zero code.\n#[test]\nfn client_cli_no_args() {\n    let temp_dir = TempDir::new().unwrap();\n    let mut cmd = Command::cargo_bin(\"kvs-client\").unwrap();\n    cmd.current_dir(&temp_dir).assert().failure();\n}\n\n#[test]\nfn client_cli_invalid_get() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"extra\", \"field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key\", \"--addr\", \"invalid-addr\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key\", \"--unknown-flag\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n#[test]\nfn client_cli_invalid_set() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"missing_field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key\", \"value\", \"extra_field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key\", \"value\", \"--addr\", \"invalid-addr\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key\", \"--unknown-flag\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n#[test]\nfn client_cli_invalid_rm() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"extra\", \"field\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key\", \"--addr\", \"invalid-addr\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key\", \"--unknown-flag\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n#[test]\nfn client_cli_invalid_subcommand() {\n    let temp_dir = TempDir::new().unwrap();\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"unknown\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure();\n}\n\n// `kvs-client -V` should print the version\n#[test]\nfn client_cli_version() {\n    let temp_dir = TempDir::new().unwrap();\n    let mut cmd = Command::cargo_bin(\"kvs-client\").unwrap();\n    cmd.args(&[\"-V\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .stdout(contains(env!(\"CARGO_PKG_VERSION\")));\n}\n\n// `kvs-server -V` should print the version\n#[test]\nfn server_cli_version() {\n    let temp_dir = TempDir::new().unwrap();\n    let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n    cmd.args(&[\"-V\"])\n        .current_dir(&temp_dir)\n        .assert()\n        .stdout(contains(env!(\"CARGO_PKG_VERSION\")));\n}\n\n#[test]\nfn cli_log_configuration() {\n    let temp_dir = TempDir::new().unwrap();\n    let stderr_path = temp_dir.path().join(\"stderr\");\n    let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n    let mut child = cmd\n        .args(&[\"--engine\", \"kvs\", \"--addr\", \"127.0.0.1:4001\"])\n        .current_dir(&temp_dir)\n        .stderr(File::create(&stderr_path).unwrap())\n        .spawn()\n        .unwrap();\n    thread::sleep(Duration::from_secs(1));\n    child.kill().expect(\"server exited before killed\");\n\n    let content = fs::read_to_string(&stderr_path).expect(\"unable to read from stderr file\");\n    assert!(content.contains(env!(\"CARGO_PKG_VERSION\")));\n    assert!(content.contains(\"kvs\"));\n    assert!(content.contains(\"127.0.0.1:4001\"));\n}\n\n#[test]\nfn cli_wrong_engine() {\n    // sled first, kvs second\n    {\n        let temp_dir = TempDir::new().unwrap();\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        let mut child = cmd\n            .args(&[\"--engine\", \"sled\", \"--addr\", \"127.0.0.1:4002\"])\n            .current_dir(&temp_dir)\n            .spawn()\n            .unwrap();\n        thread::sleep(Duration::from_secs(1));\n        child.kill().expect(\"server exited before killed\");\n\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        cmd.args(&[\"--engine\", \"kvs\", \"--addr\", \"127.0.0.1:4003\"])\n            .current_dir(&temp_dir)\n            .assert()\n            .failure();\n    }\n\n    // kvs first, sled second\n    {\n        let temp_dir = TempDir::new().unwrap();\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        let mut child = cmd\n            .args(&[\"--engine\", \"kvs\", \"--addr\", \"127.0.0.1:4002\"])\n            .current_dir(&temp_dir)\n            .spawn()\n            .unwrap();\n        thread::sleep(Duration::from_secs(1));\n        child.kill().expect(\"server exited before killed\");\n\n        let mut cmd = Command::cargo_bin(\"kvs-server\").unwrap();\n        cmd.args(&[\"--engine\", \"sled\", \"--addr\", \"127.0.0.1:4003\"])\n            .current_dir(&temp_dir)\n            .assert()\n            .failure();\n    }\n}\n\nfn cli_access_server(engine: &str, addr: &str) {\n    let (sender, receiver) = mpsc::sync_channel(0);\n    let temp_dir = TempDir::new().unwrap();\n    let mut server = Command::cargo_bin(\"kvs-server\").unwrap();\n    let mut child = server\n        .args(&[\"--engine\", engine, \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .spawn()\n        .unwrap();\n    let handle = thread::spawn(move || {\n        let _ = receiver.recv(); // wait for main thread to finish\n        child.kill().expect(\"server exited before killed\");\n    });\n    thread::sleep(Duration::from_secs(1));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key1\", \"value1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(\"value1\\n\");\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key1\", \"value2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(\"value2\\n\");\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(contains(\"Key not found\"));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .failure()\n        .stderr(contains(\"Key not found\"));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"set\", \"key2\", \"value3\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"rm\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(is_empty());\n\n    sender.send(()).unwrap();\n    handle.join().unwrap();\n\n    // Reopen and check value\n    let (sender, receiver) = mpsc::sync_channel(0);\n    let mut server = Command::cargo_bin(\"kvs-server\").unwrap();\n    let mut child = server\n        .args(&[\"--engine\", engine, \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .spawn()\n        .unwrap();\n    let handle = thread::spawn(move || {\n        let _ = receiver.recv(); // wait for main thread to finish\n        child.kill().expect(\"server exited before killed\");\n    });\n    thread::sleep(Duration::from_secs(1));\n\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key2\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(contains(\"value3\"));\n    Command::cargo_bin(\"kvs-client\")\n        .unwrap()\n        .args(&[\"get\", \"key1\", \"--addr\", addr])\n        .current_dir(&temp_dir)\n        .assert()\n        .success()\n        .stdout(contains(\"Key not found\"));\n    sender.send(()).unwrap();\n    handle.join().unwrap();\n}\n\n#[test]\nfn cli_access_server_kvs_engine() {\n    cli_access_server(\"kvs\", \"127.0.0.1:4004\");\n}\n\n#[test]\nfn cli_access_server_sled_engine() {\n    cli_access_server(\"sled\", \"127.0.0.1:4005\");\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/tests/kv_store.rs",
    "content": "use kvs::thread_pool::RayonThreadPool;\nuse kvs::{KvStore, KvsEngine, KvsError, Result};\nuse tempfile::TempDir;\nuse tokio::prelude::*;\nuse tokio::runtime::Runtime;\nuse walkdir::WalkDir;\n\n// Should get previously stored value\n#[test]\nfn get_stored_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned()).wait()?;\n    store.set(\"key2\".to_owned(), \"value2\".to_owned()).wait()?;\n\n    assert_eq!(\n        store.get(\"key1\".to_owned()).wait()?,\n        Some(\"value1\".to_owned())\n    );\n    assert_eq!(\n        store.get(\"key2\".to_owned()).wait()?,\n        Some(\"value2\".to_owned())\n    );\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n    assert_eq!(\n        store.get(\"key1\".to_owned()).wait()?,\n        Some(\"value1\".to_owned())\n    );\n    assert_eq!(\n        store.get(\"key2\".to_owned()).wait()?,\n        Some(\"value2\".to_owned())\n    );\n\n    Ok(())\n}\n\n// Should overwrite existent value\n#[test]\nfn overwrite_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned()).wait()?;\n    assert_eq!(\n        store.get(\"key1\".to_owned()).wait()?,\n        Some(\"value1\".to_owned())\n    );\n    store.set(\"key1\".to_owned(), \"value2\".to_owned()).wait()?;\n    assert_eq!(\n        store.get(\"key1\".to_owned()).wait()?,\n        Some(\"value2\".to_owned())\n    );\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n    assert_eq!(\n        store.get(\"key1\".to_owned()).wait()?,\n        Some(\"value2\".to_owned())\n    );\n    store.set(\"key1\".to_owned(), \"value3\".to_owned()).wait()?;\n    assert_eq!(\n        store.get(\"key1\".to_owned()).wait()?,\n        Some(\"value3\".to_owned())\n    );\n\n    Ok(())\n}\n\n// Should get `None` when getting a non-existent key\n#[test]\nfn get_non_existent_value() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n\n    store.set(\"key1\".to_owned(), \"value1\".to_owned()).wait()?;\n    assert_eq!(store.get(\"key2\".to_owned()).wait()?, None);\n\n    // Open from disk again and check persistent data\n    drop(store);\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n    assert_eq!(store.get(\"key2\".to_owned()).wait()?, None);\n\n    Ok(())\n}\n\n#[test]\nfn remove_non_existent_key() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n    assert!(store.remove(\"key1\".to_owned()).wait().is_err());\n    Ok(())\n}\n\n#[test]\nfn remove_key() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n    store.set(\"key1\".to_owned(), \"value1\".to_owned()).wait()?;\n    assert!(store.remove(\"key1\".to_owned()).wait().is_ok());\n    assert_eq!(store.get(\"key1\".to_owned()).wait()?, None);\n    Ok(())\n}\n\n// Insert data until total size of the directory decreases.\n// Test data correctness after compaction.\n#[test]\nfn compaction() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n\n    let dir_size = || {\n        let entries = WalkDir::new(temp_dir.path()).into_iter();\n        let len: walkdir::Result<u64> = entries\n            .map(|res| {\n                res.and_then(|entry| entry.metadata())\n                    .map(|metadata| metadata.len())\n            })\n            .sum();\n        len.expect(\"fail to get directory size\")\n    };\n\n    let mut current_size = dir_size();\n    for iter in 0..1000 {\n        for key_id in 0..1000 {\n            let key = format!(\"key{}\", key_id);\n            let value = format!(\"{}\", iter);\n            store.set(key, value).wait()?;\n        }\n\n        let new_size = dir_size();\n        if new_size > current_size {\n            current_size = new_size;\n            continue;\n        }\n        // Compaction triggered\n\n        drop(store);\n        // reopen and check content\n        let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n        for key_id in 0..1000 {\n            let key = format!(\"key{}\", key_id);\n            assert_eq!(store.get(key).wait()?, Some(format!(\"{}\", iter)));\n        }\n        return Ok(());\n    }\n\n    panic!(\"No compaction detected\");\n}\n\n#[test]\nfn concurrent_set() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n\n    // concurrent set in 8 threads\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 8)?;\n    let runtime = Runtime::new()?;\n    let executor = runtime.executor();\n    runtime.block_on_all(future::lazy(move || {\n        for i in 0..10000 {\n            executor.spawn(\n                store\n                    .set(format!(\"key{}\", i), format!(\"value{}\", i))\n                    .map_err(|_| ()),\n            );\n        }\n        future::ok::<(), KvsError>(())\n    }))?;\n\n    // We only check concurrent set in this test, so we check sequentially here\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 1)?;\n    for i in 0..10000 {\n        assert_eq!(\n            store.get(format!(\"key{}\", i)).wait()?,\n            Some(format!(\"value{}\", i))\n        );\n    }\n\n    Ok(())\n}\n\n#[test]\nfn concurrent_get() -> Result<()> {\n    let temp_dir = TempDir::new().expect(\"unable to create temporary working directory\");\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 8)?;\n    // We only check concurrent get in this test, so we set sequentially here\n    for i in 0..100 {\n        store\n            .set(format!(\"key{}\", i), format!(\"value{}\", i))\n            .wait()\n            .unwrap();\n    }\n\n    let runtime = Runtime::new()?;\n    let executor = runtime.executor();\n    runtime.block_on_all(future::lazy(move || {\n        for thread_id in 0..100 {\n            for i in 0..100 {\n                let key_id = (i + thread_id) % 100;\n                executor.spawn(\n                    store\n                        .get(format!(\"key{}\", key_id))\n                        .map(move |res| {\n                            assert_eq!(res, Some(format!(\"value{}\", key_id)));\n                        })\n                        .map_err(|_| ()),\n                );\n            }\n        }\n        future::ok::<(), KvsError>(())\n    }))?;\n\n    // reload from disk and test again\n    let store = KvStore::<RayonThreadPool>::open(temp_dir.path(), 8)?;\n    let runtime = Runtime::new()?;\n    let executor = runtime.executor();\n    runtime.block_on_all(future::lazy(move || {\n        for thread_id in 0..100 {\n            for i in 0..100 {\n                let key_id = (i + thread_id) % 100;\n                executor.spawn(\n                    store\n                        .get(format!(\"key{}\", key_id))\n                        .map(move |res| {\n                            assert_eq!(res, Some(format!(\"value{}\", key_id)));\n                        })\n                        .map_err(|_| ()),\n                );\n            }\n        }\n        future::ok::<(), KvsError>(())\n    }))?;\n\n    Ok(())\n}\n"
  },
  {
    "path": "courses/rust/projects/project-5/tests/thread_pool.rs",
    "content": "use std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::Arc;\n\nuse kvs::thread_pool::*;\nuse kvs::Result;\n\nuse crossbeam_utils::sync::WaitGroup;\n\nfn spawn_counter<P: ThreadPool>(pool: P) -> Result<()> {\n    const TASK_NUM: usize = 20;\n    const ADD_COUNT: usize = 1000;\n\n    let wg = WaitGroup::new();\n    let counter = Arc::new(AtomicUsize::new(0));\n\n    for _ in 0..TASK_NUM {\n        let counter = Arc::clone(&counter);\n        let wg = wg.clone();\n        pool.spawn(move || {\n            for _ in 0..ADD_COUNT {\n                counter.fetch_add(1, Ordering::SeqCst);\n            }\n            drop(wg);\n        })\n    }\n\n    wg.wait();\n    assert_eq!(counter.load(Ordering::SeqCst), TASK_NUM * ADD_COUNT);\n    Ok(())\n}\n\nfn spawn_panic_task<P: ThreadPool>() -> Result<()> {\n    const TASK_NUM: usize = 1000;\n\n    let pool = P::new(4)?;\n    for _ in 0..TASK_NUM {\n        pool.spawn(move || {\n            // It suppresses flood of panic messages to the console.\n            // You may find it useful to comment this out during development.\n            panic_control::disable_hook_in_current_thread();\n\n            panic!();\n        })\n    }\n\n    spawn_counter(pool)\n}\n\n#[test]\nfn naive_thread_pool_spawn_counter() -> Result<()> {\n    let pool = NaiveThreadPool::new(4)?;\n    spawn_counter(pool)\n}\n\n#[test]\nfn shared_queue_thread_pool_spawn_counter() -> Result<()> {\n    let pool = SharedQueueThreadPool::new(4)?;\n    spawn_counter(pool)\n}\n\n#[test]\nfn rayon_thread_pool_spawn_counter() -> Result<()> {\n    let pool = RayonThreadPool::new(4)?;\n    spawn_counter(pool)\n}\n\n#[test]\nfn shared_queue_thread_pool_panic_task() -> Result<()> {\n    spawn_panic_task::<SharedQueueThreadPool>()\n}\n"
  },
  {
    "path": "courses/tp101-intro-to-oss.md",
    "content": "# TP 101: Introduction to Open Source Software\n\nThis course includes a collection of some open source software related learning materials and will walk you through some of the key concepts of open source. \n\n***Important note:*** ***Introduction to Open Source Software is in an alpha\nstate.*** Its scope is limited. If you are taking it now you\nare brave, but you are also an early tester and your feedback is greatly\nappreciated. You are encouraged to reporting bugs, suggest changes, update the contents, etc. **See [Contributing Guide](../CONTRIBUTING.md)for more details.** \n\n## Who this is for\n\nAnyone interesed in open source\n\n## What you will learn?\n\n* what open source software is\n* the history of open source software and what benefits it has provided to the world’s technology infrastructure over the decades\n* different licensing models that are available, as this will help you decide what the best license is for your project.\n* open source organizations and the roles of foundations in open source projects\n\n### Prerequisites:\n\nNone. This course is a great introduction for you to learn open source.\n\n## Course details\n\n### Chapter 1: Open Source Overview\n\n**Learning Materials:**\n\n* [What is Open Source explained in LEGO](https://www.youtube.com/watch?v=a8fHgx9mE5U), a video made by [Socialsquare](https://www.youtube.com/user/bitblueprint), can help you easily understand the idea of Open Source, even for people with no prior knowledge of Open Source or Free Software.  \n* [6 pivotal moments in open source history](https://opensource.com/article/18/2/pivotal-moments-history-open-source), a blog written by [Dave Neary](https://opensource.com/users/dneary), can help you learn about the key moments in the history of open source.\n* [Why Open Source](https://ben.balter.com/2015/11/23/why-open-source/), a blog written by [Ben Balter](https://ben.balter.com/about/), listed many reasons why you might consider consuming, publishing, collaborating on, or supporting open source. \n* [Open Source vs. Closed Source Software](https://www.youtube.com/watch?v=2q91vTvc7YE), a video where you can learn about the differences between open-source software and closed-source software \n* [The Future of Open Source?](https://www.youtube.com/watch?v=ZCmqeOHhjzk&t=32s) | When Open Source gets monetized, a video talks about what the future of open source looks like.\n\n### Chapter 2: Open Source Licenses\n\n**Learning Materials:**\n\n* [Licenses & Standards](https://opensource.org/licenses) shows the general accepted licenses, which has undergone rigorous review by the open source legal community.\n* [Open Source Licenses Comparison [Guide]](https://itsfoss.com/open-source-licenses-explained/) gives an effective Open Source licenses comparison. With Open Source licenses explained there, it should help you choose the right Open Source license for your project. \n* [The Legal Side of Open Source](https://opensource.guide/legal/) tells everything you've ever wondered about the legal side of open source, and a few things you didn't.\n\n### Chapter 3: Open Source Organizations\n\n**Learning Materials:**\n\n* [Open source organizations](https://opensource.com/resources/organizations) listed some open source organizations providing processes for managing intellectual property, accepting financial contributions, and other infrastructure and stewardship that growing projects need, such as Apache Software Foundation, Cloud Native Computing Foundation, Linux Foundation, and so on.\n* [The Role of Foundations in Open Source Projects](https://livablesoftware.com/study-open-source-foundations/), a blog posted by Javier Cánovas, who studied the role of foundations in open source software development with his/her friends, and found that very few foundations are devoted to providing complete support to the projects they endorse, and that their mission is more directed towards providing legal support and leading evangelizing actions.\n\n### Suggeted Assignments\n\nYou can self-test your learning outcomes by drawing a mindmap of (either of them) :\n\n* open source history\n* pros and cons of open source\n* how to choose an open source license\n\nThe mindmap is encourged to be submitted by creating a pull request to the this course. Learn how to create a pull request in [TP 102: How to Use Git and GitHub](tp102-how-to-use-git-github.md)\n\n## Users who took this course also took\n\n* [TP 102: How to Use Git and GitHub](tp102-how-to-use-git-github.md)\n* [TP 103: Build A Welcoming Open Source Community](tp103-open-source-community.md)\n\n## Acknowledgement\n\nSpecial Thanks to `Jamie Xu`, `Lillian Li`, `Ran Huang`, and `Weiwei Wang` for testing this course and updating the materials\n"
  },
  {
    "path": "courses/tp102-how-to-use-git-github.md",
    "content": "# TP 102: How to Use Git and GitHub\n\nGit and GitHub are commonly used tools in open source practice. Whether you are considering contribute to an open source project or start your own open source project. This course includes a collection of Git and GitHub related learning materials and will guide you through everything you need to start contributing, from managing notifications to merging pull requests. \n\n***Important note:*** ***How to Use Git and GitHub is in an alpha\nstate.*** Its scope is limited. If you are taking it now you\nare brave, but you are also an early tester and your feedback is greatly\nappreciated. You are encouraged to reporting bugs, suggest changes, update the contents, etc. **See [Contributing Guide](../CONTRIBUTING.md) for more details.** \n\n\n## Who this is for\n\nNew GitHub users, users new to Git\n\n## What you will learn?\n\n* what GitHub is\n* how to use GitHub\n* how to create a branch and a commit\n* how to review a pull request\n* how to manage merge conflicts\n* how to communicate using Markdown\n\n### Prerequisites:\n\nNone. This course is a great introduction for your first day on GitHub.\n\n## Course details\n\n### Chapter 1: Introduction to GitHub\n\n**Learning Material(s):**\n\n* [Introduction to GitHub](https://lab.github.com/githubtraining/introduction-to-github), an open source course created by [The GitHub Training Team](https://lab.github.com/githubtraining)\n \n**Suggested Assignments:**\n\n* Finish the lab.\n\n### Chapter 2: Reviewing pull requests\n\n**Learning Material(s):**\n\n* [Reviewing pull requests](https://lab.github.com/githubtraining/reviewing-pull-requests), an open source course created by [The GitHub Training Team](https://lab.github.com/githubtraining)\n \n**Suggested Assignments:**\n\n* Finish the lab.\n\n### Chapter 3: Managing merge conflicts\n\n**Learning Material(s):**\n\n* [Managing merge conflicts](https://lab.github.com/githubtraining/managing-merge-conflicts), an open source course created by [The GitHub Training Team](https://lab.github.com/githubtraining)\n \n**Suggested Assignments:**\n\n* Finish the lab.\n\n### Chapter 4: Communicating using Markdown\n\n**Learning Material(s):**\n\n* [Communicating using Markdown](https://lab.github.com/githubtraining/communicating-using-markdown), an open source course created by [The GitHub Training Team](https://lab.github.com/githubtraining)\n \n**Suggested Assignments:**\n\n* Finish the lab.\n\n### Chapter 5: Git Handbook\n\n* [Git Handbook](https://guides.github.com/introduction/git-handbook/), the official learning material provided by [GitHub Guides](https://guides.github.com/)\n\n**Suggested Assignments:**\n\nNo assignments, the git skill will be tested all the time you participate in an open source project.\n\n## Users who took this course also took\n\n* [TP 101: Introduction to Open Source Software](tp101-intro-to-oss.md)\n* [TP 103: Build A Welcoming Open Source Community](tp103-open-source-community.md)\n\n\n## Acknowledgement\n\nSpecial Thanks to:\n\n* `Producer Wen`, `Qinyao Yang`, and `Jason Zhang`for testing this course and updating the materials.\n* [The GitHub Training Team](https://lab.github.com/githubtraining) for creating open source courses above.\n"
  },
  {
    "path": "courses/tp103-open-source-community.md",
    "content": "# TP 103: Build A Welcoming Community\n\nA welcoming community is an investment into your project’s future and reputation. People in a welcoming community may be encouraged to use, contribute to, and evangelize your project. This course includes a collection of open source community related learning materials and will guide you through roles in open source projects, community governance model, tips for keeping the community vibrant, combined with open source practice in TiDB as a study case.\n\n***Important note:*** ***Build A Welcoming Community is in an alpha\nstate.*** Its scope is limited. If you are taking it now you\nare brave, but you are also an early tester and your feedback is greatly\nappreciated. You are encouraged to reporting bugs, suggest changes, update the contents, etc. **See [Contributing Guide](../CONTRIBUTING.md) for more details.** \n## Who this is for\n\nOwners of open source projects, open source enthusiasts\n\n## What you will learn?\n\n* roles and organism in Open Source Community\n* community governance model\n* how to Keep the Community Vibrant\n* leadership in open source community\n\n### Prerequisites:\n\nWe recommend you first complete [TP 101: Introduction to Open Source Software](./tp101-intro-to-oss.md)\n\n## Course details\n\n### Chapter 1: Roles and Organism in Open Source Community\n\n**Learning Materials:**\n\n* [Roles In Open Source Projects](http://oss-watch.ac.uk/resources/rolesinopensource)\n* [How to build an open source community](http://oss-watch.ac.uk/resources/howtobuildcommunity)\n* [Governance Models](http://oss-watch.ac.uk/resources/governancemodels)\n* *[The Cathedral & the Bazaar: Musings on Linux and Open Source by an Accidental Revolutionary](https://www.goodreads.com/book/show/134825.The_Cathedral_the_Bazaar)*\n\n### Chapter 2: Rules for an Online Community\n\n**Learning Materials:**\n\n* [How to Create & Enforce Rules for an Online Community](https://www.impactbnd.com/blog/how-to-create-enforce-rules-for-an-online-community)\n* [Writing Great Rules for Your Facebook Group | Facebook Community](https://www.facebook.com/community/establishing-membership-and-rules/how-to-write-great-group-rules/)\n* [Your Code of Conduct | Open Source Guides](https://opensource.guide/code-of-conduct/)\n* [GitHub Community Guidelines - GitHub Help](https://help.github.com/en/github/site-policy/github-community-guidelines)\n* [Women of Email™](https://www.facebook.com/groups/womenofemail/) (Example)\n* [Community - Kubernetes](https://kubernetes.io/community/code-of-conduct/) （Example)\n\n### Chapter 3: How to Keep the Community Vibrant\n\n**Learning Materials:**\n\n* Online \n\t* [How to Build a Vibrant Open-Source Community in 5 Steps](https://adevait.com/blog/workplace/build-open-source-community)\n\t* [25 Experts Drop Wisdom on How to Grow a Vibrant Online Community](https://www.postplanner.com/expert-advice-how-to-grow-vibrant-online-community/)\n\t* [How to better communicate with your community](https://www.trainingjournal.com/articles/features/how-better-communicate-your-community)\n\t* [How do open source communities blog?](https://mast.informatik.uni-hamburg.de/wp-content/uploads/2013/01/How-do-open-source-communities-blog.pdf)\n\t* [The Best 6 Free and Open Source Webinar Software Solutions](https://www.goodfirms.co/blog/best-free-open-source-webinar-software-solutions)\n\n* Offline\n\t* [Events: The life force of open source](https://www.redhat.com/en/blog/events-life-force-open-source)\n\t* [Making the Best Open Source Meetups](https://sourceforge.net/blog/making-best-open-source-meetups/)\n\t* [How to Meetup: Hosting and Finding Community Events](https://www.youtube.com/watch?v=SkwKOVCDGM8&list=PLlrxD0HtieHjdA53xa_-iR5KoKHXlVULP&index=23)\n\t* [The Top 42 Meetup Open Source Projects](https://awesomeopensource.com/projects/meetup)\n\t* [40 top Linux and open source conferences in 2019](https://opensource.com/article/18/12/top-2019-conferences)\n\n### Chapter 4: Leadership in Open Source Community\n\n**Learning Materials:**\n\n* [How to Community: Anatomy of Successful Open Source Communities and Projects](https://www.youtube.com/watch?v=nGKSnMdBFsk)\n* [Building effective community leaders: a guide - Jono Bacon at DevXcon 2018](https://www.youtube.com/watch?v=PHHt1I0x8VM)\n* [Leadership and Governance](https://opensource.guide/leadership-and-governance/)\n\n### Case Study\n\n* [Open Source Practice in TiDB](https://github.com/tidb-incubator/tidb-in-action/tree/master/session5)\n\n### Suggested Assignments\n\n* Taking an open source project as an example, try to figure out the pros and cons of its community.\n\nThe outcome is encouraged to be supplemented into [Case Study](#case-study) by creating a pull request. Learn how to create a pull request in [TP 102: How to Use Git and GitHub](tp102-how-to-use-git-github.md).\n\n## Users who took this course also took\n\n* [TP 101: Introduction to Open Source Software](tp101-intro-to-oss.md)\n* [TP 102: How to Use Git and GitHub](tp102-how-to-use-git-github.md)\n\n## Acknowledgement\n\nSpecial Thanks to `Calvin Weng`, `Coco Yi`, `Shen Lin`, `Linda Wang`, `Wenting Liu`, `Yajing Wang`for testing this course and updating the materials.\n"
  },
  {
    "path": "talent-challenge-program/MENTEE_APPLY_TEMPLATE.md",
    "content": "# Mentee Apply Template\n\nMail to: talent-plan@tidb.io\n\n## Mail Subject: \n\nTCP Mentee Application - {project name} - {personal name}\n\n## Message body\n\nPlease make a self-introduction briefly, including but not limited to:\n\n* your name\n* your nationality\n* your education background\n* your performance in talent plan courses or what you have contributed to TiDB projects\n* the project you are applying for\n\n\n## Attachments\n\nPlease attach your updated profile and any other materials that demonstrate your abilities.\n"
  },
  {
    "path": "talent-challenge-program/PROJECT_IDEA_TEMPLATE.md",
    "content": "```\n#### TiDB Ecosystem Project Name\n##### Title\n- Description:\n- Recommended Skills:\n- Mentor(s):\n- Upstream Issue or RFC (URL):\n```"
  },
  {
    "path": "talent-challenge-program/README.md",
    "content": "# Talent Challenge Program\n\nTalent Challenge program is a platform that offers a structured remote mentoring program for **college students** successfully completing talent plan courses or having contributed to TiDB projects. Open source projects related to TiDB ecosystems will be selected together with professional mentors. Students **successfully completing talent plan courses or having contributed to TiDB projects** can apply for the projects, one at a time, and finish the projects with the help of the mentors in a given time. Mentees gain real-world experience by working closely with mentors. Students who successfully complete the projects will receive **bonus and better job opportunities**.\n\n### Current cycle\n\nTalent Challenge program season 1 is ongoing, check the timeline and projects available on [dedicated page](s1.md).\n\n## Communication\n\nFeel free to contact us in the **#talent-challenge** channel of the [tidbcommunity](https://slack.tidb.io/invite?team=tidb-community&channel=talent-challenge-&ref=github/talent-plan) slack workspace if any questions and suggestions about Talent Challenge program arise.\n\n## How to Participate\n\nYou can participate in Talent Challenge program based on your role. Talent Challenge supports the following roles.\n\n### Project Maintainers/Mentors\n\nProject maintainers or mentors are requested to submit the ideas related to **TiDB Ecosystem** under the [Project Ideas](project-ideas.md) page using the [template](PROJECT_IDEA_TEMPLATE.md).\n\nPMC(Project Management Committee) of TiDB community will select the projects that will participate in the Talent Challenge program round and they will appear on the [Selected Projects](selected-projects.md) page after the selection.\n\n*Note:*\n\n- *Projects to be selected must have one mentor at least.*\n- *Mentors should be prepared to donate their time to help mentees with the project.*\n\n### Mentees\n\n*Note:*\n\n- Only **students who have completed talent plan courses or having contributed to TiDB projects** can apply for Talent Challenge program. \n- You are eligible to participate as a mentee in a single project per-cycle.\n\n**Prior to the opening of applications, mentee candidates are encouraged to talk to mentors about the project.** This helps them refine their ideas and deepen their understanding of the project.\n\n#### Mentee selection process\n\n1. Mentee candidates who want to participate in Talent Challenge are expected to join Slack Channel ([#talent-challenge](https://slack.tidb.io/invite?team=tidb-community&channel=talent-challenge-&ref=github/talent-plan)) to have self-introductions.\n2. The mentors would communicate with mentee candidates about the project they would focus on and assign mentee candidates coding tasks.\n3. Mentee candidates need to conduct coding tasks for their desired project under the guidance of mentors and submit their resumes to [talent-plan@tidb.io](maito:talent-plan@tidb.io) using the [template](MENTEE_APPLY_TEMPLATE.md). \n4. The mentors would decide whether to accept mentee candidates in the project based on their scores of talent plan courses, coding assignments, and capabilities.\n"
  },
  {
    "path": "talent-challenge-program/project-ideas.md",
    "content": "## Project ideas\n\nProject maintainers and mentors, please submit the ideas below section using the template. Project ideas selected in season 1 will be listed in [Selected Projects](selected-projects.md) page\n\n### Template\n\n```\n#### TiDB Ecosystem Project Name\n##### Title\n- Description:\n- Recommended Skills:\n- Mentor(s):\n- Upstream Issue or RFC (URL):\n```\n\n### Proposed Project ideas\n\n#### BR\n\n##### BR HTTP Storage\n- Description: Support HTTP(S) server as source and destination for BR, and allow BR itself act as an authenticated HTTP(S) server to simplify deployment.\n- Recommended Skills: Go, Rust, HTTP communication, TLS handling.\n- Mentor(s): kennytm\n- Upstream Issue or RFC (URL): \n   - https://github.com/pingcap/br/issues/308,\n    - https://github.com/pingcap/br/issues/212 \n\n##### BR Export\n- Description: Building on top of BR backup, implement an “export” function to produce CSV and SQL dump.\n- Recommended Skills: Rust, Go, Row encoding (MVCC and TiDB), gRPC.\n- Mentor(s): kennytm\n- Upstream Issue or RFC (URL): https://github.com/pingcap/br/issues/351 \n\n#### TiUP Bench\n\n##### Generate BR Backup Archive\n- Description: Currently TPC-C/TPC-H data prepared by tiup bench can either be inserted via SQL or dumped into CSV files for bulk ingestion. Both methods are slow compared with BR restore. In this project, we want to directly generate a BR backup archive, so benchmarks not caring about the prepare step could be ramped up quickly.\n- Recommended Skills: Go, Row encoding (TiDB), TiKV/RocksDB SST format\n- Mentor(s): kennytm\n- Upstream Issue or RFC (URL): https://github.com/pingcap/go-tpc/issues/46 \n\n#### TiCDC\n\n##### TiCDC Cloud Storage\n- Description: Some usage scenarios need to send the changed events to low-cost storage medium such as S3, in order to keep data for a long time and can consume historical changed events asynchronously. We should design and implement the storage strategy for TiCDC open protocol in cloud storage, and provide the consumption strategies based on the storage sketch in cloud storage.\n- Recommended Skills: Go, Cloud storage service.\n- Mentor(s): yangfei\nUpstream Issue or RFC (URL): https://github.com/pingcap/ticdc/issues/655\n\n##### TiCDC Snapshot Level Consistency Replication\n* Description: In many scenarios users want to ensure the downstream is replicated to a globally consistent state, as TiCDC supports eventual transaction consistency, and TiDB supports snapshot read, we could combine these two features and provide a snapshot level consistency replication strategy.\n* Recommended Skills: Go, Transaction.\n* Mentor(s): yangfei\n* Upstream Issue or RFC (URL): https://github.com/pingcap/ticdc/issues/658\n\n##### TiCDC New Mechanism for ResolvedTS\n* Description: TiCDC needs a timestamp (called ResolvedTS) in which we can ensure all transactions which start before this timestamp have completed and been sent from TiKV to TiCDC. For now, TiKV must advance the ResolvedTS in the leader of the Raft group. We require a new mechanism to eliminate this restriction.\n* Recommended Skills: Go, Rust, Raft\n* Mentor(s): tangminghua\n* Upstream Issue or RFC (URL): https://github.com/pingcap/ticdc/issues/657\n\n##### TiCDC Supports Avro Sink and Kafka Connector\n* Description: Apache Kafka provides a flexible connectors mechanism, which is widely used in change data capture scenarios. We want to implement an Avro sink and make TiCDC compatible with the Kafka connector ecosystem.\n* Recommended Skills: Go, Kafka.\n* Mentor(s): yangfei, liuzixiong\n* Upstream Issue or RFC (URL): https://github.com/pingcap/ticdc/issues/660\n\n##### TiCDC Support a status mechanism for changefeed\n* Description: Various errors may be encountered during the execution of replication tasks (e.g. downstream link failure, incompatible DDLs, etc.). we hope to provide a mechanism so that users can quickly understand the status of the current replication task (normal or abnormal), and the reason for the error.\n* Recommended Skills: Go, SQL.\n* Mentor(s): zhaoyilin\n* Upstream Issue or RFC (URL): https://github.com/pingcap/ticdc/issues/664\n\n#### PD\n\n##### PD Store & Region UI\n* Description: Add display and operation UI for PD stores and regions, in order to reduce the necessity of using pd-ctl and enhance user experience.\n* Recommended Skills: Go, Web Frontend.\n* Mentor(s): @HundunDM @breeswish\n* Upstream Issue or RFC (URL): https://docs.google.com/document/d/1moQVhvIgqu_FWuv_UMB76AM5tETJkyeWnzI04wyevhk/edit\n\n##### PD Encryption at rest\n* Description: Encryption at rest means that data is encrypted when it is stored, TiKV is already supported, but PD is not. PD stores the meta information of the cluster, especially the Key information of the Region, we need to encrypt it. Here it is proposed that PD also supports encryption.\n* Recommended Skills: Go, Cryptography\n* Mentor(s)：@yiwu-arbug\n* Upstream Issue or RFC (URL): \n\t* TiKV: https://github.com/tikv/rfcs/blob/929bf1f5d675b555c013d863599544afd9bfe812/text/2020-04-27-encryption-at-rest.md\n\t* PD: WIP\n\n#### TiDB\n\n##### Live Execution Plan\n* Description: Provide a way to query current execution details for running SQLs. This feature is similar to the Live Query Statistics in the SQL server. SQL server allows viewing the live execution plan for any queries.\n* Recommended Skills: Go, SQL\n* Mentor(s): @crazycs520 @breeswish @qw4990\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/17692\n\n##### Print Txn ID and Query ID in log to trace the whole lifetime of a Txn / SQL\n* Description: TiDB now outputs TxnStartTs or ConnId in logs, which is not sufficient. This task is to allocate and print a unique TxnId for each transaction, as well as a unique QueryId for each query, for both TiDB and TiKV.\n* Recommended Skills: Go, Rust\n* Mentor(s): @crazycs520 @breeswish @SunRunAway\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/17845\n\n##### Defining Placement Rules in SQL\n* Description: TiDB supports placement rules, but it can only be defined in configuration files. If there is an approach to configure placement rules through statements, usability can be improved. \n* Recommended Skills: Go, Data Definition Language\n* Mentor(s): @djshow832\n* Upstream Issue or RFC (URL): \n\t* https://github.com/pingcap/tidb/issues/18030\n\t* https://docs.google.com/document/d/18Kdhi90dv33muF9k_VAIccNLeGf-DdQyUc8JlWF9Gok/edit#\n\n##### Support Multiple Tables Rename in A Statement\n* Description: TiDB supports renaming one table but doesn’t support renaming multiple tables. This task wants to support renaming multiple tables in a statement.\n* Recommended Skills: Go, DDL\n* Mentor(s): @zimulala\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/14766\n\n##### Support the operation of dropping multi-indexes in a statement\n* Description: This task wants to support the operation of dropping multi-indexes in a statement.\n* Recommended Skills: Go, DDL\n* Mentor(s): @zimulala\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/14765\n\n##### Dropping column with index covered\n* Description: Support the operation of deleting columns containing indexes.\n* Recommended Skills: Go, DDL\n* Mentor(s): @zimulala\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/3364\n\n##### Support SAVEPOINT in TiDB\n* Description: SAVEPOINT is a feature basically supported by mainstream traditional databases (Oracle, DB2, MySQL, and PostgreSQL), and its role is to partially roll back multiple statements of the transaction being executed. TiDB does not currently support this feature.\n* Recommended Skills: Go\n* Mentor(s): @bobotu\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/6840\n\n##### Support LIST COLUMNS partitioning\n* Description: LIST COLUMNS partitioning is a feature basically supported by MySQL 8.0, and its role is to define table partition with list columns. TiDB does not currently support this feature.\n* Recommended Skills: Go, DDL, SQL\n* Mentor(s): @imtbkcat\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/18052\n\n##### Support Global Index for Partition Table\n* Description: Currently TiDB only supports local partitioned indexes that compatible with mysql，but other database(e.g. Oracle) also supports global partitioned indexes\n* Recommended Skills: Go, DDL, SQL\n* Mentor(s): @tiancaiamao\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/18032\n\n##### Implement Join Order Hint\n* Description: Provide a comment style SQL hint to specify the order of joins in the query.\n* Recommended Skills: Go, SQL\n* Mentor(s): @eurekaka\n* Upstream Issue or RFC (URL): WIP\n\n##### Reduce memory consumption of stats data\n* Description: When there're lots of tables in a TiDB cluster, caching all the stats data into a single TiDB server may cause a high memory consumption when the TiDB server bootstrapped. It increases the OOM risk of the TiDB server.\n* Recommended Skills: Go\n* Mentor(s): @SunRunAway\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/16572\n\n##### Reduce memory consumption of table meta\n* Description: TiDB always loads all tables in all schema at once in bootstrap, which can consume very much memory. It increases the OOM risk of the TiDB server.\n* Recommended Skills: Go\n* Mentor(s): @bb7133, @SunRunAway\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/16572\n\n##### Support utf8_unicode_ci/utf8mb4_unicode_ci collation\n* Description: Implement the utf8_unicode_ci/utf8mb4_unicode_ci collation algorithm and optimize them.\n* Recommended Skills: Go\n* Mentor(s): @wjhuang2016\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/17596\n\n##### Implement More Diagnostics Rules \n* Description: Add more diagnose rule in TiDB SQL diagnose. \n* Recommended Skills: Go, SQL\n* Mentor(s): @crazycs520\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/17927\n\n#### TiKV\n\n##### Witness\n* Description: support raft witness role, and use it in the dual data center deployment scenario, TiDB can still provide service no matter which one of the data center crash\n* Recommended Skills: Rust, Raft\n* Mentor(s): @busyjay\n* Upstream Issue or RFC(URL): WIP\n\n##### Loose Follower Read\n* Description: Provide a way to read follower doesn’t need to send a request to the leader\n* Recommended Skills: Rust, Raft\n* Mentor(s): @hicqu\n* Upstream Issue or RFC (URL): WIP\n\n##### Write flow control\n* Description: Control the writing flow by requests' latency, and make the writing smoothly\n* Recommended Skills: Rust\n* Mentor(s): @Conner1996\n* Upstream Issue or RFC (URL): https://docs.google.com/document/d/1rgm4rS2youwJpy_zpC39BJgxPpnwk7DeuF5LjvWrBZ8/edit#\n\n##### SQL Statement Level Statistics\n* Description: To make it possible to know what statement is the root cause of hot regions, we need to add local statistics to TiKV that counts top K hot statements and then reports them to PD.\n* Recommended Skills: Rust, Go\n* Mentor(s): @breeswish @HundunDM\n* Upstream Issue or RFC (URL): https://github.com/pingcap-incubator/tidb-dashboard/issues/574\n"
  },
  {
    "path": "talent-challenge-program/s1.md",
    "content": "# Talent Challenge Program Season 1\n\n_Status: ongoing_\n\n### Timeline\n_Note: this timeline is proposed and may be subject to change before the formal program launch announcement_\n\n- June 7 - June 19: project applications opened\n    - projects are invited to submit their proposals to [Project Ideas](project-ideas.md) page;\n- June 21: selected projects/slots are announced;\n- June 21 - July 5: mentees applications opened, projects are selecting mentees;\n- July 8 - mentees are selected by the mentors, coding starts;\n- August 5 - 1st evaluation checkpoint;\n    - Mentors verify the quality of the completed tasks;\n    - First 50% of the stipend is being paid to the mentee if this stage is passed;\n- September 16 - 2nd (final) evaluation checkpoint;\n    - Coding ends;\n    - The other 50% of the stipend is being paid to the mentees;\n- September 23: results announced!\n\n### Selected Projects\n\nSelected projects are listed on the [Selected Projects](selected-projects.md) page\n"
  },
  {
    "path": "talent-challenge-program/selected-projects.md",
    "content": "## Selected Projects in Season 1\n\nSelected Projects in Season 1 are listed below. Mentee candidates who want to participate in a certain project please refer to [Mentee Selection Process](README.md#mentees)\n\nThe difficulty of the project is divided into three levels: Very hard, Hard, and Medium, the corresponding pre-tax bonus is RMB 10000 to a very hard project, RMB 8000 to a hard project and RMB 5000 to a medium project respectively. \n\n### Template\n\n```\n#### TiDB Ecosystem Project Name\n##### Title\n- Description:\n- Recommended Skills:\n- Mentor(s):\n- Upstream Issue or RFC (URL):\n- Difficulty:\n```\n\n## List of Selected Projects\n\n#### BR\n\n##### BR Export\n\n- Description: Building on top of BR backup, implement an “export” function to produce CSV and SQL dump.\n- Recommended Skills: Rust, Go, Row encoding (MVCC and TiDB), gRPC.\n- Mentor(s): @kennytm\n- Upstream Issue or RFC (URL): https://github.com/pingcap/br/issues/351\n- Difficulty: Hard\n\n#### TiCDC\n\n##### TiCDC Cloud Storage\n\n* Description: Some usage scenarios need to send the changed events to low-cost storage medium such as S3, in order to keep data for a long time and enable consuming historical changed events asynchronously. We should design and implement the storage strategy for TiCDC open protocol in cloud storage, and provide the consumption strategies based on the storage sketch in cloud storage.\n* Recommended Skills: Go, Cloud storage service.\n* Mentor(s): @amyangfei\n* Upstream Issue or RFC (URL): https://github.com/pingcap/ticdc/issues/655\n* Difficulty: Medium\n\n##### TiCDC Snapshot Level Consistency Replication\n\n* Description: In many scenarios users want to ensure the downstream is replicated to a globally consistent state, as TiCDC supports eventual transaction consistency, and TiDB supports snapshot read, we could combine these two features and provide a snapshot level consistency replication strategy.\n* Recommended Skills: Go, Transaction.\n* Mentor(s): @amyangfei\n* Mentee: [@Colins110](https://github.com/Colins110)\n* Upstream Issue or RFC (URL): https://github.com/pingcap/ticdc/issues/658\n* Difficulty: Medium\n\n\n##### TiCDC Supports Avro Sink and Kafka Connector\n\n* Description: Apache Kafka provides a flexible connectors mechanism, which is widely used in change data capture scenarios. We want to implement an Avro sink and make TiCDC compatible with the Kafka connector ecosystem.\n* Recommended Skills: Go, Kafka.\n* Mentor(s): @amyangfei, @liuzx\n* Mentee: [@qinggniq](https://github.com/qinggniq)\n* Upstream Issue or RFC (URL): https://github.com/pingcap/ticdc/issues/660\n* Difficulty: Medium\n\n#### TiDB\n\n##### Live Execution Plan\n\n* Description: Provide a way to query current execution details for running SQLs. This feature is similar to the Live Query Statistics in the SQL server. SQL server allows viewing the live execution plan for any queries.\n* Recommended Skills: Go, SQL\n* Mentor(s): @crazycs520 @breeswish @qw4990\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/17692\n* Difficulty: Medium\n\n##### Defining Placement Rules in SQL\n\n* Description: TiDB supports placement rules, but it can only be defined in configuration files. If there is an approach to configure placement rules through statements, usability can be improved. \n* Recommended Skills: Go, Data Definition Language\n* Mentor(s): @djshow832\n* Mentee: [@xhe](https://github.com/xhebox)\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/18030\n* Difficulty: Hard\n\n##### Support SAVEPOINT in TiDB\n\n* Description: SAVEPOINT is a feature basically supported by mainstream traditional databases (Oracle, DB2, MySQL, and PostgreSQL), and its role is to partially roll back multiple statements of the transaction being executed. TiDB does not currently support this feature.\n* Recommended Skills: Go\n* Mentor(s): @bobotu\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/6840\n* Difficulty: Very Hard\n\n##### Support Global Index for Partition Table\n\n* Description: Currently TiDB only supports local partitioned indexes that compatible with mysql，but other database(e.g. Oracle) also supports global partitioned indexes\n* Recommended Skills: Go, DDL, SQL\n* Mentor(s): @tiancaiamao\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/18032\n* Difficulty: Hard\n\n##### Reduce memory consumption of stats data\n\n* Description: When there're lots of tables in a TiDB cluster, caching all the stats data into a single TiDB server may cause a high memory consumption when the TiDB server bootstrapped. It increases the OOM risk of the TiDB server.\n* Recommended Skills: Go\n* Mentor(s): @SunRunAway\n* Mentee: @[miamiaoxyz](https://github.com/miamia0)\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/16572\n* Difficulty: Medium\n\n##### Support utf8_unicode_ci/utf8mb4_unicode_ci collation\n\n* Description: Implement the utf8_unicode_ci/utf8mb4_unicode_ci collation algorithm and optimize them.\n* Recommended Skills: Go, C++, Rust\n* Mentor(s): @wjhuang2016\n* Mentee: @[xiongjiwei](https://github.com/xiongjiwei)\n* Upstream Issue or RFC (URL): https://github.com/pingcap/tidb/issues/17596\n* Difficulty: Medium\n\n#### TiKV\n\n##### SQL Statement Level Statistics\n\n* Description: To make it possible to know what statement is the root cause of hot regions, we need to add local statistics to TiKV that counts top K hot statements and then reports them to PD.\n* Recommended Skills: Rust, Go,  Algorithm / Data Structure\n* Mentor(s): @breeswish @HundunDM\n* Upstream Issue or RFC (URL): https://github.com/pingcap-incubator/tidb-dashboard/issues/574\n* Difficulty: Hard\n\n##### HBase protocol support on Zetta\n\n* Description: Zetta is designed as a BigTable implementation on top of TiKV to support structured schemaless data model. In order to elaborate existing HBase ecosystem, we plan to implement the HBase protocol adaptor for Zetta. To achieve this, we need to:\n\t1. Implement a mock ZooKeeper to eliminate external dependency\n\t2. Implement RPC protocol of HBase RegionServer\n\t3. Implement HBase functionality on top of Zetta\n* Recommended Skills: Go, Java, HBase RPC\n* Mentor(s): pseudocodes, baiyuqing\n* Mentee: [@BowenXiao1999](https://github.com/BowenXiao1999)\n* Upstream Issue or RFC (URL): https://github.com/zhihu/zetta/issues/2（in Chinese）\n* Difficulty: Hard \n\n#### Chaos Mesh \n\n##### Support using plugins to extend scheduler  \n\n* Description: In many scenarios users need to customize selector. For example, when our tidb cluster has multiple pds, we just want to inject the failure to the leader. So we need to provide a plugin to let the users to extend the selector, and users can implement their own selector through code. For example, we can create a file called `pd-selector.go` and set it in the selector field.  \n* Recommended Skills: Go, Kubernetes\n* Mentor(s): @cwen0\n* Upstream Issue or RFC (URL): https://github.com/pingcap/chaos-mesh/issues/193\n* Difficulty: Medium \n\n##### Support injecting HTTP fault\n\n* Description: In many scenarios, users need to inject an HTTP delay fault or an HTTP abort fault on the special application. For example, we just want to inject a delay fault on getting `/api/xxx` router.\n* Recommended Skills: Go, Kuberenetes \n* Mentor(s): @Yisaer\n* Upstream Issue or RFC (URL): https://github.com/pingcap/chaos-mesh/issues/651\n* Difficulty: Hard  \n"
  },
  {
    "path": "talent-challenge-program2021/MENTEE_APPLY_TEMPLATE.md",
    "content": "# Mentee Application Form Template\n\nMail to: talent-plan@tidb.io\n\n## Mail Subject: \n\nTCP Mentee Application - {project name} - {personal name}\n\n## Message body\n\nPlease make a self-introduction briefly, including but not limited to:\n\n* Your name\n* Your nationality\n* Your education background\n* The project you are applying for\n* Your performance in talent plan courses or what you have contributed to TiDB projects\n* Any other evidences that prove your capabilities\n\n\n## Attachments\n\nPlease attach your updated profile and any other materials that demonstrate your abilities.\n"
  },
  {
    "path": "talent-challenge-program2021/PROJECT_IDEA_TEMPLATE.md",
    "content": "```\n\n## Description\n\nwhat's the problem, how to solve it\n\n## Document Collection\n\n- Proposal doc: ${proposal doc}\n- Weekly report: ${weekly report link}\n\n## Talent Challenge Program information\n\n- Mentor of this issue: @github_id\n- Recommended skills: ${skills and URL link}\n- Estimated Workloads: (XL, man-month)\n\n## Milestones and action items\n\nMilestone 1: ${milestone descption}, Expected finish date: ${date}\n\n- [ ] action item 1\n- [ ] action item 2\n\nMilestone 2: ${milestone descption}, Expected finish date: ${date}\n\n- [ ] action item 1\n- [ ] action item 2\n\n```\n"
  },
  {
    "path": "talent-challenge-program2021/README.md",
    "content": "# Talent Challenge Program 2021\n\nTalent Challenge program is a platform that offers a structured remote mentoring program for **college students** who have successfully completed talent plan courses or contributed to TiDB projects. Open source projects related to TiDB ecosystems will be selected together with professional mentors. Students can apply for the projects, one at a time, and finish the projects with the help of the mentors in a given time. Mentees gain real-world experiences by working closely with mentors. Students who successfully complete the projects will receive **bonus and better job opportunities**.\n\n### Current cycle\n\nTalent Challenge program 2021 is ongoing, check the timeline and projects available on [dedicated page](schedule.md).\n\n## Communication\n\nFeel free to contact us in the **#talent-challenge** channel of the [tidbcommunity](https://slack.tidb.io/invite?team=tidb-community&channel=talent-challenge-&ref=github/talent-plan) slack workspace if any questions and suggestions about Talent Challenge program arise.\n\n## How to Participate\n\nYou can participate in Talent Challenge program based on your role. Talent Challenge supports the following roles.\n\n### Project Maintainers/Mentors\n\nProject maintainers or mentors are requested to submit the ideas related to **TiDB Ecosystem** under the [Project Ideas](project-ideas.md) page using the [template](PROJECT_IDEA_TEMPLATE.md).\n\nPMC(Project Management Committee) of TiDB community will select the projects that will participate in the Talent Challenge program round and they will appear on the [Selected Projects](selected-projects.md) page after the selection.\n\n*Note:*\n\n- *Projects to be selected must have one mentor at least.*\n- *Mentors should be prepared to donate their time to help mentees with the project.*\n\n### Mentees\n\n*Note:*\n\n- Must be college students at school.\n- **Students who have completed talent plan courses or contributed to TiDB projects** are encouraged to apply for the program and they will be considered as priority, or who have proven capabilites on distributed database development.\n- You are eligible to participate as a mentee in a single project per-cycle.\n\n**Prior to the opening of applications, mentee candidates are encouraged to talk to mentors about the project.** This helps them refine their ideas and deepen their understanding of the project.\n\n#### Mentee selection process\n\n1. Mentee candidates who want to participate in Talent Challenge are expected to join Slack Channel ([#talent-challenge](https://slack.tidb.io/invite?team=tidb-community&channel=talent-challenge-&ref=github/talent-plan)) to have self-introductions.\n2. The mentors would communicate with mentee candidates about the project they would focus on and assign mentee candidates coding tasks.\n3. Mentee candidates need to conduct coding tasks for their desired project under the guidance of mentors and submit their resumes to [talent-plan@tidb.io](maito:talent-plan@tidb.io) using the [template](MENTEE_APPLY_TEMPLATE.md). \n4. The mentors would decide whether to accept mentee candidates in the project based on their scores of talent plan courses, coding assignments, and capabilities.\n"
  },
  {
    "path": "talent-challenge-program2021/project-ideas.md",
    "content": "## Project ideas\n\nProject maintainers and mentors, please submit the ideas below section using the template. Project ideas selected in season 1 will be listed in [Selected Projects](selected-projects.md) page\n\n### Template\n\n```\n## TiDB Ecosystem Project Name\n\n## Title\n\n## Description\n\nwhat's the problem, how to solve it\n\n## Document Collection\n\n- Proposal doc: ${proposal doc}\n- Weekly report: ${weekly report link}\n\n## Talent Challenge Program information\n\n- Mentor of this issue: @github_id\n- Recommended skills: ${skills and URL link}\n- Estimated Workloads: (XL, man-month)\n\n## Milestones and action items\n\nMilestone 1: ${milestone descption}, Expected finish date: ${date}\n\n- [ ] action item 1\n- [ ] action item 2\n\nMilestone 2: ${milestone descption}, Expected finish date: ${date}\n\n- [ ] action item 1\n- [ ] action item 2\n\n```\n\n### Proposed Project ideas\n\n\n"
  },
  {
    "path": "talent-challenge-program2021/schedule.md",
    "content": "# Talent Challenge Program 2021 Schedule\n\n_Status: ongoing_\n\n### Timeline\n_Note: this timeline is proposed and may be subject to change before the formal program launch announcement_\n\n#### Season 1\n\n- June 15 - July 15: mentees applications opened, projects are selecting mentees;\n- July 19 - mentees are selected by the mentors, coding starts;\n- 1st evaluation checkpoint (mentor decides);\n    - Mentors verify the quality of the completed tasks;\n    - First 50% of the stipend is being paid to the mentee if this stage is passed;\n- 2nd (final) evaluation checkpoint (mentor decides);\n    - Coding ends;\n    - The other 50% of the stipend is being paid to the mentees;\n    - results announced!\n\n#### Season 2\n\n- Sep 01 - Sep 15: mentees applications opened, projects are selecting mentees;\n- Sep 20 - mentees are selected by the mentors, coding starts;\n- 1st evaluation checkpoint (mentor decides);\n    - Mentors verify the quality of the completed tasks;\n    - First 50% of the stipend is being paid to the mentee if this stage is passed;\n- 2nd (final) evaluation checkpoint (mentor decides);\n    - Coding ends;\n    - The other 50% of the stipend is being paid to the mentees;\n    - results announced!\n\n#### Season 3\n\n- Nov 01 - Nov 15: mentees applications opened, projects are selecting mentees;\n- Nov 18 - mentees are selected by the mentors, coding starts;\n- 1st evaluation checkpoint (mentor decides);\n    - Mentors verify the quality of the completed tasks;\n    - First 50% of the stipend is being paid to the mentee if this stage is passed;\n- 2nd (final) evaluation checkpoint (mentor decides);\n    - Coding ends;\n    - The other 50% of the stipend is being paid to the mentees;\n    - results announced!\n\n### Selected Projects\n\nSelected projects are listed on the [Selected Projects](selected-projects.md) page\n"
  },
  {
    "path": "talent-challenge-program2021/selected-projects.md",
    "content": "## Selected Projects in Season 1\n\nSelected Projects in Sprint 1 are listed below. Mentee candidates who want to participate in a certain project please refer to [Mentee Selection Process](README.md#mentees)\n\nThe difficulty of the project is divided into three levels: Very hard, Hard, and Medium, the corresponding pre-tax bonus is RMB 10000 to a very hard project, RMB 8000 to a hard project and RMB 5000 to a medium project respectively. \n\n### Template\n\n```\n\n## Description\n\nwhat's the problem, how to solve it\n\n## Document Collection\n\n- Proposal doc: ${proposal doc}\n- Weekly report: ${weekly report link}\n\n## Talent Challenge Program information\n\n- Mentor of this issue: @github_id\n- Recommended skills: ${skills and URL link}\n- Estimated Workloads: (XL, man-month)\n\n## Milestones and action items\n\nMilestone 1: ${milestone descption}, Expected finish date: ${date}\n\n- [ ] action item 1\n- [ ] action item 2\n\nMilestone 2: ${milestone descption}, Expected finish date: ${date}\n\n- [ ] action item 1\n- [ ] action item 2\n\n```\n\n## List of Selected Projects\n\n#### SQL\n\n* [tidb/issues/25149](https://github.com/pingcap/tidb/issues/25149) Optimize CTE performance, [@wjhuang2016](https://github.com/wjhuang2016)\n* [tidb/issues/14486](https://github.com/pingcap/tidb/issues/14486) (Occupied)Implement missing JSON functions, [@nullnotnil](https://github.com/nullnotnil)\n* [tidb/issues/25152](https://github.com/pingcap/tidb/issues/25152) GBK charset, [@xiongjiwei](https://github.com/xiongjiwei)\n* [tidb/issues/25150](https://github.com/pingcap/tidb/issues/25150) (Occupied)Expression index GA, [@wjhuang2016](https://github.com/wjhuang2016)\n* [tidb/issues/25204](https://github.com/pingcap/tidb/issues/25204) Local temporary table, [@djshow832](https://github.com/djshow832)\n* [tidb/issues/14580](https://github.com/pingcap/tidb/issues/14580) Only full group by check，needed things(relational algebra, graph theory), [@winoros](https://github.com/winoros)\n* [tidb/issues/25293](https://github.com/pingcap/tidb/issues/25293) (Occupied)Optimizing hotspot small tables, [@tiancaiamao](https://github.com/tiancaiamao)\n* [tidb/issues/13709](https://github.com/pingcap/tidb/issues/13709) (Occupied)Cascades planner,[@chrysanxia](https://github.com/chrysanxia)\n* [tidb/issues/18745](https://github.com/pingcap/tidb/issues/18745) (Occupied)Support to export historical statistics,[@qw4990](https://github.com/qw4990)\n\n#### Storage\n\n* [tidb/issues/25281](https://github.com/pingcap/tidb/issues/25281) (Occupied)Historical Hotspot Region, [@nolouch](https://github.com/nolouch)\n* [pd/issues/4095](https://github.com/tikv/pd/issues/4095)(Occupied)Enhance Split Table Stability and Usability,[@Yisaer](https://github.com/Yisaer)\n* [pd/issues/3736](https://github.com/tikv/pd/issues/3736) Build scheduling model with Simulink, [@bufferflies](https://github.com/bufferflies)\n* [tikv/issues/10867](https://github.com/tikv/tikv/issues/10867) (Occupied)Support limiting read flow for TiKV IO rate limiter,[@Connor1996](https://github.com/connor1996)\n\n#### Talent Plan\n\n* [tidb/issues/25321](https://github.com/pingcap/tidb/issues/25321)（Occupied） TinySQL: design and implement a learning-friendly distributed database [@rebelice](https://github.com/rebelice)\n"
  },
  {
    "path": "talent-plan-1.0/1.0-lp-tidb.md",
    "content": "# 路径 1：TiDB 方向\n\n## 课程目标\n* 掌握 Go 语言\n* 掌握分布式计算基本原理\n* 掌握数据库基础知识\n* 掌握优化器和执行引擎基本原理\n\n## 课程内容\n\n### Section 1 熟悉 Go 语言基础知识\n\n**学习资料：**\n\n* 阅读许老师的书 [《Go 语言开发》](https://book.douban.com/subject/11577300/)\n* [Go 官方教程](http://tour.golang.org/)\n* [Effective Go](https://golang.org/doc/effective_go.html)\n* [Profiling Go Programs](https://blog.golang.org/profiling-go-programs)\n\n**课程作业：**\n\n* 用 Go 语言实现一个多路归并的 Merge Sort：内存中有一个无序的 int64 数组，数组中有 16M 个整数，要求使用多个 goroutine 对这个无序数组进行排序，使得有元素按照从小到大的顺序排列，并且排序的性能需要比单线程 Quick Sort 快。\n* 根据[框架](https://github.com/pingcap/talent-plan/tree/master/tidb/mergesort)完成程序，**要求跑通测试程序，并使用 Go Profile  工具分析性能瓶颈。需要有文档、单元测试、性能瓶颈分析。**\n\n### Section 2 分布式计算基础知识\n\n**学习资料：**\n\n* 学习并使用 Go 语言完成 [6.824 Lab 1: MapReduce](https://pdos.csail.mit.edu/6.824/labs/lab-1.html)\n\n**课程作业：**\n\n* 使用 Go 语言，使用框架代码，用 MapReduce + Shuffle 的方式完成作业：从包含大量 URL 的数据文件中，求出现次数最多的前 10 个 URL 和他们的出现次数，尽量利用 CPU 多核特性和内存资源。\n* 根据[作业框架](https://github.com/pingcap/talent-plan/tree/master/tidb/mapreduce)完成作业，详细的作业要求、框架的使用方法和评分规则请看框架的 README 文件\n\n### Section 3 数据库基础知识\n\n**学习资料：**\n\n* [《数据库系统概念》](https://book.douban.com/subject/1929984/)部分章节阅读和自学，或者 [CMU 15-445](https://15445.courses.cs.cmu.edu/fall2018/schedule.html) 对应部分内容\n\t* 第 3 章：SQL\n\t* 第 11 章：索引与散列\n\t* 第 12 章：查询处理\n\t* 第 13 章：查询优化\n\t* 第 14 章：事务\n\t* 第 15 章：并发控制\n\t* 第 18 章：并行数据库\n\t* 第 19 章：分布式数据库\n\n**课程作业：**\n\n* select t1.a, count(*), avg(t1.b) from t1 left outer join t2 on t1.a=t2.a group by t1.a，请给出所有可能的逻辑执行计划（画出 Plan 树），并分析 t1 的数据分布对各种逻辑执行计划执行性能的影响。画 Plan 树时可以利用 [Graphviz 作图](http://www.webgraphviz.com)，例如对于 select * from t where a > 1，一个可能的执行计划可以如下图所示：\n\n![Execution-example](../media/execution-example.jpg)\n\n### Section 4 SQL 优化器和执行引擎基本原理\n\n**学习资料：**\n\n* [CMU 15-721](https://15721.courses.cs.cmu.edu/spring2018/) 数据库课程，自学 + 在线视频教学\n\t* Optimizer Implementation (Part I)\n\t* Optimizer Implementation (Part II)\n\t* Cost Models\n\t* Execution & Scheduling\n\t* Vectorized Execution (Part I)\n\t* Vectorized Execution (Part II)\n\t* Parallel Join Algorithms (Hashing)\n\t* Parallel Join Algorithms (Sorting)\n\n**课程作业：**\n\n* 用 Go 语言，实现一个 Join 算法，从两个 CSV 文件中读取数据，在一个或多个等值条件上进行连接，并对最终结果求和。请参考 [README](https://github.com/pingcap/talent-plan/tree/master/tidb/join) ，使用提供的框架完成作业，并跑通测试程序。提交的作业要求代码整洁规范，附有文档，并提供对程序的性能瓶颈分析及优化思路。\n\n### Section 5 阅读 TiDB 源码\n\n**学习资料：**\n\n* [TiDB 源码阅读 24 章经](https://pingcap.com/blog-cn/#TiDB-%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB)\n\n**课程作业：**\n\n* 给 TiDB Repo 提 PR，例如修复 [for new contributors issues](https://github.com/pingcap/tidb/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3A%22for+new+contributors%22+)。\n\n## 考核要点\n\n完成各项作业，代码通过邮件提交到 ts-team@pingcap.com，要求使用 Golang 1.12，需要有代码、测试、注释、文档。\n\n我们会根据以下规则进行评分，最终得到一个 0~100 分的分数\n\n1. 代码可以跑过 PingCAP 提供的测试程序（一些题目有性能要求，希望在规定的时间内跑完）50% \n2. 单元测试覆盖率 30%\n3. [代码风格](https://github.com/pingcap/community/blob/master/CONTRIBUTING.md#code-style) 10%\n4. 文档情况 10%\n"
  },
  {
    "path": "talent-plan-1.0/1.0-lp-tikv.md",
    "content": "# 路径 2：TiKV 方向\n\n## 课程目标\n* 掌握 Rust 语言\n* 掌握分布式一致性算法 Raft\n* 掌握分布式存储基本原理\n\n## 课程内容\n\n### Section 1 熟悉 Rust 语言基础知识\n\n**学习资料：**\n\n* [Practical Networked Applications in Rust](https://github.com/pingcap/talent-plan/tree/master/courses/rust)\n* 阅读《[Rust 编程之道](https://book.douban.com/subject/30418895/)》或者《[深入浅出 Rust](https://book.douban.com/subject/30312231/)》或者 [Rust 官方教程](https://doc.rust-lang.org/book/) 三选一 \n\n**课程作业：**\n\n* 完成  [Practical Networked Applications in Rust](https://github.com/pingcap/talent-plan/tree/master/courses/rust) 中 Project 1、2（给该课程提出改进意见并帮助改进，根据意见及改进情况会有额外加分哦~）\n\n### Section 2 熟悉 Rust 语言基础知识\n\n**学习资料：**\n\n* [Practical Networked Applications in Rust](https://github.com/pingcap/talent-plan/tree/master/courses/rust)\n* 阅读《[Rust 编程之道](https://book.douban.com/subject/30418895/)》或者《[深入浅出 Rust](https://book.douban.com/subject/30312231/)》或者 [Rust 官方教程](https://doc.rust-lang.org/book/) 三选一 \n\n**课程作业：**\n\n* 完成  [Practical Networked Applications in Rust](https://github.com/pingcap/talent-plan/tree/master/courses/rust) 中 Project 3、4（给该课程提出改进意见并帮助改进，根据意见及改进情况会有额外加分哦~）\n\n### Section 3 分布式存储基础知识\n\n**学习资料：**\n\n* 学习 Raft Paper 和 [6.824 Lab 2: Raft](https://pdos.csail.mit.edu/6.824/labs/lab-raft.html) 线上课程\n\n**课程作业：**\n\n* 使用 Rust 语言 完成 6.824 Lab 2 [raft 作业](https://github.com/pingcap/talent-plan/tree/master/dss)\n\n### Section 4 分布式系统基础知识\n\n**学习资料：**\n\n* 完成 [6.824 Lab 3: Fault-tolerant Key/Value Service](https://pdos.csail.mit.edu/6.824/labs/lab-kvraft.html) 线上课程\n\n**课程作业：**\n\n* 使用 Rust 语言 完成 6.824 Lab 3 [kvraft 作业](https://github.com/pingcap/talent-plan/tree/master/dss)\n\n### Section 5  阅读 TiKV 源码\n\n**学习资料：**\n\n* [TiKV 源码解析](https://pingcap.com/blog-cn/#TiKV-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90)（持续更新中）\n\n**课程作业：**\n\n* 给 TiKV Repo 提 PR，例如修复 [for new contributors issues](https://github.com/tikv/tikv/issues?q=is%3Aissue+is%3Aopen+label%3A%22D%3A+Easy%22+label%3A%22S%3A+HelpWanted%22)。\n* 给 PD Repo 提 PR，例如修复 [for new contributors issues]()。\n\n## 考核方式\n\n根据提交到程序是否能通过测试给出 Pass or Fail\n\n1. 代码可以跑过 PingCAP 提供的测试程序 50% \n\t\n\ta. make check\n\t\n\tb. make test\n\n2. 代码风格 30%\n3. 文档情况 20%\n\n"
  },
  {
    "path": "talent-plan-1.0/README-CN.md",
    "content": "# Talent Plan Courses 1.0\n\nTalent Plan 1.0 课程中共有 2 条学习路径供大家选择，分别是：\n\n* 面向分布式关系型数据库 SQL 层的 [TiDB 方向](1.0-lp-tidb.md)\n* 面向分布式 Key-value 数据库存储层的 [TiKV 方向](1.0-lp-tikv.md)\n\n正在学习 Talent Plan 1.0 课程的小伙伴可通过上述链接查看相关路径的课程详情。\n\n> ***特别提醒：***\n>\n> Talent Plan 2.0 课程已正式上线，相比 1.0 版本，新增了用 Go 语言全新设计的分布式关系型数据库 TinySQL 课程和分布式 Key-value 数据库 TinyKV 课程，并结合大家的兴趣爱好和知识背景全新规划了 5 条推荐的学习路径，分别是：\n>\n> * 路径 1：[实现一个 Mini 版本的分布式关系型数据库](https://learn.pingcap.com/learner/talent-plan/implement-a-mini-distributed-relational-database)\n> * 路径 2：[实现一个 Mini 版本的分布式 Key-value 数据库](https://learn.pingcap.com/learner/talent-plan/implement-a-mini-distributed-key-value-database)\n> * 路径 3：[参与工业级开源分布式关系型数据库 TiDB 的开发实践](https://learn.pingcap.com/learner/talent-plan/become-a-tidb-contributor)\n> * 路径 4：[参与工业级开源分布式 Key-value 数据库 TiKV 的开发实践](https://learn.pingcap.com/learner/talent-plan/become-a-tikv-contributor)\n> * 路径 5：[Rust 编程原理与实践](>https://learn.pingcap.com/learner/talent-plan/rust-programming)\n>\n> 小伙伴们也可直接通过 [Talent Plan 官网](https://learn.pingcap.com/learner/talent-plan) 开始 Talent Plan 2.0 课程的学习。\n"
  },
  {
    "path": "tidb/.gitignore",
    "content": ".idea/\n"
  },
  {
    "path": "tidb/README.md",
    "content": "# Distributed Systems in Go\n\n* Week 1: [Merge Sort](./mergesort)\n* Week 2: [Map Reduce](./mapreduce)\n* Week 4: [Parallel Join](./join)\n\n"
  },
  {
    "path": "tidb/join/Makefile",
    "content": ".PHONY: all\n\nall: test bench\n\ntest:\n\tgo test\n\nbench:\n\tgo test -bench Benchmark -run xx -count 5 -benchmem\n"
  },
  {
    "path": "tidb/join/README.md",
    "content": "## Introduction\n\nThis is the homework for PingCAP Talent Plan Online of week 4. This homework is a simplified version of [ACM SIGMOD Programming Contest 2018](http://sigmod18contest.db.in.tum.de/index.shtml).\n\nThe task is to evaluate batches of join queries on a set of pre-defined relations. Each join query specifies two relations, multiple (equality) join predicates, and one (sum) aggregation. The challenge is to fully utilize the CPU and memory resources and execute the queries as fast as possible.\n\nNOTE: **go 1.12 is required**\n\n## Details\n\nThe simple interface `Join(f0, f1 string, offset0, offset1 []int) (sum uint64)` is defined in `join.go`. Our test harness will feed two relations and two columns' offsets array to the interface every time, and check the correctness of the output result. Explaination to the four input arguments and one output argument of the interface are list as follows:\n\n- **f0**: File name of the given relation0.\n- **f1**: File name of the given relation1.\n- **offset0**: Offsets of which columns the given relation0 should be joined.\n- **offset1**: Offsets of which columns the given relation1 should be joined.\n- **sum** (output argument): Sum of the relation0.col0 in the final join result.\n\nThe (equality) join predicates are specified by the `offset0/1`. The form of the join predicates is like:\n``` go\nrelation0.cols[offset[0]] = relation1.cols[offset[0]] and relation0.cols[offset[1]] = relation1.cols[offset[1]]...\n```\n\n**Example**: `Join(\"/path/T0\", \"/path/T1\", []int{0, 1}, []int{2, 3})`\n\nTranslated to SQL:\n\n``` sql\nSELECT SUM(T0.COL0)\nFROM T0, T1\nON T0.COL0=T1.COL2 AND T0.COL1=T1.COL3\n```\n\nWe provide a sample as `join_example.go: JoinExample` which performs a simple hash join algorithm. It uses the relation0 to build the hash table, and probe the hash table for every row in relation1.\n\n## Requirements and rating principles\n\n- (30%) Pass all test cases.\n- (20%) Perform better than `join_example.go:JoinExample`.\n- (35%) Have a document to describe your idea and record the process of performance optimization with `pprof`.\n- (15%) Keep a good code style.\n\nNote:\n1. For your check sums, you do not have to worry about numeric overflows as long as you are using 64 bit unsigned integers.\n2. More large datasets are provided [here](https://drive.google.com/drive/u/1/folders/10-iJNGKmKXgMmvBYnKt88RTwC0iA1XM-), you can use them to help profile your program.\n3. We'll use the `BenchmarkJoin` and `BenchmarkJoinExample` which can be found in `benchmark_test.go` to evaluate your program. Test data will **NOT** be outside of what we've provided.\n\n## How to use\n\n1. Please implement your own `Join` in join.go to accomplish this task.\n2. We provide CSV versions (.tbl files) of three relations in directory `t`. You can load them into a DBMS to test your program.\n   1. **r0.tbl**: 2 columns * 10,000 records\n   2. **r1.tbl**: 4 columns * 5,000 records\n   3. **r2.tbl**: 4 columns * 500 records\n3. There is already a built-in unit test `JoinTest` defined in `join_test.go`. You can write your own unit tests, but please make sure `JoinTest` can be passed before.\n4. Use `make test` to run all the unit tests.\n5. Use `make bench` to run all the benchmarks.\n"
  },
  {
    "path": "tidb/join/benchmark_test.go",
    "content": "package main\n\nimport \"testing\"\n\nfunc BenchmarkJoin(b *testing.B) {\n\tfor i := 0; i < b.N; i++ {\n\t\tJoin(\"./t/r0.tbl\", \"./t/r2.tbl\", []int{0}, []int{1})\n\t}\n}\n\nfunc BenchmarkJoinExample(b *testing.B) {\n\tfor i := 0; i < b.N; i++ {\n\t\tJoinExample(\"./t/r0.tbl\", \"./t/r2.tbl\", []int{0}, []int{1})\n\t}\n}\n"
  },
  {
    "path": "tidb/join/go.mod",
    "content": "module join\n\ngo 1.12\n\nrequire (\n\tgithub.com/pingcap/check v0.0.0-20171206051426-1c287c953996\n\tgithub.com/pingcap/tidb v2.1.7+incompatible\n)\n"
  },
  {
    "path": "tidb/join/go.sum",
    "content": "github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/beorn7/perks v0.0.0-20160229213445-3ac7bf7a47d1/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/blacktear23/go-proxyprotocol v0.0.0-20180807104634-af7a81e8dd0d/go.mod h1:VKt7CNAQxpFpSDz3sXyj9hY/GbVsQCr0sB3w59nE7lU=\ngithub.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292/go.mod h1:qRiX68mZX1lGBkTWyp3CLcenw9I94W2dLeRvMzcn9N4=\ngithub.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=\ngithub.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=\ngithub.com/coreos/etcd v3.2.18+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=\ngithub.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd v0.0.0-20180202092358-40e2722dffea/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=\ngithub.com/cznic/mathutil v0.0.0-20160613104831-78ad7f262603/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=\ngithub.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=\ngithub.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=\ngithub.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM=\ngithub.com/etcd-io/gofail v0.0.0-20180808172546-51ce9a71510a/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-sql-driver/mysql v0.0.0-20170715192408-3955978caca4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/google/btree v0.0.0-20161217183710-316fb6d3f031/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=\ngithub.com/gorilla/mux v0.0.0-20170228224354-599cba5e7b61/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=\ngithub.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20171020063731-82921fcf811d/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20160910222444-6b7015e65d36/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=\ngithub.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7/go.mod h1:iWMfgwqYW+e8n5lC/jjNEhwcjbRDpl5NT7n2h+4UNcI=\ngithub.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef/go.mod h1:7WjlapSfwQyo6LNmIvEWzsW1hbBQfpUO4JWnuQRmva8=\ngithub.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=\ngithub.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=\ngithub.com/pingcap/check v0.0.0-20171206051426-1c287c953996 h1:ZBdiJCMan6GSo/aPAM7gywcUKa0z58gczVrnG6TQnAQ=\ngithub.com/pingcap/check v0.0.0-20171206051426-1c287c953996/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ=\ngithub.com/pingcap/errors v0.11.1/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=\ngithub.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3/go.mod h1:DazNTg0PTldtpsQiT9I5tVJwV1onHMKBBgXzmJUlMns=\ngithub.com/pingcap/goleveldb v0.0.0-20171020084629-8d44bfdf1030/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw=\ngithub.com/pingcap/kvproto v0.0.0-20190226063853-f6c0b7ffff11/go.mod h1:0gwbe1F2iBIjuQ9AH0DbQhL+Dpr5GofU8fgYyXk+ykk=\ngithub.com/pingcap/parser v0.0.0-20190328044348-9945885931bb/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA=\ngithub.com/pingcap/pd v2.1.0-rc.4+incompatible/go.mod h1:nD3+EoYes4+aNNODO99ES59V83MZSI+dFbhyr667a0E=\ngithub.com/pingcap/tidb v2.1.7+incompatible h1:ZkaxiVAKb6dqAZdA3CkzmYPBEugQ0e/w7hXEhYiwEfE=\ngithub.com/pingcap/tidb v2.1.7+incompatible/go.mod h1:gTnPm64oI1Z1y/LEB3NUcxEgFy8NRswlmgTRiBCrijw=\ngithub.com/pingcap/tidb-tools v2.1.3-0.20190116051332-34c808eef588+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM=\ngithub.com/pingcap/tipb v0.0.0-20180910045846-371b48b15d93/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/common v0.0.0-20180426121432-d811d2e9bf89/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/procfs v0.0.0-20180408092902-8b1c2da0d56d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/sirupsen/logrus v0.0.0-20170323161349-3bcb09397d6d/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=\ngithub.com/spaolacci/murmur3 v0.0.0-20150829172844-0d12bf811670/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/twinj/uuid v0.0.0-20150629100731-70cac2bcd273/go.mod h1:mMgcE1RHFUFqe5AfiwlINXisXfDGro23fWdPUfOMjRY=\ngithub.com/uber/jaeger-client-go v2.8.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=\ngithub.com/uber/jaeger-lib v1.1.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=\ngithub.com/ugorji/go v1.1.1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=\ngithub.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg=\ngithub.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngolang.org/x/crypto v0.0.0-20180503215945-1f94bef427e3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20181105230042-78dc5bac0cac/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngoogle.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0-20161104145732-dd45e6a67c53/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n"
  },
  {
    "path": "tidb/join/join.go",
    "content": "package main\n\n// Join accepts a join query of two relations, and returns the sum of\n// relation0.col0 in the final result.\n// Input arguments:\n//   f0: file name of the given relation0\n//   f1: file name of the given relation1\n//   offset0: offsets of which columns the given relation0 should be joined\n//   offset1: offsets of which columns the given relation1 should be joined\n// Output arguments:\n//   sum: sum of relation0.col0 in the final result\nfunc Join(f0, f1 string, offset0, offset1 []int) (sum uint64) {\n\treturn sum\n}\n"
  },
  {
    "path": "tidb/join/join_example.go",
    "content": "package main\n\nimport (\n\t\"encoding/csv\"\n\t\"io\"\n\t\"os\"\n\t\"strconv\"\n\t\"unsafe\"\n\n\t\"github.com/pingcap/tidb/util/mvmap\"\n)\n\n// JoinExample performs a simple hash join algorithm.\nfunc JoinExample(f0, f1 string, offset0, offset1 []int) (sum uint64) {\n\ttbl0, tbl1 := readCSVFileIntoTbl(f0), readCSVFileIntoTbl(f1)\n\thashtable := buildHashTable(tbl0, offset0)\n\tfor _, row := range tbl1 {\n\t\trowIDs := probe(hashtable, row, offset1)\n\t\tfor _, id := range rowIDs {\n\t\t\tv, err := strconv.ParseUint(tbl0[id][0], 10, 64)\n\t\t\tif err != nil {\n\t\t\t\tpanic(\"JoinExample panic\\n\" + err.Error())\n\t\t\t}\n\t\t\tsum += v\n\t\t}\n\t}\n\treturn sum\n}\n\nfunc readCSVFileIntoTbl(f string) (tbl [][]string) {\n\tcsvFile, err := os.Open(f)\n\tif err != nil {\n\t\tpanic(\"ReadFileIntoTbl \" + f + \" fail\\n\" + err.Error())\n\t}\n\tdefer csvFile.Close()\n\n\tcsvReader := csv.NewReader(csvFile)\n\tfor {\n\t\trow, err := csvReader.Read()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\tpanic(\"ReadFileIntoTbl \" + f + \" fail\\n\" + err.Error())\n\t\t}\n\t\ttbl = append(tbl, row)\n\t}\n\treturn tbl\n}\n\nfunc buildHashTable(data [][]string, offset []int) (hashtable *mvmap.MVMap) {\n\tvar keyBuffer []byte\n\tvalBuffer := make([]byte, 8)\n\thashtable = mvmap.NewMVMap()\n\tfor i, row := range data {\n\t\tfor j, off := range offset {\n\t\t\tif j > 0 {\n\t\t\t\tkeyBuffer = append(keyBuffer, '_')\n\t\t\t}\n\t\t\tkeyBuffer = append(keyBuffer, []byte(row[off])...)\n\t\t}\n\t\t*(*int64)(unsafe.Pointer(&valBuffer[0])) = int64(i)\n\t\thashtable.Put(keyBuffer, valBuffer)\n\t\tkeyBuffer = keyBuffer[:0]\n\t}\n\treturn\n}\n\nfunc probe(hashtable *mvmap.MVMap, row []string, offset []int) (rowIDs []int64) {\n\tvar keyHash []byte\n\tvar vals [][]byte\n\tfor i, off := range offset {\n\t\tif i > 0 {\n\t\t\tkeyHash = append(keyHash, '_')\n\t\t}\n\t\tkeyHash = append(keyHash, []byte(row[off])...)\n\t}\n\tvals = hashtable.Get(keyHash, vals)\n\tfor _, val := range vals {\n\t\trowIDs = append(rowIDs, *(*int64)(unsafe.Pointer(&val[0])))\n\t}\n\treturn rowIDs\n}\n"
  },
  {
    "path": "tidb/join/join_test.go",
    "content": "package main\n\nimport (\n\t\"testing\"\n\n\t\"github.com/pingcap/check\"\n)\n\ntype joinTestSuite struct{}\n\nfunc TestT(t *testing.T) {\n\tcheck.TestingT(t)\n}\n\nvar _ = check.Suite(&joinTestSuite{})\n\nfunc (s *joinTestSuite) TestJoin(c *check.C) {\n\tfor _, t := range []struct {\n\t\tf0       string\n\t\tf1       string\n\t\toffsets0 []int\n\t\toffsets1 []int\n\t\tsum      uint64\n\t}{\n\t\t// r0 join r0 on r0.col0 = r0.col1\n\t\t{\"./t/r0.tbl\", \"./t/r0.tbl\", []int{0}, []int{1}, 0x16CBF2D},\n\t\t// r0 join r1 on r0.col0 = r1.col0\n\t\t{\"./t/r0.tbl\", \"./t/r1.tbl\", []int{0}, []int{0}, 0xC1D73B},\n\t\t// r0 join r1 on r0.col1 = r1.col1\n\t\t{\"./t/r0.tbl\", \"./t/r1.tbl\", []int{1}, []int{1}, 0x33010},\n\t\t// r0 join r2 on r0.col0 = r2.col0\n\t\t{\"./t/r0.tbl\", \"./t/r2.tbl\", []int{0}, []int{0}, 0x1F235},\n\t\t// r0 join r1 on r0.col0 = r1.col0 and r0.col1 = r1.col1\n\t\t{\"./t/r0.tbl\", \"./t/r1.tbl\", []int{0, 1}, []int{0, 1}, 0},\n\t\t// r1 join r2 on r1.col0 = r2.col0\n\t\t{\"./t/r1.tbl\", \"./t/r2.tbl\", []int{0}, []int{0}, 0x18CDA},\n\t\t// r2 join r2 on r2.col0 = r2.col0 and r2.col1 = r2.col1\n\t\t{\"./t/r2.tbl\", \"./t/r2.tbl\", []int{0, 1}, []int{0, 1}, 0x5B385},\n\t} {\n\t\tc.Assert(Join(t.f0, t.f1, t.offsets0, t.offsets1), check.Equals, t.sum)\n\t\t//c.Assert(JoinExample(t.f0, t.f1, t.offsets0, t.offsets1), check.Equals, t.sum)\n\t}\n}\n"
  },
  {
    "path": "tidb/join/t/r0.tbl",
    "content": "1,7277\n3,7506\n7,10488\n11,4923\n15,7803\n19,9251\n23,9239\n28,9961\n31,8944\n33,5726\n38,4517\n39,10350\n41,9926\n42,9587\n45,8220\n48,10129\n53,8545\n57,8798\n61,9511\n65,6292\n70,8270\n74,5872\n76,10476\n80,5238\n84,4526\n88,10457\n90,4690\n92,8501\n93,6074\n95,4963\n99,4912\n103,7256\n105,8893\n110,5515\n112,7236\n115,4410\n116,5315\n118,9120\n120,5690\n122,5233\n124,8281\n129,7944\n133,5938\n136,7374\n141,6798\n143,10119\n148,8310\n152,8499\n153,9619\n155,5308\n158,5652\n161,4710\n165,9509\n166,9760\n167,6465\n170,7678\n173,6813\n175,6440\n176,8871\n180,4844\n184,9571\n186,10474\n190,4853\n193,5550\n196,8969\n201,9483\n205,7933\n206,7523\n208,5712\n210,6323\n214,7833\n215,6972\n218,8080\n219,7886\n221,7354\n223,5753\n228,8325\n229,5311\n231,6620\n233,4740\n236,5223\n241,8910\n244,6436\n249,10466\n253,6984\n256,4538\n259,4826\n263,10068\n266,5143\n267,7806\n272,5397\n274,4753\n277,7158\n282,7853\n285,9511\n288,5627\n290,8405\n293,7451\n296,7757\n297,9185\n301,6271\n303,10280\n306,8365\n310,5060\n312,4963\n313,7233\n315,6833\n318,9620\n323,5943\n326,10264\n328,7806\n333,8872\n336,7349\n338,5164\n340,5683\n343,9871\n348,8282\n353,10359\n356,5812\n361,10326\n364,9617\n365,9742\n367,7932\n368,8939\n370,9908\n374,5557\n378,9549\n380,4901\n383,10448\n386,6573\n389,6316\n394,5673\n395,6375\n399,10418\n404,5357\n409,4768\n412,6016\n416,7066\n420,8490\n424,6898\n425,7918\n428,8476\n430,7351\n431,10057\n436,8888\n438,6230\n439,4694\n444,6040\n448,5281\n451,5417\n454,10234\n455,9680\n459,9131\n461,9765\n464,6222\n468,5758\n469,4598\n470,8842\n472,8646\n477,6319\n479,4484\n482,9191\n487,9568\n492,5001\n493,10163\n495,9019\n497,7644\n498,9985\n499,7325\n502,8265\n507,9745\n512,7781\n513,7515\n514,8298\n517,8594\n521,8455\n522,7597\n526,4816\n529,9929\n532,7925\n536,6556\n540,9694\n542,6231\n544,5519\n548,8895\n551,10203\n552,10381\n554,8292\n558,10222\n563,7926\n567,4950\n571,9908\n573,4467\n578,9728\n583,4653\n587,7474\n591,7705\n595,10210\n598,7467\n603,6825\n605,6859\n607,9596\n612,10260\n615,5839\n618,7957\n619,8949\n621,7603\n622,5941\n624,7996\n629,10282\n631,9241\n632,5027\n635,7014\n639,4503\n642,10056\n647,5240\n648,5224\n649,9975\n651,9652\n652,9717\n657,9212\n662,4839\n666,9756\n669,7389\n673,4787\n678,10024\n682,7094\n684,6293\n685,7735\n689,9923\n692,6520\n693,8221\n694,9630\n698,8973\n702,9258\n706,5488\n711,10029\n713,7911\n717,8989\n722,9743\n723,9530\n725,6079\n730,7916\n731,8770\n733,9031\n734,6312\n736,9181\n740,5953\n744,4805\n749,6207\n754,5192\n755,6609\n756,5856\n757,8472\n758,7030\n762,10444\n766,10191\n769,5257\n770,4973\n775,7927\n778,4393\n780,6397\n783,9088\n787,6836\n789,9095\n794,9427\n799,6934\n802,8264\n803,9396\n805,8423\n809,4725\n810,7180\n813,8586\n814,8526\n818,4720\n823,8517\n825,6612\n828,6567\n833,7116\n838,5350\n843,4713\n848,6627\n852,7244\n857,9775\n861,7846\n864,9033\n867,10258\n872,5618\n875,5941\n878,6907\n880,10349\n884,8569\n886,5592\n890,7291\n891,7573\n893,9637\n898,6788\n901,5582\n902,4609\n906,5535\n908,4986\n910,7361\n913,7996\n917,5364\n921,10314\n923,7891\n927,5000\n928,6069\n933,7643\n937,10187\n942,9896\n944,6979\n946,9095\n948,4756\n951,8020\n955,7881\n956,8376\n960,6799\n963,10091\n966,6513\n967,7693\n970,7224\n972,9087\n975,4989\n976,8167\n979,8595\n983,7167\n985,9632\n989,7301\n994,5828\n995,8775\n997,7664\n1000,10380\n1005,9992\n1006,5734\n1009,6388\n1011,7844\n1012,9894\n1014,6070\n1017,7131\n1022,7940\n1024,9600\n1029,9654\n1032,8685\n1035,9966\n1039,5315\n1042,7555\n1043,8965\n1046,4984\n1051,7888\n1053,7528\n1056,6184\n1061,7043\n1065,8633\n1067,5221\n1071,4758\n1076,7848\n1079,4531\n1081,7294\n1083,7791\n1084,7447\n1088,10226\n1090,9111\n1091,10254\n1095,8064\n1098,7454\n1099,7731\n1103,10136\n1107,5929\n1108,9066\n1113,7688\n1118,7072\n1120,10095\n1123,7521\n1126,9518\n1131,6713\n1133,9033\n1137,5858\n1139,5210\n1142,6673\n1147,8269\n1149,6816\n1151,4594\n1155,6072\n1159,7276\n1163,9836\n1166,6083\n1167,6102\n1169,5179\n1174,4912\n1177,7237\n1182,5796\n1183,9549\n1186,9077\n1189,10189\n1190,10090\n1194,7008\n1199,10285\n1201,8315\n1206,5772\n1211,5299\n1216,5593\n1217,4549\n1221,9490\n1225,9836\n1227,8259\n1228,5508\n1233,8065\n1237,5976\n1238,6911\n1239,9369\n1242,9546\n1243,6502\n1248,5414\n1253,5052\n1254,4925\n1255,9901\n1259,5967\n1260,7665\n1261,9451\n1262,5869\n1264,9502\n1269,6775\n1273,9415\n1276,5202\n1277,8525\n1282,8991\n1287,9049\n1290,8737\n1294,8589\n1296,8776\n1300,7637\n1302,7917\n1304,5595\n1305,9026\n1307,6624\n1310,7162\n1315,7082\n1320,6476\n1324,5320\n1325,10396\n1326,8920\n1331,8421\n1334,9876\n1337,4671\n1341,9491\n1342,5430\n1346,5273\n1350,5969\n1354,10123\n1358,5315\n1359,9410\n1363,9007\n1368,8232\n1373,6748\n1375,6131\n1379,8366\n1381,7979\n1384,7914\n1389,8519\n1391,8386\n1395,5328\n1400,4808\n1405,5811\n1407,4769\n1408,5117\n1411,5924\n1415,8696\n1420,9794\n1422,4390\n1423,8938\n1428,9372\n1431,5987\n1435,6058\n1436,7005\n1441,9688\n1445,5342\n1448,7999\n1452,7803\n1455,5204\n1459,6974\n1462,7756\n1463,5756\n1464,9201\n1466,6582\n1471,6088\n1476,9061\n1477,8382\n1479,8464\n1482,9401\n1483,4734\n1487,8199\n1489,5777\n1491,7771\n1494,7987\n1497,7878\n1499,7558\n1501,7273\n1503,5268\n1505,8377\n1506,7176\n1507,7244\n1508,8975\n1510,7066\n1511,4814\n1514,5137\n1516,9023\n1520,8105\n1522,10168\n1526,6293\n1531,8826\n1533,7160\n1538,10210\n1539,4838\n1541,8211\n1544,6956\n1548,8600\n1551,4985\n1553,5370\n1555,7960\n1558,7357\n1560,6390\n1561,5608\n1565,7990\n1566,7088\n1567,5818\n1568,6763\n1571,9086\n1575,6478\n1577,10396\n1578,4559\n1579,10427\n1581,7208\n1584,4420\n1585,7553\n1588,5568\n1589,5176\n1590,9892\n1592,6517\n1593,6323\n1597,10412\n1600,5759\n1602,7607\n1605,8697\n1610,9190\n1615,8451\n1617,6745\n1620,5400\n1622,10354\n1623,9562\n1625,7909\n1629,9818\n1632,8847\n1635,6554\n1640,9111\n1642,10036\n1646,4644\n1647,7199\n1650,8663\n1653,5812\n1655,9240\n1660,5563\n1664,5509\n1667,8453\n1669,8779\n1673,7276\n1677,9604\n1678,8885\n1680,8977\n1684,4773\n1688,9261\n1691,5918\n1694,7061\n1695,10201\n1696,9475\n1700,7620\n1703,5220\n1708,9415\n1710,6116\n1712,9805\n1716,5090\n1720,6335\n1722,4672\n1725,9134\n1729,9299\n1730,8985\n1733,10309\n1736,6914\n1737,7457\n1742,10142\n1745,7070\n1748,7798\n1750,7171\n1751,4958\n1752,6464\n1756,8564\n1761,7361\n1765,8864\n1766,9040\n1768,6444\n1773,6184\n1776,7370\n1780,4644\n1784,4558\n1789,8466\n1793,5947\n1794,5223\n1795,8223\n1799,9621\n1802,9829\n1804,4436\n1809,5881\n1814,8039\n1817,5470\n1818,8455\n1821,9113\n1826,4844\n1827,7084\n1831,10439\n1835,4917\n1838,5530\n1843,5887\n1844,4882\n1847,9021\n1851,9495\n1854,8497\n1859,8219\n1863,6205\n1865,6381\n1866,9639\n1871,10148\n1875,8104\n1877,5031\n1879,8634\n1882,5753\n1884,6757\n1889,9628\n1891,8705\n1893,9107\n1898,8055\n1901,5012\n1906,6555\n1909,4547\n1912,10433\n1915,6114\n1917,9116\n1922,6679\n1926,9272\n1931,5574\n1933,6436\n1935,10086\n1939,4512\n1940,10174\n1941,10011\n1943,9015\n1945,4522\n1948,4808\n1953,4857\n1954,6494\n1957,6542\n1960,6260\n1964,9410\n1965,9809\n1968,9731\n1971,5295\n1974,7021\n1977,8020\n1981,5342\n1982,9142\n1983,7845\n1985,5820\n1988,10226\n1992,10235\n1995,8650\n1998,4932\n2000,6921\n2003,9981\n2005,6204\n2006,6566\n2010,4599\n2011,6101\n2012,4778\n2017,10347\n2018,8974\n2019,6006\n2023,6796\n2027,4564\n2029,9375\n2032,8903\n2037,9163\n2042,8090\n2047,9057\n2052,5187\n2057,6460\n2061,9057\n2064,9834\n2065,7239\n2068,9650\n2072,4530\n2076,9893\n2077,7923\n2079,10169\n2080,8047\n2083,5550\n2088,6482\n2093,10036\n2096,6729\n2098,9983\n2100,4414\n2101,8383\n2106,7421\n2108,4510\n2110,9079\n2113,6462\n2116,8269\n2120,6462\n2121,9043\n2123,5382\n2128,8659\n2133,5105\n2134,5342\n2139,7658\n2144,5907\n2145,6401\n2149,8059\n2154,5382\n2156,8232\n2160,10446\n2165,9031\n2167,9803\n2168,5073\n2172,5585\n2177,7539\n2180,4467\n2185,9914\n2188,8545\n2192,9416\n2193,10095\n2198,10211\n2199,8149\n2203,9106\n2204,4713\n2206,5857\n2208,9447\n2213,10467\n2218,6396\n2221,6879\n2226,7401\n2230,6352\n2231,4986\n2234,6779\n2237,8781\n2241,7901\n2244,6120\n2245,9275\n2247,4883\n2250,7709\n2252,5097\n2255,4660\n2259,8412\n2263,7740\n2265,9544\n2270,4955\n2273,6706\n2274,6272\n2279,5204\n2280,7956\n2284,9563\n2287,10455\n2291,4530\n2293,9210\n2298,5001\n2303,5843\n2307,9610\n2310,10259\n2311,7089\n2312,7902\n2317,8559\n2321,8753\n2324,6153\n2326,4514\n2331,6268\n2335,9864\n2340,7287\n2345,5284\n2346,8311\n2348,5106\n2352,5127\n2356,5968\n2357,6363\n2361,7403\n2364,7130\n2368,4532\n2373,6100\n2378,6864\n2382,10444\n2384,5849\n2389,8715\n2392,5112\n2393,6702\n2397,5454\n2400,6313\n2402,10295\n2406,6193\n2407,8075\n2410,7538\n2413,10130\n2416,9100\n2417,8540\n2420,6668\n2422,6591\n2426,5845\n2428,5957\n2429,9710\n2434,5453\n2435,7809\n2436,9462\n2441,7342\n2443,9313\n2445,8232\n2450,4547\n2454,5483\n2458,9827\n2459,10197\n2462,4698\n2465,8934\n2469,7188\n2471,9834\n2476,7526\n2481,7392\n2485,5909\n2488,9193\n2491,9461\n2495,7131\n2497,5213\n2499,6575\n2501,5725\n2503,8467\n2505,5221\n2508,4508\n2510,10249\n2513,7479\n2516,6682\n2519,8839\n2522,4799\n2525,8286\n2530,5883\n2535,7215\n2537,10340\n2540,4924\n2541,5165\n2546,5130\n2549,8784\n2552,9545\n2556,9992\n2558,9046\n2559,7940\n2560,9044\n2563,9801\n2567,9619\n2570,4424\n2571,7939\n2576,6912\n2580,9732\n2581,10079\n2583,8216\n2587,4792\n2590,10129\n2594,9226\n2599,4427\n2601,6992\n2603,5306\n2606,10217\n2610,9030\n2615,7862\n2617,6077\n2620,8987\n2625,9781\n2627,7660\n2629,8774\n2634,9694\n2636,8908\n2638,10383\n2642,5059\n2646,9004\n2649,5388\n2652,10096\n2655,6749\n2660,7571\n2665,7416\n2669,9936\n2674,9237\n2675,8034\n2677,5532\n2682,5803\n2685,10452\n2687,9557\n2691,4983\n2696,7414\n2701,6115\n2706,4671\n2710,5068\n2714,7702\n2718,9038\n2720,4817\n2722,8288\n2726,8500\n2730,7702\n2731,5803\n2733,9409\n2734,4919\n2738,8358\n2739,10077\n2740,8103\n2743,8498\n2746,8032\n2750,7522\n2753,7906\n2758,6960\n2762,5539\n2763,9530\n2764,6699\n2769,8397\n2774,5800\n2779,4624\n2782,4766\n2784,8879\n2788,7059\n2791,5954\n2794,6695\n2799,4867\n2803,7361\n2806,5629\n2810,5402\n2814,9216\n2816,8961\n2820,5186\n2822,8021\n2826,9683\n2829,4792\n2833,4745\n2836,7146\n2837,10417\n2840,6180\n2841,7271\n2844,10010\n2846,6680\n2849,4690\n2851,8377\n2856,9952\n2859,7719\n2860,10121\n2863,5122\n2864,6847\n2866,8018\n2871,8918\n2873,7493\n2876,7881\n2879,5481\n2880,6031\n2882,10068\n2886,6465\n2888,5005\n2892,7221\n2896,5411\n2900,7533\n2902,10110\n2903,7937\n2908,5956\n2913,6221\n2915,6903\n2917,5675\n2921,9144\n2924,7329\n2925,10184\n2929,8083\n2930,6669\n2931,5730\n2932,7211\n2936,5458\n2941,10291\n2945,4778\n2948,6924\n2952,6030\n2957,9828\n2958,9195\n2961,4785\n2965,7455\n2970,8559\n2971,9041\n2976,4797\n2981,9065\n2986,8056\n2989,10091\n2994,8614\n2995,7790\n2999,8030\n3003,8901\n3007,5952\n3009,8640\n3012,5392\n3017,5399\n3021,9609\n3026,5241\n3030,10067\n3031,8665\n3032,8287\n3034,5673\n3035,7409\n3036,5068\n3041,9234\n3042,8345\n3047,4920\n3050,5850\n3051,4691\n3054,9898\n3057,8258\n3061,7001\n3063,6133\n3068,4439\n3073,6056\n3078,6340\n3079,9473\n3083,10204\n3084,5438\n3086,8317\n3091,4513\n3093,4763\n3095,10358\n3098,6572\n3100,10046\n3102,4511\n3106,10063\n3111,10234\n3112,10011\n3115,4392\n3119,4868\n3120,9725\n3122,7551\n3126,4668\n3129,9770\n3132,9515\n3133,7039\n3135,6500\n3136,5671\n3141,9921\n3142,9516\n3146,9298\n3147,10342\n3150,5173\n3152,5051\n3155,8336\n3159,5415\n3160,6109\n3163,5676\n3166,8538\n3168,10034\n3170,10375\n3174,4622\n3176,9722\n3177,5716\n3181,9629\n3185,6084\n3190,10253\n3194,8353\n3198,6661\n3201,10342\n3205,4749\n3207,5639\n3210,4556\n3211,4770\n3212,5325\n3216,5714\n3217,4729\n3218,5580\n3222,7466\n3223,8039\n3227,5714\n3230,8602\n3233,4707\n3237,7296\n3242,6617\n3245,10484\n3246,5881\n3249,7177\n3251,7406\n3252,9961\n3254,9412\n3257,5657\n3259,7335\n3260,6463\n3264,5416\n3267,7259\n3270,8013\n3271,7684\n3272,5841\n3275,7166\n3277,9358\n3278,8866\n3282,4493\n3283,5991\n3288,5280\n3290,9554\n3294,9124\n3298,9527\n3300,9704\n3301,6313\n3304,7409\n3307,9940\n3311,6340\n3316,10291\n3318,7988\n3320,9500\n3324,9422\n3329,6491\n3330,5776\n3332,8306\n3337,9692\n3340,10157\n3344,5494\n3345,7411\n3348,7615\n3349,8896\n3351,6396\n3355,4548\n3359,5783\n3360,4745\n3363,5372\n3367,5413\n3370,10065\n3373,9296\n3374,6279\n3375,8654\n3379,9475\n3384,9273\n3386,5021\n3389,7136\n3390,7721\n3391,7830\n3393,8621\n3394,8544\n3398,8513\n3399,7072\n3400,10388\n3403,8517\n3406,5448\n3411,6538\n3413,8234\n3417,6230\n3420,9564\n3422,4515\n3423,7765\n3427,8116\n3431,7524\n3433,6682\n3438,8073\n3442,10298\n3446,4830\n3447,9319\n3452,9176\n3457,5310\n3461,6927\n3462,4541\n3463,9205\n3466,7980\n3471,5621\n3472,7001\n3474,5526\n3479,6732\n3483,8555\n3486,9932\n3490,8402\n3491,8188\n3493,6333\n3494,8194\n3496,10013\n3501,9414\n3503,9526\n3508,5698\n3510,7190\n3513,5413\n3518,4794\n3520,9949\n3523,6862\n3528,4562\n3533,8460\n3537,4782\n3540,5437\n3545,8348\n3550,9595\n3552,7318\n3553,4944\n3554,5472\n3556,6471\n3560,8116\n3564,10266\n3567,6965\n3572,5637\n3574,8511\n3579,7285\n3583,10400\n3584,7300\n3586,9395\n3591,10136\n3592,9740\n3593,4667\n3596,7070\n3601,7967\n3606,7356\n3607,8882\n3608,10464\n3612,6870\n3615,6067\n3618,8245\n3621,7987\n3626,7584\n3629,8432\n3631,7717\n3633,8536\n3636,7634\n3637,6619\n3638,10003\n3641,7131\n3642,9322\n3645,10369\n3646,9338\n3647,6315\n3652,7162\n3653,7405\n3654,7716\n3657,6680\n3659,7226\n3664,6949\n3665,5574\n3667,10272\n3669,7743\n3673,8770\n3677,5176\n3682,4547\n3685,6187\n3689,10099\n3693,10431\n3698,10313\n3702,10069\n3704,9976\n3706,10388\n3711,6829\n3714,6649\n3715,7500\n3717,6708\n3722,8405\n3725,9477\n3729,8372\n3733,8974\n3738,9863\n3742,10162\n3747,8353\n3750,5939\n3752,8982\n3756,5094\n3761,9144\n3765,7913\n3770,5542\n3771,9141\n3776,9981\n3781,6550\n3784,8652\n3786,8227\n3791,8227\n3796,10176\n3798,6911\n3801,10237\n3806,7023\n3811,9056\n3816,9672\n3817,5388\n3820,7040\n3825,8320\n3827,9950\n3829,7928\n3830,6810\n3834,6060\n3837,8313\n3840,10278\n3845,9908\n3846,4481\n3848,6300\n3851,10201\n3855,5480\n3858,6607\n3862,6899\n3863,6470\n3867,9740\n3871,8913\n3874,5703\n3875,8385\n3880,5470\n3883,9191\n3888,4765\n3893,8901\n3896,9973\n3901,5751\n3905,5035\n3910,7016\n3912,5108\n3915,9541\n3917,5508\n3922,9774\n3925,4935\n3926,9395\n3929,5975\n3933,9229\n3937,6603\n3941,7007\n3946,4440\n3951,8097\n3954,7172\n3958,5265\n3963,8382\n3965,8033\n3967,10408\n3969,7052\n3973,5249\n3976,5674\n3981,6382\n3982,8399\n3986,7585\n3991,6840\n3994,8602\n3995,8039\n3996,6479\n3997,6103\n4001,7826\n4004,6720\n4008,8368\n4011,9538\n4016,5486\n4018,5219\n4022,6752\n4027,6969\n4030,8878\n4033,7432\n4038,6096\n4042,5779\n4044,5599\n4049,7531\n4053,5176\n4055,7267\n4056,9134\n4058,8536\n4061,4833\n4063,4502\n4064,7291\n4067,9075\n4068,8811\n4072,4599\n4075,10035\n4080,8219\n4083,5793\n4085,6406\n4086,10196\n4088,5364\n4089,10268\n4092,4972\n4097,7993\n4100,5814\n4101,8802\n4106,6264\n4110,6327\n4111,6857\n4114,8453\n4119,7651\n4122,9340\n4125,5367\n4130,5543\n4134,5449\n4136,8098\n4138,8736\n4141,8283\n4143,8411\n4148,8118\n4150,8632\n4153,8369\n4156,5994\n4161,5536\n4163,8976\n4168,5019\n4169,4600\n4173,4578\n4178,9815\n4182,9663\n4183,5883\n4184,6289\n4187,8743\n4190,4429\n4192,7557\n4195,8279\n4196,9677\n4199,9888\n4202,6771\n4207,5650\n4212,6101\n4213,9799\n4217,5229\n4220,7845\n4221,9081\n4224,4512\n4229,9824\n4230,9069\n4233,9009\n4234,6706\n4239,5374\n4244,4420\n4245,9306\n4249,8406\n4253,10199\n4256,4666\n4260,8701\n4262,7683\n4266,7241\n4269,7593\n4271,9008\n4276,9319\n4278,6184\n4280,5147\n4283,8593\n4285,10078\n4290,8967\n4291,5576\n4293,8485\n4294,6157\n4297,6176\n4300,10443\n4304,7688\n4306,8932\n4308,6195\n4310,5073\n4313,8876\n4315,10432\n4318,10440\n4322,8610\n4327,9371\n4329,6866\n4331,9791\n4333,8134\n4335,6792\n4338,5740\n4343,6553\n4345,4974\n4349,9806\n4354,7950\n4355,10141\n4356,10371\n4360,6072\n4362,9340\n4366,4482\n4368,7376\n4370,7514\n4371,7644\n4376,4880\n4379,10174\n4383,10436\n4387,5168\n4392,10213\n4396,8283\n4398,7985\n4403,10232\n4405,5559\n4409,6585\n4413,7492\n4417,9145\n4421,10121\n4423,9853\n4425,4910\n4429,9572\n4431,8821\n4435,7198\n4437,7813\n4440,6955\n4441,7539\n4443,6109\n4448,9351\n4453,9672\n4456,7426\n4459,8259\n4463,9168\n4465,8045\n4470,10436\n4475,5430\n4477,4483\n4479,4578\n4484,4377\n4488,7880\n4493,8014\n4498,8151\n4501,8959\n4506,5207\n4508,8626\n4512,6509\n4513,4511\n4517,10243\n4521,4567\n4524,9734\n4527,5945\n4531,7910\n4532,9988\n4537,8880\n4542,6279\n4546,7045\n4548,7779\n4550,4545\n4551,5631\n4552,8550\n4553,4695\n4555,6755\n4557,7197\n4561,8712\n4564,6411\n4565,5211\n4570,5200\n4571,10387\n4572,8718\n4577,6220\n4581,4966\n4583,8214\n4588,5981\n4590,7991\n4594,7312\n4597,5954\n4600,5765\n4602,9739\n4605,5004\n4609,5314\n4610,4462\n4611,9379\n4614,6144\n4616,10342\n4620,8107\n4624,7573\n4626,6883\n4630,6063\n4632,8885\n4634,5967\n4635,8173\n4639,6290\n4640,6126\n4644,5678\n4647,5835\n4652,9694\n4654,7747\n4655,7035\n4658,6841\n4663,9602\n4667,6097\n4670,9762\n4674,4973\n4678,6296\n4679,4603\n4683,10165\n4686,10346\n4690,9068\n4693,10279\n4694,7804\n4699,5539\n4701,6923\n4702,8195\n4705,9483\n4708,7264\n4711,8051\n4714,5341\n4717,5958\n4721,7315\n4725,9808\n4727,5299\n4730,8971\n4731,6578\n4736,6966\n4741,5012\n4742,6199\n4747,5795\n4752,5686\n4753,10249\n4755,7305\n4759,5960\n4762,8946\n4767,5931\n4771,9875\n4772,5836\n4777,9676\n4779,10358\n4780,8394\n4785,9982\n4790,7114\n4791,6042\n4792,5384\n4793,9319\n4795,8558\n4800,6448\n4803,4668\n4806,8136\n4808,5293\n4810,10165\n4815,6485\n4817,7408\n4822,8051\n4825,8808\n4828,6492\n4830,7719\n4835,8768\n4839,6418\n4843,8329\n4844,8733\n4845,7572\n4850,6838\n4855,7167\n4857,9032\n4861,10060\n4865,7233\n4866,5217\n4871,4862\n4875,4497\n4879,7356\n4882,4460\n4884,6376\n4886,4721\n4890,10023\n4893,4855\n4895,7531\n4899,9728\n4903,7856\n4907,9747\n4910,9872\n4915,9208\n4919,7098\n4923,5025\n4924,5503\n4929,4746\n4930,4644\n4935,6186\n4937,5615\n4940,5374\n4942,7597\n4943,10396\n4948,10259\n4953,9604\n4955,6764\n4959,4578\n4962,10253\n4964,7668\n4966,7296\n4971,8210\n4976,9428\n4980,6660\n4984,7192\n4988,7559\n4989,8517\n4991,5843\n4993,5055\n4995,4549\n4998,4450\n4999,5720\n5000,6818\n5002,7309\n5003,10438\n5006,5578\n5011,4967\n5013,7162\n5016,8054\n5021,10094\n5022,7697\n5027,7267\n5029,9730\n5031,7968\n5032,6754\n5033,7509\n5036,7270\n5037,7647\n5040,9526\n5043,8181\n5044,9632\n5048,7554\n5050,4388\n5055,5774\n5057,6842\n5061,5027\n5062,8573\n5064,4886\n5066,4815\n5071,4558\n5073,6908\n5076,6491\n5079,6056\n5081,8834\n5086,5978\n5088,5790\n5092,9496\n5095,5355\n5097,5507\n5099,10068\n5103,9715\n5106,10243\n5110,9759\n5111,5536\n5116,9668\n5120,10148\n5124,4684\n5127,7854\n5129,6078\n5131,10285\n5132,5382\n5133,6976\n5136,6396\n5140,9099\n5143,9516\n5144,5471\n5146,7748\n5148,7972\n5151,8070\n5156,8299\n5161,7077\n5162,9951\n5166,4906\n5171,10436\n5172,4527\n5173,6429\n5178,6014\n5183,7412\n5184,8636\n5189,8206\n5190,8763\n5195,7999\n5199,6854\n5203,6452\n5206,9343\n5210,4594\n5212,6942\n5217,9856\n5221,9710\n5222,5498\n5224,8685\n5228,9817\n5229,10230\n5231,8684\n5236,7156\n5240,9063\n5242,7321\n5243,5336\n5248,7001\n5250,10274\n5253,8697\n5256,10047\n5258,4887\n5261,9349\n5266,6681\n5268,8639\n5270,10478\n5272,9747\n5276,8517\n5279,6091\n5280,5098\n5285,8228\n5290,10459\n5295,9313\n5300,10077\n5301,6018\n5303,8701\n5305,7662\n5306,6628\n5310,7058\n5314,9086\n5319,4577\n5320,5542\n5324,5982\n5329,9801\n5330,10455\n5332,5318\n5336,9607\n5340,8538\n5341,6483\n5343,6861\n5348,4861\n5351,5187\n5355,8613\n5356,8200\n5360,7325\n5363,9470\n5364,8941\n5365,4594\n5370,7583\n5375,6500\n5377,10346\n5380,6586\n5383,5088\n5384,5678\n5386,4809\n5391,7903\n5395,6586\n5396,7090\n5397,4516\n5399,9287\n5402,7100\n5404,9326\n5409,8988\n5413,5201\n5418,7361\n5423,9732\n5426,8470\n5431,10242\n5433,6718\n5435,6073\n5437,7440\n5441,6553\n5446,4703\n5450,7118\n5453,6579\n5455,5835\n5457,5914\n5462,4774\n5463,8457\n5467,7658\n5472,7254\n5474,7020\n5479,6301\n5481,8817\n5485,9139\n5488,6696\n5492,5841\n5496,8049\n5500,6467\n5505,5633\n5509,5811\n5514,7002\n5516,5991\n5521,9617\n5524,8433\n5527,10021\n5529,8978\n5531,8742\n5533,8372\n5536,5388\n5540,9791\n5544,7778\n5546,6974\n5551,7752\n5555,7502\n5556,5790\n5561,10433\n5562,9033\n5566,7074\n5571,8986\n5576,9737\n5577,9181\n5582,8305\n5583,9809\n5586,4723\n5588,8761\n5591,8896\n5592,8949\n5596,6505\n5598,5036\n5603,7393\n5604,5958\n5609,9612\n5611,10337\n5615,8371\n5616,8044\n5619,9997\n5623,5905\n5627,7213\n5629,9047\n5630,9083\n5634,4928\n5635,5175\n5640,9699\n5644,8646\n5648,8045\n5652,8678\n5655,4436\n5659,6209\n5663,9205\n5665,5403\n5669,10449\n5672,4764\n5676,4893\n5681,9350\n5686,10128\n5689,6788\n5690,7976\n5695,7832\n5696,9865\n5699,7529\n5704,8183\n5708,4392\n5713,6463\n5718,7697\n5721,10099\n5726,5794\n5728,9679\n5732,6328\n5734,9442\n5739,8398\n5742,4737\n5747,5613\n5749,10417\n5753,10220\n5754,4543\n5758,8714\n5761,7491\n5766,8422\n5768,7153\n5771,7007\n5773,7433\n5776,9813\n5778,6994\n5779,4561\n5781,4608\n5784,6577\n5788,6150\n5791,6512\n5793,10376\n5798,10323\n5802,8102\n5807,5020\n5810,7587\n5815,10258\n5820,4520\n5821,5337\n5824,8652\n5825,8546\n5827,7327\n5828,10268\n5831,9338\n5835,6413\n5838,8293\n5841,10356\n5844,6527\n5845,5995\n5848,8667\n5850,10026\n5851,6329\n5853,6943\n5857,7624\n5861,4451\n5863,8550\n5864,8299\n5865,7742\n5870,6191\n5872,5277\n5877,4548\n5878,7640\n5879,9784\n5883,10360\n5885,7013\n5886,8620\n5890,9145\n5894,10181\n5896,9324\n5901,4465\n5902,9249\n5905,4734\n5910,5189\n5912,6350\n5917,7765\n5920,10360\n5921,9620\n5926,7513\n5927,7187\n5928,9787\n5931,10362\n5934,7048\n5939,7610\n5943,9162\n5947,6430\n5951,8290\n5953,4775\n5956,6616\n5958,8567\n5959,7818\n5960,8454\n5962,8740\n5964,8506\n5969,7854\n5974,5273\n5977,10440\n5982,7053\n5986,8416\n5990,7082\n5994,5273\n5997,7382\n5999,6778\n6004,7855\n6007,5011\n6009,6516\n6011,8058\n6016,7992\n6018,7718\n6021,10006\n6025,6376\n6028,5941\n6029,8144\n6030,6215\n6035,7722\n6040,9385\n6043,4550\n6048,10080\n6049,8540\n6053,8423\n6054,8288\n6059,9555\n6061,5447\n6064,6024\n6066,10285\n6068,8527\n6070,6480\n6072,8194\n6074,8990\n6075,4977\n6076,8681\n6077,10454\n6079,5340\n6081,7395\n6084,4727\n6088,9630\n6090,4578\n6093,10430\n6094,5046\n6097,9951\n6101,8315\n6105,8561\n6107,8954\n6111,6828\n6113,8818\n6115,5100\n6117,6762\n6119,4752\n6120,7274\n6123,5388\n6125,7041\n6128,4786\n6130,5089\n6133,9197\n6137,5308\n6142,7039\n6145,7406\n6146,6720\n6151,10214\n6155,7012\n6157,9075\n6162,7015\n6166,8326\n6171,8886\n6176,7852\n6179,7227\n6182,7775\n6183,6105\n6185,9844\n6189,8719\n6191,6408\n6192,5209\n6193,5075\n6198,10422\n6202,9642\n6207,5534\n6210,10097\n6214,7112\n6219,8761\n6223,5603\n6224,9365\n6225,7978\n6228,5176\n6232,7256\n6234,7277\n6237,5852\n6238,9983\n6239,10375\n6240,6055\n6245,9564\n6246,5511\n6250,5532\n6254,5802\n6255,7177\n6256,5475\n6257,7024\n6258,5061\n6262,5580\n6267,7332\n6269,7471\n6272,7991\n6273,7994\n6275,8420\n6280,4480\n6281,9203\n6285,6787\n6288,9665\n6289,10302\n6293,5830\n6298,9693\n6303,9405\n6304,9007\n6305,6652\n6306,7398\n6307,9446\n6309,8796\n6311,4660\n6313,5527\n6317,9754\n6322,4702\n6326,10171\n6330,6237\n6331,6431\n6335,8419\n6337,6734\n6339,4739\n6340,8507\n6342,4616\n6345,6056\n6348,5167\n6349,10472\n6351,9885\n6355,9026\n6356,8905\n6357,8163\n6361,4438\n6363,4539\n6368,5234\n6370,9269\n6375,8152\n6379,5257\n6382,9294\n6385,6820\n6387,4682\n6391,6820\n6392,9915\n6397,5351\n6399,4799\n6402,8982\n6403,8403\n6407,8725\n6410,8106\n6412,9578\n6417,10060\n6418,6471\n6423,4834\n6426,10161\n6429,9120\n6433,4607\n6434,8395\n6439,8178\n6440,9576\n6445,9854\n6449,6911\n6453,10170\n6455,8857\n6457,9649\n6461,7780\n6466,10445\n6469,6556\n6470,8714\n6474,7172\n6479,8801\n6484,6840\n6488,4457\n6490,7802\n6494,6026\n6495,5897\n6500,7989\n6501,4637\n6506,9659\n6507,5172\n6511,9144\n6516,7372\n6520,5376\n6522,7848\n6526,9987\n6530,5605\n6535,5050\n6540,8845\n6541,5149\n6542,5467\n6543,5730\n6548,4662\n6550,10072\n6553,6942\n6554,5803\n6556,6902\n6559,4926\n6562,5366\n6565,8683\n6566,4622\n6571,9118\n6572,6542\n6577,6080\n6581,9341\n6585,10116\n6588,8044\n6593,4435\n6595,5177\n6597,10438\n6602,9078\n6607,4516\n6608,10231\n6611,10108\n6613,7523\n6615,6184\n6618,7483\n6620,6870\n6625,9693\n6627,5886\n6628,6098\n6630,9989\n6633,4871\n6634,8898\n6635,8614\n6636,8974\n6639,9272\n6644,9444\n6645,4553\n6647,5311\n6651,10175\n6655,4964\n6659,8630\n6661,9499\n6664,7738\n6665,6407\n6670,9978\n6674,6600\n6676,10089\n6681,6564\n6683,9185\n6686,7777\n6691,6825\n6695,7265\n6696,7449\n6701,6185\n6706,8913\n6711,6574\n6712,5913\n6713,9671\n6717,4525\n6719,8073\n6721,7419\n6722,8796\n6723,7751\n6724,5775\n6726,8904\n6730,9244\n6731,5172\n6735,7856\n6736,5521\n6737,6284\n6742,8499\n6743,6607\n6748,4446\n6749,6006\n6753,7026\n6758,8639\n6762,6728\n6763,9141\n6768,10293\n6770,8127\n6775,4891\n6779,8720\n6783,5143\n6784,9375\n6786,9916\n6790,5975\n6794,10347\n6798,8913\n6800,10274\n6801,6948\n6806,8028\n6809,5887\n6813,5913\n6818,9746\n6819,10474\n6820,4478\n6824,8092\n6827,9179\n6828,4945\n6832,6228\n6833,10293\n6835,5243\n6837,6622\n6842,8394\n6844,6297\n6845,6024\n6850,6535\n6851,5291\n6855,4539\n6860,10279\n6865,5954\n6869,5788\n6872,5749\n6877,7919\n6879,8913\n6880,6956\n6881,8819\n6884,6944\n6889,7178\n6894,8173\n6899,7121\n6903,7024\n6906,8799\n6908,9693\n6909,6948\n6910,9279\n6912,8508\n6914,6165\n6919,10345\n6920,9606\n6922,8982\n6925,7761\n6928,6593\n6933,8361\n6935,9023\n6940,6064\n6944,6951\n6949,6772\n6952,9418\n6955,4928\n6960,7655\n6965,9618\n6967,8700\n6972,8716\n6974,8847\n6975,10414\n6978,5073\n6980,10070\n6985,8731\n6989,6612\n6991,6558\n6992,6997\n6996,7365\n7000,6366\n7004,6392\n7006,5798\n7011,10124\n7015,9240\n7018,5334\n7019,8195\n7021,10480\n7025,9632\n7026,7349\n7027,8429\n7029,4898\n7030,7600\n7031,7351\n7033,5563\n7034,4982\n7037,4923\n7039,5161\n7042,8079\n7045,9474\n7046,5865\n7051,9145\n7054,9271\n7059,5135\n7061,7881\n7062,10307\n7064,9583\n7065,4725\n7068,10483\n7069,9615\n7074,6166\n7076,8616\n7080,6568\n7081,8482\n7082,6867\n7083,8832\n7085,8941\n7090,5750\n7092,4758\n7097,4454\n7099,10022\n7102,6944\n7105,7047\n7108,6767\n7112,4939\n7117,10365\n7118,4547\n7120,10229\n7124,8965\n7129,7471\n7134,9408\n7138,4739\n7142,9541\n7143,10405\n7146,6869\n7150,5979\n7155,7948\n7158,8982\n7159,7981\n7163,7926\n7168,10336\n7169,6371\n7170,7421\n7171,10471\n7176,9418\n7181,9405\n7182,4475\n7185,9311\n7190,7720\n7195,4818\n7197,4820\n7202,8438\n7204,5897\n7206,6233\n7208,4626\n7210,8714\n7211,5485\n7215,7795\n7216,7178\n7221,5586\n7222,8527\n7224,8011\n7225,4913\n7230,9422\n7231,9248\n7234,7298\n7236,7441\n7241,7223\n7243,4769\n7247,8100\n7252,5656\n7255,6399\n7256,6300\n7257,8437\n7259,10299\n7262,7298\n7263,7843\n7267,9369\n7268,5378\n7273,5709\n7278,9816\n7281,10146\n7284,8048\n7287,9488\n7289,10062\n7291,7286\n7293,8572\n7295,7725\n7298,7026\n7299,4411\n7302,9838\n7307,10210\n7309,4483\n7313,9694\n7316,9713\n7318,9515\n7320,5838\n7323,9258\n7325,8200\n7327,7203\n7330,6423\n7332,8624\n7337,7203\n7341,4852\n7345,7111\n7347,6848\n7350,4438\n7355,6581\n7359,4619\n7362,8979\n7363,9114\n7364,8268\n7366,9217\n7370,6831\n7375,8677\n7380,7067\n7382,5086\n7386,8314\n7391,10473\n7395,4483\n7398,10467\n7401,6093\n7403,8539\n7404,9211\n7409,9084\n7414,5419\n7418,9449\n7423,8347\n7425,6136\n7426,5637\n7427,9964\n7429,10484\n7432,7370\n7436,7771\n7440,7462\n7443,8700\n7446,8945\n7450,9845\n7454,9556\n7459,9878\n7464,9397\n7466,9980\n7471,4615\n7475,10447\n7476,8491\n7477,7481\n7482,5939\n7487,10028\n7490,10385\n7493,9873\n7498,9768\n7501,8188\n7502,4383\n7507,7101\n7509,9497\n7511,4520\n7516,4412\n7519,8926\n7522,6616\n7523,6763\n7525,5387\n7530,8008\n7532,9407\n7537,8624\n7539,6341\n7540,6517\n7544,7055\n7545,8562\n7547,6179\n7550,7348\n7553,8548\n7555,9532\n7560,8528\n7561,5350\n7565,6001\n7567,9046\n7570,8042\n7572,8485\n7577,8162\n7582,5820\n7583,7687\n7587,8317\n7588,10390\n7593,8299\n7594,5802\n7598,8112\n7601,8643\n7606,6305\n7610,7466\n7613,7047\n7618,6646\n7622,10348\n7624,6164\n7625,5046\n7627,5675\n7628,8742\n7633,5038\n7638,8869\n7639,7387\n7643,6298\n7646,5364\n7650,4597\n7655,5298\n7660,8599\n7662,9436\n7663,5145\n7667,6664\n7672,8674\n7677,6649\n7679,4845\n7681,8251\n7686,9867\n7691,8642\n7696,10016\n7701,8921\n7703,5770\n7708,6681\n7712,7181\n7714,4834\n7717,8179\n7722,10213\n7725,7480\n7727,10170\n7731,4689\n7735,7507\n7739,5858\n7744,9393\n7747,8334\n7749,5361\n7750,5977\n7754,6392\n7758,5732\n7761,6884\n7762,4633\n7766,8677\n7771,9863\n7774,8089\n7775,9554\n7778,9703\n7780,5879\n7783,4382\n7784,6212\n7787,7352\n7792,5014\n7797,10203\n7801,9529\n7804,8458\n7806,9723\n7807,9957\n7808,7548\n7809,6750\n7813,6647\n7818,9811\n7823,5025\n7827,6118\n7828,9422\n7831,7885\n7832,10206\n7834,6801\n7839,9868\n7841,8769\n7842,7439\n7847,10480\n7850,10176\n7854,9749\n7859,10067\n7862,5878\n7863,5775\n7865,9501\n7866,6923\n7869,4949\n7871,5079\n7875,8670\n7879,4489\n7883,4826\n7884,7427\n7885,8590\n7887,7088\n7891,7626\n7893,6994\n7896,9354\n7899,4591\n7900,5854\n7902,8661\n7904,6257\n7905,8304\n7906,6797\n7911,10475\n7915,4958\n7918,7832\n7920,6819\n7923,8019\n7924,8072\n7926,9503\n7927,8812\n7929,7422\n7933,7321\n7934,5269\n7939,6336\n7942,4825\n7944,8704\n7948,5456\n7949,8561\n7952,9045\n7955,7675\n7960,8426\n7962,7636\n7965,7988\n7969,9747\n7973,9746\n7976,9606\n7979,7836\n7984,5491\n7987,4672\n7992,5345\n7996,5799\n7997,9687\n8000,8772\n8005,5294\n8010,9353\n8013,8814\n8015,5112\n8016,7833\n8020,4539\n8022,7692\n8027,8576\n8032,7164\n8033,9840\n8036,7454\n8038,8940\n8041,6656\n8045,8737\n8048,10254\n8049,8674\n8054,10213\n8059,9516\n8060,4848\n8065,10090\n8067,9584\n8070,5371\n8072,4988\n8074,4862\n8079,10407\n8080,7885\n8082,5006\n8085,4710\n8090,4833\n8091,7920\n8092,8508\n8097,6553\n8102,9676\n8103,8210\n8104,6749\n8108,7192\n8111,5416\n8112,6150\n8116,10058\n8120,5459\n8122,5668\n8125,7006\n8126,8479\n8130,5842\n8135,7496\n8140,6690\n8141,5530\n8142,5015\n8143,7667\n8146,8518\n8147,7320\n8149,8129\n8151,9799\n8154,8884\n8159,9349\n8160,6305\n8162,7599\n8165,7388\n8169,6580\n8170,7424\n8175,7703\n8180,5473\n8184,8246\n8187,6618\n8191,5851\n8196,9619\n8200,9867\n8205,7773\n8209,6365\n8214,7076\n8218,8101\n8221,7284\n8225,9644\n8226,4471\n8229,8690\n8230,4708\n8232,4699\n8234,6095\n8237,4675\n8242,4675\n8244,7842\n8245,6258\n8249,6915\n8254,6821\n8259,6631\n8260,10184\n8263,7339\n8267,5345\n8271,5475\n8275,8814\n8277,6268\n8281,5245\n8283,5420\n8286,4981\n8288,8091\n8290,4576\n8295,9402\n8297,5445\n8299,10052\n8300,5625\n8304,6887\n8309,5508\n8310,5401\n8312,7403\n8313,5341\n8318,6156\n8321,8103\n8323,7018\n8328,5509\n8329,5982\n8333,8897\n8334,9211\n8337,10019\n8341,10069\n8343,8059\n8348,10126\n8352,5784\n8357,8196\n8360,9184\n8361,10403\n8363,6061\n8364,5102\n8368,7896\n8370,10439\n8372,8504\n8373,6358\n8374,10417\n8377,5964\n8380,4551\n8382,8002\n8384,4900\n8387,8481\n8391,6314\n8395,9565\n8396,5707\n8400,6857\n8401,7107\n8402,9829\n8405,5646\n8409,5222\n8410,5554\n8412,9262\n8413,6332\n8415,9398\n8416,9696\n8418,7446\n8423,5915\n8425,6284\n8430,4529\n8431,6224\n8433,8552\n8436,7160\n8441,5898\n8443,5771\n8447,8891\n8451,7151\n8455,8093\n8458,5357\n8462,7464\n8466,6598\n8470,8731\n8473,7009\n8478,9696\n8481,5806\n8484,4781\n8489,10376\n8493,9895\n8497,10070\n8500,7451\n8502,9636\n8507,8702\n8512,5625\n8517,4443\n8522,5560\n8527,6564\n8529,5072\n8530,8041\n8533,8712\n8534,10419\n8537,8148\n8542,7082\n8545,10057\n8550,8472\n8554,6550\n8555,6082\n8556,9397\n8559,5832\n8560,8345\n8565,9287\n8569,8394\n8570,9906\n8573,9783\n8577,9308\n8581,8053\n8584,10217\n8586,4857\n8588,7638\n8589,5439\n8594,7424\n8598,10267\n8602,5649\n8606,5127\n8607,4828\n8608,7115\n8611,5584\n8614,7455\n8619,4999\n8623,7187\n8628,7222\n8631,9587\n8632,5674\n8636,9079\n8638,8260\n8641,9521\n8642,9534\n8643,4652\n8648,9212\n8653,6858\n8656,5048\n8660,4579\n8664,7172\n8668,8630\n8672,6403\n8676,7867\n8679,9951\n8681,10017\n8685,6482\n8687,10058\n8692,8157\n8693,7206\n8698,9863\n8699,6903\n8704,4721\n8705,5970\n8709,10461\n8710,7870\n8711,9864\n8716,9482\n8721,6437\n8726,7492\n8727,8267\n8732,7972\n8733,8509\n8735,9474\n8737,8902\n8740,10231\n8741,8271\n8746,5238\n8747,7851\n8749,9855\n8754,4604\n8756,8067\n8760,4574\n8762,7373\n8766,7620\n8770,7072\n8772,4827\n8777,4537\n8778,4393\n8780,4931\n8783,8393\n8788,7667\n8791,7295\n8792,4735\n8793,6219\n8795,10404\n8796,7733\n8800,4801\n8801,9331\n8802,9529\n8805,6588\n8810,8331\n8815,10442\n8818,6945\n8823,6200\n8824,9452\n8827,8908\n8830,8435\n8835,4489\n8836,5675\n8837,4961\n8840,5821\n8842,9131\n8846,6109\n8849,7203\n8853,8319\n8857,8065\n8860,7342\n8861,9257\n8865,8646\n8869,4767\n8874,4700\n8875,6220\n8878,6490\n8882,5787\n8887,8254\n8889,8148\n8892,6850\n8895,7039\n8898,7753\n8901,6243\n8903,10093\n8908,9920\n8913,8108\n8918,7770\n8922,10362\n8926,7662\n8927,7137\n8931,7635\n8933,5851\n8938,7924\n8941,7928\n8945,9571\n8947,7121\n8949,5579\n8953,6228\n8954,4650\n8955,9941\n8957,9925\n8960,8172\n8965,8114\n8967,5953\n8968,7220\n8971,7480\n8972,10284\n8976,9490\n8977,7771\n8982,5484\n8987,5402\n8992,5273\n8993,6496\n8997,8704\n9002,5089\n9003,8824\n9007,4581\n9008,4641\n9013,9355\n9014,7345\n9018,8369\n9022,7585\n9026,9456\n9031,7040\n9036,6568\n9040,9991\n9045,7033\n9047,8060\n9048,8242\n9050,8564\n9053,7867\n9055,10169\n9058,5046\n9059,5173\n9060,9886\n9062,4979\n9066,4587\n9070,6060\n9072,8464\n9077,5185\n9082,8480\n9083,9672\n9085,7985\n9089,10297\n9092,7553\n9094,5673\n9096,10172\n9097,10153\n9099,9426\n9104,7614\n9107,9078\n9110,8845\n9111,10386\n9115,6131\n9118,8100\n9122,4825\n9123,4722\n9126,9472\n9130,4581\n9134,6545\n9139,5117\n9140,6888\n9145,7180\n9147,5654\n9151,9926\n9155,8914\n9158,5623\n9163,5316\n9167,8993\n9168,10481\n9172,8929\n9175,4475\n9176,7672\n9178,9284\n9181,9354\n9186,10071\n9188,8484\n9191,4752\n9196,7815\n9201,6815\n9203,4508\n9207,10296\n9212,6779\n9216,10108\n9219,6396\n9220,8566\n9224,9841\n9228,4565\n9233,7541\n9236,8964\n9240,8892\n9241,5754\n9245,9684\n9250,7974\n9254,9159\n9257,5263\n9259,4783\n9260,10097\n9263,5176\n9265,6314\n9267,5382\n9271,7737\n9275,9571\n9276,5722\n9281,9737\n9285,5816\n9288,8840\n9290,5667\n9294,7049\n9298,9896\n9303,4994\n9308,4691\n9311,5783\n9313,5050\n9318,7494\n9322,4613\n9324,7842\n9327,5869\n9330,6844\n9335,8435\n9339,7146\n9343,5130\n9347,9433\n9352,7148\n9357,6380\n9359,8270\n9360,9315\n9363,8825\n9365,4599\n9369,6885\n9373,7964\n9378,7607\n9380,7684\n9383,7350\n9386,9599\n9387,6447\n9391,6802\n9394,5231\n9395,8769\n9398,7032\n9402,5775\n9403,6200\n9408,8476\n9413,5697\n9418,6469\n9422,9777\n9423,10437\n9428,10068\n9430,10024\n9432,7184\n9434,10002\n9436,8642\n9440,4481\n9443,8080\n9444,8505\n9449,6103\n9454,7400\n9459,5101\n9464,9628\n9466,5182\n9469,8073\n9472,9448\n9476,6739\n9478,6394\n9483,8610\n9485,8723\n9490,9381\n9491,8427\n9494,7670\n9496,10300\n9500,6901\n9502,8462\n9503,6304\n9508,4616\n9512,5640\n9516,6843\n9517,5711\n9522,6536\n9524,6328\n9526,4995\n9531,5074\n9534,6823\n9539,10062\n9544,9911\n9546,9879\n9550,8826\n9555,10090\n9557,6028\n9560,7552\n9564,9801\n9569,5727\n9573,7243\n9578,7275\n9581,6389\n9582,6958\n9587,5375\n9590,5675\n9591,6398\n9596,6054\n9599,7843\n9603,6985\n9607,7977\n9612,9133\n9614,6374\n9618,7379\n9623,9673\n9628,7784\n9633,4653\n9634,5973\n9639,8661\n9641,8649\n9646,4648\n9648,9144\n9651,9673\n9656,10399\n9657,4870\n9662,5531\n9664,7564\n9665,6317\n9667,6785\n9671,5547\n9673,10428\n9676,9091\n9681,7439\n9686,5816\n9687,6127\n9690,7285\n9693,8441\n9696,10442\n9701,7845\n9703,7114\n9704,5884\n9706,4525\n9707,9435\n9710,8813\n9712,8312\n9717,8972\n9718,10114\n9719,7119\n9720,7097\n9723,4556\n9726,6795\n9728,9650\n9733,7770\n9738,4891\n9743,10386\n9746,8104\n9750,8937\n9755,9963\n9757,5701\n9758,8377\n9761,6698\n9762,7036\n9765,6767\n9769,6068\n9771,9988\n9776,9910\n9779,7305\n9783,9345\n9786,5106\n9789,8232\n9792,10141\n9794,7180\n9795,5333\n9797,5266\n9802,9306\n9805,5840\n9810,7540\n9814,8069\n9818,6457\n9820,4875\n9821,8180\n9822,5464\n9825,5255\n9830,9653\n9832,9607\n9836,4875\n9839,6354\n9841,9983\n9843,4608\n9847,9341\n9851,8217\n9855,9102\n9860,8824\n9865,10425\n9869,6894\n9870,7098\n9873,9288\n9876,8166\n9877,8290\n9880,8730\n9883,7621\n9888,5650\n9889,6856\n9890,4753\n9891,7483\n9896,10318\n9898,7699\n9901,8222\n9903,10286\n9905,9082\n9907,5401\n9911,10437\n9916,4546\n9918,6980\n9921,9817\n9925,7941\n9930,6151\n9931,4515\n9933,8383\n9938,6980\n9939,6604\n9941,9583\n9946,4389\n9947,6286\n9948,6117\n9953,6665\n9957,9001\n9959,6042\n9964,7442\n9969,7576\n9973,10037\n9976,4936\n9978,8151\n9981,5067\n9985,6442\n9989,6757\n9991,8221\n9996,8916\n9998,5054\n10000,6276\n10002,9529\n10005,8481\n10009,7435\n10011,9704\n10015,4378\n10019,7950\n10020,5172\n10025,8486\n10028,9172\n10029,7820\n10033,9740\n10037,7681\n10038,8707\n10042,5250\n10045,8211\n10047,7946\n10049,10308\n10054,5961\n10059,5625\n10060,6666\n10065,5448\n10068,9217\n10071,6948\n10076,5186\n10080,8390\n10083,6812\n10084,8102\n10087,9271\n10091,8094\n10092,5780\n10097,4464\n10098,4846\n10100,5006\n10104,5540\n10105,10146\n10109,8864\n10113,8800\n10117,7377\n10120,7768\n10122,10109\n10125,7060\n10128,9340\n10131,7894\n10132,7783\n10134,9425\n10138,6247\n10143,5236\n10144,9208\n10147,7238\n10149,9891\n10151,7549\n10152,9590\n10154,8227\n10156,5091\n10160,10433\n10163,7353\n10168,6390\n10169,10022\n10170,5958\n10173,7379\n10177,4963\n10179,6124\n10184,10105\n10186,6110\n10190,7661\n10192,5023\n10194,9699\n10196,6960\n10199,9088\n10203,6509\n10206,4861\n10211,9479\n10214,5682\n10219,8039\n10220,8012\n10224,6946\n10225,6213\n10228,5089\n10229,9547\n10233,6450\n10237,7629\n10239,8100\n10242,6301\n10246,9232\n10248,9816\n10253,8345\n10254,7698\n10259,6763\n10264,6750\n10267,7947\n10270,4445\n10271,7710\n10275,8782\n10278,6136\n10283,9628\n10287,4430\n10289,6897\n10293,9944\n10295,4915\n10299,9815\n10301,4741\n10305,9278\n10310,6596\n10311,9717\n10315,4593\n10319,5344\n10321,8432\n10324,7666\n10325,9039\n10329,7709\n10330,5854\n10331,10159\n10334,7873\n10338,4805\n10343,8548\n10346,4956\n10348,5241\n10352,10348\n10355,5020\n10358,8420\n10360,8443\n10362,6238\n10366,10029\n10367,9957\n10370,10026\n10375,6019\n10377,4501\n10381,6461\n10384,5836\n10386,4723\n10388,8538\n10389,9444\n10390,6637\n10393,5077\n10396,7750\n10400,8850\n10402,6953\n10404,10445\n10405,7590\n10408,6501\n10412,8161\n10416,10210\n10418,9884\n10419,5733\n10424,5069\n10429,4432\n10433,5583\n10438,5145\n10442,6531\n10445,6314\n10448,6805\n10453,7775\n10454,5481\n10456,5512\n10457,8889\n10459,9256\n10460,8585\n10462,7584\n10467,4643\n10471,9488\n10476,8491\n10477,8389\n10481,6419\n10482,4869\n10486,9488\n10489,8716\n10494,9523\n10499,9551\n10504,6937\n10505,5009\n10510,9526\n10512,7766\n10514,9769\n10517,5977\n10518,5601\n10519,10197\n10521,7781\n10525,5006\n10528,7445\n10529,7643\n10530,8107\n10533,9153\n10536,7813\n10541,4503\n10546,6374\n10551,5351\n10554,4398\n10555,5484\n10557,4655\n10559,7922\n10564,8131\n10567,6667\n10572,7456\n10573,8034\n10578,6879\n10581,6110\n10582,7162\n10585,4900\n10590,10373\n10591,4516\n10592,10282\n10594,10313\n10599,9909\n10600,8691\n10603,9755\n10608,4546\n10612,5971\n10616,7639\n10617,8613\n10618,9871\n10620,9909\n10623,9605\n10626,6231\n10629,7606\n10631,4404\n10634,4518\n10639,8905\n10642,8102\n10644,4536\n10646,9056\n10650,5576\n10653,7608\n10657,5295\n10660,9351\n10663,6823\n10665,4507\n10667,7010\n10669,8030\n10674,7118\n10677,7230\n10680,7276\n10682,4969\n10685,9827\n10689,6322\n10693,5178\n10698,6183\n10702,8895\n10704,7647\n10707,8009\n10711,7586\n10715,7185\n10718,4708\n10720,8781\n10722,7689\n10727,9304\n10729,6770\n10731,9810\n10732,8345\n10733,7254\n10737,5582\n10739,7535\n10744,8713\n10745,8913\n10750,4821\n10754,5376\n10758,9457\n10761,5054\n10764,8255\n10766,6298\n10767,5249\n10768,7987\n10773,4433\n10775,8177\n10776,9175\n10777,5387\n10779,4452\n10784,8375\n10789,8237\n10791,7045\n10794,6765\n10799,5677\n10802,6199\n10807,6910\n10812,9974\n10817,10456\n10821,5116\n10823,8479\n10826,9870\n10828,8133\n10831,6500\n10833,9371\n10835,9309\n10840,9359\n10843,7624\n10846,5513\n10848,9946\n10851,5017\n10855,5449\n10858,4481\n10862,5013\n10866,4973\n10868,4508\n10872,8658\n10873,5511\n10874,4606\n10878,6904\n10880,6115\n10884,5297\n10887,5944\n10891,7603\n10896,8956\n10897,4650\n10902,5886\n10907,10042\n10911,4898\n10914,7278\n10918,8485\n10922,8673\n10925,9850\n10930,8966\n10932,5194\n10934,5732\n10939,7850\n10942,10322\n10947,4640\n10950,8988\n10951,4647\n10955,6377\n10959,4896\n10963,5028\n10965,4377\n10970,7291\n10974,5007\n10976,6178\n10978,10056\n10981,7457\n10984,9805\n10988,9596\n10991,4784\n10994,7933\n10998,8101\n11001,4669\n11005,9356\n11006,5708\n11008,4382\n11012,7643\n11013,4384\n11017,5500\n11021,6990\n11022,10438\n11023,6267\n11028,5065\n11033,9648\n11038,8258\n11042,8752\n11044,7012\n11046,8948\n11051,9871\n11056,6572\n11060,5067\n11064,6652\n11065,4869\n11070,5608\n11073,6243\n11077,5374\n11078,7933\n11082,9493\n11086,8054\n11090,9134\n11091,5725\n11096,9315\n11097,6520\n11098,9559\n11099,9285\n11100,5528\n11101,4939\n11106,8895\n11107,9299\n11110,9177\n11115,6082\n11116,4934\n11117,8491\n11122,9878\n11123,7035\n11127,9012\n11130,8547\n11134,4566\n11135,7727\n11138,5487\n11139,7859\n11142,4671\n11143,9791\n11145,8817\n11148,6745\n11150,7323\n11155,7240\n11160,8270\n11165,8377\n11170,9951\n11173,9940\n11174,10118\n11179,9143\n11180,7669\n11182,10259\n11183,7147\n11188,9279\n11190,4551\n11194,5689\n11198,9140\n11200,4462\n11204,8414\n11209,5457\n11212,6310\n11216,7876\n11221,4418\n11223,6988\n11226,9802\n11231,5723\n11236,9983\n11238,8990\n11242,9778\n11243,7994\n11245,5860\n11249,8038\n11253,4922\n11258,9726\n11260,5579\n11261,8013\n11263,6753\n11267,8853\n11270,6207\n11273,6892\n11277,8274\n11280,6493\n11281,8183\n11284,5702\n11288,4660\n11290,8540\n11294,7743\n11296,7206\n11298,7731\n11302,9566\n11303,8313\n11305,9298\n11306,9854\n11308,6237\n11313,7251\n11316,10148\n11320,7843\n11322,9051\n11327,9129\n11331,8769\n11333,9502\n11335,6325\n11337,5788\n11338,9564\n11340,5464\n11345,7684\n11348,10265\n11350,5964\n11353,4674\n11358,9495\n11359,10291\n11361,8388\n11365,4538\n11367,5655\n11369,5728\n11374,9182\n11378,10130\n11379,6623\n11380,7503\n11382,9908\n11383,9710\n11384,8039\n11385,9292\n11387,9555\n11391,7416\n11392,5565\n11393,5573\n11396,6579\n11401,6633\n11405,7061\n11410,9685\n11413,4881\n11418,5678\n11421,10028\n11426,6204\n11427,8276\n11430,9702\n11434,5923\n11435,7477\n11440,7416\n11442,7746\n11447,10218\n11450,4712\n11455,9382\n11458,10127\n11459,4435\n11463,8612\n11468,8729\n11469,9830\n11473,5908\n11477,6554\n11481,7732\n11483,10002\n11485,9631\n11486,7213\n11489,5053\n11491,7112\n11494,8163\n11498,8375\n11502,6667\n11505,4696\n11508,8351\n11509,5139\n11511,8136\n11513,8225\n11515,4926\n11520,9287\n11525,6586\n11530,5859\n11532,7545\n11535,8997\n11540,9930\n11545,9383\n11548,9971\n11551,7141\n11555,8824\n11557,10154\n11560,5239\n11561,4880\n11564,10257\n11567,9949\n11568,6394\n11573,9262\n11576,9421\n11577,8874\n11582,8594\n11587,8729\n11591,8702\n11596,6765\n11598,4484\n11599,5813\n11600,9181\n11603,9296\n11605,10372\n11606,5941\n11608,7648\n11612,7622\n11616,9963\n11621,10033\n11624,6146\n11625,5816\n11629,9579\n11632,7435\n11636,5341\n11638,10182\n11642,8865\n11647,10131\n11652,4708\n11656,5361\n11659,9254\n11663,9105\n11665,4777\n11667,4788\n11671,8463\n11675,7979\n11676,4659\n11679,10435\n11680,8192\n11684,7424\n11687,5867\n11688,9735\n11691,7155\n11696,5985\n11699,9996\n11702,10026\n11704,5096\n11707,8298\n11712,7001\n11714,9190\n11719,6375\n11721,5462\n11724,8459\n11726,5399\n11728,4989\n11730,5534\n11732,9015\n11736,8617\n11738,5133\n11742,8285\n11746,9489\n11748,8864\n11752,6360\n11755,9399\n11757,8335\n11759,4665\n11761,10288\n11766,7225\n11769,4541\n11772,6509\n11773,9415\n11774,7226\n11775,4675\n11777,8491\n11780,4782\n11784,10415\n11788,9321\n11790,4917\n11792,4444\n11797,8345\n11801,6203\n11805,7041\n11806,5867\n11809,4468\n11813,6754\n11817,5796\n11822,10237\n11826,7450\n11831,9675\n11836,5174\n11837,9800\n11842,4978\n11846,6450\n11849,6053\n11852,4588\n11857,9042\n11858,6742\n11862,8434\n11864,7868\n11866,7028\n11869,6845\n11871,8972\n11875,5063\n11879,10184\n11884,4692\n11887,7521\n11892,7150\n11897,5879\n11900,4882\n11904,7016\n11905,5061\n11910,9763\n11912,9725\n11915,7796\n11916,6115\n11921,8468\n11923,5935\n11926,5457\n11930,4506\n11932,5533\n11934,9722\n11935,5797\n11937,9573\n11939,8237\n11943,5219\n11946,9085\n11951,5410\n11952,10420\n11956,5301\n11961,8195\n11966,7702\n11969,7748\n11970,7154\n11974,5337\n11975,6125\n11980,6096\n11985,4863\n11990,4571\n11991,9638\n11992,8333\n11995,7345\n11996,9311\n12000,7950\n12002,6753\n12005,9641\n12008,9570\n12010,6147\n12015,10005\n12019,8064\n12021,9224\n12024,9047\n12027,9385\n12028,8357\n12030,5165\n12034,9307\n12038,7220\n12043,7791\n12045,4805\n12050,5383\n12054,4417\n12055,4430\n12059,5075\n12062,8836\n12063,6069\n12064,10185\n12069,6528\n12070,5081\n12073,5877\n12078,4546\n12079,6946\n12081,8917\n12082,4911\n12085,6668\n12086,6585\n12087,6582\n12089,7805\n12092,7776\n12096,5990\n12099,4412\n12101,6576\n12103,6589\n12107,5430\n12112,8096\n12116,7967\n12118,4510\n12119,8960\n12123,10143\n12124,4492\n12126,9175\n12131,9158\n12132,5450\n12134,6040\n12135,9351\n12140,8054\n12144,7578\n12146,10465\n12147,9269\n12150,5459\n12151,6099\n12156,10126\n12160,6096\n12163,9066\n12165,5946\n12167,10432\n12172,5237\n12176,8495\n12178,5919\n12181,5038\n12185,6513\n12190,7312\n12194,6654\n12198,9653\n12201,8155\n12203,7104\n12205,5339\n12210,6429\n12215,6655\n12216,4667\n12220,5259\n12221,8492\n12223,9204\n12227,7935\n12230,6392\n12233,4807\n12238,8247\n12239,6353\n12243,8790\n12248,7002\n12251,6099\n12256,6657\n12259,7848\n12263,8212\n12266,10199\n12267,7640\n12270,8806\n12274,10196\n12278,5502\n12283,8506\n12286,9501\n12290,6244\n12293,7050\n12296,7986\n12297,9703\n12298,4847\n12303,10309\n12304,4452\n12308,6389\n12312,10362\n12313,6646\n12317,8037\n12322,4457\n12326,9156\n12329,9604\n12332,7880\n12336,9903\n12337,9875\n12342,9812\n12345,5009\n12350,7951\n12354,9754\n12355,8878\n12357,6787\n12361,8938\n12365,6876\n12370,8470\n12374,7636\n12375,5045\n12379,7567\n12380,10158\n12384,9149\n12386,4482\n12390,9645\n12395,7137\n12400,6220\n12404,6891\n12405,9706\n12409,4979\n12412,5238\n12415,8525\n12416,5499\n12420,10215\n12421,7440\n12424,7373\n12427,10017\n12428,9205\n12433,8373\n12436,4433\n12438,5173\n12439,9740\n12443,5381\n12445,6918\n12449,8653\n12453,9120\n12456,7731\n12458,10293\n12459,5320\n12462,8971\n12464,9310\n12469,6295\n12470,8951\n12471,5310\n12475,8949\n12477,10455\n12478,9105\n12483,6046\n12484,6342\n12489,9860\n12492,9932\n12496,5825\n12501,4384\n12503,9235\n12504,9169\n12509,7132\n12514,9919\n12517,8515\n12522,9188\n12527,8766\n12529,6447\n12532,7988\n12533,10316\n12538,8078\n12542,9771\n12547,5051\n12552,9141\n12554,6149\n12557,6951\n12559,4775\n12561,8255\n12565,9273\n12570,5519\n12575,9493\n12578,9449\n12580,4974\n12584,9735\n12589,9039\n12593,6371\n12594,10263\n12596,8616\n12600,6788\n12603,9517\n12604,5966\n12605,5381\n12609,4977\n12611,5156\n12612,5253\n12617,5210\n12619,8335\n12623,7112\n12628,10260\n12631,9899\n12636,8978\n12638,6703\n12639,4586\n12644,5047\n12645,5020\n12650,4450\n12653,9715\n12658,6984\n12663,9976\n12667,8064\n12670,6830\n12671,9143\n12676,9901\n12681,8872\n12684,5277\n12688,7085\n12693,7732\n12698,8361\n12702,5649\n12705,7583\n12709,9169\n12710,9702\n12712,8936\n12717,7221\n12721,9939\n12726,9154\n12730,4961\n12733,9682\n12736,5211\n12737,7478\n12738,9568\n12740,10324\n12743,6930\n12745,9481\n12746,7449\n12750,5494\n12755,6346\n12756,5709\n12759,9356\n12762,9632\n12766,6388\n12771,5746\n12776,7141\n12777,6345\n12778,8071\n12783,8009\n12785,7568\n12788,9333\n12789,5117\n12792,7993\n12796,5045\n12798,6427\n12800,8175\n12803,8613\n12805,8605\n12810,5156\n12813,9378\n12814,5770\n12815,8280\n12818,6967\n12823,4680\n12824,7538\n12828,6338\n12833,4754\n12836,9226\n12838,6590\n12839,4476\n12840,10040\n12844,9522\n12849,5840\n12852,8318\n12854,7248\n12855,6254\n12860,10468\n12861,8525\n12866,5232\n12867,8063\n12869,6419\n12874,8820\n12878,10442\n12882,5863\n12885,5700\n12888,5755\n12890,7109\n12893,7976\n12895,7829\n12900,7105\n12904,5792\n12906,7652\n12909,7318\n12913,10208\n12917,6782\n12918,6367\n12920,5360\n12921,6476\n12924,5757\n12926,5917\n12928,10107\n12929,7067\n12934,9366\n12935,8989\n12937,7429\n12940,10472\n12942,8622\n12944,6016\n12948,5181\n12949,5203\n12951,6178\n12954,8720\n12959,8615\n12964,5001\n12966,4731\n12970,6275\n12972,4574\n12975,10357\n12979,7776\n12983,8804\n12985,6834\n12986,7217\n12989,8615\n12990,9407\n12992,8066\n12995,7249\n12999,6627\n13004,8074\n13008,6256\n13011,8381\n13013,9278\n13017,6716\n13022,9617\n13026,10289\n13029,7393\n13032,6455\n13036,7637\n13041,9703\n13042,5528\n13047,7386\n13050,9064\n13053,6884\n13058,8908\n13060,6489\n13062,7464\n13067,10204\n13068,9055\n13072,6381\n13076,9548\n13079,8714\n13081,8529\n13085,4917\n13089,9686\n13093,7017\n13097,6492\n13100,8664\n13105,9221\n13110,7080\n13115,9977\n13119,8918\n13121,5938\n13125,6604\n13126,10098\n13131,10306\n13133,7234\n13135,10398\n13136,10191\n13138,9458\n13142,8659\n13144,4596\n13147,10275\n13150,5488\n13154,8773\n13156,9663\n13159,9737\n13160,8850\n13164,7322\n13169,7772\n13170,9770\n13175,9939\n13179,10308\n13182,6281\n13187,9633\n13190,5491\n13194,10255\n13198,9906\n13201,6556\n13202,7403\n13205,4974\n13206,9601\n13210,5692\n13214,9092\n13216,8026\n13221,4901\n13224,5633\n13227,5232\n13229,8617\n13234,6894\n13239,9250\n13242,8970\n13246,7636\n13251,8406\n13254,5819\n13259,8278\n13261,5698\n13262,8241\n13267,7787\n13272,8086\n13277,6361\n13282,6434\n13285,6910\n13289,4716\n13292,5638\n13295,10337\n13298,7835\n13303,9838\n13308,9935\n13313,5898\n13315,5869\n13318,6518\n13320,4815\n13323,10284\n13328,8813\n13329,9921\n13332,9677\n13335,9270\n13339,4964\n13340,4392\n13344,8445\n13349,10306\n13350,6685\n13351,9288\n13355,5205\n13357,9946\n13362,7335\n13364,9501\n13367,7914\n13372,5905\n13377,7621\n13382,5815\n13384,8132\n13386,9737\n13387,7361\n13389,8828\n13392,8119\n13397,9707\n13402,5943\n13406,10313\n13408,7340\n13412,8381\n13414,8762\n13419,9632\n13421,10415\n13425,6970\n13428,6853\n13430,7245\n13432,5439\n13437,4898\n13440,7910\n13442,6096\n13447,8024\n13451,7514\n13452,9845\n13453,6370\n13457,8021\n13461,10306\n13465,4570\n13468,8563\n13469,5819\n13471,8447\n13475,10207\n13480,7905\n13481,8679\n13485,7805\n13488,10070\n13493,8626\n13497,9334\n13498,6275\n13500,7069\n13501,10107\n13506,5583\n13507,8254\n13511,6974\n13514,6381\n13518,8193\n13522,4518\n13523,5663\n13527,5455\n13528,8276\n13531,6516\n13536,7625\n13539,10487\n13543,6625\n13545,9099\n13548,8777\n13552,8779\n13553,5888\n13554,9538\n13559,7574\n13563,8674\n13566,5202\n13570,8191\n13574,9499\n13575,4769\n13577,8503\n13581,4958\n13585,6552\n13589,5251\n13590,9503\n13591,6994\n13595,10452\n13600,7154\n13602,5278\n13603,5238\n13605,4789\n13610,6810\n13614,6917\n13619,5508\n13622,4523\n13625,7371\n13630,6991\n13634,6765\n13635,4986\n13637,6945\n13639,9632\n13641,8788\n13642,7129\n13647,4589\n13650,6082\n13652,5721\n13656,8381\n13661,4901\n13665,6607\n13667,9204\n13672,6667\n13673,5166\n13674,5011\n13679,5007\n13683,6992\n13685,4558\n13686,6873\n13691,8188\n13696,4847\n13699,8717\n13702,7726\n13706,8507\n13709,8007\n13713,9730\n13714,7790\n13716,5489\n13718,7981\n13721,4382\n13722,7192\n13726,8800\n13728,7659\n13730,7738\n13735,9820\n13737,6349\n13740,10279\n13745,8272\n13749,6751\n13752,7390\n13753,9801\n13758,5207\n13759,8515\n13761,6556\n13764,5512\n13768,9101\n13769,4871\n13770,5858\n13774,9599\n13777,10292\n13781,4798\n13783,10340\n13786,4520\n13788,8919\n13790,7317\n13793,5070\n13798,6081\n13802,7881\n13807,5055\n13808,6754\n13809,6760\n13814,4440\n13819,7683\n13822,8642\n13823,4647\n13828,8793\n13833,5042\n13838,4730\n13843,9305\n13847,5534\n13851,7612\n13855,6073\n13856,9811\n13857,8859\n13862,10292\n13863,7147\n13865,7728\n13868,9338\n13873,7425\n13875,5516\n13877,9296\n13881,7315\n13884,7632\n13887,6252\n13888,9768\n13893,10416\n13895,8348\n13897,10137\n13902,8736\n13907,6851\n13908,8832\n13913,10250\n13918,7832\n13921,9090\n13925,6048\n13926,8152\n13930,8333\n13935,7331\n13940,7611\n13942,5584\n13946,10439\n13949,4477\n13952,8748\n13957,5969\n13959,7679\n13961,9286\n13963,5411\n13968,5884\n13971,4655\n13972,9845\n13976,7034\n13981,10136\n13986,10335\n13988,6893\n13992,5559\n13995,9581\n14000,8658\n14005,9538\n14010,9630\n14013,9545\n14018,7846\n14020,7100\n14023,5218\n14026,6044\n14031,5090\n14035,5392\n14040,6130\n14043,8069\n14045,10011\n14049,7172\n14051,4612\n14056,7832\n14060,5542\n14065,7450\n14067,6465\n14071,7073\n14075,7057\n14079,8519\n14083,9657\n14085,6966\n14087,7625\n14091,8717\n14093,6789\n14094,5500\n14098,6735\n14099,9207\n14102,8945\n14105,8662\n14106,8439\n14110,9738\n14115,7331\n14116,4749\n14118,6634\n14122,8409\n14127,9844\n14128,6518\n14133,5469\n14138,9301\n14141,6451\n14145,4891\n14146,5921\n14148,7588\n14149,9784\n14152,8675\n14155,8181\n14157,5773\n14162,7330\n14165,4529\n14166,9137\n14168,5876\n14169,9943\n14172,6995\n14173,8069\n14175,7143\n14179,8200\n14181,9711\n14186,9102\n14188,7956\n14192,7506\n14196,5268\n14197,7407\n14202,10341\n14205,4453\n14206,7065\n14208,6305\n14211,7335\n14214,4702\n14217,8032\n14220,7369\n14221,6245\n14225,8151\n14229,8993\n14230,7641\n14233,7834\n14236,6069\n14239,7497\n14241,8216\n14242,4886\n14247,5268\n14251,7471\n14253,9817\n14258,6215\n14262,5091\n14265,7897\n14268,6331\n14269,6614\n14271,8946\n14274,9011\n14276,6543\n14280,5993\n14283,6279\n14286,8049\n14288,9996\n14290,6182\n14294,7217\n14296,6658\n14298,7795\n14300,5108\n14302,8343\n14306,9916\n14310,8322\n14314,4576\n14317,10236\n14318,7829\n14323,5938\n14324,8889\n14328,7338\n14333,5461\n14337,9335\n14339,6620\n14341,5181\n14346,10159\n14348,8810\n14352,7704\n14355,4510\n14360,9491\n14363,4593\n14368,10489\n14372,8225\n14376,7184\n14380,8443\n14381,8597\n14382,9099\n14387,4749\n14392,5688\n14394,8802\n14395,6532\n14397,6014\n14398,6688\n14399,7059\n14404,8863\n14407,9643\n14408,5922\n14410,8256\n14415,5624\n14418,5648\n14419,5051\n14420,8916\n14424,5547\n14428,6038\n14433,9706\n14438,10082\n14442,6203\n14447,8192\n14450,7444\n14455,9994\n14456,8078\n14460,7250\n14464,4695\n14467,6083\n14468,5721\n14472,8236\n14476,4551\n14478,5294\n14482,7405\n14486,6539\n14487,9933\n14488,8207\n14490,4395\n14494,7720\n14495,5925\n14498,8541\n14501,6437\n14506,9043\n14508,6797\n14513,6524\n14517,10110\n14519,5486\n14521,6141\n14524,7077\n14529,6648\n14534,8244\n14536,4633\n14540,5303\n14543,10452\n14547,9871\n14551,8668\n14553,10026\n14558,10484\n14563,8690\n14568,6443\n14573,4397\n14576,5582\n14577,7336\n14582,4524\n14583,10007\n14585,5397\n14588,8956\n14591,9004\n14593,8547\n14596,10449\n14600,10408\n14601,6027\n14602,9501\n14604,9377\n14609,5392\n14613,8044\n14616,4733\n14621,4753\n14626,7680\n14631,5039\n14632,9501\n14635,9645\n14636,7839\n14637,5340\n14638,6332\n14642,4567\n14647,9495\n14652,9994\n14657,6438\n14660,5125\n14661,9095\n14662,8101\n14665,9364\n14668,8960\n14670,7531\n14672,4741\n14677,8091\n14680,10436\n14685,4635\n14687,8595\n14692,6737\n14697,5582\n14702,9967\n14706,4597\n14708,5367\n14711,6923\n14712,7294\n14716,5138\n14720,7511\n14725,7424\n14730,9539\n14734,8623\n14737,8222\n14739,9794\n14741,10014\n14746,8757\n14747,4988\n14749,10297\n14754,5730\n14759,10181\n14761,6789\n14762,6386\n14767,6488\n14769,5582\n14774,6966\n14778,5532\n14780,9556\n14781,9452\n14785,8010\n14788,5979\n14791,6211\n14796,4971\n14798,5300\n14799,7260\n14802,10315\n14806,4818\n14808,6480\n14811,6390\n14813,4991\n14816,5709\n14819,6937\n14823,7365\n14828,4906\n14829,9793\n14830,5176\n14831,7413\n14835,6441\n14839,4446\n14844,5939\n14846,10161\n14850,7324\n14851,7755\n14854,7116\n14856,5194\n14861,8688\n14862,9643\n14866,5151\n14869,4497\n14871,4380\n14873,5774\n14877,7948\n14882,8239\n14887,9171\n14891,8871\n14896,9091\n14897,6841\n14901,9910\n14903,5712\n14906,9842\n14909,4496\n14912,7719\n14915,6608\n14920,7365\n14922,9198\n14923,9777\n14926,8462\n14930,5746\n14933,5612\n14938,10167\n14942,7655\n14947,8486\n14949,6290\n14951,6642\n14953,7182\n14955,8997\n14959,6027\n14963,8636\n14967,6824\n14970,9087\n14973,5236\n14975,6958\n14980,6859\n14982,9076\n14984,10022\n14989,9223\n14993,8976\n14994,10083\n14998,6094\n15001,4485\n15003,7824\n15008,6525\n15010,6699\n15012,9208\n15016,8732\n15017,4788\n15018,9640\n15022,9591\n15026,7245\n15030,7545\n15032,6638\n15036,8713\n15039,8210\n15044,7235\n15048,7321\n15052,5923\n15056,9093\n15059,7901\n15064,9395\n15065,10248\n15070,5202\n15072,7667\n15076,5238\n15079,9850\n15084,9831\n15086,8211\n15087,10203\n15091,9924\n15093,7377\n15098,5493\n15102,9228\n15106,9697\n15107,6946\n15109,9467\n15113,8378\n15116,9318\n15119,10203\n15120,8687\n15122,10092\n15125,7463\n15128,4759\n15130,6983\n15134,5804\n15135,8938\n15136,7869\n15137,10265\n15142,4946\n15146,8770\n15149,9140\n15152,6336\n15155,8096\n15160,9498\n15164,8453\n15165,4651\n15166,9012\n15170,7775\n15172,5033\n15175,6350\n15178,7455\n15179,7651\n15182,5680\n15185,7865\n15190,4552\n15191,5729\n15193,10478\n15196,9775\n15197,9605\n15199,6798\n15201,7469\n15206,7399\n15211,5876\n15215,7330\n15220,6080\n15224,10152\n15228,8191\n15229,8259\n15234,8975\n15237,4929\n15240,10137\n15243,6171\n15245,5734\n15250,5885\n15251,9320\n15254,10360\n15257,8757\n15259,7183\n15262,7899\n15264,5345\n15268,10090\n15270,5230\n15274,6264\n15275,9398\n15276,7083\n15279,8208\n15281,6488\n15284,7221\n15287,6691\n15291,5503\n15296,6418\n15299,5367\n15300,4574\n15302,5406\n15307,8783\n15312,5485\n15315,9601\n15320,4853\n15324,6665\n15325,4830\n15328,4717\n15331,7769\n15334,10251\n15335,8871\n15340,4939\n15343,5009\n15347,10129\n15349,6862\n15351,7125\n15356,6933\n15358,10341\n15360,5481\n15362,7258\n15366,9391\n15368,6716\n15371,5540\n15376,6938\n15379,7698\n15384,9326\n15386,5441\n15389,8249\n15390,7692\n15394,4959\n15395,6025\n15396,10429\n15399,8164\n15400,5249\n15403,6140\n15406,7430\n15411,6985\n15414,7550\n15417,8687\n15422,10358\n15424,5047\n15428,4569\n15429,7602\n15434,7173\n15437,5781\n15438,6256\n15443,9254\n15444,7067\n15449,5572\n15452,8578\n15457,5658\n15462,9458\n15467,9404\n15471,9560\n15476,8469\n15479,8687\n15484,9023\n15485,4769\n15486,9987\n15489,9830\n15492,7081\n15493,4446\n15494,5970\n15495,4910\n15497,9114\n15502,7634\n15505,5011\n15506,8273\n15508,10137\n15509,7899\n15510,8270\n15513,7337\n15515,4892\n15519,6997\n15520,4456\n15521,4702\n15524,6492\n15528,7585\n15532,7279\n15535,5675\n15538,10178\n15539,7680\n15542,8915\n15546,8606\n15547,5540\n15548,6045\n15553,4979\n15555,10247\n15557,10074\n15558,4496\n15560,8836\n15564,5252\n15567,6328\n15569,5077\n15571,8347\n15574,9823\n15575,5457\n15576,6275\n15579,8990\n15584,8602\n15587,7020\n15589,7650\n15590,8934\n15594,7655\n15598,9536\n15601,7014\n15605,5862\n15607,9756\n15610,7063\n15612,8028\n15617,10277\n15621,7102\n15625,8689\n15626,4854\n15631,6849\n15636,9080\n15640,9384\n15645,4605\n15649,5168\n15653,9076\n15658,10487\n15660,9701\n15664,8014\n15669,4683\n15671,5274\n15676,7757\n15680,8500\n15682,5450\n15684,7255\n15688,5045\n15691,4550\n15693,7841\n15698,5489\n15699,4416\n15701,5205\n15702,7164\n15706,8306\n15711,7207\n15713,7891\n15714,5251\n15716,8930\n15719,8553\n15720,6171\n15722,9748\n15727,4823\n15728,5580\n15732,8089\n15734,6867\n15738,8339\n15739,6222\n15743,4719\n15748,10031\n15753,9231\n15757,9910\n15759,5806\n15763,4518\n15765,6284\n15769,7699\n15774,4697\n15775,9820\n15776,8273\n15780,7287\n15784,6747\n15789,7539\n15790,7547\n15795,4946\n15798,4396\n15801,5515\n15805,9896\n15806,7144\n15809,5495\n15811,4547\n15816,8798\n15818,8202\n15820,10226\n15821,5596\n15823,6469\n15826,5199\n15829,4871\n15834,9502\n15839,10474\n15844,4913\n15847,4998\n15851,4708\n15852,5148\n15857,8245\n15859,6484\n15860,6433\n15865,6384\n15867,8460\n15868,9792\n15870,9410\n15873,6558\n15877,8486\n15882,5170\n15885,7358\n15890,6934\n15892,8686\n15895,7773\n15898,9685\n15900,4858\n15904,9688\n15905,4411\n15907,9295\n15909,6894\n15910,4855\n15913,7088\n15917,6112\n15920,8195\n15921,7554\n15924,10399\n15926,7265\n15930,9218\n15933,10458\n15936,5718\n15939,10487\n15940,5650\n15945,5549\n15947,8426\n15950,10349\n15954,4401\n15959,8887\n15962,10112\n15965,8347\n15969,8476\n15970,9292\n15972,5812\n15974,9610\n15977,7742\n15978,4782\n15981,6146\n15982,8899\n15987,8210\n15990,9894\n15995,4516\n15998,8401\n16002,9047\n16006,8356\n16011,7319\n16012,6107\n16017,5296\n16022,4994\n16027,9796\n16032,5518\n16037,8892\n16038,8372\n16039,5692\n16040,8177\n16045,8621\n16048,8815\n16050,10376\n16053,5014\n16055,10066\n16059,10457\n16060,6238\n16065,8369\n16066,7361\n16070,6390\n16073,8667\n16076,4681\n16079,5058\n16084,8963\n16088,9869\n16089,8911\n16093,6932\n16098,7280\n16102,9218\n16104,6558\n16108,6252\n16110,6578\n16112,5826\n16117,5735\n16120,4547\n16121,10431\n16125,10095\n16130,6525\n16135,6860\n16138,7890\n16142,7753\n16145,6205\n16147,8930\n16152,6501\n16154,8545\n16155,7478\n16156,4555\n16159,8384\n16160,7896\n16161,6268\n16162,10104\n16165,6967\n16169,9776\n16173,9648\n16178,9703\n16181,8641\n16185,10349\n16190,8069\n16191,9362\n16196,7869\n16199,9500\n16203,4386\n16208,5161\n16209,8599\n16211,4790\n16215,9786\n16220,5757\n16222,8625\n16227,4612\n16231,5859\n16232,4619\n16236,8578\n16237,6019\n16242,8942\n16246,9112\n16248,9034\n16252,7273\n16257,5805\n16262,4864\n16263,9070\n16268,5427\n16270,7659\n16271,5845\n16276,7247\n16279,7435\n16280,6570\n16285,10061\n16286,7465\n16291,7423\n16292,6238\n16297,9962\n16298,9372\n16300,7509\n16304,4576\n16308,4443\n16310,8857\n16314,5958\n16315,7293\n16320,6355\n16323,6996\n16327,6427\n16329,9543\n16331,8145\n16335,6308\n16340,5915\n16341,10122\n16342,5720\n16345,9638\n16349,5139\n16351,8299\n16355,7529\n16359,4427\n16360,9241\n16362,6377\n16363,6127\n16365,9396\n16370,7934\n16375,4680\n16379,8608\n16380,8408\n16383,5311\n16384,7393\n16386,5471\n16389,9263\n16393,8981\n16398,5632\n16399,6526\n16401,5072\n16405,10446\n16406,10091\n16410,8739\n16414,8868\n16417,9113\n16419,5275\n16422,8505\n16424,9861\n16425,6273\n16427,6652\n16432,4921\n16433,8287\n16435,9285\n16438,4883\n16443,6822\n16448,5477\n16449,4586\n16452,7467\n16455,8278\n16460,7751\n16465,5721\n16466,10328\n16469,5321\n16470,6032\n16471,6028\n16474,9567\n16479,7619\n16484,6172\n16485,6296\n16489,4390\n16492,7668\n16496,7938\n16498,5766\n16502,9589\n16505,5903\n16508,5543\n16510,6909\n16514,6261\n16516,10147\n16517,7992\n16522,5676\n16526,10467\n16529,8435\n16534,9876\n16537,9017\n16539,8726\n16544,9779\n16546,6023\n16551,4532\n16553,7616\n16557,6823\n16561,6803\n16565,5700\n16568,5718\n16570,6078\n16575,8447\n16577,9961\n16580,4380\n16584,8784\n16588,9231\n16593,5833\n16596,4913\n16601,9411\n16605,7511\n16610,9997\n16613,7276\n16616,7539\n16618,6950\n16622,6027\n16626,9854\n16629,6691\n16633,4879\n16635,8060\n16636,9837\n16637,7513\n16639,10032\n16642,6210\n16644,9431\n16645,8309\n16650,10093\n16651,9110\n16652,7832\n16655,10435\n16659,4963\n16661,9754\n16663,7443\n16666,9508\n16670,8096\n16674,7459\n16679,7499\n16683,7602\n16686,6933\n16687,8512\n16689,5842\n16694,9243\n16697,7439\n16698,9387\n16703,6888\n16706,10147\n16707,5852\n16709,4695\n16711,4517\n16714,8612\n16717,7159\n16718,5710\n16719,5528\n16723,5582\n16725,5686\n16729,7209\n16734,5637\n16737,5176\n16741,6648\n16746,8121\n16748,5429\n16749,6519\n16754,6743\n16758,4656\n16760,6076\n16765,8388\n16768,4455\n16773,6081\n16778,5684\n16779,10025\n16780,7040\n16783,7867\n16787,9595\n16792,10080\n16794,6705\n16797,6264\n16801,7381\n16803,9198\n16805,8576\n16806,7594\n16809,5323\n16814,5422\n16818,4753\n16823,5236\n16828,4841\n16831,5228\n16836,9919\n16839,8908\n16844,7278\n16848,8631\n16852,9078\n16855,10041\n16857,5937\n16859,5209\n16863,5235\n16864,6793\n16867,5732\n16868,10132\n16870,4662\n16871,9355\n16876,6240\n16880,9410\n16881,10358\n16885,10330\n16889,5368\n16890,9821\n16892,5041\n16897,6216\n16900,5880\n16903,4979\n16907,9971\n16910,10172\n16911,4657\n16915,8763\n16919,10117\n16921,7781\n16924,7855\n16927,10365\n16932,6613\n16936,6177\n16940,6921\n16941,5895\n16945,9253\n16950,4598\n16955,7186\n16957,8558\n16958,5153\n16959,6061\n16964,10254\n16966,6598\n16968,7658\n16971,7780\n16972,4439\n16973,4953\n16976,5631\n16981,9865\n16983,8577\n16986,9383\n16988,5179\n16989,8459\n16992,7700\n16995,7896\n16996,8975\n17001,8440\n17003,6166\n17004,5256\n17005,7541\n17007,4562\n17012,8488\n17015,8839\n17019,9767\n17024,9607\n17028,7216\n17029,9581\n17034,6709\n17037,8182\n17039,9482\n17040,7660\n17041,8352\n17046,7349\n17048,8419\n17051,8709\n17052,9223\n17057,7021\n17059,9559\n17063,9079\n17065,7472\n17068,7549\n17070,8879\n17075,5799\n17080,6229\n17084,5396\n17088,7035\n17091,8066\n17095,6671\n17099,4591\n17102,10012\n17105,8327\n17106,9059\n17111,9453\n17115,9508\n17116,4470\n17117,4383\n17120,8074\n17124,6297\n17128,9592\n17129,9494\n17132,9754\n17135,9233\n17138,10064\n17142,8657\n17146,9276\n17147,5045\n17148,9857\n17152,10158\n17157,7225\n17161,8653\n17163,5747\n17168,9864\n17170,5422\n17172,9364\n17175,8343\n17178,7500\n17183,5497\n17186,6746\n17191,8842\n17193,8641\n17196,6307\n17201,5761\n17203,10444\n17206,9332\n17208,10485\n17211,5648\n17213,8159\n17214,6745\n17219,8543\n17223,4701\n17227,5675\n17230,9739\n17235,6650\n17240,7124\n17244,7037\n17247,4809\n17251,10407\n17253,10217\n17257,4626\n17258,9438\n17260,10071\n17264,9410\n17268,5499\n17273,10068\n17277,7940\n17280,6670\n17283,8582\n17284,4920\n17287,5785\n17288,5882\n17291,5797\n17295,10284\n17296,5967\n17301,8573\n17302,4429\n17307,7555\n17308,5171\n17312,8914\n17314,6259\n17315,5114\n17317,7927\n17322,5382\n17326,9593\n17327,5169\n17330,4499\n17335,9321\n17340,9965\n17343,6095\n17345,6976\n17348,6952\n17353,7717\n17358,9495\n17360,9290\n17364,9504\n17368,4551\n17369,9760\n17370,9698\n17372,4533\n17376,8696\n17379,7568\n17383,8493\n17384,7196\n17385,8340\n17388,6882\n17389,6111\n17390,6894\n17391,6728\n17392,6354\n17396,6177\n17400,7511\n17405,7304\n17406,4532\n17410,8977\n17415,7846\n17417,7055\n17421,5575\n17426,6012\n17428,7086\n17431,6968\n17434,6139\n17439,8524\n17444,8281\n17448,6832\n17449,4864\n17452,6400\n17455,9113\n17458,7862\n17462,8300\n17465,8208\n17467,9101\n17471,5527\n17472,5023\n17474,7017\n17477,8198\n17478,4655\n17482,9101\n17484,7731\n17487,7525\n17491,10362\n17496,6150\n17499,7381\n17502,6155\n17506,6761\n17509,8321\n17510,4409\n17511,10154\n17515,9965\n17518,10068\n17521,7453\n17524,4795\n17525,10475\n17528,10080\n17529,4884\n17530,6157\n17534,5912\n17535,8932\n17540,10397\n17542,10158\n17547,5529\n17552,6568\n17557,8074\n17558,4406\n17560,6157\n17565,8232\n17568,4910\n17572,7450\n17574,4696\n17575,5544\n17577,9681\n17580,9629\n17581,9145\n17586,10242\n17590,8786\n17595,6701\n17597,7163\n17602,5127\n17604,9999\n17606,8050\n17610,8401\n17613,9445\n17616,5479\n17618,8065\n17621,8490\n17623,9579\n17625,10440\n17627,5745\n17628,10348\n17631,7785\n17634,9067\n17637,8893\n17640,8299\n17642,4857\n17647,9410\n17650,7793\n17652,5205\n17656,4397\n17661,10024\n17666,8439\n17668,8615\n17671,8084\n17675,8922\n17677,9728\n17678,8914\n17682,5165\n17686,4655\n17691,10431\n17692,4744\n17697,7637\n17700,6148\n17702,5682\n17707,9641\n17708,7979\n17713,5318\n17715,8189\n17718,7126\n17719,6171\n17724,9335\n17728,10024\n17729,6221\n17734,4641\n17736,5167\n17740,5754\n17745,5689\n17749,9875\n17753,6069\n17756,6610\n17759,4497\n17764,7468\n17767,5887\n17772,7483\n17777,8626\n17778,5805\n17781,4719\n17785,7108\n17786,9836\n17790,8779\n17791,9182\n17796,8744\n17797,8202\n17801,7108\n17803,9258\n17808,9157\n17810,5762\n17814,5593\n17815,8234\n17820,5993\n17825,8662\n17828,10473\n17831,6763\n17832,5380\n17833,8474\n17834,7249\n17836,7585\n17837,8933\n17838,8807\n17840,8069\n17844,9947\n17849,6102\n17854,5541\n17859,5299\n17864,8337\n17866,9336\n17868,9442\n17872,9968\n17874,7752\n17877,8443\n17882,9599\n17883,9026\n17885,10333\n17889,6769\n17892,5713\n17895,8703\n17898,9229\n17899,4441\n17903,8935\n17907,7488\n17908,10484\n17910,7051\n17915,8205\n17916,5416\n17919,8382\n17922,9106\n17924,5007\n17929,6046\n17931,6597\n17935,4695\n17938,10309\n17939,5357\n17943,6677\n17947,6006\n17950,5178\n17954,6767\n17959,7761\n17963,6024\n17966,5145\n17970,7232\n17974,7172\n17979,4774\n17980,7945\n17985,9091\n17987,4617\n17989,9481\n17991,9101\n17992,4994\n17996,8306\n17997,8402\n18001,6882\n18003,4716\n18008,9288\n18011,4946\n18012,4744\n18017,7657\n18022,8886\n18024,7924\n18027,7922\n18032,9604\n18033,8382\n18036,6841\n18037,6292\n18038,8013\n18043,5951\n18046,9922\n18048,7798\n18053,4552\n18056,5979\n18057,8298\n18060,6992\n18065,9887\n18068,7667\n18071,9119\n18074,7231\n18075,9443\n18076,7197\n18080,10227\n18082,4406\n18084,5089\n18088,7993\n18090,5741\n18092,5239\n18095,9905\n18097,5037\n18099,8258\n18104,4775\n18106,7532\n18108,8982\n18110,4755\n18115,6529\n18120,7230\n18125,8580\n18127,5121\n18129,8144\n18132,9408\n18137,9107\n18141,5934\n18145,7875\n18147,10264\n18152,8943\n18156,4529\n18158,8046\n18159,8586\n18160,8896\n18163,9763\n18168,4570\n18172,6302\n18174,4863\n18177,7172\n18181,8895\n18182,8568\n18186,6505\n18190,5135\n18193,6498\n18198,8192\n18199,4467\n18203,6886\n18207,6545\n18210,10185\n18213,5174\n18214,9543\n18215,9159\n18220,5036\n18224,6177\n18229,9457\n18232,10167\n18234,5700\n18235,9124\n18237,4605\n18241,6311\n18243,5709\n18246,9004\n18251,8857\n18255,5666\n18259,10281\n18263,6804\n18268,9164\n18269,4677\n18274,4958\n18279,7030\n18281,4392\n18284,10391\n18286,7238\n18289,4687\n18292,9700\n18297,5360\n18299,9968\n18301,10356\n18304,4954\n18306,9100\n18308,7758\n18310,10235\n18312,6906\n18313,6318\n18315,9932\n18319,8452\n18321,9297\n18324,9786\n18325,9138\n18328,4511\n18331,6967\n18334,7702\n18335,8628\n18340,8154\n18342,7738\n18343,8579\n18344,4609\n18345,6114\n18349,4654\n18350,4677\n18351,9735\n18354,4919\n18357,6781\n18360,6865\n18364,9576\n18367,8781\n18368,5088\n18371,5203\n18376,10164\n18378,4824\n18382,9768\n18385,7048\n18386,5980\n18388,7507\n18390,7950\n18393,5267\n18396,6674\n18400,9384\n18403,6775\n18405,9458\n18407,4691\n18412,5029\n18414,9620\n18419,9217\n18424,7600\n18426,5504\n18429,9592\n18431,9830\n18434,9780\n18438,8824\n18442,9198\n18445,5019\n18447,6105\n18449,5546\n18454,7935\n18456,7008\n18458,9540\n18459,4849\n18462,10268\n18466,7136\n18471,6345\n18472,5924\n18475,10274\n18480,6970\n18483,6321\n18487,6488\n18488,4707\n18489,7086\n18494,6170\n18495,9460\n18499,8594\n18504,6492\n18509,9727\n18513,5311\n18517,7202\n18520,5564\n18524,6927\n18526,9621\n18531,8539\n18535,7268\n18540,8443\n18541,8331\n18542,4502\n18547,8592\n18548,5488\n18552,8090\n18557,9707\n18561,7421\n18563,8665\n18568,5921\n18573,6878\n18577,5961\n18581,10185\n18582,8264\n18584,8962\n18586,5420\n18588,9667\n18591,5804\n18596,5774\n18600,8418\n18604,9505\n18608,5253\n18609,8960\n18611,7604\n18612,9043\n18616,8903\n18621,5843\n18626,5308\n18627,10341\n18628,6081\n18629,8252\n18632,8707\n18636,9676\n18640,6751\n18644,7282\n18647,5445\n18652,4919\n18653,6080\n18656,10448\n18658,4505\n18660,5632\n18664,10149\n18669,9551\n18671,9117\n18675,4599\n18678,10226\n18682,8019\n18686,6135\n18688,5591\n18692,7085\n18694,5674\n18698,5135\n18703,6547\n18707,5886\n18709,4965\n18714,4673\n18715,8563\n18716,7714\n18721,8801\n18722,6105\n18727,4836\n18732,10257\n18734,7918\n18735,9557\n18738,9458\n18741,9368\n18746,7762\n18750,8838\n18752,4811\n18756,6648\n18759,5906\n18762,5379\n18765,5146\n18770,6542\n18772,9073\n18776,8214\n18780,5074\n18783,8697\n18786,7987\n18789,10057\n18791,7809\n18794,8429\n18797,9095\n18798,6568\n18803,6238\n18807,7749\n18812,9776\n18815,4909\n18820,9464\n18821,6559\n18824,7432\n18828,4964\n18829,8623\n18831,5572\n18835,4953\n18837,4958\n18839,6271\n18840,8469\n18842,4556\n18844,8407\n18848,10088\n18851,8973\n18854,6478\n18859,7686\n18864,10084\n18867,5369\n18868,5450\n18872,5694\n18877,8166\n18878,7099\n18883,8957\n18885,7881\n18888,9238\n18889,8825\n18893,8193\n18898,5606\n18899,7836\n18901,10132\n18905,8450\n18907,8551\n18910,7282\n18914,7281\n18916,8588\n18918,9702\n18923,8519\n18928,5643\n18933,4808\n18935,5402\n18938,5212\n18939,9262\n18942,8912\n18947,8812\n18950,6392\n18954,9992\n18957,5781\n18960,7381\n18964,7616\n18969,9101\n18973,6307\n18978,9495\n18981,9075\n18982,5567\n18983,9810\n18985,9155\n18989,6881\n18994,8448\n18996,9838\n19001,8666\n19006,5923\n19008,4722\n19013,9809\n19017,6237\n19018,7723\n19019,4954\n19022,6804\n19023,7406\n19027,4659\n19029,4807\n19034,6765\n19036,8915\n19041,7694\n19046,8589\n19050,7733\n19051,7971\n19055,6578\n19060,10305\n19065,5449\n19068,9072\n19072,6358\n19075,7627\n19077,4713\n19082,9520\n19086,9703\n19088,8160\n19090,7402\n19092,10049\n19095,8084\n19097,5777\n19100,4465\n19103,9789\n19108,10037\n19111,5660\n19115,5471\n19116,9489\n19121,8682\n19122,9748\n19123,4815\n19127,7922\n19128,8174\n19131,8104\n19134,8899\n19137,8612\n19138,6022\n19142,6348\n19147,5198\n19151,6801\n19154,8225\n19156,5268\n19161,8824\n19163,8493\n19164,6304\n19165,9163\n19169,4426\n19171,6664\n19176,7170\n19177,9786\n19179,7895\n19183,10194\n19185,4534\n19188,6198\n19193,9150\n19195,6225\n19199,9410\n19202,5481\n19205,5037\n19210,5896\n19215,5356\n19220,6107\n19221,6406\n19224,7108\n19225,8843\n19229,4463\n19230,7739\n19234,9774\n19236,6782\n19237,8324\n19238,9611\n19243,8531\n19248,5757\n19250,8705\n19253,5203\n19254,9126\n19255,5589\n19256,6774\n19257,6294\n19262,9018\n19267,5631\n19272,5661\n19276,6942\n19279,9596\n19284,7402\n19285,5544\n19290,6576\n19294,7832\n19298,6730\n19301,6758\n19303,8921\n19306,7252\n19310,5983\n19312,6488\n19317,4993\n19319,5569\n19322,5270\n19324,8723\n19329,9852\n19331,8338\n19332,7333\n19333,5498\n19338,5244\n19342,6299\n19343,4624\n19346,5595\n19349,4752\n19350,6074\n19351,9163\n19356,4570\n19360,8610\n19365,4428\n19366,5325\n19369,7999\n19370,7847\n19372,10193\n19374,4565\n19376,5895\n19377,5321\n19379,6999\n19380,7541\n19385,6287\n19390,6800\n19394,8830\n19395,8088\n19397,6693\n19398,6451\n19401,7802\n19403,6830\n19408,8544\n19412,9435\n19414,7947\n19419,7817\n19420,4944\n19425,6593\n19430,5192\n19432,9691\n19435,10463\n19439,10467\n19442,7705\n19445,6536\n19448,9020\n19451,5529\n19452,6350\n19455,5733\n19460,9507\n19461,8140\n19465,6526\n19468,8941\n19472,10230\n19475,7460\n19478,9412\n19479,7374\n19481,9967\n19484,9563\n19489,8212\n19492,6833\n19497,9453\n19501,6841\n19502,5802\n19505,7510\n19508,9385\n19513,5912\n19518,5723\n19522,9696\n19525,7418\n19529,4794\n19534,9289\n19538,9839\n19540,8608\n19542,5146\n19544,8623\n19549,9043\n19551,9566\n19553,5513\n19555,8204\n19558,5214\n19560,9682\n19561,7764\n19564,8637\n19566,4437\n19569,4403\n19574,6094\n19579,7001\n19582,7615\n19587,8699\n19591,6247\n19596,10323\n19598,8643\n19601,10130\n19606,6925\n19610,5568\n19614,5829\n19618,10117\n19621,5497\n19626,6072\n19627,7716\n19630,5496\n19631,8040\n19634,6590\n19638,4541\n19642,5454\n19644,8631\n19645,8465\n19647,8715\n19649,7732\n19651,4412\n19654,7012\n19655,6823\n19657,8552\n19658,8146\n19663,8815\n19665,4966\n19668,7326\n19670,7830\n19671,4475\n19672,7912\n19675,8245\n19680,5681\n19684,7223\n19685,8719\n19687,5156\n19690,7900\n19693,10297\n19694,8863\n19698,4822\n19699,10000\n19701,9834\n19704,7263\n19707,5850\n19710,6917\n19711,7882\n19714,6527\n19715,8828\n19719,9533\n19721,4767\n19722,6690\n19725,4546\n19729,6406\n19731,9335\n19735,5555\n19740,6322\n19743,9271\n19745,6277\n19750,9401\n19754,6073\n19757,8274\n19759,5014\n19762,5787\n19765,5567\n19766,7894\n19767,7260\n19769,7945\n19772,10021\n19775,6981\n19776,4684\n19778,8872\n19782,5030\n19787,4727\n19788,6336\n19793,6129\n19795,8321\n19798,4813\n19803,7890\n19807,4485\n19809,4742\n19811,5874\n19815,7342\n19816,9542\n19821,4490\n19823,4468\n19828,8683\n19829,9177\n19834,8645\n19837,5002\n19838,4768\n19843,5433\n19847,5120\n19852,9580\n19857,9359\n19861,8709\n19865,7320\n19870,4680\n19873,4593\n19874,7705\n19876,5092\n19880,6534\n19881,8679\n19882,7260\n19885,4913\n19886,5864\n19889,9439\n19894,9728\n19898,6579\n19903,7059\n19904,5847\n19905,5174\n19910,4956\n19915,10249\n19920,7707\n19921,10237\n19926,9861\n19929,10125\n19931,9420\n19936,8628\n19938,6846\n19943,5477\n19947,7417\n19949,8743\n19952,9288\n19955,5085\n19957,5331\n19961,8267\n19963,6973\n19968,8559\n19971,6574\n19973,6194\n19974,7620\n19976,5222\n19977,10338\n19979,7108\n19980,9287\n19981,4731\n19986,10088\n19989,6138\n19990,8744\n19994,9111\n19999,4400\n20002,7248\n20003,9240\n20005,7185\n20008,8415\n20011,4694\n20012,6974\n20015,8190\n20020,5366\n20024,7100\n20029,6158\n20032,9789\n20035,4971\n20037,7016\n20042,10113\n20044,4831\n20048,7927\n20053,10393\n20054,6771\n20056,9458\n20059,5149\n20061,8648\n20065,7166\n20070,9175\n20072,8008\n20076,7061\n20077,9747\n20079,8946\n20080,8983\n20084,10274\n20088,6110\n20089,5716\n20094,6130\n20095,9672\n20100,5287\n20101,6515\n20103,10457\n20104,9786\n20107,9606\n20109,6840\n20114,6750\n20119,6648\n20120,5585\n20123,8889\n20127,8488\n20129,6761\n20134,9001\n20139,5290\n20140,5649\n20145,8626\n20150,6728\n20151,6876\n20152,9275\n20154,4484\n20155,9400\n20158,5754\n20159,5818\n20162,8266\n20163,7097\n20168,9274\n20172,7877\n20177,7561\n20180,7565\n20184,5798\n20185,6532\n20186,8550\n20188,7702\n20190,4762\n20194,5503\n20196,7766\n20198,5290\n20203,8182\n20204,7897\n20208,5544\n20211,6213\n20212,6314\n20217,5706\n20220,9326\n20224,4988\n20225,5339\n20226,5423\n20230,5798\n20235,4694\n20236,5401\n20237,6514\n20240,9602\n20243,9662\n20246,7839\n20247,7213\n20249,6155\n20250,7363\n20253,6574\n20255,7988\n20258,6032\n20262,10008\n20266,8998\n20271,8402\n20272,4844\n20275,8929\n20276,6642\n20277,8128\n20280,5215\n20282,4381\n20285,8321\n20286,8328\n20290,8944\n20294,4648\n20297,5145\n20298,7096\n20301,8718\n20302,8071\n20303,7598\n20306,8230\n20307,9459\n20311,6246\n20315,10337\n20320,6592\n20324,8429\n20326,9092\n20328,6436\n20331,5579\n20334,6373\n20339,6159\n20343,9540\n20347,4406\n20348,9914\n20351,5286\n20355,4589\n20356,6104\n20358,4489\n20362,9254\n20367,8294\n20368,5257\n20369,5393\n20370,9039\n20373,9697\n20377,5895\n20379,10083\n20381,8197\n20383,6794\n20387,4978\n20389,6864\n20391,9641\n20393,6393\n20395,10444\n20398,7743\n20402,6573\n20406,8012\n20408,9884\n20413,8919\n20415,5155\n20419,7043\n20420,10289\n20425,9904\n20427,5274\n20431,7826\n20433,9672\n20438,9182\n20439,6464\n20444,8035\n20447,7987\n20448,10068\n20449,5624\n20450,7910\n20454,8158\n20457,6292\n20461,9875\n20466,8026\n20469,5707\n20471,8511\n20474,7416\n20478,6101\n20481,9036\n20484,4575\n20489,5729\n20492,8444\n20496,5580\n20499,6788\n20501,8148\n20505,9327\n20510,8344\n20511,4883\n20516,8832\n20520,9935\n20523,10123\n20526,6771\n20529,6167\n20533,9360\n20535,5389\n20540,6407\n20545,7537\n20550,6799\n20552,6117\n20556,10015\n20558,7014\n20559,6397\n20561,6249\n20566,5948\n20569,5539\n20574,5336\n20579,4716\n20581,9606\n20583,8281\n20585,10362\n20590,5785\n20591,7786\n20593,8968\n20597,7723\n20600,10212\n20603,7088\n20608,7422\n20613,6770\n20617,7678\n20622,9293\n20627,6085\n20630,9845\n20632,8493\n20633,10160\n20635,5389\n20639,6364\n20641,8796\n20646,8252\n20649,9926\n20650,9245\n20653,6226\n20654,8736\n20656,7164\n20657,6393\n20662,9506\n20667,10288\n20669,7477\n20674,7948\n20676,8608\n20680,9200\n20685,4478\n20688,7815\n20689,5250\n20691,8007\n20695,6887\n20697,6446\n20700,8534\n20701,7416\n20706,8365\n20711,9240\n20713,7244\n20714,4499\n20716,8342\n20717,7354\n20718,7208\n20723,4924\n20727,5374\n20731,7166\n20733,8734\n20735,4842\n20738,5040\n20741,9681\n20744,7083\n20745,9861\n20749,7693\n20754,10454\n20757,6856\n20762,9077\n20763,5104\n20766,9132\n20768,6669\n20772,10380\n20776,4651\n20781,10257\n20784,6880\n20789,7170\n20794,6709\n20797,10480\n20799,6122\n20803,4480\n20808,6378\n20812,9093\n20813,7053\n20816,9534\n20820,7069\n20821,8588\n20825,5513\n20826,5894\n20828,6540\n20832,6275\n20833,5459\n20837,6172\n20841,6719\n20844,7715\n20846,9538\n20850,5335\n20854,9643\n20858,8586\n20861,7913\n20863,5802\n20864,6636\n20867,6049\n20869,7935\n20874,8416\n20877,6132\n20879,9907\n20884,10284\n20889,4751\n20892,8506\n20896,7124\n20899,5340\n20903,5797\n20906,7022\n20907,8753\n20911,6803\n20915,5395\n20917,6714\n20918,6258\n20919,8792\n20923,10275\n20924,7953\n20927,8653\n20929,7695\n20931,8046\n20935,7155\n20940,6693\n20943,8708\n20944,7212\n20945,9530\n20947,6781\n20951,10235\n20953,8189\n20957,5590\n20959,8926\n20961,6671\n20962,7888\n20966,6360\n20969,9414\n20974,9976\n20977,6764\n20978,8992\n20979,8656\n20984,7001\n20987,7210\n20988,9709\n20992,5410\n20993,4876\n20998,9014\n21003,9282\n21004,5076\n21009,5138\n21013,6381\n21015,6900\n21020,9130\n21024,5209\n21029,6998\n21030,8057\n21031,7735\n21035,5095\n21040,8819\n21042,4780\n21043,9583\n21044,8181\n21047,10075\n21049,4984\n21053,7200\n21058,4946\n21063,7313\n21064,9208\n21065,7361\n21067,8763\n21072,9342\n21077,8068\n21081,6975\n21085,9637\n21086,7240\n21090,7237\n21095,8346\n21097,5151\n21102,9646\n21104,8111\n21105,4655\n21109,8446\n21110,4454\n21111,10430\n21114,5676\n21115,5606\n21120,5714\n21124,8251\n21128,8389\n21132,5921\n21137,5372\n21140,7228\n21144,5445\n21145,6822\n21149,5979\n21151,9221\n21153,9657\n21154,7923\n21159,5418\n21162,7481\n21164,5446\n21167,8589\n21168,9830\n21172,5133\n21174,9409\n21179,6254\n21181,9447\n21184,5678\n21185,10039\n21187,4589\n21192,4693\n21195,7726\n21200,6865\n21203,6315\n21205,6808\n21208,5296\n21211,9104\n21215,8881\n21220,5937\n21225,4384\n21230,5484\n21235,4551\n21236,7915\n21241,6706\n21245,10069\n21249,9525\n21253,5299\n21257,7546\n21262,6696\n21263,10356\n21264,5324\n21269,4708\n21271,7514\n21275,6380\n21276,8882\n21277,6668\n21281,4702\n21282,6833\n21286,6887\n21288,6150\n21290,8159\n21291,5407\n21294,5283\n21295,9755\n21298,7655\n21299,6326\n21301,8416\n21303,5910\n21304,8261\n21306,7702\n21308,5460\n21310,6047\n21312,10185\n21315,9177\n21319,4875\n21321,9935\n21322,5552\n21326,5548\n21329,6319\n21331,5015\n21332,4795\n21333,7785\n21338,5328\n21342,9880\n21345,6187\n21346,4595\n21351,6825\n21355,7413\n21356,5908\n21357,4490\n21360,9547\n21365,6353\n21366,4847\n21368,5837\n21371,4430\n21376,4702\n21378,5335\n21383,4521\n21388,8019\n21392,6046\n21394,4780\n21399,5002\n21404,6814\n21405,5842\n21409,6023\n21410,8339\n21411,8799\n21413,9265\n21417,6964\n21422,9661\n21423,6912\n21425,5966\n21430,5333\n21432,5190\n21436,10326\n21441,7585\n21443,8907\n21447,7902\n21450,10355\n21455,5056\n21460,10353\n21463,8251\n21464,10025\n21465,7885\n21470,9978\n21475,5914\n21477,6993\n21480,7101\n21485,4924\n21487,6843\n21492,6781\n21495,6980\n21500,7727\n21504,8758\n21508,10259\n21513,7645\n21514,5915\n21517,7440\n21518,5523\n21523,5516\n21524,6093\n21529,7968\n21532,6826\n21533,7375\n21536,7890\n21541,6691\n21544,7028\n21546,7365\n21548,6862\n21553,7043\n21557,4967\n21560,6723\n21561,5805\n21563,6533\n21567,5048\n21568,9311\n21573,8013\n21574,8205\n21579,8643\n21580,9392\n21584,8738\n21585,5356\n21590,7439\n21595,5756\n21598,5868\n21603,8004\n21604,6575\n21607,7935\n21608,10475\n21610,4729\n21613,4905\n21614,10456\n21617,5017\n21622,5220\n21627,6801\n21628,7277\n21630,8270\n21632,8239\n21633,7559\n21634,7996\n21636,10416\n21638,7029\n21641,5248\n21644,8989\n21645,9537\n21647,9291\n21651,9039\n21655,9629\n21660,6727\n21663,7623\n21664,5494\n21668,6142\n21670,6726\n21675,10064\n21679,7474\n21681,7020\n21685,6740\n21688,9247\n21689,4445\n21692,4895\n21694,4982\n21696,7617\n21697,7619\n21699,6480\n21701,6053\n21705,5970\n21706,8116\n21707,7462\n21712,6316\n21713,4621\n21716,6491\n21720,8773\n21724,6957\n21727,7355\n21731,5054\n21736,10329\n21740,5750\n21745,9827\n21749,6161\n21750,4736\n21755,9470\n21757,6703\n21759,9366\n21761,6312\n21763,8463\n21767,4915\n21768,6366\n21772,5136\n21777,7826\n21782,5267\n21787,4810\n21789,6535\n21790,9096\n21793,6694\n21798,9019\n21803,8026\n21806,6656\n21808,5071\n21813,5057\n21816,7376\n21820,6907\n21824,8086\n21829,9399\n21834,8958\n21836,5416\n21837,9510\n21840,9325\n21843,9860\n21848,4418\n21853,5567\n21854,4682\n21858,8770\n21862,9375\n21867,4925\n21872,6757\n21876,7178\n21880,6028\n21883,4536\n21886,4570\n21889,9283\n21890,10270\n21891,8716\n21894,10216\n21899,9171\n21902,7280\n21905,8434\n21906,4580\n21909,5968\n21910,4657\n21912,10159\n21913,4916\n21915,8379\n21920,6563\n21922,10172\n21927,5039\n21931,5575\n21932,4821\n21933,7622\n21936,6344\n21938,9635\n21943,7918\n21944,6521\n21949,5697\n21952,4561\n21955,9178\n21957,10415\n21962,8159\n21963,6071\n21968,4714\n21972,7906\n21977,7653\n21979,10401\n21983,5573\n21987,9755\n21990,10257\n21992,7096\n21997,6209\n22002,8748\n22004,5436\n22008,9423\n22009,7615\n22014,10177\n22016,6940\n22019,10488\n22021,4589\n22022,4537\n22024,5240\n22029,6355\n22034,7977\n22037,5342\n22040,9849\n22041,10051\n22044,8781\n22046,7199\n22050,10341\n22052,7306\n22057,6390\n22058,7163\n22062,9504\n22067,8757\n22072,6497\n22075,6167\n22076,5902\n22080,7600\n22085,10346\n22089,8170\n22091,9246\n22092,9871\n22093,9272\n22098,7403\n22099,9020\n22102,7361\n22106,7803\n22109,8161\n22110,6641\n22114,8490\n22116,8988\n22119,9673\n22120,7569\n22124,5044\n22126,8491\n22127,8386\n22131,8978\n22132,9448\n22134,6742\n22138,7705\n22141,7508\n22145,9020\n22150,7617\n22155,9811\n22156,9190\n22158,6054\n22162,7843\n22166,9311\n22167,5849\n22171,7963\n22173,7331\n22178,8022\n22182,6110\n22186,9327\n22188,9253\n22191,6554\n22193,7344\n22198,7133\n22200,9834\n22202,5184\n22206,5365\n22210,4952\n22212,6534\n22217,5619\n22219,6083\n22221,5880\n22223,5787\n22224,4465\n22227,8891\n22229,8641\n22232,7137\n22235,9475\n22237,9556\n22241,8438\n22243,6959\n22244,8682\n22245,8058\n22250,7757\n22251,10451\n22252,8777\n22255,8588\n22259,5980\n22264,9642\n22268,5404\n22272,9581\n22274,10386\n22279,9375\n22284,6474\n22288,5945\n22291,6873\n22294,7423\n22298,5893\n22301,6811\n22304,4544\n22307,6798\n22310,8505\n22313,10444\n22315,8012\n22317,10321\n22318,10326\n22323,8875\n22327,6214\n22329,10447\n22333,8561\n22335,4702\n22339,9112\n22343,8019\n22345,6734\n22347,9807\n22352,7343\n22357,8792\n22361,6630\n22365,9242\n22370,4569\n22375,5746\n22378,9518\n22380,7356\n22381,6773\n22383,5767\n22384,7651\n22388,10290\n22391,8673\n22396,8041\n22398,6748\n22399,6547\n22404,7452\n22409,6529\n22414,7584\n22417,8437\n22419,5254\n22424,4582\n22427,9175\n22429,8634\n22434,9815\n22439,6696\n22444,5450\n22449,9094\n22454,6154\n22458,5351\n22461,8181\n22463,4847\n22468,10315\n22471,6261\n22474,7164\n22477,5878\n22478,8600\n22479,7095\n22483,5047\n22486,9082\n22491,5158\n22495,8789\n22497,10400\n22498,7202\n22499,6508\n22501,9868\n22504,5977\n22506,4699\n22508,4803\n22511,5159\n22512,8588\n22515,4986\n22518,4994\n22523,8643\n22525,4548\n22530,10276\n22534,10415\n22535,7074\n22536,4890\n22538,9269\n22541,5231\n22544,10218\n22547,8450\n22552,5509\n22554,8798\n22556,9598\n22559,6411\n22560,10039\n22561,7280\n22566,7273\n22570,4559\n22571,10104\n22573,5445\n22578,4468\n22583,7309\n22588,6867\n22593,6606\n22595,8623\n22597,6913\n22602,8015\n22603,6191\n22608,9507\n22613,9744\n22617,7724\n22618,9174\n22619,10256\n22624,4394\n22628,4562\n22631,6346\n22635,7459\n22640,4877\n22644,4821\n22648,4654\n22651,6594\n22654,5009\n22655,4632\n22658,8978\n22662,8708\n22663,5669\n22667,9688\n22671,5624\n22672,8959\n22674,10405\n22677,6287\n22682,7853\n22683,8666\n22685,7408\n22687,8499\n22692,7742\n22693,8169\n22694,8345\n22699,5503\n22700,5601\n22701,9221\n22704,6956\n22709,9360\n22711,9205\n22716,9934\n22721,4800\n22722,7105\n22727,7072\n22730,8582\n22735,6441\n22737,6872\n22739,9133\n22743,8294\n22748,6589\n22750,8129\n22753,4504\n22756,9054\n22761,5722\n22765,8179\n22767,6928\n22768,10092\n22769,5492\n22772,5119\n22776,7095\n22781,8247\n22786,8432\n22788,5560\n22790,6184\n22791,6728\n22793,4825\n22795,9243\n22796,6169\n22801,8283\n22804,6777\n22805,7929\n22806,5423\n22807,4843\n22809,9991\n22810,9550\n22815,4505\n22817,10031\n22821,5471\n22823,9232\n22825,7449\n22827,8911\n22829,10153\n22834,9252\n22839,8521\n22840,4544\n22844,4722\n22849,5345\n22851,6324\n22852,5441\n22853,7909\n22857,6880\n22858,6272\n22863,8014\n22866,8219\n22870,7275\n22875,10484\n22878,7621\n22880,5693\n22882,6748\n22887,8160\n22889,7028\n22893,9347\n22896,10429\n22897,6236\n22901,9024\n22906,6337\n22911,4759\n22913,7724\n22918,7937\n22920,8001\n22922,4954\n22925,4812\n22929,9532\n22930,8397\n22934,6716\n22939,9363\n22942,5071\n22944,6667\n22947,8181\n22948,5647\n22949,4621\n22954,6178\n22959,9031\n22961,10053\n22966,8114\n22967,9208\n22968,9592\n22973,4902\n22976,6860\n22980,9842\n22985,4785\n22988,4595\n22989,6032\n22990,10258\n22994,6748\n22996,6562\n22998,9863\n23003,9617\n23004,7635\n23009,9304\n23014,6905\n23018,7233\n23020,6146\n23022,4488\n23025,9167\n23026,4621\n23027,10328\n23028,10484\n23030,9083\n23032,8845\n23035,5705\n23038,4544\n23040,8050\n23044,7121\n23048,6754\n23050,7049\n23055,9071\n23057,5421\n23062,10248\n23064,7203\n23066,5521\n23071,5528\n23073,9893\n23077,6369\n23079,10016\n23080,10274\n23081,7994\n23084,9831\n23085,7797\n23088,9344\n23091,8140\n23096,8080\n23099,5697\n23101,4677\n23106,8313\n23111,6894\n23112,7483\n23117,10365\n23119,9219\n23124,5563\n23129,7417\n23131,7130\n23135,7209\n23140,9743\n23141,5763\n23143,8131\n23146,8480\n23150,8270\n23152,6405\n23155,9965\n23156,9642\n23157,4775\n23158,4728\n23163,5457\n23167,9695\n23170,4553\n23173,9750\n23176,9639\n23178,8898\n23182,8613\n23184,6735\n23185,7386\n23190,6031\n23193,7568\n23196,6900\n23201,6403\n23204,9456\n23209,9103\n23214,5509\n23215,7122\n23217,5151\n23221,8542\n23226,4394\n23230,10014\n23234,5134\n23235,8099\n23238,5594\n23239,5140\n23244,5985\n23249,8639\n23251,8380\n23256,5287\n23261,8672\n23262,8138\n23266,7075\n23270,5747\n23273,9883\n23274,6819\n23277,6927\n23279,10394\n23284,8455\n23287,10415\n23292,9581\n23297,5863\n23299,9145\n23302,7317\n23307,7382\n23310,5802\n23315,7834\n23318,5599\n23319,4449\n23322,6648\n23323,5686\n23324,4750\n23325,8454\n23330,6552\n23335,5442\n23338,9579\n23343,10250\n23344,4846\n23347,8505\n23351,8090\n23355,6335\n23359,8987\n23361,4877\n23363,6163\n23366,5218\n23368,5524\n23370,7289\n23371,9469\n23372,7144\n23373,6967\n23377,4792\n23379,5806\n23381,5326\n23386,10090\n23389,5335\n23394,8814\n23395,8828\n23400,5537\n23405,6545\n23408,8349\n23411,6992\n23413,8473\n23417,7931\n23421,5736\n23426,7033\n23428,7679\n23431,8129\n23434,7523\n23437,7526\n23439,5138\n23444,5685\n23449,9444\n23450,4747\n23452,10162\n23457,7316\n23462,8023\n23466,5368\n23469,4660\n23473,10329\n23478,8961\n23480,8959\n23484,9176\n23489,7867\n23491,6449\n23495,10084\n23497,7219\n23501,7906\n23504,4888\n23507,7108\n23509,5359\n23514,5442\n23517,7152\n23519,5150\n23524,10258\n23526,10304\n23529,8671\n23530,7428\n23532,9527\n23535,6544\n23536,6793\n23539,9389\n23540,7046\n23545,6669\n23548,4836\n23550,9617\n23554,6054\n23555,5291\n23556,6742\n23559,9560\n23561,8868\n23566,10109\n23570,4579\n23571,8150\n23573,4916\n23574,7731\n23577,4985\n23582,5732\n23586,8646\n23588,4793\n23592,4894\n23594,9138\n23597,4611\n23598,4694\n23601,5210\n23602,7955\n23606,4901\n23608,8169\n23611,10056\n23614,8792\n23615,4964\n23616,10039\n23621,8974\n23622,4420\n23625,5057\n23628,8671\n23631,6010\n23635,10322\n23637,8158\n23638,8786\n23641,6518\n23645,7812\n23648,6411\n23649,7748\n23653,5701\n23655,6434\n23659,5757\n23660,5340\n23665,10202\n23668,9897\n23670,5612\n23675,6785\n23680,6483\n23683,6115\n23685,9470\n23688,4999\n23690,5165\n23692,9499\n23696,4395\n23697,8839\n23698,5169\n23703,5492\n23708,6151\n23711,4546\n23716,8540\n23720,6717\n23723,7241\n23728,6963\n23731,7089\n23732,8202\n23737,7509\n23740,6564\n23744,6095\n23748,5952\n23751,4405\n23753,9243\n23754,8449\n23755,8496\n23759,4786\n23763,10091\n23766,9397\n23770,7195\n23771,10446\n23773,5807\n23775,5595\n23778,8540\n23779,7089\n23783,7398\n23785,5248\n23786,7664\n23789,5258\n23790,6609\n23793,10385\n23797,5400\n23798,6207\n23802,5498\n23805,9274\n23809,10317\n23814,8157\n23815,8402\n23819,7033\n23820,5875\n23821,6392\n23825,6658\n23829,7764\n23834,5975\n23836,8118\n23838,8692\n23841,10152\n23846,9376\n23848,9733\n23850,9593\n23855,8302\n23856,4776\n23860,7565\n23865,10437\n23870,6833\n23871,9920\n23872,4626\n23877,5896\n23882,10312\n23883,10084\n23885,6723\n23890,4565\n23893,5316\n23895,9119\n23899,5846\n23904,4507\n23905,8294\n23909,5417\n23911,8648\n23916,8772\n23917,6835\n23918,9378\n23923,7382\n23927,5415\n23928,5252\n23930,8044\n23935,10175\n23938,7577\n23942,6659\n23945,10136\n23947,7660\n23949,8914\n23952,4416\n23957,8181\n23959,8874\n23960,4925\n23964,7393\n23965,5156\n23967,5054\n23972,10224\n23975,5630\n23978,9512\n23982,6173\n23983,5990\n23985,7646\n23988,5529\n23989,9353\n23994,5215\n23997,8701\n24002,5152\n24005,5094\n24006,8191\n24011,5613\n24013,5431\n24015,9502\n24017,7561\n24018,4579\n24023,4615\n24027,9788\n24028,5964\n24033,6944\n24037,8517\n24040,6952\n24042,4445\n24045,7971\n24050,5507\n24051,9305\n24056,7989\n24058,9578\n24060,5256\n24061,10336\n24066,5664\n24071,4929\n24074,8385\n24077,9152\n24081,4903\n24085,6638\n24088,6086\n24089,9422\n24090,7472\n24093,10230\n24094,5911\n24098,5305\n24100,6734\n24105,7511\n24110,8216\n24111,7112\n24113,9321\n24118,5795\n24120,8742\n24122,5694\n24124,4522\n24125,6057\n24130,8657\n24134,9337\n24139,9304\n24141,5578\n24142,5146\n24143,5314\n24147,8274\n24149,5427\n24154,9683\n24156,5067\n24159,9306\n24163,8666\n24164,9102\n24165,9667\n24169,8778\n24171,6281\n24175,7461\n24176,9243\n24181,8924\n24182,7285\n24186,8206\n24189,7256\n24191,6023\n24195,5339\n24196,5427\n24199,7688\n24204,7295\n24209,7820\n24210,4421\n24215,4376\n24216,8309\n24219,9637\n24222,5756\n24226,6490\n24227,4420\n24230,8246\n24235,5548\n24240,8000\n24243,5474\n24244,8599\n24248,5427\n24249,6471\n24251,8936\n24254,5087\n24258,10045\n24260,8588\n24263,9010\n24267,8832\n24271,6739\n24276,8931\n24281,5910\n24286,7720\n24289,8420\n24293,7794\n24298,4949\n24299,5062\n24303,7213\n24306,9498\n24309,9399\n24310,9934\n24312,6241\n24314,6118\n24315,6302\n24316,9627\n24320,8764\n24323,9616\n24327,7983\n24329,4659\n24334,9079\n24335,5906\n24336,5948\n24341,5003\n24344,8791\n24345,8685\n24346,7677\n24349,6595\n24352,6142\n24357,4466\n24360,5186\n24365,9489\n24367,10416\n24369,4922\n24372,4379\n24373,8643\n24378,10417\n24382,7663\n24384,8543\n24386,5058\n24388,8496\n24392,7688\n24396,8969\n24399,4456\n24400,6297\n24403,5416\n24404,6607\n24405,8278\n24409,5120\n24410,9580\n24414,5976\n24417,4582\n24420,6471\n24423,10310\n24427,8741\n24429,7637\n24430,9013\n24434,6748\n24437,5459\n24442,7197\n24447,10175\n24450,8156\n24452,4533\n24453,6381\n24457,10423\n24459,5197\n24462,5565\n24466,6907\n24468,6772\n24473,7104\n24475,5793\n24476,5507\n24478,6571\n24481,5409\n24483,8367\n24484,9240\n24486,7127\n24491,9911\n24492,6224\n24497,7461\n24500,7243\n24504,6470\n24505,6825\n24508,7467\n24509,9134\n24514,8630\n24517,8169\n24519,6057\n24522,10193\n24527,6489\n24530,4511\n24531,9209\n24534,8039\n24537,7456\n24541,4718\n24546,6978\n24550,8383\n24551,9544\n24552,7714\n24555,9750\n24558,10043\n24559,7650\n24561,7737\n24562,10358\n24565,6426\n24569,7426\n24571,5639\n24575,9606\n24578,7440\n24580,8623\n24584,9799\n24587,5141\n24590,7060\n24595,9523\n24598,5169\n24601,10072\n24602,4588\n24605,10032\n24608,4915\n24610,6248\n24613,5637\n24614,6055\n24617,5080\n24620,5098\n24625,10203\n24627,8920\n24629,10049\n24630,6231\n24632,4707\n24633,7715\n24637,8297\n24640,4456\n24641,8166\n24642,8330\n24646,9942\n24649,6415\n24654,10138\n24655,7272\n24658,4989\n24663,6082\n24665,5142\n24668,4430\n24672,8208\n24677,6344\n24679,5169\n24683,6569\n24685,5444\n24688,7982\n24693,5397\n24695,9255\n24700,10038\n24702,8594\n24705,8062\n24708,10413\n24710,8875\n24714,5736\n24717,9842\n24720,4617\n24725,4672\n24730,6186\n24735,10322\n24736,10090\n24740,10123\n24741,9816\n24745,9985\n24746,10027\n24750,9957\n24755,9452\n24759,5873\n24764,5479\n24765,5434\n24770,7392\n24774,10213\n24778,10163\n24780,9756\n24785,6897\n24789,5481\n24792,5071\n24797,10331\n24802,6630\n24804,9934\n24809,9612\n24812,10270\n24813,9509\n24817,8461\n24818,7486\n24822,9711\n24826,10040\n24829,5763\n24830,7567\n24832,6409\n24836,8880\n24838,9623\n24841,9141\n24844,4876\n24847,8105\n24848,8952\n24853,7740\n24857,7503\n24861,5261\n24865,9657\n24870,7944\n24875,10212\n24879,4376\n24882,7779\n24884,8851\n24886,4567\n24889,6341\n24893,10448\n24898,8432\n24903,5639\n24908,9167\n24910,6421\n24911,8286\n24913,6769\n24915,4619\n24917,7008\n24921,4498\n24926,8338\n24930,9046\n24933,8070\n24936,5137\n24937,5237\n24942,5854\n24946,8991\n24949,6689\n24950,4571\n24951,7487\n24955,4838\n24957,5648\n24958,8339\n24962,8425\n24963,8327\n24968,5048\n24971,9869\n24975,8070\n24980,5883\n24982,10487\n24984,6462\n24989,7450\n24992,5879\n24996,7643\n25000,9089\n25003,7450\n25008,8107\n25011,7560\n25012,9188\n25017,6452\n25018,6687\n25019,8285\n25020,10025\n25023,7693\n25028,5194\n25029,10005\n25034,6588\n25035,7773\n25036,5232\n25038,6034\n25039,10213\n25043,6361\n25047,7145\n25049,7540\n25052,5785\n25055,6912\n25059,4942\n25061,8644\n25064,5634\n25069,6256\n25071,8991\n25074,7684\n25078,10443\n25082,10039\n25085,4386\n25089,9343\n25091,6360\n25095,5241\n25099,6798\n25100,8907\n25104,6721\n25105,5180\n25109,4897\n25114,7359\n25119,10472\n25121,4626\n25126,8332\n25131,8267\n25135,10192\n25136,4847\n25139,5981\n25142,5482\n25146,5409\n25149,9792\n25153,9761\n25155,9152\n25160,7759\n25163,9170\n25168,6193\n25169,8371\n25174,9228\n25175,10372\n25177,4899\n25180,6174\n25181,10475\n25186,5054\n25191,7834\n25193,6116\n25195,10177\n25200,7433\n25204,8377\n25209,9554\n25214,7956\n25215,7214\n25216,9088\n25220,6191\n25221,5108\n25223,6626\n25225,4857\n25229,9110\n25234,7664\n25236,10104\n25238,5607\n25241,5976\n25242,4937\n25246,9042\n25251,7723\n25256,6312\n25257,5812\n25258,9658\n25261,4578\n25266,9604\n25268,9541\n25269,4933\n25273,6070\n25278,7221\n25279,9152\n25282,9462\n25286,8839\n25289,4575\n25293,10140\n25298,9520\n25300,9022\n25305,6918\n25309,6688\n25310,10257\n25311,7555\n25312,7380\n25317,8842\n25319,6005\n25324,5154\n25328,5431\n25333,7354\n25334,8639\n25335,6318\n25340,4769\n25344,6844\n25347,5207\n25351,8873\n25353,7404\n25355,8076\n25356,9748\n25359,8306\n25360,9834\n25363,8486\n25364,7386\n25369,8488\n25373,6122\n25376,6451\n25379,7325\n25384,10125\n25389,5321\n25390,9028\n25394,5867\n25397,8873\n25402,5346\n25404,7811\n25405,8143\n25406,10033\n25410,6735\n25415,9116\n25419,6265\n25420,7486\n25421,8829\n25426,5090\n25431,10205\n25435,6328\n25439,6053\n25442,6045\n25447,5190\n25450,5789\n25453,10168\n25454,6861\n25459,8963\n25462,6960\n25463,8985\n25467,7443\n25468,7378\n25473,8708\n25478,4731\n25481,10442\n25486,9847\n25490,8414\n25492,8639\n25497,5352\n25498,5846\n25499,7022\n25501,7942\n25505,9839\n25506,7376\n25507,4706\n25510,5815\n25513,7088\n25515,4871\n25516,9996\n25519,10079\n25520,5045\n25524,9650\n25525,7389\n25528,8668\n25529,10106\n25534,8048\n25536,8173\n25540,9172\n25541,5769\n25546,7016\n25547,7720\n25552,8882\n25553,6956\n25558,7819\n25563,7004\n25566,4699\n25569,7674\n25572,5313\n25576,10189\n25579,10214\n25580,4452\n25583,8510\n25587,6761\n25588,10127\n25593,9758\n25596,8971\n25600,6833\n25601,7193\n25602,5673\n25606,6686\n25608,5557\n25613,10168\n25615,10165\n25617,10250\n25622,5489\n25623,7591\n25625,7832\n25630,10169\n25632,5161\n25634,5530\n25637,5850\n25641,7498\n25642,9387\n25645,8153\n25646,6813\n25650,9758\n25653,6310\n25658,9797\n25660,7024\n25665,4597\n25666,6784\n25668,7146\n25669,9745\n25674,8732\n25676,10122\n25681,7283\n25685,7263\n25688,10222\n25689,6694\n25691,6386\n25692,8258\n25694,7598\n25698,7933\n25702,10173\n25703,10394\n25704,10469\n25709,9320\n25710,5221\n25712,4425\n25714,7539\n25716,6832\n25720,7641\n25722,4864\n25726,4498\n25729,5258\n25732,5094\n25736,6279\n25739,5022\n25743,5729\n25744,8227\n25746,7540\n25749,8333\n25754,6398\n25755,7964\n25758,4418\n25759,8969\n25760,9359\n25762,8950\n25763,7455\n25765,9333\n25768,8749\n25769,8375\n25770,8506\n25771,6652\n25774,7777\n25775,10074\n25779,4659\n25780,6348\n25783,7708\n25788,8010\n25789,9881\n25791,9655\n25796,10031\n25801,10154\n25802,9189\n25805,6426\n25810,5109\n25814,9149\n25818,6761\n25821,5566\n25824,8854\n25826,9622\n25830,7022\n25831,7472\n25835,10071\n25839,8666\n25844,5090\n25849,5761\n25854,6986\n25859,6963\n25860,9675\n25864,4796\n25865,7250\n25867,8720\n25868,9998\n25869,10487\n25871,5740\n25873,7515\n25876,7224\n25880,7081\n25882,6105\n25887,8300\n25892,6343\n25893,6123\n25896,8099\n25899,7151\n25903,8647\n25908,5278\n25912,9796\n25917,8906\n25921,5325\n25923,4945\n25928,5228\n25933,5993\n25934,6336\n25935,6269\n25940,8907\n25942,5442\n25944,4566\n25945,4396\n25948,5102\n25953,6426\n25957,5662\n25962,8998\n25964,9721\n25965,4482\n25967,7521\n25972,5965\n25973,5676\n25978,9048\n25981,5196\n25982,6675\n25985,10113\n25986,5056\n25991,8847\n25993,8761\n25997,5051\n25998,5675\n26000,4879\n26004,8325\n26009,8895\n26013,7825\n26016,7047\n26018,5993\n26019,9648\n26024,4511\n26028,8572\n26033,7363\n26037,8529\n26042,5592\n26044,4834\n26045,5241\n26046,7831\n26049,4774\n26050,8911\n26052,7581\n26054,7452\n26056,5055\n26060,7628\n26065,4869\n26070,7954\n26073,5772\n26076,5015\n26078,8355\n26081,9006\n26082,6491\n26085,7733\n26087,6864\n26090,8390\n26094,10261\n26095,6509\n26098,9570\n26099,9555\n26103,4491\n26106,6557\n26108,5934\n26111,7694\n26113,7367\n26115,9936\n26119,6475\n26121,6805\n26123,8956\n26124,7881\n26128,6765\n26129,7648\n26131,6881\n26132,6100\n26135,7363\n26140,8701\n26145,9508\n26146,8369\n26151,7193\n26154,8460\n26156,5643\n26157,8914\n26162,4647\n26165,5645\n26168,7752\n26170,7254\n26171,5274\n26176,7715\n26180,5887\n26185,6430\n26189,6793\n26191,7429\n26192,6808\n26195,8758\n26196,5387\n26197,10477\n26199,7705\n26200,8864\n26205,8541\n26210,8067\n26211,7638\n26216,7428\n26220,4801\n26225,7800\n26229,9131\n26230,4547\n26231,4383\n26236,6925\n26239,7684\n26241,5473\n26242,8820\n26246,9091\n26250,6640\n26253,7879\n26255,8715\n26259,7205\n26263,4450\n26264,5525\n26269,10383\n26274,9354\n26278,7790\n26280,5017\n26284,9227\n26287,6058\n26289,9573\n26292,7797\n26297,10465\n26298,5215\n26300,9598\n26305,5191\n26308,5152\n26312,9384\n26317,8704\n26322,9601\n26323,7965\n26324,6252\n26326,6390\n26327,5118\n26332,8781\n26333,8922\n26336,6767\n26337,7035\n26338,8425\n26343,4739\n26348,5967\n26352,8099\n26357,4690\n26358,6382\n26360,5853\n26364,5802\n26365,7704\n26366,10352\n26371,4614\n26373,7788\n26378,4467\n26379,7136\n26382,5074\n26385,8358\n26390,6473\n26392,8907\n26397,9601\n26400,5739\n26404,4676\n26408,5773\n26412,7458\n26414,7417\n26415,8411\n26420,7846\n26421,7022\n26426,5272\n26430,9578\n26435,7300\n26440,4521\n26441,6827\n26444,7692\n26447,9343\n26448,8874\n26450,5081\n26454,9996\n26455,8173\n26458,9493\n26461,6863\n26466,6908\n26471,4906\n26473,8649\n26477,5645\n26481,8527\n26486,4667\n26491,6425\n26495,6299\n26499,9668\n26502,7031\n26506,8637\n26510,8275\n26514,8596\n26515,9984\n26519,5710\n26522,5419\n26527,9257\n26530,6051\n26534,10347\n26538,5049\n26541,10404\n26543,7616\n26544,4466\n26547,5792\n26552,10337\n26554,4788\n26557,5368\n26558,10430\n26563,9080\n26565,9263\n26567,6299\n26571,8437\n26576,5510\n26579,9335\n26581,8488\n26585,9449\n26590,5241\n26595,8662\n26597,5823\n26601,7248\n26602,8812\n26605,4703\n26608,7676\n26611,9513\n26612,6772\n26616,6478\n26618,5815\n26619,4755\n26622,8507\n26627,8010\n26630,6459\n26635,10294\n26640,6368\n26645,7933\n26650,6861\n26652,8255\n26656,4835\n26661,9118\n26664,10195\n26668,5310\n26670,10038\n26672,6767\n26673,8561\n26676,6654\n26677,8279\n26680,5148\n26683,7074\n26688,8367\n26691,5404\n26695,7664\n26700,7391\n26701,7515\n26705,6335\n26708,9258\n26710,9176\n26714,5185\n26717,6850\n26720,9772\n26724,8792\n26727,7381\n26732,7541\n26736,5170\n26739,4442\n26742,8342\n26745,7141\n26748,5775\n26749,7998\n26753,6517\n26756,5827\n26758,8956\n26761,8574\n26765,9203\n26766,6570\n26767,10072\n26770,10317\n26771,4509\n26772,9180\n26776,6389\n26780,8470\n26783,8422\n26788,8835\n26790,8327\n26793,9515\n26798,5147\n26803,7781\n26808,7858\n26809,6745\n26814,6191\n26819,7802\n26822,7295\n26825,5821\n26826,6683\n26831,9903\n26834,5248\n26838,6647\n26839,6312\n26841,10350\n26844,8194\n26846,9255\n26847,5159\n26850,5474\n26852,4986\n26856,9085\n26858,9866\n26859,9038\n26863,9276\n26865,4908\n26867,9944\n26871,6322\n26873,5628\n26877,7637\n26880,5344\n26885,5925\n26889,4431\n26890,7266\n26893,9524\n26897,9995\n26901,10452\n26904,6901\n26905,7842\n26909,10085\n26912,7819\n26916,8370\n26920,4712\n26923,5032\n26927,7921\n26932,8366\n26937,5842\n26938,6184\n26940,10078\n26941,4779\n26943,10131\n26945,4942\n26950,5296\n26954,6648\n26958,8067\n26960,9010\n26964,9220\n26968,5839\n26972,5573\n26975,9178\n26979,6677\n26984,4607\n26989,9995\n26990,7978\n26993,5814\n26996,6687\n27000,7439\n27002,6581\n27004,8976\n27007,8730\n27010,8493\n27013,5589\n27014,9424\n27016,7370\n27017,5177\n27018,8911\n27022,4792\n27027,10427\n27029,4957\n27033,10048\n27037,5506\n27040,8711\n27043,9100\n27048,6045\n27049,7701\n27053,4398\n27055,5565\n27056,4845\n27061,7696\n27065,7900\n27070,7487\n27072,5185\n27073,5421\n27078,7870\n27083,4938\n27088,9280\n27090,9484\n27092,5501\n27095,5522\n27099,7551\n27100,9185\n27104,6200\n27107,9088\n27112,8019\n27117,8367\n27121,6878\n27125,5696\n27128,7805\n27133,8208\n27136,7304\n27139,7943\n27141,4779\n27146,8018\n27151,10064\n27154,9196\n27157,7995\n27162,5495\n27166,7968\n27168,7247\n27170,5856\n27175,5889\n27176,5994\n27180,4434\n27181,6143\n27185,5592\n27190,8307\n27191,6227\n27193,5655\n27194,8511\n27195,8277\n27198,4748\n27200,4528\n27204,6439\n27206,7026\n27207,5484\n27211,9384\n27215,6992\n27219,6677\n27222,9504\n27223,5124\n27226,7264\n27231,5120\n27236,7651\n27238,10297\n27240,6961\n27243,8778\n27248,10199\n27253,6163\n27255,8948\n27258,8673\n27261,10428\n27266,6765\n27269,9405\n27271,6654\n27274,9331\n27278,10077\n27279,10245\n27284,7192\n27286,5519\n27291,8860\n27295,9730\n27300,9227\n27303,10124\n27305,4979\n27308,7874\n27310,8975\n27311,5387\n27315,7708\n27319,5363\n27321,6385\n27322,4456\n27327,5706\n27330,5499\n27332,9635\n27335,6804\n27338,6257\n27343,7486\n27345,10036\n27350,5891\n27355,6793\n27356,5379\n27358,8425\n27362,7018\n27367,5738\n27368,7046\n27373,9203\n27376,7566\n27379,8603\n27381,5065\n27383,5476\n27385,9970\n27387,4765\n27389,10252\n27394,7360\n27397,8702\n27400,5360\n27401,8100\n27402,6690\n27405,6205\n27410,6722\n27412,8822\n27416,9811\n27418,5268\n27422,10350\n27427,6717\n27432,9246\n27437,6788\n27439,8434\n27444,4395\n27446,9793\n27450,7974\n27452,5032\n27457,4823\n27462,6765\n27464,5635\n27469,6606\n27471,7163\n27475,5074\n27478,9162\n27480,7356\n27482,10386\n27484,7998\n27486,9476\n27489,9251\n27490,6154\n27494,9090\n27498,4944\n27499,6521\n27501,6566\n27503,9842\n27507,7996\n27510,4900\n27512,10082\n27514,4832\n27517,7948\n27522,5566\n27526,9841\n27531,9045\n27533,8380\n27536,4519\n27540,10182\n27544,4636\n27547,10037\n27548,5980\n27551,7571\n27552,10011\n27553,7775\n27557,7571\n27560,4862\n27565,6113\n27570,6242\n27574,9279\n27579,5376\n27581,6574\n27584,6126\n27585,9378\n27588,7895\n27593,9075\n27594,4549\n27595,8238\n27600,7161\n27604,10095\n27609,4543\n27612,9606\n27613,7238\n27617,5762\n27618,8489\n27619,6801\n27624,9428\n27626,6480\n27628,4745\n27633,5441\n27638,4508\n27641,5652\n27644,9721\n27649,6784\n27652,5652\n27653,9818\n27658,9831\n27659,9733\n27661,7148\n27663,8505\n27668,5135\n27672,8420\n27675,8881\n27676,6147\n27677,7359\n27680,7366\n27683,9150\n27685,6933\n27687,6530\n27688,8102\n27691,10269\n27696,4981\n27701,9644\n27705,6684\n27707,8686\n27712,6074\n27717,7295\n27720,8667\n27725,7893\n27730,4852\n27733,4700\n27736,8419\n27739,8711\n27740,4473\n27744,9992\n27745,7422\n27748,8875\n27753,10068\n27757,5261\n27761,5595\n27762,4386\n27764,6744\n27765,9403\n27766,4777\n27770,8781\n27772,7977\n27774,6882\n27776,8730\n27780,7003\n27785,6516\n27789,8375\n27792,6218\n27795,8146\n27800,10417\n27802,5289\n27805,4598\n27810,4381\n27814,7950\n27819,5513\n27820,6843\n27823,10381\n27828,10009\n27831,7755\n27836,8822\n27838,10366\n27843,10128\n27847,4735\n27850,4744\n27855,6901\n27859,9340\n27862,9232\n27866,8723\n27870,7994\n27874,9632\n27878,5201\n27881,5996\n27882,10277\n27886,4770\n27888,6165\n27891,6779\n27892,10089\n27895,7912\n27897,6163\n27902,9498\n27903,9028\n27904,4985\n27906,10252\n27907,7746\n27909,6815\n27913,6688\n27914,6608\n27919,9183\n27921,5380\n27924,7331\n27927,4660\n27930,9338\n27932,7349\n27934,5972\n27939,10481\n27941,5353\n27945,6049\n27950,10489\n27954,10057\n27956,8372\n27958,9188\n27963,8945\n27966,8738\n27970,9386\n27973,7982\n27977,10298\n27981,6724\n27982,5799\n27986,10382\n27991,5472\n27995,5325\n27997,7390\n28002,10309\n28003,9560\n28007,8741\n28010,9603\n28015,6503\n28020,7463\n28021,5527\n28025,4991\n28027,7367\n28028,6391\n28032,6718\n28036,4907\n28038,6198\n28039,4827\n28042,9447\n28043,9217\n28045,4431\n28049,4880\n28054,10412\n28059,5892\n28062,8944\n28067,6078\n28069,9020\n28071,9672\n28073,8142\n28077,5661\n28080,7841\n28084,7222\n28086,6643\n28087,7217\n28091,7845\n28096,8575\n28099,8615\n28103,9039\n28107,6371\n28111,7397\n28113,9117\n28115,7917\n28120,10226\n28122,7920\n28124,8943\n28129,10408\n28134,7942\n28135,10424\n28137,9571\n28138,5917\n28141,7021\n28144,7388\n28147,9987\n28152,5562\n28155,5511\n28156,7301\n28159,5205\n28162,9251\n28165,4622\n28167,5469\n28168,9818\n28171,6680\n28176,4560\n28177,7918\n28179,8195\n28180,6076\n28185,10256\n28190,9471\n28193,6318\n28196,5087\n28199,7034\n28204,10388\n28208,8033\n28213,7880\n28215,7978\n28219,10251\n28220,7983\n28222,6024\n28225,9840\n28227,4398\n28228,7983\n28231,4621\n28233,5038\n28236,7228\n28241,7556\n28242,9905\n28243,9187\n28248,7787\n28251,5085\n28256,8964\n28258,9109\n28263,6239\n28266,8164\n28267,9685\n28270,7481\n28274,8611\n28277,4726\n28281,6236\n28286,4949\n28289,5068\n28293,9667\n28297,6321\n28301,6540\n28305,5895\n28307,9445\n28311,5263\n28313,5974\n28316,4777\n28318,4514\n28322,7034\n28323,8425\n28325,7785\n28328,8791\n28329,8555\n28330,5760\n28335,10305\n28338,9580\n28340,4615\n28344,5068\n28346,6925\n28349,5870\n28353,8432\n28358,10262\n28363,10373\n28368,8663\n28372,8864\n28377,5801\n28381,7875\n28384,9572\n28386,7984\n28390,8141\n28394,5759\n28395,6399\n28398,6393\n28403,5734\n28407,8732\n28409,9975\n28414,7453\n28417,7691\n28419,9947\n28422,8392\n28427,5889\n28431,9949\n28434,6890\n28438,9878\n28443,9463\n28446,9081\n28451,10129\n28453,10219\n28456,6756\n28457,6313\n28461,4822\n28465,8366\n28466,9088\n28467,5041\n28472,5808\n28475,10126\n28477,7752\n28479,10142\n28484,9492\n28485,7445\n28490,6743\n28492,4457\n28496,9828\n28501,8633\n28505,8185\n28506,7814\n28509,10339\n28514,5919\n28516,4648\n28519,7756\n28524,7838\n28529,8716\n28531,7730\n28536,8743\n28537,6946\n28538,4822\n28541,9448\n28542,7303\n28544,8237\n28546,7606\n28549,8002\n28551,6983\n28552,7547\n28553,9567\n28555,6619\n28558,8746\n28562,4563\n28565,8529\n28566,10169\n28569,9893\n28573,7529\n28578,9353\n28581,9508\n28583,7824\n28587,6196\n28591,5098\n28594,6897\n28596,8450\n28598,6358\n28603,9542\n28607,6898\n28612,6363\n28617,5456\n28620,5879\n28624,7181\n28625,9802\n28630,7438\n28634,8052\n28636,5626\n28641,5989\n28642,9417\n28645,7351\n28648,7264\n28652,4694\n28656,10424\n28661,6554\n28665,8237\n28669,5126\n28674,5507\n28679,8554\n28684,6971\n28688,5505\n28690,10129\n28694,4558\n28698,6129\n28702,9403\n28706,5507\n28707,8612\n28709,8785\n28713,5273\n28715,8588\n28717,5852\n28722,5199\n28726,8046\n28728,10198\n28731,7624\n28734,7483\n28739,9664\n28741,6610\n28746,9270\n28750,7085\n28751,6863\n28755,9195\n28760,6646\n28763,10415\n28765,8024\n28770,4684\n28775,4707\n28780,6978\n28781,7306\n28785,6119\n28789,5300\n28792,5853\n28794,8628\n28799,9934\n28801,10247\n28805,8553\n28808,7428\n28809,9895\n28812,8946\n28813,9777\n28817,9020\n28821,5416\n28826,6517\n28829,9935\n28831,5578\n28834,5718\n28836,9555\n28839,4810\n28840,8450\n28843,5391\n28845,9425\n28847,5885\n28851,6758\n28854,9263\n28859,7447\n28861,4921\n28865,7215\n28868,9982\n28870,8265\n28873,6536\n28878,5067\n28879,6699\n28880,4764\n28882,5191\n28884,8852\n28885,9521\n28890,7376\n28894,6067\n28899,7284\n28902,8977\n28905,9339\n28906,6935\n28908,6883\n28913,5103\n28918,5665\n28923,9054\n28927,8363\n28929,9026\n28934,10160\n28938,5809\n28941,4407\n28942,7636\n28947,10120\n28948,9078\n28950,8529\n28955,9193\n28958,8714\n28959,4672\n28963,5157\n28964,6786\n28966,9239\n28968,5656\n28971,4912\n28975,8508\n28978,7812\n28979,5320\n28980,8937\n28985,9731\n28987,8815\n28990,6618\n28991,6317\n28996,8266\n28997,6927\n29001,8002\n29005,9397\n29009,6787\n29010,7506\n29014,9605\n29018,8910\n29020,5058\n29024,6660\n29029,7804\n29034,8832\n29037,5171\n29038,8089\n29041,5473\n29045,7054\n29047,8733\n29048,7974\n29053,6646\n29057,5740\n29058,6484\n29060,5770\n29061,9533\n29063,4539\n29068,9741\n29071,9632\n29074,6055\n29076,7023\n29080,5246\n29081,9504\n29084,7635\n29089,8792\n29090,8501\n29092,9183\n29097,6489\n29102,7565\n29104,9209\n29105,8476\n29109,7892\n29111,5777\n29115,8984\n29116,7717\n29121,7972\n29124,6301\n29127,5432\n29128,5617\n29131,5684\n29133,6340\n29134,7503\n29138,7660\n29139,5995\n29141,9974\n29143,7534\n29148,6765\n29149,6537\n29153,7960\n29157,7442\n29159,10309\n29161,6067\n29165,8363\n29166,9235\n29168,9124\n29171,4391\n29175,9751\n29178,9540\n29180,9725\n29182,10375\n29183,8417\n29186,8138\n29191,6124\n29194,5139\n29199,7981\n29201,7712\n29205,6345\n29209,8491\n29212,5892\n29215,6231\n29218,4488\n29222,4838\n29223,9511\n29225,8731\n29227,8351\n29232,8703\n29236,8902\n29238,9454\n29243,8428\n29244,7031\n29248,10140\n29250,9776\n29251,8831\n29256,10284\n29259,10234\n29261,10443\n29264,7565\n29265,5308\n29268,7506\n29269,6654\n29274,6226\n29277,7419\n29282,6946\n29286,7842\n29287,7760\n29289,10089\n29293,8536\n29298,7012\n29300,7123\n29302,7531\n29306,10352\n29309,5839\n29312,4524\n29314,7030\n29319,4432\n29324,6086\n29325,4666\n29329,9254\n29333,9475\n29336,9295\n29337,4775\n29339,4796\n29340,10314\n29343,6517\n29345,4393\n29346,7600\n29348,5405\n29350,9007\n29353,10350\n29357,9053\n29358,5831\n29360,5595\n29365,6580\n29368,4909\n29373,9315\n29376,7757\n29377,4722\n29380,9188\n29383,5503\n29386,4807\n29389,4497\n29393,10098\n29398,7192\n29402,7314\n29404,7828\n29407,7139\n29412,8142\n29413,8840\n29414,6192\n29415,6885\n29417,10420\n29418,7343\n29421,5787\n29426,5367\n29430,5003\n29432,8255\n29433,10065\n29438,6392\n29442,8406\n29445,4854\n29448,8071\n29450,9759\n29453,5546\n29455,6258\n29457,8185\n29462,6338\n29464,8842\n29467,10175\n29472,10403\n29474,8182\n29479,10202\n29484,5483\n29489,6517\n29490,8211\n29495,6006\n29499,8590\n29503,8510\n29508,7455\n29509,8886\n29511,10244\n29515,10440\n29520,8914\n29521,7539\n29526,5987\n29528,6004\n29532,6807\n29534,8803\n29539,6190\n29542,10392\n29545,8893\n29549,9354\n29552,9362\n29553,8951\n29557,7801\n29562,9923\n29564,10338\n29565,8810\n29568,9448\n29570,8015\n29574,10182\n29579,10196\n29584,9344\n29589,9081\n29594,6531\n29597,8945\n29598,5779\n29603,7452\n29606,10288\n29610,5626\n29611,7375\n29613,6964\n29616,5128\n29617,4703\n29621,10353\n29625,6675\n29630,9535\n29635,8213\n29638,7348\n29639,10050\n29640,8770\n29645,6074\n29646,9351\n29649,8375\n29652,10100\n29657,4443\n29660,9046\n29662,4618\n29665,5415\n29666,6104\n29670,6793\n29673,9473\n29676,9414\n29677,4488\n29678,6772\n29683,8481\n29688,6038\n29692,5201\n29695,4758\n29697,6524\n29698,5587\n29701,5232\n29703,9341\n29706,6032\n29709,7317\n29714,5550\n29718,6226\n29722,5179\n29724,9282\n29725,10262\n29726,5669\n29730,9493\n29734,4740\n29739,9193\n29742,8608\n29747,9091\n29748,6358\n29753,6836\n29757,10047\n29762,7418\n29764,5077\n29766,7175\n29771,5633\n29775,6774\n29778,7731\n29779,5792\n29781,5382\n29783,4915\n29784,7952\n29789,4869\n29794,9085\n29799,10242\n29804,4482\n29807,6948\n29811,7985\n29816,5607\n29819,4546\n29821,6979\n29824,4852\n29827,6907\n29828,7472\n29832,6831\n29834,8427\n29836,9623\n29841,6221\n29845,5479\n29849,7314\n29852,5573\n29857,7174\n29858,8518\n29861,6078\n29862,6739\n29865,8170\n29868,4793\n29869,5131\n29872,5478\n29875,6693\n29880,8374\n29885,7272\n29889,9584\n29893,8493\n29898,7833\n29900,8738\n29904,8793\n29905,4417\n29906,8581\n29907,4820\n29908,6902\n29909,5318\n29913,4535\n29914,5256\n29917,8220\n29922,5105\n29925,5928\n29926,9740\n29928,6048\n29933,5726\n29938,7276\n29942,5767\n29945,9577\n29948,4977\n29951,8927\n29955,9804\n29956,4527\n29961,8419\n29965,6430\n29967,5482\n29969,7994\n29971,8517\n29973,8984\n29975,5208\n29980,5215\n29981,8303\n29982,7987\n29987,7626\n29992,5919\n29993,8406\n29997,6463\n29999,9620\n30003,9854\n30004,8275\n30007,9863\n30012,9379\n30017,8257\n30019,9078\n30023,5166\n30026,9612\n30029,5462\n30030,8779\n30033,7496\n30037,5990\n30038,9448\n30041,7451\n30043,5822\n30045,7593\n30047,10273\n30050,6538\n30052,5657\n30053,6318\n30057,7783\n30059,7521\n30064,9013\n30065,9641\n30070,5794\n30071,9870\n30073,6535\n30074,9895\n30076,5989\n30078,6032\n30081,6455\n30084,7316\n30086,5942\n30090,7999\n30092,9477\n30094,6848\n30097,7896\n30099,8173\n30104,8941\n30109,5828\n30112,4828\n30115,5435\n30118,9009\n30121,6860\n30126,9902\n30128,7913\n30132,8559\n30135,7994\n30139,10273\n30141,8918\n30143,8774\n30147,8964\n30151,5529\n30154,7216\n30157,6470\n30158,9489\n30161,9564\n30162,4670\n30167,7951\n30170,4847\n30174,10146\n30175,4853\n30176,7808\n30180,9926\n30181,4800\n30186,6660\n30189,4881\n30190,10287\n30194,9331\n30198,8484\n30201,4385\n30203,7680\n30206,5654\n30211,6713\n30215,4389\n30216,5408\n30220,9176\n30221,9343\n30226,4879\n30230,8507"
  },
  {
    "path": "tidb/join/t/r1.tbl",
    "content": "1,4363123,46773,6709\n2,1431076,902781,8246\n4,2792150,84359,8209\n8,4966517,375246,7436\n9,10590291,822710,6358\n14,5452431,156645,6256\n18,1472948,617365,7746\n22,5744270,262657,6826\n24,7539335,147699,7384\n25,126086,408508,7021\n27,146482,719153,6395\n30,2000764,373418,8822\n34,7481826,890926,9733\n35,8460579,712881,7020\n37,5351465,246250,7677\n38,358942,756258,6785\n39,9873954,61813,10321\n41,8347988,595273,10684\n43,3202180,711137,7256\n45,8265445,755763,9049\n49,3109466,588588,5664\n52,2491113,418820,5740\n57,440430,640732,7680\n60,437959,773452,6236\n61,2119773,233270,8540\n64,5276326,317610,7586\n66,1592615,346750,10098\n67,3423590,28395,7170\n69,2304616,582963,10247\n73,656785,21983,6703\n78,716489,606054,7210\n79,2192181,891170,9874\n81,4316773,326507,6248\n86,3982691,650383,7980\n91,1812229,74183,8270\n95,5567934,761395,7110\n98,3179472,396854,8010\n103,8020025,797932,9044\n107,8728673,697585,6376\n108,6471797,112370,7063\n109,4414796,165203,8276\n110,6652760,859201,7329\n112,4805559,730490,9272\n113,7126477,57554,8140\n116,4356735,674060,9639\n119,10313921,511552,7685\n122,2297921,680825,9733\n123,4596887,636006,7724\n125,436116,365137,9793\n127,5588735,216726,9349\n129,3018350,796987,9203\n130,9198929,504967,6798\n133,5285566,339974,6902\n134,2755673,623233,8576\n135,10381811,168301,5962\n139,1625685,483223,7921\n142,10150457,470757,5658\n145,7590313,411865,6077\n150,6016620,471865,8467\n151,22727,626003,9715\n152,4314459,898370,8784\n153,7829051,596832,6100\n154,10465374,657760,8900\n156,2087645,437523,8490\n159,9921676,885044,9226\n161,10225398,352806,8404\n164,7213028,227292,10675\n167,1929131,222810,6625\n171,6103926,287482,7292\n174,6630303,534964,9656\n175,7415477,79789,7010\n177,7212232,829714,8110\n178,9522330,91297,7661\n182,3324270,17954,10152\n187,9549194,533329,10443\n190,280273,435370,9730\n195,9580632,360760,9826\n200,8270700,86157,9294\n203,7798317,80383,9274\n207,1722041,582628,6024\n212,5366493,504678,7311\n217,7904095,128100,10104\n220,263778,716380,6717\n221,816942,374851,8768\n222,10411057,486545,9568\n223,6645372,924205,6188\n228,2837449,623073,7917\n232,5218670,389052,7736\n234,7224272,101473,7281\n239,9601935,462729,9638\n244,5386123,590982,7982\n249,1251800,486976,10200\n251,10234131,185140,6669\n256,2973356,223024,9949\n260,1790026,399413,6410\n263,3920508,545498,9187\n264,4221626,697378,6226\n265,4186384,135411,7841\n267,2650240,115507,8265\n270,10534226,346725,8320\n272,653016,913727,5914\n277,2961953,29992,8038\n279,6921583,350504,7525\n280,6747316,514822,9373\n282,4168373,799801,6468\n284,6564602,583565,8633\n286,9916034,175801,5771\n287,9256308,112613,6837\n292,8233638,458198,8644\n293,316851,184553,9658\n296,1713971,262131,6878\n299,5443681,446679,7560\n301,3904295,716606,9691\n306,8053875,436079,9279\n307,2467940,192526,10073\n310,7519669,796886,8399\n315,3529324,492750,7576\n319,1199145,508173,7344\n323,2191346,85130,7156\n324,4459918,686798,7145\n328,7467816,630445,5968\n329,5181283,534199,9826\n331,8951483,600507,9464\n335,973283,906685,7709\n336,2915908,732320,7341\n340,6727354,354415,8492\n343,9163124,880526,10270\n346,7172090,335468,10255\n349,7506996,407610,6456\n354,2240520,759092,7809\n359,6408119,562593,7374\n364,10659664,204943,9427\n369,10609588,668542,7917\n373,2530741,496999,8983\n375,3590704,859329,9114\n379,7137600,377534,10663\n380,9267678,581337,7044\n385,6928556,452561,6114\n390,6997731,91157,6434\n395,6512076,743232,9093\n398,7334624,752384,5733\n400,10233377,829696,8676\n401,2669625,504132,9924\n403,943994,176403,9996\n405,796693,247572,10462\n407,6315795,862308,7605\n412,7118004,609029,6961\n416,9637422,818715,9747\n418,4170178,530839,6737\n422,7472357,417486,6903\n424,3190188,505009,5702\n426,5835401,341125,6394\n429,1915566,573569,8985\n432,9513111,403337,6074\n436,3025202,217531,8751\n440,5793013,865055,10589\n442,8218240,199010,9151\n443,5598863,572557,6737\n448,6738084,67608,6846\n452,9295926,560464,10347\n456,8915704,513500,10019\n459,1978665,151057,6996\n462,7067870,54318,7188\n465,2234910,356679,6263\n466,2157048,55067,9257\n471,6407073,107313,10374\n476,4688293,851415,8110\n480,6658747,82179,7318\n485,8508198,93311,10293\n490,10326628,420692,9842\n492,4404746,745556,8456\n496,7266335,224423,8980\n501,4937096,793005,6101\n502,715986,337861,6846\n507,5384318,819571,8945\n509,6346991,577171,10105\n511,6991144,388035,6019\n515,2065958,521130,7871\n519,4777277,209933,7048\n521,4440943,819505,5617\n526,4328862,588014,10203\n527,1006513,24735,10694\n529,1128270,490557,8468\n534,8385177,685583,8041\n538,357950,407908,10475\n543,3177970,53564,8358\n544,2260528,876834,9328\n545,4175921,429662,6266\n546,9638952,488553,5772\n551,10000198,426038,6972\n556,5342669,374722,5703\n559,407880,383879,8619\n564,9733718,291178,6553\n566,4180354,422778,10237\n571,7886388,747454,8195\n575,100448,713024,6700\n578,1650967,120109,8331\n581,5970993,309305,9080\n584,5776992,261845,6159\n589,6481698,375225,9757\n592,7542704,887471,8391\n596,9718801,633110,8871\n599,6750559,91993,5937\n604,116510,861222,8153\n605,9825788,871756,6762\n609,5719176,763400,7145\n610,4241752,334685,9615\n614,1397184,318290,10040\n616,2381952,317183,9194\n618,2514934,76122,8885\n621,2375594,268274,10694\n625,6220379,455394,7790\n627,542248,153942,6774\n629,3472743,784254,10270\n634,9512787,123971,7191\n639,5263073,429522,7934\n641,2324332,411824,10191\n642,10434132,391438,10388\n647,7447041,174141,6591\n650,8344620,321219,6079\n651,1174946,706295,6241\n655,1088883,211316,6578\n656,9064954,910709,7787\n659,4942912,900115,8515\n662,4958934,496639,5777\n666,8944674,707592,9338\n670,6153457,280438,7335\n675,2813565,626988,6612\n677,4680662,868406,10626\n682,7394380,259762,8543\n684,1650290,357501,8924\n685,752595,178628,10363\n687,6551835,159665,8275\n692,5233370,271438,8098\n697,8435385,416352,8756\n702,5476840,188083,9257\n705,3896141,579523,8199\n707,6098943,282971,6258\n711,2697887,692652,7817\n715,6789750,238485,7220\n719,10015474,857513,6000\n720,726486,477789,7308\n724,6662310,876579,9000\n727,2642776,895582,7874\n730,2526176,303108,7001\n731,7671902,593342,5988\n735,2975504,520367,9379\n738,6099838,104988,9223\n743,9678267,571657,6630\n744,10203330,640706,5642\n746,3053196,304139,9463\n750,1006084,608205,7244\n754,10337708,254904,6360\n757,375738,771819,10016\n760,4369712,919063,6860\n764,8347196,409392,9021\n768,9041481,876834,5733\n772,5102077,157606,10648\n777,2608061,353143,8153\n782,995724,455833,10236\n783,7684940,896762,7855\n787,3533733,315988,5860\n789,8263390,210099,9073\n794,5331922,287746,7551\n799,5836423,704052,9486\n803,7145813,78164,9873\n804,6565098,128022,6595\n808,4140553,626751,7483\n809,10418232,780755,5772\n811,7645122,293993,9297\n813,151174,248535,7288\n818,1259165,67028,6276\n822,875772,347479,9055\n825,6557177,459969,9452\n827,1558606,837033,6226\n832,3315315,783431,5631\n834,2427752,400110,7029\n835,3902769,193672,5907\n838,4882469,855579,7979\n841,9088014,779310,7855\n845,1484133,935475,5728\n849,6731120,464016,8226\n851,5675433,153141,10367\n856,6503353,513513,6527\n857,3655065,405498,9511\n861,7233164,29597,6712\n866,9426743,341199,6566\n869,3602094,215377,9703\n872,9360268,465277,7626\n876,6139520,914715,8228\n881,9868424,822460,9456\n883,3178971,893850,5872\n886,9742604,58319,10647\n888,7482862,164889,5628\n891,10050840,792375,8143\n892,4493777,34599,7268\n895,3504818,572889,7452\n898,7559016,741310,6719\n900,1220939,608366,7159\n903,5069093,495448,8766\n908,4296969,921618,6027\n910,6822716,83488,9660\n912,3930073,366545,10104\n914,3074131,400518,9208\n916,7460654,201083,5859\n919,881577,495396,9076\n924,9890555,736983,9420\n928,1409158,591133,7741\n933,5222491,487495,7743\n938,5602465,834126,8239\n941,2341915,94338,9520\n946,5288395,423820,8679\n949,1784242,185732,7733\n954,10243846,369906,9017\n958,10626225,883602,8519\n963,8246053,460835,6996\n965,2720062,520215,5830\n969,7627168,877473,8104\n971,10598798,448449,7777\n974,3294761,296962,7543\n978,8290646,484578,6240\n980,6000011,43874,9828\n983,4285404,136477,9088\n987,5119596,33225,9287\n991,1838497,855733,8837\n993,6803501,316693,7919\n996,1208186,212032,8217\n997,7865934,616305,7215\n998,8741895,914259,8362\n1000,8221761,701317,6349\n1001,495175,432536,8156\n1002,9066860,895116,6068\n1003,10113544,61864,9998\n1006,2379298,135398,6859\n1009,7290223,227152,9504\n1013,4183853,913571,8163\n1017,9712856,121778,5747\n1020,9653741,391402,10289\n1024,10500733,760329,8305\n1025,4300175,197628,9527\n1026,6916870,61041,7822\n1029,845344,408782,5740\n1032,10291093,394699,10027\n1037,5853235,525591,8148\n1040,5037730,14873,8293\n1045,9381834,262880,8183\n1047,2320410,805596,10126\n1052,1477620,68686,9900\n1056,7739230,616456,10115\n1059,1981750,88074,7403\n1064,2421317,130829,7522\n1065,7281798,707544,7466\n1067,8961454,396832,7794\n1071,6934458,861798,7093\n1074,2462965,636748,10365\n1079,5766235,835438,7403\n1082,6170645,861974,9982\n1085,650050,492441,6807\n1090,9694556,936002,6720\n1092,2335987,590437,10108\n1096,4106529,361014,9016\n1099,2441106,457485,5856\n1103,10511249,143105,8111\n1106,1301976,594819,10505\n1107,5158135,847376,10065\n1111,6672184,203160,7548\n1115,4512258,115692,8034\n1116,1766372,266050,6728\n1117,6448660,829506,9710\n1122,6267434,323265,7906\n1126,7064724,498907,10233\n1127,7200383,266333,10347\n1130,5029974,785064,6562\n1133,1718854,125473,9712\n1136,8860700,787469,6615\n1141,8126408,691306,9579\n1142,4691262,2873,8119\n1145,9334686,788932,5910\n1149,7151802,731843,8705\n1154,8775087,750436,9431\n1159,5109950,125725,6098\n1163,5656230,674111,9518\n1167,4669637,103500,6848\n1169,3623181,733693,9135\n1172,1190057,824128,10356\n1175,661058,19955,8927\n1179,6289199,527954,9887\n1180,706125,341508,9591\n1183,1424724,841030,7566\n1185,7241205,838206,7561\n1189,918585,225922,5717\n1190,6719918,679186,8137\n1194,8497203,173829,7599\n1195,5865441,424876,8921\n1199,8147287,810220,7821\n1200,870698,156829,8306\n1201,5703143,119010,9417\n1205,2520134,88808,10029\n1207,2151930,820215,6434\n1208,8233189,87013,7166\n1210,3625389,219750,9894\n1215,2340068,417774,8852\n1217,8260369,11801,8836\n1221,2964639,81926,8893\n1222,4361888,857807,10510\n1223,6304201,319236,7967\n1227,5243216,551300,9857\n1231,1200834,868050,6580\n1236,9119671,600293,10195\n1241,623250,583349,9837\n1244,6765716,324884,6607\n1246,6851804,580377,8953\n1247,2165049,843366,6849\n1252,3872866,225183,8112\n1255,4925102,796306,10164\n1259,2916985,538680,6339\n1263,3606727,724884,9521\n1268,3703651,64715,10394\n1272,5124750,825176,6550\n1277,3611397,11910,6693\n1279,7610869,709942,10373\n1284,1880715,225933,9062\n1287,10611500,583826,6900\n1292,2141204,357151,7698\n1295,1467542,215548,8208\n1296,4244900,177487,10550\n1301,7988093,158217,7500\n1304,8457377,414571,6856\n1309,10600045,2880,10335\n1312,9330890,296696,8633\n1316,1423536,453104,9008\n1319,360235,451394,8907\n1322,5909307,732264,6540\n1324,3894870,11182,6527\n1326,3970228,245337,7895\n1329,9096074,511427,9556\n1334,10472254,127253,8793\n1338,9807631,925993,6730\n1339,10220083,83235,9900\n1344,2579998,158,7425\n1348,8246385,445053,7315\n1350,6699151,694192,7102\n1352,592187,35908,8050\n1353,2924186,475141,7353\n1356,620701,178219,7498\n1360,3819348,798219,9659\n1363,5164062,822140,8672\n1366,2135874,813235,8826\n1370,8129493,805462,6798\n1372,3445876,96077,10219\n1376,10380845,107878,7265\n1377,273780,186871,9126\n1381,10472393,194780,8181\n1384,10006632,87942,9960\n1389,4448169,52964,6742\n1390,7736080,456844,10354\n1391,2981895,759217,8771\n1394,5982579,585255,8818\n1398,6947480,27432,7275\n1400,452002,663862,6727\n1404,1008282,333244,7245\n1408,6805537,119256,6333\n1413,3674889,692305,7141\n1414,6500378,364236,10471\n1418,4773336,919232,6737\n1422,305291,594559,6542\n1424,8928504,87116,7676\n1425,3007480,480519,8332\n1426,1609490,648293,5800\n1427,9527858,216365,7738\n1431,3565504,31958,9266\n1435,9035592,106482,9690\n1437,3937402,882578,5742\n1442,5174661,834923,8382\n1447,8387652,818750,7015\n1448,4012300,742341,9734\n1450,7341564,51889,10352\n1455,2364325,574675,8760\n1457,2801309,77110,7858\n1461,3863882,204722,9632\n1463,6889608,288898,10539\n1467,4137288,560424,5638\n1470,5600305,919105,7121\n1472,4502184,115539,9123\n1476,9721940,796853,6376\n1479,9830835,1123,8497\n1481,519046,828892,8830\n1482,10043646,536066,7521\n1483,5795458,397794,10416\n1487,6639419,490802,6186\n1491,368423,203999,7677\n1492,7476271,515295,7715\n1495,2916891,541121,7208\n1496,3653159,514364,7736\n1498,2153006,98242,9300\n1502,5623737,106347,6892\n1506,10418706,376228,9652\n1507,1885168,494601,8962\n1512,1055301,466964,6711\n1516,9921727,864686,8240\n1518,6545437,613322,10507\n1523,6884765,699054,6408\n1524,5209471,251687,8074\n1525,237519,252674,6209\n1526,8808199,176468,8422\n1531,9222735,755791,5944\n1533,2394489,473452,5750\n1535,7384767,918585,8545\n1537,1096290,615358,6913\n1540,9575415,414360,5702\n1541,8511450,443396,10334\n1542,994046,596936,9204\n1547,2099689,491721,8242\n1552,1361505,309028,8371\n1555,2669900,514963,6143\n1556,6096723,550136,6148\n1558,8027708,686693,9683\n1562,3207451,565945,10311\n1566,10649498,697398,6892\n1570,2934882,773636,6402\n1571,2078825,771574,7740\n1573,8396831,286727,8763\n1576,8564372,854620,10462\n1580,1883438,791001,7831\n1584,1323431,289124,9856\n1585,6078649,651164,8608\n1590,4836830,492406,5717\n1591,4801446,1032,9855\n1592,1652135,342004,6716\n1595,6356398,861614,8964\n1597,8821462,45652,8411\n1601,365435,873558,6099\n1602,7971792,732504,5901\n1607,9586193,495011,7926\n1612,7194075,483981,10036\n1617,6593509,599667,5627\n1621,4942015,29141,9103\n1626,8286450,290670,5734\n1630,8369496,921491,8512\n1633,7878723,499675,9426\n1635,1217502,745863,6902\n1639,5139242,777957,8127\n1642,9577204,320618,10650\n1645,6578540,522423,10010\n1646,4672013,6088,5795\n1648,6220952,53509,6326\n1651,5505334,605321,9853\n1652,6053794,420439,9322\n1653,3754991,61041,9060\n1657,2948397,607924,7395\n1659,7526085,472041,8159\n1660,2751725,925767,7373\n1662,4016884,927076,6472\n1664,7202228,54087,9397\n1665,9994558,357998,9357\n1668,6149420,776945,9059\n1673,7638354,691904,6790\n1675,7981773,44487,10509\n1679,2086296,778133,7915\n1682,671085,99189,8669\n1686,6832746,249297,5738\n1691,136953,888469,8951\n1694,6534082,580950,7372\n1697,10271483,853762,7657\n1699,2633012,310296,10356\n1704,10466894,136164,9278\n1705,7192757,363940,10304\n1710,10471653,937456,7360\n1715,68067,584476,8239\n1717,5021850,230501,6266\n1722,1718790,511331,6904\n1723,7300792,203029,8500\n1724,10369597,480620,7901\n1728,8810839,770592,7255\n1731,3841080,214952,8905\n1732,1983890,886024,6825\n1737,7391415,895615,9408\n1739,348806,455435,9289\n1740,10528612,90485,10046\n1742,4328463,845346,6272\n1745,397270,84249,7246\n1747,3275023,95568,9277\n1751,8130739,725121,6407\n1755,4791668,82764,10407\n1756,10521470,321699,8470\n1759,8444894,621832,7968\n1762,7715290,526708,8740\n1767,849688,80484,7756\n1770,9711611,523726,7007\n1775,7104972,747088,10322\n1777,74261,330620,9753\n1781,8561882,1794,9442\n1782,3474658,313515,6877\n1786,2959912,418323,10075\n1787,2095669,788090,8501\n1789,3180199,269535,9338\n1794,5130621,668855,10621\n1795,7098676,787364,7226\n1800,8444670,892891,8459\n1803,1236370,807861,7135\n1806,1832761,525935,7598\n1810,8593035,211806,9878\n1812,4833862,502163,8892\n1817,8387484,304440,8984\n1820,1930426,172501,7965\n1823,3789380,767351,8146\n1828,5348388,593123,7000\n1830,8157553,417227,10214\n1833,7395321,64638,10299\n1838,178646,776811,7077\n1843,9248746,316774,9517\n1847,6475880,457251,7119\n1851,5404594,351010,9677\n1853,5079320,935753,7979\n1855,10562271,886887,9459\n1860,1038961,136059,8959\n1865,2003770,572297,10056\n1866,1091778,98432,8491\n1867,8415565,279494,7119\n1869,3803427,91504,8345\n1870,2292865,476572,6087\n1871,6864477,814749,7073\n1874,4872639,73311,10618\n1876,6472040,539765,8500\n1880,6395056,902433,6195\n1881,6241646,379220,9728\n1886,5280882,368731,6635\n1890,9621278,289020,9209\n1894,3278785,475353,7675\n1896,2842574,448709,6539\n1898,8220837,613717,8891\n1902,4190642,490689,6815\n1905,2571926,334093,8422\n1909,5988490,420578,5798\n1914,8120848,857163,8678\n1919,5293700,301713,7631\n1921,8035898,205715,7352\n1922,4397314,504456,7215\n1926,10303337,716796,6353\n1927,946156,125729,7571\n1931,7103912,666674,7350\n1936,10435946,36354,8572\n1937,1285277,579441,9723\n1940,3853045,709666,7208\n1941,4388814,848215,8335\n1946,515434,869190,7245\n1951,2706286,505448,10095\n1956,5587454,547577,6539\n1961,446830,490217,7546\n1966,8828498,130224,5668\n1968,804914,68566,9555\n1970,8976176,353532,7545\n1975,1397997,807513,8188\n1976,5961607,933910,10626\n1979,1275439,87892,8199\n1984,261079,95940,10405\n1986,4916654,24522,9542\n1991,4712363,629022,7031\n1996,8638475,401903,7440\n1997,1834071,219671,8357\n2002,10152267,764953,6252\n2005,6378883,355246,10309\n2010,1105805,834700,7791\n2012,3596450,111245,7506\n2015,7898792,156111,10230\n2016,6267804,173661,10253\n2017,9661525,408321,5967\n2019,5035534,594016,7047\n2022,1116818,925940,10013\n2023,3591440,814775,9677\n2026,4426608,914158,6043\n2029,9060921,660063,6650\n2034,3505808,238569,8177\n2036,6491232,514648,6519\n2038,346180,84036,10184\n2043,1376614,740310,7160\n2047,620990,359074,8473\n2050,7563978,699933,10112\n2052,9560341,197970,8066\n2057,2788831,181416,7014\n2060,379528,255455,8632\n2061,10638259,614650,8118\n2066,9701252,868194,9480\n2067,10287509,642872,6676\n2071,692878,663283,8803\n2072,4486334,343555,7060\n2076,1751063,742486,6436\n2081,2867822,376132,6774\n2083,10185819,70807,9620\n2086,7531279,390393,7717\n2089,9796888,932280,8722\n2094,5437336,474272,7998\n2098,4223312,538153,10226\n2103,7154323,229587,8044\n2106,5250642,349236,7052\n2109,1630113,262412,8399\n2112,10641436,598956,6266\n2116,4236133,333543,6998\n2120,5192258,86641,7007\n2125,5782312,516886,8339\n2130,5338041,785350,10087\n2135,3953888,806471,9955\n2136,6593257,278864,10079\n2140,9799633,144879,9122\n2144,7527671,547406,6498\n2149,2697497,802748,9260\n2154,10478851,71173,6012\n2159,8548033,276774,9300\n2160,5213140,558196,9424\n2163,4250230,819651,5750\n2164,4826308,362583,6038\n2166,3674598,665335,6928\n2167,6676785,498075,6042\n2168,3372805,430773,8377\n2172,4048442,403727,7971\n2175,1963402,261643,6432\n2178,1241631,168710,7057\n2179,10242642,354027,5840\n2184,2475761,560804,10595\n2185,1817469,199410,8710\n2186,4776555,900983,10440\n2191,6945545,398991,7910\n2195,8669906,187863,10394\n2200,4919103,207527,9782\n2205,139625,4484,8342\n2210,4470847,28477,9756\n2212,1846438,99891,6584\n2214,6552473,556053,9919\n2217,6492930,467688,7310\n2220,1602660,752036,7728\n2223,5952875,699891,9729\n2227,7940391,192091,9006\n2230,5800445,844123,6692\n2231,5744003,617471,8566\n2233,974353,695637,7252\n2235,2210372,894225,10175\n2239,6273146,131959,8698\n2243,3776808,643495,10678\n2247,4370150,590988,9200\n2252,3118375,452310,9904\n2253,3692568,636832,5751\n2257,7962349,883346,8485\n2258,5243869,626171,9252\n2260,6772089,571106,5909\n2261,5430220,21731,9189\n2266,4373538,137376,8660\n2269,2921275,156703,7905\n2271,6900181,10784,8107\n2274,9326669,409374,6953\n2276,7028353,351001,8368\n2281,10474975,626473,5846\n2284,10233524,786781,5769\n2287,3552230,609368,8908\n2289,517461,376773,7478\n2292,9597353,653820,10447\n2293,9587592,29725,8405\n2296,6948493,557381,6478\n2297,1857096,426058,7687\n2300,1807619,49443,8688\n2301,7304655,97610,6967\n2302,5554672,209464,9187\n2307,2291109,534687,6798\n2311,5598137,927350,5854\n2312,2113492,549870,8991\n2314,2315818,836967,10599\n2316,7834047,251703,6195\n2317,998295,237575,9820\n2322,10523114,820528,6704\n2323,9030422,606612,7209\n2324,4245602,783384,10193\n2326,5170816,195197,8902\n2328,4926999,127578,6764\n2332,6531406,794256,9185\n2337,6582396,503417,9172\n2339,1382265,142414,8125\n2341,3755837,152868,9830\n2346,4662986,857553,8914\n2349,9320238,165129,6032\n2353,4153555,311409,9095\n2357,2816142,304920,7748\n2358,8611483,884602,9552\n2363,988939,422642,6912\n2368,9443422,504331,5846\n2371,9974391,475034,6866\n2373,3024907,12361,5639\n2377,4253196,287106,8055\n2379,4472652,20100,5987\n2382,10192514,305299,7509\n2384,5480790,780040,6552\n2388,2998353,642403,8292\n2390,4126236,635735,8539\n2393,4607159,581516,9216\n2397,6796351,726212,7733\n2400,2539155,264429,9367\n2403,311563,457719,7625\n2406,10224779,598693,9151\n2407,6306050,231336,6985\n2411,6627542,667329,7783\n2416,9872896,181053,5962\n2419,2243403,542899,7678\n2420,7160061,623651,8008\n2421,8063796,105943,6691\n2426,9638334,66162,5854\n2429,9186818,390739,5682\n2433,1356397,938485,7516\n2434,3419804,394897,6791\n2438,2654244,619974,6085\n2443,3203223,762150,7277\n2444,4179938,83117,8239\n2448,9631656,335003,9878\n2453,9788815,653299,5914\n2455,8956985,511890,8344\n2458,9526274,342976,6598\n2462,1618874,268548,8328\n2463,3295122,460864,10581\n2468,499938,282471,6467\n2472,9783936,574540,6583\n2473,2737388,275533,10452\n2475,4096862,164840,8395\n2478,2823144,298165,10377\n2479,6620820,248638,8244\n2484,7126638,581210,8760\n2487,8570330,29116,7290\n2488,7459782,711448,10570\n2490,4243311,846578,9238\n2494,5853082,773195,7323\n2495,5180492,831578,8866\n2497,4925851,185754,8013\n2499,2666007,94134,5758\n2503,10020694,552478,10111\n2507,10014140,585338,6046\n2509,4836829,445046,7293\n2513,7502814,50363,9670\n2514,7823064,479210,6983\n2515,8739192,657882,7637\n2520,1064330,434016,7929\n2521,6713638,406758,9042\n2523,2605230,177478,7250\n2527,5671944,741029,6763\n2529,236838,144341,8061\n2532,7716990,374714,8318\n2537,9250693,519817,10624\n2542,610942,914244,7256\n2545,6285804,786962,9028\n2546,3023064,758205,10212\n2549,252510,268321,7430\n2552,551729,627768,5753\n2555,6533226,751924,5917\n2560,3824304,902644,8771\n2565,6570495,206972,6225\n2567,10262034,606372,5674\n2568,8443384,708781,8400\n2571,1936894,572220,8202\n2576,6566700,676907,8484\n2579,1777157,718054,9716\n2580,5150861,354749,10411\n2585,9027960,328143,9144\n2587,4631423,250144,8654\n2589,10104000,224255,10397\n2592,1286630,539681,10196\n2597,185373,824238,9516\n2598,5259420,721940,6997\n2602,8935775,248118,7618\n2607,6523047,156320,8293\n2609,7289068,202304,8901\n2614,4636764,313383,6028\n2619,2977102,158898,7526\n2624,6840792,856466,7274\n2627,4750128,790297,8306\n2629,9479736,249807,7486\n2631,4912636,180111,9337\n2635,9218801,542113,8236\n2637,6506226,782617,6329\n2639,765159,583450,8549\n2641,2185537,823267,8752\n2644,2225422,724029,7367\n2648,4672551,376925,10678\n2650,3890202,241,10358\n2655,8732717,519986,9460\n2659,753733,691376,5925\n2663,10030941,916954,5864\n2666,10305523,191021,8051\n2667,5243868,396805,6618\n2668,4068049,136477,9702\n2669,9617890,376874,5700\n2674,7640236,270741,5684\n2677,8657412,318678,6900\n2678,10254203,543978,10241\n2681,8873011,899701,6525\n2684,4635799,791516,8004\n2685,10580397,912873,7453\n2689,4858403,196485,6449\n2690,5688273,74769,6950\n2694,3268859,547876,6207\n2696,10098513,392416,8624\n2700,446583,350041,9310\n2702,6246634,902251,7255\n2706,9736537,276294,7737\n2711,2522528,74319,7754\n2714,4381432,373734,8715\n2716,3222629,163550,10420\n2721,9625059,609317,10451\n2722,5002226,386708,6673\n2725,10480898,499203,7687\n2728,2942610,73985,9759\n2733,9099152,151039,7739\n2735,980342,300684,7067\n2736,8184164,720066,6327\n2740,10431269,888753,6723\n2741,4309702,414406,10461\n2746,1504075,479953,8799\n2750,9853626,680519,9975\n2753,4087425,366536,6155\n2755,1411897,922180,6830\n2758,10259840,815423,10026\n2763,4012950,651921,5711\n2766,2561155,346520,10158\n2768,1132129,518008,9222\n2770,4487313,19518,7536\n2774,6349996,270175,8577\n2778,8868624,884216,9518\n2782,630701,424843,10558\n2785,4814691,73047,8599\n2790,8710625,922634,10529\n2791,6875833,450171,9416\n2795,9738852,876011,6312\n2796,1352904,28213,6979\n2797,6248897,519071,8457\n2798,3353286,821748,8765\n2801,9898702,215069,9736\n2802,9336477,270221,6435\n2805,5084268,850597,10307\n2810,3540425,445398,7075\n2814,8840141,475989,7238\n2818,7895300,69284,7715\n2820,1472900,200410,6559\n2821,7305201,350002,6858\n2822,4509126,49447,6986\n2824,7741890,766460,5964\n2825,5885387,701083,8974\n2826,3187625,484745,9392\n2827,9228933,691638,9668\n2831,1314273,348377,7723\n2836,3621498,481378,8416\n2838,1360081,504908,10496\n2839,5163711,361448,8918\n2840,415269,741888,8926\n2841,1153042,389595,7263\n2843,8885149,802025,8596\n2846,3726746,69622,10486\n2849,1087826,911391,9174\n2851,10035592,673067,5879\n2854,6982788,828082,8992\n2855,4270,685520,5661\n2857,8300355,712053,9754\n2860,10193328,607921,5660\n2862,67477,716096,5716\n2863,5656092,787033,8502\n2864,4111594,329509,6934\n2867,1049548,428479,9114\n2871,2385887,248285,8402\n2876,4734470,786871,10612\n2877,113283,567126,7050\n2881,9321192,363787,8393\n2885,2856164,337993,10300\n2888,5622767,474774,8548\n2892,4707350,578682,6678\n2894,18668,628605,5812\n2899,9228909,703490,9832\n2903,3239390,612754,6318\n2904,4800825,564924,9848\n2909,2317793,170383,10489\n2913,994262,319448,6538\n2917,1158324,299592,6918\n2918,7948260,633404,8032\n2920,1965971,667354,10602\n2921,7612388,230304,9819\n2924,4973374,561119,7899\n2926,8647557,916389,7521\n2928,4028965,293385,9381\n2933,7563571,911249,7758\n2937,5332298,722508,10568\n2940,6812916,636611,9610\n2945,5681978,475771,8376\n2947,3760793,106639,5714\n2948,4166856,460952,10389\n2952,7112470,623972,7010\n2956,10547348,267576,7650\n2960,5792634,797757,8010\n2961,1040105,359509,9304\n2963,6820561,632734,9930\n2964,9117706,352735,10448\n2967,3376332,142916,6809\n2971,4619778,714358,10293\n2972,5377555,201711,5892\n2975,6194873,348253,9372\n2977,6733436,728253,10358\n2982,1462072,245207,9663\n2985,7401907,780919,9060\n2986,5648639,840197,6952\n2988,1601267,803230,9390\n2989,7934235,923154,7004\n2993,5867856,12959,5833\n2995,5077837,356491,9008\n2998,9959762,619974,7736\n3002,3482606,397957,8684\n3006,3196984,621226,8516\n3011,4383815,301832,6622\n3015,437271,237127,9304\n3017,9334553,21798,7405\n3020,7490532,818798,5931\n3025,241580,784360,8009\n3029,3084435,420705,7987\n3030,4924020,589261,8334\n3031,2837922,382083,10270\n3033,3274709,349405,7208\n3038,10060913,879424,9160\n3041,3807945,218856,7911\n3043,7877211,398180,10152\n3046,5267278,244186,6186\n3049,7372530,431304,10155\n3051,1378130,731360,6233\n3053,1232146,741793,10441\n3057,516443,284749,9933\n3058,319838,397400,7142\n3059,978270,639127,9666\n3064,6966490,876628,9600\n3069,601046,319988,8870\n3074,8348402,748366,7784\n3077,1281929,252506,10146\n3080,912204,813565,7806\n3085,2039911,891502,9045\n3090,6716523,210443,9660\n3094,613932,351160,7053\n3097,945854,773308,9483\n3098,3710047,24243,6852\n3100,574574,455572,9371\n3102,5310073,225398,7024\n3105,5804950,898853,8487\n3106,7531726,531089,10183\n3107,10231971,197927,8546\n3110,7337885,721175,6294\n3114,2261573,455188,10192\n3115,5777684,133632,8887\n3119,3834019,524055,8460\n3120,4654695,466391,7660\n3122,2224426,862994,5661\n3127,5489313,410659,6017\n3129,7581472,736737,8878\n3134,1237843,612682,9832\n3138,9265094,125377,7909\n3141,7314764,842307,9274\n3143,4516522,23670,5915\n3148,4517705,272001,7023\n3152,795357,281908,6687\n3154,1033148,214369,6028\n3157,300245,420159,5688\n3161,3300022,356694,10448\n3164,446385,124051,9666\n3165,9507376,749429,6475\n3170,4025355,712495,7846\n3173,1698529,865314,10553\n3176,7239262,555525,8703\n3180,5719586,428372,9922\n3185,690733,481980,6083\n3189,1791257,14994,8974\n3190,5894370,441451,5767\n3195,9399768,765944,6526\n3198,8049522,49980,8563\n3202,5020753,553170,6996\n3207,887685,236604,5833\n3212,4451550,754,9691\n3214,3048533,728206,5946\n3216,7908631,821640,7602\n3218,3314331,128644,10516\n3220,1448904,425368,6701\n3222,570322,591954,9220\n3226,8956473,920800,6865\n3230,7978070,740403,8263\n3235,3734932,272612,7548\n3239,2904730,368947,7242\n3242,8070487,716482,6870\n3246,177976,154842,9461\n3247,3895211,391820,7412\n3248,10261218,426581,9529\n3253,8367478,629039,7811\n3258,6207826,273607,7137\n3262,108394,596154,7707\n3266,1348311,192377,10526\n3268,2462742,861270,10588\n3273,9226489,906851,9681\n3274,2563826,930706,8036\n3278,2765636,142837,8184\n3281,848854,138114,9981\n3283,6226907,115989,9200\n3287,9581561,803732,9164\n3290,9654576,605191,6527\n3291,2883246,901044,7705\n3295,8504712,516964,6368\n3299,3804494,19279,8565\n3303,8217727,36783,9630\n3304,525526,809078,7660\n3305,5910324,99756,9889\n3308,8561792,530182,5698\n3310,10229512,783514,9976\n3313,3450440,79946,7301\n3318,9049053,832144,6602\n3321,4686355,142112,10076\n3324,754690,611845,7760\n3327,6361263,803849,7455\n3332,6360725,735923,7308\n3337,266322,300329,7670\n3341,9945963,122919,9479\n3346,5153324,437448,6899\n3347,10517629,235663,5680\n3351,5412727,798849,7254\n3355,3982282,210206,9386\n3360,1198804,901281,7997\n3362,959706,818022,8829\n3363,161406,5516,9823\n3367,8918950,597155,9096\n3372,8859070,422622,9971\n3377,4815912,281362,7646\n3382,8475741,862726,6859\n3385,2023686,928981,6802\n3388,8153265,796589,6873\n3390,9333227,459464,9531\n3393,7637888,87277,7844\n3397,1029586,271026,10048\n3401,9699283,426053,6621\n3404,9984104,199132,6298\n3409,2022795,785873,6380\n3410,7855055,531269,7222\n3412,1210072,370332,6631\n3417,7470471,653161,6813\n3418,8295446,32703,6454\n3419,3992587,628439,7803\n3420,6806026,889056,6366\n3423,1716054,672776,9663\n3428,8968130,869208,8552\n3429,7324417,270451,6395\n3432,5023837,852922,6978\n3433,7358245,467114,7547\n3434,8564845,402169,9662\n3436,3381931,269966,7609\n3441,4861818,269280,6550\n3444,5684505,56775,10108\n3447,8076862,845178,7390\n3448,858979,284992,9381\n3449,5925810,387428,10312\n3454,9106636,154009,6235\n3456,4746841,316913,9416\n3458,6951924,859682,9285\n3460,4042490,358981,5866\n3462,2403232,100787,9068\n3466,6399667,206911,6794\n3467,7511190,491483,5964\n3470,334808,937639,8440\n3472,1547650,104902,9445\n3476,1544010,117518,7404\n3479,8241082,138462,7951\n3483,2582692,878650,5812\n3486,8727527,245649,5743\n3488,4568305,651941,6782\n3489,6737561,877068,6178\n3491,4920925,731254,5913\n3492,4296179,918340,9577\n3497,3169889,379879,5783\n3498,4888003,398944,7229\n3501,4503115,509370,9026\n3502,1653375,614853,7848\n3503,1504091,13242,7240\n3508,8519509,451240,7017\n3512,4409665,98282,10233\n3517,287225,354620,7325\n3522,6312092,419397,7598\n3526,9486493,874913,7486\n3527,17884,842702,8376\n3529,8934017,391824,5932\n3534,8525319,516982,7757\n3535,9759683,579285,8649\n3539,5417335,869637,7941\n3544,7887617,78305,9468\n3546,9273715,870336,7282\n3550,57681,682420,10659\n3552,2409012,232771,7706\n3556,5939448,786029,10391\n3561,9095702,532593,9310\n3564,8580594,101539,6768\n3565,3153330,771104,5858\n3569,5079773,304502,7816\n3573,7149836,30872,7157\n3578,1229589,135897,9374\n3580,8905371,571804,5971\n3581,9368220,869821,5837\n3584,2495387,189308,7210\n3585,9510563,794861,6944\n3590,3040914,271126,8263\n3595,5472907,547222,8419\n3600,929224,476508,10233\n3602,8368499,657901,6230\n3603,5047839,62458,7648\n3606,4741909,509414,6586\n3609,538663,381515,8242\n3611,7125817,861905,7612\n3615,4740033,915125,8289\n3617,1042190,230660,8279\n3621,7393670,818323,6855\n3624,5376633,603214,8895\n3627,4768971,855119,8249\n3632,8140991,499342,6134\n3634,7356974,789609,9082\n3635,1210282,365298,9513\n3640,1349517,860087,10684\n3643,2663982,901153,7088\n3648,840703,113598,8587\n3651,1385871,590304,6948\n3655,7980035,95768,9948\n3659,8277625,481325,10616\n3660,1413699,320610,10601\n3661,5598721,552394,9417\n3662,10638448,564751,5796\n3666,1230707,823469,8446\n3667,5686984,360936,10298\n3668,4990655,841435,8224\n3669,9221545,337563,10489\n3670,4473862,22264,7424\n3672,9639931,923884,8365\n3675,10224857,910663,5802\n3678,6527409,193294,6581\n3680,5491949,907282,7706\n3682,6247731,84865,5950\n3685,5541313,825071,5747\n3690,10587434,240626,5645\n3694,5434710,729910,6110\n3695,9727663,15839,7840\n3696,9877523,786541,5923\n3697,4375027,687300,9628\n3702,8733075,401462,6724\n3706,7490643,103136,9774\n3711,5250115,679556,9944\n3713,10277026,644254,5816\n3714,4011547,95909,10545\n3716,172965,175425,8266\n3721,7091620,179773,6436\n3722,7304472,927952,8276\n3725,926275,498952,7017\n3730,975901,271828,10465\n3732,636438,24164,7983\n3737,2925912,315638,9134\n3738,1384359,869471,8329\n3742,1995501,704660,8466\n3745,7134138,50232,9512\n3747,7010981,370314,9159\n3752,2550227,595519,6938\n3755,5115786,691039,10512\n3758,7620364,808779,9956\n3761,5307323,220276,10662\n3766,1385410,72109,8840\n3771,1683993,5048,6219\n3775,1428370,24423,9763\n3778,2559088,15032,9455\n3781,6923275,55657,6463\n3786,2949988,168074,9965\n3791,10500637,50169,7897\n3792,5428390,441373,7003\n3795,1313714,885118,10127\n3798,1381198,895006,9765\n3799,9681210,512899,10147\n3800,6878514,897147,7817\n3805,9352585,555905,6468\n3806,10002973,267459,8475\n3808,679736,715769,9246\n3810,4248102,381271,7456\n3813,4017366,651821,9949\n3814,940332,762032,6310\n3817,9091485,389609,8871\n3822,6779420,389295,8442\n3827,7388316,453473,5914\n3831,355507,730539,6959\n3836,2504991,457932,10021\n3838,8109392,488378,6692\n3840,5294765,595552,6378\n3845,940074,497275,6349\n3846,2926398,439711,10594\n3850,4123550,207681,7339\n3853,3557245,362583,8706\n3858,8687044,163842,5780\n3862,9933049,392009,10694\n3865,5380160,698337,8716\n3868,3967511,618640,7679\n3872,7814949,60026,10220\n3877,8152156,434984,8919\n3880,7311522,560709,5932\n3883,2305615,740965,9221\n3888,10052267,608013,9573\n3890,9905395,36354,5691\n3894,6340235,186237,8282\n3895,2540160,693565,7896\n3897,4305898,479537,7905\n3899,5817558,657494,6272\n3904,10550969,367244,8055\n3906,7345521,180310,8157\n3908,6886312,657641,5923\n3913,6236505,628653,10135\n3916,10532283,574151,10022\n3920,9789793,597140,8170\n3924,8463093,61449,8632\n3927,10312393,917117,7864\n3929,1738414,572725,8012\n3932,6812053,724854,6538\n3935,8957132,788013,7502\n3940,4063033,217554,10511\n3942,207557,596823,6153\n3944,10652491,688308,7912\n3948,6783030,276217,7470\n3951,4318244,95616,9690\n3954,9081488,190389,7416\n3957,4308310,930579,8070\n3960,1281871,28873,8963\n3961,9600962,259351,10102\n3966,8776104,747280,6408\n3968,5746264,169537,10011\n3972,7632544,614675,8063\n3975,3421046,482828,6855\n3976,7224687,938120,8880\n3981,1569013,319049,9392\n3983,596796,454560,6656\n3984,2515348,349732,7772\n3985,10357307,154657,9943\n3990,1466784,356491,9592\n3994,5186435,889100,9481\n3998,6780579,105016,7449\n4001,1501804,298582,8145\n4006,6067667,618001,5874\n4010,7726115,352576,6646\n4013,2519866,626329,10357\n4018,3946801,722871,6879\n4022,7819303,867120,7611\n4026,756455,591325,5977\n4028,339407,278873,10204\n4029,9885774,187783,10634\n4032,3155080,430290,6500\n4033,3904413,424254,9907\n4035,2762711,386710,8176\n4038,1158909,358466,6703\n4042,8208165,309992,6733\n4047,7566446,702253,7925\n4052,3243564,768158,9718\n4057,2286994,3375,7491\n4059,6812788,238041,9195\n4063,10593846,421530,9204\n4067,10520155,449028,7943\n4070,2101696,430764,6590\n4073,6334844,169444,9830\n4078,7673476,902437,8043\n4082,10316184,883823,7840\n4084,2675613,412808,7369\n4088,7853982,352098,7218\n4090,4805354,650976,8369\n4091,8734598,190058,7884\n4096,681218,67485,7492\n4098,3781747,230173,9546\n4099,3988490,115995,8719\n4104,3348446,806077,9687\n4107,8122724,491388,7686\n4112,651079,9673,8921\n4113,7842556,465802,9772\n4117,7173663,623631,7409\n4121,5780437,379512,5993\n4122,4997289,452785,7736\n4126,5866982,342559,6601\n4131,3795859,130769,7396\n4134,6266215,892579,6802\n4136,8297714,334644,7276\n4138,3934278,686531,10034\n4140,211132,929997,9346\n4142,10031711,212686,8673\n4147,2723565,742453,9325\n4148,35296,146368,6012\n4151,10095200,562381,7035\n4154,9727442,11513,5946\n4158,6155449,896926,8608\n4161,1461960,553968,9876\n4165,7148173,702009,7233\n4166,6103885,517250,7715\n4169,1495505,368674,8776\n4172,5765112,246768,10166\n4174,9078927,650283,5665\n4178,1541445,137972,5873\n4183,5006982,172156,8704\n4188,6753327,156097,7732\n4190,5919531,571447,10110\n4192,4500683,32948,10533\n4193,1638812,663877,6515\n4197,4597326,20713,8768\n4202,7445989,176611,7321\n4203,3419167,296251,8154\n4208,5163187,852228,10090\n4213,10411270,707927,5813\n4216,9503470,464884,7006\n4220,4778567,603670,10396\n4222,10073417,555930,7566\n4223,2956226,389541,6902\n4226,7633085,517974,7551\n4227,9124810,15113,9718\n4229,4804007,548040,7279\n4231,5388585,88229,8904\n4235,9152596,631249,6581\n4240,10228094,649013,9927\n4242,8135008,249121,8428\n4245,8372760,115834,6616\n4246,6460877,637970,5918\n4247,7498164,406728,5772\n4250,6905370,288546,9461\n4255,7046064,523754,7704\n4259,7868517,212525,10069\n4260,4295320,511542,6588\n4262,9130747,399337,8084\n4267,6869621,174499,9429\n4272,390360,233875,9248\n4273,7762423,415525,7750\n4278,8444628,64671,9886\n4281,7636862,683083,7076\n4283,6094289,325432,7329\n4288,4310770,179933,10213\n4289,9281131,274770,8997\n4293,9578062,409414,7092\n4294,7865827,287298,10633\n4296,8718961,115855,10396\n4297,695889,485045,8489\n4299,9709860,60808,6649\n4303,5328984,26081,8846\n4306,154790,844731,9958\n4309,1782385,356650,9973\n4310,8484187,166126,8186\n4314,9913349,576971,8694\n4316,10541160,253195,7273\n4321,1979003,765862,10396\n4326,6648985,932313,7876\n4330,2471931,842935,9358\n4333,4773539,820945,8931\n4334,1324353,625242,7382\n4337,4743917,121298,6252\n4340,5176598,53672,8273\n4345,1913030,321819,8152\n4348,9676701,824719,6803\n4351,6921015,681178,8521\n4355,5079745,287894,7253\n4356,1740627,429413,10158\n4358,5024214,484255,10677\n4361,10492214,223347,9661\n4363,3754090,933999,7279\n4368,2948882,809360,10438\n4370,10666687,205103,6092\n4371,3498274,700265,9927\n4372,3641226,234683,7880\n4377,9546840,251305,8127\n4378,6024572,215718,6095\n4381,9958777,839493,8695\n4384,1953063,669815,5881\n4386,7436648,423214,6444\n4387,4260544,643706,8773\n4388,8465739,481924,7951\n4392,9883188,712820,10358\n4393,4549326,181455,9528\n4394,3798168,26672,7839\n4397,4630253,575008,8188\n4400,1847453,790549,6717\n4402,6681547,555562,9831\n4405,8547958,747294,6012\n4407,2394774,275585,9320\n4411,5161239,879863,9239\n4413,5240773,830602,7910\n4417,8924871,431824,7356\n4418,9155156,390096,6603\n4422,3348253,770467,7549\n4424,7720075,248884,9145\n4428,4916063,291502,7717\n4432,1708968,11532,6109\n4433,9563575,341439,7158\n4438,8093177,177997,5978\n4442,9665063,278240,7513\n4447,470726,676803,6053\n4448,7059059,855725,10534\n4452,1775668,476393,6803\n4456,10326491,738028,6556\n4459,5740669,663481,10253\n4463,9574615,825935,8255\n4467,1797888,192721,6670\n4471,54565,793578,8569\n4472,285778,522526,8886\n4476,10543802,127737,6596\n4479,5964906,208872,7425\n4482,95190,324593,10105\n4484,7092925,82602,6193\n4486,6055733,400147,6383\n4491,5745483,636684,9317\n4493,4017831,188636,7152\n4494,6226774,2017,6574\n4499,2454419,528396,6661\n4503,8298382,870272,8661\n4505,4798170,901354,10495\n4506,2450575,57602,6400\n4510,7036085,193758,9215\n4511,9492305,42482,9549\n4514,6898293,431814,5877\n4517,3348627,291518,8710\n4522,1669822,600336,7537\n4524,3495165,401487,6652\n4526,41000,166155,9023\n4530,8992736,254901,6692\n4534,9072255,372917,7627\n4536,6841001,926666,8709\n4541,8019405,884843,8939\n4545,9616150,115339,6404\n4547,4586746,346445,7876\n4552,7055137,9491,7927\n4556,6788832,420729,6434\n4557,3410965,351155,8195\n4559,5862019,357838,5883\n4564,4182398,35619,9035\n4569,9616870,934486,6894\n4571,5801600,49431,9792\n4573,2196433,518883,6439\n4578,470999,178492,8133\n4581,10079938,219721,7351\n4586,5408685,176777,6237\n4589,3027617,390211,7983\n4590,8896295,218066,8054\n4591,714727,312676,10295\n4592,4678971,820958,9081\n4595,3864217,115051,9931\n4598,3582372,681957,5974\n4602,7514102,774355,6785\n4607,7697471,565856,10376\n4608,1097155,283585,9902\n4610,7669743,164322,9879\n4614,1166909,424764,10654\n4619,9390892,529900,8306\n4623,3895059,442684,9982\n4624,4221928,581228,8456\n4629,4562503,414798,10173\n4633,3789958,286030,6612\n4634,2181937,542856,6505\n4635,6294336,938049,6904\n4636,6977588,560980,7680\n4639,9327995,921210,6023\n4643,2100317,408121,7199\n4645,7412641,557696,8678\n4649,6673887,577438,9850\n4652,10029193,691256,7832\n4656,5495912,759891,6840\n4657,7270664,20032,7161\n4660,8710370,690022,6058\n4662,10219111,160592,9468\n4663,8824524,78758,9677\n4664,3595111,545982,7130\n4667,5112928,59936,10140\n4669,4317266,348765,7915\n4670,3012540,156060,7767\n4671,7919119,490835,7563\n4673,8459695,659160,10108\n4675,2602733,402036,7770\n4676,702903,792099,7857\n4677,178670,331291,7998\n4679,543708,797201,7327\n4683,1497719,617203,7043\n4687,1908123,521254,8270\n4690,881320,630315,6054\n4693,7822703,602198,8308\n4697,2572164,28938,6708\n4701,6014276,860228,6618\n4703,1583526,64077,7176\n4706,9078934,808202,7997\n4707,8092701,668232,9834\n4710,6086488,82252,8278\n4711,1190590,22929,7444\n4713,1310287,432067,8889\n4718,8395847,598100,6300\n4721,6466986,306088,6394\n4726,2294170,330339,7803\n4731,5528842,177905,9226\n4732,8061146,256441,7263\n4735,5342011,454058,9022\n4739,5103652,95403,7414\n4743,8489524,576938,7568\n4744,2270235,458821,6135\n4745,7157740,766354,5931\n4748,2762356,544996,8779\n4753,6490668,835725,7254\n4754,2782855,653304,10606\n4755,2707914,346478,8018\n4758,664643,197248,10276\n4763,2895550,80759,5988\n4765,9144837,501831,7072\n4770,6250132,667303,7122\n4772,2303574,786320,7002\n4777,10380980,463826,10410\n4782,1574890,155508,9663\n4784,2234024,286200,5936\n4787,8439729,30203,7604\n4792,832832,370166,8453\n4797,3621382,181625,9331\n4800,4502672,141014,10652\n4805,4642939,518683,7712\n4810,9746903,883807,6358\n4814,9980253,618661,8019\n4815,1004598,745164,10060\n4818,6684375,444934,8664\n4819,10547433,268575,8628\n4820,5840082,30686,7087\n4823,10322044,444365,10682\n4825,3024946,524559,8394\n4826,1698428,812023,9631\n4830,544385,157245,10468\n4834,5516159,545469,7290\n4837,3004480,131984,9499\n4838,1920741,867259,8901\n4842,567613,393105,8001\n4845,10181416,871976,8810\n4846,9795753,126767,7454\n4850,111110,85754,9447\n4852,2208501,679252,9956\n4853,1850507,126922,6560\n4856,4679645,534212,9487\n4858,10380465,26945,9806\n4860,4875962,206338,6891\n4862,6740420,18017,9051\n4865,5535819,537416,7370\n4867,7337434,1859,8876\n4869,7832886,918909,10486\n4871,9650027,40805,8153\n4875,3458238,274393,6652\n4877,8121820,25818,10383\n4881,309384,213456,9070\n4885,7955547,332503,5807\n4888,4474573,367204,6944\n4891,740574,161524,6922\n4894,119521,43967,9467\n4899,3635227,683855,8216\n4904,3135628,226726,5898\n4905,8865547,532057,7368\n4908,5848536,2042,7851\n4911,9695945,886904,5935\n4916,5033025,802224,10429\n4918,1471524,281474,6280\n4923,6905831,718271,9937\n4926,8736277,763047,10393\n4930,3342374,569117,6134\n4933,10638727,303464,7392\n4934,7255534,277971,5868\n4936,3821535,554884,10468\n4937,923889,606479,8538\n4942,1156563,260578,8098\n4947,4594664,880663,10462\n4950,3598773,238319,5656\n4954,6145640,763506,7233\n4957,9922476,335877,10540\n4960,9733331,676005,5622\n4963,8259257,544061,8520\n4968,978780,253002,7458\n4969,8046271,74639,7243\n4972,393853,538342,10540\n4977,10219891,319259,9034\n4978,269102,546671,9569\n4983,8783071,902275,6812\n4987,2790456,851684,9614\n4988,7319712,202361,8657\n4992,722105,819900,6812\n4995,2381109,846694,7182\n4997,4092869,726142,7193\n5002,7533351,84009,10616\n5006,5167235,674461,7106\n5010,10609293,289645,7137\n5012,9136034,682806,7156\n5013,8907932,54900,7623\n5014,2507323,887516,5676\n5019,6271859,796393,9905\n5021,103542,548955,8454\n5024,5573501,445317,8580\n5027,1206469,3100,7791\n5031,714419,614478,6522\n5036,4359232,314081,5703\n5040,6406530,762440,5647\n5041,96891,76819,9778\n5046,1894575,552654,6514\n5050,2589374,100324,7674\n5051,10519795,153518,6378\n5055,7746223,610582,9342\n5057,3706775,692154,8707\n5059,8116737,444503,9097\n5060,3973452,405568,6948\n5061,6440900,348408,10657\n5066,365872,284098,8058\n5068,4425942,446625,8747\n5069,8177039,271384,7138\n5073,8415717,625364,9427\n5078,3632822,922018,8099\n5082,2378029,16362,9029\n5084,8840850,468119,9787\n5088,8143851,822072,8690\n5090,10652032,364053,9308\n5093,9156699,480568,6967\n5098,877120,555836,6628\n5100,6630878,725570,10619\n5103,6760723,640790,6504\n5106,655844,88881,7756\n5111,10499407,615085,7992\n5112,3309578,664062,8628\n5116,10028564,157152,10548\n5118,407661,120354,5727\n5119,7664029,766933,9545\n5120,7150888,197249,7144\n5125,8010256,299597,7071\n5126,4690526,800160,7309\n5130,6892696,13802,5992\n5131,2866960,233971,5684\n5132,8128621,592080,7347\n5135,3037861,77221,6075\n5139,7229312,196390,7564\n5143,7859368,433925,5869\n5146,10061576,41979,9979\n5151,1065660,477340,6855\n5152,980387,678283,8810\n5154,1793294,446435,6967\n5156,1347100,577781,6439\n5160,589579,169402,8178\n5165,269083,768411,10160\n5170,474134,335199,7198\n5174,9254020,372057,7189\n5179,7543058,877596,7074\n5184,5616723,861414,7532\n5187,8346724,894628,7815\n5188,5949944,930256,8738\n5192,5063079,864007,8830\n5196,2264140,271278,7690\n5199,9090707,549581,7232\n5204,8077864,468602,8148\n5205,8594838,463580,6169\n5209,6088559,197912,6748\n5214,811613,763728,7522\n5216,386474,769303,7516\n5220,5727576,55633,6490\n5225,3558209,710812,6846\n5226,7320116,646568,6860\n5229,3162185,172059,7190\n5233,9301919,747226,8326\n5235,7813580,555222,9658\n5239,6627114,803914,6869\n5242,1438482,637491,8778\n5243,4470797,610813,5981\n5245,10524014,233915,7099\n5249,7672899,300160,10573\n5252,3207835,719169,8893\n5253,73283,827912,6754\n5256,2382678,934695,6287\n5261,5030823,634489,8750\n5263,3229470,409198,6850\n5264,5745526,53628,10627\n5265,3175880,819192,7433\n5268,705739,711374,7668\n5272,4722470,578171,8798\n5277,514833,274906,6494\n5280,412451,347379,10270\n5284,9426901,590828,9010\n5287,3173461,44607,7834\n5289,1746095,755553,9454\n5290,1442142,308662,6556\n5295,933212,443575,5979\n5296,5213534,111572,6432\n5297,112509,208349,6135\n5301,10290403,564064,7675\n5302,6514957,542961,10412\n5306,7447917,39802,6083\n5308,3311493,514907,6288\n5311,5766922,130284,9037\n5315,7078460,187670,9380\n5316,4700192,245835,9369\n5318,7273061,891151,10573\n5320,2227963,90146,6147\n5325,798844,833518,6014\n5328,1836032,140160,6450\n5330,8404853,875262,5735\n5331,3325817,418087,7956\n5332,5896922,138708,7427\n5337,6333410,632391,6352\n5339,8349924,874333,6407\n5343,9371084,757799,6745\n5344,1231416,635216,5731\n5346,4610035,638023,7353\n5350,5909395,678929,7490\n5351,4591672,271438,8925\n5354,1062399,625734,8642\n5358,3450674,257478,8288\n5359,3283056,846414,6776\n5363,8229412,159893,10117\n5368,9945519,758957,7546\n5370,9720246,367529,7695\n5371,7815482,775450,7474\n5375,3935978,794016,6314\n5378,9846327,108700,9012\n5382,6035296,519355,5766\n5386,917051,595306,5729\n5389,10257956,517208,10079\n5394,2311634,19874,7848\n5398,1657554,524738,9670\n5399,7526298,218119,9613\n5402,7124375,175343,10143\n5405,6195591,885238,8691\n5408,4105579,815751,7773\n5409,9878815,37661,10546\n5413,2777619,303914,10689\n5416,2960341,206597,6548\n5417,5434910,903247,9479\n5419,5132428,829808,6137\n5422,37239,167486,7847\n5424,3276446,817240,10077\n5426,2286455,541437,7237\n5428,1490580,421793,9115\n5430,10441940,927707,10371\n5435,7876665,718214,5908\n5440,885654,683339,6444\n5441,338869,871229,8316\n5445,8115464,259645,7171\n5448,3454949,162932,8909\n5452,359849,233095,6934\n5455,795360,92199,7331\n5459,6983845,876005,8546\n5460,9279682,331453,6211\n5461,28094,497930,10593\n5464,6456790,238840,6664\n5469,2906498,34926,6946\n5473,4892729,250668,10428\n5476,7882635,141733,9385\n5481,10000729,147788,9918\n5484,3530616,841929,10066\n5489,10196235,762486,7386\n5492,1984279,265596,9128\n5494,1631995,589485,7253\n5499,9622395,297705,9282\n5502,9049548,528977,9398\n5503,8274825,28496,9967\n5504,9020330,651439,9199\n5506,8037907,895797,10258\n5511,9401950,623396,7887\n5513,1816029,175963,10089\n5516,3047383,393436,6123\n5519,5239404,543987,8665\n5521,4841536,884468,9439\n5524,6018501,437926,8677\n5529,1219390,541754,8738\n5531,4989165,122403,6942\n5536,2039871,269521,10600\n5540,3516498,922278,7610\n5541,3632860,828164,7759\n5542,2840424,549047,8153\n5543,10576285,154736,9775\n5546,9191099,886144,9559\n5548,7312012,392215,7817\n5551,6300674,386626,7415\n5552,8292353,733532,8318\n5553,9496713,763657,8429\n5556,6413360,181871,5982\n5557,7467972,7185,8650\n5561,5577443,624855,7793\n5564,9400733,842028,8648\n5565,3236780,932659,5878\n5566,4650998,125711,7252\n5568,4976778,431406,9328\n5572,6169362,684004,10213\n5576,104684,580950,8779\n5580,2398406,777923,6866\n5584,5233890,862235,8075\n5586,4119410,702734,6363\n5590,961785,825073,5699\n5595,10662425,728680,7696\n5596,8984594,389332,8665\n5597,10113231,308247,6167\n5600,5063681,371227,8261\n5601,2432873,603776,8964\n5604,8318084,63643,6735\n5608,7517574,895418,6446\n5610,6910557,231795,8913\n5611,9746000,291818,9822\n5616,130723,866953,6652\n5620,4556394,869710,6634\n5621,7029552,686746,5950\n5622,6384186,883933,6525\n5626,4584795,567198,8336\n5630,870121,800689,9151\n5635,10400766,402146,8017\n5639,226072,786112,7035\n5640,4129940,231583,9866\n5641,2840804,451891,6379\n5643,754039,67491,10232\n5646,1070059,236572,10237\n5650,5255457,93426,9476\n5655,4406859,834955,10376\n5660,9457408,564386,10632\n5662,4526952,453898,9627\n5664,10597648,77442,6069\n5667,2089369,111496,5922\n5670,5111259,551826,6212\n5672,4883240,912846,7719\n5675,2496580,404694,7003\n5677,4232979,740244,9191\n5678,3685524,348511,10154\n5679,2891922,444768,7903\n5680,9419771,139844,5740\n5684,3371234,562437,7479\n5686,6577070,553167,6496\n5689,9394998,627822,9602\n5694,6804449,374115,7471\n5697,8519249,654441,9967\n5700,2344068,37284,7953\n5701,8710486,515402,9065\n5706,7969406,112413,9479\n5711,3512293,682063,9162\n5716,8887871,832716,10323\n5720,10122927,656499,9836\n5722,8244879,707540,8479\n5726,724222,647,5658\n5730,5713688,183592,8913\n5735,3441218,422033,7848\n5740,3737061,378173,7093\n5744,2839598,502989,6909\n5746,9438585,111116,7830\n5749,4157951,188695,6044\n5754,3913439,128063,7851\n5757,5655260,254323,5786\n5762,6633325,290121,8642\n5765,2024994,141895,9683\n5766,2048368,353778,8985\n5771,10355836,875869,6353\n5775,8913810,747254,7633\n5779,7056202,801459,8096\n5781,3718358,245389,8009\n5782,8051197,885211,6171\n5784,2829080,79936,8739\n5788,10400648,342006,7281\n5789,5910381,77048,8829\n5792,1590228,169535,8085\n5794,2293123,860816,9600\n5798,8761853,736637,9544\n5801,517590,432871,6173\n5804,6895357,431830,10273\n5809,7993530,736972,10578\n5812,8567655,200695,5700\n5817,3726031,894527,6410\n5818,5966023,116621,9391\n5819,7232818,928536,8661\n5821,6387387,191021,5742\n5825,4329846,566722,7654\n5830,1011366,887906,8077\n5832,50800,343796,7659\n5835,5531128,56825,9923\n5839,10121218,856439,7540\n5844,8520035,482452,10220\n5846,1119415,187022,5617\n5849,9760704,473878,8939\n5853,3743863,207301,10069\n5857,5574680,280920,8788\n5861,5716874,479524,9447\n5863,8384141,522484,9411\n5864,6772694,666622,9411\n5865,9353018,657198,5630\n5870,659356,31974,10076\n5873,5201518,743713,8281\n5875,2273816,934202,7153\n5878,9006035,670600,6579\n5879,1049250,200765,7232\n5883,8634387,798404,6920\n5885,6680949,656960,8126\n5887,3498879,903702,7790\n5889,5462455,934457,10603\n5894,7484250,819262,7465\n5899,124979,831042,8758\n5900,6634021,871390,8899\n5901,821099,294851,8737\n5904,1205491,183608,8857\n5909,38499,355657,7453\n5913,913106,566856,8900\n5915,9773107,859842,8562\n5917,1897099,29074,5658\n5918,4762749,654010,6731\n5921,8664132,862423,10158\n5924,7486682,542682,8738\n5929,6149131,784635,9709\n5934,6419014,645028,9312\n5936,7808762,511418,8061\n5940,1327384,676387,9056\n5944,1258591,498666,7508\n5945,5761076,435300,9648\n5949,10206259,397276,9109\n5952,7094787,363386,9578\n5957,2400850,921527,10688\n5962,3593692,732601,8946\n5964,10016310,415643,8723\n5965,5196358,811386,9857\n5967,2456005,619348,9897\n5972,9283129,350370,6862\n5977,1011063,8065,9572\n5982,10116851,24468,9964\n5986,6510936,577023,7138\n5988,1929898,775218,7725\n5991,1929498,875373,10242\n5993,6927203,651329,6471\n5995,2206324,60904,10426\n5996,196462,333498,6381\n6000,5569557,472008,7669\n6005,992581,362875,9419\n6008,8242271,118780,8338\n6013,3096732,208047,8278\n6015,1016270,441889,5905\n6020,8322902,151342,7756\n6024,1984248,188283,5906\n6025,8135863,836879,6453\n6026,9037873,374334,6834\n6029,5794499,129639,9752\n6033,5688401,864138,6781\n6034,8950846,441561,9495\n6038,9665192,894965,7159\n6043,8053523,543742,7601\n6046,9584127,658298,10156\n6051,4884783,201985,9167\n6053,8299014,325295,6740\n6055,9666185,792732,6437\n6060,351000,682928,7282\n6063,8793929,763729,5855\n6065,8789802,251508,9371\n6066,4356365,230853,6786\n6067,8256515,98028,10436\n6070,2497349,106558,10626\n6071,5393184,666562,6144\n6075,9409084,152081,10204\n6080,5688560,312059,8429\n6082,2427413,918511,10560\n6087,9287689,455974,10299\n6092,4375382,349432,9324\n6097,4502466,722479,6469\n6099,3369268,651333,7598\n6101,229908,297983,7258\n6102,4049216,43036,6119\n6103,6110890,853862,7255\n6105,2825758,531923,6733\n6109,10305198,450144,6336\n6114,2973259,481358,8418\n6119,6220974,29757,10042\n6121,7851661,252569,7549\n6122,8698706,482570,8008\n6126,5445969,475058,7353\n6128,799213,110631,7621\n6131,8294223,7021,7877\n6134,9627445,820099,9719\n6138,1208231,306395,8246\n6139,5871207,769474,7292\n6142,5976781,453009,9229\n6144,7897238,439247,9868\n6145,7051987,765591,10331\n6146,6435040,688876,8011\n6151,2796969,156281,10316\n6154,5542525,661421,8581\n6155,4665813,68350,7783\n6158,8753271,354151,10638\n6161,9648506,719518,8923\n6164,4238807,643485,7955\n6168,1529452,217034,5902\n6173,6321157,816976,10681\n6174,2880706,361667,9470\n6179,9922357,453009,8905\n6180,10634641,567945,6927\n6182,7756755,12251,10662\n6185,6148582,454260,5626\n6190,7145597,602285,10301\n6195,508260,729709,8878\n6196,8194846,802350,6105\n6197,10300411,226552,9528\n6198,7017927,633615,6876\n6202,10286918,399338,10525\n6206,9947533,5183,9638\n6211,6205197,305407,8749\n6214,2629596,835959,8745\n6218,9375873,766141,9302\n6223,6565171,80191,7909\n6226,6714107,545965,9257\n6228,5387884,741530,7160\n6232,8674701,885966,9016\n6236,7794746,77577,5704\n6240,2297983,712802,5730\n6243,6050980,688469,6650\n6244,4646401,839576,10437\n6246,8052064,841735,9740\n6247,3491041,71166,9719\n6250,4419005,917408,10489\n6251,5350898,626816,7923\n6252,7374633,500604,9958\n6254,4929047,308267,9195\n6258,1279349,231020,5888\n6259,9388969,410437,9356\n6264,9720739,238343,6372\n6266,1887260,665859,10680\n6269,3725678,97694,7966\n6270,6992782,724610,5998\n6272,2133994,164466,6508\n6275,2089507,758336,5674\n6277,2997272,403050,8437\n6280,4293505,44876,9057\n6282,2075435,744082,8342\n6285,1838118,477886,10061\n6287,4075201,73746,8139\n6292,132955,596973,6508\n6293,7836129,459304,6472\n6295,8294077,373651,7345\n6297,6822714,150230,8773\n6299,6685693,209963,8735\n6302,2822706,709139,9292\n6305,2966955,400564,6886\n6308,1810023,627610,10405\n6309,227447,402046,10006\n6310,5563120,42614,5991\n6314,867657,918695,8709\n6315,875127,802648,6519\n6318,7623440,659277,10000\n6321,2360629,398652,6048\n6325,2437149,62235,6447\n6329,8675085,525989,10089\n6333,3790221,396841,6657\n6335,2728984,529158,8386\n6336,6695187,190257,10262\n6341,8367021,504724,9839\n6344,7337096,378362,7089\n6349,1401867,31731,9350\n6354,3542336,732775,7140\n6357,9256966,753969,6328\n6361,9645610,479747,6406\n6365,5842332,783597,6158\n6369,9922314,476014,5639\n6370,4082773,933183,7099\n6372,9945336,579972,6663\n6375,2714745,678081,8653\n6380,9398465,370733,10443\n6383,7839074,480921,9748\n6384,2173399,172155,6002\n6388,5627823,747340,9058\n6392,6885517,711579,5979\n6396,512754,936731,8302\n6400,7806395,868656,6852\n6401,7946530,236222,9165\n6404,8131705,845296,6898\n6409,1791759,787994,10632\n6410,7044381,468249,8540\n6414,7025663,240003,7455\n6417,1535515,432763,7903\n6422,253700,392202,7874\n6425,7986921,628219,8096\n6427,420444,172646,8286\n6432,8486446,586134,8916\n6437,4120073,348164,6466\n6438,10252938,519932,7302\n6442,8097032,406100,8158\n6445,6747283,534332,8847\n6448,6739025,442626,8380\n6453,6575276,710349,6819\n6455,9913903,624296,9826\n6456,2402872,88296,6783\n6458,6861297,725941,8223\n6463,9195874,53855,8994\n6464,2845294,552108,7493\n6467,9917426,710182,9473\n6468,2453014,57215,8542\n6471,292738,223369,6255\n6476,6109134,276729,9909\n6479,4243807,498375,10473\n6484,557427,650607,6033\n6487,3664862,457751,6618\n6490,7191419,628922,6385\n6495,1286248,779470,7702\n6496,6973456,445805,6216\n6499,4471767,444149,7525\n6504,4153355,272743,7910\n6508,6800700,117924,6436\n6513,1817336,751826,7307\n6515,3561752,576146,8201\n6516,6073420,845414,8984\n6521,9193026,87402,10535\n6523,610685,637017,7641\n6528,9388582,57888,8193\n6533,3572518,884548,6893\n6535,7851825,318847,6728\n6538,6537956,103380,6878\n6539,10196127,85444,10021\n6541,6998690,701854,7260\n6545,8903794,776842,7013\n6547,6293755,186296,7582\n6550,7575189,594548,7750\n6553,3481073,394282,6952\n6558,3586866,471205,8736\n6559,2277383,151709,9531\n6562,867036,543951,5964\n6567,3095887,424980,9812\n6570,801706,608357,8284\n6575,7265478,702295,10671\n6578,7000505,758455,5710\n6582,2485259,438573,5968\n6583,3114929,682614,9144\n6584,7555284,230428,6606\n6585,6802147,772464,10557\n6588,6089034,713083,5847\n6592,10669362,136796,8803\n6595,6857090,646137,7577\n6596,8901464,319378,9977\n6600,10137132,101858,7984\n6603,9187592,476545,7831\n6608,10080827,680682,6387\n6612,9881195,774140,9692\n6617,6426266,1889,10627\n6622,8145270,559262,6383\n6627,9657802,578623,9034\n6629,2793606,498183,7158\n6634,1278423,191677,8836\n6636,6553445,113918,8963\n6640,178920,659314,8815\n6644,8859250,115482,7972\n6648,4981014,436292,9895\n6651,1534584,90419,7939\n6656,4308430,62116,7794\n6659,1574825,206911,9578\n6660,5311181,521502,10639\n6665,1090416,290266,9971\n6668,3715973,577043,9309\n6672,731683,222818,9622\n6673,2142527,431232,6654\n6676,5657932,817186,6723\n6681,4866789,502987,7263\n6683,10323218,224175,8480\n6688,3378651,743478,8095\n6692,5292968,3896,8914\n6695,6185471,50549,8267\n6696,1457215,418711,10302\n6700,9949964,721214,10254\n6705,2828947,647534,10415\n6709,3088062,300406,10129\n6711,7822588,373117,6959\n6715,8518188,669326,8362\n6717,5595847,697838,6211\n6718,2407525,339963,6335\n6722,7703162,922427,8106\n6727,1799343,553105,6985\n6732,615798,28003,9467\n6736,4420535,253856,8595\n6741,6883048,809715,7393\n6743,1796782,15780,9613\n6747,7104400,819044,9702\n6748,5553514,317439,10375\n6752,2269391,212766,6283\n6754,895258,207139,7568\n6758,8074056,699080,9904\n6763,5700748,491716,8247\n6765,840630,253242,6330\n6766,7326475,602535,9904\n6769,1234503,795933,8299\n6770,7851756,423854,7829\n6771,4280636,248854,10685\n6774,2274463,892159,9037\n6775,2921537,481879,6467\n6780,7816110,541650,9299\n6782,9762318,102496,9952\n6783,6700829,528897,8706\n6785,3672564,845220,10355\n6786,572558,12705,6625\n6787,2527695,758717,9674\n6792,6968204,402990,5763\n6793,1375304,834608,10686\n6796,360465,44199,5710\n6799,8459209,562718,8330\n6803,2430730,903188,9982\n6805,7903881,119868,7319\n6810,491631,233244,6734\n6811,2629434,893742,5814\n6814,589801,458880,9290\n6818,1235438,102108,7146\n6822,8757984,575072,9842\n6823,2288263,324644,10189\n6827,9992289,311377,10499\n6831,581566,703999,10657\n6835,8711621,612133,8582\n6839,8005484,746154,7430\n6840,10634999,313604,10050\n6843,10606711,895796,10158\n6848,3484056,912945,9360\n6850,9257083,432462,6035\n6855,8244093,507706,8346\n6858,2500930,425287,8420\n6859,8046088,87540,6543\n6863,10328928,479353,5652\n6865,10670987,636808,7979\n6867,9893461,464033,10243\n6871,9032491,727574,7782\n6876,7743975,909295,10594\n6879,4077462,554120,9332\n6880,6977979,43758,10161\n6883,4597304,180127,6486\n6885,7590645,809682,7780\n6887,5164216,503377,9296\n6891,5487789,172015,8189\n6895,1608184,156796,9962\n6897,887916,288835,5946\n6902,4712397,110867,6973\n6905,3237959,717812,9274\n6910,10031699,41662,7801\n6913,7423960,859019,6761\n6915,2911669,254145,8545\n6918,4480656,518398,5898\n6923,2369928,700061,8744\n6927,9292918,379194,10002\n6928,1908766,616237,10215\n6930,7968958,318121,10314\n6933,5142715,862976,10078\n6937,568410,595773,8829\n6941,2990289,575964,9073\n6946,1694704,732852,9859\n6949,6871461,445455,7481\n6954,407944,733745,10388\n6957,8632911,179271,6109\n6961,2205422,430644,8090\n6963,9344299,645994,6137\n6964,7001595,921036,7367\n6968,9638428,876849,8011\n6969,8890947,458431,7198\n6972,3604600,218331,8939\n6977,3732569,619648,7132\n6979,4717671,859239,9418\n6980,8271002,591899,7973\n6984,2896942,387307,10042\n6986,5102478,385679,10049\n6989,8734954,366403,7863\n6993,3028778,205122,10594\n6998,3587874,59037,7628\n7001,2157749,501878,6595\n7005,2346332,330328,8602\n7010,6893426,401836,7102\n7013,182337,313103,9856\n7015,932845,272415,9661\n7016,8584508,444739,8945\n7019,4122291,167944,9151\n7022,5793134,540308,10504\n7025,1754569,482517,8406\n7026,4343733,788339,9085\n7028,7051641,136495,10316\n7032,2567951,585420,8182\n7035,6263879,157145,7351\n7040,9261028,869924,7354\n7045,1159941,872499,6839\n7046,987198,36720,7631\n7050,1889700,493232,7009\n7051,8263207,32538,7652\n7055,2557127,215450,7160\n7060,3363490,627736,7613\n7064,9256118,298558,6163\n7068,8988092,847466,8662\n7073,3239058,867059,7221\n7075,5874532,242796,7007\n7077,6517393,365559,5652\n7079,9909170,148511,8506\n7080,9163521,33321,10032\n7084,3554344,666647,8116\n7089,8370516,836562,9330\n7091,491220,385786,8520\n7096,8251168,476431,7555\n7100,3815963,171707,7631\n7101,9947884,900158,8942\n7102,5749106,344973,7432\n7103,295611,55915,9107\n7104,8851376,342830,6987\n7109,8440351,435377,5927\n7114,5797128,336172,8117\n7119,9520349,400891,9119\n7121,8585273,81835,8358\n7124,5157672,66901,9113\n7126,6486118,481590,7497\n7131,3579648,608143,9307\n7136,7056765,306790,7301\n7138,5666981,447085,8608\n7142,10353829,465269,9204\n7146,10072169,461021,7804\n7149,9928556,301314,9482\n7151,8049200,803857,9981\n7153,8813266,741452,7095\n7157,8358904,321098,7372\n7162,2932815,258248,7266\n7163,4041370,481450,8953\n7166,1815300,677571,6358\n7169,3979106,352428,9130\n7174,8538927,511494,9819\n7177,2803000,67075,5923\n7178,938319,546394,7711\n7183,1360225,45380,8287\n7188,4466008,680760,10164\n7192,6686988,324001,8174\n7197,6409954,303180,5702\n7200,5074815,142919,6125\n7204,8081522,447001,7254\n7209,5463837,141539,9601\n7213,5482674,879305,7713\n7215,10615499,19484,6328\n7219,1345347,318584,9507\n7220,10522979,392895,9676\n7221,7118851,773511,10273\n7223,4999086,595730,9812\n7227,6246012,204246,8067\n7232,2472979,346561,6404\n7236,2820351,593424,5617\n7238,9713148,663508,6584\n7241,5182367,419376,6210\n7242,7037840,61677,7704\n7243,9817582,874003,9968\n7245,9833490,694881,5729\n7246,1076590,632550,7051\n7250,4306686,835314,9343\n7255,9185972,493969,8974\n7258,6290460,266774,8694\n7263,4611554,22381,7130\n7268,689848,684646,5758\n7270,5863080,458348,8571\n7271,8144948,362476,10333\n7274,10052745,839790,9399\n7278,6770239,151866,6286\n7282,6913018,900851,6987\n7287,4784626,359018,9723\n7291,3991684,133465,5925\n7292,6074326,869601,8848\n7293,439413,507503,6860\n7298,9299795,534468,7694\n7301,3920210,127036,10080\n7304,2310780,674356,8184\n7306,5605948,151489,9226\n7309,6906191,398538,7372\n7313,6304035,527433,6801\n7316,5722272,502042,8480\n7318,498587,69357,8965\n7319,8292921,363514,6389\n7321,4768245,304597,8064\n7325,1216840,369159,7347\n7329,8129342,330900,9732\n7331,10440201,179894,10477\n7333,8752738,524884,7661\n7337,3537621,505873,5909\n7342,6718745,800728,7006\n7344,6246615,423269,9760\n7347,2548729,326753,10523\n7348,1914123,129704,9668\n7351,5372630,517500,8036\n7356,829955,17557,9784\n7357,5786956,475132,7674\n7360,6222345,464485,7998\n7364,6788098,562800,9570\n7367,8650594,879417,6309\n7370,8146895,23064,8301\n7375,9760309,927288,7345\n7378,8385133,444993,5915\n7380,8851620,97493,7041\n7384,4844707,774843,10456\n7389,7453767,794546,9213\n7393,3475232,163669,8868\n7395,4334109,39994,10255\n7399,9027420,517076,6600\n7404,2162722,854066,5617\n7407,1455513,706688,7058\n7408,9011709,67750,7811\n7412,6057481,314998,10154\n7415,10119749,154270,5722\n7420,4627057,623313,7811\n7425,5305194,703137,10209\n7426,7959097,272348,9547\n7430,9352247,839576,9875\n7435,514135,606379,8156\n7438,6174700,109599,10336\n7441,2819230,140236,7152\n7443,8713717,163528,8957\n7448,7485408,484886,9449\n7449,4096531,600998,6232\n7453,6356800,132026,6582\n7455,9773472,366188,8699\n7456,10424201,546973,10124\n7459,6445592,403856,6521\n7464,4683168,40996,8807\n7467,7112096,688737,7654\n7468,4785376,269781,9519\n7473,9296125,243281,6464\n7476,867994,607817,9825\n7481,3134033,477780,5981\n7485,5035656,645501,8988\n7487,3969235,742074,9118\n7491,6159162,67719,8274\n7494,1633321,782567,9984\n7497,1143766,849882,9790\n7502,9682581,729469,9300\n7506,3064329,170257,8727\n7509,3512201,377730,8331\n7513,7485308,463286,8496\n7516,10620869,28115,10003\n7521,9750892,448754,10150\n7525,4095632,427567,7720\n7527,1508514,868019,7466\n7532,1871147,405188,9394\n7533,7638692,617245,7905\n7535,6556050,145104,6574\n7540,10282557,12256,5975\n7545,7578807,766054,10471\n7548,3946009,534885,5701\n7550,4619248,118514,7151\n7554,8622365,612467,9626\n7555,4927288,131665,6358\n7560,9292472,776076,7926\n7562,3958465,119506,8287\n7567,955315,779929,5682\n7572,7685141,170832,10135\n7573,7589959,228103,9158\n7576,9006535,831957,7084\n7579,10078805,834049,6276\n7582,1698783,192962,5893\n7584,1291036,936842,5691\n7586,5256307,623292,9450\n7590,8013385,96036,7768\n7595,2198698,132550,7303\n7596,8452093,305416,9198\n7600,1258427,224045,8571\n7602,3401507,190139,8018\n7607,6524,778384,7071\n7611,1085737,61259,6161\n7613,1267958,455155,6590\n7616,5975675,821138,10256\n7620,7288804,472683,9452\n7623,5923938,422088,10488\n7626,595846,843098,7062\n7630,1361206,337029,6283\n7635,8078689,392059,7531\n7636,3876740,757071,7118\n7641,9619468,440921,9064\n7643,1930865,229218,7648\n7645,7425948,14577,7451\n7648,3508213,167639,8890\n7651,1386929,387629,7575\n7656,9789236,360570,6579\n7658,5133660,697758,9004\n7660,10234353,552324,9372\n7662,5871222,900743,6262\n7664,8597480,240827,10476\n7665,2002633,120591,8351\n7668,10280507,735794,9862\n7669,2315240,471145,8993\n7673,10400144,169079,9610\n7674,3954168,107357,8974\n7676,7679919,41837,7631\n7681,1770472,273980,7369\n7686,6313780,859581,5944\n7689,931685,2298,6668\n7691,6128969,360597,10291\n7696,2750272,220948,9190\n7697,3784140,902728,8887\n7701,7736738,274954,9020\n7703,4674645,653051,6765\n7704,8715269,334875,7760\n7707,7375458,885737,8065\n7712,5501133,716400,5961\n7715,1390598,331565,6806\n7718,9850481,481798,9796\n7721,5111731,677987,7049\n7723,10495997,391842,6593\n7726,1274444,382792,9552\n7728,4628104,198537,9696\n7729,3104848,879695,8754\n7732,2644299,764340,7876\n7734,4523111,178637,7109\n7739,7184372,879262,10536\n7741,10181701,118681,7746\n7745,288749,738749,8828\n7748,10200661,530278,10193\n7753,8460848,207888,7184\n7754,10654508,142163,7847\n7755,2668141,144311,7299\n7760,3203232,342279,9226\n7763,3681982,66585,6130\n7768,3655392,522076,7434\n7773,1130344,586523,8276\n7776,5557694,181815,5955\n7778,6656599,814189,10219\n7783,6545839,555161,9143\n7788,7239668,671356,7181\n7789,9851091,160413,5626\n7792,7794585,324699,7786\n7795,3581505,918098,7974\n7796,3525064,743908,6760\n7800,10062897,579997,7349\n7803,5338873,642916,5792\n7807,9285102,879811,10394\n7811,1012368,465201,8832\n7814,4505246,466628,8467\n7818,6665172,280441,6554\n7821,2161162,180878,7119\n7822,9903580,802128,8472\n7827,4288639,371398,6296\n7832,7370431,871890,9366\n7834,7517320,606958,8543\n7839,8771053,636327,6249\n7840,5114296,741553,10044\n7842,10004708,98378,9448\n7847,8761014,263213,9866\n7852,7695367,893346,5794\n7857,8915057,882956,9744\n7860,9816471,725145,6289\n7862,1054216,805508,5966\n7865,6013618,411141,9744\n7870,3633952,128257,6074\n7873,9811801,313250,6996\n7878,2382418,663967,10202\n7879,4285741,874296,10069\n7882,5906839,324301,6239\n7883,547848,607147,9905\n7887,1762979,423190,9507\n7891,1695089,190335,9705\n7892,10459224,866553,7222\n7895,3744916,451353,6001\n7899,10301678,337711,9625\n7902,5094788,128807,8654\n7904,1763551,920580,10050\n7908,507068,931798,7394\n7909,1479704,469163,6711\n7911,2736683,160206,6906\n7914,6205452,937097,9008\n7915,7112108,812541,10068\n7916,6104357,381131,8178\n7917,6799543,60098,9863\n7918,791247,511538,9624\n7922,1655876,724154,6062\n7925,5332756,102667,7754\n7928,8963066,226969,7095\n7929,8548926,448760,10522\n7932,5931632,265207,9892\n7934,3752419,878819,8139\n7935,9065235,387772,8698\n7939,9236167,189230,9051\n7944,7097534,563773,10497\n7947,6550737,781937,7647\n7948,4861470,916661,8447\n7953,6283020,518161,8927\n7954,3997997,333881,5758\n7956,6279585,864004,7521\n7958,6318295,740229,6827\n7963,7641526,245410,9697\n7968,3163488,714054,7072\n7973,3285254,52817,7850\n7975,5736798,585682,6512\n7980,4097433,650596,9447\n7985,1611215,609236,6462\n7989,9984109,676698,7507\n7992,1889469,200549,7608\n7995,210151,301670,10266\n7999,6871940,50075,7802\n8000,337399,396222,10492\n8001,6893237,842497,5749\n8006,7106308,427079,8144\n8011,9705332,465998,10186\n8014,8932925,302316,7546\n8019,2512016,625558,9268\n8023,439507,536517,9582\n8028,4980761,860768,10631\n8033,936890,287199,6562\n8037,1614064,626369,9817\n8042,7756299,703690,10305\n8044,399132,173867,9082\n8046,7356066,204084,9003\n8049,6055029,731759,7527\n8053,2603851,816238,6997\n8056,4133980,494665,8919\n8058,1057456,852409,9760\n8062,513172,589389,6618\n8065,664593,96322,8240\n8067,2541684,551346,9711\n8068,5128017,226879,6803\n8073,9398803,68357,6037\n8077,5912011,705804,7482\n8081,9413349,668059,9194\n8083,7361629,846298,7093\n8087,6030448,581295,8998\n8089,4389137,290061,10219\n8090,2940312,571660,8965\n8091,6502886,934115,9416\n8094,10447607,19236,5864\n8098,7854342,590607,8722\n8103,9726945,243629,6690\n8104,6110397,181545,10643\n8106,4680899,726784,10091\n8109,7399732,671752,10496\n8113,1623155,124778,8294\n8116,8876454,482842,6135\n8117,6534464,625704,10262\n8122,9574222,712278,7860\n8124,7366458,496094,7804\n8127,4328799,392443,8112\n8128,7172510,809063,7358\n8133,4678045,854943,8698\n8137,6925556,878662,10417\n8138,2326879,161278,7925\n8142,4599507,868013,9444\n8146,6758172,557132,10069\n8150,63842,895985,9344\n8154,10296909,397094,9239\n8158,2600674,56617,5664\n8163,10366936,113206,10003\n8166,7356630,675956,8042\n8169,5889586,697667,6440\n8173,10490292,196090,7880\n8175,599402,453929,8526\n8179,1467898,840051,9013\n8181,719096,412539,10535\n8184,7760838,299422,8445\n8188,3108219,341694,10149\n8193,713556,483773,8305\n8196,969647,687645,6611\n8197,792995,875548,9462\n8199,9305270,127036,10685\n8203,826769,904122,9115\n8207,9138225,711135,9640\n8212,10610411,110965,9267\n8216,4844531,1590,10245\n8218,7735995,757858,6593\n8223,358587,616836,9024\n8226,3044749,841343,6737\n8231,2610831,22352,7467\n8234,4943281,114514,8083\n8237,5870726,830694,9838\n8242,7554590,658967,8605\n8244,10658382,918209,7076\n8248,1145628,618430,6027\n8251,1534110,46180,7818\n8255,9472845,746805,9184\n8258,1562041,202871,5807\n8260,3230128,907617,8150\n8261,2246857,885465,7996\n8266,5354361,144857,10288\n8267,599991,106727,5714\n8269,9317796,232013,5804\n8274,4803548,227711,7556\n8278,6950563,937158,6941\n8281,3261292,694354,8788\n8286,8255851,435710,9537\n8291,4296844,111790,8454\n8295,4317387,264840,9796\n8297,8689706,167665,6614\n8301,6568785,517365,8895\n8306,7722001,709921,9036\n8308,1113479,205579,7659\n8309,5429620,835214,7247\n8310,3638844,530888,7741\n8312,3407414,189648,8001\n8315,1111281,233888,9456\n8318,10295700,598598,7361\n8323,2188026,831168,6803\n8326,3119695,774473,9446\n8330,10058278,140236,6870\n8332,6886217,788759,6502\n8334,194733,917947,9683\n8337,6568567,509190,10680\n8339,5591092,392584,6323\n8340,9480423,63304,7217\n8344,1567196,66272,9675\n8348,2135987,483910,9181\n8353,707451,321058,7266\n8356,3613530,481549,6839\n8358,6100422,731920,9824\n8361,9054528,464514,7566\n8363,4010875,371623,10453\n8365,7932631,72196,9310\n8367,4173698,826541,5673\n8371,5669366,893388,6557\n8373,1854646,27638,10080\n8377,6891876,430513,6792\n8381,8630800,515649,10359\n8386,5033320,446085,7147\n8387,1280584,689882,7516\n8389,6119056,530572,6304\n8391,6528555,391724,10410\n8392,8208261,179758,9166\n8393,683956,86956,10680\n8398,178734,598702,9226\n8399,3098142,144072,6617\n8401,4951805,558626,8992\n8404,2005169,166089,8809\n8406,4153872,188415,9435\n8409,8781930,575359,9014\n8410,8936002,262210,9631\n8411,1964312,744968,6391\n8412,2359376,98134,7691\n8413,6034463,404062,7806\n8415,10141547,579107,8793\n8420,4214826,249353,10514\n8422,6714345,433623,6965\n8423,4920172,836379,8198\n8428,6124090,930580,8204\n8430,5674840,492601,10314\n8433,5862321,598334,8917\n8438,3128769,433767,7462\n8439,317342,896313,7913\n8444,1074076,336942,8155\n8447,10488002,422333,8305\n8449,1017850,692126,9824\n8451,8701503,398683,6289\n8455,1831489,479677,10235\n8458,3642367,851598,10594\n8460,4087825,350925,10351\n8462,5205943,263978,9632\n8463,7052380,21035,7292\n8468,3629173,432202,6093\n8473,4572523,636375,10612\n8476,6212639,713286,6413\n8478,2678730,590235,7073\n8483,10258263,355351,7941\n8486,6219,721724,9443\n8490,4649917,661665,8845\n8493,4714890,369112,10185\n8494,5350163,139292,8943\n8496,328304,462076,9988\n8498,2606500,237951,9072\n8502,4384508,418485,9876\n8503,4396062,203687,7180\n8505,6653718,607732,7865\n8508,10668982,25426,10041\n8511,653097,742231,5845\n8516,8258979,859394,10670\n8520,443691,796093,7629\n8524,2384128,236158,9655\n8525,7634048,673313,6118\n8528,7974187,114357,7152\n8533,1153953,686218,6605\n8534,9528242,475959,8014\n8538,5518266,697736,9965\n8543,7770958,904085,8491\n8545,4217684,149085,6571\n8549,6485653,932540,6217\n8552,10488695,141492,9356\n8555,486793,653245,7930\n8560,2144407,616434,6091\n8565,5750952,29589,8399\n8568,5729128,227848,8745\n8571,5673098,623659,10095\n8575,4250885,428330,8205\n8580,9443127,635165,9100\n8581,6335274,909999,5783\n8582,7869930,365191,5982\n8585,178440,522571,7011\n8590,8544485,712502,8173\n8595,8236715,812528,7254\n8599,10503896,347713,10383\n8600,5614932,151222,8190\n8604,9317801,430708,8144\n8609,1985220,720465,8621\n8612,948008,905663,8890\n8615,10479707,803889,6291\n8616,708027,447692,8648\n8620,9424715,103386,9428\n8623,5243952,185112,5717\n8624,5246304,653239,6346\n8626,9534782,61896,6564\n8629,9955304,61643,10154\n8631,5079211,103513,5938\n8632,10114938,48631,7618\n8634,7777729,741699,7336\n8638,3430028,786567,8720\n8639,7637542,129983,9402\n8641,1520134,358253,8000\n8645,5443427,329756,8367\n8646,8165486,798732,7308\n8648,8187219,422054,10235\n8650,6879071,574621,6855\n8653,8974040,111691,8501\n8658,3009262,486881,6613\n8659,3673999,511086,7557\n8663,402548,138907,6840\n8668,2885657,908806,7249\n8673,953724,358309,5845\n8676,8706364,49758,8175\n8677,1897304,711490,10546\n8679,7567470,143725,5659\n8684,4358739,888237,5737\n8687,9473481,779863,7398\n8691,5076343,412464,6767\n8693,7053055,834215,5969\n8694,9297777,240249,7916\n8698,5063199,78177,8082\n8701,1391622,805613,7399\n8706,4229034,398510,9733\n8711,5741545,18629,6707\n8713,3120822,811233,8841\n8714,3141016,94381,8256\n8717,4045128,852384,9505\n8718,3424846,368661,8645\n8719,1385435,357286,9841\n8724,7049709,296217,9897\n8728,6568379,192468,7533\n8730,6516198,305184,8026\n8733,9985752,506494,8352\n8734,61554,85177,10596\n8735,2753664,72734,8832\n8739,9042669,292824,8327\n8743,1719882,336241,10305\n8744,9036778,872150,9295\n8747,952270,5364,8023\n8751,3085762,926181,8408\n8753,252201,217596,8315\n8755,2875167,230003,8191\n8758,8881679,88091,9582\n8759,3369158,713092,9656\n8761,726978,891234,6652\n8766,7038560,758280,7480\n8771,9891980,708904,9993\n8774,9412050,44963,6923\n8778,9702382,925006,6142\n8783,7966864,372914,9092\n8787,10492610,745649,5799\n8790,4169622,860198,10555\n8792,3109898,489925,9036\n8795,7650978,695271,8974\n8800,6151017,94172,8583\n8801,1962837,307612,9308\n8805,6490661,903731,6326\n8806,6886178,200623,10161\n8809,1505174,6914,5710\n8813,10299425,336737,9462\n8816,7438843,743633,7581\n8818,9056998,114602,8272\n8820,10486584,740816,8722\n8825,655972,687120,5911\n8830,1887078,156742,8668\n8833,4096279,806305,9455\n8835,6113820,658196,7744\n8836,8122504,139276,7121\n8839,7086876,311908,7200\n8844,7346641,866770,7050\n8849,1604781,208977,6006\n8854,3770575,113340,5818\n8857,7196168,826079,7274\n8861,1601147,673375,7870\n8862,7497818,859171,9759\n8863,10086641,890025,8121\n8864,5838442,398186,6454\n8865,6418819,234765,8500\n8868,5296127,811934,5834\n8871,3334792,336704,8748\n8874,3397034,621494,5683\n8876,5799075,39743,6244\n8880,3213530,604456,8027\n8882,2783696,583390,7600\n8885,6313334,594170,8507\n8889,6540714,858103,8645\n8890,9806192,613830,6154\n8892,1288923,711255,8584\n8897,9800399,174197,7061\n8900,4285405,928456,9143\n8905,340880,258039,5792\n8906,10301510,163362,6240\n8908,5566262,747924,6652\n8909,1823606,906351,5788\n8911,4870748,443715,8855\n8914,8827910,853612,9154\n8916,6485237,365943,7337\n8921,1521330,380111,9163\n8923,7728788,333431,10116\n8928,2809256,901078,9057\n8933,3368324,704645,5688\n8938,2214368,196660,10442\n8942,823213,701984,8977\n8946,1956134,415031,9692\n8951,4550737,713067,9482\n8953,7951695,13175,9057\n8958,3629429,107847,9462\n8959,3093900,932264,6654\n8960,8796110,156797,7522\n8961,269330,53516,10506\n8963,698340,266494,6444\n8967,7590763,689384,7685\n8971,6710228,531978,5784\n8972,4480336,172129,7762\n8977,6572855,40983,7672\n8982,3910411,753821,10682\n8987,1372292,876010,6822\n8991,3965522,926938,7001\n8996,136443,574378,7964\n9000,6210673,65549,6021\n9001,9392526,76600,6336\n9003,3955935,804964,10426\n9005,2221611,419160,10174\n9006,7129143,171545,8373\n9008,6394468,526462,7913\n9010,3465659,55185,7759\n9011,8323206,342724,6141\n9015,10158999,862523,9125\n9017,6055410,611594,9513\n9022,189562,475849,8516\n9025,5716273,155963,9934\n9028,10404254,768856,6635\n9033,6260020,204579,6556\n9035,3138214,756780,9788\n9036,4817229,857132,7947\n9040,4543610,689230,10304\n9043,8972527,556190,6214\n9046,6750410,211820,6826\n9047,1110852,10766,8106\n9052,3980254,184643,7814\n9056,4011265,759742,9224\n9060,8587282,410676,6390\n9062,10176440,583401,8426\n9067,10512034,691354,8850\n9069,7932922,907839,7669\n9072,1665134,675507,7702\n9075,5042371,10211,7126\n9080,2211805,186385,10072\n9082,4683542,883956,9939\n9087,10436700,750792,9835\n9092,7216666,737965,7020\n9097,10025115,754218,8026\n9102,8477280,669397,5850\n9105,3378487,872837,6027\n9107,6330580,90785,8209\n9110,4891188,456956,7121\n9113,2736517,732624,6724\n9117,4336116,295036,6648\n9121,3428093,264429,5815\n9124,5689723,613207,7797\n9125,535650,192011,7587\n9126,8157563,46066,5841\n9131,2296832,266343,9215\n9132,7100010,486242,5987\n9133,4535070,328702,6873\n9138,8362670,462891,10217\n9141,9145037,700666,10413\n9144,8471895,230727,7671\n9149,1172790,702372,8265\n9151,4516087,370151,9655\n9155,2362281,692525,6340\n9159,10172763,414279,9500\n9161,9019401,320810,6116\n9163,5494653,466895,6345\n9165,503872,642890,5824\n9167,1162742,62499,7439\n9168,2090959,840858,6358\n9169,4104787,512418,7093\n9174,8150180,427399,9361\n9179,6845193,638276,6289\n9182,8315552,713067,9745\n9185,8015250,818570,6609\n9190,2320106,779538,8932\n9191,5297393,730894,6507\n9196,3558009,741575,8192\n9197,8623269,419591,9397\n9201,2136904,732089,10215\n9202,3538253,616766,6058\n9205,6881492,928018,7031\n9210,3419439,111004,8609\n9212,1855084,662409,9545\n9213,4532700,854188,10303\n9215,6152934,750386,8918\n9220,3704827,127285,8977\n9222,2352516,447103,9839\n9225,10413837,743127,7169\n9226,5298372,362483,6551\n9231,6871633,717769,6722\n9234,9430913,213320,7887\n9237,2041728,647076,5827\n9239,2949419,136515,7238\n9240,1974007,709662,7686\n9241,4542728,749732,9580\n9244,9997878,777702,6688\n9247,10549403,390505,10179\n9251,9212082,155464,10242\n9255,1283947,251286,10558\n9260,8654759,865587,10468\n9262,1682774,530298,9163\n9267,7357818,113111,7372\n9271,3736906,661287,9068\n9274,782238,683512,9104\n9276,8834000,673392,8731\n9278,5714315,527983,8825\n9283,4759538,928456,8382\n9287,4208702,94811,6839\n9288,1585957,460747,10131\n9293,7964673,579669,9494\n9295,7632815,180736,9022\n9300,1662131,592445,5689\n9301,2561004,721000,10304\n9302,9245187,332930,8018\n9305,2852744,219105,9874\n9310,2083765,361927,8069\n9313,275970,317429,7631\n9317,1351433,445407,10187\n9322,5286561,358149,10655\n9325,1957413,278811,8156\n9328,2120754,234895,7574\n9330,9470998,837976,6797\n9335,1923219,567674,9378\n9339,9437150,526722,8430\n9343,8557887,297375,9351\n9348,4594565,554551,10645\n9352,9021184,42632,6422\n9357,4726520,28113,6338\n9359,8916507,261570,7467\n9361,9818544,469519,9178\n9363,9006232,539332,9449\n9364,8819247,68300,7254\n9366,1978438,185625,7672\n9368,1784717,847903,10603\n9369,289248,379228,8554\n9371,6256714,31544,7729\n9374,5512131,605331,9608\n9379,1103517,883717,10038\n9382,9445172,178703,8961\n9384,10162100,418145,6612\n9385,5232070,92122,8632\n9386,3573826,627609,7201\n9387,5490019,639120,5618\n9388,10572936,411960,6702\n9389,8862346,21042,5854\n9394,3350243,558363,9502\n9395,1187024,578713,9475\n9400,998375,121019,10364\n9404,1176691,188225,8377\n9408,10198289,545393,6555\n9413,3836745,725857,7593\n9414,7497948,184281,10617\n9419,5222860,115359,9689\n9423,481696,849411,8612\n9424,10308093,408679,8382\n9429,6783285,348040,9721\n9433,5379424,103123,9215\n9437,7418657,127302,8441\n9439,7199954,877466,9263\n9444,9081273,489989,7351\n9447,427201,849489,7411\n9450,1757854,515585,9860\n9453,5785631,491919,10582\n9457,3779024,309144,6122\n9461,9173595,253182,6414\n9464,7336171,478734,7876\n9466,6937762,413012,9251\n9468,10602176,193244,10470\n9473,10605655,124234,7159\n9475,7501876,265731,7244\n9479,3833909,84935,8293\n9481,2844171,300088,6570\n9486,5854174,491932,5989\n9490,1492016,686353,8161\n9495,3752123,597732,10055\n9499,2939347,497859,8848\n9500,915293,535297,9962\n9501,6270561,588443,6460\n9502,9742952,275430,6634\n9504,997347,868008,8938\n9508,9061653,673612,6981\n9510,5496321,479876,9231\n9512,9878098,417741,6907\n9514,9427696,248464,8843\n9519,8759271,460799,5915\n9523,2369757,277160,8229\n9526,10491102,707896,8238\n9531,307165,613814,10367\n9534,7155027,231756,7240\n9538,2318115,164929,10254\n9540,5862498,133812,8971\n9542,1510395,374650,7730\n9547,9654570,290558,7417\n9551,9605398,5000,10694\n9554,6346523,859893,10149\n9556,6453931,401452,7207\n9561,2019459,69633,7472\n9562,6135208,242529,6811\n9565,9185095,472822,6955\n9568,6612926,210679,9743\n9572,6837613,824137,6907\n9573,6738158,673437,7874\n9578,1885143,874264,7667\n9580,1594063,206510,7443\n9584,3717278,301923,8179\n9586,9251153,447863,10278\n9588,6314,803060,10448\n9589,9395382,327942,9903\n9592,8931002,169197,10033\n9596,8417542,872230,8379\n9601,6405307,733980,8342\n9606,1584114,275549,10216\n9608,2805187,487645,6957\n9613,5679539,691425,6807\n9618,2609181,327692,8303\n9622,1241780,552757,10531\n9624,7148937,822753,7565\n9629,4276987,452259,7666\n9631,3754042,804127,8569\n9632,7434517,370605,5672\n9636,4298610,322671,7919\n9639,5468982,861692,8714\n9643,4789457,697038,9737\n9646,6734167,579244,9569\n9649,794424,596642,8007\n9652,9616521,316440,5859\n9654,1616762,587400,7085\n9659,430209,804846,7668\n9661,301322,167507,6151\n9663,6517182,906735,10057\n9664,8350756,382344,7919\n9669,6101751,578591,8063\n9670,3534369,800348,10624\n9674,1631483,341149,7748\n9679,3252707,268732,9920\n9682,4064738,393721,6819\n9687,6584606,616611,5624\n9689,7242430,318725,6366\n9693,6346728,472612,5919\n9696,5224860,77829,7849\n9698,8546930,610472,7747\n9700,10454552,381792,8039\n9705,439995,663921,6091\n9708,961532,31086,5810\n9712,5394912,166868,7177\n9713,3993670,932062,8983\n9715,6859889,573800,9259\n9720,10230584,845199,8064\n9724,5008507,220865,10675\n9725,2939536,501254,6195\n9727,6772571,840327,8355\n9729,802973,748238,6467\n9732,10280971,346810,9139\n9736,7597042,404961,9914\n9737,3801169,777849,6218\n9739,4389269,749754,10489\n9744,8550811,311460,6559\n9746,2153480,438108,8497\n9751,185736,285206,6514\n9756,6211942,729913,10461\n9758,10222199,409044,6697\n9761,7825646,920890,5663\n9766,1834458,406291,5664\n9771,2909049,603123,6403\n9775,2228904,548923,6838\n9778,237081,501113,8560\n9780,4016531,895340,6536\n9782,4559024,669951,7107\n9787,2122102,634284,8151\n9792,9922859,468284,7005\n9794,379001,109812,5852\n9797,5505930,510453,6395\n9800,4389896,773443,9587\n9801,5047898,408653,7604\n9806,9136610,625017,10310\n9811,1204031,699241,8994\n9812,5956410,868761,10193\n9816,9593864,265475,6715\n9817,10541359,773335,5769\n9821,7260201,446105,7293\n9826,7902491,100614,7471\n9830,4115157,358249,8890\n9831,1512974,57417,6985\n9834,3982200,95691,10386\n9835,10215727,689973,10635\n9838,8811602,829530,9678\n9842,5286097,662996,9004\n9845,8799103,187760,7041\n9850,8048795,690787,8921\n9853,2797014,574684,6230\n9857,7824069,414065,7902\n9861,7786657,154258,7600\n9862,10167299,215946,9123\n9867,8815689,723398,9768\n9870,6304214,880115,8058\n9875,1940447,285208,9169\n9880,802235,288195,10221\n9882,696573,9290,9333\n9883,7271864,826864,10049\n9887,3008762,348678,6348\n9890,4096115,498476,8876\n9895,10497425,510285,7838\n9896,1695804,123406,7158\n9900,2703396,231325,8220\n9902,5901852,862200,7485\n9904,4003299,756746,9867\n9908,1515771,699735,6415\n9912,2206522,625159,7508\n9915,8125052,755791,9826\n9919,802434,355121,9225\n9921,624768,436417,8819\n9922,1904897,747824,8229\n9926,6395527,283155,5979\n9928,3087481,823671,10638\n9929,1769271,22327,8441\n9932,1574471,180610,5756\n9936,6708237,874816,10238\n9940,1612914,743636,10027\n9942,9951879,527581,9402\n9945,4629329,273224,9529\n9946,3741058,741285,6094\n9951,5109652,835528,7969\n9953,10589599,199583,6623\n9957,7466127,167485,10442\n9960,7124287,823275,6072\n9961,5495796,347396,6181\n9963,7968124,302147,5730\n9968,5807371,861228,6975\n9970,6297408,718066,8760\n9971,4689047,697768,7537\n9973,7890437,886702,5776\n9975,644120,930922,6800\n9977,5054620,646155,5871\n9978,9848021,151334,10489\n9981,1968964,261263,5621\n9984,3965554,665320,6368\n9989,7036996,63833,9266\n9990,5379631,218406,10336\n9991,124935,896809,6366\n9995,5312867,33722,5916\n9998,3973309,759043,9126\n10003,5342473,5453,6626\n10006,5978842,151376,6305\n10008,3187442,110596,7090\n10011,3568831,918933,7082\n10013,1984505,831126,8540\n10017,9089624,713297,9700\n10021,6568424,116841,8150\n10022,1576165,720289,9396\n10023,2219372,209520,10222\n10025,5139413,30693,6476\n10029,8128136,809382,6112\n10030,2881348,721159,6875\n10033,1618273,119544,9220\n10035,1341068,490139,9766\n10038,1488702,671828,8092\n10039,10387956,274628,8881\n10040,3072673,196233,5899\n10045,3100153,631896,10137\n10050,9318889,414858,7541\n10052,1895536,210748,6753\n10057,564806,706189,5912\n10060,1420076,200223,6085\n10061,759265,898250,10681\n10066,622389,107148,10138\n10068,7943944,27151,6122\n10073,4129434,871993,5757\n10077,3846444,293001,8695\n10080,211226,537275,8991\n10082,9138623,17431,5627\n10084,5148149,925511,9626\n10086,1757608,471083,7061\n10088,4115612,766067,7181\n10090,4941243,631496,9243\n10091,2321648,312909,6259\n10092,8539826,845925,10198\n10096,4252293,743015,10333\n10099,8969383,317013,8832\n10103,1484913,366118,9658\n10104,10100950,354647,10482\n10107,8243202,564645,9635\n10108,21061,388227,7956\n10112,1248751,430359,7249\n10116,3386518,276850,7202\n10120,10216252,11806,10600\n10125,3011220,59513,6311\n10127,1199665,675348,8608\n10128,6599271,667515,9510\n10131,1207734,381665,9006\n10136,3229777,153425,10601\n10137,7099448,563300,7024\n10142,541821,390217,7525\n10146,8469776,436178,7432\n10151,1815768,320899,8315\n10155,6481767,412020,8029\n10156,7263133,420942,10432\n10159,9360709,886772,6085\n10164,1490357,307995,6381\n10165,319376,67067,9848\n10170,8113371,788641,7553\n10173,9991361,787054,7580\n10176,9016558,89518,9820\n10181,5834269,730634,7698\n10185,7148381,143526,5639\n10189,2050876,95564,10021\n10193,7921148,591267,9900\n10194,9405749,877326,10629\n10196,1294148,285027,9073\n10200,1019041,348199,6316\n10203,8725170,627414,6935\n10205,6632928,216077,9147\n10208,9346758,915533,9992\n10211,4616298,714057,8090\n10215,8374266,408646,9084\n10219,5026787,221486,10442\n10220,9182495,801068,7363\n10224,7128800,606530,6128\n10227,2623292,738361,8522\n10228,2020463,557204,7249\n10229,5036493,511733,10066\n10231,6438215,867613,9337\n10234,6074701,368473,6708\n10239,1273364,905774,5961\n10241,8450858,4114,8066\n10244,821906,619210,10206\n10247,4667490,886052,9503\n10248,10597506,215805,8932\n10251,1179301,416971,8362\n10255,1075512,745531,7516\n10256,5153925,735875,8885\n10259,10475355,679834,8706\n10264,6451316,77410,8472\n10266,7442083,614459,7841\n10270,4161347,232778,8023\n10273,6891195,169184,10560\n10277,4528417,504547,9239\n10282,3175650,673587,6629\n10284,6731505,120749,7629\n10288,10287408,2079,9641\n10292,4365347,933291,10270\n10297,6710928,241746,8137\n10299,9802952,714105,6464\n10302,8267196,483314,8642\n10304,8337610,193882,6062\n10306,5152176,217305,10002\n10311,9153494,338148,9549\n10312,1985934,539047,7540\n10315,6713836,310353,9349\n10319,2221160,148991,5732\n10320,7369127,673913,6805\n10321,6480296,300702,6864\n10326,2405816,737073,6629\n10330,6920577,674923,9944\n10334,1012709,785108,6928\n10335,2125211,694456,9908\n10338,10377233,648055,7629\n10339,84584,185647,7498\n10340,3478462,487196,8683\n10342,2649231,339260,6766\n10343,1102285,542893,10129\n10345,10344830,606262,8539\n10350,8508526,226072,6043\n10354,2531088,106555,5744\n10358,3333426,545199,8682\n10362,9770324,232503,7949\n10363,10255761,608406,10533\n10367,10478793,381421,7233\n10372,5742784,257505,5902\n10373,10533451,890874,9001\n10378,8729260,56473,7958\n10381,4307333,876300,7012\n10382,5586213,510215,7680\n10383,5888413,687445,9715\n10385,3774858,321742,9832\n10388,4127014,615048,9592\n10391,1489339,715012,7667\n10396,9441020,162472,9546\n10397,5253318,263954,6368\n10401,9415569,933054,6796\n10406,2097300,912497,10179\n10408,8242542,853018,7336\n10411,575815,883036,8609\n10416,10445196,735055,9184\n10420,6793798,477622,7958\n10424,4416539,135507,7093\n10428,437074,419656,6782\n10433,2869568,732676,7521\n10436,1351843,923077,9367\n10437,4657479,535518,8247\n10440,2993096,222929,7564\n10443,8926696,147230,6659\n10448,5934406,717557,6652\n10450,5769980,798521,6916\n10454,6876825,401064,8793\n10459,8769541,388742,7320\n10460,1036910,891460,6572\n10464,9200752,620672,10238\n10466,6528372,351372,10314\n10468,9560428,297438,9062\n10469,2121168,384100,5899\n10472,8333658,188483,5625\n10475,9298036,862068,7002\n10477,8883406,931454,6884\n10479,9580860,644181,7323\n10481,7938720,599837,7751\n10484,10189565,736854,6548\n10487,3162442,769228,7065\n10491,774927,930226,10186\n10494,9435584,802807,10431\n10498,1174100,538511,8334\n10499,10562694,475213,6345\n10504,10106160,860861,8663\n10507,3495280,478126,9282\n10509,6716056,369038,9620\n10512,3854685,741515,10386\n10516,5549647,144303,6287\n10519,5330474,359626,6623\n10523,8464188,99468,9000\n10527,9603100,104007,10229\n10532,3249674,41915,10628\n10534,749439,85688,8051\n10536,3203984,508142,8089\n10537,4895324,840335,8901\n10538,6669701,367739,7007\n10541,5977629,759670,5886\n10543,8346396,217190,8385\n10548,10369974,616052,6993\n10549,7325667,866312,8534\n10551,8775425,915042,8901\n10554,5510389,878205,9639\n10557,8365570,845158,8403\n10560,3953557,542878,8859\n10562,3748894,346205,8391\n10564,1400450,737791,7122\n10565,8815207,369607,9430\n10566,8793578,690278,6045\n10570,3385070,92340,7706\n10574,7184382,725690,8948\n10576,8631778,89677,6935\n10579,10358208,466524,9068\n10582,5664847,208847,7845\n10583,9712606,173543,5928\n10588,1518651,494875,7958\n10592,4278673,819683,6701\n10597,5997222,157930,9277\n10601,3451457,131122,10211\n10602,9060958,285353,9230\n10603,6394099,845108,10206\n10605,7993593,297061,6778\n10608,2882426,120687,8841\n10610,9781412,101315,8364\n10614,6836873,694819,8251\n10616,1977749,192175,6844\n10621,2844033,453466,6553\n10626,818061,219425,8302\n10627,9832267,600794,8266\n10631,10431796,182504,9254\n10636,5702233,772879,6515\n10637,4746759,766146,6464\n10639,8793521,453035,8231\n10641,1823099,149667,7223\n10644,8178779,790379,9175\n10646,1776084,268849,8465\n10651,7556935,182758,9991\n10654,3939013,109322,9855\n10656,5473623,375047,5737\n10660,4200193,279475,10558\n10665,3485338,178200,8962\n10669,9600170,304888,8328\n10674,10601371,88684,6767\n10676,3515422,493526,6007\n10677,5930723,904808,7590\n10680,1916287,909801,10490\n10681,6891180,50749,10337\n10686,3841646,542516,9371\n10691,7365310,782838,7844\n10692,7557911,485938,9689\n10696,8090909,641531,9631\n10697,8139026,537812,7691\n10700,4711049,67403,8905\n10701,7553524,260578,7033\n10702,10350610,746574,7463\n10706,4533081,9111,9096\n10710,515429,212773,9364\n10711,7364369,411690,8895\n10715,4685065,790049,8446\n10718,4995460,654165,9312\n10723,10289989,200648,8543\n10728,9952492,453714,7571\n10731,282819,365578,9248\n10736,1346453,740983,5669\n10740,4081024,635031,5854\n10744,3552819,875946,9008\n10749,1177190,550694,9207\n10754,8745635,834593,9088\n10756,4791288,263423,6508\n10757,3764932,217882,7564\n10761,6746974,365901,6518\n10764,1647314,342618,8424\n10769,3888689,202772,10107\n10770,29485,815426,7983\n10773,8086927,901434,7027\n10776,9367745,322222,9423\n10778,1855876,286769,10279\n10783,3559156,69797,9492\n10787,10240721,11736,6205\n10789,8417046,167316,6399\n10791,5356482,523223,5891\n10796,7945019,430621,7723\n10801,6407966,411300,8531\n10805,1003377,748442,6994\n10810,4755487,215949,8851\n10815,2696269,380181,8293\n10818,10607968,103045,6120\n10822,2771625,426301,7083\n10825,8660950,911034,8294\n10826,2582947,744299,10421\n10831,9559504,380448,9409\n10835,5493652,417561,10686\n10838,4170722,305798,6199\n10843,5389240,346205,5738\n10848,4522162,124955,5970\n10851,2132049,336479,9252\n10854,1322205,518584,10046\n10858,2784496,552531,10167\n10860,2038520,190744,8819\n10864,10136888,493203,6603\n10866,10361297,620544,8276\n10871,2463272,250675,8860\n10875,4125212,606984,7746\n10879,111917,900633,10575\n10881,9142064,53396,10436\n10883,6807355,617364,5935\n10886,9549866,347071,8974\n10891,8690941,895025,6903\n10892,7492049,19857,8651\n10896,827095,723009,9558\n10901,7487201,620008,7720\n10906,318762,201975,7535\n10908,1261242,360728,8254\n10909,4056084,862902,6370\n10912,9609254,775233,7312\n10913,9346581,395980,10278\n10916,1636373,272681,7152\n10920,3503179,553183,7750\n10923,9051757,468230,5964\n10928,9960313,773572,10617\n10933,10372804,910793,10402\n10938,1431420,492155,9278\n10940,6605411,595905,8513\n10942,5756896,614302,7427\n10947,4175280,694630,7846\n10952,3525960,448093,6022\n10956,7452747,896123,10023\n10958,4525520,421401,8610\n10960,6486913,608357,6097\n10963,9020997,900558,9154\n10964,10231736,225880,9630\n10965,5429119,831121,8196\n10969,10144622,918015,9917\n10974,6478021,30374,8763\n10977,552904,390892,6882\n10980,9236299,232249,8617\n10984,9033144,829188,6108\n10986,9852356,852771,6951\n10990,4501451,675415,7757\n10992,4220629,759760,8487\n10993,2008796,49729,9578\n10996,8986923,613352,7120\n10999,2309809,723888,6532\n11004,6433884,352791,9553\n11005,5376503,711530,9592\n11006,170470,364104,6259\n11008,788777,776073,9106\n11012,6102597,406758,7190\n11017,4453161,362461,9240\n11019,4324339,257063,9866\n11020,10437161,158526,5902\n11022,3446479,71131,6838\n11023,6155385,174795,8879\n11028,141249,816962,9594\n11033,9900544,385669,6293\n11037,7331494,576778,6646\n11040,1500447,493542,8309\n11045,580904,586491,10578\n11048,361748,847044,9202\n11051,8154643,781286,8506\n11056,8517387,773485,6842\n11059,10004028,109509,6755\n11064,1929078,537457,7112\n11069,1267799,886583,8331\n11073,130228,149467,8004\n11077,1960452,699828,9785\n11080,2090974,251551,9538\n11085,5165604,902122,6191\n11087,5952506,693078,9895\n11088,10388726,220894,6020\n11090,3839622,905146,7765\n11093,6422071,188798,6529\n11094,6184542,691956,7737\n11095,5751726,785380,8361\n11098,6871867,448331,9586\n11102,345577,73841,9410\n11107,7306260,826698,7917\n11108,7256217,138755,5640\n11109,8009392,769597,9396\n11112,10445384,559975,10438\n11116,3009616,95568,8490\n11121,9417944,703542,8913\n11125,1297998,655524,6906\n11126,2643208,96666,8266\n11130,4417564,928879,8054\n11135,5490829,225883,7211\n11140,8247887,532209,10098\n11145,8886734,446640,9955\n11150,6691807,614590,9829\n11155,3380168,191532,9970\n11160,8177920,652971,6843\n11161,6075865,666123,7693\n11162,3892879,214001,7096\n11165,19188,565708,8178\n11169,1652547,244093,10528\n11174,3849510,56361,7293\n11179,5678768,121886,6785\n11180,118075,752122,8641\n11183,3238443,208438,6208\n11186,6982731,257259,9398\n11190,434668,82732,9394\n11192,1176303,183103,6436\n11194,6981547,115695,5903\n11197,9708359,788083,9248\n11202,2063533,377673,6850\n11205,3575412,570001,10655\n11207,2604103,139043,10331\n11211,2009094,76972,7840\n11216,251380,874563,9367\n11218,1231252,508444,7036\n11220,9246491,804443,7955\n11224,5065787,177419,9718\n11225,7232207,920360,8149\n11230,3256692,471300,7571\n11234,9037990,458275,8472\n11238,9416605,43608,9479\n11241,10423010,809454,8168\n11245,5280800,189676,8781\n11250,7570966,433288,7392\n11253,7241038,340209,8841\n11258,4880695,507110,10690\n11262,7541588,426507,8593\n11266,3255301,754210,7924\n11269,412452,21603,6464\n11273,4247568,151180,8056\n11278,6771607,851749,10650\n11279,9252676,50075,5727\n11281,8273187,546288,6430\n11286,9573504,205012,9703\n11288,7348748,438670,7950\n11290,7670479,634807,9336\n11295,739978,112927,5638\n11299,8871770,821262,6749\n11304,9838347,492342,9644\n11309,7903460,602924,6600\n11313,2931276,165049,7110\n11318,7081702,397437,6994\n11319,963899,874682,5760\n11322,5102765,922899,7554\n11324,10021403,274769,8585\n11328,3386700,95219,9957\n11331,10499560,311601,6225\n11335,5015824,461338,9305\n11338,8743884,601976,6919\n11339,5243153,744441,10081\n11340,1911754,161562,10002\n11345,9202512,274524,9546\n11349,2756165,250380,6045\n11350,3775316,289829,5711\n11353,9720226,921846,8620\n11355,10367692,410659,5982\n11360,9924497,367645,7572\n11362,6242674,239379,10449\n11363,384677,207488,8832\n11368,5037091,10442,9632\n11371,6358672,643732,7464\n11373,817136,6439,6138\n11374,6820347,234605,10058\n11376,10406439,592074,8252\n11378,9180567,906393,5747\n11382,6168494,141171,8128\n11384,1344103,758068,6973\n11386,942502,605077,9603\n11391,9564451,435920,6505\n11396,3393017,529571,7650\n11397,4413974,189506,8969\n11401,5550047,760937,8877\n11404,1650519,388969,6315\n11407,8562770,678884,7523\n11408,2144626,390558,8672\n11410,567618,681754,8741\n11415,9495234,139326,9218\n11417,6707873,689086,6065\n11418,720609,782917,10489\n11420,1055250,438080,10657\n11424,8909134,434156,9031\n11427,9701656,252471,5627\n11431,8731717,31133,10598\n11433,6778296,264619,6785\n11434,5125412,532921,5929\n11438,312562,94375,9502\n11443,7902157,917698,9778\n11444,3168719,89258,7807\n11445,2972253,265356,8065\n11449,5661314,700016,7935\n11451,10505911,578918,8364\n11452,4995874,150273,6120\n11456,3274273,488759,10324\n11457,3781574,445160,9586\n11459,1036304,131076,9765\n11463,2731922,522349,9070\n11467,1603725,300899,10347\n11472,8389474,256495,6472\n11477,7439637,452096,6898\n11482,2180473,47395,8567\n11485,6584121,783863,10643\n11487,1409488,488769,7906\n11490,649326,874050,10130\n11495,3878259,786368,7112\n11499,6628649,613456,7200\n11502,8666784,153923,8602\n11506,878769,885561,7026\n11509,3142421,739235,9565\n11511,9152478,74254,9250\n11513,7118652,931427,5749\n11516,4837337,457856,10149\n11517,8201759,787914,6107\n11518,6429176,215980,8505\n11521,6487414,568367,8169\n11526,1044494,173089,10022\n11531,8441950,540235,7176\n11536,10189562,675261,8863\n11540,8419393,528509,9874\n11545,8422765,568285,6634\n11548,7162359,196211,8729\n11553,2859867,73220,10522\n11558,9684712,214179,7553\n11559,3432347,272999,8892\n11563,5003953,833775,10572\n11564,5776866,369620,7838\n11567,8650893,450204,9049\n11571,2550463,750125,10525\n11576,196997,206434,7268\n11577,7785751,758867,8738\n11579,2991792,14380,5651\n11582,47099,667292,7923\n11585,7739607,505200,10421\n11586,9570416,339182,5628\n11587,7925114,745504,9401\n11592,2701098,887497,7929\n11594,6603383,284066,9800\n11596,4748981,767268,9671\n11598,5605625,755387,6029\n11601,894539,229580,5727\n11606,8912432,432913,10375\n11610,5151227,40061,6094\n11612,4886135,146388,6065\n11615,10107824,37292,9621\n11620,8650208,114843,6405\n11623,5160977,546700,9502\n11627,10275398,47116,9488\n11629,1592758,728186,6536\n11630,3397352,167846,10500\n11631,7290906,508481,9057\n11636,5126034,564098,8772\n11640,5794397,459075,9611\n11642,2255887,607105,9610\n11646,4745660,304171,5678\n11647,8824848,462986,9118\n11651,1985336,618588,7192\n11656,2702760,115209,5678\n11659,2777228,706598,9430\n11661,5073040,678948,6747\n11666,1362698,167593,7801\n11669,6287453,736863,5848\n11674,9123582,515726,6730\n11676,8450673,177842,9746\n11680,9314587,669408,6649\n11684,9617278,793456,7569\n11689,8426500,635331,6961\n11694,10626943,517718,7920\n11698,1620873,528603,9862\n11701,3685610,13735,8507\n11705,8956390,475065,10377\n11706,9512195,539365,5935\n11708,312949,2537,10326\n11711,9784091,638341,7345\n11716,10000573,768935,6491\n11719,1795067,49126,8036\n11720,1861803,357272,5891\n11724,4042220,332305,6063\n11725,5099596,289846,6185\n11728,5829547,553736,6877\n11730,7659110,841202,8401\n11733,6841804,221010,9391\n11737,4030231,909325,7962\n11739,10221322,553438,5943\n11743,1102068,165650,9997\n11744,9139551,892469,7031\n11748,10208008,150541,6009\n11750,5340376,173766,6570\n11752,6746123,284345,6659\n11756,8058389,393806,7248\n11757,9534817,647427,8126\n11759,7917865,63944,6730\n11763,789464,622440,10551\n11766,214385,335715,10692\n11767,665627,886685,10014\n11772,8429469,534329,7042\n11774,2642557,877390,10031\n11776,9537974,930820,10407\n11781,3966876,877106,7162\n11785,4762594,200695,8108\n11789,7905880,203172,10485\n11791,7156537,651044,5854\n11795,10588916,758161,6462\n11798,8477394,168504,9491\n11802,252736,281707,10038\n11804,2302719,77808,7853\n11806,2372685,455141,9481\n11807,2781206,42323,6974\n11808,10651827,129811,7031\n11812,2277358,708402,9427\n11815,5998404,602107,8063\n11818,7662930,432832,9517\n11822,7512540,683830,5658\n11826,2972245,552639,6381\n11829,6565694,395435,6206\n11834,4943933,496771,7740\n11837,3152623,294249,7778\n11840,8877491,462485,10534\n11843,3084315,932731,8684\n11844,4418324,454831,9104\n11848,1613980,51794,8030\n11853,649331,292937,9875\n11858,91815,856974,6689\n11861,5208107,229157,8970\n11866,8688305,465133,6519\n11867,1537879,712165,8835\n11872,8222197,270669,10042\n11873,3368550,431588,7361\n11878,6261123,78702,8891\n11881,7071846,213164,8097\n11885,536491,311099,6158\n11887,9152916,353216,10384\n11888,6016356,506388,7596\n11891,3693650,787715,7179\n11895,1158814,44852,5993\n11899,4601399,437739,8721\n11900,9730948,532086,7793\n11905,4235117,874258,10644\n11908,8882499,679470,5795\n11910,10005998,312800,9981\n11913,1612673,119621,9025\n11917,5159049,255955,6871\n11919,2644013,135788,5982\n11923,9629015,412717,8471\n11926,7093807,653785,6462\n11929,470811,690975,7836\n11934,2414566,719586,5967\n11937,8141347,361013,7794\n11941,8111631,591090,8813\n11945,1916404,266761,8802\n11947,9579469,577510,7654\n11952,8498230,187550,7752\n11955,2260931,756426,10260\n11958,4009226,398292,9730\n11960,3608902,334888,10132\n11964,8004517,785186,9727\n11969,2291344,338612,9227\n11970,3968304,506238,9139\n11974,4895603,460608,8236\n11976,5932094,249313,9866\n11981,512677,314779,9585\n11984,9994066,346513,10017\n11985,3910478,373363,5911\n11987,6840117,206135,6146\n11991,3294462,693769,9349\n11992,7612107,210903,8832\n11993,1189964,64146,6250\n11996,10247755,443196,8943\n12001,6300293,779729,8867\n12003,4086852,656137,6613\n12006,9166602,326889,8886\n12011,7421901,237958,5947\n12016,1882480,358679,6087\n12018,5578041,770411,7515\n12023,9180658,3533,7778\n12028,1748745,289202,7920\n12033,9683836,547438,9948\n12035,2286397,761647,7795\n12036,9539694,182907,6700\n12038,138128,550749,8214\n12039,10158589,899035,8975\n12040,10628587,472390,6611\n12044,1741729,831944,10067\n12046,1949705,649780,8360\n12048,7697407,154775,6136\n12051,6881245,929216,6586\n12054,2219628,695093,7609\n12057,9952123,516430,6795\n12059,411657,897056,5930\n12063,942858,938475,10494\n12066,2959798,671095,9455\n12071,3774437,57574,8510\n12075,6994065,139865,6300\n12080,2580758,795119,9407\n12082,6092091,588645,9002\n12085,9798710,448282,8014\n12090,7141795,296406,9677\n12095,6271778,364575,6430\n12097,5552061,834255,10668\n12099,6174523,118984,9680\n12100,1346376,119508,7209\n12105,6242092,11365,6528\n12109,5621231,187797,5979\n12111,5767422,252728,9820\n12113,416355,33235,10465\n12115,7835827,630767,8769\n12119,4007093,772358,9753\n12120,6835171,868906,5625\n12124,5365255,730069,9996\n12128,4437080,356823,6574\n12131,7026504,508668,9555\n12132,579119,298894,10121\n12134,8517207,372416,7289\n12137,10063782,628389,8897\n12138,4643580,78247,7556\n12141,6794840,290698,9793\n12143,4578080,918474,7281\n12144,1621883,659645,8224\n12145,1754778,605973,9002\n12149,2948417,296077,7792\n12152,5564461,647544,10646\n12157,8207191,542264,8477\n12158,4176904,625326,10062\n12161,3739315,686594,8253\n12165,545555,245062,10419\n12168,6783022,577692,9088\n12171,8252445,645569,10386\n12175,4838242,18791,6944\n12180,419496,88917,7068\n12181,9943179,401111,6000\n12185,10541398,439594,9309\n12188,1799748,459878,9003\n12189,7469728,196532,8201\n12191,7014236,426844,7133\n12196,775590,405464,6551\n12199,108579,42047,5964\n12201,3327487,195510,7870\n12203,7495911,810871,10452\n12207,3462697,182030,7455\n12209,1602828,207333,7805\n12213,5924555,640171,6544\n12217,3214587,183520,6525\n12219,2345270,352660,5896\n12224,267092,564312,9278\n12226,999498,244036,5813\n12229,4092222,470751,6863\n12231,10342473,54957,8555\n12235,4199598,704305,8859\n12239,10329063,373097,9079\n12241,10002023,57615,9766\n12246,4763734,223725,8433\n12250,7353087,701146,7519\n12253,893306,925126,7095\n12254,8824786,690266,7582\n12257,10100604,308666,10490\n12262,9032278,39296,6448\n12263,497879,116895,9204\n12265,6058488,195736,10583\n12267,8354319,265420,7511\n12272,8132342,766217,9889\n12276,10098084,445449,8571\n12278,6513540,274926,7761\n12281,6423382,313137,6503\n12286,5924100,901211,6812\n12288,6067745,380960,7775\n12292,1807,368624,6999\n12297,1308893,549989,9671\n12301,4072573,828763,10153\n12302,6561284,143876,7214\n12307,116647,376237,5801\n12311,10241245,820792,7234\n12316,248144,582679,8274\n12319,3957685,41586,9977\n12321,3515139,10720,5898\n12325,1630687,328407,6899\n12329,9915039,447475,8612\n12332,5403849,920730,10338\n12333,7235756,648029,9352\n12337,6688598,315961,7483\n12340,7784423,44487,8322\n12341,8848570,902093,7088\n12344,5538525,228173,6797\n12345,8912861,704327,5784\n12347,1099032,871366,9546\n12352,7193404,346177,8313\n12356,9265126,602839,9591\n12361,4364175,317367,5672\n12365,9727093,587299,6761\n12367,8290032,574941,8550\n12371,10054308,386276,8995\n12372,390348,852872,9663\n12376,21875,416848,9407\n12379,9966442,83774,9884\n12384,3157543,195085,8746\n12389,5858062,11759,9682\n12394,5953475,599797,9784\n12395,7029688,847235,7153\n12397,5501136,427862,6173\n12402,1440316,471674,5991\n12407,5116784,237559,7234\n12410,2170894,493328,6972\n12411,3701181,768741,6483\n12413,5418901,646580,5637\n12415,8696819,869750,9231\n12416,8857168,532728,6897\n12419,5498307,894951,7882\n12420,7809488,536020,10366\n12421,10224895,699794,9928\n12423,924352,441595,7758\n12424,4417113,77992,7462\n12425,9125793,223657,6495\n12426,10414393,705324,6538\n12431,6650058,615923,8807\n12433,1877976,854846,8863\n12434,327582,387653,6930\n12438,6764102,565879,8576\n12443,475091,189118,6004\n12448,10079208,52161,9274\n12453,19799,361135,6993\n12454,1108034,661014,8424\n12456,4021877,576363,8510\n12460,5895536,203168,8555\n12462,4724317,837869,9935\n12464,1128958,11270,8513\n12467,1860465,289695,6499\n12470,4249913,356098,6994\n12473,10427397,260658,9493\n12477,3778736,883793,8323\n12479,8291021,605906,8445\n12480,10651749,123683,7501\n12481,3927476,544740,6540\n12485,10422465,627309,5756\n12487,8678029,342928,7182\n12489,8353786,258102,7786\n12490,10427348,747851,6946\n12491,10150212,951,8589\n12496,4444615,927671,5758\n12498,10041427,612024,7476\n12503,3709789,580563,8406\n12504,4387384,634549,7399\n12507,9210729,930436,9750\n12510,7575849,255377,10300\n12512,4214683,629091,9020\n12515,4519710,715015,6077\n12519,8342527,45322,9105\n12521,2183661,488776,8219\n12523,9139719,727950,6278\n12525,2810526,540407,6739\n12529,4112641,454563,8342\n12533,8778452,361358,10204\n12536,7291185,323005,6858\n12537,10659182,51060,6538\n12539,809840,882233,9872\n12540,2065196,539371,5637\n12543,4123469,260637,8086\n12547,752524,862610,10405\n12548,3473130,197773,6514\n12550,6274825,741015,7469\n12554,2492506,898877,7440\n12557,879668,635628,6100\n12558,6172409,751816,10112\n12563,5770371,50040,10633\n12564,1967266,284544,7164\n12568,4585378,60757,10549\n12573,9967642,217313,10524\n12578,10599713,1817,8498\n12583,6376134,162208,10425\n12587,1568007,93695,5671\n12591,8577225,561304,10586\n12592,5001907,777050,6928\n12596,3055939,113893,5619\n12599,1392258,89671,9605\n12604,4463220,544252,8959\n12608,3049867,587376,8248\n12612,8104218,748004,6032\n12616,10281603,497448,7639\n12618,3111068,490012,10213\n12623,155978,728555,10483\n12628,4953209,137049,5657\n12629,1604494,887023,8021\n12634,9508236,929518,8232\n12636,6276049,897754,9467\n12638,233274,906525,6257\n12642,3306950,78262,8147\n12647,1316008,374915,6273\n12650,2132197,221082,6163\n12653,8863896,878985,6987\n12657,8720744,181883,9457\n12659,5423912,461910,6474\n12664,239451,709569,7676\n12669,3344164,863313,7143\n12674,5148420,908636,9547\n12679,1556245,637760,7515\n12683,3145352,256168,8511\n12685,8634292,316168,5843\n12686,9828416,363765,9227\n12691,8338105,535512,9263\n12696,5871954,170036,9955\n12698,6105938,724854,9759\n12700,7071508,546082,8798\n12705,842255,811145,7647\n12709,5685396,222575,6451\n12714,10199849,126365,5628\n12717,6027862,73519,6777\n12720,6616729,416783,10232\n12723,2402943,444412,7077\n12726,9598787,671627,6954\n12731,7550390,526773,10112\n12736,6193021,324702,9686\n12740,3855535,200867,9547\n12743,5814862,161013,9627\n12747,9743707,426175,7456\n12751,9702736,59917,10435\n12752,8769335,415445,9724\n12753,8625949,839235,9606\n12755,7378680,312132,10184\n12757,119793,868727,9257\n12758,5585998,514946,6139\n12761,7089045,398294,6588\n12764,8666996,578561,6083\n12765,2508958,682590,8528\n12770,1040966,150975,8873\n12771,1130458,710380,8688\n12773,7055653,405050,6060\n12776,500210,751168,9696\n12778,201493,123380,7007\n12783,1938295,831421,9020\n12785,7006679,538193,7646\n12789,8581339,938444,10492\n12790,4592487,819409,10082\n12794,278554,112086,6783\n12798,3473330,918003,7120\n12803,604184,532398,6466\n12807,1050858,273441,9207\n12809,10368109,925256,10465\n12813,5366635,220204,5906\n12816,5425134,424087,6062\n12819,3197611,788303,8503\n12821,3097628,878047,6499\n12826,1710382,794800,10479\n12827,1925774,877607,6679\n12830,276335,925683,9990\n12833,4818327,661316,6283\n12835,9523629,410584,7028\n12836,6621472,235863,6952\n12841,10194920,289795,10471\n12846,4746440,477206,6113\n12849,3523392,686637,9977\n12850,2182041,213710,10225\n12853,2690399,190891,7186\n12854,6192701,686285,6307\n12857,1511724,669453,8698\n12859,2033292,283594,9996\n12860,722990,348212,6830\n12865,8054994,435449,5867\n12869,8305486,11532,7136\n12874,8067304,35888,10120\n12877,7017950,816213,8888\n12880,9548220,349342,8388\n12882,9080965,114533,6047\n12885,8026258,529204,9210\n12887,8812203,41474,8941\n12890,9724047,702452,9472\n12894,7965067,21205,9796\n12897,8471745,286806,6224\n12900,7390329,194408,7024\n12902,4871750,618656,6915\n12905,1707624,795229,5647\n12909,8548207,411812,6435\n12913,1368007,834245,6541\n12914,237690,477895,5964\n12919,7102434,249393,6636\n12922,8723958,927535,9448\n12924,6407151,854185,7471\n12926,4220754,602544,9024\n12928,10296953,59104,10209\n12931,3331150,474062,6871\n12932,5827582,759771,8497\n12934,9746596,526842,9912\n12935,9369594,694308,5647\n12940,846842,682580,8751\n12942,8165878,458015,10567\n12947,5673253,742690,9953\n12948,3501984,899181,6774\n12952,1589908,798219,9669\n12955,9494099,172868,7438\n12957,2315505,753062,6998\n12959,5049892,363656,8567\n12964,7777135,228301,9430\n12968,5161358,492471,6825\n12973,3762542,34069,8252\n12976,6219505,10360,5852\n12981,3490212,29925,9081\n12985,5637039,26253,6653\n12986,8209026,390064,8390\n12990,1595547,518291,7555\n12994,4500072,611694,10320\n12995,7170421,437003,6500\n13000,7640942,904672,6923\n13005,1072714,135649,9598\n13010,4423226,594104,9740\n13014,4804111,819663,7480\n13018,4075303,695090,8211\n13023,8339077,170844,9279\n13025,2147576,302280,7062\n13029,5860270,719242,8120\n13032,7902442,319392,5736\n13037,1866054,229091,9033\n13041,3630668,547751,8124\n13045,2280464,779874,6401\n13049,3682347,869106,7783\n13052,9971054,305997,5689\n13056,4253012,570753,5666\n13058,638611,636407,6301\n13059,10120983,788580,9434\n13061,6227418,614967,5751\n13065,1243447,263935,8235\n13069,5406135,747578,5827\n13074,10662975,741488,6899\n13078,7854099,850928,9013\n13080,780774,499618,10482\n13081,8024987,211991,7523\n13082,3756912,468919,10341\n13084,8237,214668,7565\n13087,3226375,428839,7951\n13091,4078729,741447,8416\n13094,9952102,609965,7606\n13099,1250385,543964,7709\n13104,8655086,70834,10559\n13108,6009094,635615,6492\n13109,7926879,366688,8163\n13114,7538317,862334,10150\n13116,9710179,616000,6795\n13117,6967117,927127,8648\n13119,2568174,765587,10507\n13121,4858083,70722,9249\n13125,10153800,344186,9578\n13130,752426,750461,6664\n13132,7546068,65611,10443\n13135,10321309,80628,5950\n13138,1989639,642439,7191\n13142,8330139,271833,10369\n13143,8931853,840862,9747\n13146,7838758,670528,6452\n13151,3107640,719002,10582\n13153,3766809,405464,8283\n13154,9503236,477914,8930\n13156,5098836,9681,7992\n13157,6773900,425167,9354\n13162,5757288,337702,7732\n13163,2374970,115429,5944\n13165,4169888,323255,7962\n13169,6278376,318269,6904\n13173,3901938,547524,9972\n13176,7291439,54889,8702\n13177,2448662,847734,9674\n13182,6369432,932525,6726\n13184,4563294,30730,6310\n13189,6192799,425776,9425\n13193,10311882,1305,6384\n13194,7812532,875287,8494\n13196,2221445,469952,7486\n13197,7493185,847747,9850\n13198,582067,727808,5958\n13200,648749,389898,7877\n13202,2989706,692387,10579\n13203,3359389,350689,9604\n13204,6064930,77897,8814\n13209,3206264,272363,10637\n13214,1616616,758992,9908\n13216,2500459,424087,8230\n13221,9628938,449672,7780\n13222,23398,681558,6335\n13226,8004454,373926,8578\n13227,4199596,137143,7632\n13230,1699971,261188,10429\n13235,1872791,552192,8638\n13238,8003847,555016,6075\n13243,1107851,487853,6985\n13246,3095035,124185,9880\n13249,7836250,363769,8381\n13253,3680991,345640,8571\n13258,10315126,227490,6551\n13262,6327399,868990,6406\n13263,5216152,559446,6136\n13268,6629532,438697,10453\n13271,10473751,226706,7945\n13275,4550188,598892,9071\n13277,10267033,882317,9305\n13281,1114588,360770,9347\n13285,4880898,488107,8072\n13287,3529389,59293,9853\n13290,8777433,132947,7850\n13291,869247,237092,9977\n13293,3753821,99046,10630\n13295,8946955,202794,8958\n13297,5176176,731448,6612\n13298,3534922,24558,6248\n13299,2334930,339233,9946\n13302,1118103,277630,8092\n13304,10532399,601206,9126\n13307,10451523,359639,7591\n13311,7861353,650176,9492\n13312,8256949,157742,6969\n13315,5047550,113488,10285\n13316,9476066,370306,10282\n13317,7611934,558366,8275\n13318,6906093,543889,9815\n13322,6985613,579347,5778\n13327,7843735,131596,8025\n13329,481194,279240,7391\n13334,7536390,470404,10329\n13335,392442,318044,7793\n13338,8343489,521470,9232\n13340,8495247,758197,7447\n13342,10229159,477068,10456\n13345,2709697,834557,7363\n13346,5324329,294450,6679\n13347,7422059,142195,10360\n13351,3954722,73699,5964\n13354,5291868,713979,10619\n13359,10209670,688282,7972\n13364,10225481,442503,6648\n13369,9749777,730507,8695\n13371,4914473,229790,6582\n13374,8840172,309997,9581\n13376,6627952,378697,10330\n13379,681054,708710,7282\n13382,1212393,601042,9701\n13384,8597343,750338,10611\n13386,3037879,795885,8087\n13387,5869131,83808,8096\n13392,2916525,364623,7068\n13394,3890982,920860,9943\n13398,8639046,792438,6166\n13403,950346,588569,6271\n13405,6877952,432226,7823\n13408,1597481,97963,7707\n13413,5837613,360384,8997\n13415,4639074,446508,6950\n13417,2454314,775972,7090\n13421,1096326,910704,9540\n13423,4942156,442359,8654\n13427,9770599,582231,10405\n13431,8676838,446129,8435\n13436,7889091,853780,9339\n13439,4347797,568373,8878\n13440,7927380,357943,8670\n13441,10111711,128160,7971\n13445,3972229,534310,8110\n13448,10510333,267687,7427\n13449,8218453,579957,8389\n13451,5727284,866511,8298\n13456,6044768,298524,6675\n13457,2232005,526262,8942\n13461,4283127,256298,6519\n13464,1221332,139991,10461\n13469,6963313,323406,9309\n13472,2163510,327912,8628\n13476,1328365,79426,6326\n13481,579229,664466,8024\n13485,7489085,208950,7868\n13489,1902262,759521,8451\n13491,1643113,546470,7680\n13494,9137012,422291,10075\n13497,4366278,686272,9032\n13500,6908303,892405,7256\n13501,1880469,419447,9195\n13502,8071980,602912,8051\n13503,3244520,566559,8985\n13508,320689,317730,6563\n13511,2157293,792608,8821\n13514,2317229,931519,6767\n13519,5856520,646595,6550\n13523,9207302,62620,9063\n13524,774253,603258,6674\n13527,8132942,388423,9569\n13529,5982393,58979,8580\n13532,8413188,563734,9145\n13534,2237482,617040,6510\n13539,6514127,897875,6379\n13541,1184666,106633,7916\n13543,3949101,53486,10102\n13546,8837471,726495,6654\n13547,2708938,498011,9133\n13550,5118445,724024,9523\n13553,9049912,414054,5855\n13555,9181447,197549,9898\n13558,1749222,345755,9683\n13563,7534547,466509,6281\n13565,9250058,924351,6290\n13566,1957578,501444,9589\n13569,2423485,811130,7130\n13574,431366,348192,10184\n13578,8618928,98343,8649\n13579,4468757,853929,9366\n13580,10519934,589865,9633\n13585,6135259,405795,5790\n13589,9709643,533878,6615\n13594,4313118,862592,8142\n13597,3497066,765417,9009\n13598,8103517,687781,8008\n13600,6239998,327323,6657\n13605,7823977,464922,10642\n13610,6489448,519309,9786\n13611,1781747,745550,10299\n13616,8839633,408195,9376\n13620,6235685,733513,6669\n13621,7365668,764323,7976\n13625,6737894,69657,7704\n13628,10447452,1294,6197\n13632,1945765,674479,7501\n13634,4613345,65902,10034\n13636,4778040,418864,6829\n13640,7981343,911207,6626\n13641,4644031,817510,9097\n13645,8061904,773232,7068\n13649,894371,794175,5896\n13651,10555722,923626,6313\n13655,3974462,332637,7837\n13657,3750010,809029,8073\n13659,9578733,152943,9700\n13662,10225946,671935,6167\n13664,1941651,104966,8245\n13665,9545957,648341,8897\n13668,434179,532349,8312\n13672,7448679,729542,9271\n13673,6452198,158839,7266\n13678,9741232,407631,10267\n13681,5512106,858153,8117\n13684,5067173,409515,6375\n13685,740584,102797,9457\n13689,3948687,790456,9841\n13694,6140814,528224,8697\n13699,1348913,833195,5872\n13703,4266853,138891,8841\n13704,10423276,602457,8811\n13709,1288739,87813,6650\n13714,1489877,729577,6965\n13715,325453,837908,9272\n13716,2706952,735345,6703\n13721,3635543,186938,9567\n13726,5404492,265354,9494\n13727,2911185,400295,9597\n13731,9958015,543442,7817\n13732,10220633,464208,6566\n13734,4049394,219851,8113\n13737,5003371,366207,6656\n13738,5185179,771300,7909\n13742,8455105,206590,7638\n13747,9436663,397321,7645\n13752,3486121,309810,5668\n13757,8200969,494914,8303\n13760,3974907,448719,6369\n13762,2508200,153923,8547\n13767,5545610,800193,6799\n13770,7252862,361144,8108\n13774,4375316,649620,6334\n13777,6068861,884523,7569\n13781,1668496,890069,7813\n13784,7365564,298286,8307\n13788,9877958,212152,8330\n13792,4334086,487081,6900\n13797,4102532,842867,8705\n13800,7799865,621125,8988\n13802,9977482,513792,7074\n13804,10645837,539459,8388\n13809,8993237,888376,7839\n13811,6787853,155726,9798\n13812,193116,773904,6993\n13817,7718408,684878,9825\n13819,829548,382250,9931\n13823,2708401,753550,8198\n13828,5812982,101579,8531\n13830,912389,355869,8529\n13831,6844123,879585,7051\n13836,3887793,553705,8029\n13837,1176784,443299,8882\n13839,8391455,883761,8544\n13841,6674057,929769,9102\n13844,1008709,70952,5983\n13848,9029266,634084,9093\n13852,10550068,464660,8992\n13854,4395474,285806,6989\n13855,6796993,93010,8033\n13860,4587755,364716,6699\n13864,4847493,784436,10460\n13866,4977245,937918,7867\n13869,88690,395267,7433\n13872,9207191,426234,8130\n13876,8121060,909408,7723\n13881,1867108,903170,6243\n13886,180732,328272,6148\n13887,7389622,831645,7617\n13892,2981104,929564,5946\n13895,8676464,225226,9414\n13897,5975195,149660,7728\n13898,8002365,623173,5816\n13900,8393537,550554,10385\n13904,3802111,788407,6374\n13906,4877762,649901,7091\n13907,3955102,885820,8329\n13911,10151841,688082,9040\n13915,10471323,199046,7873\n13919,8909359,657211,7656\n13922,1971118,728340,6088\n13924,9408844,605774,6906\n13928,763186,269977,9021\n13930,3820460,390410,9123\n13933,8914944,811555,7517\n13935,5879305,517954,10068\n13940,7437442,837769,10255\n13943,1298075,437129,5672\n13946,6519738,867150,6875\n13948,7529697,826653,8211\n13952,10183011,836883,9698\n13956,6198936,697730,8571\n13960,10425076,314003,10642\n13961,2653654,6674,6429\n13964,8619176,35388,6486\n13968,10603014,378651,8619\n13972,7012211,200638,10062\n13973,7846127,321058,9764\n13977,5840807,690428,8732\n13978,821903,830688,8562\n13979,7091224,126413,7558\n13981,9404690,753362,6981\n13985,1157045,719759,5928\n13988,4023717,867654,8870\n13991,9374946,184142,10551\n13995,4147821,667750,7179\n13998,10045059,315796,10520\n14000,2301938,477562,5978\n14003,411827,676257,9779\n14006,9844937,545826,6340\n14010,2927087,929231,7205\n14014,3071867,905178,6645\n14018,3720352,159833,9868\n14019,6171174,170703,9340\n14024,1322046,1703,7870\n14028,3342270,385218,8130\n14032,10238787,270765,9573\n14034,5509973,150646,10057\n14036,709730,181527,9691\n14038,10516891,878465,7913\n14040,5280029,24980,8082\n14041,1969841,587756,10478\n14042,6534832,433383,6641\n14043,240530,362200,10187\n14046,6658905,675313,6464\n14051,9127034,601383,8341\n14056,5505888,373667,8818\n14061,2289274,304806,6806\n14062,4431228,128875,8201\n14063,8895404,501609,10409\n14064,1984347,571643,6116\n14068,7862884,596422,10368\n14073,10639632,544396,8691\n14075,5166689,263566,7677\n14080,4432782,793625,5691\n14084,1622653,166494,5743\n14088,2442014,452086,6962\n14093,7683392,936449,5967\n14094,3559837,209289,9421\n14096,6255851,575111,6148\n14098,8727052,452631,8174\n14101,1861995,193352,6787\n14105,5397181,265946,9763\n14108,7579400,63453,8727\n14111,6955747,607186,5663\n14116,1011129,558803,10642\n14119,6189754,202918,6058\n14122,2211471,94884,7286\n14123,6021268,438547,9807\n14127,3260793,317418,10014\n14132,1696617,118323,8183\n14134,7651501,616742,9907\n14138,3626500,75089,9400\n14139,3768174,83427,7757\n14141,9303663,542992,8342\n14145,8169936,279649,7663\n14148,5290925,247716,6885\n14153,7643778,751240,7381\n14154,7771978,780894,9216\n14156,1325163,449813,10362\n14158,8737898,716891,8109\n14161,9377965,714114,9697\n14162,10149659,233960,7810\n14164,8982492,151445,9189\n14168,5579897,771315,6078\n14169,4520459,797989,9487\n14174,9735650,229749,7004\n14177,5104914,116285,8727\n14178,8678372,764917,9108\n14179,5486085,848553,7287\n14183,9796774,752911,6720\n14186,1832843,875416,5908\n14187,544180,359459,7336\n14191,3684992,504770,7516\n14195,5599644,487926,9661\n14197,5299692,535070,9969\n14199,9692514,416648,9155\n14202,5710290,4355,8578\n14205,4157314,586161,8167\n14210,8717861,642652,10240\n14211,9459874,327453,8692\n14215,9338518,803036,10427\n14218,8559979,419233,7982\n14221,6968796,493386,6976\n14224,2978580,551800,9183\n14227,1919161,77509,7513\n14230,7578006,353265,6478\n14233,376539,517778,6775\n14235,1518443,462924,7259\n14236,3418688,567375,9600\n14240,5935091,175120,7126\n14244,3725420,721785,10339\n14246,1490376,363412,8791\n14251,1210941,725954,10664\n14253,3654078,33304,5783\n14258,9992773,462753,10491\n14263,7675926,654488,9952\n14268,1043851,883565,9947\n14273,488303,445613,9979\n14275,8691206,677866,8931\n14277,8512721,473847,7716\n14282,4913712,467466,10604\n14284,10653365,3345,7026\n14289,9325607,851289,9062\n14290,9915459,265541,7861\n14295,8768454,877908,9782\n14299,1051197,299666,8778\n14301,2211651,929500,7897\n14305,2861500,119010,6155\n14308,8098718,701414,5952\n14309,9533280,275701,6568\n14312,9652531,22776,6780\n14315,1097603,35521,6594\n14319,1476561,586960,9870\n14323,6565071,70259,5691\n14324,5125762,851502,9211\n14327,6993513,855005,9765\n14330,1203623,843464,9096\n14333,10655465,322465,6734\n14336,1798366,701344,9457\n14339,621482,185303,5844\n14343,9980725,911083,7643\n14346,3785811,74738,8603\n14351,2402827,313494,7489\n14355,2375902,367402,10505\n14357,6851043,610760,8717\n14361,5385332,214888,7953\n14366,10373412,77257,7474\n14369,8855217,283572,9608\n14372,7631925,96032,7931\n14376,9898330,836680,6309\n14377,1137375,202269,6401\n14381,8518248,75839,10097\n14386,10491987,211499,9897\n14388,8423082,550766,7488\n14393,3393181,52202,6291\n14396,1783181,501506,8441\n14398,10382883,45296,6703\n14399,5830548,639554,9999\n14404,9952255,531816,9062\n14406,10069800,855747,8892\n14409,10206679,920428,6763\n14412,8149558,755238,6278\n14417,7243431,213684,9812\n14420,7786979,61601,5735\n14421,4002435,531393,9826\n14425,3251402,518797,9723\n14429,9564092,507779,10546\n14432,2024975,415359,5702\n14437,5128229,796310,9041\n14441,7047683,418094,6764\n14443,2776497,427479,8581\n14447,991102,820372,8403\n14448,4219471,792792,7650\n14452,3652152,750171,9491\n14453,2398690,935570,10332\n14454,5480667,573245,7360\n14457,9256941,377723,10650\n14462,3314608,714389,6486\n14463,2962605,888122,9125\n14466,9320200,557118,10177\n14471,10616940,286569,10635\n14474,5919582,81944,9560\n14478,6042508,439326,8963\n14480,8844680,820865,7197\n14484,8269148,552823,6379\n14486,6360999,82853,7072\n14489,8476454,62951,9367\n14490,4128052,128846,6483\n14493,7739618,457916,7660\n14495,909759,602188,9002\n14497,259831,425645,9151\n14500,7486072,383324,5730\n14503,2696655,237439,9831\n14508,1782249,478109,8370\n14510,3463025,323668,7994\n14514,9461193,556617,6288\n14519,8731516,236016,7769\n14523,5452297,226206,6841\n14524,1926908,365735,8276\n14529,3344105,898521,6356\n14531,8630670,352413,6732\n14532,1026854,851347,9924\n14537,2237051,385792,8985\n14540,2994710,492421,8767\n14545,886139,899488,9192\n14550,8295526,687142,6590\n14551,2270855,698201,9860\n14553,5475389,419619,8245\n14555,8619206,715211,8046\n14557,8871458,703083,5776\n14559,10066062,810615,6442\n14563,6336763,156202,7390\n14566,3602365,266984,6870\n14570,4431037,212392,10300\n14571,7662997,331777,8917\n14573,6245787,876562,10541\n14574,6555202,791137,8805\n14575,1799511,754239,7267\n14576,916486,299053,8150\n14577,9134717,77442,5740\n14581,6821,345620,9711\n14584,2615393,618706,7485\n14589,437050,722900,10015\n14594,5906101,893072,6241\n14598,4268046,894994,8132\n14599,6389152,32367,7644\n14600,8524392,760523,5795\n14604,2973636,8527,10534\n14606,10667713,73914,6752\n14608,4742261,353435,9361\n14611,9747425,719066,10039\n14615,4013132,558156,7191\n14617,751283,831518,9974\n14622,2121595,250998,6115\n14623,4115698,515113,9020\n14626,398206,47563,8242\n14629,9362587,868322,9573\n14634,274410,95083,10286\n14637,8388571,885795,6632\n14641,3015304,339496,10468\n14646,945693,242127,7852\n14649,8894076,342238,9672\n14652,2354820,621518,8282\n14655,8201755,135015,10469\n14658,7673032,48735,5813\n14661,2466259,83613,7017\n14662,8756857,102260,6039\n14664,1070452,547949,9254\n14669,5566503,88927,5793\n14672,1390087,653299,9551\n14675,6151972,281701,9149\n14677,3767275,829747,7501\n14678,4687882,380034,7718\n14680,10421021,873668,6554\n14684,4163460,852119,8388\n14686,579828,454775,9532\n14688,4219658,138911,10306\n14690,10065527,528264,8927\n14695,8521827,821052,8608\n14700,5361,488449,8372\n14705,379493,911593,9204\n14706,6602958,499474,6788\n14708,1324005,588387,9377\n14713,9485631,208311,9531\n14715,7234276,696687,9043\n14718,6853034,259075,7710\n14721,1976214,94514,6212\n14723,422948,895375,7680\n14726,8873306,111094,9411\n14730,7466342,85660,8753\n14734,8228777,879862,7070\n14736,6908430,725569,7137\n14740,7904242,320829,10336\n14745,7959690,497561,10252\n14747,7999784,60620,6155\n14750,9764465,655977,6360\n14754,5330398,87386,9852\n14755,7500831,808937,5863\n14760,8457019,489713,6869\n14764,10254511,342381,10040\n14766,9535815,579957,9899\n14770,10182523,150476,8486\n14772,9436270,117861,5622\n14774,10659848,832475,7430\n14779,3010848,334794,6510\n14784,6976641,7708,10194\n14786,8561147,891225,10431\n14788,750292,813202,10357\n14791,4795065,79775,6950\n14794,4066051,841434,10598\n14799,3084957,209484,7687\n14802,1658837,929144,6713\n14806,7549112,21331,6365\n14807,6764758,262111,10629\n14808,1587088,711807,9125\n14811,6237303,453598,7120\n14814,2079334,50749,8165\n14816,2999062,341414,8196\n14818,10225331,917350,8171\n14820,8022326,631405,8811\n14821,5448624,110549,7636\n14825,727779,820422,8755\n14830,6430353,466243,10518\n14833,2999057,359480,10180\n14837,8834123,875661,8048\n14840,1750835,394193,6988\n14844,1730202,255637,7036\n14847,3495370,837912,9781\n14852,8738287,920186,7567\n14853,9000807,583735,10334\n14854,8361809,118285,6438\n14858,8141799,112059,10660\n14863,8631317,931373,7573\n14866,6970262,505773,8541\n14871,4915165,248669,6846\n14874,561027,546502,9682\n14876,6091221,828967,9947\n14881,5229213,629228,9135\n14882,8496074,260298,6315\n14883,3906775,226013,9054\n14885,7887440,4620,7401\n14886,2287014,634934,8418\n14889,6873538,7624,9542\n14890,9767430,552225,8979\n14891,6516733,4417,8178\n14896,62509,591429,9614\n14901,6486106,790456,7044\n14902,409627,849774,6988\n14903,2037235,501361,5959\n14904,7198681,635660,9872\n14905,2771588,146290,10335\n14908,409042,196238,7670\n14912,8143768,117577,7660\n14915,3956929,445161,9170\n14920,3610715,513375,9816\n14923,1870710,97029,8452\n14927,7615637,893685,10388\n14930,7151622,859635,7668\n14932,7321739,542196,10300\n14934,8826261,736806,7064\n14936,7072841,717117,9168\n14940,8492471,170334,6529\n14941,147684,857987,8980\n14943,7591855,742142,9233\n14945,4218974,533524,9559\n14947,406294,505281,6850\n14952,10278971,130703,7781\n14956,8480500,433642,9702\n14960,937754,231964,9397\n14963,8959511,839932,10504\n14968,8385197,189575,7964\n14970,808096,276930,9430\n14975,4120356,180130,6712\n14979,4369009,802726,5869\n14983,2636858,523744,10192\n14986,5826335,244218,7794\n14989,8068180,893328,9444\n14992,4642842,145536,8729\n14996,1255538,507697,7505\n14997,10138510,59446,9995\n14998,10315581,517617,9638\n15003,7617939,775742,10629\n15006,9957503,594263,10013\n15008,2621006,432858,7286\n15012,5955235,761781,8914\n15013,7079801,669361,9140\n15015,1809253,325500,10593\n15020,5454528,299785,6206\n15021,4072146,129509,10272\n15023,2762757,351747,10500\n15027,8697826,161495,6690\n15028,2666392,113527,8138\n15031,6783402,663685,8057\n15033,5333046,286691,6838\n15037,2012164,714663,6405\n15040,1910885,293403,7911\n15044,6010077,331192,9657\n15045,1863836,454256,6788\n15047,1561683,290146,6421\n15050,8620399,687216,10565\n15053,1618649,808253,6410\n15056,2079970,341283,6214\n15059,6996827,563789,8722\n15062,787870,684945,7450\n15063,2180215,762916,9071\n15068,2073851,465851,10060\n15072,2292973,884933,5906\n15076,4086897,815524,8956\n15077,8066623,381611,10263\n15080,4242248,396837,6795\n15081,5603469,125963,6598\n15083,7693731,575923,9895\n15088,8846203,670415,6302\n15092,5786664,89570,7018\n15093,8942487,420753,10349\n15095,10673310,404432,10659"
  },
  {
    "path": "tidb/join/t/r2.tbl",
    "content": "2,56746,1311922\n6,819360,6450995\n9,264752,5435660\n10,479664,7937731\n11,367646,5162612\n13,392351,4908357\n14,790354,5090785\n19,212651,9591632\n23,695363,7413765\n28,5844,537429\n33,392371,533839\n35,379357,275268\n39,734653,9627423\n42,169629,8582061\n43,811357,4079184\n48,126749,7576913\n52,552544,3907960\n56,598402,6774762\n61,511493,6290552\n63,337239,6606506\n66,242188,9708282\n71,260840,593814\n72,153979,5874379\n74,640171,4560068\n78,188440,9727502\n80,817855,9640816\n83,352112,1469641\n86,659189,5818255\n90,317479,3501286\n91,760347,2918444\n95,569090,4059747\n99,748037,1583483\n104,638448,3444568\n107,818452,138430\n108,622867,8360602\n112,242362,9712644\n116,94383,10487494\n117,386836,9699935\n121,355425,3370017\n124,459909,6308809\n128,696553,126419\n129,330016,3819296\n130,887470,8473102\n135,868874,8395503\n140,313290,1145681\n145,205880,4896072\n148,412400,3546008\n150,204591,1528363\n152,93828,5800937\n153,328078,9848472\n154,525489,553658\n158,454484,858428\n160,935895,10653753\n163,178152,4208331\n165,904938,1399688\n170,26772,7341097\n171,736115,7122489\n174,621525,10304875\n176,750609,8466043\n178,802062,4724759\n179,617046,7161797\n182,865316,10190768\n183,688537,10084219\n187,513934,1169720\n188,382896,4892266\n193,182613,5599695\n195,656663,7853459\n198,392894,2049562\n203,154726,6004072\n205,129964,4887248\n210,146349,3479584\n215,727492,2560692\n219,165749,7396026\n222,67038,4832474\n224,60368,5069485\n228,380980,4780205\n230,256973,7936548\n233,94849,6192320\n234,250318,2342531\n237,69822,4810984\n241,569696,6939270\n242,518811,9932071\n243,48611,579727\n247,44541,6352844\n251,630319,3203238\n255,107149,8450768\n259,158426,8679646\n264,394330,10402778\n266,719688,1941454\n268,84957,2474030\n272,453513,7417468\n275,535836,3600363\n277,381692,10007569\n282,441002,7161771\n287,379228,5096376\n290,286999,1973878\n291,54503,3731243\n296,185947,3091639\n300,44673,5233624\n301,705416,3572630\n303,528565,1778159\n304,819393,9828039\n305,924132,8045037\n307,55527,7384958\n309,11,4317116\n314,917107,9386140\n317,100801,9904659\n321,512411,9791462\n322,273192,8344430\n327,469228,6142535\n332,224823,3354118\n333,358577,3600091\n338,228646,75621\n343,168482,748895\n347,540142,9669507\n351,737217,8037133\n354,932438,9358162\n357,523853,4308005\n361,357194,10350764\n366,795944,3502738\n369,115723,486747\n372,92671,8664162\n374,88533,5408268\n376,406885,7078730\n381,224785,385269\n385,657565,287152\n387,619993,7005285\n388,162374,3639903\n389,818496,392192\n391,481957,7640884\n392,598126,1413647\n393,408223,1833413\n395,914556,7997213\n398,35744,8171872\n399,824882,3808860\n403,890667,5491135\n408,848232,3782325\n413,117737,8585509\n417,594768,2429487\n418,104275,6749680\n423,697665,2522460\n428,298298,9763109\n431,249141,2313861\n433,644845,6292314\n435,130249,261857\n439,762133,10127407\n444,788765,4972584\n448,401272,2382718\n449,575425,8097755\n450,797385,6332325\n454,231910,8453726\n459,695912,5578588\n464,62620,1549085\n466,57819,8411815\n469,22654,1051460\n473,735719,962861\n474,847180,9409388\n478,903051,5680754\n483,428210,5020726\n488,871917,8560202\n490,101951,277443\n493,37222,6113795\n494,937033,6022719\n499,97824,2337726\n503,538717,5034806\n505,78130,5828404\n509,58193,5365832\n510,494489,769388\n511,912655,48455\n513,423796,9210477\n515,48846,8097007\n518,159894,8817858\n521,849759,5668133\n522,671047,2824432\n524,278375,4987587\n528,346649,9758363\n533,73760,6436855\n535,245904,1487076\n539,604547,9098941\n541,453486,8216184\n544,314803,5755831\n549,604968,5803110\n552,744587,7313314\n557,26673,949384\n560,933388,9523773\n565,311003,5238443\n568,306551,1363300\n573,389689,8525403\n576,735741,4484512\n577,317494,3238687\n580,644396,1850340\n583,199120,3788045\n585,661888,871247\n590,184914,8282207\n594,548101,7992549\n598,395060,9238513\n602,649146,6613031\n604,823957,9203794\n605,406158,4069915\n606,283623,9534927\n607,380238,5263335\n611,613332,3210680\n616,783622,7531357\n619,441620,10294650\n620,848410,4549169\n622,641713,8115384\n623,53374,5198324\n624,6423,8758410\n625,221885,4930565\n630,109808,8728071\n632,366517,5652854\n636,621541,4680127\n639,486960,3254982\n643,429151,5412838\n648,165250,2377381\n649,483697,1949181\n651,691463,4449483\n655,626932,3642169\n658,682241,4430180\n663,323587,2239577\n666,346837,3839334\n671,351170,2265647\n672,763634,8371561\n674,929429,5441905\n677,584096,7064940\n678,856170,480849\n680,631825,9010680\n685,552759,2550684\n687,780714,3841412\n692,502576,643523\n697,532468,9767955\n699,619906,3090233\n701,754022,7193385\n702,364370,9482526\n706,264429,4424982\n708,577033,1878910\n712,514159,3905609\n717,250323,297195\n721,534229,2168509\n724,452240,413678\n725,156983,5806327\n726,500297,920007\n727,639429,10049865\n729,745354,4605030\n733,610763,10577429\n738,259982,2677047\n743,588287,3562\n744,896079,4024909\n749,180610,5745973\n754,657886,8949723\n757,101605,3786175\n758,53372,5994585\n762,283284,10011290\n763,591425,151276\n767,261845,228117\n771,299373,808936\n774,107998,8305614\n779,319389,7606048\n781,832556,9305018\n786,800160,3375988\n790,571831,4387891\n792,793783,7275895\n795,268208,2129444\n798,798718,1205727\n800,509190,8314559\n802,440531,2891574\n805,535444,3317470\n807,345777,1764326\n809,97914,8756717\n814,596885,4146172\n819,127893,3550733\n820,750938,3836499\n822,403110,3045548\n823,508100,3347497\n825,449763,1233289\n828,26300,8593352\n832,167568,428399\n837,442881,5179665\n842,899613,5544413\n845,240262,5251045\n849,118889,6073198\n853,121412,5074874\n854,5997,3658109\n859,79983,7359697\n862,589506,6247912\n865,420942,8612884\n866,402842,3010057\n868,923109,7397044\n870,871419,1491519\n873,183316,7883031\n876,869291,5173494\n880,625843,3468829\n884,887187,3669233\n885,54740,9605597\n888,413126,9777768\n892,166085,10618042\n894,644565,10087746\n899,491499,1245297\n902,558447,6546704\n906,267010,4066025\n910,192238,10353836\n915,889388,543955\n918,728866,7117407\n922,2948,7429430\n923,104678,5603336\n926,931051,1866716\n929,866209,9552731\n934,386054,8201368\n935,457611,9498560\n940,821430,5681106\n943,853319,333823\n944,896834,1521671\n945,235153,3728021\n950,113960,10594116\n951,450969,2720566\n952,910905,1622848\n956,340388,906490\n957,159606,6980221\n958,247134,8432932\n961,913977,5092963\n963,795112,3364136\n966,309116,6774205\n967,875585,8743383\n970,578928,4260267\n972,623420,7156553\n976,285117,5972348\n981,689942,8764431\n983,595907,7589645\n986,14524,4660891\n989,829577,8593922\n991,382465,5873201\n992,776110,5373282\n996,710827,9705715\n997,636591,2681510\n998,383107,3501737\n1001,531079,2679195\n1005,344451,6334643\n1007,432145,3139985\n1011,473313,363418\n1015,297526,511654\n1016,368447,627585\n1021,144851,4962870\n1024,122248,7038376\n1025,346478,4265122\n1028,301553,8303684\n1032,379942,9414407\n1035,771888,276774\n1037,9267,897360\n1038,371236,6333974\n1040,381583,4712098\n1041,114346,6855587\n1046,739043,2564140\n1051,730878,3406424\n1052,216921,10384478\n1055,293345,4105511\n1060,245859,10535143\n1062,119933,865516\n1063,630018,10420847\n1068,220002,7963811\n1069,288314,4335622\n1073,707164,8953928\n1074,197365,8958893\n1078,86372,9011743\n1081,750267,6892520\n1083,432120,3436597\n1086,529219,4014817\n1090,936116,3517759\n1093,159283,4461330\n1098,382984,1211753\n1099,635524,6736244\n1101,714795,1189953\n1105,609150,2026203\n1109,508123,9411841\n1113,48688,10185145\n1115,909035,288595\n1116,392034,654065\n1118,136562,3094440\n1123,491777,5878300\n1126,569598,3199157\n1129,497494,3012517\n1130,673612,1016194\n1135,826985,2898655\n1136,388551,5324130\n1140,749018,1276600\n1143,556140,2954921\n1147,722899,9993761\n1150,500855,4007634\n1154,28755,8454908\n1157,414915,10262559\n1161,589316,4617709\n1164,929124,7075970\n1168,560865,2733633\n1169,576537,5382995\n1173,160356,9547985\n1177,770730,1951088\n1180,475443,8552057\n1184,100868,6706848\n1185,725174,3909041\n1188,140364,5810909\n1191,892335,4134639\n1192,869157,1989859\n1197,204758,7914012\n1198,774652,6773136\n1201,668377,4117783\n1206,158266,3830281\n1207,16208,5282081\n1210,274262,8322412\n1212,706429,5336839\n1215,479826,3113124\n1216,53755,2346803\n1219,198977,9063813\n1223,785910,4755052\n1224,435852,1689321\n1229,288679,5739707\n1233,198140,9036477\n1234,810756,8266515\n1235,605118,4318152\n1239,169241,4462878\n1241,238840,7330487\n1246,677804,8610776\n1251,432088,8862136\n1254,526428,3597637\n1259,293820,1578837\n1260,607015,4300286\n1261,1909,6447969\n1264,187066,4465212\n1265,497064,8246038\n1267,119645,223615\n1271,144997,7654941\n1273,913459,10397536\n1275,59366,9674237\n1279,382605,8803318\n1280,497264,8927532\n1282,884300,3607476\n1287,167874,8198649\n1290,850512,1572190\n1291,805604,1036747\n1293,26225,4328129\n1294,189675,5310965\n1297,416526,2107939\n1299,658771,2109584\n1303,846549,3598225\n1308,145783,8258480\n1311,537114,9004184\n1312,485614,1164227\n1316,861944,4286776\n1317,65116,10272647\n1320,911839,6707093\n1324,218781,7475581\n1325,13630,4484077\n1328,80752,2894489\n1331,172427,6780179\n1334,80009,6269399\n1338,153700,10579750\n1342,157640,3625141\n1347,750016,1798569\n1350,23351,1107907\n1352,44448,9365574\n1355,756740,8380519\n1358,389117,1292578\n1362,637946,8561349\n1363,346442,10648382\n1364,295454,5892841\n1368,46773,10186179\n1371,526279,854925\n1372,536184,1511104\n1374,649098,5402582\n1378,227109,2154337\n1380,564043,9536792\n1383,377163,2966231\n1386,882666,7344616\n1389,274970,3978771\n1390,39194,7310586\n1392,608861,10328146\n1397,908330,1881997\n1399,375544,7957836\n1401,391674,7616020\n1403,531688,1182773\n1405,850092,1553772\n1410,815111,2372230\n1414,785197,6062130\n1415,598693,6931507\n1419,393345,3485159\n1421,380543,6984419\n1422,772035,7840655\n1427,135578,7739073\n1431,863914,3633567\n1436,780182,4240928\n1440,491157,6189838\n1443,522179,735664\n1446,205407,4631963\n1448,104594,8715259\n1453,491743,2293589\n1456,426399,10182612\n1460,110830,5690103\n1462,285655,3564552\n1464,623060,1876549\n1466,427725,1493123\n1470,732574,3160540\n1471,700385,7070059"
  },
  {
    "path": "tidb/mapreduce/.gitignore",
    "content": ".idea/\n"
  },
  {
    "path": "tidb/mapreduce/Makefile",
    "content": ".PHONY: all\n\nall: test_example test_homework cleanup gendata\n\ntest_example:\n\tgo test -v -run=TestExampleURLTop\n\ntest_homework:\n\tgo test -v -run=TestURLTop\n\ncleanup:\n\tgo test -v -run=TestCleanData\n\ngendata:\n\tgo test -v -run=TestGenData\n"
  },
  {
    "path": "tidb/mapreduce/README.md",
    "content": "## Introduction\n\nThis is the Map-Reduce homework for PingCAP Talent Plan Online of week 2.\n\nThere is a uncompleted Map-Reduce framework, you should complete it and use it to extract the 10 most frequent URLs from data files.\n\n## Getting familiar with the source\n\nThe simple Map-Reduce framework is defined in `mapreduce.go`.\n\nIt is uncompleted and you should fill your code below comments `YOUR CODE HERE`.\n\nThe map and reduce function are defined as same as MIT 6.824 lab 1.\n```\ntype ReduceF func(key string, values []string) string\ntype MapF func(filename string, contents string) []KeyValue\n```\n\nThere is an example in `urltop10_example.go` which is used to extract the 10 most frequent URLs.\n\nAfter completing the framework, you can run this example by `make test_example`.\n\nAnd then please implement your own `MapF` and `ReduceF` in `urltop10.go` to accomplish this task.\n\nAfter filling your code, please use `make test_homework` to test.\n\nAll data files will be generated at runtime, and you can use `make cleanup` to clean all test data.\n\nPlease output URLs by lexicographical order and ensure that your result has the same format as test data so that you can pass all tests.\n\nEach test cases has **different data distribution** and you should take it into account.\n\n## Requirements and rating principles\n\n* (40%) Performs better than `urltop10_example`.\n* (20%) Pass all test cases.\n* (30%) Have a document to describe your idea and record the process of performance optimization (both the framework and your own code) with `pprof`.\n* (10%) Have a good code style.\n\nNOTE: **go 1.12 is required**\n\n## How to use\n\nFill your code below comments `YOUR CODE HERE` in `mapreduce.go` to complete this framework.\n\nImplement your own `MapF` and `ReduceF` in `urltop10.go` and use `make test_homework` to test it.\n\nThere is a builtin unit test defined in `urltop10_test.go`, however, you still can write your own unit tests.\n\nHow to run example:\n```\nmake test_example\n```\n\nHow to test your implementation:\n```\nmake test_homework\n```\n\nHow to clean up all test data:\n```\nmake cleanup\n```\n\nHow to generate test data again:\n```\nmake gendata\n```\n"
  },
  {
    "path": "tidb/mapreduce/casegen.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"path\"\n\t\"sort\"\n)\n\ntype DataSize int\n\nconst (\n\tKB = 1 << 10\n\tMB = 1 << 20\n\tGB = 1 << 30\n)\n\nfunc (d DataSize) String() string {\n\tif d < KB {\n\t\treturn fmt.Sprintf(\"%dbyte\", d)\n\t} else if d < MB {\n\t\treturn fmt.Sprintf(\"%dKB\", d/KB)\n\t} else if d < GB {\n\t\treturn fmt.Sprintf(\"%dMB\", d/MB)\n\t}\n\treturn fmt.Sprintf(\"%dGB\", d/GB)\n}\n\n// Case represents a test case.\ntype Case struct {\n\tMapFiles   []string // input files for map function\n\tResultFile string   // expected result\n}\n\n// CaseGenF represents test case generate function\ntype CaseGenF func(dataFileDir string, totalDataSize, nMapFiles int) Case\n\n// AllCaseGenFs returns all CaseGenFs used to test.\nfunc AllCaseGenFs() []CaseGenF {\n\tvar gs []CaseGenF\n\tgs = append(gs, genUniformCases()...)\n\tgs = append(gs, genPercentCases()...)\n\tgs = append(gs, CaseSingleURLPerFile)\n\treturn gs\n}\n\nfunc genUniformCases() []CaseGenF {\n\tcardinalities := []int{1, 7, 200, 10000, 1000000}\n\tgs := make([]CaseGenF, 0, len(cardinalities))\n\tfor i := range cardinalities {\n\t\tcard := cardinalities[i]\n\t\tgs = append(gs, func(dataFileDir string, totalDataSize, nMapFiles int) Case {\n\t\t\tif FileOrDirExist(dataFileDir) {\n\t\t\t\tfiles := make([]string, 0, nMapFiles)\n\t\t\t\tfor i := 0; i < nMapFiles; i++ {\n\t\t\t\t\tfpath := path.Join(dataFileDir, fmt.Sprintf(\"inputMapFile%d\", i))\n\t\t\t\t\tfiles = append(files, fpath)\n\t\t\t\t}\n\t\t\t\trpath := path.Join(dataFileDir, \"result\")\n\t\t\t\treturn Case{\n\t\t\t\t\tMapFiles:   files,\n\t\t\t\t\tResultFile: rpath,\n\t\t\t\t}\n\t\t\t}\n\t\t\turls, avgLen := randomNURL(card)\n\t\t\teachRecords := (totalDataSize / nMapFiles) / avgLen\n\t\t\tfiles := make([]string, 0, nMapFiles)\n\t\t\turlCount := make(map[string]int, len(urls))\n\t\t\tfor i := 0; i < nMapFiles; i++ {\n\t\t\t\tfpath := path.Join(dataFileDir, fmt.Sprintf(\"inputMapFile%d\", i))\n\t\t\t\tfiles = append(files, fpath)\n\t\t\t\tf, buf := CreateFileAndBuf(fpath)\n\t\t\t\tfor i := 0; i < eachRecords; i++ {\n\t\t\t\t\tstr := urls[rand.Int()%len(urls)]\n\t\t\t\t\turlCount[str]++\n\t\t\t\t\tWriteToBuf(buf, str, \"\\n\")\n\t\t\t\t}\n\t\t\t\tSafeClose(f, buf)\n\t\t\t}\n\n\t\t\trpath := path.Join(dataFileDir, \"result\")\n\t\t\tgenResult(rpath, urlCount)\n\t\t\treturn Case{\n\t\t\t\tMapFiles:   files,\n\t\t\t\tResultFile: rpath,\n\t\t\t}\n\t\t})\n\t}\n\treturn gs\n}\n\nfunc genPercentCases() []CaseGenF {\n\tps := []struct {\n\t\tl int\n\t\tp []float64\n\t}{\n\t\t{11, []float64{0.9, 0.09, 0.009, 0.0009, 0.00009, 0.000009}},\n\t\t{10000, []float64{0.9, 0.09, 0.009, 0.0009, 0.00009, 0.000009}},\n\t\t{100000, []float64{0.9, 0.09, 0.009, 0.0009, 0.00009, 0.000009}},\n\t\t{10000, []float64{0.5, 0.4}},\n\t\t{10000, []float64{0.3, 0.3, 0.3}},\n\t}\n\tgs := make([]CaseGenF, 0, len(ps))\n\tfor i := range ps {\n\t\tp := ps[i]\n\t\tgs = append(gs, func(dataFileDir string, totalDataSize, nMapFiles int) Case {\n\t\t\tif FileOrDirExist(dataFileDir) {\n\t\t\t\tfiles := make([]string, 0, nMapFiles)\n\t\t\t\tfor i := 0; i < nMapFiles; i++ {\n\t\t\t\t\tfpath := path.Join(dataFileDir, fmt.Sprintf(\"inputMapFile%d\", i))\n\t\t\t\t\tfiles = append(files, fpath)\n\t\t\t\t}\n\t\t\t\trpath := path.Join(dataFileDir, \"result\")\n\t\t\t\treturn Case{\n\t\t\t\t\tMapFiles:   files,\n\t\t\t\t\tResultFile: rpath,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// make up percents list\n\t\t\tpercents := make([]float64, 0, p.l)\n\t\t\tpercents = append(percents, p.p...)\n\t\t\tvar sum float64\n\t\t\tfor _, p := range p.p {\n\t\t\t\tsum += p\n\t\t\t}\n\t\t\tif sum > 1 || len(p.p) > p.l {\n\t\t\t\tpanic(\"invalid prefix\")\n\t\t\t}\n\t\t\tx := (1 - sum) / float64(p.l-len(p.p))\n\t\t\tfor i := 0; i < p.l-len(p.p); i++ {\n\t\t\t\tpercents = append(percents, x)\n\t\t\t}\n\n\t\t\t// generate data\n\t\t\turls, avgLen := randomNURL(len(percents))\n\t\t\teachRecords := (totalDataSize / nMapFiles) / avgLen\n\t\t\tfiles := make([]string, 0, nMapFiles)\n\t\t\turlCount := make(map[string]int, len(urls))\n\n\t\t\taccumulate := make([]float64, len(percents)+1)\n\t\t\taccumulate[0] = 0\n\t\t\tfor i := range percents {\n\t\t\t\taccumulate[i+1] = accumulate[i] + percents[i]\n\t\t\t}\n\n\t\t\tfor i := 0; i < nMapFiles; i++ {\n\t\t\t\tfpath := path.Join(dataFileDir, fmt.Sprintf(\"inputMapFile%d\", i))\n\t\t\t\tfiles = append(files, fpath)\n\t\t\t\tf, buf := CreateFileAndBuf(fpath)\n\t\t\t\tfor i := 0; i < eachRecords; i++ {\n\t\t\t\t\tx := rand.Float64()\n\t\t\t\t\tidx := sort.SearchFloat64s(accumulate, x)\n\t\t\t\t\tif idx != 0 {\n\t\t\t\t\t\tidx--\n\t\t\t\t\t}\n\t\t\t\t\tstr := urls[idx]\n\t\t\t\t\turlCount[str]++\n\t\t\t\t\tWriteToBuf(buf, str, \"\\n\")\n\t\t\t\t}\n\t\t\t\tSafeClose(f, buf)\n\t\t\t}\n\n\t\t\trpath := path.Join(dataFileDir, \"result\")\n\t\t\tgenResult(rpath, urlCount)\n\t\t\treturn Case{\n\t\t\t\tMapFiles:   files,\n\t\t\t\tResultFile: rpath,\n\t\t\t}\n\t\t})\n\t}\n\treturn gs\n}\n\n// CaseSingleURLPerFile .\nfunc CaseSingleURLPerFile(dataFileDir string, totalDataSize, nMapFiles int) Case {\n\tif FileOrDirExist(dataFileDir) {\n\t\tfiles := make([]string, 0, nMapFiles)\n\t\tfor i := 0; i < nMapFiles; i++ {\n\t\t\tfpath := path.Join(dataFileDir, fmt.Sprintf(\"inputMapFile%d\", i))\n\t\t\tfiles = append(files, fpath)\n\t\t}\n\t\trpath := path.Join(dataFileDir, \"result\")\n\t\treturn Case{\n\t\t\tMapFiles:   files,\n\t\t\tResultFile: rpath,\n\t\t}\n\t}\n\turls, avgLen := randomNURL(nMapFiles)\n\teachRecords := (totalDataSize / nMapFiles) / avgLen\n\tfiles := make([]string, 0, nMapFiles)\n\turlCount := make(map[string]int, len(urls))\n\tfor i := 0; i < nMapFiles; i++ {\n\t\tfpath := path.Join(dataFileDir, fmt.Sprintf(\"inputMapFile%d\", i))\n\t\tfiles = append(files, fpath)\n\t\tf, buf := CreateFileAndBuf(fpath)\n\t\tfor j := 0; j < eachRecords; j++ {\n\t\t\tstr := urls[i]\n\t\t\turlCount[str]++\n\t\t\tWriteToBuf(buf, str, \"\\n\")\n\t\t}\n\t\tSafeClose(f, buf)\n\t}\n\n\trpath := path.Join(dataFileDir, \"result\")\n\tgenResult(rpath, urlCount)\n\treturn Case{\n\t\tMapFiles:   files,\n\t\tResultFile: rpath,\n\t}\n}\n\nfunc genResult(rpath string, urlCount map[string]int) {\n\tus, cs := TopN(urlCount, 10)\n\tf, buf := CreateFileAndBuf(rpath)\n\tfor i := range us {\n\t\tfmt.Fprintf(buf, \"%s: %d\\n\", us[i], cs[i])\n\t}\n\tSafeClose(f, buf)\n}\n\nfunc randomNURL(n int) ([]string, int) {\n\tlength := 0\n\turls := make([]string, 0, n)\n\tfor i := 0; i < n; i++ {\n\t\turl := wrapLikeURL(fmt.Sprintf(\"%d\", i))\n\t\tlength += len(url)\n\t\turls = append(urls, url)\n\t}\n\treturn urls, length / len(urls)\n}\n\nvar urlPrefixes = []string{\n\t\"github.com/pingcap/tidb/issues\",\n\t\"github.com/pingcap/tidb/pull\",\n\t\"github.com/pingcap/tidb\",\n}\n\nfunc wrapLikeURL(suffix string) string {\n\treturn path.Join(urlPrefixes[rand.Intn(len(urlPrefixes))], suffix)\n}\n"
  },
  {
    "path": "tidb/mapreduce/go.mod",
    "content": "module talent\n\ngo 1.12\n"
  },
  {
    "path": "tidb/mapreduce/go.sum",
    "content": "github.com/pingcap/talent-plan v0.0.0-20190408125936-2f97dda786d6 h1:Kr1alXUfrJVBcLQb9tbrZGpInKkBhGLZsuMKNfesH1I=\n"
  },
  {
    "path": "tidb/mapreduce/mapreduce.go",
    "content": "package main\n\nimport (\n\t\"bufio\"\n\t\"encoding/json\"\n\t\"hash/fnv\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"path\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"sync\"\n)\n\n// KeyValue is a type used to hold the key/value pairs passed to the map and reduce functions.\ntype KeyValue struct {\n\tKey   string\n\tValue string\n}\n\n// ReduceF function from MIT 6.824 LAB1\ntype ReduceF func(key string, values []string) string\n\n// MapF function from MIT 6.824 LAB1\ntype MapF func(filename string, contents string) []KeyValue\n\n// jobPhase indicates whether a task is scheduled as a map or reduce task.\ntype jobPhase string\n\nconst (\n\tmapPhase    jobPhase = \"mapPhase\"\n\treducePhase          = \"reducePhase\"\n)\n\ntype task struct {\n\tdataDir    string\n\tjobName    string\n\tmapFile    string   // only for map, the input file\n\tphase      jobPhase // are we in mapPhase or reducePhase?\n\ttaskNumber int      // this task's index in the current phase\n\tnMap       int      // number of map tasks\n\tnReduce    int      // number of reduce tasks\n\tmapF       MapF     // map function used in this job\n\treduceF    ReduceF  // reduce function used in this job\n\twg         sync.WaitGroup\n}\n\n// MRCluster represents a map-reduce cluster.\ntype MRCluster struct {\n\tnWorkers int\n\twg       sync.WaitGroup\n\ttaskCh   chan *task\n\texit     chan struct{}\n}\n\nvar singleton = &MRCluster{\n\tnWorkers: runtime.NumCPU(),\n\ttaskCh:   make(chan *task),\n\texit:     make(chan struct{}),\n}\n\nfunc init() {\n\tsingleton.Start()\n}\n\n// GetMRCluster returns a reference to a MRCluster.\nfunc GetMRCluster() *MRCluster {\n\treturn singleton\n}\n\n// NWorkers returns how many workers there are in this cluster.\nfunc (c *MRCluster) NWorkers() int { return c.nWorkers }\n\n// Start starts this cluster.\nfunc (c *MRCluster) Start() {\n\tfor i := 0; i < c.nWorkers; i++ {\n\t\tc.wg.Add(1)\n\t\tgo c.worker()\n\t}\n}\n\nfunc (c *MRCluster) worker() {\n\tdefer c.wg.Done()\n\tfor {\n\t\tselect {\n\t\tcase t := <-c.taskCh:\n\t\t\tif t.phase == mapPhase {\n\t\t\t\tcontent, err := ioutil.ReadFile(t.mapFile)\n\t\t\t\tif err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\n\t\t\t\tfs := make([]*os.File, t.nReduce)\n\t\t\t\tbs := make([]*bufio.Writer, t.nReduce)\n\t\t\t\tfor i := range fs {\n\t\t\t\t\trpath := reduceName(t.dataDir, t.jobName, t.taskNumber, i)\n\t\t\t\t\tfs[i], bs[i] = CreateFileAndBuf(rpath)\n\t\t\t\t}\n\t\t\t\tresults := t.mapF(t.mapFile, string(content))\n\t\t\t\tfor _, kv := range results {\n\t\t\t\t\tenc := json.NewEncoder(bs[ihash(kv.Key)%t.nReduce])\n\t\t\t\t\tif err := enc.Encode(&kv); err != nil {\n\t\t\t\t\t\tlog.Fatalln(err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor i := range fs {\n\t\t\t\t\tSafeClose(fs[i], bs[i])\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// YOUR CODE HERE :)\n\t\t\t\t// hint: don't encode results returned by ReduceF, and just output\n\t\t\t\t// them into the destination file directly so that users can get\n\t\t\t\t// results formatted as what they want.\n\t\t\t\tpanic(\"YOUR CODE HERE\")\n\t\t\t}\n\t\t\tt.wg.Done()\n\t\tcase <-c.exit:\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Shutdown shutdowns this cluster.\nfunc (c *MRCluster) Shutdown() {\n\tclose(c.exit)\n\tc.wg.Wait()\n}\n\n// Submit submits a job to this cluster.\nfunc (c *MRCluster) Submit(jobName, dataDir string, mapF MapF, reduceF ReduceF, mapFiles []string, nReduce int) <-chan []string {\n\tnotify := make(chan []string)\n\tgo c.run(jobName, dataDir, mapF, reduceF, mapFiles, nReduce, notify)\n\treturn notify\n}\n\nfunc (c *MRCluster) run(jobName, dataDir string, mapF MapF, reduceF ReduceF, mapFiles []string, nReduce int, notify chan<- []string) {\n\t// map phase\n\tnMap := len(mapFiles)\n\ttasks := make([]*task, 0, nMap)\n\tfor i := 0; i < nMap; i++ {\n\t\tt := &task{\n\t\t\tdataDir:    dataDir,\n\t\t\tjobName:    jobName,\n\t\t\tmapFile:    mapFiles[i],\n\t\t\tphase:      mapPhase,\n\t\t\ttaskNumber: i,\n\t\t\tnReduce:    nReduce,\n\t\t\tnMap:       nMap,\n\t\t\tmapF:       mapF,\n\t\t}\n\t\tt.wg.Add(1)\n\t\ttasks = append(tasks, t)\n\t\tgo func() { c.taskCh <- t }()\n\t}\n\tfor _, t := range tasks {\n\t\tt.wg.Wait()\n\t}\n\n\t// reduce phase\n\t// YOUR CODE HERE :D\n\tpanic(\"YOUR CODE HERE\")\n}\n\nfunc ihash(s string) int {\n\th := fnv.New32a()\n\th.Write([]byte(s))\n\treturn int(h.Sum32() & 0x7fffffff)\n}\n\nfunc reduceName(dataDir, jobName string, mapTask int, reduceTask int) string {\n\treturn path.Join(dataDir, \"mrtmp.\"+jobName+\"-\"+strconv.Itoa(mapTask)+\"-\"+strconv.Itoa(reduceTask))\n}\n\nfunc mergeName(dataDir, jobName string, reduceTask int) string {\n\treturn path.Join(dataDir, \"mrtmp.\"+jobName+\"-res-\"+strconv.Itoa(reduceTask))\n}\n"
  },
  {
    "path": "tidb/mapreduce/urltop10.go",
    "content": "package main\n\n// URLTop10 .\nfunc URLTop10(nWorkers int) RoundsArgs {\n\t// YOUR CODE HERE :)\n\t// And don't forget to document your idea.\n\tpanic(\"YOUR CODE HERE\")\n\treturn nil\n}\n"
  },
  {
    "path": "tidb/mapreduce/urltop10_example.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// ExampleURLTop10 generates RoundsArgs for getting the 10 most frequent URLs.\n// There are two rounds in this approach.\n// The first round will do url count.\n// The second will sort results generated in the first round and\n// get the 10 most frequent URLs.\nfunc ExampleURLTop10(nWorkers int) RoundsArgs {\n\tvar args RoundsArgs\n\t// round 1: do url count\n\targs = append(args, RoundArgs{\n\t\tMapFunc:    ExampleURLCountMap,\n\t\tReduceFunc: ExampleURLCountReduce,\n\t\tNReduce:    nWorkers,\n\t})\n\t// round 2: sort and get the 10 most frequent URLs\n\targs = append(args, RoundArgs{\n\t\tMapFunc:    ExampleURLTop10Map,\n\t\tReduceFunc: ExampleURLTop10Reduce,\n\t\tNReduce:    1,\n\t})\n\treturn args\n}\n\n// ExampleURLCountMap is the map function in the first round\nfunc ExampleURLCountMap(filename string, contents string) []KeyValue {\n\tlines := strings.Split(contents, \"\\n\")\n\tkvs := make([]KeyValue, 0, len(lines))\n\tfor _, l := range lines {\n\t\tl = strings.TrimSpace(l)\n\t\tif len(l) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tkvs = append(kvs, KeyValue{Key: l})\n\t}\n\treturn kvs\n}\n\n// ExampleURLCountReduce is the reduce function in the first round\nfunc ExampleURLCountReduce(key string, values []string) string {\n\treturn fmt.Sprintf(\"%s %s\\n\", key, strconv.Itoa(len(values)))\n}\n\n// ExampleURLTop10Map is the map function in the second round\nfunc ExampleURLTop10Map(filename string, contents string) []KeyValue {\n\tlines := strings.Split(contents, \"\\n\")\n\tkvs := make([]KeyValue, 0, len(lines))\n\tfor _, l := range lines {\n\t\tkvs = append(kvs, KeyValue{\"\", l})\n\t}\n\treturn kvs\n}\n\n// ExampleURLTop10Reduce is the reduce function in the second round\nfunc ExampleURLTop10Reduce(key string, values []string) string {\n\tcnts := make(map[string]int, len(values))\n\tfor _, v := range values {\n\t\tv := strings.TrimSpace(v)\n\t\tif len(v) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\ttmp := strings.Split(v, \" \")\n\t\tn, err := strconv.Atoi(tmp[1])\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tcnts[tmp[0]] = n\n\t}\n\n\tus, cs := TopN(cnts, 10)\n\tbuf := new(bytes.Buffer)\n\tfor i := range us {\n\t\tfmt.Fprintf(buf, \"%s: %d\\n\", us[i], cs[i])\n\t}\n\treturn buf.String()\n}\n"
  },
  {
    "path": "tidb/mapreduce/urltop10_test.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path\"\n\t\"runtime\"\n\t\"testing\"\n\t\"time\"\n)\n\nfunc testDataScale() ([]DataSize, []int) {\n\tdataSize := []DataSize{1 * MB, 10 * MB, 100 * MB, 500 * MB, 1 * GB}\n\tnMapFiles := []int{5, 10, 20, 40, 60}\n\treturn dataSize, nMapFiles\n}\n\nconst (\n\tdataDir = \"/tmp/mr_homework\"\n)\n\nfunc dataPrefix(i int, ds DataSize, nMap int) string {\n\treturn path.Join(dataDir, fmt.Sprintf(\"case%d-%s-%d\", i, ds, nMap))\n}\n\nfunc TestGenData(t *testing.T) {\n\tgens := AllCaseGenFs()\n\tdataSize, nMapFiles := testDataScale()\n\tfor k := range dataSize {\n\t\tfor i, gen := range gens {\n\t\t\tfmt.Printf(\"generate data file for cast%d, dataSize=%v, nMap=%v\\n\", i, dataSize[k], nMapFiles[k])\n\t\t\tprefix := dataPrefix(i, dataSize[k], nMapFiles[k])\n\t\t\tgen(prefix, int(dataSize[k]), nMapFiles[k])\n\t\t}\n\t}\n}\n\nfunc TestCleanData(t *testing.T) {\n\tif err := os.RemoveAll(dataDir); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nfunc TestExampleURLTop(t *testing.T) {\n\trounds := ExampleURLTop10(GetMRCluster().NWorkers())\n\ttestURLTop(t, rounds)\n}\n\nfunc TestURLTop(t *testing.T) {\n\trounds := URLTop10(GetMRCluster().NWorkers())\n\ttestURLTop(t, rounds)\n}\n\nfunc testURLTop(t *testing.T, rounds RoundsArgs) {\n\tif len(rounds) == 0 {\n\t\tt.Fatalf(\"no rounds arguments, please finish your code\")\n\t}\n\tmr := GetMRCluster()\n\n\t// run all cases\n\tgens := AllCaseGenFs()\n\tdataSize, nMapFiles := testDataScale()\n\tfor k := range dataSize {\n\t\tfor i, gen := range gens {\n\t\t\t// generate data\n\t\t\tprefix := dataPrefix(i, dataSize[k], nMapFiles[k])\n\t\t\tc := gen(prefix, int(dataSize[k]), nMapFiles[k])\n\n\t\t\truntime.GC()\n\n\t\t\t// run map-reduce rounds\n\t\t\tbegin := time.Now()\n\t\t\tinputFiles := c.MapFiles\n\t\t\tfor idx, r := range rounds {\n\t\t\t\tjobName := fmt.Sprintf(\"Case%d-Round%d\", i, idx)\n\t\t\t\tch := mr.Submit(jobName, prefix, r.MapFunc, r.ReduceFunc, inputFiles, r.NReduce)\n\t\t\t\tinputFiles = <-ch\n\t\t\t}\n\t\t\tcost := time.Since(begin)\n\n\t\t\t// check result\n\t\t\tif len(inputFiles) != 1 {\n\t\t\t\tpanic(\"the length of result file list should be 1\")\n\t\t\t}\n\t\t\tresult := inputFiles[0]\n\n\t\t\tif errMsg, ok := CheckFile(c.ResultFile, result); !ok {\n\t\t\t\tt.Fatalf(\"Case%d FAIL, dataSize=%v, nMapFiles=%v, cost=%v\\n%v\\n\", i, dataSize[k], nMapFiles[k], cost, errMsg)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"Case%d PASS, dataSize=%v, nMapFiles=%v, cost=%v\\n\", i, dataSize[k], nMapFiles[k], cost)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tidb/mapreduce/utils.go",
    "content": "package main\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"sort\"\n\t\"strings\"\n)\n\n// RoundArgs contains arguments used in a map-reduce round.\ntype RoundArgs struct {\n\tMapFunc    MapF\n\tReduceFunc ReduceF\n\tNReduce    int\n}\n\n// RoundsArgs represents arguments used in multiple map-reduce rounds.\ntype RoundsArgs []RoundArgs\n\ntype urlCount struct {\n\turl string\n\tcnt int\n}\n\n// TopN returns topN urls in the urlCntMap.\nfunc TopN(urlCntMap map[string]int, n int) ([]string, []int) {\n\tucs := make([]*urlCount, 0, len(urlCntMap))\n\tfor k, v := range urlCntMap {\n\t\tucs = append(ucs, &urlCount{k, v})\n\t}\n\tsort.Slice(ucs, func(i, j int) bool {\n\t\tif ucs[i].cnt == ucs[j].cnt {\n\t\t\treturn ucs[i].url < ucs[j].url\n\t\t}\n\t\treturn ucs[i].cnt > ucs[j].cnt\n\t})\n\turls := make([]string, 0, n)\n\tcnts := make([]int, 0, n)\n\tfor i, u := range ucs {\n\t\tif i == n {\n\t\t\tbreak\n\t\t}\n\t\turls = append(urls, u.url)\n\t\tcnts = append(cnts, u.cnt)\n\t}\n\treturn urls, cnts\n}\n\n// CheckFile checks if these two files are same.\nfunc CheckFile(expected, got string) (string, bool) {\n\tc1, err := ioutil.ReadFile(expected)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc2, err := ioutil.ReadFile(got)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\ts1 := strings.TrimSpace(string(c1))\n\ts2 := strings.TrimSpace(string(c2))\n\tif s1 == s2 {\n\t\treturn \"\", true\n\t}\n\n\terrMsg := fmt.Sprintf(\"expected:\\n%s\\n, but got:\\n%s\\n\", c1, c2)\n\treturn errMsg, false\n}\n\n// CreateFileAndBuf opens or creates a specific file for writing.\nfunc CreateFileAndBuf(fpath string) (*os.File, *bufio.Writer) {\n\tdir := path.Dir(fpath)\n\tos.MkdirAll(dir, 0777)\n\tf, err := os.OpenFile(fpath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn f, bufio.NewWriterSize(f, 1<<20)\n}\n\n// OpenFileAndBuf opens a specific file for reading.\nfunc OpenFileAndBuf(fpath string) (*os.File, *bufio.Reader) {\n\tf, err := os.OpenFile(fpath, os.O_RDONLY, 0666)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn f, bufio.NewReader(f)\n}\n\n// WriteToBuf write strs to this buffer.\nfunc WriteToBuf(buf *bufio.Writer, strs ...string) {\n\tfor _, str := range strs {\n\t\tif _, err := buf.WriteString(str); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n\n// SafeClose flushes this buffer and closes this file.\nfunc SafeClose(f *os.File, buf *bufio.Writer) {\n\tif buf != nil {\n\t\tif err := buf.Flush(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\tif err := f.Close(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// FileOrDirExist tests if this file or dir exist in a simple way.\nfunc FileOrDirExist(p string) bool {\n\t_, err := os.Stat(p)\n\treturn err == nil\n}\n"
  },
  {
    "path": "tidb/mergesort/Makefile",
    "content": ".PHONY: all\n\nall: test bench\n\ntest:\n\tgo test\n\nbench:\n\tgo test -bench Benchmark -run xx -count 5 -benchmem\n\n"
  },
  {
    "path": "tidb/mergesort/README.md",
    "content": "## Introduction\n\nThis is the Merge Sort home work for PingCAP Talent Plan Online of week 1.\n\nThere are 16, 000, 000 int64 values stored in an unordered array. Please\nsupplement the `MergeSort()` function defined in `mergesort.go` to sort this\narray.\n\nRequirements and rating principles:\n* (30%) Pass the unit test.\n* (20%) Performs better than `sort.Slice()`.\n* (40%) Have a document to describe your idea and record the process of performance optimization with `pprof`.\n* (10%) Have a good code style.\n\nNOTE: **go 1.12 is required**\n\n## How to use\n\nPlease supplement the `MergeSort()` function defined in `mergesort.go` to accomplish\nthe home work.\n\n**NOTE**:\n1. There is a builtin unit test defined in `mergesort_test.go`, however, you still\n   can write your own unit tests.\n2. There is a builtin benchmark test defined in `bench_test.go`, you should run\n   this benchmark to ensure that your parallel merge sort is fast enough.\n\n\nHow to test:\n```\nmake test\n```\n\nHow to benchmark:\n```\nmake bench\n```\n"
  },
  {
    "path": "tidb/mergesort/bench_test.go",
    "content": "package main\n\nimport (\n\t\"sort\"\n\t\"testing\"\n)\n\nfunc BenchmarkMergeSort(b *testing.B) {\n\tnumElements := 16 << 20\n\tsrc := make([]int64, numElements)\n\toriginal := make([]int64, numElements)\n\tprepare(original)\n\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tb.StopTimer()\n\t\tcopy(src, original)\n\t\tb.StartTimer()\n\t\tMergeSort(src)\n\t}\n}\n\nfunc BenchmarkNormalSort(b *testing.B) {\n\tnumElements := 16 << 20\n\tsrc := make([]int64, numElements)\n\toriginal := make([]int64, numElements)\n\tprepare(original)\n\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tb.StopTimer()\n\t\tcopy(src, original)\n\t\tb.StartTimer()\n\t\tsort.Slice(src, func(i, j int) bool { return src[i] < src[j] })\n\t}\n}\n"
  },
  {
    "path": "tidb/mergesort/go.mod",
    "content": "module pingcap/talentplan/tidb/mergesort\n\ngo 1.12\n\nrequire github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8\n"
  },
  {
    "path": "tidb/mergesort/go.sum",
    "content": "github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg=\ngithub.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ=\n"
  },
  {
    "path": "tidb/mergesort/mergesort.go",
    "content": "package main\n\n// MergeSort performs the merge sort algorithm.\n// Please supplement this function to accomplish the home work.\nfunc MergeSort(src []int64) {\n}\n"
  },
  {
    "path": "tidb/mergesort/mergesort_test.go",
    "content": "package main\n\nimport (\n\t\"math/rand\"\n\t\"sort\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/pingcap/check\"\n)\n\nvar _ = check.Suite(&sortTestSuite{})\n\nfunc TestT(t *testing.T) {\n\tcheck.TestingT(t)\n}\n\nfunc prepare(src []int64) {\n\trand.Seed(time.Now().Unix())\n\tfor i := range src {\n\t\tsrc[i] = rand.Int63()\n\t}\n}\n\ntype sortTestSuite struct{}\n\nfunc (s *sortTestSuite) TestMergeSort(c *check.C) {\n\tlens := []int{1, 3, 5, 7, 11, 13, 17, 19, 23, 29, 1024, 1 << 13, 1 << 17, 1 << 19, 1 << 20}\n\n\tfor i := range lens {\n\t\tsrc := make([]int64, lens[i])\n\t\texpect := make([]int64, lens[i])\n\t\tprepare(src)\n\t\tcopy(expect, src)\n\t\tMergeSort(src)\n\t\tsort.Slice(expect, func(i, j int) bool { return expect[i] < expect[j] })\n\t\tfor i := 0; i < len(src); i++ {\n\t\t\tc.Assert(src[i], check.Equals, expect[i])\n\t\t}\n\t}\n}\n"
  }
]