[
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "## Check list\n\n* [ ] Were all tests passed of CI?\n  * (Case: failing `test`) Please run tests and fix your code (see also: [Testing](https://github.com/unkontributors/super_unko/blob/oshiri/README.md#testing))\n  * (Case: failing `format`) Please run `./linter.sh format-save` (see also: [CodeStyle and lint](https://github.com/unkontributors/super_unko/blob/oshiri/README.md#codestyle-and-lint))\n  * (Case: failing `lint`) Please run linter and fix your code (see also: [CodeStyle and lint](https://github.com/unkontributors/super_unko/blob/oshiri/README.md#codestyle-and-lint))\n* [ ] (Case: adding new command) Were tests added to cover new commands ?\n* [ ] (Case: adding new command) Were descriptions for new commands added to README?\n\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: release\n\non:\n  release:\n    types: [published]\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n        with:\n          fetch-depth: 0\n      - name: Set output\n        id: vars\n        run: echo ::set-output name=tag::${GITHUB_REF:10}\n      - name: Set tag to .tar2package.yml\n        run: sed -i 's:\\$VERSION:${{ steps.vars.outputs.tag }}:g' .tar2package.yml\n      - run: Print .tar2package.yml\n      - name: Generate packages\n        run: ./package.sh\n      - name: Release\n        uses: softprops/action-gh-release@v1\n        with:\n          files:\n            - pkg/*.deb\n            - pkg/*.rpm\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n"
  },
  {
    "path": ".github/workflows/unko.yml",
    "content": "name: test\n\non:\n  push:\n    branches:\n      - oshiri\n    paths-ignore:\n      - 'LICENSE'\n      - 'README.*'\n      - 'doc/*'\n      - 'img/*'\n      - 'pkg/*'\n  pull_request:\n    paths-ignore:\n      - 'LICENSE'\n      - 'README.*'\n      - 'doc/*'\n      - 'img/*'\n      - 'pkg/*'\n\nenv:\n  APP_NAME: super_unko\n  DOCKER_BUILDKIT: 1\n\njobs:\n  skip:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo \"Skip job\"\n\n  before:\n    runs-on: ubuntu-latest\n    if: \"! contains(github.event.head_commit.message, '[skip ci]')\"\n    steps:\n      - run: echo \"no [skip ci]\"\n\n  test:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        version: [default, \"3.2\", \"4.0\", \"4.1\", \"4.2\", \"4.3\", \"4.4\", \"5.0\"]\n    needs: before\n    steps:\n      - uses: actions/checkout@v2\n      # FIXME: #95\n      # - uses: satackey/action-docker-layer-caching@v0.0.8\n      #   with:\n      #     key: docker-image-cache-${{ matrix.version }}-{hash}\n      #     restore-keys: |\n      #       docker-image-cache-${{ matrix.version }}-\n      - name: Test\n        run: docker-compose -f docker-compose-ci.yml run ci_sh_${{ matrix.version }}\n\n  format:\n    runs-on: ubuntu-latest\n    needs: before\n    steps:\n      - uses: actions/checkout@v2\n      - name: Run format\n        run: ./linter.sh format\n\n  lint:\n    runs-on: ubuntu-latest\n    needs: before\n    steps:\n      - uses: actions/checkout@v2\n      - name: Run lint\n        run: ./linter.sh lint\n\n  update-repository:\n    runs-on: ubuntu-latest\n    needs: [test, format, lint]\n    if: github.ref == 'refs/heads/oshiri'\n    steps:\n      - uses: actions/checkout@v2\n        with:\n          fetch-depth: 0\n\n        # deb, rpmファイルの生成\n      - name: Set latest tag version to output\n        id: vars\n        run: echo ::set-output name=tag::$(git tag -l '*.*.*' | sort -V | tail -n 1)\n      - name: Set tag version to .tar2package.yml\n        run: sed -i 's:\\$VERSION:${{ steps.vars.outputs.tag }}:g' .tar2package.yml\n      - name: Print .tar2package.yml\n        run: cat .tar2package.yml\n      - name: Generate packages\n        run: ./package.sh\n      - name: Git commit packages\n        run: |\n          git config --local user.email \"action@github.com\"\n          git config --local user.name \"GitHub Action\"\n          git add pkg/*\n          git commit -m \":arrow_up: [CI] update pkg/${{ env.APP_NAME }}.deb and pkg/${{ env.APP_NAME }}.rpm\"\n\n        # READMEに目次を埋め込む\n      - name: Install gh-md-toc\n        run: |\n          wget https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc\n          chmod +x gh-md-toc\n      - name: Insert TOC\n        run: |\n          ./gh-md-toc --insert *.md doc/*.md\n          rm *.md.orig.*\n          rm *.md.toc.*\n          rm doc/*.md.orig.*\n          rm doc/*.md.toc.*\n      - name: Git commit documents\n        run: |\n          git add *.md doc/*.md\n          git commit -m \":memo: [CI] update TOC\"\n\n      - name: Git push\n        uses: ad-m/github-push-action@v0.5.0\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          branch: oshiri\n"
  },
  {
    "path": ".tar2package.yml",
    "content": "name : superunko\ncmdname : superunko\nsummary : Super Unko\ndescription : super_unko project is the one of the awesome, clean and sophisticated OSS project in the world. Let us create shit commands.\nversion : $VERSION\nchangelog : unko.tower power up\nurl : https://github.com/unkontributors/super_unko\nauthor : Awesome Unkontributors\nemail : super@unko.com\nlibdir : /usr/lib\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: bash\n\nenv:\n  global:\n    - PATH=${PATH}:${HOME}/kcov/bin\n\naddons:\n  apt:\n    packages:\n      - binutils-dev\n      - libcurl4-openssl-dev\n      - libdw-dev\n      - libiberty-dev\n      - bats\n\nbefore_install:\n    # kcov - coverage\n  - wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz\n\ninstall:\n    # kcov\n  - tar xzf master.tar.gz\n  - cd kcov-master\n  - mkdir build\n  - cd build\n  - cmake -DCMAKE_INSTALL_PREFIX=${HOME}/kcov ..\n  - make\n  - make install\n  - cd ../..\n  - rm -rf kcov-master\n  - mkdir -p coverage\n\nscript:\n  - |\n    if [[ \"$SH_VERSION\" == default ]]; then\n      # コンテナ経由で実行しようとすると失敗するのでしかたなく直接実行\n      ./test.sh || true\n    fi\n\nafter_success:\n  # ダミーで送信\n  - |\n    if [[ \"$SH_VERSION\" == default ]]; then\n      kcov --coveralls-id=$TRAVIS_JOB_ID test/coverage bin/unko.tower 3\n    fi\n"
  },
  {
    "path": "LICENSE",
    "content": "💩 License\n\nCopyright (c) 2017 greymd\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this 💩 and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, 💩, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial 💩 of the Software.\n\nTHE SOFTWARE IS PROVIDED \"💩\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: default\ndefault: usage\n\n.PHONY: usage\nusage: ## Print help\n\t@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = \":.*?## \"}; {printf \"\\033[36m%-30s\\033[0m %s\\n\", $$1, $$2}'\n\n.PHONY: setup\nsetup: ## Setup docker images\n\tdocker-compose build\n\tdocker-compose -f docker-compose-ci.yml build\n\n.PHONY: check\ncheck: test lint ## Run tests and linter\n\n.PHONY: lint\nlint: ## Run linter\n\t./linter.sh all\n\n.PHONY: test\ntest: ## Run tests\n\tdocker-compose -f docker-compose-ci.yml run --rm ci_sh_5.0\n\n.PHONY: test-bash-version\ntest-bash-version: ## Run test all bash version\n\tdocker-compose -f docker-compose-ci.yml up\n\n.PHONY: clean\npackage: ## Build packages\n\t./package.sh\n\n.PHONY: clean\nclean: ## Clean packages\n\t$(RM) super_unko.tar.gz pkg/*.tmp\n"
  },
  {
    "path": "README.md",
    "content": "<h1 align=\"center\">\n  <img src=\"img/logo.png\" width=50% />\n</h1>\n\n[![License](https://img.shields.io/badge/license-%F0%9F%92%A9-orange.svg)](./LICENSE)\n[![Build Status](https://travis-ci.org/unkontributors/super_unko.svg?branch=oshiri)](https://travis-ci.org/unkontributors/super_unko)\n[![Coverage Status](https://coveralls.io/repos/github/unkontributors/super_unko/badge.svg?branch=oshiri)](https://coveralls.io/github/unkontributors/super_unko?branch=oshiri)\n![GitHub Actions Build Status](https://github.com/unkontributors/super_unko/workflows/test/badge.svg)\n\nsuper_unko project is the one of the awesome, clean and sophisticated OSS project in the world.\nLet's create poop commands!\n\nsuper_unko プロジェクトは世界で最もクリーンで洗練されたOSSプロジェクトの一つです。\nうんこなコマンドを作りましょう。\n\nTable of Contents\n\n<!--ts-->\n* [Commands](README.md#commands)\n* [Installation](README.md#installation)\n   * [Linux](README.md#linux)\n      * [With yum (RHEL compatible distros)](README.md#with-yum-rhel-compatible-distros)\n      * [With apt (Debian base distros)](README.md#with-apt-debian-base-distros)\n      * [With AUR (ArchLinux base distros)](README.md#with-aur-archlinux-base-distros)\n   * [macOS](README.md#macos)\n   * [Docker](README.md#docker)\n   * [Zsh plugin manager](README.md#zsh-plugin-manager)\n   * [Additional Installation](README.md#additional-installation)\n* [Usage](README.md#usage)\n* [Development](README.md#development)\n   * [Codestyle and lint](README.md#codestyle-and-lint)\n      * [Help](README.md#help)\n      * [Code format](README.md#code-format)\n      * [Code format and save](README.md#code-format-and-save)\n      * [Code lint](README.md#code-lint)\n      * [Code format and lint](README.md#code-format-and-lint)\n   * [Testing](README.md#testing)\n   * [CI workflow](README.md#ci-workflow)\n* [Contribution](README.md#contribution)\n* [LICENSE](README.md#license)\n   * [Source Code](README.md#source-code)\n   * [Logo](README.md#logo)\n* [History](README.md#history)\n* [For Unkontributors (開発者向け)](README.md#for-unkontributors-開発者向け)\n\n<!-- Created by https://github.com/ekalinin/github-markdown-toc -->\n<!-- Added by: runner, at: Mon Apr 11 15:08:44 UTC 2022 -->\n\n<!--te-->\n\nCommands\n========================\n\n| Command       | Description |\n|---------------|-------------|\n| super_unko    | Controles sub unkommands |\n| unko.tr       | Convert various expressions equals to poop into 💩 (poop). |\n| unko.ls       | Shows various poop expression. |\n| unko.yes      | Generate 💩 poop forever. |\n| unko.tower    | Build your poop tower. |\n| unko.pyramid  | Build your poop pyramid. |\n| bigunko.show  | Big poop. |\n| unko.printpnm | Generate 💩 PNM image file. |\n| unko.puzzle   | Sliding block puzzle. |\n| unko.toilet   | Display large 💩 characters. |\n| unko.grep     | Print lines matching a 💩 pattern. |\n| unko.say      | King 💩 says a message. |\n| unko.shout    | King 💩 shouts a message. |\n| unko.think    | King 💩 thinks something. |\n| unko.life     | Play 💩's game of life. |\n| unko.any      | Simple wrapper to 💩 substitution for unko.shout. |\n| unko.king     | Build your king shift tower. |\n| unko.fizzbuzz | No need to implement FizzBuzz. |\n| unko.ping     | Ping the 💩 domain. |\n| unko.encode   | Encode/Decode data and print to standard output. |\n| unko.date     | TBD |\n| unko.awk      | TBD |\n| unko.xargs    | TBD |\n\nInstallation\n========================\n\n## Linux\n\n### With `yum` (RHEL compatible distros)\n\n```\n$ sudo yum install https://git.io/superunko.linux.rpm\n```\n\nUninstall (not `super_unko`)\n\n```\n$ sudo yum remove superunko\n```\n\n\n### With `apt` (Debian base distros)\n\n```\n$ wget https://git.io/superunko.linux.deb\n$ sudo dpkg -i ./superunko.linux.deb\n```\n\nUninstall (not `super_unko`)\n\n```\n$ sudo apt remove superunko\n```\n\n### With AUR (ArchLinux base distros)\n\nYou can install `super_unko` from https://aur.archlinux.org/packages/super_unko-git/ with your favorite aur helper.\n\ne.g. with yay:\n\n```\n$ yay -S super_unko-git\n```\n\nUninstall (not `super_unko`)\n\n```\n$ sudo pacman -R super_unko-git\n```\n\n## macOS\n\n* With Homebrew\n\n```\n$ brew tap unkontributors/unko\n$ brew install super_unko\n```\n\nUninstall\n\n```\n$ brew remove super_unko\n```\n\n\n## Docker\n\n* With docker\n\n```bash\n$ git clone https://github.com/unkontributors/super_unko.git\n$ cd super_unko\n$ docker-compose build\n$ docker-compose run super_unko unko.shout こんにちは\n$ docker run --rm -it unkontributors/super_unko unko.shout こんにちは\n```\n\n## Zsh plugin manager\n\nZsh plugin managers like [antigen](https://github.com/zsh-users/antigen), [zplug](https://github.com/zplug/zplug) can be adoptive.\nNot only commands can be used but also [`command_not_found_handler`](https://github.com/zsh-users/zsh/blob/master/README#L249) is updated.\nIt is extremely helpful for developers.\n\n* Example of antigen\n\n```\nantigen bundle \"unkontributors/super_unko\"\n```\n\n## Additional Installation\n\n- [unko.puzzle](./doc/unko.puzzle.md)\n- unko.shout - Need a [echo-sd](https://github.com/fumiyas/home-commands) command\n- unko.say - Need a `cowsay` command (`$ apt install cowsay`)\n- unko.think - Need a `cowthink` command (`$ apt install cowsay`)\n- unko.toilet - Need a `toilet` command (`$ apt install toilet`)\n\nUsage\n========================\n\n```\n$ echo \"うんこ\" | unko.tr\n💩\n\n$ echo \"うんち\" | unko.tr\n💩\n\n$ ./unko.yes\n💩\n💩\n💩\n💩\n💩\n💩\n💩\n...\n```\n\nDevelopment\n========================\n\n## Codestyle and lint\n\nWe are checking code with [shfmt](https://github.com/mvdan/sh) and [shellcheck](https://github.com/koalaman/shellcheck).\nPlease check your code by `linter.sh` if you want to add your origin unko commands.\nWe must provide clean unkos.\nSo, please run below and pass all checkings.\n\n```bash\nmake setup\n\nmake lint\n# or\n./linter.sh\n```\n\n`linter.sh` checks your code or all code of this project.\n**`linter.sh` depends on `docker` and `docker-compose` commands.**\nAnd you **don't** need to install `shfmt` and `shellcheck`.\n\nUsage examples of `linter.sh` are below.\n\n### Help\n\n```bash\n./linter.sh help\n```\n\n### Code format\n\n```bash\n./linter.sh format\n```\n\n### Code format and save\n\n```bash\n./linter.sh format-save\n```\n\n### Code lint\n\n```bash\n./linter.sh lint\n```\n\n### Code format and lint\n\n```bash\n./linter.sh all\n```\n\n## Testing\n\nWe use the [bats](https://github.com/sstephenson/bats) testing framework.\n`test.sh` calls the `bats`. But you **don't** need to install `bats`.\nTest tasks use `docker` and the `docker` uses `bats` internally and runs tests.\n\nRun below for testing.\n\n```bash\nmake setup ## Need long times to build docker images.\nmake test\n```\n\nRun below for testing on multiple Bash versions.\nPlease do that and fix it if tests failed on CI.\n\n```bash\nmake check\nmake test-bash-version\n```\n\n## CI workflow\n\nCI workflow runs when you pushed.\nWorkflow diagram is below.\n\n![CI push](./doc/ci-push.svg)\n\nContribution\n========================\nWelcome! Welcome!\n\nLICENSE\n==============\n\n## Source Code\n💩 LICENSE\n (Something like BSD license)\n\n## Logo\nCreative 💩 license\n(Something like public domain)\n\nHistory\n==============\n\n* [シェル芸勉強会中に爆誕したsuper_unkoリポジトリを巡る悲喜交々 - Togetter](https://togetter.com/li/1144376)\n* [【まとめたくない】super_unkoリポジトリがスクスク成長【義務感】 - Togetter](https://togetter.com/li/1145304)\n\nFor Unkontributors (開発者向け)\n========================\n\nPlease put your commands under `bin` directory.\nRun `bash package.sh` on a host which `docker` installed to generate multiple installer packages under `pkg` directory.\n\nCodebase is supposed to be scanned with code formatter and static analysis tools to ensure the quality of the code.\nPlease make sure prepared static checks are passed by running `./liner.sh all` before submitting your PR.\nIt would be appreciated if you could add tests to `./test.sh`.\n\nPlease make sure the default branch of this repository is `oshiri` (which means \"bum\") not `master`.\n\nbin 以下になんか思いついたコマンドを放り投げてください。\ndocker が入った環境で `bash package.sh` すると pkg 以下に各種インストーラーが作成されます。\n\nCIでコードフォーマットと静的解析にかけてコード品質を維持するようになりました。\nPRするときは`./linter.sh all`で静的解析をパスすることを確認してください。\n\n可能なら`./test.sh`にもテストコードを追加していただけると助かります。\n\nなお、このリポジトリのデフォルトのブランチは`oshiri`であり`master`ではありません。\n"
  },
  {
    "path": "activate.sh",
    "content": "#!/bin/bash\n\nif ! type super_unko > /dev/null 2>&1; then\n  THIS_DIR=$(\n    cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n  )\n  export PATH=\"$PATH:$THIS_DIR/bin\"\n  # shellcheck source=/dev/null\n  source \"$THIS_DIR/lib/super_unko/unko_command_not_found_hundle\"\nfi\n"
  },
  {
    "path": "bin/bigunko.show",
    "content": "#!/bin/bash\n\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\n\nLIB_DIR=\"${THIS_DIR}/../lib/super_unko\"\nreadonly LIB_DIR\n\necho -ne \"$(base64 --decode < \"${LIB_DIR}/bigunko.txt\" | tr -d \\\\n)\"\n"
  },
  {
    "path": "bin/super_unko",
    "content": "#!/bin/bash\n\nset -eu\n\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\n\nSCRIPT_NAME=\"$(basename \"${BASH_SOURCE:-$0}\")\"\nreadonly SCRIPT_NAME\n\nmain() {\n  if [[ $# -lt 1 ]]; then\n    log \"Must need sub command.\"\n    usage >&2\n    return 1\n  fi\n\n  local cmd=\"$1\"\n  shift\n\n  case \"$cmd\" in\n    help)\n      usage\n      return\n      ;;\n    *)\n      local cmd_path\n      local ret\n\n      set +eu\n      cmd_path=\"$(to_command_path \"$cmd\")\"\n      ret=$?\n      if [[ \"$ret\" -eq 0 ]]; then\n        \"$cmd_path\" \"$@\"\n        return\n      fi\n      set -eu\n\n      log \"Illegal sub command. (cmd = $cmd)\"\n      usage >&2\n      return 1\n      ;;\n  esac\n}\n\nusage() {\n  cat << EOS\n$SCRIPT_NAME is a master of unko.\n\nAbout subcommands:\n    $SCRIPT_NAME controles sub unkommands by own charisma.\n    $SCRIPT_NAME can control them as unkommands if there are executables that\n    called 'unko.*' or 'bigunko.*' in the same directory as $SCRIPT_NAME.\n\nAvailable commands:\nEOS\n  local pad=\"    \"\n  echo \"${pad}help\"\n\n  # bigunko.show系のを先に\n  for cmd_fullpath in \"$THIS_DIR/\"bigunko*; do\n    local cmd=${cmd_fullpath##*/}\n    cmd=${cmd//unko./}\n    echo \"${pad}$cmd\"\n  done\n\n  # unko.*系の\n  for cmd_fullpath in \"$THIS_DIR/\"unko.*; do\n    local cmd=${cmd_fullpath##*/*unko.}\n    echo \"${pad}$cmd\"\n  done\n}\n\nlog() {\n  echo -e \"$SCRIPT_NAME: $*\" 2>&1\n}\n\n## to_command_path はサブコマンド名からunkoコマンドのパスを得る\nto_command_path() {\n  local cmd=\"$1\"\n\n  for cmd_fullpath in \"$THIS_DIR/bigunko\".*; do\n    local big_cmd=${cmd//big/bigunko.}\n    local c=${cmd_fullpath##*/}\n    if [[ \"$c\" == \"$big_cmd\" ]]; then\n      echo \"$cmd_fullpath\"\n      return\n    fi\n  done\n\n  for cmd_fullpath in \"$THIS_DIR/unko\".*; do\n    local c=${cmd_fullpath##*/unko.}\n    if [[ \"$c\" == \"$cmd\" ]]; then\n      echo \"$cmd_fullpath\"\n      return\n    fi\n  done\n\n  return 1\n}\n\nmain ${1+\"$@\"}\nexit $?\n"
  },
  {
    "path": "bin/unko.any",
    "content": "#!/bin/bash\n\nset -eu\n\nusage() {\n  cat << EOF\nUsage: $0 <UNKO> [PHRASE ...]\nUNKO:   Alternative character of 💩.\nPHRASE: Phrase for shout.\nEOF\n  exit 0\n}\n\nif [ $# -lt 1 ]; then\n  usage\nfi\n\nUNKO=\"$1\"\nreadonly UNKO\n\nshift\n\nUNKO_SHOUT=\"${0%/*}/unko.shout\"\nreadonly UNKO_SHOUT\n\nBASE_UNKO=\"$(exec \"$UNKO_SHOUT\" ${1+\"$@\"})\"\nreadonly BASE_UNKO\necho -e \"${BASE_UNKO//💩/$UNKO}\"\n"
  },
  {
    "path": "bin/unko.encode",
    "content": "#!/bin/bash\n\nif [[ \"$LANG\" = zh* ]] || [[ \"$LANG\" = en* ]]; then\n  export TEXTDOMAINDIR=\"/usr/share/locale-langpack/${LANG%%.*}/LC_MESSAGES\"\nelse\n  export TEXTDOMAINDIR=\"/usr/share/locale-langpack/${LANG%%_*}/LC_MESSAGES\"\nfi\nexport TEXTDOMAIN=libc\n\nUNKO_OCT=\"うんこウンコ💩👑\"\nusage() {\n  echo \"Usage: $0 [OPTION] [FILE]\"\n  echo \"Unko encode or decode FILE, or standard input to standard output.\"\n  echo \"With no FILE, or when FILE is -, read standard input.\"\n  echo \"  -d : decode data\"\n  echo \"  -h : display this help and exit\"\n}\n\nencode() {\n  od -b -v -An |\n    sed -e \"y/01234567/$UNKO_OCT/\" |\n    tr -d ' \\n'\n  echo\n}\n\ndecode() {\n  printf '%b' \"$(\n    sed \"s/[^$UNKO_OCT]//g\" |\n      sed \\\n        -e \"s/${UNKO_OCT:0:1}/0/g\" \\\n        -e \"s/${UNKO_OCT:1:1}/1/g\" \\\n        -e \"s/${UNKO_OCT:2:1}/2/g\" \\\n        -e \"s/${UNKO_OCT:3:1}/3/g\" \\\n        -e \"s/${UNKO_OCT:4:1}/4/g\" \\\n        -e \"s/${UNKO_OCT:5:1}/5/g\" \\\n        -e \"s/${UNKO_OCT:6:1}/6/g\" \\\n        -e \"s/${UNKO_OCT:7:1}/7/g\" |\n      tr -d '\\n' |\n      sed 's/.../\\\\&/g'\n  )\"\n}\n\nEXEC_COMMAND=\"encode\"\nFILE=\"-\"\n\nfor arg in \"$@\"; do\n  case \"$arg\" in\n    \"-h\" | \"--help\")\n      usage\n      exit 0\n      ;;\n    \"-d\" | \"--decode\") EXEC_COMMAND=\"decode\" ;;\n    *) FILE=\"$arg\" ;;\n  esac\ndone\n\nif [ \"$FILE\" = - ]; then\n  \"$EXEC_COMMAND\"\nelse\n  if [ -f \"$FILE\" ]; then\n    \"$EXEC_COMMAND\" < \"$FILE\"\n  elif [ -d \"$FILE\" ]; then\n    printf '%s: %s: %s\\n' \"$0\" \"$FILE\" $\"Is a directory\" >&2\n    exit 1\n  elif ! [ -e \"$FILE\" ]; then\n    printf '%s: %s: %s\\n' \"$0\" \"$FILE\" $\"No such file or directory\" >&2\n    exit 1\n  fi\nfi\n\nexit 0\n"
  },
  {
    "path": "bin/unko.fizzbuzz",
    "content": "#!/bin/bash\n\nUNKO_FIZZ='💩'\nUNKO_BUZZ='🍺'\n\nking_unko() {\n  unko.shout \"$1\"\n}\n\nusage() {\n  cat << EOM\n$0: $0 [unsigned_int]\n\n$0: print fizzbuzz unkonized.\n\nEOM\n  exit 0\n}\n\nif [ $# -ne 1 ]; then\n  usage\nfi\n\nis_integer() {\n  IPT=$1\n  if [[ \"$IPT\" =~ ^[0-9]+$ ]]; then\n    return 0\n  else\n    return 1\n  fi\n}\n\nif ! is_integer \"$1\"; then\n  usage\nfi\n\nfor ((NUM = 1; NUM <= $1; NUM++)); do\n  if [ $((NUM % 3)) -eq 0 ] && [ $((NUM % 5)) -eq 0 ]; then\n    king_unko \"fizzbuzz\"\n  elif [ $((NUM % 5)) -eq 0 ]; then\n    echo \"$UNKO_BUZZ < buzz\"\n  elif [ $((NUM % 3)) -eq 0 ]; then\n    echo \"$UNKO_FIZZ < fizz\"\n  else\n    echo \"$NUM\"\n  fi\ndone\n"
  },
  {
    "path": "bin/unko.grep",
    "content": "#!/bin/bash\n\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\n\nLIB_DIR=\"${THIS_DIR}/../lib/super_unko\"\nreadonly LIB_DIR\n\nUNKO_REGEXP=\"$(awk -F , '1<NR{print $1}' \"${LIB_DIR}/unko.csv\" | tr '\\n' '|' | sed -E 's/.$//')\"\nreadonly UNKO_REGEXP\n\ngrep -E \"$UNKO_REGEXP\"\n"
  },
  {
    "path": "bin/unko.king",
    "content": "#!/bin/bash\n\nset -eu\n\nreadonly THIS_CMD=\"${0##*/}\"\nreadonly VERSION=\"v1.1.0\"\n\n# Unko parts\nreadonly TOP=\"${T:-👑}\"\nreadonly UNKO=\"${U:-💩}\"\nreadonly EYE=\"${E:-👁}\"\nreadonly NOSE=\"${N:-👃}\"\nreadonly MOUSE=\"${M:-👄}\"\nreadonly LEFT_BRACKET=\"${L:-（}\"\nreadonly RIGHT_BRACKET=\"${R:-）}\"\nreadonly SPACE=\"${S:-　}\"\n\nmain() {\n  local height=5\n\n  if (($# < 1)); then\n    print_king_unko \"$height\"\n    return\n  fi\n\n  # 第1引数はヘルプ、バージョン、コマンド、段数のいずれか。\n  #\n  # サブコマンドの判定を2回行っている理由は、デフォルト値を使用してサブコマンド\n  # を実行したいケースを処理するため。\n  local opt=\"$1\"\n  shift\n  case \"$opt\" in\n    -h | --help)\n      usage\n      return\n      ;;\n    -v | --version)\n      echo \"$VERSION\"\n      return\n      ;;\n    shout)\n      echo-sd \"$@\"\n      print_king_unko \"$height\"\n      return\n      ;;\n    *)\n      height=\"$opt\"\n\n      if ! [[ \"$height\" =~ ^[[:digit:]]+$ ]]; then\n        err \"Invalid number '$height'\"\n        return 1\n      fi\n\n      # 数値を8進数として解釈しないようにするために\n      # 0埋めの数値の先頭の0を削除\n      height=\"$(sed -E \"s/^0+//\" <<< \"$height\")\"\n\n      if ((height < 5)); then\n        err \"Height must be not less than 5\"\n        err \"See help ($THIS_CMD -h)\"\n        return 1\n      fi\n      ;;\n  esac\n\n  # 引数がなければkingを出力して終了\n  if (($# < 1)); then\n    print_king_unko \"$height\"\n    return\n  fi\n\n  # サブコマンドとその引数として処理\n  local sub_cmd=\"$1\"\n  shift\n  case \"$sub_cmd\" in\n    shout)\n      echo-sd \"$@\"\n      ;;\n    *)\n      err \"Invalid sub command '$sub_cmd'\"\n      err \"See help ($THIS_CMD -h)\"\n      return 1\n      ;;\n  esac\n  print_king_unko \"$height\"\n}\n\nusage() {\n  cat << EOS\n$THIS_CMD prints a king unko.\n\nUsage:\n    $THIS_CMD -h | --help\n    $THIS_CMD -v | --version\n    $THIS_CMD [number] [shout] [sub options...]\n\nExamples:\n    $THIS_CMD\n    $THIS_CMD 5\n    $THIS_CMD shout おはようんこ\n    $THIS_CMD 6 shout こんにちわーるど\n    $THIS_CMD 7 shout --square こんばんわーるど\n    echo さようんこなら | $THIS_CMD 8 shout -s\n\nOptions:\n    -h --help                   Display this help and exit\n    -v --version                Display this version and exit\n\nSub options:\n    You can use options of 'echo-sd'.\n    See 'echo-sd --help'.\nEOS\n}\n\n## print_king_unko はキングウンコを任意の高さで出力する。\nprint_king_unko() {\n  local height=\"$1\"\n  print_unko \"$height\" | set_parts\n}\n\n## print_unko は単純にうんこを任意の高さで出力する。\n## トップには王冠がセットされる。\n##\n## うんこの高さ(h)とhに達するまでの変数iに対するうんこ(u)とパディング(p)算出の式は以下\n##\n## ウンコの数を求める関数 U\n##   U(i)  = 2i - 1   (1 < i)\n##   U'(i) = 0        (1 = i)\n##\n## パディングの数を求める関数 P\n##   P(h,i)  = h - (i - 1)  (1 < i)\n##   P'(h,i) = h + 1        (i = 1)\nprint_unko() {\n  local height=\"$1\"\n\n  for ((i = 1; i <= height; i++)); do\n    if ((i == 1)); then\n      # i=1の時は王冠を出力\n      local p=$((height + 1))\n      local pad\n      pad=\"$(repeat_str \"$p\" \"$SPACE\")\"\n      echo \"${pad}${TOP}\"\n    else\n      # うんこを出力\n      local u=$((2 * i - 1))\n      local p=$((height - (i - 1)))\n      local unko\n      local pad\n      unko=\"$(repeat_str \"$u\" \"$UNKO\")\"\n      pad=\"$(repeat_str \"$p\" \"$SPACE\")\"\n      echo \"${pad}${LEFT_BRACKET}${unko}${RIGHT_BRACKET}\"\n    fi\n  done\n}\n\n## set_parts は目や口などのパーツをうんこにセットする。\nset_parts() {\n  # NOTE:\n  #   sedの置換後の文字列に変数を使うとセパレータ文字が使えなくなるのでsedを使わ\n  #   ない。\n  awk \\\n    -v unko=\"$UNKO\" \\\n    -v eye=\"$EYE\" \\\n    -v nose=\"$NOSE\" \\\n    -v mouse=\"$MOUSE\" \\\n    'NR==3{\n       r = unko unko unko unko unko\n       s = unko eye unko eye unko\n       gsub(r, s)\n       print\n     }\n     NR==4{\n       r = unko unko unko unko unko unko unko\n       s = unko unko unko nose unko unko unko\n       gsub(r, s)\n       print\n     }\n     NR==5{\n       r = unko unko unko unko unko unko unko unko unko\n       s = unko unko unko unko mouse unko unko unko unko\n       gsub(r, s)\n       print\n     }\n     NR<3 || 5<NR { print }'\n}\n\n## repeat_str は任意の回数分、任意の文字を連続した1行のテキストを出力する。\nrepeat_str() {\n  local n=$1\n  local str=$2\n  awk \\\n    -v n=\"$n\" \\\n    -v str=\"$str\" \\\n    'BEGIN{ for (i=0; i<n; i++) { printf \"%s\", str } }'\n  echo\n}\n\nerr() {\n  echo -e \"[ ERR ] $*\" >&2\n}\n\nmain ${1+\"$@\"}\nexit $?\n"
  },
  {
    "path": "bin/unko.life",
    "content": "#!/usr/bin/env bash\n\nset -u\nCELL=()\nNEXT_CELL=()\nCURSOR_Y=0\nCURSOR_X=0\n\n## Use ANSI-C quoting because my text editor's layout is broken..\nreadonly DEFAULT_UNKO_LG_PLAYER=$'\\xf0\\x9f\\x99\\x87' # Person bowing\nreadonly DEFAULT_UNKO_LG_ALIVE=$'\\xe2\\xac\\x9c'      # White tile. Toilet = $'\\xf0\\x9f\\x9a\\xbd'\nreadonly DEFAULT_UNKO_LG_DEAD=$'\\xf0\\x9f\\x92\\xa9'   # Unko\nUNKO_LG_PLAYER=${UNKO_LG_PLAYER:-$DEFAULT_UNKO_LG_PLAYER}\nUNKO_LG_ALIVE=${UNKO_LG_ALIVE:-$DEFAULT_UNKO_LG_ALIVE}\nUNKO_LG_DEAD=${UNKO_LG_DEAD:-$DEFAULT_UNKO_LG_DEAD}\n\ntrap 'clear; cursor_visible' EXIT\n\nusage() {\n  cat <<- USAGE\nUsage:\n  unko.life [OPTIONS] [HEIGHT] [WIDTH]\n\nOPTIONS:\n  -h,--help    Display this help and exit\n\nEnvironment Variables:\n  * UNKO_LG_PLAYER ... Player icon\n  * UNKO_LG_ALIVE  ... Alive cell\n  * UNKO_LG_DEAD   ... Dead cell\n\nExample:\n  Play with below the command if your environment does not support any Emojis.\n    $ UNKO_LG_ALIVE=_ UNKO_LG_DEAD=\"@\" UNKO_LG_PLAYER=\"+\" unko.life\nUSAGE\n}\n\ncursor_visible() {\n  tput cnorm >&2\n}\n\ncursor_invisible() {\n  tput civis >&2\n}\n\ncursor_topleft() {\n  tput cup 0 0\n}\n\ninitialize() {\n  local _height=\"$1\"\n  shift\n  local _width=\"$1\"\n  shift\n  IFS=$'\\n' read -r -a CELL -d '' <<< \"$(yes 0 | head -n \"$((_height * _width))\")\"\n}\n\ndisplay() {\n  local _height=\"$1\"\n  shift\n  local _width=\"$1\"\n  shift\n  local _msg=\"$1\"\n  shift\n  local i=0\n  cursor_topleft\n  printf \"\\033[41m\\033[4m\\033[30m %s \\033[0m: %s \\\\n\" \"Unko Generation\" \"$_msg\"\n  for s in \"${CELL[@]}\"; do\n    ((i % _width == 0)) && echo\n    if ((i == (CURSOR_Y * _width + CURSOR_X))); then\n      printf \"%s\" \"$UNKO_LG_PLAYER\"\n    else\n      [[ \"$s\" == \"0\" ]] && printf \"%s\" \"$UNKO_LG_ALIVE\"\n      [[ \"$s\" == \"1\" ]] && printf \"%s\" \"$UNKO_LG_DEAD\"\n    fi\n    ((i = i + 1))\n  done\n  echo\n  printf \"\\033[30m\\033[47m %s \\033[0m: %s \\\\n\" \"H\" \"Move Player Left\"\n  printf \"\\033[30m\\033[47m %s \\033[0m: %s \\\\n\" \"J\" \"Move Player Down\"\n  printf \"\\033[30m\\033[47m %s \\033[0m: %s \\\\n\" \"K\" \"Move Player Up\"\n  printf \"\\033[30m\\033[47m %s \\033[0m: %s \\\\n\" \"L\" \"Move Player Right\"\n  printf \"\\033[30m\\033[47m %s \\033[0m: %s \\\\n\" \"Space\" \"Generate Or Remove Unko\"\n  printf \"\\033[30m\\033[47m %s \\033[0m: %s \\\\n\" \"S\" \"Start Unko Life Game!\"\n  printf \"\\033[30m\\033[47m %s \\033[0m: %s \\\\n\" \"Ctrl + C\" \"Quit Game\"\n}\n\nget_cell_state() {\n  local _height=\"$1\"\n  shift\n  local _width=\"$1\"\n  shift\n  local _y=\"$1\"\n  shift\n  local _x=\"$1\"\n  shift\n  ((_y < 0 || _y >= _height || _x < 0 || _x >= _width)) && {\n    printf \"%s\\\\n\" 0\n    return\n  }\n  printf \"%s\\\\n\" \"$((CELL[_y * _width + _x]))\"\n}\n\nget_next_cell_state() {\n  local _index=\"$1\"\n  shift\n  local _height=\"$1\"\n  shift\n  local _width=\"$1\"\n  shift\n  local _y=$((_index / _width))\n  local _x=$((_index % _width))\n  local alive_count=\n  alive_count=$({\n    get_cell_state \"$_height\" \"$_width\" \"$((_y - 1))\" \"$((_x - 1))\"\n    get_cell_state \"$_height\" \"$_width\" \"$((_y - 1))\" \"$((_x))\"\n    get_cell_state \"$_height\" \"$_width\" \"$((_y - 1))\" \"$((_x + 1))\"\n    get_cell_state \"$_height\" \"$_width\" \"$((_y))\" \"$((_x - 1))\"\n    get_cell_state \"$_height\" \"$_width\" \"$((_y))\" \"$((_x + 1))\"\n    get_cell_state \"$_height\" \"$_width\" \"$((_y + 1))\" \"$((_x - 1))\"\n    get_cell_state \"$_height\" \"$_width\" \"$((_y + 1))\" \"$((_x))\"\n    get_cell_state \"$_height\" \"$_width\" \"$((_y + 1))\" \"$((_x + 1))\"\n  } | paste -sd+ - | bc)\n  if ((CELL[_index] == 0)); then\n    ((alive_count == 3)) && {\n      printf \"%s\\\\n\" 1\n      return\n    }\n  elif ((CELL[_index] == 1)); then\n    ((alive_count == 2 || alive_count == 3)) && {\n      printf \"%s\\\\n\" 1\n      return\n    }\n    ((alive_count <= 1)) && {\n      printf \"%s\\\\n\" 0\n      return\n    }\n    ((alive_count >= 4)) && {\n      printf \"%s\\\\n\" 0\n      return\n    }\n  fi\n  printf \"%s\\\\n\" \"$((CELL[_index]))\"\n  return\n}\n\nmain() {\n  local _height=\"${1:-10}\"\n  shift\n  local _width=\"${1:-10}\"\n  shift\n  if [[ $_height == '--help' ]] || [[ $_height == '-h' ]]; then\n    trap '' EXIT\n    usage\n    return 0\n  fi\n  if ! [[ $_height =~ ^[0-9]*$ ]] || ! [[ $_width =~ ^[0-9]*$ ]] || ((_height <= 0)) || ((_width <= 0)); then\n    trap '' EXIT\n    usage\n    return 1\n  fi\n  initialize \"$_height\" \"$_width\"\n  clear\n  cursor_invisible\n  while true; do\n    display \"$_height\" \"$_width\" \"Initialize\"\n    read -rsn1 key\n    case $key in\n      h)\n        ((CURSOR_X > 0)) && ((CURSOR_X--))\n        ;;\n      l)\n        ((CURSOR_X < (_width - 1))) && ((CURSOR_X++))\n        ;;\n      k)\n        ((CURSOR_Y > 0)) && ((CURSOR_Y--))\n        ;;\n      j)\n        ((CURSOR_Y < (_height - 1))) && ((CURSOR_Y++))\n        ;;\n      s)\n        # START GAME\n        break\n        ;;\n      *)\n        # Reverse cell state\n        ((CELL[CURSOR_Y * _width + CURSOR_X] = 1 - CELL[CURSOR_Y * _width + CURSOR_X]))\n        ;;\n    esac\n  done\n\n  CURSOR_Y=-1\n  CURSOR_X=-1\n  local generation=0\n  while true; do\n    i=0\n    display \"$_height\" \"$_width\" \"     $generation     \"\n    for s in \"${CELL[@]}\"; do\n      NEXT_CELL[i]=\"$(get_next_cell_state \"$i\" \"$_height\" \"$_width\")\"\n      ((i++))\n    done\n    CELL=(\"${NEXT_CELL[@]}\")\n    ((generation++))\n  done\n}\n\nmain ${1+\"$@\"}\nexit $?\n"
  },
  {
    "path": "bin/unko.ls",
    "content": "#!/bin/bash\n# Jot down any expression that means 💩.\n\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\n\nLIB_DIR=\"${THIS_DIR}/../lib/super_unko\"\nreadonly LIB_DIR\n\nawk -F , '1<NR{print $1}' \"${LIB_DIR}/unko.csv\"\n"
  },
  {
    "path": "bin/unko.ping",
    "content": "#!/usr/bin/env bash\n# Ping the poop domain 💩.\n\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\n\nLIB_DIR=\"${THIS_DIR}/../lib/super_unko\"\nreadonly LIB_DIR\n\nTLDs=(\"com\")\n\nfor tld in \"${TLDs[@]}\"; do\n  while read -r unko; do\n    LANG=C.UTF-8 ping -c 1 -s 1 -W 1 \"${unko}.${tld}\" 2> /dev/null 1>&2 && echo \"Success ping to ${unko}.${tld}\"\n  done < <(cut -d \",\" -f 1 < \"${LIB_DIR}/unko.csv\" | sed \"1d\")\ndone\nexit 0\n"
  },
  {
    "path": "bin/unko.printpnm",
    "content": "#!/bin/bash\n\nSCRIPT_NAME=\"$(basename \"${BASH_SOURCE:-$0}\")\"\nreadonly SCRIPT_NAME\nreadonly VERSION=v1.0.1\n\n## main はメイン関数である。スクリプトの末尾で呼び出す。\n##\n## @param level    うんこの段数\n## @param color_r  RGB値のR (0~255)\n## @param color_g  RGB値のG (0~255)\n## @param color_b  RGB値のB (0~255)\nmain() {\n  local level=$1\n  local color_r=$2\n  local color_g=$3\n  local color_b=$4\n\n  local col\n  local row\n  local rgb\n  col=$(max_stage_col \"$level\")\n  row=$(max_stage_row \"$level\")\n  rgb=$(max_value \"$color_r\" \"$color_g\" \"$color_b\")\n\n  cat << EOS\nP3\n$col $row\n$rgb\nEOS\n  cat << EOS | align_center 0 | sed -E \"s/ /0/g;s/0/0 0 0 /g;s/[^ 0]/$color_r $color_g $color_b /g\"\n1\n1\n111\n11111\n$(stages \"$level\")\nEOS\n}\n\n## max_stage_col は段のカラム幅を返す。\n##\n## @param n うんこの段数\n## @return うんこの横幅\nmax_stage_col() {\n  local n=$1\n  echo $((11 + 8 * (n - 1) + 2))\n}\n\n## max_stage_col は段数を返す。\n##\n## @param n うんこの段数\n## @return うんこの高さ\nmax_stage_row() {\n  local n=$1\n  echo $((4 + 4 * n))\n}\n\n## max_value は引数のうち最も大きな値を返す。\n##\n## @param  1\n## @param  2\n## @param  3\n## @return 前述の3つの値のうち、もっとも数値として大きい値\nmax_value() {\n  echo -e \"$1\\n$2\\n$3\" | sort -n | tail -n 1\n}\n\n## repeat は渡された引数の数分だけ1を出力して返す。\n## 返す文字列は1行である。\n##\n## @param n 何文字繰り返すか\n## @param c 出力する文字 (デフォルト: 1)\n## @return n回繰り返した1\nrepeat() {\n  local n=$1\n  local c=${2:-1}\n  seq \"$n\" | xargs -I@ echo -n \"$c\"\n}\n\n## stage はうんこの段を返す。\n## 引数は段の横幅を指定する。\n## 段、はうんこの横野箇所をさす。\n## （    ） <- のこと\n##\n## @param i うんこの段の番号\n## @param i番目のうんこ段\nstage() {\n  local i=$1\n  local j=$((i + 2))\n  cat << EOS\n$(repeat \"$i\")\n$(repeat \"$j\")\n$(repeat \"$j\")\n$(repeat \"$i\")\nEOS\n}\n\n## stages は引数に指定した数だけうんこの段を返す。\n## たとえば、2を指定したときは以下のようなイメージになる。\n##  （   ）\n## （     ）\n##\n## @param n うんこが何段か\n## @param n回くりかえしたうんこの段\nstages() {\n  local n=$1\n  seq \"$n\" | while read -r i; do\n    stage $((11 + 8 * (i - 1)))\n  done\n}\n\n## align_center は標準入力を指定の文字列で埋めて中央寄せする。\n##\n## @param pad 中央寄せのために詰める文字列\n##            全角文字はNG\n## @return 中央寄せされた文字列\nalign_center() {\n  local pad=\"$1\"\n\n  # 最も大きい横幅を取得\n  local max_width=0\n  local lines=()\n  while read -r line; do\n    local w\n    w=$(wc -c <<< \"$line\")\n\n    if [ \"$max_width\" -lt \"$w\" ]; then\n      max_width=$w\n    fi\n    lines+=(\"$line\")\n  done\n\n  # うんこを1行ずつ出力\n  for line in \"${lines[@]}\"; do\n    local w\n    w=$(wc -c <<< \"$line\")\n\n    local left_width=$(((max_width - w) / 2))\n    local right_width=$((max_width - left_width - w))\n    echo \"$(repeat \"$left_width\" \"$pad\")$line$(repeat \"$right_width\" \"$pad\")\"\n  done\n}\n\n## usage はこのスクリプトの使い方を標準出力する。\nusage() {\n  cat << EOS\n$SCRIPT_NAME はうんこをPNM画像として出力するためのコマンドです。\n\nUsage:\n\n    $SCRIPT_NAME [flags] [unko_level]\n\nExamples:\n\n    # 通常の使用方法\n    $SCRIPT_NAME 3 > unko3.pnm\n\n    # RGB値を指定する例\n    $SCRIPT_NAME 3 -r 255 -g 0 -b 0 > unko_rgb.pnm\n\n    # PNG画像に変換する例（ImageMagickに依存）\n    $SCRIPT_NAME 3 -r 255 -g 0 -b 0 | convert - -scale 100x100 /images/t.png\n\nFlags:\n\n    -h, --help          このヘルプを出力する\n        --version       バージョン情報を出力する\n    -r, --red int       RGB値のRを指定 (0~255) (default: 255)\n    -g, --green int     RGB値のGを指定 (0~255) (default: 255)\n    -b, --blue int      RGB値のBを指定 (0~255) (default: 255)\n    -u, --unko-color    RGB値にうんこ色を指定する\n\nEOS\n}\n\n## log はスクリプト名と合わせて、メッセージをエラー出力する。\nlog() {\n  echo -e \"$SCRIPT_NAME: $*\" >&2\n}\n\n## is_empty は引数が空文字列であるかを判定する。\nis_empty() {\n  [[ -z \"$1\" ]]\n}\n\n## is_opt_key は引数がコマンドライン引数のオプションキーであるかを判定する。\nis_opt_key() {\n  [[ \"$1\" =~ ^-+ ]]\n}\n\n## validate_opt_value は引数がコマンドオプションの値であるかを判定する。\n## 不正な値の場合はシェルを異常終了する。\nvalidate_opt_value() {\n  local value=$1\n  if is_empty \"$value\" || is_opt_key \"$value\"; then\n    log \"requires an argument -- $value\"\n    exit 1\n  fi\n}\n\n## set_opts はコマンドライン引数を解析して変数にセットする。\n## セットする変数は下記の通り。\n## - opt_red\n## - opt_green\n## - opt_blue\n## - opt_unko_level\n## これらの変数はトップレベルの変数として初期値を設定しておくこと。\nset_opts() {\n  local opt_use_unko_color=false\n  while ((0 < $#)); do\n    local opt=$1\n    shift\n\n    case \"$opt\" in\n      '-h' | '--help')\n        usage\n        exit\n        ;;\n      '--version')\n        echo $VERSION\n        exit\n        ;;\n      '-r' | '--red')\n        local color=$1\n        shift\n        validate_opt_value \"$color\"\n        opt_red=\"$color\"\n        ;;\n      '-g' | '--green')\n        local color=$1\n        shift\n        validate_opt_value \"$color\"\n        opt_green=\"$color\"\n        ;;\n      '-b' | '--blue')\n        local color=$1\n        shift\n        validate_opt_value \"$color\"\n        opt_blue=\"$color\"\n        ;;\n      '-u' | '--unko-color')\n        opt_use_unko_color=true\n        ;;\n      -*)\n        log \"illegal option -- $1\"\n        exit 1\n        ;;\n      *)\n        opt_unko_level=$opt\n        ;;\n    esac\n  done\n\n  if [ \"$opt_use_unko_color\" = true ]; then\n    opt_red=217\n    opt_green=112\n    opt_blue=2\n  fi\n}\n\n# テストフラグが付与されている時はmain関数を呼び出さない。\nif [ ! \"$RUN_TEST\" = true ]; then\n  # コマンドライン引数を取得\n  opt_red=255\n  opt_green=255\n  opt_blue=255\n  opt_unko_level=3\n  set_opts ${1+\"$@\"}\n\n  main \"$opt_unko_level\" \"$opt_red\" \"$opt_green\" \"$opt_blue\"\nfi\n"
  },
  {
    "path": "bin/unko.puzzle",
    "content": "#!/usr/bin/env bash\nset -eu\nFRAME=30\nTILES=${TILES:-3}\nHEADER_HEIGHT=23 # Darwin\nRANDOM_SLIDE=$((10 + TILES * TILES * TILES / 2))\nPIXEL_ART_COLS=60 # BIGUNKO'\nPIXEL_ART_ROWS=30 # BIGUNKO\nDEBUG_UNKO=${DEBUG_UNKO:-false}\nWINDOW_NAME=\"$(basename $0)\"\nBIGUNKO=\"\"\nWIDS=()\n\nlog_debug() {\n  if [ \"$DEBUG_UNKO\" = \"true\" ]; then\n    echo \"[$$] $@\" >&2\n  fi\n}\n\ninitialize() {\n  platform=$(uname)\n  # process stratum: this process -> shell(bash) -> terminal emulator ?\n  pppid=$(ps -ef | awk \"\\$2==$PPID{print \\$3}\")\n  case $platform in\n    'Darwin')\n      HEIGHT_OFFSET=-44\n      WIDTH_OFFSET=0\n      ;;\n    'Linux')\n      HEIGHT_OFFSET=-68\n      WIDTH_OFFSET=-10\n      ;;\n    *)\n      echo \"error: $platform: unsupported platform\" >&2\n      exit 1\n      ;;\n  esac\n\n  if [ $(ps -ef | awk \"\\$2==$pppid{print}\" | grep [x]term | wc -l) -eq 0 ]; then\n    echo 'error: require xterm' >&2\n    exit 1\n  fi\n\n  which xdotool > /dev/null 2>&1 || {\n    echo 'error: require xdotool' >&2\n    exit 1\n  }\n\n  # expects current window is active\n  root_cols=$(stty -a | grep columns | sed 's/.*columns \\([^;]*\\);.*/\\1/')\n  root_rows=$(stty -a | grep rows | sed 's/.*rows \\([^;]*\\);.*/\\1/')\n  root_wid=$(xdotool getactivewindow)\n  root_wname=$(xdotool getwindowname $root_wid)\n  root_wgeo=$(xdotool getwindowgeometry $root_wid | grep Geometry | awk '{print $2}')\n  root_wpos=$(xdotool getwindowgeometry $root_wid | grep Position | awk '{print $2}')\n  char_width=$((${root_wgeo%x*} / $root_cols))\n  char_height=$((${root_wgeo#*x} / $root_rows))\n  margin_width=$((${root_wgeo%x*} % $root_cols))\n  margin_height=$((${root_wgeo#*x} % $root_rows))\n  tile_window_width=$(($PIXEL_ART_COLS / $TILES * $char_width + $margin_width))\n  tile_window_height=$(($PIXEL_ART_ROWS / $TILES * $char_height + $margin_height))\n  tile_char_cols=$(($PIXEL_ART_COLS / $TILES))\n  tile_char_rows=$(($PIXEL_ART_ROWS / $TILES))\n  log_debug \"window name: $WINDOW_NAME\"\n  log_debug \"number of tiles on a side: $TILES\"\n  log_debug \"root window columns: $root_cols\"\n  log_debug \"root window rows: $root_rows\"\n  log_debug \"root window id: $root_wid\"\n  log_debug \"root window name: $root_wname\"\n  log_debug \"root window geometry: $root_wgeo\"\n  log_debug \"root window position: $root_wpos\"\n  log_debug \"character width: $char_width\"\n  log_debug \"character height: $char_height\"\n  log_debug \"margin width: $margin_width\"\n  log_debug \"margin height: $margin_height\"\n  log_debug \"tile window width: $tile_window_width\"\n  log_debug \"tile window height: $tile_window_height\"\n  log_debug \"tile character columns: $tile_char_cols\"\n  log_debug \"tile character rows: $tile_char_rows\"\n}\n\ncalculate_tile_position() {\n  local tile_pos_x=$1 tile_pos_y=$2\n  local wpos_x=$((${root_wpos%,*} + $tile_window_width * $tile_pos_x + $WIDTH_OFFSET))\n  local wpos_y=$((${root_wpos#*,} + ($tile_window_height + $HEADER_HEIGHT) * $tile_pos_y + $HEIGHT_OFFSET))\n  log_debug \"calculate position: tile=${tile_pos_x},${tile_pos_y}; window=${wpos_x},${wpos_y}\"\n  echo \"${wpos_x},${wpos_y}\"\n}\n\nset_root_window() {\n  local wpos=$(calculate_tile_position 1 0)\n  local wpos_x=${wpos%,*} wpos_y=${wpos#*,}\n  log_debug \"set root window: wid=$root_wid; geometry=${tile_window_width}x${tile_window_height}; position=${wpos_x},${wpos_y}\"\n  xdotool set_window --name \"$WINDOW_NAME\" $root_wid\n  xdotool windowsize $root_wid $tile_window_width $tile_window_height\n  xdotool windowmove $root_wid $wpos_x $wpos_y\n  clear\n}\n\ncreate_children() {\n  local num_children=$(($TILES * $TILES - 2))\n  log_debug \"number of child windows: $num_children\"\n  for i in $(seq 2 $(($num_children + 1))); do\n    local wpos=$(calculate_tile_position $(($i % $TILES)) $(($i / $TILES)))\n    local wpos_x=${wpos%,*} wpos_y=${wpos#*,}\n    log_debug \"create child window: $i; geometry=${tile_char_cols}x${tile_char_rows}(chars); position=${wpos_x},${wpos_y}\"\n    xterm \\\n      -geometry \"${tile_char_cols}x${tile_char_rows}+${wpos_x}+${wpos_y}\" \\\n      -e \"$0\" &\n  done\n  sleep $(echo \"scale=1; 0.3 + $TILES * $TILES / 10\" | bc)\n}\n\nrelocate() {\n  local wids=($1)\n  local i=1\n  for wid in ${wids[@]}; do\n    local wpos_x=$((${root_wpos%,*} + $tile_window_width * ($i % $TILES) + $WIDTH_OFFSET))\n    local wpos_y=$((${root_wpos#*,} + ($tile_window_height + $HEADER_HEIGHT) * ($i / $TILES) + $HEIGHT_OFFSET))\n    log_debug \"relocate window: wid=$wid; position=${wpos_x},${wpos_y}\"\n    xdotool windowmove $wid $wpos_x $wpos_y\n    let ++i\n  done\n}\n\ntrim_bigunko() {\n  local tile_pos_x=$1 tile_pos_y=$2\n  if [ \"$BIGUNKO\" == \"\" ]; then\n    # cache bigunko to prevent broken pipe error\n    BIGUNKO=$($(\n      cd $(dirname $0)\n      pwd\n    )/bigunko.show | sed $'s/\\(\\033\\[48;5;[0-9]*m\\)　/\\\\1 \\\\1 /g')\n  fi\n\n  echo \"$BIGUNKO\" |\n    head -n $(($tile_char_rows * ($tile_pos_y + 1))) |\n    tail -n $tile_char_rows |\n    sed $'s/\\(\\033\\[48;5;[0-9]*m\\)　/\\\\1 \\\\1 /g' |\n    awk \"\n    {\n      for (k = $tile_char_cols * $tile_pos_x + 1; k < $tile_char_cols * ($tile_pos_x + 1) + 1; k++) {\n        printf \\$k\\\" \\\";\n      };\n      printf \\\"\\033[0m\\\";\n      if (NR != $tile_char_rows) { print \\\"\\\" };\n    }\"\n}\n\nget_child_tty_names() {\n  local child_wids=\"$1\"\n  for wid in $child_wids; do\n    local pid=$(xdotool getwindowpid $wid)\n    # get tty name of child process\n    tty_name=$(ps -ef | grep \"$WINDOW_NAME\" | awk \"\\$3==$pid{print \\$6}\")\n    log_debug \"child process: wid=${wid}; pid=${pid}; tty=/dev/${tty_name}\"\n    echo $tty_name\n  done\n}\n\ndraw() {\n  local child_wids=\"$1\"\n  local tty_names=($(get_child_tty_names \"$child_wids\"))\n  local tile_pos_x=1 tile_pos_y=0\n  log_debug \"draw window: root; tile position=$tile_pos_x,$tile_pos_y\"\n  trim_bigunko $tile_pos_x $tile_pos_y\n  for i in $(seq 0 $((${#tty_names[@]} - 1))); do\n    tile_pos_x=$((($i + 2) % $TILES))\n    tile_pos_y=$((($i + 2) / $TILES))\n    log_debug \"draw window: child $((i + 1)); tile position=$tile_pos_x,$tile_pos_y; tty=/dev/${tty_names[i]}\"\n    trim_bigunko $tile_pos_x $tile_pos_y >> /dev/${tty_names[i]}\n  done\n}\n\nterminate_children() {\n  local child_wids=\"$1\"\n  local i=0\n  for wid in $child_wids; do\n    # TODO: pid がない場合を考慮\n    local pid=$(xdotool getwindowpid $wid)\n    kill -INT $pid\n    let ++i\n  done\n  return\n}\n\nslide_window() {\n  local wid=$1\n  local distance_x=$2\n  local distance_y=$3\n  local pos=$(xdotool getwindowgeometry $wid | grep Position | awk '{print $2}')\n  local pos_x=${pos%,*}\n  local pos_y=${pos#*,}\n  log_debug \"slide window: wid=$wid; pos=$pos_x,$pos_y; dis=$distance_x,$distance_y\"\n  for i in $(seq $FRAME); do\n    xdotool windowmove $wid $(($pos_x + $distance_x / $FRAME * $i + $WIDTH_OFFSET)) $(($pos_y + $distance_y / $FRAME * $i + $HEIGHT_OFFSET))\n  done\n  xdotool windowmove $wid $(($pos_x + $distance_x + $WIDTH_OFFSET)) $(($pos_y + $distance_y + $HEIGHT_OFFSET))\n}\n\nshake_window() {\n  local wid=$1\n  local pos=$(xdotool getwindowgeometry $wid | grep Position | awk '{print $2}')\n  local pos_x=${pos%,*}\n  local pos_y=${pos#*,}\n  for i in $(seq 5); do\n    xdotool windowmove $wid $(($pos_x - 10 + $WIDTH_OFFSET)) $(($pos_y + $HEIGHT_OFFSET))\n    xdotool windowmove $wid $(($pos_x + $WIDTH_OFFSET)) $(($pos_y + $HEIGHT_OFFSET))\n    xdotool windowmove $wid $(($pos_x + 10 + $WIDTH_OFFSET)) $(($pos_y + $HEIGHT_OFFSET))\n    xdotool windowmove $wid $(($pos_x + $WIDTH_OFFSET)) $(($pos_y + $HEIGHT_OFFSET))\n  done\n}\n\ncan_slide() {\n  local null_index=$1\n  local direction=$2\n  case $direction in\n    'up') if [ $null_index -lt $(($TILES * $TILES - $TILES)) ]; then return 0; fi ;;\n    'down') if [ $null_index -ge $TILES ]; then return 0; fi ;;\n    'left') if [ $(($null_index % $TILES)) -ne $(($TILES - 1)) ]; then return 0; fi ;;\n    'right') if [ $(($null_index % $TILES)) -ne 0 ]; then return 0; fi ;;\n  esac\n  return 1\n}\n\nmove_tile() {\n  local direction=$1\n  local anotation=$2\n  local null_index=$(echo \"${WIDS[@]}\" | tr ' ' '\\n' | nl -v0 | grep null | awk '{print $1}')\n  local wid target_index distance_x distance_y\n  # log_debug \"current window ids: ${WIDS[@]}\"\n\n  if can_slide $null_index $direction; then\n    case $direction in\n      'up')\n        target_index=$(($null_index + $TILES))\n        distance_x=0\n        distance_y=$((-$tile_window_height - $HEADER_HEIGHT))\n        ;;\n      'down')\n        target_index=$(($null_index - $TILES))\n        distance_x=0\n        distance_y=$(($tile_window_height + $HEADER_HEIGHT))\n        ;;\n      'left')\n        target_index=$(($null_index + 1))\n        distance_x=-$tile_window_width\n        distance_y=0\n        ;;\n      'right')\n        target_index=$(($null_index - 1))\n        distance_x=$tile_window_width\n        distance_y=0\n        ;;\n    esac\n    wid=${WIDS[$target_index]}\n    # log_debug \"slide window: direction=${direction}; target index=${target_index}; wid=${wid}\"\n    slide_window $wid $distance_x $distance_y\n    WIDS[$null_index]=$wid\n    WIDS[$target_index]='null'\n  else\n    if [ \"$anotation\" = 'true' ]; then\n      case $direction in\n        'up') target_index=$(($null_index - $TILES)) ;;\n        'down') target_index=$(($null_index + $TILES)) ;;\n        'left') target_index=$(($null_index - 1)) ;;\n        'right') target_index=$(($null_index + 1)) ;;\n      esac\n      wid=${WIDS[$target_index]}\n      shake_window $wid\n    fi\n  fi\n}\n\nrandomize() {\n  local direction\n  local prev=-1\n  local count=0\n  while [ $count -le $RANDOM_SLIDE ]; do\n    local rand=$((RANDOM % 4))\n    case $rand in\n      0)\n        direction='up'\n        if [ $prev -eq 1 ]; then continue; fi\n        ;;\n      1)\n        direction='down'\n        if [ $prev -eq 0 ]; then continue; fi\n        ;;\n      2)\n        direction='left'\n        if [ $prev -eq 3 ]; then continue; fi\n        ;;\n      3)\n        direction='right'\n        if [ $prev -eq 2 ]; then continue; fi\n        ;;\n    esac\n    local null_index=$(echo \"${WIDS[@]}\" | tr ' ' '\\n' | nl -v0 | grep null | awk '{print $1}')\n    if can_slide $null_index $direction; then\n      move_tile $direction 'false'\n      prev=$rand\n      # log_debug \"randomize: count=$count; direction=$direction\"\n      let ++count\n    fi\n  done\n}\n\nsolve() {\n  local collect_hash=$(echo -n $1 | md5sum | cut -d' ' -f1)\n  while IFS= read -r -n1 -s key; do\n    if [ \"$key\" == $'\\x1b' ]; then\n      read -r -n2 -s rest\n      key+=\"$rest\"\n    fi\n    case \"$key\" in\n      k | $'\\x1b\\x5b\\x41')\n        move_tile 'up' 'true'\n        ;;\n      j | $'\\x1b\\x5b\\x42')\n        move_tile 'down' 'true'\n        ;;\n      l | $'\\x1b\\x5b\\x43')\n        move_tile 'right' 'true'\n        ;;\n      h | $'\\x1b\\x5b\\x44')\n        move_tile 'left' 'true'\n        ;;\n    esac\n    local wids_hash=$(echo -n \"${WIDS[@]}\" | md5sum | cut -d' ' -f1)\n    if [ \"$wids_hash\" = \"$collect_hash\" ]; then break; fi\n  done\n}\n\nclean_up() {\n  # reset root window\n  xdotool set_window --name \"$root_wname\" $root_wid\n  xdotool windowsize $root_wid ${root_wgeo%x*} $((${root_wgeo#*x} + $WIDTH_OFFSET))\n  xdotool windowmove $root_wid ${root_wpos%,*} $((${root_wpos#*,} + $HEIGHT_OFFSET))\n  stty echo\n  clear\n  exit 0\n}\n\nprocesses=$(ps -ef | grep $WINDOW_NAME | grep -v grep)\nif [ $(echo \"$processes\" | wc -l) -le 2 ]; then\n  # parent window\n  initialize\n  set_root_window\n  trap clean_up 2 # 2:SIGINT\n  create_children\n  xdotool windowactivate $root_wid\n  xdotool windowfocus $root_wid\n  wids=$(xdotool search --name \"$WINDOW_NAME\") # newline separated\n  child_wids=$(echo \"$wids\" | grep -v $root_wid | tr '\\n' ' ')\n  relocate \"$root_wid $child_wids\"\n  draw \"$child_wids\"\n  WIDS=('null' $root_wid $child_wids)\n  randomize\n  xdotool windowactivate $root_wid\n  xdotool windowfocus $root_wid\n  solve \"null $root_wid $child_wids\"\n  terminate_children \"$child_wids\"\n  clean_up\nelse\n  # child window\n  cat\nfi\n"
  },
  {
    "path": "bin/unko.pyramid",
    "content": "#!/usr/bin/env bash\n\n# Sierpinski gasket is not unkoski gasket.\n# Sierpinski is great mathematician.\n# unkoski is peoples who love the unko.\n\nSCRIPT_NAME=\"$(basename \"${BASH_SOURCE:-$0}\")\"\nreadonly SCRIPT_NAME\nreadonly VERSION=v1.0.0\n\ndraw_pyramid() {\n  local input=\"${1:-1}\"\n  if [[ \"$input\" =~ ^1 ]]; then\n    return 0\n  fi\n  echo \"${input//10/💩}\" | cut -c 2- | tr 01 ' 💩'\n  next_input=$(echo \"0${input}0\" | awk -F '' '{l=length($0);for(i=1;i<=l-2;i++){printf ($i+$(i+2))%2}}')\n  draw_pyramid \"$next_input\"\n}\n\nrendering() {\n  ## draw! 💩 turn!\n  local pyramid_size=\"${1:-16}\"\n  draw_pyramid \"$(printf \"%0$((pyramid_size + 1))d%0${pyramid_size}d\" 1)\"\n}\n\n## unko.printpnmを参考に...\nlog() {\n  echo -e \"$SCRIPT_NAME: $*\" >&2\n}\n\nusage() {\n  cat << EOS\n\n$SCRIPT_NAME is render unkoski gasket.\nSorry, could not beautiful rendering by some environment...\n\nUsage:\n    $SCRIPT_NAME [unko_size (default:16)]\nExamples:\n    $SCRIPT_NAME 16\nFlags:\n    -h, --help          show help\n        --version       show version\nEOS\n  exit 0\n}\n\nmain() {\n  while ((0 < $#)); do\n    local opt=$1\n    shift\n\n    case \"$opt\" in\n      '-h' | '--help')\n        usage\n        exit\n        ;;\n      '--version')\n        echo $VERSION\n        exit\n        ;;\n      -*)\n        log \"illegal option '$opt'\"\n        exit 1\n        ;;\n      *)\n        unko_size=$opt\n        if ! [[ $unko_size =~ ^[1-9]+[[:digit:]]*$ ]]; then\n          log \"Invalid number '$unko_size'\"\n          return 1\n        fi\n        ;;\n    esac\n  done\n\n  rendering \"$unko_size\"\n  return 0\n}\n\nmain ${1+\"$@\"}\nexit $?\n"
  },
  {
    "path": "bin/unko.question",
    "content": "#!/bin/bash\nTEXT=$*\n\neval unko.shout \"${TEXT}\"\n\nwhile :; do\n  read -rp \"ok? (y/N/u): \" ynu\n  case \"$ynu\" in\n    [yY]*)\n      # y|Yの場合は正常終了\n      exit 0\n      ;;\n\n    [uU]*)\n      # u|Uの場合は再度聞く\n      eval unko.shout \"ブリブリブリ…\" \"もう一度聞いてやろう\" \"${TEXT}\"\n      continue\n      ;;\n\n    *)\n      # デフォルト(N)で127で終了\n      exit 127\n      ;;\n  esac\ndone\n"
  },
  {
    "path": "bin/unko.say",
    "content": "#!/bin/bash\n\n# Get current directory\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\n\nLIB_DIR=\"${THIS_DIR}/../lib/super_unko\"\nreadonly LIB_DIR\n\nCOW_FILE=\"${LIB_DIR}/unko_mb.cow\"\nif ! (cowsay -f \"${COW_FILE}\" 'うんこ' | grep -qe 'うんこ' &&\n  cowsay -f \"${COW_FILE}\" 'もりもり' | grep -qe '💩'); then\n  COW_FILE=\"${LIB_DIR}/unko.cow\"\nfi\n\ncowsay -f \"${COW_FILE}\" \"$@\"\n"
  },
  {
    "path": "bin/unko.shout",
    "content": "#!/bin/bash\n\necho-sd ${1+\"$@\"}\nt=\"${T:-👑}\"         # Top\nu=\"${U:-💩}\"         # Unko\nle=\"${LE:-${E:-👁}}\" # Left Eye\nre=\"${RE:-${E:-👁}}\" # Right Eye\nn=\"${N:-👃}\"         # Nose\nm=\"${M:-👄}\"         # Mouth\nl=\"${L:-（}\"         # Left side\nr=\"${R:-）}\"         # Right side\ns=\"${S:-　}\"         # Space\ncat << EOF\n$s$s$s$s$s$s$t\n$s$s$s$s$l$u$u$u$r\n$s$s$s$l$u$le$u$re$u$r\n$s$s$l$u$u$u$n$u$u$u$r\n$s$l$u$u$u$u$m$u$u$u$u$r\nEOF\n"
  },
  {
    "path": "bin/unko.think",
    "content": "#!/bin/bash\n\n# Get current directory\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\n\nLIB_DIR=\"${THIS_DIR}/../lib/super_unko\"\nreadonly LIB_DIR\n\nCOW_FILE=\"${LIB_DIR}/unko_mb.cow\"\nif ! (cowsay -f \"${COW_FILE}\" 'うんこ' | grep -qe 'うんこ' &&\n  cowsay -f \"${COW_FILE}\" 'もりもり' | grep -qe '💩'); then\n  COW_FILE=\"${LIB_DIR}/unko.cow\"\nfi\n\ncowthink -f \"${COW_FILE}\" \"$@\"\n"
  },
  {
    "path": "bin/unko.toilet",
    "content": "#!/bin/bash\n\nusage() {\n  cat << EOS >&2\nUsage: unko.toilet [ -hv ] [ -w outputwidth ]\n                   [ --crop ] [ --flip ] [ --flop ]\n                   [ --180 ] [ --left ] [ --right ]\n                   [ --border ] [ message ]\n\n  -h, --help                  このヘルプを出力して終了します\n  -w, --width <width, auto>   出力の幅です。autoを指定すると端末の幅になります\n      --crop                  上下左右の無駄なスペースを削除します\n      --flip                  水平方向に反転します\n      --flop                  垂直方向に反転します\n      --180                   180度回転します\n      --left                  左へ90度回転します\n      --right                 右へ90度回転します\n      --border                枠線をつけます\nEOS\n  exit 1\n}\n\nnot_found() {\n  echo \"[ERR] $* not found  [unko.toilet]\" 1>&2\n  exit 1\n}\n\nappend_opt() {\n  toilet_opt+=(\"$@\")\n}\n\nversion() {\n  echo \"unko.toilet version 💩.💩.💩 (20💩💩/💩💩/💩💩)\"\n  exit 0\n}\n\nunexpected() {\n  echo \"[ERR] Unexpected $1\" 1>&2\n  echo \"\" 1>&2\n  usage\n}\n\nis_integer() {\n  local num\n  num=$1\n  [[ \"$num\" =~ ^[0-9]+$ ]]\n}\n\n# unko.toilet 用のオプションをパースする\ndeclare -a args\ndeclare -a toilet_opt\nwhile (($# > 0)); do\n  opt=$1\n  shift\n\n  case \"$opt\" in\n    -h | --help)\n      # --help か -h が指定されていたらUsage出して終了\n      usage\n      ;;\n    -v | --version)\n      # --version か -v なら version情報を出力して終了\n      version\n      ;;\n    -w | --width)\n      num=$1\n      shift\n\n      if is_integer \"$num\"; then\n        append_opt \"--width\" \"$num\"\n      elif [ \"$num\" = auto ]; then\n        append_opt \"--termwidth\"\n      else\n        unexpected \"argument $opt $num <=\"\n      fi\n      ;;\n    --left | --right | --flip | --flop | --180 | --border | --crop)\n      append_opt \"--filter\" \"${opt//--/}\"\n      ;;\n    -*)\n      # いずれのオプションともマッチしなかった\n      unexpected \"option $opt\"\n      ;;\n    *)\n      # 引数\n      args+=(\"$opt\")\n      ;;\n  esac\ndone\n\n# 第一引数に与えた文字を変換、デフォルト文字はうんこ\ntext=(\"${args[@]:-うんこ}\")\n\n# stdinから入力されてるならそっちを使う\n[ -p /dev/stdin ] && text=(\"$(cat -)\")\n\n# toilet がなかったらダメ\ntype toilet &> /dev/null || not_found \"toilet command\"\n\n# フォントにbigmono9を使うので無かったらダメ\necho | toilet -f bigmono9 &> /dev/null || not_found \"bigmono9 font\"\n\n# unko.toilet\ntoilet \"${toilet_opt[@]}\" -f bigmono9 \"${text[@]}\" |\n  # 薄いところは消す\n  sed 's/░\\|▒/ /g' |\n  # スペース以外を💩へ\n  sed 's/[^ ]/💩/g' |\n  # 幅調整\n  sed 's/ /  /g'\n"
  },
  {
    "path": "bin/unko.tower",
    "content": "#!/usr/bin/env bash\nset -u\n\nreadonly THIS_CMD=\"${0##*/}\"\nreadonly DEFAULT_PADDING=\"　\"\nreadonly DEFAULT_HEIGHT=3\nreadonly UNKO_TOP=\"人\"\n\nrepeat_str() {\n  local _num=\"$1\"\n  shift\n  local _str=\"$1\"\n  shift\n  awk \\\n    -v NUM=\"$_num\" \\\n    -v STR=\"$_str\" \\\n    'BEGIN{ for (i=0; i<NUM; i++) { printf \"%s\", STR } }'\n  echo\n}\n\nprint_unko() {\n  local _level=\"${1:-3}\"\n  shift\n  local _msg=(\"$@\")\n  local _msg_idx=0\n  local _padding=\"　\"\n  local _left=\n  local _result=\n  local _mid1 _num1\n  local _mid2 _num2\n  ((_level = _level + 1))\n  _left=\"$(repeat_str \"$_level\" \"$_padding\")\"\n  _result=\"${_left}${_padding}${UNKO_TOP}\"\n  for ((i = _level - 1; i > 0; i--)); do\n    _left=\"$(repeat_str \"$i\" \"$_padding\")\"\n    _num1=\"$((_level - i + 1))\"\n    _mid1=\"$(print_array \"${_msg[@]:$_msg_idx:$_num1}\")\"\n    ((_msg_idx = _msg_idx + _num1))\n\n    _num2=\"$((_level - i))\"\n    _mid2=\"$(print_array \"${_msg[@]:$_msg_idx:$_num2}\")\"\n    ((_msg_idx = _msg_idx + _num2))\n\n    _result=\"${_result}\"$'\\n'\"${_left}（${_mid1}${_mid2}）\"\n  done\n  printf \"%s\\\\n\" \"${_result}\"\n}\n\nunk_msg_error() {\n  printf \"%s\\\\n\" \"$THIS_CMD:error:${1-}\"\n}\n\nunk_command_help() {\n  cat << _EOS_\nUsage:\n  ${THIS_CMD} [OPTIONS] NUMBER\n\nOPTIONS:\n  --help         Display this help and exit\n  -m <message>   Fill with the message\n  -r             Read message from stdin\n  -s <string>    Change default stuffed string\n_EOS_\n}\n\n# Calculate sum of the number of character to be filled in the Unko.\nchar_sum() {\n  local n=\"$1\"\n  echo \"$((n * n + 2 * n))\"\n}\n\nprint_array() {\n  for s in \"$@\"; do\n    _pat='[ -~]' # cover all the ascii chars\n    if [[ $s =~ $_pat ]]; then\n      printf \"%s \" \"$s\" # padding\n    else\n      printf \"%s\" \"$s\"\n    fi\n  done\n}\n\nmain() {\n  local _msg=()\n  local _opt_msg=0\n  local _opt_stdin=0\n  local _raw_msg=\n  local _total_char=\n  while (($# > 0)); do\n    local _opt=\"$1\"\n    shift\n\n    ## -ovalue → -o value (inspired by echo-sd)\n    if [[ -n \"${_opt}\" ]] && [[ -z \"${_opt##-[sm]?*}\" ]]; then\n      set -- \"${_opt#??}\" ${1+\"$@\"}\n      _opt=\"${_opt%\"${1}\"}\"\n    fi\n\n    case \"$_opt\" in\n      --help)\n        unk_command_help\n        return 0\n        ;;\n      -m)\n        _opt_msg=1\n        _raw_msg=\"${1-}\"\n        shift\n        ;;\n      -s)\n        _padding=\"${1-}\"\n        shift\n        ;;\n      -r)\n        _opt_msg=1\n        _opt_stdin=1\n        ;;\n      *)\n        _num=\"$_opt\"\n        ;;\n    esac\n  done\n\n  _padding=${_padding:-$DEFAULT_PADDING}\n  _num=${_num:-$DEFAULT_HEIGHT}\n  if ! [[ ${_num} =~ ^[[:digit:]]+$ ]]; then\n    unk_msg_error \"Invalid number '${_num}'\"\n    return 0\n  fi\n  _total_char=\"$(char_sum \"${_num}\")\"\n  if [[ ${_opt_msg} -eq 0 ]]; then\n    IFS=$'\\n' read -r -a _msg -d '' <<< \"$(repeat_str \"$_total_char\" \"$_padding\" | grep -o .)\"\n  elif [[ ${_opt_msg} -eq 1 ]]; then\n    if [[ ${_opt_stdin} -eq 1 ]]; then\n      IFS=$'\\n' read -r -a _msg -d '' <<< \"$(cat | grep -o .)\"\n    else\n      IFS=$'\\n' read -r -a _msg -d '' <<< \"$(printf \"%s\" \"${_raw_msg}\" | grep -o .)\"\n    fi\n    _gap=$((_total_char - ${#_msg[@]}))\n    if ((_gap > 0)); then\n      IFS=$'\\n' read -r -a _rest_msg -d '' <<< \"$(repeat_str \"$_gap\" \"$_padding\" | grep -o .)\"\n      _msg=(\"${_msg[@]:-\"$_padding\"}\" \"${_rest_msg[@]}\")\n    fi\n  fi\n  print_unko \"${_num}\" \"${_msg[@]:-}\"\n  return 0\n}\n\nmain ${1+\"$@\"}\nexit $?\n"
  },
  {
    "path": "bin/unko.tr",
    "content": "#!/bin/bash\n\n# Get current directory\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\n\nLIB_DIR=\"${THIS_DIR}/../lib/super_unko\"\nreadonly LIB_DIR\n\nsed -f <(awk -F , '1<NR{print $1}' \"${LIB_DIR}/unko.csv\" | sed 's|^|s/|;s|$|/💩/g|;')\n"
  },
  {
    "path": "bin/unko.yes",
    "content": "#!/bin/bash\nyes '💩'\n"
  },
  {
    "path": "doc/ci-push.puml",
    "content": "@startuml\n\nstart\n\n: git commit;\n: git push;\n\npartition \"GitHub Actions\" {\n  fork\n    : build docker image;\n    partition \"test\" {\n      fork\n        : test bash default;\n      fork again\n        : test bash 3.2;\n      fork again\n        : test bash 4.0;\n      fork again\n        : test bash 4.1;\n      fork again\n        : test bash 4.2;\n      fork again\n        : test bash 4.3;\n      fork again\n        : test bash 4.4;\n      fork again\n        : test bash 5.0;\n      end fork\n    }\n  fork again\n    : format;\n  fork again\n    : lint;\n  end fork\n  if (is branch oshiri?) then (true)\n    partition \"update-repository\" {\n      : generate super_unko.deb;\n      : generate super_unko.rpm;\n      : generate markdown TOC;\n      : git push ;\n    }\n  endif\n}\n\nend\n\n@enduml\n"
  },
  {
    "path": "doc/unko.puzzle.md",
    "content": "# unko.puzzle\n\nsliding block puzzle\n\nTable of Contents\n\n<!--ts-->\n* [unko.puzzle](doc/unko.puzzle.md#unkopuzzle)\n   * [Requirements](doc/unko.puzzle.md#requirements)\n   * [Additional installation](doc/unko.puzzle.md#additional-installation)\n      * [Linux](doc/unko.puzzle.md#linux)\n         * [With yum (RHEL compatible distros)](doc/unko.puzzle.md#with-yum-rhel-compatible-distros)\n         * [With apt (Debian base distros)](doc/unko.puzzle.md#with-apt-debian-base-distros)\n      * [macOS](doc/unko.puzzle.md#macos)\n         * [With Homebrew](doc/unko.puzzle.md#with-homebrew)\n   * [Usage](doc/unko.puzzle.md#usage)\n      * [Linux](doc/unko.puzzle.md#linux-1)\n      * [macOS](doc/unko.puzzle.md#macos-1)\n   * [for development](doc/unko.puzzle.md#for-development)\n\n<!-- Created by https://github.com/ekalinin/github-markdown-toc -->\n<!-- Added by: runner, at: Mon Apr 11 15:08:44 UTC 2022 -->\n\n<!--te-->\n\n## Requirements\n\n- X11\n    - XQuartz (macOS)\n- xterm\n\n## Additional installation\n\n### Linux\n\n#### With `yum` (RHEL compatible distros)\n\n* Enable epel repository\n\n(skip)\n\n* Install xdotool\n\n```sh\n$ sudo yum install xdotool\n```\n\n#### With `apt` (Debian base distros)\n\n```sh\n$ sudo apt install xdotool\n```\n\n### macOS\n\n#### With Homebrew\n\n```sh\n$ brew cask install xquartz\n$ brew install xdotool\n```\n\n## Usage\n\n### Linux\n\n1. Launch xterm.\n1. Run `unko.puzzle` on xterm.\n1. Enjoy!\n\n### macOS\n\n1. Launch xterm.\n    ```sh\n    $ PATH=$PATH:/opt/X11/bin xterm &\n    ```\n1. Run `unko.puzzle` on xterm.\n    ```sh\n    $ unko.puzzle\n    ```\n1. Enjoy!\n\n---\n\n```\nWarning: XTEST extension unavailable on '(null)'.\nSome functionality may be disabled; See 'man xdotool' for more info.\n```\n\nIf you received such a message from xdotool, you may be able to resolve it by execute the following commands and restarting XQuartz:\n\n```sh\n$ defaults write org.x.X11 enable_test_extensions -boolean true\n$ defaults write org.macosforge.xquartz.X11 enable_test_extensions -boolean true\n```\n\nSee: https://stackoverflow.com/questions/1264210/does-mac-x11-have-the-xtest-extension\n\n## for development\n\n- tile map\n\n```\n+-+-+-+\n|x|1|2|\n+-+-+-+\n|3|4|5|\n+-+-+-+\n|6|7|8|\n+-+-+-+\n```\n\n- debug\n\n```sh\n$ DEBUG_UNKO=true TILES=2 unko.puzzle 2>>/tmp/unko.log\n```\n"
  },
  {
    "path": "doc/unko.toilet.md",
    "content": "# unko.toilet\n\n<font size=7>Text to UNKO Art!!!!</font>\n\nTable of Contents\n\n<!--ts-->\n* [unko.toilet](doc/unko.toilet.md#unkotoilet)\n   * [Requirements](doc/unko.toilet.md#requirements)\n      * [Additional installation](doc/unko.toilet.md#additional-installation)\n      * [apt](doc/unko.toilet.md#apt)\n      * [brew/linuxbrew](doc/unko.toilet.md#brewlinuxbrew)\n   * [Usage](doc/unko.toilet.md#usage)\n\n<!-- Created by https://github.com/ekalinin/github-markdown-toc -->\n<!-- Added by: runner, at: Mon Apr 11 15:08:44 UTC 2022 -->\n\n<!--te-->\n\n## Requirements\n\n- `toilet`\n- `figlet`\n\n### Additional installation\n\n### apt\n\n```sh\n$ sudo apt install figlet toilet\n```\n\n### brew/linuxbrew\n\n```sh\n$ brew install figlet toilet\n```\n\n## Usage\n\n```\nunko.toilet [ -hv ] [ -w outputwidth ]\n            [ --crop ] [ --flip ] [ --flop ]\n            [ --180 ] [ --left ] [ --right ]\n            [ --border ]\n```\n"
  },
  {
    "path": "docker/Dockerfile",
    "content": "# vim: tw=0:\nFROM ubuntu:20.04 AS base\n\nRUN echo -e $'\\n\\\n＿人人人人人人人人人人人人人人人人人人人人人人＿\\n\\\n＞　super_unkoイメージを今からビルドするよ！　＜\\n\\\n＞　これには少し時間がかかるよ！　　　　　　　＜\\n\\\n￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣\\n\\\n　　　　　　👑\\n\\\n　　　　（💩💩💩）\\n\\\n　　　（💩👁💩👁💩）\\n\\\n　　（💩💩💩👃💩💩💩）\\n\\\n　（💩💩💩💩👄💩💩💩💩）'\n\nENV LANG ja_JP.UTF-8\nRUN apt update -yqq \\\n    && apt install -y --no-install-recommends \\\n       language-pack-ja-base \\\n       toilet \\\n       figlet \\\n       bc \\\n       cowsay \\\n       curl \\\n       ca-certificates \\\n       locales \\\n    && locale-gen ja_JP.UTF-8 \\\n    && rm -rf /var/lib/apt/lists/*\nCOPY . /usr/local/src/super_unko\nWORKDIR /usr/local/src/super_unko\nRUN ./install.sh\nRUN curl --retry 3 https://raw.githubusercontent.com/fumiyas/home-commands/master/echo-sd > /usr/local/bin/echo-sd\nRUN chmod +x /usr/local/bin/echo-sd\n\nRUN echo -e $'\\n\\\n＿人人人人人人人人人人人人人人人人人人人人人人人人＿\\n\\\n＞　super_unkoイメージのビルドが無事完了したよ！　＜\\n\\\n￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣\\n\\\n　　　　　　👑\\n\\\n　　　　（💩💩💩）\\n\\\n　　　（💩👁💩👁💩）\\n\\\n　　（💩💩💩👃💩💩💩）\\n\\\n　（💩💩💩💩👄💩💩💩💩）'\n\nFROM base AS ci\n\nARG SH_VERSION=default\n\n# Install bash-x.x\nCOPY ./docker/install_bash.sh /tmp/install_bash.sh\nRUN apt update -yqq \\\n    && apt install -y --no-install-recommends build-essential bats byacc \\\n    && rm -rf /var/lib/apt/lists/* \\\n    && /tmp/install_bash.sh ${SH_VERSION} \\\n    && ./install.sh\n"
  },
  {
    "path": "docker/install_bash.sh",
    "content": "#!/bin/bash\n\nset -eu\n\nSCRIPT_NAME=\"$(basename \"${BASH_SOURCE:-$0}\")\"\nreadonly SCRIPT_NAME\n\nusage() {\n  cat << EOS\n$SCRIPT_NAME は指定のバージョンのBashを/bin/bashにインストールします。\nインストール前のBashは同じディレクトリにbash.oldとしてバックアップされます。\n\nUsage:\n    $SCRIPT_NAME -h | --help\n    $SCRIPT_NAME <version>      [default: default]\n\nAvailable version:\n    default\n    3.2\n    4.0\n    4.1\n    4.2\n    4.3\n    4.4\n    5.0\nEOS\n}\n\ncase $1 in\n  -h | --help)\n    usage\n    return\n    ;;\nesac\n\nreadonly TMPDIR=/tmp/bash\nreadonly SH_VERSION=${1:-default}\n\nmkdir -p $TMPDIR\n\nif [[ \"$SH_VERSION\" != \"default\" ]]; then\n  (\n    cd \"$TMPDIR\"\n    curl -s --retry 3 \"http://ftp.gnu.org/gnu/bash/bash-${SH_VERSION}.tar.gz\" | tar xvz\n    cd bash*\n    ./configure\n    make\n    make install\n    mv /bin/bash{,.old}\n    cp -p ./bash /bin/bash\n  )\nfi\n\nbash --version\n"
  },
  {
    "path": "docker-compose-ci.yml",
    "content": "version: '3.7'\n\nx-build: &build\n  context: .\n  dockerfile: ./docker/Dockerfile\n  target: ci\n\nservices:\n  ci_sh_default: &default\n    build:\n      <<: *build\n      args:\n        SH_VERSION: default\n    volumes:\n      - \"$PWD:/usr/local/src/super_unko\"\n    working_dir: /usr/local/src/super_unko\n    entrypoint:\n      - ./test.sh\n\n  ci_sh_3.2:\n    <<: *default\n    build:\n      <<: *build\n      args:\n        # Because bats supports 3.2.57 or more https://github.com/bats-core/bats-core\n        SH_VERSION: 3.2.57\n\n  ci_sh_4.0:\n    <<: *default\n    build:\n      <<: *build\n      args:\n        SH_VERSION: 4.0\n\n  ci_sh_4.1:\n    <<: *default\n    build:\n      <<: *build\n      args:\n        SH_VERSION: 4.1\n\n  ci_sh_4.2:\n    <<: *default\n    build:\n      <<: *build\n      args:\n        SH_VERSION: 4.2\n\n  ci_sh_4.3:\n    <<: *default\n    build:\n      <<: *build\n      args:\n        SH_VERSION: 4.3\n\n  ci_sh_4.4:\n    <<: *default\n    build:\n      <<: *build\n      args:\n        SH_VERSION: 4.4\n\n  ci_sh_5.0:\n    <<: *default\n    build:\n      <<: *build\n      args:\n        SH_VERSION: 5.0\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: '3.7'\n\nservices:\n  super_unko:\n    build:\n      context: ./\n      dockerfile: ./docker/Dockerfile\n      target: base\n    image: unkontributors/super_unko\n\n  formatter:\n    image: peterdavehello/shfmt\n    container_name: formatter\n    volumes:\n      - \"$PWD:/work\"\n    entrypoint:\n      - \"shfmt\"\n      - \"-i\"\n      - \"2\"\n      - \"-ci\"\n      - \"-sr\"\n      - \"-d\"\n\n  linter:\n    image: koalaman/shellcheck\n    container_name: linter\n    volumes:\n      - \"$PWD:/work\"\n    entrypoint:\n      - \"shellcheck\"\n"
  },
  {
    "path": "install.sh",
    "content": "#!/bin/bash\nset -ue\n\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\nreadonly BINMODE=755\nreadonly LIBMODE=644\nreadonly PREFIX=\"${1:-/usr/local}\"\nreadonly PREFIX_BIN=\"${PREFIX}/bin\"\nreadonly PREFIX_LIB=\"${PREFIX}/lib/super_unko\"\n\ninstall -d \"${PREFIX_BIN}\"\ninstall -m \"${BINMODE}\" \"${THIS_DIR}\"/bin/* \"${PREFIX_BIN}\"\ninstall -d \"${PREFIX_LIB}\"\ninstall -m \"${LIBMODE}\" \"${THIS_DIR}\"/lib/super_unko/* \"${PREFIX_LIB}\"\n"
  },
  {
    "path": "lib/super_unko/bigunko.txt",
    "content": "XDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFww\nMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1swbVxuClwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbMG1cbgpcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7\nMjQzbeOAgFwwMzNbNDg7NTsyNDht44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzBtXG4KXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFww\nMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7\nMjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzBtXG4KXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFww\nMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNb\nNDg7NTs5NG3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1swbVxuClwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7\nMjQzbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFww\nMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbMG1cbgpcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFww\nMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbMG1cbgpcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBc\nMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7\nOTRt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbMG1cbgpcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsxMDBt44CAXDAzM1s0ODs1\nOzEwMG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBc\nMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7\nNTht44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbMG1cbgpcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsxMDBt44CAXDAzM1s0ODs1\nOzk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFww\nMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTs5\nNG3jgIBcMDMzWzQ4OzU7MjQ4beOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1swbVxuClwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0\nbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNb\nNDg7NTs5NG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzEwMG3jgIBcMDMzWzQ4OzU7MTAw\nbeOAgFwwMzNbNDg7NTsxMDBt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbMG1cbgpcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQ4\nbeOAgFwwMzNbNDg7NTsxMDBt44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTsxMDBt44CAXDAz\nM1s0ODs1OzEwMG3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7\nMjQ4beOAgFwwMzNbNDg7NTsyNDht44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1swbVxuClwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7MjUybeOAgFwwMzNbNDg7NTsy\nNTJt44CAXDAzM1s0ODs1OzI1Mm3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTsxMDBt44CA\nXDAzM1s0ODs1OzEwMG3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTsyNTJt44CAXDAzM1s0\nODs1OzI1Mm3jgIBcMDMzWzQ4OzU7MjU0beOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzU4\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFww\nMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzBtXG4KXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7\nMjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsxMDBt44CAXDAzM1s0ODs1OzI1Mm3jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyMzJt44CAXDAzM1s0ODs1OzIzMm3jgIBcMDMzWzQ4OzU7MjUybeOAgFwwMzNbNDg7NTs5\nNG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTsyNTRt44CAXDAz\nM1s0ODs1OzIzMm3jgIBcMDMzWzQ4OzU7MjMybeOAgFwwMzNbNDg7NTsyNTRt44CAXDAzM1s0ODs1\nOzI0OG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzBtXG4KXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7OTRt\n44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTsyNTJt44CAXDAzM1s0ODs1OzIzMm3jgIBcMDMz\nWzQ4OzU7MjMybeOAgFwwMzNbNDg7NTsyMzJt44CAXDAzM1s0ODs1OzI1NG3jgIBcMDMzWzQ4OzU7\nOTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTsyNDht44CAXDAzM1s0ODs1OzI1NG3jgIBc\nMDMzWzQ4OzU7MjMybeOAgFwwMzNbNDg7NTsyMzJt44CAXDAzM1s0ODs1OzI1NG3jgIBcMDMzWzQ4\nOzU7MjUybeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1swbVxuClwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1Ozk0\nbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7MjU0beOAgFwwMzNbNDg7NTsyMzJt44CAXDAz\nM1s0ODs1OzIzMm3jgIBcMDMzWzQ4OzU7MjMybeOAgFwwMzNbNDg7NTsyNTRt44CAXDAzM1s0ODs1\nOzU4beOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTsyNTRt44CA\nXDAzM1s0ODs1OzIzMm3jgIBcMDMzWzQ4OzU7MjMybeOAgFwwMzNbNDg7NTsyNTRt44CAXDAzM1s0\nODs1OzI1Mm3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbMG1cbgpcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTs1\nOG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTsyNTRt44CAXDAz\nM1s0ODs1OzI1Mm3jgIBcMDMzWzQ4OzU7MjU0beOAgFwwMzNbNDg7NTsxMDBt44CAXDAzM1s0ODs1\nOzk0beOAgFwwMzNbNDg7NTsxMDBt44CAXDAzM1s0ODs1OzEwMG3jgIBcMDMzWzQ4OzU7MjU0beOA\ngFwwMzNbNDg7NTsyNTRt44CAXDAzM1s0ODs1OzI1NG3jgIBcMDMzWzQ4OzU7MjU0beOAgFwwMzNb\nNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbMG1cbgpcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTs1\nOG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTsxMDBt44CAXDAz\nM1s0ODs1OzI1Mm3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTsxMDBt44CAXDAzM1s0ODs1\nOzEwMG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBc\nMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTsyNDht44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7\nNTs5NG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzBtXG4KXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTsxMDBt\n44CAXDAzM1s0ODs1OzEwMG3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTsxMDBt44CAXDAz\nM1s0ODs1OzEwMG3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7\nOTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAz\nM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzU4\nbeOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1OzU4beOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzBtXG4KXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7OTRt\n44CAXDAzM1s0ODs1OzEwMG3jgIBcMDMzWzQ4OzU7MTAwbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMz\nWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7MjUy\nbeOAgFwwMzNbNDg7NTsyNTJt44CAXDAzM1s0ODs1OzI1Mm3jgIBcMDMzWzQ4OzU7MjUybeOAgFww\nMzNbNDg7NTsyNTJt44CAXDAzM1s0ODs1OzI1Mm3jgIBcMDMzWzQ4OzU7MjUybeOAgFwwMzNbNDg7\nNTsyNTJt44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7NTht44CA\nXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1\nOzU4beOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1swbVxuClwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1Ozk0beOAgFww\nMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5\nNG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMz\nWzQ4OzU7OTRt44CAXDAzM1s0ODs1OzI1NG3jgIBcMDMzWzQ4OzU7MjU0beOAgFwwMzNbNDg7NTsy\nNTRt44CAXDAzM1s0ODs1OzI1NG3jgIBcMDMzWzQ4OzU7MjUybeOAgFwwMzNbNDg7NTs1OG3jgIBc\nMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7\nOTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzBtXG4KXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0\nbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNb\nNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3j\ngIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzI1NG3jgIBcMDMzWzQ4OzU7MjU0beOAgFwwMzNb\nNDg7NTsyNDht44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7OTRt\n44CAXDAzM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0\nODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzBtXG4KXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7\nNTs5NG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBc\nMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7\nNTht44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7NTht44CAXDAz\nM1s0ODs1Ozk0beOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1Ozk0\nbeOAgFwwMzNbNDg7NTs5NG3jgIBcMDMzWzQ4OzU7OTRt44CAXDAzM1s0ODs1OzU4beOAgFwwMzNb\nNDg7NTs1OG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzBtXG4KXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0\nODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTs1OG3jgIBcMDMz\nWzQ4OzU7NTht44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7NTht\n44CAXDAzM1s0ODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7NTht44CAXDAzM1s0\nODs1OzU4beOAgFwwMzNbNDg7NTs1OG3jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbMG1cbgpcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzBtXG4KXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7\nMjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1swbVxuClww\nMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7\nMjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nMG1cbgpcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFww\nMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt\n44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAz\nM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1\nOzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23j\ngIBcMDMzWzBtXG4KXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4\nOzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQz\nbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFww\nMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7\nNTsyNDNt44CAXDAzM1swbVxuClwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMz\nWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7\nMjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOA\ngFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNb\nNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsy\nNDNt44CAXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CA\nXDAzM1s0ODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0\nODs1OzI0M23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0\nM23jgIBcMDMzWzQ4OzU7MjQzbeOAgFwwMzNbNDg7NTsyNDNt44CAXDAzM1s0ODs1OzI0M23jgIBc\nMDMzWzQ4OzU7MjQzbeOAgFwwMzNbMG1cbg==\n"
  },
  {
    "path": "lib/super_unko/unko.cow",
    "content": "binmode STDOUT, \":utf8\";\n$the_cow =<<EOC;\n\\N{U+3000}\\N{U+3000}\\N{U+3000}\\N{U+3000}\\N{U+3000}\\N{U+3000}\\N{U+1F451}\n\\N{U+3000}\\N{U+3000}\\N{U+3000}\\N{U+3000}\\N{U+FF08}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+FF09}\n\\N{U+3000}\\N{U+3000}\\N{U+3000}\\N{U+FF08}\\N{U+1F4A9}\\N{U+1F441}\\N{U+1F4A9}\\N{U+1F441}\\N{U+1F4A9}\\N{U+FF09}\n\\N{U+3000}\\N{U+3000}\\N{U+FF08}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+1F443}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+FF09}\n\\N{U+3000}\\N{U+FF08}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+1F444}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+1F4A9}\\N{U+FF09}\n\nEOC\n"
  },
  {
    "path": "lib/super_unko/unko.csv",
    "content": "Name,Language\nうんこ,Japanese\nウンコ,Japanese\nうんち,Japanese\nウンチ,Japanese\n下痢,Japanese\nうんこっこ,Japanese\nうんちっち,Japanese\nうんこもりもり,Japanese\nうんちもりもり,Japanese\npoo,English\nfeces,English\nshit,English\ncrap,English\ncaca,French\nmerde,French\nCaga,Spanish\nmierda,Spanish\nKacke,German\nScheiße,German\nFeci,Italian\nMerda,Italian\nMerda,Portuguese\nCocô,Portuguese\nFezes,Portuguese\nσκατά,Greek\nКакашка,Russian\n㞎㞎,Chinese\n狗屁,Chinese\n똥,Korian\nขี้,Thai\n💩,Emoji\n"
  },
  {
    "path": "lib/super_unko/unko.lib",
    "content": "#!/usr/bin/env bash\n\nFLAG_DEMO=0\nif [ \"$1\" == \"demo\" ] ; then\n  FLAG_DEMO=1\nelse\n  if [ \"$0\" != \"bash\" ] ; then ### to use this library, use by `source` or `.`\ncat <<EOU\nusage: $0: king-unko substitution library.\n\nHow to use:\n\n$ . path/to/unko.lib\n$ unko.shout | sed -e \"s/\\$SOME_SYMBOL/ANOTHER_SYMBOL/\"\n\nEOU\n  fi\nfi\n\nEYE=$(echo -e '\\U1F441')\nLIP=👄\nNOSE=👃\nCROWN=👑\nUNKO=💩\nLHSUNKO='（'\nRHSUNKO='）'\nINDENT='　'\n\nif [ $FLAG_DEMO -eq 1 ] ; then\n\tunko.shout デモだよ！！ | tail -n +4 | sed -e \"s/${LIP}/💋/\" | \\\n\t\tsed -e \"s/${NOSE}/Δ/\" | sed -e \"s/${CROWN}/🌴/\" | sed -e \"s/${UNKO}/⭐/g\" | \\\n\t\tsed -e \"s/$LHSUNKO/／/g\" | sed -e \"s/$RHSUNKO/＼/g\" | sed -e \"s/$INDENT/三/g\" |\\\n\t\tsed -e \"s/$EYE/ー/g\"\nfi\n\n## vim: set ft=sh:\n"
  },
  {
    "path": "lib/super_unko/unko_command_not_found_hundle",
    "content": "#!/bin/bash\n# コマンドがない場合に出力されるテキスト\nfunction __command_not_found_unko() {\n  local CMD=$1\n\n  local TEXT=(\n    \"「${CMD}」なんてコマンドはないぜ… このキングうんこが言うんだ 間違いない\"\n    \"違うな、間違っているぞ${USER}！ 「${CMD}」なんてコマンドはない！ このキングうんこにはわかる！\"\n    \"「${CMD}」なんて存在しないコマンドを 打たれるたびに5セントもらってたら、今頃大金持ちだぜ！\"\n    \"残念ながら「${CMD}」なんてコマンドはないようだな この私を呼び出す「unko.shout」はあるようなんだがな！\"\n  )\n\n  local T=\"${TEXT[$((RANDOM % ${#TEXT[@]}))]}\"\n  eval unko.shout \"$T\" | sed \"s/${CMD}/\\x1b[32m&\\x1b[0m/g;\"\n}\n\n# コマンドが無い場合に実行される処理の定義\nfunction __command_not_found() {\n  case ${OSTYPE} in\n    darwin*)\n      __command_not_found_unko \"$1\"\n      return 127\n      ;;\n    linux*)\n      if [ -x /usr/lib/command-not-found ] || [ -x /usr/share/command-not-found/command-not-found ]; then\n        if [ -x /usr/lib/command-not-found ]; then\n          /usr/lib/command-not-found -- \"$1\"\n          __command_not_found_unko \"$1\"\n          return 127\n        elif [ -x /usr/share/command-not-found/command-not-found ]; then\n          /usr/share/command-not-found/command-not-found -- \"$1\"\n          __command_not_found_unko \"$1\"\n          return 127\n        fi\n      else\n        __command_not_found_unko \"$1\"\n        return 127\n      fi\n      ;;\n  esac\n}\n\n# command_not_found_handle(zshの場合はcommand_not_found_handler)の定義\nif [[ -n \"$ZSH_EVAL_CONTEXT\" ]]; then\n  function command_not_found_handler() {\n    trap '' 1 2 3 15\n    __command_not_found \"$1\"\n  }\nelse\n  function command_not_found_handle() {\n    __command_not_found \"$1\"\n  }\nfi\n"
  },
  {
    "path": "lib/super_unko/unko_mb.cow",
    "content": "$the_cow = <<EOC\n　　　　　　👑\n　　　　（💩💩💩）\n　　　（💩👁💩👁💩）\n　　（💩💩💩👃💩💩💩）\n　（💩💩💩💩👄💩💩💩💩）\n\nEOC\n"
  },
  {
    "path": "linter.sh",
    "content": "#!/bin/bash\n\nSCRIPT_NAME=\"$(basename \"${BASH_SOURCE:-$0}\")\"\nreadonly SCRIPT_NAME\n\n# Dockerコンテナ系の定数\nreadonly CONTAINER_DIR_PREFIX=/work\n\n# 着色系ANSIエスケープシーケンス\nreadonly RED=$'\\x1b[31m'\nreadonly GREEN=$'\\x1b[32m'\nreadonly RESET=$'\\x1b[m'\n\n# デフォルトの静的解析対象\nreadonly DEFAULT_TARGET_FILES=(*.sh bin/*)\n\ntest_count=0\nerr_count=0\n\nmain() {\n  # 引数なしのときはヘルプを出力して終了\n  if [[ $# -lt 1 ]]; then\n    usage >&2\n    return 1\n  fi\n\n  while ((0 < $#)); do\n    local opt=$1\n    shift\n\n    case \"$opt\" in\n      help)\n        usage\n        return\n        ;;\n      setup)\n        # フォーマットとlintに使うDockerイメージを取得\n        docker-compose pull formatter linter\n        ;;\n      format)\n        # コードフォーマットにかける\n        overwrite=\"\"\n        cmd_format \"$@\"\n        print_check_result\n        return $?\n        ;;\n      format-save)\n        # コードフォーマットにかけて上書き保存\n        overwrite=\"-w\"\n        cmd_format \"$@\"\n        print_check_result\n        return $?\n        ;;\n      lint)\n        # 静的解析\n        cmd_lint \"$@\"\n        print_check_result\n        return $?\n        ;;\n      all)\n        # コードフォーマット＋静的解析\n        cmd_format \"$@\"\n        cmd_lint \"$@\"\n        print_check_result\n        return $?\n        ;;\n      *)\n        usage >&2\n        return 1\n        ;;\n    esac\n  done\n}\n\nusage() {\n  cat << EOS\n$SCRIPT_NAME はプロジェクト内のシェルスクリプトのコードスタイルチェックをします。\n\nUsage:\n    $SCRIPT_NAME <command>\n\nAvailable commands:\n    help                      このヘルプを出力する。\n    setup                     リントツールをセットアップする。\n    format      [files...]    コードフォーマットにかける。\n    format-save [files...]    コードフォーマットして上書き保存する。\n    lint        [files...]    リントにかける。\n    all                       プロジェクト全体をフォーマットとリントにかける。\nEOS\n}\n\n## フォーマットにかけるサブコマンド。\ncmd_format() {\n  # 引数（ファイル）の指定があればそのファイルを解析する\n  # なければデフォルト指定（プロジェクト全体）のファイルを解析する\n  local files=(\"${DEFAULT_TARGET_FILES[@]}\")\n  if [[ 0 -lt $# ]]; then\n    files=(\"$@\")\n  fi\n\n  # テストするファイルの件数を加算\n  test_count=$((test_count + ${#files[@]}))\n\n  # コンテナ内のマウントディレクトリのフルパスに変更\n  local fullpath_files=()\n  for f in \"${files[@]}\"; do\n    fullpath_files+=(\"$CONTAINER_DIR_PREFIX/$f\")\n  done\n\n  run_shfmt \"${fullpath_files[@]}\"\n}\n\n## フォーマットにかける。\nrun_shfmt() {\n  local files=(\"$@\")\n  local ret\n  docker-compose run formatter $overwrite \"${files[@]}\"\n  ret=$?\n  if [[ \"$ret\" -ne 0 ]]; then\n    err_count=$((err_count + 1))\n  fi\n}\n\n## 静的解析にかけるサブコマンド。\ncmd_lint() {\n  # 引数（ファイル）の指定があればそのファイルを解析する\n  # なければデフォルト指定（プロジェクト全体）のファイルを解析する\n  local files=(\"${DEFAULT_TARGET_FILES[@]}\")\n  if [[ 0 -lt $# ]]; then\n    files=(\"$@\")\n  fi\n\n  # テストするファイルの件数を加算\n  test_count=$((test_count + ${#files[@]}))\n\n  # コンテナ内のマウントディレクトリのフルパスに変更\n  local fullpath_files=()\n  for f in \"${files[@]}\"; do\n    # unko.puzzleはスキップする\n    if [[ \"$f\" =~ ^.*unko.puzzle$ ]]; then\n      continue\n    fi\n    fullpath_files+=(\"$CONTAINER_DIR_PREFIX/$f\")\n  done\n\n  run_shellcheck \"${fullpath_files[@]}\"\n}\n\n## 静的解析にかける。\nrun_shellcheck() {\n  local files=(\"$@\")\n  local ret\n  docker-compose run linter \"${files[@]}\"\n  ret=$?\n  if [[ \"$ret\" -ne 0 ]]; then\n    err_count=$((err_count + 1))\n  fi\n}\n\n## テストの結果を出力する。\nprint_check_result() {\n  echo \"--------------------------------------------------------------------------------\"\n  if [[ \"$err_count\" -lt 1 ]]; then\n    echo -e \"[ ${GREEN}PASS${RESET} ] ($test_count/$test_count) all lint were passed.\"\n    return\n  else\n    echo -e \"[ ${RED}FAIL${RESET} ] lint were failed.\"\n    return 1\n  fi\n}\n\nmain ${1+\"$@\"}\nexit $?\n"
  },
  {
    "path": "package.sh",
    "content": "#!/bin/bash\nset -ue\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\n{\n  cd \"${THIS_DIR}\"\n  tar zcvf super_unko.tar.gz bin lib .tar2package.yml\n  docker run -i greymd/tar2rpm:1.0.1 < super_unko.tar.gz > pkg/super_unko.rpm.tmp\n  mv pkg/super_unko.rpm{.tmp,}\n  docker run -i greymd/tar2deb:1.0.1 < super_unko.tar.gz > pkg/super_unko.deb.tmp\n  mv pkg/super_unko.deb{.tmp,}\n  rm super_unko.tar.gz\n}\n"
  },
  {
    "path": "super_unko.plugin.zsh",
    "content": "source \"`dirname $0`/activate.sh\"\n"
  },
  {
    "path": "test/functions.sh",
    "content": "#!/bin/bash\n\ncoverage() {\n  # kcovのインストールされている環境でのみ実行\n  if type kcov 2> /dev/null; then\n    local options=(--bash-dont-parse-binary-dir)\n    kcov \"${options[@]}\" coverage \"$@\" || true\n  fi\n}\n"
  },
  {
    "path": "test/super_unko-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"$(pwd)/../bin/super_unko\"\n\n@test \"コマンドを指定しない場合はヘルプを出力して、異常終了する\" {\n  run \"$TARGET_COMMAND\"\n  [ \"$status\" -ne 0 ]\n  coverage \"$TARGET_COMMAND\"\n}\n\n@test \"ヘルプを明示的に出力するときは正常終了する\" {\n  run \"$TARGET_COMMAND\" help\n  [ \"$status\" -eq 0 ]\n  coverage \"$TARGET_COMMAND\" help\n}\n\n@test \"unko.lsを呼び出す\" {\n  run \"$TARGET_COMMAND\" ls\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = うんこ ]\n  coverage \"$TARGET_COMMAND\" ls\n}\n\n@test \"unko.anyを呼び出す\" {\n  run \"$TARGET_COMMAND\" any\n  [ \"$status\" -eq 0 ]\n  coverage \"$TARGET_COMMAND\" any\n}\n\n@test \"unko.trを呼び出す\" {\n  run \"$TARGET_COMMAND\" tr <<< うんこ\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = 💩 ]\n  coverage \"$TARGET_COMMAND\" tr <<< うんこ\n}\n\n@test \"unko.towerを呼び出す\" {\n  run \"$TARGET_COMMAND\" tower\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　　（　　　）\" ]\n  [ \"${lines[2]}\" = \"　　（　　　　　）\" ]\n  [ \"${lines[3]}\" = \"　（　　　　　　　）\" ]\n  coverage \"$TARGET_COMMAND\" tower\n}\n\n@test \"unko.tower 2を呼び出す\" {\n  run \"$TARGET_COMMAND\" tower 2\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　（　　　）\" ]\n  [ \"${lines[2]}\" = \"　（　　　　　）\" ]\n  coverage \"$TARGET_COMMAND\" tower 2\n}\n\n@test \"bigunko.showを呼び出す\" {\n  run \"$TARGET_COMMAND\" bigshow\n  [ \"$status\" -eq 0 ]\n  coverage \"$TARGET_COMMAND\" bigshow\n}\n\n#@test \"unko.pingを呼び出す\" {\n#  run \"$TARGET_COMMAND\" ping\n#  [ \"$status\" -eq 0 ]\n#  coverage \"$TARGET_COMMAND\" ping\n#}\n\n@test \"存在しないコマンドのときは異常終了する\" {\n  run \"$TARGET_COMMAND\" unchi\n  [ \"$status\" -ne 0 ]\n  coverage \"$TARGET_COMMAND\" unchi\n}\n"
  },
  {
    "path": "test/unko.any-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"../bin/unko.any\"\nreadonly BASH_REQUIRE_VERSION=4.0\n\n#==============================================================================\n# NOTE:\n#   echo-sdはBash4.0以下では動かないため、Bash4.1以上のみテストする\n#==============================================================================\n\nbash_version=$(bash --version | grep -Eo \"[0-9]+\\.[0-9]+\" | head -n 1)\nif [ $(echo \"$BASH_REQUIRE_VERSION < $bash_version\" | bc) -eq 0 ]; then\n  echo \"  Bash${BASH_REQUIRE_VERSION}以下はスキップ\"\n  exit 0\nfi\n\n@test '引数がない場合はヘルプを出力する' {\n  run \"$TARGET_COMMAND\"\n  [ \"$status\" -eq 0 ]\n  coverage \"$TARGET_COMMAND\"\n}\n\n@test '引数が1つのときは💩の置換のみ' {\n  run \"$TARGET_COMMAND\" あ\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"＿人人人人人人＿\" ]\n  [ \"${lines[1]}\" = \"＞　突然の死　＜\" ]\n  [ \"${lines[2]}\" = \"￣Y^Y^Y^Y^Y^Y^￣\" ]\n  [ \"${lines[3]}\" = \"　　　　　　👑\" ]\n  [ \"${lines[4]}\" = \"　　　　（あああ）\" ]\n  [ \"${lines[5]}\" = \"　　　（あ👁あ👁あ）\" ]\n  [ \"${lines[6]}\" = \"　　（あああ👃あああ）\" ]\n  [ \"${lines[7]}\" = \"　（ああああ👄ああああ）\" ]\n  coverage \"$TARGET_COMMAND\" あ\n}\n\n@test '引数が2つのときは💩の置換と文言変更' {\n  run \"$TARGET_COMMAND\" あ い\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"＿人人人＿\" ]\n  [ \"${lines[1]}\" = \"＞　い　＜\" ]\n  [ \"${lines[2]}\" = \"￣Y^Y^Y^￣\" ]\n  [ \"${lines[3]}\" = \"　　　　　　👑\" ]\n  [ \"${lines[4]}\" = \"　　　　（あああ）\" ]\n  [ \"${lines[5]}\" = \"　　　（あ👁あ👁あ）\" ]\n  [ \"${lines[6]}\" = \"　　（あああ👃あああ）\" ]\n  [ \"${lines[7]}\" = \"　（ああああ👄ああああ）\" ]\n  coverage \"$TARGET_COMMAND\" あ い\n}\n\n@test '引数に /' {\n  run \"$TARGET_COMMAND\" /\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"＿人人人人人人＿\" ]\n  [ \"${lines[1]}\" = \"＞　突然の死　＜\" ]\n  [ \"${lines[2]}\" = \"￣Y^Y^Y^Y^Y^Y^￣\" ]\n  [ \"${lines[3]}\" = \"　　　　　　👑\" ]\n  [ \"${lines[4]}\" = \"　　　　（///）\" ]\n  [ \"${lines[5]}\" = \"　　　（/👁/👁/）\" ]\n  [ \"${lines[6]}\" = \"　　（///👃///）\" ]\n  [ \"${lines[7]}\" = \"　（////👄////）\" ]\n  coverage \"$TARGET_COMMAND\" あ い\n}\n\n@test '引数にエスケープ文字' {\n  run \"$TARGET_COMMAND\" '\\\\'\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = '＿人人人人人人＿' ]\n  [ \"${lines[1]}\" = '＞　突然の死　＜' ]\n  [ \"${lines[2]}\" = '￣Y^Y^Y^Y^Y^Y^￣' ]\n  [ \"${lines[3]}\" = '　　　　　　👑' ]\n  [ \"${lines[4]}\" = '　　　　（\\\\\\）' ]\n  [ \"${lines[5]}\" = '　　　（\\👁\\👁\\）' ]\n  [ \"${lines[6]}\" = '　　（\\\\\\👃\\\\\\）' ]\n  [ \"${lines[7]}\" = '　（\\\\\\\\👄\\\\\\\\）' ]\n  coverage \"$TARGET_COMMAND\" '\\\\'\n}\n\n@test 'ASCIIコード表33~127まででの置換 (エスケープ文字は除外)' {\n  grep -o . <<< '!\"#$%&'\"'\"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~' | while read -r ch; do\n    run \"$TARGET_COMMAND\" \"$ch\"\n    [ \"$status\" -eq 0 ]\n    [ \"${lines[0]}\" = \"＿人人人人人人＿\" ]\n    [ \"${lines[1]}\" = \"＞　突然の死　＜\" ]\n    [ \"${lines[2]}\" = \"￣Y^Y^Y^Y^Y^Y^￣\" ]\n    [ \"${lines[3]}\" = \"　　　　　　👑\" ]\n    [ \"${lines[4]}\" = \"　　　　（$ch$ch$ch）\" ]\n    [ \"${lines[5]}\" = \"　　　（$ch👁$ch👁$ch）\" ]\n    [ \"${lines[6]}\" = \"　　（$ch$ch$ch👃$ch$ch$ch）\" ]\n    [ \"${lines[7]}\" = \"　（$ch$ch$ch$ch👄$ch$ch$ch$ch）\" ]\n    coverage \"$TARGET_COMMAND\" \"$ch\"\n  done\n}\n"
  },
  {
    "path": "test/unko.encode-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"../bin/unko.encode\"\n\n@test \"-h でヘルプを出力する\" {\n  run \"$TARGET_COMMAND\" -h\n  echo \"$output\"\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[0]}\" =~ ^Usage:.* ]]\n  coverage \"$TARGET_COMMAND\" -h\n}\n\n@test \"--help でヘルプを出力する\" {\n  run \"$TARGET_COMMAND\" --help\n  echo \"$output\"\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[0]}\" =~ ^Usage:.* ]]\n  coverage \"$TARGET_COMMAND\" --help\n}\n\n@test '引数なしのときは標準入力をエンコード' {\n  run \"$TARGET_COMMAND\" <<< うんこ\n  echo \"$output\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"ウンウこうんこう💩ウンウこうこここウウンウこうんここウうんこ\" ]\n  coverage \"$TARGET_COMMAND\" <<< うんこ\n}\n\n@test '-d で標準入力をデコード {\n  run \"$TARGET_COMMAND\" -d <<< ウンウこうんこう💩ウンウこうこここウウンウこうんここウうんこ\n  echo \"$output\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"うんこ\" ]\n  coverage \"$TARGET_COMMAND\" -d <<< ウンウこうんこう💩ウンウこうこここウウンウこうんここウうんこ\n}\n\n@test '--decode で標準入力をデコード {\n  run \"$TARGET_COMMAND\" --decode <<< ウンウこうんこう💩ウンウこうこここウウンウこうんここウうんこ\n  echo \"$output\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"うんこ\" ]\n  coverage \"$TARGET_COMMAND\" --decode <<< ウンウこうんこう💩ウンウこうこここウウンウこうんここウうんこ\n}\n\n@test 'ファイルが存在しない場合エラー' {\n  export LANG=ja_JP.UTF-8\n  run \"$TARGET_COMMAND\" うんこ\n  echo \"$output\"\n  [ \"$status\" -eq 1 ]\n  [[ \"${lines[0]}\" =~ .*そのようなファイルやディレクトリはありません ]]\n  coverage LANG=ja_JP.UTF-8 \"$TARGET_COMMAND\" うんこ\n}\n\n@test 'ディレクトリの場合エラー' {\n  export LANG=ja_JP.UTF-8\n  run \"$TARGET_COMMAND\" .\n  echo \"$output\"\n  [ \"$status\" -eq 1 ]\n  [[ \"${lines[0]}\" =~ .*ディレクトリです ]]\n  coverage LANG=ja_JP.UTF-8 \"$TARGET_COMMAND\" .\n}\n\n@test 'ファイルが存在しない場合エラー(英語版)' {\n  export LANG=en_US.UTF-8\n  run \"$TARGET_COMMAND\" うんこ\n  echo \"$output\"\n  [ \"$status\" -eq 1 ]\n  [[ \"${lines[0]}\" =~ .*\"No such file or directory\" ]]\n  coverage LANG=en_US.UTF-8 \"$TARGET_COMMAND\" うんこ\n}\n\n@test 'ディレクトリの場合エラー(英語版)' {\n  export LANG=en_US.UTF-8\n  run \"$TARGET_COMMAND\" .\n  echo \"$output\"\n  [ \"$status\" -eq 1 ]\n  [[ \"${lines[0]}\" =~ .*\"Is a directory\" ]]\n  coverage LANG=en_US.UTF-8 \"$TARGET_COMMAND\" .\n}\n"
  },
  {
    "path": "test/unko.fizzbuzz-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"$(pwd)/../bin/unko.fizzbuzz\"\nreadonly BASH_REQUIRE_VERSION=4.0\n\n#==============================================================================\n# NOTE:\n#   echo-sdはBash4.0以下では動かないため、Bash4.1以上のみテストする\n#==============================================================================\n\nbash_version=$(bash --version | grep -Eo \"[0-9]+\\.[0-9]+\" | head -n 1)\nif [ $(echo \"$BASH_REQUIRE_VERSION < $bash_version\" | bc) -eq 0 ]; then\n  echo \"  Bash${BASH_REQUIRE_VERSION}以下はスキップ\"\n  exit 0\nfi\n\n@test \"引数がない時はヘルプを出力する\" {\n  run \"$TARGET_COMMAND\"\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[0]}\" =~ .*unko.fizzbuzz:* ]]\n  coverage \"$TARGET_COMMAND\"\n}\n\n@test \"引数が正の整数でない時はヘルプを出力する\" {\n  for i in -1 1.1 a whoami '$(whoami)' あ 漢字 \"\" - \"*\" / \"?\" '_[$(whoami >&2)]'; do\n    run \"$TARGET_COMMAND\" \"$i\"\n    [ \"$status\" -eq 0 ]\n    [[ \"${lines[0]}\" =~ .*unko.fizzbuzz:* ]]\n    coverage \"$TARGET_COMMAND\" \"$i\"\n  done\n}\n\n@test \"引数が0のときは何も出力しない\" {\n  run \"$TARGET_COMMAND\" 0\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[0]}\" == \"\" ]]\n  coverage \"$TARGET_COMMAND\" 0\n}\n\n@test \"引数が3のときは3まで出力する\" {\n  run \"$TARGET_COMMAND\" 3\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[0]}\" == 1 ]]\n  [[ \"${lines[1]}\" == 2 ]]\n  [[ \"${lines[2]}\" =~ .*fizz$ ]]\n  [[ \"${lines[3]}\" == \"\" ]]\n  coverage \"$TARGET_COMMAND\" 3\n}\n\n@test \"引数が16のときは16まで出力する\" {\n  run \"$TARGET_COMMAND\" 16\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[1]}\" == 2 ]]\n  [[ \"${lines[2]}\" =~ .*fizz$ ]]\n  [[ \"${lines[3]}\" == 4 ]]\n  [[ \"${lines[4]}\" =~ .*buzz$ ]]\n  [[ \"${lines[5]}\" =~ .*fizz$ ]]\n  [[ \"${lines[14]}\" =~ .*人人.* ]]\n  [[ \"${lines[15]}\" =~ .*fizzbuzz.* ]]\n  coverage \"$TARGET_COMMAND\" 16\n}\n"
  },
  {
    "path": "test/unko.grep-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"../bin/unko.grep\"\n\n@test \"unko.grepはうんことマッチする\" {\n  run \"$TARGET_COMMAND\" <<< \"$(echo -e 'うんこ\\nあ')\"\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = うんこ ]\n  coverage \"$TARGET_COMMAND\" <<< \"$(echo -e 'うんこ\\nあ')\"\n}\n\n@test \"unko.grepはうんこ(2行)とマッチする\" {\n  run \"$TARGET_COMMAND\" <<< \"$(echo -e 'うんこ\\nうんち')\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = うんこ ]\n  [ \"${lines[1]}\" = うんち ]\n  coverage \"$TARGET_COMMAND\" <<< \"$(echo -e 'うんこ\\nうんち')\"\n}\n\n@test \"unko.grepは💩とマッチする\" {\n  run \"$TARGET_COMMAND\" <<< \"💩\"\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = 💩 ]\n  coverage \"$TARGET_COMMAND\" <<< \"💩\"\n}\n"
  },
  {
    "path": "test/unko.king-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"$(pwd)/../bin/unko.king\"\nreadonly BASH_REQUIRE_VERSION=4.0\n\n@test \"-h でヘルプを出力する\" {\n  run \"$TARGET_COMMAND\" -h\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[0]}\" =~ ^unko.king.* ]]\n  coverage \"$TARGET_COMMAND\" -h\n}\n\n@test \"--help でヘルプを出力する\" {\n  run \"$TARGET_COMMAND\" --help\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[0]}\" =~ ^unko.king.* ]]\n  coverage \"$TARGET_COMMAND\" --help\n}\n\n@test \"-v でバージョンを出力する\" {\n  run \"$TARGET_COMMAND\" -v\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[0]}\" =~ ^v ]]\n  coverage \"$TARGET_COMMAND\" -v\n}\n\n@test \"--version でバージョンを出力する\" {\n  run \"$TARGET_COMMAND\" --version\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[0]}\" =~ ^v ]]\n  coverage \"$TARGET_COMMAND\" --version\n}\n\n@test \"引数未指定の時はデフォルト5になる\" {\n  run \"$TARGET_COMMAND\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　　👑\" ]\n  [ \"${lines[1]}\" = \"　　　　（💩💩💩）\" ]\n  [ \"${lines[2]}\" = \"　　　（💩👁💩👁💩）\" ]\n  [ \"${lines[3]}\" = \"　　（💩💩💩👃💩💩💩）\" ]\n  [ \"${lines[4]}\" = \"　（💩💩💩💩👄💩💩💩💩）\" ]\n  coverage \"$TARGET_COMMAND\"\n}\n\n@test \"引数 5\" {\n  run \"$TARGET_COMMAND\" 5\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　　👑\" ]\n  [ \"${lines[1]}\" = \"　　　　（💩💩💩）\" ]\n  [ \"${lines[2]}\" = \"　　　（💩👁💩👁💩）\" ]\n  [ \"${lines[3]}\" = \"　　（💩💩💩👃💩💩💩）\" ]\n  [ \"${lines[4]}\" = \"　（💩💩💩💩👄💩💩💩💩）\" ]\n  coverage \"$TARGET_COMMAND\" 5\n}\n\n@test \"0埋めの数値 (8進数のテスト)\" {\n  for i in '05' '07' '08' '09' '010'; do\n    run \"$TARGET_COMMAND\" \"$i\"\n    [ \"$status\" -eq 0 ]\n    coverage \"$TARGET_COMMAND\" \"$i\"\n  done\n}\n\n@test \"引数 5 未満はNG\" {\n  for i in -1 0 1 2 3 4; do\n    run \"$TARGET_COMMAND\" $i\n    [ \"$status\" -ne 0 ]\n    coverage \"$TARGET_COMMAND\" $i\n  done\n}\n\n@test \"引数 6\" {\n  run \"$TARGET_COMMAND\" 6\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　　　👑\" ]\n  [ \"${lines[1]}\" = \"　　　　　（💩💩💩）\" ]\n  [ \"${lines[2]}\" = \"　　　　（💩👁💩👁💩）\" ]\n  [ \"${lines[3]}\" = \"　　　（💩💩💩👃💩💩💩）\" ]\n  [ \"${lines[4]}\" = \"　　（💩💩💩💩👄💩💩💩💩）\" ]\n  [ \"${lines[5]}\" = \"　（💩💩💩💩💩💩💩💩💩💩💩）\" ]\n  coverage \"$TARGET_COMMAND\" 6\n}\n\n@test \"オプション以外の第1引数は数値のみ受け付ける\" {\n  for i in a whoami '$(whoami)' あ 漢字 \"\" - \"*\" / \"?\" '_[$(whoami >&2)]'; do\n    run \"$TARGET_COMMAND\" \"$i\"\n    [ \"$status\" -ne 0 ]\n    [[ \"$output\" =~ ^.*ERR.*Invalid.*number.*$ ]]\n    coverage \"$TARGET_COMMAND\" \"$i\"\n  done\n}\n\n@test \"第1引数に段数、第2引数が不正なケース\" {\n  for i in a whoami '$(whoami)' あ 漢字 \"\" - \"*\" / \"?\" '_[$(whoami >&2)]'; do\n    run \"$TARGET_COMMAND\" 8 \"$i\"\n    [ \"$status\" -ne 0 ]\n    [[ \"$output\" =~ ^.*ERR.*Invalid.*sub.*command.*$ ]]\n    coverage \"$TARGET_COMMAND\" 8 \"$i\"\n  done\n}\n\n#==============================================================================\n# NOTE:\n#   以降のテストではecho-sdを使用する。\n#   echo-sdはBash4.0以下では動かないため、Bash4.1以上のみテストする。\n#==============================================================================\n\nbash_version=$(bash --version | grep -Eo \"[0-9]+\\.[0-9]+\" | head -n 1)\nif [ $(echo \"$BASH_REQUIRE_VERSION < $bash_version\" | bc) -eq 0 ]; then\n  echo \"  Bash${BASH_REQUIRE_VERSION}以下はスキップ\"\n  exit 0\nfi\n\n@test \"第1引数にはshoutを受け付ける。デフォルトの段数は5\" {\n  run \"$TARGET_COMMAND\" shout こんにちは\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[1]}\" =~ ^.*こんにちは.*$ ]]\n  [ \"${lines[3]}\" = \"　　　　　　👑\" ]\n  [ \"${lines[4]}\" = \"　　　　（💩💩💩）\" ]\n  [ \"${lines[5]}\" = \"　　　（💩👁💩👁💩）\" ]\n  [ \"${lines[6]}\" = \"　　（💩💩💩👃💩💩💩）\" ]\n  [ \"${lines[7]}\" = \"　（💩💩💩💩👄💩💩💩💩）\" ]\n  coverage \"$TARGET_COMMAND\" shout こんにちは\n}\n\n@test \"第1引数に段数、第2引数にshout\" {\n  run \"$TARGET_COMMAND\" 8 shout こんばんは\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[1]}\" =~ ^.*こんばんは.*$ ]]\n  coverage \"$TARGET_COMMAND\" 8 shout こんばんは\n}\n\n@test \"shoutの第3引数以降はオプション\" {\n  run bash -c \"echo うんこ | $TARGET_COMMAND 7 shout -s\"\n  [ \"$status\" -eq 0 ]\n  [[ \"${lines[1]}\" =~ ^.*うんこ.*$ ]]\n  coverage bash -c \"echo うんこ | $TARGET_COMMAND 7 shout -s\"\n}\n"
  },
  {
    "path": "test/unko.printpnm-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"$(pwd)/../bin/unko.printpnm\"\n\nsetup() {\n  export RUN_TEST=true\n  load \"$TARGET_COMMAND\"\n}\n\n@test \"unko.printpnmのmax_stage_col関数は引数1のとき13を返す\" {\n  run max_stage_col 1\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" -eq 13 ]\n  coverage max_stage_col 1\n}\n\n@test \"unko.printpnmのmax_stage_row関数は引数1のとき8を返す\" {\n  run max_stage_row 1\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" -eq 8 ]\n  coverage max_stage_row 1\n}\n\n@test \"unko.printpnmのmax_value関数は引数の中からもっとも大きな値を返す\" {\n  run max_value 1 2 3\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" -eq 3 ]\n  coverage max_value 1 2 3\n}\n\n@test \"unko.printpnmのmax_value関数は引数の中からもっとも大きな値を返す。並び順は関係ない\" {\n  run max_value 3 2 1\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" -eq 3 ]\n  coverage max_value 3 2 1\n}\n\n@test \"unko.printpnmのmax_value関数は引数の中からもっとも大きな値を返す。2桁の整数に対しても\" {\n  run max_value 10 12 3\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" -eq 12 ]\n  coverage max_value 10 12 3\n}\n\n@test \"unko.printpnmのrepeat関数は引数の数だけ1を連続して返す\" {\n  run repeat 3\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = 111 ]\n  coverage repeat 3\n}\n\n@test \"unko.printpnmのrepeat関数は引数の数だけ引数を連続して返す\" {\n  run repeat 3 0\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = 000 ]\n  coverage repeat 3 0\n}\n\n@test \"unko.printpnmのalign_center関数は文字列を指定の文字で中央揃えして返す (奇数)\" {\n  run align_center 0 <<< \"$(echo -e '1\\n111')\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"010\" ]\n  [ \"${lines[1]}\" = \"111\" ]\n  coverage align_center 0 <<< \"$(echo -e '1\\n111')\"\n}\n\n@test \"unko.printpnmのalign_center関数は文字列を指定の文字で中央揃えして返す (偶数)\" {\n  run align_center 0 <<< \"$(echo -e '1\\n1111')\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"0100\" ]\n  [ \"${lines[1]}\" = \"1111\" ]\n  coverage align_center 0 <<< \"$(echo -e '1\\n1111')\"\n}\n\n"
  },
  {
    "path": "test/unko.pyramid-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"../bin/unko.pyramid\"\n\n@test 'unko.pyramidは引数なしのときは16段' {\n  run \"$TARGET_COMMAND\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\"  = \"               💩               \" ]\n  [ \"${lines[1]}\"  = \"              💩💩              \" ]\n  [ \"${lines[2]}\"  = \"             💩  💩             \" ]\n  [ \"${lines[3]}\"  = \"            💩💩💩💩            \" ]\n  [ \"${lines[4]}\"  = \"           💩      💩           \" ]\n  [ \"${lines[5]}\"  = \"          💩💩    💩💩          \" ]\n  [ \"${lines[6]}\"  = \"         💩  💩  💩  💩         \" ]\n  [ \"${lines[7]}\"  = \"        💩💩💩💩💩💩💩💩        \" ]\n  [ \"${lines[8]}\"  = \"       💩              💩       \" ]\n  [ \"${lines[9]}\"  = \"      💩💩            💩💩      \" ]\n  [ \"${lines[10]}\" = \"     💩  💩          💩  💩     \" ]\n  [ \"${lines[11]}\" = \"    💩💩💩💩        💩💩💩💩    \" ]\n  [ \"${lines[12]}\" = \"   💩      💩      💩      💩   \" ]\n  [ \"${lines[13]}\" = \"  💩💩    💩💩    💩💩    💩💩  \" ]\n  [ \"${lines[14]}\" = \" 💩  💩  💩  💩  💩  💩  💩  💩 \" ]\n  [ \"${lines[15]}\" = \"💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩\" ]\n  coverage \"$TARGET_COMMAND\"\n}\n\n@test 'unko.pyramidの美しさはブラウザのコードレビューでも確認できる' {\n  run bash -c \"$TARGET_COMMAND 8|tr 💩 🎄|sed '1s/🎄/👑/';yes 💩|head -2|xargs printf '% 11s\\n'\"\n  [ \"${lines[0]}\"  = \"       👑       \" ]\n  [ \"${lines[1]}\"  = \"      🎄🎄      \" ]\n  [ \"${lines[2]}\"  = \"     🎄  🎄     \" ]\n  [ \"${lines[3]}\"  = \"    🎄🎄🎄🎄    \" ]\n  [ \"${lines[4]}\"  = \"   🎄      🎄   \" ]\n  [ \"${lines[5]}\"  = \"  🎄🎄    🎄🎄  \" ]\n  [ \"${lines[6]}\"  = \" 🎄  🎄  🎄  🎄 \" ]\n  [ \"${lines[7]}\"  = \"🎄🎄🎄🎄🎄🎄🎄🎄\" ]\n  [ \"${lines[8]}\"  = \"       💩\" ]\n  [ \"${lines[9]}\"  = \"       💩\" ]\n\n}\n\n@test 'unko.pyramidの引数1' {\n  run \"$TARGET_COMMAND\" 1\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"💩\" ]\n}\n\n@test \"オプション以外の第1引数は数値のみ受け付ける\" {\n  for i in 0 16.5 a $ '_[$(whoami >&2)]' whoami '$(whoami)' あ 漢字 \"*\" / \"?\"; do\n    run \"$TARGET_COMMAND\" \"$i\"\n    [ \"$status\" -ne 0 ]\n    [ \"$output\" = \"unko.pyramid: Invalid number '${i}'\" ]\n  done\n}\n\n@test \"第1引数に段数、第2引数が不正なケース\" {\n  for i in 0 16.5 a $ '_[$(whoami >&2)]' whoami '$(whoami)' あ 漢字 \"*\" / \"?\"; do\n    run \"$TARGET_COMMAND\" 16 \"$i\"\n    [ \"$status\" -ne 0 ]\n    [ \"$output\" = \"unko.pyramid: Invalid number '${i}'\" ]\n  done\n}\n\n@test \"-から始まる不正なオプションはエラー\" {\n  for i in - -a --; do\n    run \"$TARGET_COMMAND\" \"$i\"\n    [ \"$status\" -ne 0 ]\n    [ \"$output\" = \"unko.pyramid: illegal option '${i}'\" ]\n  done\n}\n\n"
  },
  {
    "path": "test/unko.toilet-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"../bin/unko.toilet\"\n\n@test \"普通に実行\" {\n  run \"$TARGET_COMMAND\"\n  [ \"$status\" -eq 0 ]\n  coverage \"$TARGET_COMMAND\"\n}\n\n@test \"おかしなオプション--お菓子\" {\n  run \"$TARGET_COMMAND\" --お菓子\n  [ \"$status\" -ne 0 ]\n  coverage \"$TARGET_COMMAND\" --お菓子\n}\n\nreadonly HANAGE_BASE64=\"ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAg\nICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfkqkgICAg8J+SqSAg\n8J+SqSAgICAKICDwn5KpICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAgIPCfkqkgIPCf\nkqkgICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICDwn5KpICDwn5KpICDwn5KpICAgIAogICAg\n8J+SqSAg8J+SqSAgICAgIPCfkqnwn5Kp8J+SqSAgICAgICAg8J+SqfCfkqnwn5Kp8J+SqfCfkqkg\nIPCfkqnwn5KpICAgICAgICAgICAgICDwn5KpICAgICAgICAgIPCfkqnwn5Kp8J+SqSAgICAgIAog\nICAg8J+SqSAgICDwn5Kp8J+SqfCfkqnwn5KpICAgICAgICAgICAgICAgIPCfkqkgICAgICAgIPCf\nkqnwn5KpICAgICAgICAgICAg8J+SqSAg8J+SqfCfkqnwn5Kp8J+SqfCfkqkgICAgICAgICAgCiAg\n8J+SqSAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAg8J+SqSAgICAgIPCfkqkgICAgICAg\nICAgICAgIPCfkqkgICAgICAgICAgICDwn5KpICAgICAgICAgIAogIPCfkqkgICAgICAgICAgICDw\nn5KpICAgICAgICAgICAgICDwn5KpICAgICAgICDwn5KpICAgICAgICAgICAgICDwn5KpICAgICAg\nICAgICAg8J+SqSAgICAgICAgICAKICDwn5KpICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAg\n8J+SqSAgICAgICAg8J+SqSAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgIPCfkqkgICAgICAg\nICAgCiAg8J+SqSAgICAgIPCfkqnwn5Kp8J+SqfCfkqkgICAgICAgICAgICDwn5KpICAgIPCfkqnw\nn5Kp8J+SqfCfkqkgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICDwn5KpICAgICAgICAgIAog\nIPCfkqkgIPCfkqnwn5KpICAgICAg8J+SqfCfkqkgICAgICAgICAgICAgIPCfkqkgICAgICDwn5Kp\n8J+SqSAgICAgICAgICAgICAg8J+SqfCfkqkgICAgICDwn5KpICAgICAgICAgICAgCiAg8J+SqfCf\nkqkgIPCfkqkgICAgICDwn5KpICDwn5KpICAgICAgICAgICAg8J+SqSAgICAgIPCfkqkgIPCfkqkg\nICAgICAgICAgICDwn5KpICAgICAgICDwn5KpICAgICAgICAgICAgCiAgICDwn5KpICAgIPCfkqnw\nn5Kp8J+SqSAgICAgICAgICAgICAgICAgICAg8J+SqfCfkqnwn5KpICAgICAgICAgICAgICAgICAg\nICAgICAgICDwn5KpICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK\"\n\n@test \"stdinから\" {\n  run bash -c \"echo はなげ| $TARGET_COMMAND | base64\"\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = \"$HANAGE_BASE64\" ]\n  coverage \"$TARGET_COMMAND\" <<< はなげ\n}\n\n# @test \"引数に\" {\n#   run bash -c \"$TARGET_COMMAND はなげ | base64\"\n#   [ \"$status\" -eq 0 ]\n#   [ \"$output\" = \"$HANAGE_BASE64\" ]\n#   coverage \"$TARGET_COMMAND\" はなげ\n# }\n\n# @test \"flip\" {\n#   run bash -c \"$TARGET_COMMAND --flip | base64\"\n#   [ \"$status\" -eq 0 ]\n#   [ \"$output\" = \"ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfkqnwn5KpICAgICAg\n# ICAgIAogICAgICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICAgICAgICDwn5Kp\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICDwn5Kp8J+SqfCf\n# kqnwn5Kp8J+SqSAgICAgICAgICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICAg\n# ICAg8J+SqfCfkqnwn5Kp8J+SqSAgICAgICAgCiAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICDwn5Kp\n# 8J+SqSAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCf\n# kqkgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAgIPCfkqkg\n# ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAg\n# ICAgICDwn5Kp8J+SqfCfkqkgICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAKICAg\n# ICAgICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICDwn5KpICAgIPCfkqkgICAg\n# ICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAKICAgICAgICDwn5KpICAgICAgICAgIPCf\n# kqkgICAgICAgICAgICDwn5KpICAgICAg8J+SqSAgICAgIPCfkqkgICAgICAgICAgICAgICAg8J+S\n# qSAgICAgICAgICAgICAgCiAgICAgICAgICDwn5Kp8J+SqfCfkqnwn5Kp8J+SqSAgICAgICAgICAg\n# ICAgICDwn5KpICAgIPCfkqkgICAgICDwn5KpICAgICAgICAgICAgICAgICAg8J+SqSAgICAgICAg\n# ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfkqnwn5KpICAgICAg\n# ICAgIPCfkqkgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgIAogICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgIAo=\" ]\n#   coverage \"$TARGET_COMMAND\" --flip\n# }\n#\n# @test \"flop\" {\n#   run bash -c \"$TARGET_COMMAND --flop | base64\"\n#   [ \"$status\" -eq 0 ]\n#   [ \"$output\" = \"ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAg\n# ICDwn5KpICAgICAgICAgIPCfkqnwn5KpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAKICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAgIPCfkqkgICAgICDwn5KpICAg\n# IPCfkqkgICAgICAgICAgICAgICAg8J+SqfCfkqnwn5Kp8J+SqfCfkqkgICAgICAgICAgCiAgICAg\n# ICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICDwn5KpICAgICAg8J+SqSAgICAgIPCfkqkgICAg\n# ICAgICAgICDwn5KpICAgICAgICAgIPCfkqkgICAgICAgIAogICAgICAgICAgICAgIPCfkqkgICAg\n# ICAgICAgICAgICAgICDwn5KpICAgIPCfkqkgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAg\n# ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICDwn5Kp8J+S\n# qfCfkqkgICAgICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICAgICAgCiAgICAg\n# ICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAg\n# ICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# IAogICAg8J+SqfCfkqkgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICAgIPCfkqkgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgCiAgICAgICAg8J+SqfCfkqnw\n# n5Kp8J+SqSAgICAgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAgICAgICAg\n# 8J+SqfCfkqnwn5Kp8J+SqfCfkqkgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAg\n# ICAgICAKICAgICAgICAgIPCfkqnwn5KpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIPCfkqkgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgIAo=\" ]\n#   coverage \"$TARGET_COMMAND\" --flop\n# }\n#\n# @test \"180\" {\n#   run bash -c \"$TARGET_COMMAND --180 | base64\"\n#   [ \"$status\" -eq 0 ]\n#   [ \"$output\" = \"ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICDwn5Kp8J+SqSAgICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAg8J+SqSAgICAg\n# ICAgICAKICAgICAgICAgIPCfkqnwn5Kp8J+SqfCfkqnwn5KpICAgICAgICAgICAgICAgIPCfkqkg\n# ICAg8J+SqSAgICAgIPCfkqkgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgCiAgICAg\n# ICAg8J+SqSAgICAgICAgICDwn5KpICAgICAgICAgICAg8J+SqSAgICAgIPCfkqkgICAgICDwn5Kp\n# ICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg\n# 8J+SqSAgICAgICAgICAgICAgICAgIPCfkqkgICAg8J+SqSAgICAgICAgICAgICAgICAgIPCfkqkg\n# ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAg\n# ICAg8J+SqfCfkqnwn5KpICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgCiAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAg\n# ICAgICAg8J+SqSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAg\n# IAogICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg8J+SqSAgICAg\n# ICAgICAgICAgICAgICAg8J+SqSAgICAgICAg8J+SqfCfkqkgICAgCiAgICAgICAgICDwn5Kp8J+S\n# qfCfkqnwn5Kp8J+SqSAgICAgICAgICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAg\n# ICAgICAg8J+SqfCfkqnwn5Kp8J+SqSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg8J+SqSAg\n# ICAgICAgICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgIPCfkqnwn5KpICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCf\n# kqkgICAgICAgIAo=\" ]\n#   coverage \"$TARGET_COMMAND\" --180\n# }\n#\n# @test \"right\" {\n#   run bash -c \"$TARGET_COMMAND --right | base64\"\n#   [ \"$status\" -eq 0 ]\n#   [ \"$output\" = \"ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn5Kp8J+SqSAgICAg\n# ICAgICAgICAgICAKICAgICAgICAgICAg8J+SqfCfkqkgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAg8J+SqfCfkqkgICAg8J+SqfCfkqnwn5Kp8J+SqQogICAgICAgICAgICAgICAg8J+SqfCfkqnw\n# n5Kp8J+SqfCfkqnwn5KpICAgICAgICAgICAgICAgIPCfkqnwn5KpICAgIPCfkqnwn5KpICAgIAog\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAg8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCf\n# kqkgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg8J+SqfCfkqkgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg8J+SqfCf\n# kqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqkgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICDwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+S\n# qfCfkqnwn5Kp8J+SqfCfkqkgICAgICAgIAogICAgICAgICAgICDwn5Kp8J+SqfCfkqnwn5Kp8J+S\n# qfCfkqnwn5Kp8J+SqSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg\n# IPCfkqnwn5Kp8J+SqfCfkqkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# CiAgICAgICAgICAgICAgICAgICAg8J+SqfCfkqkgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIPCfkqnwn5Kp8J+SqfCfkqnwn5Kp\n# 8J+SqSAgICAgICAgICAgICAgICDwn5Kp8J+SqSAgICAgICAgCiAgICAgICAgICAgICAgICDwn5Kp\n# 8J+SqSAgICAgICAgICAgICAgICAgICAgICAgIPCfkqnwn5KpICAgICAgICAgICAgCiAgICAgICAg\n# ICAgICAgICDwn5Kp8J+SqSAgICAgICAgICAgICAgICAgICAg8J+SqfCfkqnwn5Kp8J+SqSAgICAg\n# ICAgICAgIAogICAgICAgICAgICAgICAg8J+SqfCfkqnwn5Kp8J+SqSAgICAgICAgICAgICAgICAg\n# ICAg8J+SqfCfkqkgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo=\" ]\n#   coverage \"$TARGET_COMMAND\" --right\n# }\n#\n# @test \"left\" {\n#   run bash -c \"$TARGET_COMMAND --left | base64\"\n#   [ \"$status\" -eq 0 ]\n#   [ \"$output\" = \"ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgIAogICAgICAgICAgICDwn5Kp8J+SqSAgICAgICAgICAgICAgICAgICAg8J+SqfCfkqnw\n# n5Kp8J+SqSAgICAgICAgICAgICAgICAKICAgICAgICAgICAg8J+SqfCfkqnwn5Kp8J+SqSAgICAg\n# ICAgICAgICAgICAgICAg8J+SqfCfkqkgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIPCfkqnw\n# n5KpICAgICAgICAgICAgICAgICAgICAgICAg8J+SqfCfkqkgICAgICAgICAgICAgICAgCiAgICAg\n# ICAg8J+SqfCfkqkgICAgICAgICAgICAgICAg8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5KpICAgICAg\n# ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICDwn5Kp8J+SqSAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICDwn5Kp8J+SqfCfkqnwn5KpICAgICAgICAgICAgCiAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAg8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqkgICAgICAg\n# ICAgICAKICAgICAgICDwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+S\n# qfCfkqkgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICDwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqSAgICAgICAgICAgICAgICAKICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn5Kp8J+SqSAgICAgICAg\n# ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICDwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp\n# 8J+SqSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIPCfkqnwn5KpICAgIPCfkqnwn5Kp\n# ICAgICAgICAgICAgICAgIPCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqSAgICAgICAgICAgICAgICAK\n# 8J+SqfCfkqnwn5Kp8J+SqSAgICDwn5Kp8J+SqSAgICAgICAgICAgICAgICAgICAgICAgICAgICDw\n# n5Kp8J+SqSAgICAgICAgICAgIAogICAgICAgICAgICAgICAg8J+SqfCfkqkgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo=\" ]\n#   coverage \"$TARGET_COMMAND\" --left\n# }\n#\n# @test \"border\" {\n#   run bash -c \"$TARGET_COMMAND --border | base64\"\n#   [ \"$status\" -eq 0 ]\n#   [ \"$output\" = \"8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnw\n# n5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCf\n# kqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+S\n# qfCfkqkK8J+SqSAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg8J+SqQrwn5KpICAgICAgICAg\n# IPCfkqnwn5KpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgIPCfkqkK8J+SqSAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAg\n# ICAgICDwn5KpCvCfkqkgICAgICAgIPCfkqnwn5Kp8J+SqfCfkqkgICAgICAgICAgICAgICAgICAg\n# ICAg8J+SqSAgICAgICAgICAgICAgICAgICAgICAgIPCfkqnwn5Kp8J+SqfCfkqnwn5KpICAgICAg\n# ICAgIPCfkqkK8J+SqSAgICDwn5Kp8J+SqSAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAgICAg\n# 8J+SqSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICDwn5KpCvCf\n# kqkgICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg8J+SqQrwn5KpICAgICAgICAgICAgICAg\n# IPCfkqkgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgIPCfkqkK8J+SqSAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAg\n# ICAgIPCfkqnwn5Kp8J+SqSAgICAgICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICAg\n# ICAgICDwn5KpCvCfkqkgICAgICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICDwn5KpICAg\n# IPCfkqkgICAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAgICAgIPCfkqkK8J+S\n# qSAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgICAgICDwn5KpICAgICAg8J+SqSAgICAgIPCf\n# kqkgICAgICAgICAgICDwn5KpICAgICAgICAgIPCfkqkgICAgICAgIPCfkqkK8J+SqSAgICAgICAg\n# ICAgIPCfkqkgICAgICAgICAgICAgICAgICDwn5KpICAgICAg8J+SqSAgICDwn5KpICAgICAgICAg\n# ICAgICAgIPCfkqnwn5Kp8J+SqfCfkqnwn5KpICAgICAgICAgIPCfkqkK8J+SqSAgICAgICAgICDw\n# n5KpICAgICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICDwn5Kp8J+SqSAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAg8J+SqQrwn5KpICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAg8J+SqQrwn5KpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg8J+SqQrwn5KpICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n# ICAgICAgICAgICAgICAgICAg8J+SqQrwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCf\n# kqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+S\n# qfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp\n# 8J+SqfCfkqnwn5Kp8J+SqfCfkqnwn5Kp8J+SqQo=\" ]\n#   coverage \"$TARGET_COMMAND\" --border\n# }\n\nreadonly WIDTH_20=\"ICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAgCiAgICAgICAgICDwn5Kp8J+SqSAgICAgICAg\nICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICDwn5Kp8J+SqfCfkqnw\nn5KpICAgICAgICAgICAgCiAgICDwn5Kp8J+SqSAgICAgICAg8J+SqSAgICAgICAgICAKICAgICAg\nICAgICAgICAgIPCfkqkgICAgICAgICAgCiAgICAgICAgICAgICAgICDwn5KpICAgICAgICAgIAog\nICAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAKICAgICAgICAgICAgICDwn5KpICAgICAgICAg\nICAgCiAgICAgICAgICAgICAg8J+SqSAgICAgICAgICAgIAogICAgICAgICAgICDwn5KpICAgICAg\nICAgICAgICAKICAgICAgICAgIPCfkqkgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg\nICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIAogICAgICAgIPCfkqkgICAgICAgICAgICAgICAgICAKICAgICAgICAgIPCf\nkqkgICAgICAgICAgICAgICAgCiAgICAgICAgICDwn5KpICAgICAgICAgICAgICAgIAogICAgICAg\nIPCfkqkgICAgICAgICAgICAgICAgICAKICAgICAgICDwn5KpICAgICAgICAgICAgICAgICAgCiAg\nICAgIPCfkqnwn5Kp8J+SqSAgICAgICAgICAgICAgICAKICAgICAg8J+SqSAgICDwn5KpICAgICAg\nICAgICAgICAKICAgIPCfkqkgICAgICDwn5KpICAgICAg8J+SqSAgICAgIAogICAg8J+SqSAgICAg\nIPCfkqkgICAg8J+SqSAgICAgICAgCiAg8J+SqSAgICAgICAgICDwn5Kp8J+SqSAgICAgICAgICAK\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg\nIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgIPCfkqkgICAgICAgICAgICAgICAg\nICAgIAogICAgICAgIPCfkqnwn5Kp8J+SqfCfkqnwn5KpICAgICAgICAgIAogICAgICAgICAgICAg\nIPCfkqkgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgCiAgICDwn5KpICAgICAgICAgICAgICAgICAgICAgIAogICAg8J+S\nqSAgICAgICAgICAgICAgICAgICAgICAKICAgICAg8J+SqSAgICAgICAgICDwn5KpICAgICAgICAK\nICAgICAgICDwn5Kp8J+SqfCfkqnwn5Kp8J+SqSAgICAgICAgICAKICAgICAgICAgICAgICAgICAg\nICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo=\"\n\n# @test \"-w 20\" {\n#   run bash -c \"$TARGET_COMMAND -w 20 | base64\"\n#   [ \"$status\" -eq 0 ]\n#   [ \"$output\" = \"$WIDTH_20\" ]\n#   coverage \"$TARGET_COMMAND\" -w 20\n# }\n#\n# @test \"--width 20\" {\n#   run bash -c \"$TARGET_COMMAND --width 20 | base64\"\n#   [ \"$status\" -eq 0 ]\n#   [ \"$output\" = \"$WIDTH_20\" ]\n#   coverage \"$TARGET_COMMAND\" --width 20\n# }\n\n@test \"--help\" {\n  run bash -c \"$TARGET_COMMAND --help\"\n  [ \"$status\" -ne 0 ]\n  coverage \"$TARGET_COMMAND\" --help\n}\n\n@test \"-h\" {\n  run bash -c \"$TARGET_COMMAND -h\"\n  [ \"$status\" -ne 0 ]\n  coverage \"$TARGET_COMMAND\" -h\n}\n\n@test \"-h == --help\" {\n  run bash -c \"$TARGET_COMMAND -h 2>&1\"\n  [ \"$status\" -ne 0 ]\n  [ \"$output\" = \"$($TARGET_COMMAND --help 2>&1)\" ]\n}\n\n@test \"ヘルプメッセージは正しいかな？\" {\n  run bash -c \"$TARGET_COMMAND --help 2>&1 | base64\"\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = \"VXNhZ2U6IHVua28udG9pbGV0IFsgLWh2IF0gWyAtdyBvdXRwdXR3aWR0aCBdCiAgICAgICAgICAg\nICAgICAgICBbIC0tY3JvcCBdIFsgLS1mbGlwIF0gWyAtLWZsb3AgXQogICAgICAgICAgICAgICAg\nICAgWyAtLTE4MCBdIFsgLS1sZWZ0IF0gWyAtLXJpZ2h0IF0KICAgICAgICAgICAgICAgICAgIFsg\nLS1ib3JkZXIgXSBbIG1lc3NhZ2UgXQoKICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgICAg44GT\n44Gu44OY44Or44OX44KS5Ye65Yqb44GX44Gm57WC5LqG44GX44G+44GZCiAgLXcsIC0td2lkdGgg\nPHdpZHRoLCBhdXRvPiAgIOWHuuWKm+OBruW5heOBp+OBmeOAgmF1dG/jgpLmjIflrprjgZnjgovj\ngajnq6/mnKvjga7luYXjgavjgarjgorjgb7jgZkKICAgICAgLS1jcm9wICAgICAgICAgICAgICAg\nICAg5LiK5LiL5bem5Y+z44Gu54Sh6aeE44Gq44K544Oa44O844K544KS5YmK6Zmk44GX44G+44GZ\nCiAgICAgIC0tZmxpcCAgICAgICAgICAgICAgICAgIOawtOW5s+aWueWQkeOBq+WPjei7ouOBl+OB\nvuOBmQogICAgICAtLWZsb3AgICAgICAgICAgICAgICAgICDlnoLnm7TmlrnlkJHjgavlj43ou6Lj\ngZfjgb7jgZkKICAgICAgLS0xODAgICAgICAgICAgICAgICAgICAgMTgw5bqm5Zue6Lui44GX44G+\n44GZCiAgICAgIC0tbGVmdCAgICAgICAgICAgICAgICAgIOW3puOBuDkw5bqm5Zue6Lui44GX44G+\n44GZCiAgICAgIC0tcmlnaHQgICAgICAgICAgICAgICAgIOWPs+OBuDkw5bqm5Zue6Lui44GX44G+\n44GZCiAgICAgIC0tYm9yZGVyICAgICAgICAgICAgICAgIOaeoOe3muOCkuOBpOOBkeOBvuOBmQo=\" ]\n}\n\n@test \"--version\" {\n  run \"$TARGET_COMMAND\" --version\n  [ \"$status\" -eq 0 ]\n  coverage \"$TARGET_COMMAND\" --version\n}\n\n@test \"-v\" {\n  run \"$TARGET_COMMAND\" -v\n  [ \"$status\" -eq 0 ]\n  coverage \"$TARGET_COMMAND\" -v\n}\n\n@test \"--version == -v\" {\n  run \"$TARGET_COMMAND\" -v\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = \"$($TARGET_COMMAND --version)\" ]\n}\n\n@test \"バージョン情報は正しいかな？\" {\n  run bash -c \"$TARGET_COMMAND --version | base64\"\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = \"dW5rby50b2lsZXQgdmVyc2lvbiDwn5KpLvCfkqku8J+SqSAoMjDwn5Kp8J+SqS/wn5Kp8J+SqS/w\nn5Kp8J+SqSkK\" ]\n}\n\n@test \"全テスト終わり💩\" {\n  [ \"💩\" = \"💩\" ]\n}\n"
  },
  {
    "path": "test/unko.tower-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"../bin/unko.tower\"\n\n@test 'unko.towerは引数なしのときは3段' {\n  run \"$TARGET_COMMAND\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　　（　　　）\" ]\n  [ \"${lines[2]}\" = \"　　（　　　　　）\" ]\n  [ \"${lines[3]}\" = \"　（　　　　　　　）\" ]\n  coverage \"$TARGET_COMMAND\"\n}\n\n@test 'unko.towerで引数2' {\n  run \"$TARGET_COMMAND\" 2\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　（　　　）\" ]\n  [ \"${lines[2]}\" = \"　（　　　　　）\" ]\n  coverage \"$TARGET_COMMAND\" 2\n}\n\n@test 'unko.towerで引数4' {\n  run \"$TARGET_COMMAND\" 4\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　　　（　　　）\" ]\n  [ \"${lines[2]}\" = \"　　　（　　　　　）\" ]\n  [ \"${lines[3]}\" = \"　　（　　　　　　　）\" ]\n  [ \"${lines[4]}\" = \"　（　　　　　　　　　）\" ]\n  coverage \"$TARGET_COMMAND\" 4\n}\n\n@test 'unko.towerでメッセージを埋め込む' {\n  run \"$TARGET_COMMAND\" -s あい\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　　（あいあ）\" ]\n  [ \"${lines[2]}\" = \"　　（いあいあい）\" ]\n  [ \"${lines[3]}\" = \"　（あいあいあいあ）\" ]\n  coverage \"$TARGET_COMMAND\" -s あい\n}\n\n@test 'unko.towerで先頭から文字数分だけメッセージを埋め込む' {\n  run \"$TARGET_COMMAND\" -m あい\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　　（あい　）\" ]\n  [ \"${lines[2]}\" = \"　　（　　　　　）\" ]\n  [ \"${lines[3]}\" = \"　（　　　　　　　）\" ]\n  coverage \"$TARGET_COMMAND\" -m あい\n}\n\n@test 'unko.towerで半角文字は全角文字１つ分で置換される' {\n  run \"$TARGET_COMMAND\" -m ab\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　　（a b 　）\" ]\n  [ \"${lines[2]}\" = \"　　（　　　　　）\" ]\n  [ \"${lines[3]}\" = \"　（　　　　　　　）\" ]\n  coverage \"$TARGET_COMMAND\" -m ab\n}\n\n@test 'unko.tower -mで置換文字に/が含まれていても置換できる' {\n  run \"$TARGET_COMMAND\" -m /\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　　（/ 　　）\" ]\n  [ \"${lines[2]}\" = \"　　（　　　　　）\" ]\n  [ \"${lines[3]}\" = \"　（　　　　　　　）\" ]\n  coverage \"$TARGET_COMMAND\" -m /\n}\n\n@test 'unko.tower -sで置換文字に/が含まれていても置換できる' {\n  run \"$TARGET_COMMAND\" -s /\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"　　　　　人\" ]\n  [ \"${lines[1]}\" = \"　　　（/ / / ）\" ]\n  [ \"${lines[2]}\" = \"　　（/ / / / / ）\" ]\n  [ \"${lines[3]}\" = \"　（/ / / / / / / ）\" ]\n  coverage \"$TARGET_COMMAND\" -s /\n}\n\n@test 'unko.tower -sで置換文字に\\\\が含まれていても置換できる' {\n  run \"$TARGET_COMMAND\" -s '\\\\'\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = '　　　　　人' ]\n  [ \"${lines[1]}\" = '　　　（\\ \\ \\ ）' ]\n  [ \"${lines[2]}\" = '　　（\\ \\ \\ \\ \\ ）' ]\n  [ \"${lines[3]}\" = '　（\\ \\ \\ \\ \\ \\ \\ ）' ]\n  coverage \"$TARGET_COMMAND\" -s '\\\\'\n}\n\n@test 'unko.tower -sASCIIコード表33~127までの全ての文字は半角文字として扱う (\\\\は除外)' {\n  grep -o . <<< '!\"#$%&'\"'\"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~' | while read -r ch; do\n    run \"$TARGET_COMMAND\" -s \"$ch\"\n    [ \"$status\" -eq 0 ]\n    [ \"${lines[0]}\" = \"　　　　　人\" ]\n    [ \"${lines[1]}\" = \"　　　（$ch $ch $ch ）\" ]\n    [ \"${lines[2]}\" = \"　　（$ch $ch $ch $ch $ch ）\" ]\n    [ \"${lines[3]}\" = \"　（$ch $ch $ch $ch $ch $ch $ch ）\" ]\n    coverage \"$TARGET_COMMAND\" -s \"$ch\"\n  done\n}\n\n"
  },
  {
    "path": "test/unko.tr-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\nreadonly TARGET_COMMAND=\"../bin/unko.tr\"\n\n@test \"unko.trでうんこは💩になる\" {\n  run \"$TARGET_COMMAND\" <<< うんこ\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = 💩 ]\n  coverage \"$TARGET_COMMAND\" <<< うんこ\n}\n\n@test \"unko.trでうんちは💩になる\" {\n  run \"$TARGET_COMMAND\" <<< うんち\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = 💩 ]\n  coverage \"$TARGET_COMMAND\" <<< うんち\n}\n\n@test \"unko.trで下痢は💩になる\" {\n  run \"$TARGET_COMMAND\" <<< 下痢\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = 💩 ]\n  coverage \"$TARGET_COMMAND\" <<< 下痢\n}\n\n@test \"unko.trで💩は💩になる\" {\n  run \"$TARGET_COMMAND\" <<< 💩\n  [ \"$status\" -eq 0 ]\n  [ \"$output\" = 💩 ]\n  coverage \"$TARGET_COMMAND\" <<< 💩\n}\n"
  },
  {
    "path": "test/unko.yes-test.bats",
    "content": "#!/usr/bin/env bats\nsource functions.sh\n\n#==============================================================================\n# NOTE:\n#   yesをcoverageに渡しつつ、無限の出力を停止できないためcoverageを取得しない\n#==============================================================================\n\nreadonly TARGET_COMMAND=\"../bin/unko.yes\"\n\n@test \"unko.yesの1つ目の文字列は💩である\" {\n  run bash -c \"$TARGET_COMMAND | head -n 1\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"💩\" ]\n}\n\n@test \"unko.yesの2つ目の文字列は💩である\" {\n  run bash -c \"$TARGET_COMMAND | head -n 2\"\n  [ \"$status\" -eq 0 ]\n  [ \"${lines[0]}\" = \"💩\" ]\n  [ \"${lines[1]}\" = \"💩\" ]\n}\n\n"
  },
  {
    "path": "test.sh",
    "content": "#!/bin/bash\n\nSCRIPT_NAME=\"$(basename \"${BASH_SOURCE:-$0}\")\"\nreadonly SCRIPT_NAME\n\nreadonly RED=$'\\x1b[31m'\nreadonly BLUE=$'\\x1b[34m'\nreadonly RESET=$'\\x1b[m'\n\ncd test || exit 1\n\nmain() {\n  # 引数未指定の場合は全てのテストを実行する\n  local error_count=0\n  local ret\n  if [[ $# -lt 1 ]]; then\n    for test_script in *-test.bats; do\n      echo -e \"${BLUE}${test_script}${RESET}\"\n      ./\"$test_script\"\n      ret=$?\n      if [[ \"$ret\" -ne 0 ]]; then\n        error_count=$((error_count + 1))\n      fi\n      echo\n    done\n    return \"$error_count\"\n  fi\n\n  local cmd=\"$1\"\n\n  # ヘルプの出力\n  if [[ \"$cmd\" == help ]]; then\n    usage\n    return\n  fi\n\n  # マッチするコマンドのみ実行\n  for test_script in *-test.bats; do\n    if [[ \"$cmd\"-test.bats == \"$test_script\" ]]; then\n      echo -e \"${BLUE}${test_script}${RESET}\"\n      ./\"$test_script\"\n      ret=$?\n      return \"$ret\"\n    fi\n  done\n\n  usage >&2\n  return 1\n}\n\nusage() {\n  cat << EOS\n$SCRIPT_NAME はtestディレクトリ配下のテストスクリプトを実行する。\n\nUsage:\n    $SCRIPT_NAME              全てのテストを実行する\n    $SCRIPT_NAME <command>    コマンド、あるいはテストスクリプトを実行する\n\nAvailable commands:\n    help             このヘルプを出力する\n    <test_script>    test/*-test.batsの任意の1つのスクリプト\n\nAvailable test scripts:\nEOS\n  for test_script in *-test.bats; do\n    echo \"${test_script//-test.bats/}\"\n  done\n}\n\nprint_bash_version() {\n  echo \"------------------------------------------------------------------------------\"\n  bash --version\n  echo \"------------------------------------------------------------------------------\"\n}\n\ntype bats >&/dev/null\nret=$?\nif [[ \"$ret\" -ne 0 ]]; then\n  echo -e \"[ ${RED}ERR${RESET} ] bats was not found. See a section of Testing on README.\"\n  exit 1\nfi\n\nprint_bash_version\nmain ${1+\"$@\"}\nret=$?\nprint_bash_version\n\nexit $ret\n"
  },
  {
    "path": "uninstall.sh",
    "content": "#!/bin/bash\nset -ue\n\nTHIS_DIR=$(\n  cd \"$(dirname \"${BASH_SOURCE:-$0}\")\" && pwd\n)\nreadonly THIS_DIR\nreadonly PREFIX=\"${1:-/usr/local}\"\nreadonly PREFIX_BIN=\"${PREFIX}/bin\"\nreadonly PREFIX_LIB=\"${PREFIX}/lib/super_unko\"\n\nfor cmd in \"${THIS_DIR}\"/bin/*; do\n  rm -f \"$PREFIX_BIN/$(basename \"$cmd\")\"\ndone\nrm -rf \"$PREFIX_LIB\"\n"
  },
  {
    "path": "💩.💩",
    "content": "💩\n"
  }
]