diff --git a/.cirrus.yml b/.cirrus.yml index 5d16dce92..50f8a25b1 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,7 +1,14 @@ +env: + # Temporary workaround for error `error: sysinfo not supported on + # this platform` seen on FreeBSD platforms, affecting Rustup + # + # References: https://github.com/rust-lang/rustup/issues/2774 + RUSTUP_IO_THREADS: 1 + task: name: stable x86_64-unknown-freebsd-12 freebsd_instance: - image: freebsd-12-1-release-amd64 + image: freebsd-12-2-release-amd64 setup_script: - pkg install -y curl gmake - curl https://sh.rustup.rs -sSf --output rustup.sh diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index cc0972bf9..804720bea 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -11,7 +11,7 @@ env: PROJECT_NAME: coreutils PROJECT_DESC: "Core universal (cross-platform) utilities" PROJECT_AUTH: "uutils" - RUST_MIN_SRV: "1.40.0" ## v1.40.0 + RUST_MIN_SRV: "1.43.1" ## v1.43.0 RUST_COV_SRV: "2020-08-01" ## (~v1.47.0) supported rust version for code coverage; (date required/used by 'coverage') ## !maint: refactor when code coverage support is included in the stable channel on: [push, pull_request] @@ -235,6 +235,9 @@ jobs: arm-unknown-linux-gnueabihf) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;; aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;; esac + case '${{ matrix.job.os }}' in + macos-latest) brew install coreutils ;; # needed for testing + esac - name: Initialize workflow variables id: vars shell: bash @@ -360,6 +363,10 @@ jobs: mkdir -p '${{ steps.vars.outputs.STAGING }}/dpkg' - name: rust toolchain ~ install uses: actions-rs/toolchain@v1 + env: + # Override auto-detection of RAM for Rustc install. + # https://github.com/rust-lang/rustup/issues/2229#issuecomment-585855925 + RUSTUP_UNPACK_RAM: "21474836480" with: toolchain: ${{ steps.vars.outputs.TOOLCHAIN }} target: ${{ matrix.job.target }} @@ -486,6 +493,13 @@ jobs: - { os: windows-latest , features: windows } steps: - uses: actions/checkout@v1 + - name: Install/setup prerequisites + shell: bash + run: | + ## install/setup prerequisites + case '${{ matrix.job.os }}' in + macos-latest) brew install coreutils ;; # needed for testing + esac # - name: Reattach HEAD ## may be needed for accurate code coverage info # run: git checkout ${{ github.head_ref }} - name: Initialize workflow variables diff --git a/.github/workflows/GNU.yml b/.github/workflows/GNU.yml index 35efccbe5..1f9250900 100644 --- a/.github/workflows/GNU.yml +++ b/.github/workflows/GNU.yml @@ -12,16 +12,18 @@ jobs: uses: actions/checkout@v2 with: path: 'uutils' - - name: Chechout GNU coreutils + - name: Checkout GNU coreutils uses: actions/checkout@v2 with: repository: 'coreutils/coreutils' path: 'gnu' - - name: Chechout GNU corelib + ref: v8.32 + - name: Checkout GNU corelib uses: actions/checkout@v2 with: repository: 'coreutils/gnulib' path: 'gnulib' + ref: 8e99f24c0931a38880c6ee9b8287c7da80b0036b fetch-depth: 0 # gnu gets upset if gnulib is a shallow checkout - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 @@ -30,100 +32,43 @@ jobs: default: true profile: minimal # minimal component installation (ie, no documentation) components: rustfmt - - name: Build binaries + - name: Install deps shell: bash run: | sudo apt-get update - sudo apt-get install autoconf autopoint bison texinfo gperf gcc g++ gdb python-pyinotify python3-sphinx - pushd uutils - make PROFILE=release - BUILDDIR="$PWD/target/release/" - cp "${BUILDDIR}/install" "${BUILDDIR}/ginstall" # The GNU tests rename this script before running, to avoid confusion with the make target - # Create *sum binaries - for sum in b2sum md5sum sha1sum sha224sum sha256sum sha384sum sha512sum - do - sum_path="${BUILDDIR}/${sum}" - test -f "${sum_path}" || cp "${BUILDDIR}/hashsum" "${sum_path}" - done - test -f "${BUILDDIR}/[" || cp "${BUILDDIR}/test" "${BUILDDIR}/[" - popd - GNULIB_SRCDIR="$PWD/gnulib" - pushd gnu/ - - # Any binaries that aren't built become `false` so their tests fail - for binary in $(./build-aux/gen-lists-of-programs.sh --list-progs) - do - bin_path="${BUILDDIR}/${binary}" - test -f "${bin_path}" || { echo "'${binary}' was not built with uutils, using the 'false' program"; cp "${BUILDDIR}/false" "${bin_path}"; } - done - - ./bootstrap --gnulib-srcdir="$GNULIB_SRCDIR" - ./configure --quiet --disable-gcc-warnings - #Add timeout to to protect against hangs - sed -i 's|"\$@|/usr/bin/timeout 600 "\$@|' build-aux/test-driver - # Change the PATH in the Makefile to test the uutils coreutils instead of the GNU coreutils - sed -i "s/^[[:blank:]]*PATH=.*/ PATH='${BUILDDIR//\//\\/}\$(PATH_SEPARATOR)'\"\$\$PATH\" \\\/" Makefile - sed -i 's| tr | /usr/bin/tr |' tests/init.sh - make - # Generate the factor tests, so they can be fixed - for i in {00..36} - do - make tests/factor/t${i}.sh - done - grep -rl 'path_prepend_' tests/* | xargs sed -i 's|path_prepend_ ./src||' - sed -i -e 's|^seq |/usr/bin/seq |' -e 's|sha1sum |/usr/bin/sha1sum |' tests/factor/t*sh - - # Remove tests checking for --version & --help - # Not really interesting for us and logs are too big - sed -i -e '/tests\/misc\/invalid-opt.pl/ D' \ - -e '/tests\/misc\/help-version.sh/ D' \ - -e '/tests\/misc\/help-version-getopt.sh/ D' \ - Makefile - - # Use the system coreutils where the test fails due to error in a util that is not the one being tested - sed -i 's|stat|/usr/bin/stat|' tests/chgrp/basic.sh tests/cp/existing-perm-dir.sh tests/touch/60-seconds.sh tests/misc/sort-compress-proc.sh - sed -i 's|ls -|/usr/bin/ls -|' tests/chgrp/posix-H.sh tests/chown/deref.sh tests/cp/same-file.sh tests/misc/mknod.sh tests/mv/part-symlink.sh tests/du/8gb.sh - sed -i 's|mkdir |/usr/bin/mkdir |' tests/cp/existing-perm-dir.sh tests/rm/empty-inacc.sh - sed -i 's|timeout \([[:digit:]]\)| /usr/bin/timeout \1|' tests/tail-2/inotify-rotate.sh tests/tail-2/inotify-dir-recreate.sh tests/tail-2/inotify-rotate-resources.sh tests/cp/parent-perm-race.sh tests/ls/infloop.sh tests/misc/sort-exit-early.sh tests/misc/sort-NaN-infloop.sh tests/misc/uniq-perf.sh tests/tail-2/inotify-only-regular.sh tests/tail-2/pipe-f2.sh tests/tail-2/retry.sh tests/tail-2/symlink.sh tests/tail-2/wait.sh tests/tail-2/pid.sh tests/dd/stats.sh tests/tail-2/follow-name.sh tests/misc/shuf.sh # Don't break the function called 'grep_timeout' - sed -i 's|chmod |/usr/bin/chmod |' tests/du/inacc-dir.sh tests/mkdir/p-3.sh tests/tail-2/tail-n0f.sh tests/cp/fail-perm.sh tests/du/inaccessible-cwd.sh tests/mv/i-2.sh tests/chgrp/basic.sh tests/misc/shuf.sh - sed -i 's|sort |/usr/bin/sort |' tests/ls/hyperlink.sh tests/misc/test-N.sh - sed -i 's|split |/usr/bin/split |' tests/misc/factor-parallel.sh - sed -i 's|truncate |/usr/bin/truncate |' tests/split/fail.sh - sed -i 's|dd |/usr/bin/dd |' tests/du/8gb.sh tests/tail-2/big-4gb.sh tests/cp/fiemap-2.sh init.cfg - sed -i 's|id -|/usr/bin/id -|' tests/misc/runcon-no-reorder.sh - sed -i 's|touch |/usr/bin/touch |' tests/cp/preserve-link.sh tests/cp/reflink-perm.sh tests/ls/block-size.sh tests/ls/abmon-align.sh tests/ls/rt-1.sh tests/mv/update.sh tests/misc/ls-time.sh tests/misc/stat-nanoseconds.sh tests/misc/time-style.sh tests/misc/test-N.sh - sed -i 's|ln -|/usr/bin/ln -|' tests/cp/link-deref.sh - sed -i 's|printf |/usr/bin/printf |' tests/dd/ascii.sh - sed -i 's|cp |/usr/bin/cp |' tests/mv/hard-2.sh - sed -i 's|paste |/usr/bin/paste |' tests/misc/od-endian.sh - sed -i 's|seq |/usr/bin/seq |' tests/misc/sort-discrim.sh - - #Add specific timeout to tests that currently hang to limit time spent waiting - sed -i 's|seq \$|/usr/bin/timeout 0.1 seq \$|' tests/misc/seq-precision.sh tests/misc/seq-long-double.sh - sed -i 's|cat |/usr/bin/timeout 0.1 cat |' tests/misc/cat-self.sh - - - test -f "${BUILDDIR}/getlimits" || cp src/getlimits "${BUILDDIR}" + sudo apt-get install autoconf autopoint bison texinfo gperf gcc g++ gdb python-pyinotify python3-sphinx jq + - name: Build binaries + shell: bash + run: | + cd uutils + bash util/build-gnu.sh - name: Run GNU tests shell: bash run: | - BUILDDIR="${PWD}/uutils/target/release" - GNULIB_DIR="${PWD}/gnulib" - pushd gnu - - timeout -sKILL 2h make -j "$(nproc)" check SUBDIRS=. RUN_EXPENSIVE_TESTS=yes RUN_VERY_EXPENSIVE_TESTS=yes VERBOSE=no || : # Kill after 4 hours in case something gets stuck in make + bash uutils/util/run-gnu-test.sh - name: Extract tests info shell: bash run: | - if test -f gnu/tests/test-suite.log + LOG_FILE=gnu/tests/test-suite.log + if test -f "$LOG_FILE" then - TOTAL=$( grep "# TOTAL:" gnu/tests/test-suite.log|cut -d' ' -f2-) - PASS=$( grep "# PASS:" gnu/tests/test-suite.log|cut -d' ' -f2-) - SKIP=$( grep "# SKIP:" gnu/tests/test-suite.log|cut -d' ' -f2-) - FAIL=$( grep "# FAIL:" gnu/tests/test-suite.log|cut -d' ' -f2-) - XPASS=$( grep "# XPASS:" gnu/tests/test-suite.log|cut -d' ' -f2-) - ERROR=$( grep "# ERROR:" gnu/tests/test-suite.log|cut -d' ' -f2-) - echo "::warning ::GNU testsuite = $TOTAL / $PASS / $FAIL / $ERROR" + TOTAL=$(sed -n "s/.*# TOTAL: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) + PASS=$(sed -n "s/.*# PASS: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) + SKIP=$(sed -n "s/.*# SKIP: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) + FAIL=$(sed -n "s/.*# FAIL: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) + XPASS=$(sed -n "s/.*# XPASS: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) + ERROR=$(sed -n "s/.*# ERROR: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) + echo "::warning ::GNU testsuite = TOTAL: $TOTAL / PASS: $PASS / FAIL: $FAIL / ERROR: $ERROR" + jq -n \ + --arg date "$(date --rfc-email)" \ + --arg sha "$GITHUB_SHA" \ + --arg total "$TOTAL" \ + --arg pass "$PASS" \ + --arg skip "$SKIP" \ + --arg fail "$FAIL" \ + --arg xpass "$XPASS" \ + --arg error "$ERROR" \ + '{($date): { sha: $sha, total: $total, pass: $pass, skip: $skip, fail: $fail, xpass: $xpass, error: $error, }}' > gnu-result.json else echo "::error ::Failed to get summary of test results" fi @@ -132,3 +77,8 @@ jobs: with: name: test-report path: gnu/tests/**/*.log + + - uses: actions/upload-artifact@v2 + with: + name: gnu-result + path: gnu-result.json diff --git a/.gitignore b/.gitignore index b1ac52506..77e8f717e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ target/ Cargo.lock lib*.a /docs/_build +*.iml +### macOS ### +.DS_Store diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 389ba44b0..000000000 --- a/.travis.yml +++ /dev/null @@ -1,72 +0,0 @@ -language: rust - -rust: - - stable - - beta - -os: - - linux - # - osx - -env: - # sphinx v1.8.0 is bugged & fails for linux builds; so, force specific `sphinx` version - global: FEATURES='' TEST_INSTALL='' SPHINX_VERSIONED='sphinx==1.7.8' - -matrix: - allow_failures: - - rust: beta - - rust: nightly - fast_finish: true - include: - - rust: 1.40.0 - env: FEATURES=unix - # - rust: stable - # os: linux - # env: FEATURES=unix TEST_INSTALL=true - # - rust: stable - # os: osx - # env: FEATURES=macos TEST_INSTALL=true - - rust: nightly - os: linux - env: FEATURES=nightly,unix TEST_INSTALL=true - - rust: nightly - os: osx - env: FEATURES=nightly,macos TEST_INSTALL=true - - rust: nightly - os: linux - env: FEATURES=nightly,feat_os_unix_redox CC=x86_64-unknown-redox-gcc CARGO_ARGS='--no-default-features --target=x86_64-unknown-redox' REDOX=1 - -cache: - directories: - - $HOME/.cargo - -sudo: true - -before_install: - - if [ $REDOX ]; then ./.travis/redox-toolchain.sh; fi - -install: - - if [ $TRAVIS_OS_NAME = linux ]; then sudo apt-get install python-pip && sudo pip install $SPHINX_VERSIONED; fi - - | - if [ $TRAVIS_OS_NAME = osx ]; then - brew update - brew upgrade python - pip3 install $SPHINX_VERSIONED - fi - -script: - - cargo build $CARGO_ARGS --features "$FEATURES" - - if [ ! $REDOX ]; then cargo test $CARGO_ARGS -p uucore -p coreutils --features "$FEATURES" --no-fail-fast; fi - - if [ -n "$TEST_INSTALL" ]; then mkdir installdir_test; DESTDIR=installdir_test make install; [ `ls installdir_test/usr/local/bin | wc -l` -gt 0 ]; fi - -addons: - apt: - packages: - - libssl-dev - -after_success: | - if [ "$TRAVIS_OS_NAME" = linux -a "$TRAVIS_RUST_VERSION" = stable ]; then - bash <(curl https://raw.githubusercontent.com/xd009642/tarpaulin/master/travis-install.sh) - cargo tarpaulin --out Xml - bash <(curl -s https://codecov.io/bash) - fi diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c40e5dfd..3793a0968 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,6 +22,7 @@ search the issues to make sure no one else is working on it. 1. Make sure that the code coverage is covering all of the cases, including errors. 1. The code must be clippy-warning-free and rustfmt-compliant. 1. Don't hesitate to move common functions into uucore if they can be reused by other binaries. +1. Unsafe code should be documented with Safety comments. ## Commit messages @@ -69,10 +70,6 @@ lines for non-utility modules include: README: add help ``` -``` -travis: fix build -``` - ``` uucore: add new modules ``` diff --git a/Cargo.lock b/Cargo.lock index 069fd04dc..a7fa8f23b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,11 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + [[package]] name = "advapi32-sys" version = "0.2.0" @@ -12,11 +18,11 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ - "memchr 2.3.4", + "memchr 2.4.0", ] [[package]] @@ -28,6 +34,21 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "array-init" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6945cc5422176fc5e602e590c2878d2c2acd9a4fe20a4baa7c28022521698ec6" + [[package]] name = "arrayvec" version = "0.4.12" @@ -54,6 +75,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "binary-heap-plus" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f068638f8ff9e118a9361e66a411eff410e7fb3ecaa23bf9272324f8fc606d7" +dependencies = [ + "compare", +] + [[package]] name = "bit-set" version = "0.5.2" @@ -97,12 +127,12 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d" +checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" dependencies = [ "lazy_static", - "memchr 2.3.4", + "memchr 2.4.0", "regex-automata", "serde", ] @@ -127,9 +157,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cast" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" +checksum = "57cdfa5d50aad6cb4d44dcab6101a7f79925bd59d82ca42f38a9856a28865374" dependencies = [ "rustc_version", ] @@ -154,13 +184,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.11" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" dependencies = [ + "libc", "num-integer", "num-traits", "time", + "winapi 0.3.9", ] [[package]] @@ -169,7 +201,7 @@ version = "2.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" dependencies = [ - "ansi_term", + "ansi_term 0.11.0", "atty", "bitflags", "strsim", @@ -187,6 +219,12 @@ dependencies = [ "bitflags", ] +[[package]] +name = "compare" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120133d4db2ec47efe2e26502ee984747630c67f51974fca0b6c1340cf2368d3" + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -213,10 +251,10 @@ dependencies = [ "lazy_static", "libc", "nix 0.20.0", + "pretty_assertions", "rand 0.7.3", "regex", "sha1", - "tempdir", "tempfile", "textwrap", "time", @@ -247,6 +285,7 @@ dependencies = [ "uu_expand", "uu_expr", "uu_factor", + "uu_factor_benches", "uu_false", "uu_fmt", "uu_fold", @@ -323,6 +362,16 @@ dependencies = [ "walkdir", ] +[[package]] +name = "coz" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cef55b3fe2f5477d59e12bc792e8b3c95a25bd099eadcfae006ecea136de76e2" +dependencies = [ + "libc", + "once_cell", +] + [[package]] name = "cpp" version = "0.5.6" @@ -454,9 +503,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -475,9 +524,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12" +checksum = "52fb27eab85b17fbb9f6fd667089e07d6a2eb8743d02639ee7f6a7a7729c9c94" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -488,9 +537,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" +checksum = "4feb231f0d4d6af81aed15928e58ecf5816aa62a2393e2c82f46973e92a9a278" dependencies = [ "autocfg", "cfg-if 1.0.0", @@ -516,7 +565,17 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" dependencies = [ - "memchr 2.3.4", + "memchr 2.4.0", +] + +[[package]] +name = "ctor" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" +dependencies = [ + "quote 1.0.9", + "syn", ] [[package]] @@ -531,6 +590,12 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" +[[package]] +name = "diff" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" + [[package]] name = "digest" version = "0.6.2" @@ -540,6 +605,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "dns-lookup" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093d88961fd18c4ecacb8c80cd0b356463ba941ba11e0e01f9cf5271380b79dc" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "socket2", + "winapi 0.3.9", +] + [[package]] name = "dunce" version = "1.0.1" @@ -582,7 +659,7 @@ checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.5", + "redox_syscall 0.2.8", "winapi 0.3.9", ] @@ -631,7 +708,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -747,9 +835,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.50" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d99f9e3e84b8f67f846ef5b4cbbc3b1c29f6c759fcbce6f01aa0e73d932a24c" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" dependencies = [ "wasm-bindgen", ] @@ -776,6 +864,15 @@ version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ccac4b00700875e6a07c6cde370d44d32fa01c5a65cdd2fca6858c479d28bb3" +[[package]] +name = "locale" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fdbe492a9c0238da900a1165c42fc5067161ce292678a6fe80921f30fe307fd" +dependencies = [ + "libc", +] + [[package]] name = "log" version = "0.4.14" @@ -785,6 +882,15 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "lscolors" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24b894c45c9da468621cdd615a5a79ee5e5523dd4f75c76ebc03d458940c16e" +dependencies = [ + "ansi_term 0.12.1", +] + [[package]] name = "match_cfg" version = "0.1.0" @@ -814,9 +920,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "memoffset" @@ -899,6 +1005,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" +[[package]] +name = "once_cell" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" + [[package]] name = "onig" version = "4.3.3" @@ -927,6 +1039,38 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +[[package]] +name = "ouroboros" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f52300b81ac4eeeb6c00c20f7e86556c427d9fb2d92b68fc73c22f331cd15" +dependencies = [ + "ouroboros_macro", + "stable_deref_trait", +] + +[[package]] +name = "ouroboros_macro" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41db02c8f8731cdd7a72b433c7900cce4bf245465b452c364bfd21f4566ab055" +dependencies = [ + "Inflector", + "proc-macro-error", + "proc-macro2", + "quote 1.0.9", + "syn", +] + +[[package]] +name = "output_vt100" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "paste" version = "0.1.18" @@ -946,6 +1090,15 @@ dependencies = [ "proc-macro-hack", ] +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + [[package]] name = "pkg-config" version = "0.3.19" @@ -964,9 +1117,9 @@ dependencies = [ [[package]] name = "plotters" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ca0ae5f169d0917a7c7f5a9c1a3d3d9598f18f529dd2b8373ed988efea307a" +checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a" dependencies = [ "num-traits", "plotters-backend", @@ -996,6 +1149,42 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "pretty_assertions" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cab0e7c02cf376875e9335e0ba1da535775beb5450d21e1dffca068818ed98b" +dependencies = [ + "ansi_term 0.12.1", + "ctor", + "diff", + "output_vt100", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote 1.0.9", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote 1.0.9", + "version_check", +] + [[package]] name = "proc-macro-hack" version = "0.5.19" @@ -1004,11 +1193,11 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ - "unicode-xid 0.2.1", + "unicode-xid 0.2.2", ] [[package]] @@ -1044,19 +1233,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -dependencies = [ - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "rdrand", - "winapi 0.3.9", -] - [[package]] name = "rand" version = "0.5.6" @@ -1076,14 +1252,26 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", + "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc", + "rand_hc 0.2.0", "rand_pcg", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", + "rand_hc 0.3.0", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -1094,6 +1282,16 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", +] + [[package]] name = "rand_core" version = "0.3.1" @@ -1115,7 +1313,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -1127,6 +1334,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_hc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core 0.6.2", +] + [[package]] name = "rand_pcg" version = "0.2.1" @@ -1138,9 +1354,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" dependencies = [ "autocfg", "crossbeam-deque", @@ -1150,9 +1366,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1161,15 +1377,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "redox_syscall" version = "0.1.57" @@ -1178,9 +1385,9 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_syscall" -version = "0.2.5" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" dependencies = [ "bitflags", ] @@ -1191,17 +1398,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f" dependencies = [ - "redox_syscall 0.2.5", + "redox_syscall 0.2.8", ] [[package]] name = "regex" -version = "1.4.5" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", - "memchr 2.3.4", + "memchr 2.4.0", "regex-syntax", ] @@ -1216,9 +1423,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.23" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "remove_dir_all" @@ -1231,9 +1438,9 @@ dependencies = [ [[package]] name = "retain_mut" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53552c6c49e1e13f1a203ef0080ab3bbef0beb570a528993e83df057a9d9bba1" +checksum = "e9c17925a9027d298a4603d286befe3f9dc0e8ed02523141914eb628798d6e5b" [[package]] name = "rust-ini" @@ -1243,11 +1450,11 @@ checksum = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" [[package]] name = "rustc_version" -version = "0.2.3" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" dependencies = [ - "semver", + "semver 0.11.0", ] [[package]] @@ -1277,7 +1484,16 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser", + "semver-parser 0.7.0", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser 0.10.2", ] [[package]] @@ -1287,10 +1503,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] -name = "serde" -version = "1.0.125" +name = "semver-parser" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" [[package]] name = "serde_cbor" @@ -1304,9 +1529,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.125" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote 1.0.9", @@ -1364,6 +1589,23 @@ dependencies = [ "maybe-uninit", ] +[[package]] +name = "socket2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.8.0" @@ -1390,35 +1632,25 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.68" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ce15dd3ed8aa2f8eeac4716d6ef5ab58b6b9256db41d7e1a0224c2788e8fd87" +checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82" dependencies = [ "proc-macro2", "quote 1.0.9", - "unicode-xid 0.2.1", -] - -[[package]] -name = "tempdir" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -dependencies = [ - "rand 0.4.6", - "remove_dir_all", + "unicode-xid 0.2.2", ] [[package]] name = "tempfile" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", - "rand 0.7.3", - "redox_syscall 0.1.57", + "rand 0.8.3", + "redox_syscall 0.2.8", "remove_dir_all", "winapi 0.3.9", ] @@ -1450,7 +1682,7 @@ checksum = "077185e2eac69c3f8379a4298e1e07cd36beb962290d4a51199acf0fdc10607e" dependencies = [ "libc", "numtoa", - "redox_syscall 0.2.5", + "redox_syscall 0.2.8", "redox_termios", ] @@ -1499,12 +1731,11 @@ dependencies = [ [[package]] name = "time" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "redox_syscall 0.1.57", "winapi 0.3.9", ] @@ -1524,6 +1755,12 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + [[package]] name = "unicode-segmentation" version = "1.7.1" @@ -1544,9 +1781,9 @@ checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "unindent" @@ -1578,6 +1815,7 @@ dependencies = [ name = "uu_arch" version = "0.0.6" dependencies = [ + "clap", "platform-info", "uucore", "uucore_procs", @@ -1587,6 +1825,7 @@ dependencies = [ name = "uu_base32" version = "0.0.6" dependencies = [ + "clap", "uucore", "uucore_procs", ] @@ -1595,6 +1834,8 @@ dependencies = [ name = "uu_base64" version = "0.0.6" dependencies = [ + "clap", + "uu_base32", "uucore", "uucore_procs", ] @@ -1603,6 +1844,7 @@ dependencies = [ name = "uu_basename" version = "0.0.6" dependencies = [ + "clap", "uucore", "uucore_procs", ] @@ -1612,7 +1854,8 @@ name = "uu_cat" version = "0.0.6" dependencies = [ "clap", - "quick-error", + "nix 0.20.0", + "thiserror", "unix_socket", "uucore", "uucore_procs", @@ -1710,7 +1953,9 @@ dependencies = [ name = "uu_cut" version = "0.0.6" dependencies = [ + "bstr", "clap", + "memchr 2.4.0", "uucore", "uucore_procs", ] @@ -1732,11 +1977,9 @@ name = "uu_df" version = "0.0.6" dependencies = [ "clap", - "libc", "number_prefix", "uucore", "uucore_procs", - "winapi 0.3.9", ] [[package]] @@ -1763,6 +2006,7 @@ name = "uu_du" version = "0.0.6" dependencies = [ "chrono", + "clap", "uucore", "uucore_procs", "winapi 0.3.9", @@ -1812,17 +2056,28 @@ dependencies = [ name = "uu_factor" version = "0.0.6" dependencies = [ - "criterion", + "clap", + "coz", "num-traits", "paste", "quickcheck", "rand 0.7.3", - "rand_chacha", "smallvec", "uucore", "uucore_procs", ] +[[package]] +name = "uu_factor_benches" +version = "0.0.0" +dependencies = [ + "array-init", + "criterion", + "rand 0.7.3", + "rand_chacha 0.2.2", + "uu_factor", +] + [[package]] name = "uu_false" version = "0.0.6" @@ -1944,6 +2199,7 @@ dependencies = [ name = "uu_kill" version = "0.0.6" dependencies = [ + "clap", "libc", "uucore", "uucore_procs", @@ -1953,6 +2209,7 @@ dependencies = [ name = "uu_link" version = "0.0.6" dependencies = [ + "clap", "libc", "uucore", "uucore_procs", @@ -1972,6 +2229,7 @@ dependencies = [ name = "uu_logname" version = "0.0.6" dependencies = [ + "clap", "libc", "uucore", "uucore_procs", @@ -1982,13 +2240,16 @@ name = "uu_ls" version = "0.0.6" dependencies = [ "atty", + "chrono", "clap", "globset", "lazy_static", + "locale", + "lscolors", "number_prefix", + "once_cell", "term_grid", "termsize", - "time", "unicode-width", "uucore", "uucore_procs", @@ -2018,7 +2279,7 @@ dependencies = [ name = "uu_mknod" version = "0.0.6" dependencies = [ - "getopts", + "clap", "libc", "uucore", "uucore_procs", @@ -2075,7 +2336,7 @@ dependencies = [ "aho-corasick", "clap", "libc", - "memchr 2.3.4", + "memchr 2.4.0", "regex", "regex-syntax", "uucore", @@ -2147,6 +2408,7 @@ dependencies = [ name = "uu_pinky" version = "0.0.6" dependencies = [ + "clap", "uucore", "uucore_procs", ] @@ -2190,7 +2452,7 @@ dependencies = [ "aho-corasick", "clap", "libc", - "memchr 2.3.4", + "memchr 2.4.0", "regex", "regex-syntax", "uucore", @@ -2299,12 +2561,18 @@ dependencies = [ name = "uu_sort" version = "0.0.6" dependencies = [ + "binary-heap-plus", "clap", + "compare", "fnv", - "itertools 0.8.2", + "itertools 0.10.0", + "memchr 2.4.0", + "ouroboros", "rand 0.7.3", "rayon", - "semver", + "semver 0.9.0", + "tempfile", + "unicode-width", "uucore", "uucore_procs", ] @@ -2323,7 +2591,6 @@ name = "uu_stat" version = "0.0.6" dependencies = [ "clap", - "time", "uucore", "uucore_procs", ] @@ -2332,7 +2599,7 @@ dependencies = [ name = "uu_stdbuf" version = "0.0.6" dependencies = [ - "getopts", + "clap", "tempfile", "uu_stdbuf_libstdbuf", "uucore", @@ -2516,7 +2783,7 @@ dependencies = [ name = "uu_unlink" version = "0.0.6" dependencies = [ - "getopts", + "clap", "libc", "uucore", "uucore_procs", @@ -2557,6 +2824,7 @@ dependencies = [ name = "uu_who" version = "0.0.6" dependencies = [ + "clap", "uucore", "uucore_procs", ] @@ -2586,6 +2854,7 @@ name = "uucore" version = "0.0.8" dependencies = [ "data-encoding", + "dns-lookup", "dunce", "getopts", "lazy_static", @@ -2596,6 +2865,7 @@ dependencies = [ "thiserror", "time", "wild", + "winapi 0.3.9", ] [[package]] @@ -2613,6 +2883,12 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + [[package]] name = "void" version = "1.0.2" @@ -2637,10 +2913,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] -name = "wasm-bindgen" -version = "0.2.73" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -2648,9 +2930,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.73" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" dependencies = [ "bumpalo", "lazy_static", @@ -2663,9 +2945,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.73" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" dependencies = [ "quote 1.0.9", "wasm-bindgen-macro-support", @@ -2673,9 +2955,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.73" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" dependencies = [ "proc-macro2", "quote 1.0.9", @@ -2686,15 +2968,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.73" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" [[package]] name = "web-sys" -version = "0.3.50" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be" +checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index 498366181..fb009ccc1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -326,6 +326,9 @@ wc = { optional=true, version="0.0.6", package="uu_wc", path="src/uu/wc" } who = { optional=true, version="0.0.6", package="uu_who", path="src/uu/who" } whoami = { optional=true, version="0.0.6", package="uu_whoami", path="src/uu/whoami" } yes = { optional=true, version="0.0.6", package="uu_yes", path="src/uu/yes" } + +factor_benches = { optional = true, version = "0.0.0", package = "uu_factor_benches", path = "tests/benches/factor" } + # # * pinned transitive dependencies # Not needed for now. Keep as examples: @@ -338,17 +341,15 @@ filetime = "0.2" glob = "0.3.0" libc = "0.2" nix = "0.20.0" +pretty_assertions = "0.7.2" rand = "0.7" regex = "1.0" sha1 = { version="0.6", features=["std"] } -## tempfile 3.2 depends on recent version of rand which depends on getrandom v0.2 which has compiler errors for MinRustV v1.32.0 -## min dep for tempfile = Rustc 1.40 -tempfile = "= 3.1.0" +tempfile = "3.2.0" time = "0.1" unindent = "0.1" uucore = { version=">=0.0.8", package="uucore", path="src/uucore", features=["entries"] } walkdir = "2.2" -tempdir = "0.3" [target.'cfg(unix)'.dev-dependencies] rust-users = { version="0.10", package="users" } diff --git a/README.md b/README.md index f63c94987..bc2c6e54d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ [![LOC](https://tokei.rs/b1/github/uutils/coreutils?category=code)](https://github.com/Aaronepower/tokei) [![dependency status](https://deps.rs/repo/github/uutils/coreutils/status.svg)](https://deps.rs/repo/github/uutils/coreutils) -[![Build Status](https://api.travis-ci.org/uutils/coreutils.svg?branch=master)](https://travis-ci.org/uutils/coreutils) [![Build Status (FreeBSD)](https://api.cirrus-ci.com/github/uutils/coreutils.svg)](https://cirrus-ci.com/github/uutils/coreutils/master) [![CodeCov](https://codecov.io/gh/uutils/coreutils/branch/master/graph/badge.svg)](https://codecov.io/gh/uutils/coreutils) @@ -40,7 +39,7 @@ to compile anywhere, and this is as good a way as any to try and learn it. ### Rust Version uutils follows Rust's release channels and is tested against stable, beta and nightly. -The current oldest supported version of the Rust compiler is `1.40.0`. +The current oldest supported version of the Rust compiler is `1.43.1`. On both Windows and Redox, only the nightly version is tested currently. @@ -93,7 +92,7 @@ $ cargo build --features "base32 cat echo rm" --no-default-features If you don't want to build the multicall binary and would prefer to build the utilities as individual binaries, that is also possible. Each utility -is contained in it's own package within the main repository, named +is contained in its own package within the main repository, named "uu_UTILNAME". To build individual utilities, use cargo to build just the specific packages (using the `--package` [aka `-p`] option). For example: @@ -319,6 +318,16 @@ To pass an argument like "-v" to the busybox test runtime $ make UTILS='UTILITY_1 UTILITY_2' RUNTEST_ARGS='-v' busytest ``` +## Comparing with GNU + +![Evolution over time](https://github.com/uutils/coreutils-tracking/blob/main/gnu-results.png?raw=true) + +To run locally: +```bash +$ bash util/build-gnu.sh +$ bash util/run-gnu-test.sh +``` + ## Contribute To contribute to uutils, please see [CONTRIBUTING](CONTRIBUTING.md). @@ -429,6 +438,7 @@ This is an auto-generated table showing which binaries compile for each target-t |windows-msvc|i686|y|y|y|y|y| | | | |y|y|y|y|y|y|y|y|y| |y|y|y| |y|y|y|y| |y|y|y|y| | |y| |y|y|y|y|y| | |y|y|y| |y| |y|y|y|y| | |y|y|y|y|y|y|y|y|y|y|y|y|y|y|y| | |y|y|y|y|y|y| |y|y|y|y|y| |y|y|y| |y| |y| |y|y| |windows-gnu|x86_64|y|y|y|y|y| | | | |y|y|y|y|y|y|y|y|y| |y|y|y| |y|y|y|y| |y|y|y|y| | |y| |y|y|y|y|y| | |y|y|y| |y| |y|y|y|y| | |y|y|y|y|y|y|y|y|y|y|y|y|y|y|y| | |y|y|y|y|y|y| |y|y|y|y|y|y|y|y|y| |y| |y| |y|y| |windows-msvc|x86_64|y|y|y|y|y| | | | |y|y|y|y|y|y|y|y|y| |y|y|y| |y|y|y|y| |y|y|y|y| | |y| |y|y|y|y|y| | |y|y|y| |y| |y|y|y|y| | |y|y|y|y|y|y|y|y|y|y|y|y|y|y|y| | |y|y|y|y|y|y| |y|y|y|y|y| |y|y|y| |y| |y| |y|y| +|apple MacOS|aarch64|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y| |y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y| |apple MacOS|x86_64|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y| |y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y| |freebsd|x86_64|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y| |netbsd|x86_64|y|y|y|y|y|y|y|y| |y|y|y|y|y|y| |y|y|y|y|y|y| |y|y|y|y|y|y|y|y|y| |y|y| |y|y|y|y|y|y|y|y|y|y|y|y| |y|y|y|y|y| |y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y| |y|y|y|y|y|y| |y|y|y| | |y| |y|y| diff --git a/docs/compiles_table.py b/docs/compiles_table.py index 0cbfdf0e9..a051287c9 100644 --- a/docs/compiles_table.py +++ b/docs/compiles_table.py @@ -26,6 +26,7 @@ TARGETS = [ "x86_64-pc-windows-gnu", "x86_64-pc-windows-msvc", # Apple + "aarch64-apple-darwin", "x86_64-apple-darwin", "aarch64-apple-ios", "x86_64-apple-ios", @@ -231,4 +232,4 @@ if __name__ == "__main__": prev_table, _, _ = load_csv(CACHE_PATH) new_table = merge_tables(prev_table, table) - save_csv(CACHE_PATH, new_table) \ No newline at end of file + save_csv(CACHE_PATH, new_table) diff --git a/src/uu/arch/Cargo.toml b/src/uu/arch/Cargo.toml index 0b4359620..b3fe1f8cb 100644 --- a/src/uu/arch/Cargo.toml +++ b/src/uu/arch/Cargo.toml @@ -16,6 +16,7 @@ path = "src/arch.rs" [dependencies] platform-info = "0.1" +clap = "2.33" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/arch/src/arch.rs b/src/uu/arch/src/arch.rs index 20392b11f..31278f000 100644 --- a/src/uu/arch/src/arch.rs +++ b/src/uu/arch/src/arch.rs @@ -11,12 +11,19 @@ extern crate uucore; use platform_info::*; -static SYNTAX: &str = "Display machine architecture"; +use clap::App; + +static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = "Display machine architecture"; static SUMMARY: &str = "Determine architecture name for current machine."; -static LONG_HELP: &str = ""; pub fn uumain(args: impl uucore::Args) -> i32 { - app!(SYNTAX, SUMMARY, LONG_HELP).parse(args.collect_str()); + App::new(executable!()) + .version(VERSION) + .about(ABOUT) + .after_help(SUMMARY) + .get_matches_from(args); + let uts = return_if_err!(1, PlatformInfo::new()); println!("{}", uts.machine().trim()); 0 diff --git a/src/uu/base32/Cargo.toml b/src/uu/base32/Cargo.toml index a1d7ba17e..1b448af0a 100644 --- a/src/uu/base32/Cargo.toml +++ b/src/uu/base32/Cargo.toml @@ -15,6 +15,7 @@ edition = "2018" path = "src/base32.rs" [dependencies] +clap = "2.33" uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features = ["encoding"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/base32/src/base32.rs b/src/uu/base32/src/base32.rs index b47f4d4cc..f0e187c31 100644 --- a/src/uu/base32/src/base32.rs +++ b/src/uu/base32/src/base32.rs @@ -7,13 +7,14 @@ #[macro_use] extern crate uucore; + +use std::io::{stdin, Read}; + use uucore::encoding::Format; -mod base_common; +pub mod base_common; -static SYNTAX: &str = "[OPTION]... [FILE]"; -static SUMMARY: &str = "Base32 encode or decode FILE, or standard input, to standard output."; -static LONG_HELP: &str = " +static ABOUT: &str = " With no FILE, or when FILE is -, read standard input. The data are encoded as described for the base32 alphabet in RFC @@ -22,13 +23,43 @@ static LONG_HELP: &str = " to attempt to recover from any other non-alphabet bytes in the encoded stream. "; +static VERSION: &str = env!("CARGO_PKG_VERSION"); + +static BASE_CMD_PARSE_ERROR: i32 = 1; + +fn get_usage() -> String { + format!("{0} [OPTION]... [FILE]", executable!()) +} pub fn uumain(args: impl uucore::Args) -> i32 { - base_common::execute( - args.collect_str(), - SYNTAX, - SUMMARY, - LONG_HELP, - Format::Base32, - ) + let format = Format::Base32; + let usage = get_usage(); + let name = executable!(); + + let config_result: Result = + base_common::parse_base_cmd_args(args, name, VERSION, ABOUT, &usage); + + if config_result.is_err() { + match config_result { + Ok(_) => panic!(), + Err(s) => crash!(BASE_CMD_PARSE_ERROR, "{}", s), + } + } + + // Create a reference to stdin so we can return a locked stdin from + // parse_base_cmd_args + let stdin_raw = stdin(); + let config = config_result.unwrap(); + let mut input: Box = base_common::get_input(&config, &stdin_raw); + + base_common::handle_input( + &mut input, + format, + config.wrap_cols, + config.ignore_garbage, + config.decode, + name, + ); + + 0 } diff --git a/src/uu/base32/src/base_common.rs b/src/uu/base32/src/base_common.rs index 3f1436fb2..ee5fe8675 100644 --- a/src/uu/base32/src/base_common.rs +++ b/src/uu/base32/src/base_common.rs @@ -7,73 +7,133 @@ // For the full copyright and license information, please view the LICENSE file // that was distributed with this source code. -use std::fs::File; -use std::io::{stdin, stdout, BufReader, Read, Write}; -use std::path::Path; +use std::io::{stdout, Read, Write}; use uucore::encoding::{wrap_print, Data, Format}; +use uucore::InvalidEncodingHandling; -pub fn execute( - args: Vec, - syntax: &str, - summary: &str, - long_help: &str, - format: Format, -) -> i32 { - let matches = app!(syntax, summary, long_help) - .optflag("d", "decode", "decode data") - .optflag( - "i", - "ignore-garbage", - "when decoding, ignore non-alphabetic characters", - ) - .optopt( - "w", - "wrap", - "wrap encoded lines after COLS character (default 76, 0 to disable wrapping)", - "COLS", - ) - .parse(args); +use std::fs::File; +use std::io::{BufReader, Stdin}; +use std::path::Path; - let line_wrap = matches.opt_str("wrap").map(|s| match s.parse() { - Ok(n) => n, - Err(e) => { - crash!(1, "invalid wrap size: ‘{}’: {}", s, e); - } - }); - let ignore_garbage = matches.opt_present("ignore-garbage"); - let decode = matches.opt_present("decode"); +use clap::{App, Arg}; - if matches.free.len() > 1 { - show_usage_error!("extra operand ‘{}’", matches.free[0]); - return 1; - } - - if matches.free.is_empty() || &matches.free[0][..] == "-" { - let stdin_raw = stdin(); - handle_input( - &mut stdin_raw.lock(), - format, - line_wrap, - ignore_garbage, - decode, - ); - } else { - let path = Path::new(matches.free[0].as_str()); - let file_buf = safe_unwrap!(File::open(&path)); - let mut input = BufReader::new(file_buf); - handle_input(&mut input, format, line_wrap, ignore_garbage, decode); - }; - - 0 +// Config. +pub struct Config { + pub decode: bool, + pub ignore_garbage: bool, + pub wrap_cols: Option, + pub to_read: Option, } -fn handle_input( +pub mod options { + pub static DECODE: &str = "decode"; + pub static WRAP: &str = "wrap"; + pub static IGNORE_GARBAGE: &str = "ignore-garbage"; + pub static FILE: &str = "file"; +} + +impl Config { + fn from(options: clap::ArgMatches) -> Result { + let file: Option = match options.values_of(options::FILE) { + Some(mut values) => { + let name = values.next().unwrap(); + if values.len() != 0 { + return Err(format!("extra operand ‘{}’", name)); + } + + if name == "-" { + None + } else { + if !Path::exists(Path::new(name)) { + return Err(format!("{}: No such file or directory", name)); + } + Some(name.to_owned()) + } + } + None => None, + }; + + let cols = match options.value_of(options::WRAP) { + Some(num) => match num.parse::() { + Ok(n) => Some(n), + Err(e) => { + return Err(format!("Invalid wrap size: ‘{}’: {}", num, e)); + } + }, + None => None, + }; + + Ok(Config { + decode: options.is_present(options::DECODE), + ignore_garbage: options.is_present(options::IGNORE_GARBAGE), + wrap_cols: cols, + to_read: file, + }) + } +} + +pub fn parse_base_cmd_args( + args: impl uucore::Args, + name: &str, + version: &str, + about: &str, + usage: &str, +) -> Result { + let app = App::new(name) + .version(version) + .about(about) + .usage(usage) + // Format arguments. + .arg( + Arg::with_name(options::DECODE) + .short("d") + .long(options::DECODE) + .help("decode data"), + ) + .arg( + Arg::with_name(options::IGNORE_GARBAGE) + .short("i") + .long(options::IGNORE_GARBAGE) + .help("when decoding, ignore non-alphabetic characters"), + ) + .arg( + Arg::with_name(options::WRAP) + .short("w") + .long(options::WRAP) + .takes_value(true) + .help( + "wrap encoded lines after COLS character (default 76, 0 to disable wrapping)", + ), + ) + // "multiple" arguments are used to check whether there is more than one + // file passed in. + .arg(Arg::with_name(options::FILE).index(1).multiple(true)); + let arg_list = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); + Config::from(app.get_matches_from(arg_list)) +} + +pub fn get_input<'a>(config: &Config, stdin_ref: &'a Stdin) -> Box { + match &config.to_read { + Some(name) => { + let file_buf = safe_unwrap!(File::open(Path::new(name))); + Box::new(BufReader::new(file_buf)) // as Box + } + None => { + Box::new(stdin_ref.lock()) // as Box + } + } +} + +pub fn handle_input( input: &mut R, format: Format, line_wrap: Option, ignore_garbage: bool, decode: bool, + name: &str, ) { let mut data = Data::new(input, format).ignore_garbage(ignore_garbage); if let Some(wrap) = line_wrap { @@ -88,10 +148,14 @@ fn handle_input( Ok(s) => { if stdout().write_all(&s).is_err() { // on windows console, writing invalid utf8 returns an error - crash!(1, "Cannot write non-utf8 data"); + eprintln!("{}: error: Cannot write non-utf8 data", name); + exit!(1) } } - Err(_) => crash!(1, "invalid input"), + Err(_) => { + eprintln!("{}: error: invalid input", name); + exit!(1) + } } } } diff --git a/src/uu/base64/Cargo.toml b/src/uu/base64/Cargo.toml index 841ab140c..d4ee69f03 100644 --- a/src/uu/base64/Cargo.toml +++ b/src/uu/base64/Cargo.toml @@ -15,8 +15,10 @@ edition = "2018" path = "src/base64.rs" [dependencies] +clap = "2.33" uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features = ["encoding"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } +uu_base32 = { version=">=0.0.6", package="uu_base32", path="../base32"} [[bin]] name = "base64" diff --git a/src/uu/base64/src/base64.rs b/src/uu/base64/src/base64.rs index ee60f3de5..810df4fe8 100644 --- a/src/uu/base64/src/base64.rs +++ b/src/uu/base64/src/base64.rs @@ -8,13 +8,14 @@ #[macro_use] extern crate uucore; + +use uu_base32::base_common; + use uucore::encoding::Format; -mod base_common; +use std::io::{stdin, Read}; -static SYNTAX: &str = "[OPTION]... [FILE]"; -static SUMMARY: &str = "Base64 encode or decode FILE, or standard input, to standard output."; -static LONG_HELP: &str = " +static ABOUT: &str = " With no FILE, or when FILE is -, read standard input. The data are encoded as described for the base64 alphabet in RFC @@ -23,13 +24,42 @@ static LONG_HELP: &str = " to attempt to recover from any other non-alphabet bytes in the encoded stream. "; +static VERSION: &str = env!("CARGO_PKG_VERSION"); + +static BASE_CMD_PARSE_ERROR: i32 = 1; + +fn get_usage() -> String { + format!("{0} [OPTION]... [FILE]", executable!()) +} pub fn uumain(args: impl uucore::Args) -> i32 { - base_common::execute( - args.collect_str(), - SYNTAX, - SUMMARY, - LONG_HELP, - Format::Base64, - ) + let format = Format::Base64; + let usage = get_usage(); + let name = executable!(); + let config_result: Result = + base_common::parse_base_cmd_args(args, name, VERSION, ABOUT, &usage); + + if config_result.is_err() { + match config_result { + Ok(_) => panic!(), + Err(s) => crash!(BASE_CMD_PARSE_ERROR, "{}", s), + } + } + + // Create a reference to stdin so we can return a locked stdin from + // parse_base_cmd_args + let stdin_raw = stdin(); + let config = config_result.unwrap(); + let mut input: Box = base_common::get_input(&config, &stdin_raw); + + base_common::handle_input( + &mut input, + format, + config.wrap_cols, + config.ignore_garbage, + config.decode, + name, + ); + + 0 } diff --git a/src/uu/base64/src/base_common.rs b/src/uu/base64/src/base_common.rs deleted file mode 100644 index 3f1436fb2..000000000 --- a/src/uu/base64/src/base_common.rs +++ /dev/null @@ -1,97 +0,0 @@ -// This file is part of the uutils coreutils package. -// -// (c) Jordy Dickinson -// (c) Jian Zeng -// (c) Alex Lyon -// -// For the full copyright and license information, please view the LICENSE file -// that was distributed with this source code. - -use std::fs::File; -use std::io::{stdin, stdout, BufReader, Read, Write}; -use std::path::Path; - -use uucore::encoding::{wrap_print, Data, Format}; - -pub fn execute( - args: Vec, - syntax: &str, - summary: &str, - long_help: &str, - format: Format, -) -> i32 { - let matches = app!(syntax, summary, long_help) - .optflag("d", "decode", "decode data") - .optflag( - "i", - "ignore-garbage", - "when decoding, ignore non-alphabetic characters", - ) - .optopt( - "w", - "wrap", - "wrap encoded lines after COLS character (default 76, 0 to disable wrapping)", - "COLS", - ) - .parse(args); - - let line_wrap = matches.opt_str("wrap").map(|s| match s.parse() { - Ok(n) => n, - Err(e) => { - crash!(1, "invalid wrap size: ‘{}’: {}", s, e); - } - }); - let ignore_garbage = matches.opt_present("ignore-garbage"); - let decode = matches.opt_present("decode"); - - if matches.free.len() > 1 { - show_usage_error!("extra operand ‘{}’", matches.free[0]); - return 1; - } - - if matches.free.is_empty() || &matches.free[0][..] == "-" { - let stdin_raw = stdin(); - handle_input( - &mut stdin_raw.lock(), - format, - line_wrap, - ignore_garbage, - decode, - ); - } else { - let path = Path::new(matches.free[0].as_str()); - let file_buf = safe_unwrap!(File::open(&path)); - let mut input = BufReader::new(file_buf); - handle_input(&mut input, format, line_wrap, ignore_garbage, decode); - }; - - 0 -} - -fn handle_input( - input: &mut R, - format: Format, - line_wrap: Option, - ignore_garbage: bool, - decode: bool, -) { - let mut data = Data::new(input, format).ignore_garbage(ignore_garbage); - if let Some(wrap) = line_wrap { - data = data.line_wrap(wrap); - } - - if !decode { - let encoded = data.encode(); - wrap_print(&data, encoded); - } else { - match data.decode() { - Ok(s) => { - if stdout().write_all(&s).is_err() { - // on windows console, writing invalid utf8 returns an error - crash!(1, "Cannot write non-utf8 data"); - } - } - Err(_) => crash!(1, "invalid input"), - } - } -} diff --git a/src/uu/basename/Cargo.toml b/src/uu/basename/Cargo.toml index 92d0ca4cd..0072619b7 100644 --- a/src/uu/basename/Cargo.toml +++ b/src/uu/basename/Cargo.toml @@ -15,6 +15,7 @@ edition = "2018" path = "src/basename.rs" [dependencies] +clap = "2.33.2" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/basename/src/basename.rs b/src/uu/basename/src/basename.rs index 84521bdd1..c20561b30 100644 --- a/src/uu/basename/src/basename.rs +++ b/src/uu/basename/src/basename.rs @@ -10,81 +10,106 @@ #[macro_use] extern crate uucore; +use clap::{App, Arg}; use std::path::{is_separator, PathBuf}; +use uucore::InvalidEncodingHandling; -static NAME: &str = "basename"; -static SYNTAX: &str = "NAME [SUFFIX]"; +static VERSION: &str = env!("CARGO_PKG_VERSION"); static SUMMARY: &str = "Print NAME with any leading directory components removed - If specified, also remove a trailing SUFFIX"; -static LONG_HELP: &str = ""; +If specified, also remove a trailing SUFFIX"; + +fn get_usage() -> String { + format!( + "{0} NAME [SUFFIX] + {0} OPTION... NAME...", + executable!() + ) +} + +pub mod options { + pub static MULTIPLE: &str = "multiple"; + pub static NAME: &str = "name"; + pub static SUFFIX: &str = "suffix"; + pub static ZERO: &str = "zero"; +} pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); - + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); + let usage = get_usage(); // // Argument parsing // - let matches = app!(SYNTAX, SUMMARY, LONG_HELP) - .optflag( - "a", - "multiple", - "Support more than one argument. Treat every argument as a name.", + let matches = App::new(executable!()) + .version(VERSION) + .about(SUMMARY) + .usage(&usage[..]) + .arg( + Arg::with_name(options::MULTIPLE) + .short("a") + .long(options::MULTIPLE) + .help("support multiple arguments and treat each as a NAME"), ) - .optopt( - "s", - "suffix", - "Remove a trailing suffix. This option implies the -a option.", - "SUFFIX", + .arg(Arg::with_name(options::NAME).multiple(true).hidden(true)) + .arg( + Arg::with_name(options::SUFFIX) + .short("s") + .long(options::SUFFIX) + .value_name("SUFFIX") + .help("remove a trailing SUFFIX; implies -a"), ) - .optflag( - "z", - "zero", - "Output a zero byte (ASCII NUL) at the end of each line, rather than a newline.", + .arg( + Arg::with_name(options::ZERO) + .short("z") + .long(options::ZERO) + .help("end each output line with NUL, not newline"), ) - .parse(args); + .get_matches_from(args); // too few arguments - if matches.free.is_empty() { + if !matches.is_present(options::NAME) { crash!( 1, - "{0}: {1}\nTry '{0} --help' for more information.", - NAME, + "{1}\nTry '{0} --help' for more information.", + executable!(), "missing operand" ); } - let opt_s = matches.opt_present("s"); - let opt_a = matches.opt_present("a"); - let opt_z = matches.opt_present("z"); - let multiple_paths = opt_s || opt_a; + + let opt_suffix = matches.is_present(options::SUFFIX); + let opt_multiple = matches.is_present(options::MULTIPLE); + let opt_zero = matches.is_present(options::ZERO); + let multiple_paths = opt_suffix || opt_multiple; // too many arguments - if !multiple_paths && matches.free.len() > 2 { + if !multiple_paths && matches.occurrences_of(options::NAME) > 2 { crash!( 1, - "{0}: extra operand '{1}'\nTry '{0} --help' for more information.", - NAME, - matches.free[2] + "extra operand '{1}'\nTry '{0} --help' for more information.", + executable!(), + matches.values_of(options::NAME).unwrap().nth(2).unwrap() ); } - let suffix = if opt_s { - matches.opt_str("s").unwrap() - } else if !opt_a && matches.free.len() > 1 { - matches.free[1].clone() + let suffix = if opt_suffix { + matches.value_of(options::SUFFIX).unwrap() + } else if !opt_multiple && matches.occurrences_of(options::NAME) > 1 { + matches.values_of(options::NAME).unwrap().nth(1).unwrap() } else { - "".to_owned() + "" }; // // Main Program Processing // - let paths = if multiple_paths { - &matches.free[..] + let paths: Vec<_> = if multiple_paths { + matches.values_of(options::NAME).unwrap().collect() } else { - &matches.free[0..1] + matches.values_of(options::NAME).unwrap().take(1).collect() }; - let line_ending = if opt_z { "\0" } else { "\n" }; + let line_ending = if opt_zero { "\0" } else { "\n" }; for path in paths { print!("{}{}", basename(&path, &suffix), line_ending); } @@ -111,6 +136,7 @@ fn basename(fullname: &str, suffix: &str) -> String { } } +#[allow(clippy::manual_strip)] // can be replaced with strip_suffix once the minimum rust version is 1.45 fn strip_suffix(name: &str, suffix: &str) -> String { if name == suffix { return name.to_owned(); diff --git a/src/uu/cat/Cargo.toml b/src/uu/cat/Cargo.toml index e44a874c1..09b289253 100644 --- a/src/uu/cat/Cargo.toml +++ b/src/uu/cat/Cargo.toml @@ -16,13 +16,16 @@ path = "src/cat.rs" [dependencies] clap = "2.33" -quick-error = "1.2.3" +thiserror = "1.0" uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["fs"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } [target.'cfg(unix)'.dependencies] unix_socket = "0.5.0" +[target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] +nix = "0.20" + [[bin]] name = "cat" path = "src/main.rs" diff --git a/src/uu/cat/src/cat.rs b/src/uu/cat/src/cat.rs index cf5a384a4..69ea902e6 100644 --- a/src/uu/cat/src/cat.rs +++ b/src/uu/cat/src/cat.rs @@ -3,14 +3,13 @@ // (c) Jordi Boggiano // (c) Evgeniy Klyuchikov // (c) Joshua S. Miller +// (c) Árni Dagur // // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. // spell-checker:ignore (ToDO) nonprint nonblank nonprinting -#[macro_use] -extern crate quick_error; #[cfg(unix)] extern crate unix_socket; #[macro_use] @@ -18,11 +17,17 @@ extern crate uucore; // last synced with: cat (GNU coreutils) 8.13 use clap::{App, Arg}; -use quick_error::ResultExt; use std::fs::{metadata, File}; -use std::io::{self, stderr, stdin, stdout, BufWriter, Read, Write}; +use std::io::{self, Read, Write}; +use thiserror::Error; use uucore::fs::is_stdin_interactive; +/// Linux splice support +#[cfg(any(target_os = "linux", target_os = "android"))] +mod splice; +#[cfg(any(target_os = "linux", target_os = "android"))] +use std::os::unix::io::{AsRawFd, RawFd}; + /// Unix domain socket support #[cfg(unix)] use std::net::Shutdown; @@ -30,6 +35,7 @@ use std::net::Shutdown; use std::os::unix::fs::FileTypeExt; #[cfg(unix)] use unix_socket::UnixStream; +use uucore::InvalidEncodingHandling; static NAME: &str = "cat"; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -37,6 +43,27 @@ static SYNTAX: &str = "[OPTION]... [FILE]..."; static SUMMARY: &str = "Concatenate FILE(s), or standard input, to standard output With no FILE, or when FILE is -, read standard input."; +#[derive(Error, Debug)] +enum CatError { + /// Wrapper around `io::Error` + #[error("{0}")] + Io(#[from] io::Error), + /// Wrapper around `nix::Error` + #[cfg(any(target_os = "linux", target_os = "android"))] + #[error("{0}")] + Nix(#[from] nix::Error), + /// Unknown file type; it's not a regular file, socket, etc. + #[error("unknown filetype: {}", ft_debug)] + UnknownFiletype { + /// A debug print of the file type + ft_debug: String, + }, + #[error("Is a directory")] + IsDirectory, +} + +type CatResult = Result; + #[derive(PartialEq)] enum NumberingMode { None, @@ -44,39 +71,6 @@ enum NumberingMode { All, } -quick_error! { - #[derive(Debug)] - enum CatError { - /// Wrapper for io::Error with path context - Input(err: io::Error, path: String) { - display("cat: {0}: {1}", path, err) - context(path: &'a str, err: io::Error) -> (err, path.to_owned()) - cause(err) - } - - /// Wrapper for io::Error with no context - Output(err: io::Error) { - display("cat: {0}", err) from() - cause(err) - } - - /// Unknown Filetype classification - UnknownFiletype(path: String) { - display("cat: {0}: unknown filetype", path) - } - - /// At least one error was encountered in reading or writing - EncounteredErrors(count: usize) { - display("cat: encountered {0} errors", count) - } - - /// Denotes an error caused by trying to `cat` a directory - IsDirectory(path: String) { - display("cat: {0}: Is a directory", path) - } - } -} - struct OutputOptions { /// Line numbering mode number: NumberingMode, @@ -87,21 +81,56 @@ struct OutputOptions { /// display TAB characters as `tab` show_tabs: bool, - /// If `show_tabs == true`, this string will be printed in the - /// place of tabs - tab: String, - - /// Can be set to show characters other than '\n' a the end of - /// each line, e.g. $ - end_of_line: String, + /// Show end of lines + show_ends: bool, /// use ^ and M- notation, except for LF (\\n) and TAB (\\t) show_nonprint: bool, } +impl OutputOptions { + fn tab(&self) -> &'static str { + if self.show_tabs { + "^I" + } else { + "\t" + } + } + + fn end_of_line(&self) -> &'static str { + if self.show_ends { + "$\n" + } else { + "\n" + } + } + + /// We can write fast if we can simply copy the contents of the file to + /// stdout, without augmenting the output with e.g. line numbers. + fn can_write_fast(&self) -> bool { + !(self.show_tabs + || self.show_nonprint + || self.show_ends + || self.squeeze_blank + || self.number != NumberingMode::None) + } +} + +/// State that persists between output of each file. This struct is only used +/// when we can't write fast. +struct OutputState { + /// The current line number + line_number: usize, + + /// Whether the output cursor is at the beginning of a new line + at_line_start: bool, +} + /// Represents an open file handle, stream, or other device -struct InputHandle { - reader: Box, +struct InputHandle { + #[cfg(any(target_os = "linux", target_os = "android"))] + file_descriptor: RawFd, + reader: R, is_interactive: bool, } @@ -124,8 +153,6 @@ enum InputType { Socket, } -type CatResult = Result; - mod options { pub static FILE: &str = "file"; pub static SHOW_ALL: &str = "show-all"; @@ -140,7 +167,9 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let matches = App::new(executable!()) .name(NAME) @@ -243,30 +272,14 @@ pub fn uumain(args: impl uucore::Args) -> i32 { None => vec!["-".to_owned()], }; - let can_write_fast = !(show_tabs - || show_nonprint - || show_ends - || squeeze_blank - || number_mode != NumberingMode::None); - - let success = if can_write_fast { - write_fast(files).is_ok() - } else { - let tab = if show_tabs { "^I" } else { "\t" }.to_owned(); - - let end_of_line = if show_ends { "$\n" } else { "\n" }.to_owned(); - - let options = OutputOptions { - end_of_line, - number: number_mode, - show_nonprint, - show_tabs, - squeeze_blank, - tab, - }; - - write_lines(files, &options).is_ok() + let options = OutputOptions { + show_ends, + number: number_mode, + show_nonprint, + show_tabs, + squeeze_blank, }; + let success = cat_files(files, &options).is_ok(); if success { 0 @@ -275,6 +288,76 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } } +fn cat_handle( + handle: &mut InputHandle, + options: &OutputOptions, + state: &mut OutputState, +) -> CatResult<()> { + if options.can_write_fast() { + write_fast(handle) + } else { + write_lines(handle, &options, state) + } +} + +fn cat_path(path: &str, options: &OutputOptions, state: &mut OutputState) -> CatResult<()> { + if path == "-" { + let stdin = io::stdin(); + let mut handle = InputHandle { + #[cfg(any(target_os = "linux", target_os = "android"))] + file_descriptor: stdin.as_raw_fd(), + reader: stdin, + is_interactive: is_stdin_interactive(), + }; + return cat_handle(&mut handle, &options, state); + } + match get_input_type(path)? { + InputType::Directory => Err(CatError::IsDirectory), + #[cfg(unix)] + InputType::Socket => { + let socket = UnixStream::connect(path)?; + socket.shutdown(Shutdown::Write)?; + let mut handle = InputHandle { + #[cfg(any(target_os = "linux", target_os = "android"))] + file_descriptor: socket.as_raw_fd(), + reader: socket, + is_interactive: false, + }; + cat_handle(&mut handle, &options, state) + } + _ => { + let file = File::open(path)?; + let mut handle = InputHandle { + #[cfg(any(target_os = "linux", target_os = "android"))] + file_descriptor: file.as_raw_fd(), + reader: file, + is_interactive: false, + }; + cat_handle(&mut handle, &options, state) + } + } +} + +fn cat_files(files: Vec, options: &OutputOptions) -> Result<(), u32> { + let mut error_count = 0; + let mut state = OutputState { + line_number: 1, + at_line_start: true, + }; + + for path in &files { + if let Err(err) = cat_path(path, &options, &mut state) { + show_error!("{}: {}", path, err); + error_count += 1; + } + } + if error_count == 0 { + Ok(()) + } else { + Err(error_count) + } +} + /// Classifies the `InputType` of file at `path` if possible /// /// # Arguments @@ -285,7 +368,8 @@ fn get_input_type(path: &str) -> CatResult { return Ok(InputType::StdIn); } - match metadata(path).context(path)?.file_type() { + let ft = metadata(path)?.file_type(); + match ft { #[cfg(unix)] ft if ft.is_block_device() => Ok(InputType::BlockDevice), #[cfg(unix)] @@ -297,125 +381,47 @@ fn get_input_type(path: &str) -> CatResult { ft if ft.is_dir() => Ok(InputType::Directory), ft if ft.is_file() => Ok(InputType::File), ft if ft.is_symlink() => Ok(InputType::SymLink), - _ => Err(CatError::UnknownFiletype(path.to_owned())), + _ => Err(CatError::UnknownFiletype { + ft_debug: format!("{:?}", ft), + }), } } -/// Returns an InputHandle from which a Reader can be accessed or an -/// error -/// -/// # Arguments -/// -/// * `path` - `InputHandler` will wrap a reader from this file path -fn open(path: &str) -> CatResult { - if path == "-" { - let stdin = stdin(); - return Ok(InputHandle { - reader: Box::new(stdin) as Box, - is_interactive: is_stdin_interactive(), - }); - } - - match get_input_type(path)? { - InputType::Directory => Err(CatError::IsDirectory(path.to_owned())), - #[cfg(unix)] - InputType::Socket => { - let socket = UnixStream::connect(path).context(path)?; - socket.shutdown(Shutdown::Write).context(path)?; - Ok(InputHandle { - reader: Box::new(socket) as Box, - is_interactive: false, - }) - } - _ => { - let file = File::open(path).context(path)?; - Ok(InputHandle { - reader: Box::new(file) as Box, - is_interactive: false, - }) +/// Writes handle to stdout with no configuration. This allows a +/// simple memory copy. +fn write_fast(handle: &mut InputHandle) -> CatResult<()> { + let stdout = io::stdout(); + let mut stdout_lock = stdout.lock(); + #[cfg(any(target_os = "linux", target_os = "android"))] + { + // If we're on Linux or Android, try to use the splice() system call + // for faster writing. If it works, we're done. + if !splice::write_fast_using_splice(handle, stdout_lock.as_raw_fd())? { + return Ok(()); } } -} - -/// Writes files to stdout with no configuration. This allows a -/// simple memory copy. Returns `Ok(())` if no errors were -/// encountered, or an error with the number of errors encountered. -/// -/// # Arguments -/// -/// * `files` - There is no short circuit when encountering an error -/// reading a file in this vector -fn write_fast(files: Vec) -> CatResult<()> { - let mut writer = stdout(); - let mut in_buf = [0; 1024 * 64]; - let mut error_count = 0; - - for file in files { - match open(&file[..]) { - Ok(mut handle) => { - while let Ok(n) = handle.reader.read(&mut in_buf) { - if n == 0 { - break; - } - writer.write_all(&in_buf[..n]).context(&file[..])?; - } - } - Err(error) => { - writeln!(&mut stderr(), "{}", error)?; - error_count += 1; - } + // If we're not on Linux or Android, or the splice() call failed, + // fall back on slower writing. + let mut buf = [0; 1024 * 64]; + while let Ok(n) = handle.reader.read(&mut buf) { + if n == 0 { + break; } + stdout_lock.write_all(&buf[..n])?; } - - match error_count { - 0 => Ok(()), - _ => Err(CatError::EncounteredErrors(error_count)), - } -} - -/// State that persists between output of each file -struct OutputState { - /// The current line number - line_number: usize, - - /// Whether the output cursor is at the beginning of a new line - at_line_start: bool, -} - -/// Writes files to stdout with `options` as configuration. Returns -/// `Ok(())` if no errors were encountered, or an error with the -/// number of errors encountered. -/// -/// # Arguments -/// -/// * `files` - There is no short circuit when encountering an error -/// reading a file in this vector -fn write_lines(files: Vec, options: &OutputOptions) -> CatResult<()> { - let mut error_count = 0; - let mut state = OutputState { - line_number: 1, - at_line_start: true, - }; - - for file in files { - if let Err(error) = write_file_lines(&file, options, &mut state) { - writeln!(&mut stderr(), "{}", error).context(&file[..])?; - error_count += 1; - } - } - - match error_count { - 0 => Ok(()), - _ => Err(CatError::EncounteredErrors(error_count)), - } + Ok(()) } /// Outputs file contents to stdout in a line-by-line fashion, /// propagating any errors that might occur. -fn write_file_lines(file: &str, options: &OutputOptions, state: &mut OutputState) -> CatResult<()> { - let mut handle = open(file)?; +fn write_lines( + handle: &mut InputHandle, + options: &OutputOptions, + state: &mut OutputState, +) -> CatResult<()> { let mut in_buf = [0; 1024 * 31]; - let mut writer = BufWriter::with_capacity(1024 * 64, stdout()); + let stdout = io::stdout(); + let mut writer = stdout.lock(); let mut one_blank_kept = false; while let Ok(n) = handle.reader.read(&mut in_buf) { @@ -433,9 +439,9 @@ fn write_file_lines(file: &str, options: &OutputOptions, state: &mut OutputState write!(&mut writer, "{0:6}\t", state.line_number)?; state.line_number += 1; } - writer.write_all(options.end_of_line.as_bytes())?; + writer.write_all(options.end_of_line().as_bytes())?; if handle.is_interactive { - writer.flush().context(file)?; + writer.flush()?; } } state.at_line_start = true; @@ -450,7 +456,7 @@ fn write_file_lines(file: &str, options: &OutputOptions, state: &mut OutputState // print to end of line or end of buffer let offset = if options.show_nonprint { - write_nonprint_to_end(&in_buf[pos..], &mut writer, options.tab.as_bytes()) + write_nonprint_to_end(&in_buf[pos..], &mut writer, options.tab().as_bytes()) } else if options.show_tabs { write_tab_to_end(&in_buf[pos..], &mut writer) } else { @@ -462,7 +468,7 @@ fn write_file_lines(file: &str, options: &OutputOptions, state: &mut OutputState break; } // print suitable end of line - writer.write_all(options.end_of_line.as_bytes())?; + writer.write_all(options.end_of_line().as_bytes())?; if handle.is_interactive { writer.flush()?; } diff --git a/src/uu/cat/src/splice.rs b/src/uu/cat/src/splice.rs new file mode 100644 index 000000000..bd6be60f1 --- /dev/null +++ b/src/uu/cat/src/splice.rs @@ -0,0 +1,91 @@ +use super::{CatResult, InputHandle}; + +use nix::fcntl::{splice, SpliceFFlags}; +use nix::unistd::{self, pipe}; +use std::io::Read; +use std::os::unix::io::RawFd; + +const BUF_SIZE: usize = 1024 * 16; + +/// This function is called from `write_fast()` on Linux and Android. The +/// function `splice()` is used to move data between two file descriptors +/// without copying between kernel- and userspace. This results in a large +/// speedup. +/// +/// The `bool` in the result value indicates if we need to fall back to normal +/// copying or not. False means we don't have to. +#[inline] +pub(super) fn write_fast_using_splice( + handle: &mut InputHandle, + write_fd: RawFd, +) -> CatResult { + let (pipe_rd, pipe_wr) = match pipe() { + Ok(r) => r, + Err(_) => { + // It is very rare that creating a pipe fails, but it can happen. + return Ok(true); + } + }; + + loop { + match splice( + handle.file_descriptor, + None, + pipe_wr, + None, + BUF_SIZE, + SpliceFFlags::empty(), + ) { + Ok(n) => { + if n == 0 { + return Ok(false); + } + if splice_exact(pipe_rd, write_fd, n).is_err() { + // If the first splice manages to copy to the intermediate + // pipe, but the second splice to stdout fails for some reason + // we can recover by copying the data that we have from the + // intermediate pipe to stdout using normal read/write. Then + // we tell the caller to fall back. + copy_exact(pipe_rd, write_fd, n)?; + return Ok(true); + } + } + Err(_) => { + return Ok(true); + } + } + } +} + +/// Splice wrapper which handles short writes. +#[inline] +fn splice_exact(read_fd: RawFd, write_fd: RawFd, num_bytes: usize) -> nix::Result<()> { + let mut left = num_bytes; + loop { + let written = splice(read_fd, None, write_fd, None, left, SpliceFFlags::empty())?; + left -= written; + if left == 0 { + break; + } + } + Ok(()) +} + +/// Caller must ensure that `num_bytes <= BUF_SIZE`, otherwise this function +/// will panic. The way we use this function in `write_fast_using_splice` +/// above is safe because `splice` is set to write at most `BUF_SIZE` to the +/// pipe. +#[inline] +fn copy_exact(read_fd: RawFd, write_fd: RawFd, num_bytes: usize) -> nix::Result<()> { + let mut left = num_bytes; + let mut buf = [0; BUF_SIZE]; + loop { + let read = unistd::read(read_fd, &mut buf[..left])?; + let written = unistd::write(write_fd, &buf[..read])?; + left -= written; + if left == 0 { + break; + } + } + Ok(()) +} diff --git a/src/uu/chgrp/src/chgrp.rs b/src/uu/chgrp/src/chgrp.rs index b4c3360c5..f6afc2805 100644 --- a/src/uu/chgrp/src/chgrp.rs +++ b/src/uu/chgrp/src/chgrp.rs @@ -22,6 +22,7 @@ use std::fs::Metadata; use std::os::unix::fs::MetadataExt; use std::path::Path; +use uucore::InvalidEncodingHandling; static SYNTAX: &str = "chgrp [OPTION]... GROUP FILE...\n or : chgrp [OPTION]... --reference=RFILE FILE..."; @@ -32,7 +33,9 @@ const FTS_PHYSICAL: u8 = 1 << 1; const FTS_LOGICAL: u8 = 1 << 2; pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let mut opts = app!(SYNTAX, SUMMARY, ""); opts.optflag("c", @@ -94,7 +97,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if recursive { if bit_flag == FTS_PHYSICAL { if derefer == 1 { - show_info!("-R --dereference requires -H or -L"); + show_error!("-R --dereference requires -H or -L"); return 1; } derefer = 0; @@ -129,7 +132,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { dest_gid = meta.gid(); } Err(e) => { - show_info!("failed to get attributes of '{}': {}", file, e); + show_error!("failed to get attributes of '{}': {}", file, e); return 1; } } @@ -140,7 +143,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { dest_gid = g; } _ => { - show_info!("invalid group: {}", matches.free[0].as_str()); + show_error!("invalid group: {}", matches.free[0].as_str()); return 1; } } @@ -232,8 +235,8 @@ impl Chgrper { if let Some(p) = may_exist { if p.parent().is_none() || self.is_bind_root(p) { - show_info!("it is dangerous to operate recursively on '/'"); - show_info!("use --no-preserve-root to override this failsafe"); + show_error!("it is dangerous to operate recursively on '/'"); + show_error!("use --no-preserve-root to override this failsafe"); return 1; } } @@ -247,12 +250,12 @@ impl Chgrper { self.verbosity.clone(), ) { Ok(n) => { - show_info!("{}", n); + show_error!("{}", n); 0 } Err(e) => { if self.verbosity != Verbosity::Silent { - show_info!("{}", e); + show_error!("{}", e); } 1 } @@ -272,7 +275,7 @@ impl Chgrper { for entry in WalkDir::new(root).follow_links(follow).min_depth(1) { let entry = unwrap!(entry, e, { ret = 1; - show_info!("{}", e); + show_error!("{}", e); continue; }); let path = entry.path(); @@ -286,14 +289,14 @@ impl Chgrper { ret = match wrap_chgrp(path, &meta, self.dest_gid, follow, self.verbosity.clone()) { Ok(n) => { - if n != "" { - show_info!("{}", n); + if !n.is_empty() { + show_error!("{}", n); } 0 } Err(e) => { if self.verbosity != Verbosity::Silent { - show_info!("{}", e); + show_error!("{}", e); } 1 } @@ -310,7 +313,7 @@ impl Chgrper { unwrap!(path.metadata(), e, { match self.verbosity { Silent => (), - _ => show_info!("cannot access '{}': {}", path.display(), e), + _ => show_error!("cannot access '{}': {}", path.display(), e), } return None; }) @@ -318,7 +321,7 @@ impl Chgrper { unwrap!(path.symlink_metadata(), e, { match self.verbosity { Silent => (), - _ => show_info!("cannot dereference '{}': {}", path.display(), e), + _ => show_error!("cannot dereference '{}': {}", path.display(), e), } return None; }) diff --git a/src/uu/chmod/src/chmod.rs b/src/uu/chmod/src/chmod.rs index d9d8c8cf2..c4bf309d6 100644 --- a/src/uu/chmod/src/chmod.rs +++ b/src/uu/chmod/src/chmod.rs @@ -15,8 +15,10 @@ use std::fs; use std::os::unix::fs::{MetadataExt, PermissionsExt}; use std::path::Path; use uucore::fs::display_permissions_unix; +use uucore::libc::mode_t; #[cfg(not(windows))] use uucore::mode; +use uucore::InvalidEncodingHandling; use walkdir::WalkDir; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -49,7 +51,9 @@ fn get_long_usage() -> String { } pub fn uumain(args: impl uucore::Args) -> i32 { - let mut args = args.collect_str(); + let mut args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); // Before we can parse 'args' with clap (and previously getopts), // a possible MODE prefix '-' needs to be removed (e.g. "chmod -x FILE"). @@ -171,13 +175,13 @@ pub fn uumain(args: impl uucore::Args) -> i32 { // of a prefix '-' if it's associated with MODE // e.g. "chmod -v -xw -R FILE" -> "chmod -v xw -R FILE" pub fn strip_minus_from_mode(args: &mut Vec) -> bool { - for i in 0..args.len() { - if args[i].starts_with("-") { - if let Some(second) = args[i].chars().nth(1) { + for arg in args { + if arg.starts_with('-') { + if let Some(second) = arg.chars().nth(1) { match second { 'r' | 'w' | 'x' | 'X' | 's' | 't' | 'u' | 'g' | 'o' | '0'..='7' => { // TODO: use strip_prefix() once minimum rust version reaches 1.45.0 - args[i] = args[i][1..args[i].len()].to_string(); + *arg = arg[1..arg.len()].to_string(); return true; } _ => {} @@ -258,8 +262,10 @@ impl Chmoder { ); } return Ok(()); + } else if err.kind() == std::io::ErrorKind::PermissionDenied { + show_error!("'{}': Permission denied", file.display()); } else { - show_error!("{}: '{}'", err, file.display()); + show_error!("'{}': {}", file.display(), err); } return Err(1); } @@ -303,7 +309,7 @@ impl Chmoder { "mode of '{}' retained as {:04o} ({})", file.display(), fperm, - display_permissions_unix(fperm), + display_permissions_unix(fperm as mode_t, false), ); } Ok(()) @@ -312,25 +318,25 @@ impl Chmoder { show_error!("{}", err); } if self.verbose { - show_info!( + show_error!( "failed to change mode of file '{}' from {:o} ({}) to {:o} ({})", file.display(), fperm, - display_permissions_unix(fperm), + display_permissions_unix(fperm as mode_t, false), mode, - display_permissions_unix(mode) + display_permissions_unix(mode as mode_t, false) ); } Err(1) } else { if self.verbose || self.changes { - show_info!( + show_error!( "mode of '{}' changed from {:o} ({}) to {:o} ({})", file.display(), fperm, - display_permissions_unix(fperm), + display_permissions_unix(fperm as mode_t, false), mode, - display_permissions_unix(mode) + display_permissions_unix(mode as mode_t, false) ); } Ok(()) diff --git a/src/uu/chown/src/chown.rs b/src/uu/chown/src/chown.rs index 42010de03..3d0b25814 100644 --- a/src/uu/chown/src/chown.rs +++ b/src/uu/chown/src/chown.rs @@ -23,6 +23,7 @@ use std::os::unix::fs::MetadataExt; use std::convert::AsRef; use std::path::Path; +use uucore::InvalidEncodingHandling; static ABOUT: &str = "change file owner and group"; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -67,7 +68,9 @@ fn get_usage() -> String { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let usage = get_usage(); @@ -196,7 +199,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if recursive { if bit_flag == FTS_PHYSICAL { if derefer == 1 { - show_info!("-R --dereference requires -H or -L"); + show_error!("-R --dereference requires -H or -L"); return 1; } derefer = 0; @@ -224,7 +227,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { Ok((Some(uid), Some(gid))) => IfFrom::UserGroup(uid, gid), Ok((None, None)) => IfFrom::All, Err(e) => { - show_info!("{}", e); + show_error!("{}", e); return 1; } } @@ -241,7 +244,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { dest_uid = Some(meta.uid()); } Err(e) => { - show_info!("failed to get attributes of '{}': {}", file, e); + show_error!("failed to get attributes of '{}': {}", file, e); return 1; } } @@ -252,7 +255,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { dest_gid = g; } Err(e) => { - show_info!("{}", e); + show_error!("{}", e); return 1; } } @@ -272,16 +275,16 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } fn parse_spec(spec: &str) -> Result<(Option, Option), String> { - let args = spec.split(':').collect::>(); - let usr_only = args.len() == 1; - let grp_only = args.len() == 2 && args[0].is_empty() && !args[1].is_empty(); + let args = spec.split_terminator(':').collect::>(); + let usr_only = args.len() == 1 && !args[0].is_empty(); + let grp_only = args.len() == 2 && args[0].is_empty(); let usr_grp = args.len() == 2 && !args[0].is_empty() && !args[1].is_empty(); if usr_only { Ok(( Some(match Passwd::locate(args[0]) { Ok(v) => v.uid(), - _ => return Err(format!("invalid user: '{}'", spec)), + _ => return Err(format!("invalid user: ‘{}’", spec)), }), None, )) @@ -290,18 +293,18 @@ fn parse_spec(spec: &str) -> Result<(Option, Option), String> { None, Some(match Group::locate(args[1]) { Ok(v) => v.gid(), - _ => return Err(format!("invalid group: '{}'", spec)), + _ => return Err(format!("invalid group: ‘{}’", spec)), }), )) } else if usr_grp { Ok(( Some(match Passwd::locate(args[0]) { Ok(v) => v.uid(), - _ => return Err(format!("invalid user: '{}'", spec)), + _ => return Err(format!("invalid user: ‘{}’", spec)), }), Some(match Group::locate(args[1]) { Ok(v) => v.gid(), - _ => return Err(format!("invalid group: '{}'", spec)), + _ => return Err(format!("invalid group: ‘{}’", spec)), }), )) } else { @@ -374,8 +377,8 @@ impl Chowner { if let Some(p) = may_exist { if p.parent().is_none() { - show_info!("it is dangerous to operate recursively on '/'"); - show_info!("use --no-preserve-root to override this failsafe"); + show_error!("it is dangerous to operate recursively on '/'"); + show_error!("use --no-preserve-root to override this failsafe"); return 1; } } @@ -391,14 +394,14 @@ impl Chowner { self.verbosity.clone(), ) { Ok(n) => { - if n != "" { - show_info!("{}", n); + if !n.is_empty() { + show_error!("{}", n); } 0 } Err(e) => { if self.verbosity != Verbosity::Silent { - show_info!("{}", e); + show_error!("{}", e); } 1 } @@ -421,7 +424,7 @@ impl Chowner { for entry in WalkDir::new(root).follow_links(follow).min_depth(1) { let entry = unwrap!(entry, e, { ret = 1; - show_info!("{}", e); + show_error!("{}", e); continue; }); let path = entry.path(); @@ -446,14 +449,14 @@ impl Chowner { self.verbosity.clone(), ) { Ok(n) => { - if n != "" { - show_info!("{}", n); + if !n.is_empty() { + show_error!("{}", n); } 0 } Err(e) => { if self.verbosity != Verbosity::Silent { - show_info!("{}", e); + show_error!("{}", e); } 1 } @@ -469,7 +472,7 @@ impl Chowner { unwrap!(path.metadata(), e, { match self.verbosity { Silent => (), - _ => show_info!("cannot access '{}': {}", path.display(), e), + _ => show_error!("cannot access '{}': {}", path.display(), e), } return None; }) @@ -477,7 +480,7 @@ impl Chowner { unwrap!(path.symlink_metadata(), e, { match self.verbosity { Silent => (), - _ => show_info!("cannot dereference '{}': {}", path.display(), e), + _ => show_error!("cannot dereference '{}': {}", path.display(), e), } return None; }) diff --git a/src/uu/chroot/src/chroot.rs b/src/uu/chroot/src/chroot.rs index 44c5dfa02..9480830e5 100644 --- a/src/uu/chroot/src/chroot.rs +++ b/src/uu/chroot/src/chroot.rs @@ -15,8 +15,8 @@ use std::ffi::CString; use std::io::Error; use std::path::Path; use std::process::Command; -use uucore::entries; use uucore::libc::{self, chroot, setgid, setgroups, setuid}; +use uucore::{entries, InvalidEncodingHandling}; static VERSION: &str = env!("CARGO_PKG_VERSION"); static NAME: &str = "chroot"; @@ -32,7 +32,9 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .version(VERSION) @@ -104,7 +106,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { _ => { let mut vector: Vec<&str> = Vec::new(); for (&k, v) in matches.args.iter() { - vector.push(k.clone()); + vector.push(k); vector.push(&v.vals[0].to_str().unwrap()); } vector @@ -133,7 +135,7 @@ fn set_context(root: &Path, options: &clap::ArgMatches) { let userspec = match userspec_str { Some(ref u) => { let s: Vec<&str> = u.split(':').collect(); - if s.len() != 2 || s.iter().any(|&spec| spec == "") { + if s.len() != 2 || s.iter().any(|&spec| spec.is_empty()) { crash!(1, "invalid userspec: `{}`", u) }; s @@ -142,16 +144,16 @@ fn set_context(root: &Path, options: &clap::ArgMatches) { }; let (user, group) = if userspec.is_empty() { - (&user_str[..], &group_str[..]) + (user_str, group_str) } else { - (&userspec[0][..], &userspec[1][..]) + (userspec[0], userspec[1]) }; enter_chroot(root); - set_groups_from_str(&groups_str[..]); - set_main_group(&group[..]); - set_user(&user[..]); + set_groups_from_str(groups_str); + set_main_group(group); + set_user(user); } fn enter_chroot(root: &Path) { diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index b6436de87..1d45c1332 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -14,6 +14,7 @@ use clap::{App, Arg}; use std::fs::File; use std::io::{self, stdin, BufReader, Read}; use std::path::Path; +use uucore::InvalidEncodingHandling; // NOTE: CRC_TABLE_LEN *must* be <= 256 as we cast 0..CRC_TABLE_LEN to u8 const CRC_TABLE_LEN: usize = 256; @@ -180,7 +181,9 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let matches = App::new(executable!()) .name(NAME) diff --git a/src/uu/comm/src/comm.rs b/src/uu/comm/src/comm.rs index 34b4330c9..d1d07461c 100644 --- a/src/uu/comm/src/comm.rs +++ b/src/uu/comm/src/comm.rs @@ -14,6 +14,7 @@ use std::cmp::Ordering; use std::fs::File; use std::io::{self, stdin, BufRead, BufReader, Stdin}; use std::path::Path; +use uucore::InvalidEncodingHandling; use clap::{App, Arg, ArgMatches}; @@ -134,6 +135,9 @@ fn open_file(name: &str) -> io::Result { pub fn uumain(args: impl uucore::Args) -> i32 { let usage = get_usage(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .version(VERSION) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 569ee78bc..fab1dfec1 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -47,6 +47,7 @@ use std::os::windows::ffi::OsStrExt; use std::path::{Path, PathBuf, StripPrefixError}; use std::str::FromStr; use std::string::ToString; +use uucore::backup_control::{self, BackupMode}; use uucore::fs::resolve_relative_path; use uucore::fs::{canonicalize, CanonicalizeMode}; use walkdir::WalkDir; @@ -132,7 +133,9 @@ macro_rules! prompt_yes( pub type CopyResult = Result; pub type Source = PathBuf; +pub type SourceSlice = Path; pub type Target = PathBuf; +pub type TargetSlice = Path; /// Specifies whether when overwrite files #[derive(Clone, Eq, PartialEq)] @@ -153,7 +156,8 @@ pub enum OverwriteMode { NoClobber, } -#[derive(Clone, Eq, PartialEq)] +/// Possible arguments for `--reflink`. +#[derive(Copy, Clone, Eq, PartialEq)] pub enum ReflinkMode { Always, Auto, @@ -166,14 +170,6 @@ pub enum TargetType { File, } -#[derive(Clone, Eq, PartialEq)] -pub enum BackupMode { - ExistingBackup, - NoBackup, - NumberedBackup, - SimpleBackup, -} - pub enum CopyMode { Link, SymLink, @@ -198,7 +194,7 @@ pub enum Attribute { #[allow(dead_code)] pub struct Options { attributes_only: bool, - backup: bool, + backup: BackupMode, copy_contents: bool, copy_mode: CopyMode, dereference: bool, @@ -208,7 +204,6 @@ pub struct Options { overwrite: OverwriteMode, parents: bool, strip_trailing_slashes: bool, - reflink: bool, reflink_mode: ReflinkMode, preserve_attributes: Vec, recursive: bool, @@ -220,6 +215,7 @@ pub struct Options { static VERSION: &str = env!("CARGO_PKG_VERSION"); static ABOUT: &str = "Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY."; +static LONG_HELP: &str = ""; static EXIT_OK: i32 = 0; static EXIT_ERR: i32 = 1; @@ -236,6 +232,7 @@ fn get_usage() -> String { static OPT_ARCHIVE: &str = "archive"; static OPT_ATTRIBUTES_ONLY: &str = "attributes-only"; static OPT_BACKUP: &str = "backup"; +static OPT_BACKUP_NO_ARG: &str = "b"; static OPT_CLI_SYMBOLIC_LINKS: &str = "cli-symbolic-links"; static OPT_CONTEXT: &str = "context"; static OPT_COPY_CONTENTS: &str = "copy-contents"; @@ -299,6 +296,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let matches = App::new(executable!()) .version(VERSION) .about(ABOUT) + .after_help(&*format!("{}\n{}", LONG_HELP, backup_control::BACKUP_CONTROL_LONG_HELP)) .usage(&usage[..]) .arg(Arg::with_name(OPT_TARGET_DIRECTORY) .short("t") @@ -360,14 +358,22 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .help("remove each existing destination file before attempting to open it \ (contrast with --force). On Windows, current only works for writeable files.")) .arg(Arg::with_name(OPT_BACKUP) - .short("b") .long(OPT_BACKUP) - .help("make a backup of each existing destination file")) + .help("make a backup of each existing destination file") + .takes_value(true) + .require_equals(true) + .min_values(0) + .possible_values(backup_control::BACKUP_CONTROL_VALUES) + .value_name("CONTROL") + ) + .arg(Arg::with_name(OPT_BACKUP_NO_ARG) + .short(OPT_BACKUP_NO_ARG) + .help("like --backup but does not accept an argument") + ) .arg(Arg::with_name(OPT_SUFFIX) .short("S") .long(OPT_SUFFIX) .takes_value(true) - .default_value("~") .value_name("SUFFIX") .help("override the usual backup suffix")) .arg(Arg::with_name(OPT_UPDATE) @@ -461,6 +467,12 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .get_matches_from(args); let options = crash_if_err!(EXIT_ERR, Options::from_matches(&matches)); + + if options.overwrite == OverwriteMode::NoClobber && options.backup != BackupMode::NoBackup { + show_usage_error!("options --backup and --no-clobber are mutually exclusive"); + return 1; + } + let paths: Vec = matches .values_of(OPT_PATHS) .map(|v| v.map(ToString::to_string).collect()) @@ -547,14 +559,17 @@ impl FromStr for Attribute { } fn add_all_attributes() -> Vec { - let mut attr = Vec::new(); + use Attribute::*; + + #[cfg(target_os = "windows")] + let attr = vec![Ownership, Timestamps, Context, Xattr, Links]; + + #[cfg(not(target_os = "windows"))] + let mut attr = vec![Ownership, Timestamps, Context, Xattr, Links]; + #[cfg(unix)] - attr.push(Attribute::Mode); - attr.push(Attribute::Ownership); - attr.push(Attribute::Timestamps); - attr.push(Attribute::Context); - attr.push(Attribute::Xattr); - attr.push(Attribute::Links); + attr.insert(0, Mode); + attr } @@ -580,7 +595,13 @@ impl Options { || matches.is_present(OPT_RECURSIVE_ALIAS) || matches.is_present(OPT_ARCHIVE); - let backup = matches.is_present(OPT_BACKUP) || (matches.occurrences_of(OPT_SUFFIX) > 0); + let backup_mode = backup_control::determine_backup_mode( + matches.is_present(OPT_BACKUP_NO_ARG) || matches.is_present(OPT_BACKUP), + matches.value_of(OPT_BACKUP), + ); + let backup_suffix = backup_control::determine_backup_suffix(matches.value_of(OPT_SUFFIX)); + + let overwrite = OverwriteMode::from_matches(matches); // Parse target directory options let no_target_dir = matches.is_present(OPT_NO_TARGET_DIRECTORY); @@ -626,18 +647,16 @@ impl Options { || matches.is_present(OPT_NO_DEREFERENCE_PRESERVE_LINKS) || matches.is_present(OPT_ARCHIVE), one_file_system: matches.is_present(OPT_ONE_FILE_SYSTEM), - overwrite: OverwriteMode::from_matches(matches), parents: matches.is_present(OPT_PARENTS), - backup_suffix: matches.value_of(OPT_SUFFIX).unwrap().to_string(), update: matches.is_present(OPT_UPDATE), verbose: matches.is_present(OPT_VERBOSE), strip_trailing_slashes: matches.is_present(OPT_STRIP_TRAILING_SLASHES), - reflink: matches.is_present(OPT_REFLINK), reflink_mode: { if let Some(reflink) = matches.value_of(OPT_REFLINK) { match reflink { "always" => ReflinkMode::Always, "auto" => ReflinkMode::Auto, + "never" => ReflinkMode::Never, value => { return Err(Error::InvalidArgument(format!( "invalid argument '{}' for \'reflink\'", @@ -649,7 +668,9 @@ impl Options { ReflinkMode::Never } }, - backup, + backup: backup_mode, + backup_suffix: backup_suffix, + overwrite: overwrite, no_target_dir, preserve_attributes, recursive, @@ -665,7 +686,7 @@ impl TargetType { /// /// Treat target as a dir if we have multiple sources or the target /// exists and already is a directory - fn determine(sources: &[Source], target: &Target) -> TargetType { + fn determine(sources: &[Source], target: &TargetSlice) -> TargetType { if sources.len() > 1 || target.is_dir() { TargetType::Directory } else { @@ -714,7 +735,7 @@ fn parse_path_args(path_args: &[String], options: &Options) -> CopyResult<(Vec, - source: &std::path::PathBuf, + source: &std::path::Path, dest: std::path::PathBuf, found_hard_link: &mut bool, ) -> CopyResult<()> { @@ -788,7 +809,7 @@ fn preserve_hardlinks( /// Behavior depends on `options`, see [`Options`] for details. /// /// [`Options`]: ./struct.Options.html -fn copy(sources: &[Source], target: &Target, options: &Options) -> CopyResult<()> { +fn copy(sources: &[Source], target: &TargetSlice, options: &Options) -> CopyResult<()> { let target_type = TargetType::determine(sources, target); verify_target_type(target, &target_type)?; @@ -840,7 +861,7 @@ fn copy(sources: &[Source], target: &Target, options: &Options) -> CopyResult<() fn construct_dest_path( source_path: &Path, - target: &Target, + target: &TargetSlice, target_type: &TargetType, options: &Options, ) -> CopyResult { @@ -870,8 +891,8 @@ fn construct_dest_path( } fn copy_source( - source: &Source, - target: &Target, + source: &SourceSlice, + target: &TargetSlice, target_type: &TargetType, options: &Options, ) -> CopyResult<()> { @@ -912,7 +933,7 @@ fn adjust_canonicalization(p: &Path) -> Cow { /// /// Any errors encountered copying files in the tree will be logged but /// will not cause a short-circuit. -fn copy_directory(root: &Path, target: &Target, options: &Options) -> CopyResult<()> { +fn copy_directory(root: &Path, target: &TargetSlice, options: &Options) -> CopyResult<()> { if !options.recursive { return Err(format!("omitting directory '{}'", root.display()).into()); } @@ -1068,6 +1089,7 @@ fn copy_attribute(source: &Path, dest: &Path, attribute: &Attribute) -> CopyResu } #[cfg(not(windows))] +#[allow(clippy::unnecessary_wraps)] // needed for windows version fn symlink_file(source: &Path, dest: &Path, context: &str) -> CopyResult<()> { match std::os::unix::fs::symlink(source, dest).context(context) { Ok(_) => Ok(()), @@ -1084,14 +1106,10 @@ fn context_for(src: &Path, dest: &Path) -> String { format!("'{}' -> '{}'", src.display(), dest.display()) } -/// Implements a relatively naive backup that is not as full featured -/// as GNU cp. No CONTROL version control method argument is taken -/// for backups. -/// TODO: Add version control methods -fn backup_file(path: &Path, suffix: &str) -> CopyResult { - let mut backup_path = path.to_path_buf().into_os_string(); - backup_path.push(suffix); - fs::copy(path, &backup_path)?; +/// Implements a simple backup copy for the destination file. +/// TODO: for the backup, should this function be replaced by `copy_file(...)`? +fn backup_dest(dest: &Path, backup_path: &PathBuf) -> CopyResult { + fs::copy(dest, &backup_path)?; Ok(backup_path.into()) } @@ -1102,8 +1120,9 @@ fn handle_existing_dest(source: &Path, dest: &Path, options: &Options) -> CopyRe options.overwrite.verify(dest)?; - if options.backup { - backup_file(dest, &options.backup_suffix)?; + let backup_path = backup_control::get_backup_path(options.backup, dest, &options.backup_suffix); + if let Some(backup_path) = backup_path { + backup_dest(dest, &backup_path)?; } match options.overwrite { @@ -1191,47 +1210,20 @@ fn copy_file(source: &Path, dest: &Path, options: &Options) -> CopyResult<()> { Ok(()) } -///Copy the file from `source` to `dest` either using the normal `fs::copy` or the -///`FICLONE` ioctl if --reflink is specified and the filesystem supports it. +/// Copy the file from `source` to `dest` either using the normal `fs::copy` or a +/// copy-on-write scheme if --reflink is specified and the filesystem supports it. fn copy_helper(source: &Path, dest: &Path, options: &Options) -> CopyResult<()> { - if options.reflink { - #[cfg(not(target_os = "linux"))] - return Err("--reflink is only supported on linux".to_string().into()); + if options.reflink_mode != ReflinkMode::Never { + #[cfg(not(any(target_os = "linux", target_os = "macos")))] + return Err("--reflink is only supported on linux and macOS" + .to_string() + .into()); + + #[cfg(target_os = "macos")] + copy_on_write_macos(source, dest, options.reflink_mode)?; #[cfg(target_os = "linux")] - { - let src_file = File::open(source).unwrap().into_raw_fd(); - let dst_file = OpenOptions::new() - .write(true) - .truncate(false) - .create(true) - .open(dest) - .unwrap() - .into_raw_fd(); - match options.reflink_mode { - ReflinkMode::Always => unsafe { - let result = ficlone(dst_file, src_file as *const i32); - if result != 0 { - return Err(format!( - "failed to clone {:?} from {:?}: {}", - source, - dest, - std::io::Error::last_os_error() - ) - .into()); - } else { - return Ok(()); - } - }, - ReflinkMode::Auto => unsafe { - let result = ficlone(dst_file, src_file as *const i32); - if result != 0 { - fs::copy(source, dest).context(&*context_for(source, dest))?; - } - }, - ReflinkMode::Never => {} - } - } + copy_on_write_linux(source, dest, options.reflink_mode)?; } else if options.no_dereference && fs::symlink_metadata(&source)?.file_type().is_symlink() { // Here, we will copy the symlink itself (actually, just recreate it) let link = fs::read_link(&source)?; @@ -1264,6 +1256,101 @@ fn copy_helper(source: &Path, dest: &Path, options: &Options) -> CopyResult<()> Ok(()) } +/// Copies `source` to `dest` using copy-on-write if possible. +#[cfg(target_os = "linux")] +fn copy_on_write_linux(source: &Path, dest: &Path, mode: ReflinkMode) -> CopyResult<()> { + debug_assert!(mode != ReflinkMode::Never); + + let src_file = File::open(source).unwrap().into_raw_fd(); + let dst_file = OpenOptions::new() + .write(true) + .truncate(false) + .create(true) + .open(dest) + .unwrap() + .into_raw_fd(); + match mode { + ReflinkMode::Always => unsafe { + let result = ficlone(dst_file, src_file as *const i32); + if result != 0 { + return Err(format!( + "failed to clone {:?} from {:?}: {}", + source, + dest, + std::io::Error::last_os_error() + ) + .into()); + } else { + return Ok(()); + } + }, + ReflinkMode::Auto => unsafe { + let result = ficlone(dst_file, src_file as *const i32); + if result != 0 { + fs::copy(source, dest).context(&*context_for(source, dest))?; + } + }, + ReflinkMode::Never => unreachable!(), + } + + Ok(()) +} + +/// Copies `source` to `dest` using copy-on-write if possible. +#[cfg(target_os = "macos")] +fn copy_on_write_macos(source: &Path, dest: &Path, mode: ReflinkMode) -> CopyResult<()> { + debug_assert!(mode != ReflinkMode::Never); + + // Extract paths in a form suitable to be passed to a syscall. + // The unwrap() is safe because they come from the command-line and so contain non nul + // character. + use std::os::unix::ffi::OsStrExt; + let src = CString::new(source.as_os_str().as_bytes()).unwrap(); + let dst = CString::new(dest.as_os_str().as_bytes()).unwrap(); + + // clonefile(2) was introduced in macOS 10.12 so we cannot statically link against it + // for backward compatibility. + let clonefile = CString::new("clonefile").unwrap(); + let raw_pfn = unsafe { libc::dlsym(libc::RTLD_NEXT, clonefile.as_ptr()) }; + + let mut error = 0; + if !raw_pfn.is_null() { + // Call clonefile(2). + // Safety: Casting a C function pointer to a rust function value is one of the few + // blessed uses of `transmute()`. + unsafe { + let pfn: extern "C" fn( + src: *const libc::c_char, + dst: *const libc::c_char, + flags: u32, + ) -> libc::c_int = std::mem::transmute(raw_pfn); + error = pfn(src.as_ptr(), dst.as_ptr(), 0); + if std::io::Error::last_os_error().kind() == std::io::ErrorKind::AlreadyExists { + // clonefile(2) fails if the destination exists. Remove it and try again. Do not + // bother to check if removal worked because we're going to try to clone again. + let _ = fs::remove_file(dest); + error = pfn(src.as_ptr(), dst.as_ptr(), 0); + } + } + } + + if raw_pfn.is_null() || error != 0 { + // clonefile(2) is not supported or it error'ed out (possibly because the FS does not + // support COW). + match mode { + ReflinkMode::Always => { + return Err( + format!("failed to clone {:?} from {:?}: {}", source, dest, error).into(), + ) + } + ReflinkMode::Auto => fs::copy(source, dest).context(&*context_for(source, dest))?, + ReflinkMode::Never => unreachable!(), + }; + } + + Ok(()) +} + /// Generate an error message if `target` is not the correct `target_type` pub fn verify_target_type(target: &Path, target_type: &TargetType) -> CopyResult<()> { match (target_type, target.is_dir()) { diff --git a/src/uu/csplit/src/csplit.rs b/src/uu/csplit/src/csplit.rs index ce11ba49a..f67f4958f 100644 --- a/src/uu/csplit/src/csplit.rs +++ b/src/uu/csplit/src/csplit.rs @@ -17,6 +17,7 @@ mod splitname; use crate::csplit_error::CsplitError; use crate::splitname::SplitName; +use uucore::InvalidEncodingHandling; static VERSION: &str = env!("CARGO_PKG_VERSION"); static SUMMARY: &str = "split a file into sections determined by context lines"; @@ -123,12 +124,7 @@ where // split the file based on patterns for pattern in patterns.into_iter() { let pattern_as_str = pattern.to_string(); - #[allow(clippy::match_like_matches_macro)] - let is_skip = if let patterns::Pattern::SkipToMatch(_, _, _) = pattern { - true - } else { - false - }; + let is_skip = matches!(pattern, patterns::Pattern::SkipToMatch(_, _, _)); match pattern { patterns::Pattern::UpToLine(n, ex) => { let mut up_to_line = n; @@ -711,7 +707,9 @@ mod tests { pub fn uumain(args: impl uucore::Args) -> i32 { let usage = get_usage(); - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let matches = App::new(executable!()) .version(VERSION) diff --git a/src/uu/cut/BENCHMARKING.md b/src/uu/cut/BENCHMARKING.md new file mode 100644 index 000000000..bd94cf93c --- /dev/null +++ b/src/uu/cut/BENCHMARKING.md @@ -0,0 +1,46 @@ +## Benchmarking cut + +### Performance profile + +In normal use cases a significant amount of the total execution time of `cut` +is spent performing I/O. When invoked with the `-f` option (cut fields) some +CPU time is spent on detecting fields (in `Searcher::next`). Other than that +some small amount of CPU time is spent on breaking the input stream into lines. + + +### How to + +When fixing bugs or adding features you might want to compare +performance before and after your code changes. + +- `hyperfine` can be used to accurately measure and compare the total + execution time of one or more commands. + + ``` + $ cargo build --release --package uu_cut + + $ hyperfine -w3 "./target/release/cut -f2-4,8 -d' ' input.txt" "cut -f2-4,8 -d' ' input.txt" + ``` + You can put those two commands in a shell script to be sure that you don't + forget to build after making any changes. + +When optimizing or fixing performance regressions seeing the number of times a +function is called, and the amount of time it takes can be useful. + +- `cargo flamegraph` generates flame graphs from function level metrics it records using `perf` or `dtrace` + + ``` + $ cargo flamegraph --bin cut --package uu_cut -- -f1,3-4 input.txt > /dev/null + ``` + + +### What to benchmark + +There are four different performance paths in `cut` to benchmark. + +- Byte ranges `-c`/`--characters` or `-b`/`--bytes` e.g. `cut -c 2,4,6-` +- Byte ranges with output delimiters e.g. `cut -c 4- --output-delimiter=/` +- Fields e.g. `cut -f -4` +- Fields with output delimiters e.g. `cut -f 7-10 --output-delimiter=:` + +Choose a test input file with large number of lines so that program startup time does not significantly affect the benchmark. diff --git a/src/uu/cut/Cargo.toml b/src/uu/cut/Cargo.toml index d892ddeb5..c863c1772 100644 --- a/src/uu/cut/Cargo.toml +++ b/src/uu/cut/Cargo.toml @@ -18,6 +18,8 @@ path = "src/cut.rs" clap = "2.33" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } +memchr = "2" +bstr = "0.2" [[bin]] name = "cut" diff --git a/src/uu/cut/src/buffer.rs b/src/uu/cut/src/buffer.rs deleted file mode 100644 index 6c3238be1..000000000 --- a/src/uu/cut/src/buffer.rs +++ /dev/null @@ -1,152 +0,0 @@ -// This file is part of the uutils coreutils package. -// -// (c) Rolf Morel -// (c) kwantam -// * substantial rewrite to use the `std::io::BufReader` trait -// -// For the full copyright and license information, please view the LICENSE -// file that was distributed with this source code. - -// spell-checker:ignore (ToDO) SRes Newl - -use std::io::Result as IoResult; -use std::io::{BufRead, BufReader, Read, Write}; - -#[allow(non_snake_case)] -pub mod Bytes { - use std::io::Write; - - pub trait Select { - fn select(&mut self, bytes: usize, out: Option<&mut W>) -> Selected; - } - - #[derive(PartialEq, Eq, Debug)] - pub enum Selected { - NewlineFound, - Complete(usize), - Partial(usize), - EndOfFile, - } -} - -#[derive(Debug)] -pub struct ByteReader -where - R: Read, -{ - inner: BufReader, - newline_char: u8, -} - -impl ByteReader { - pub fn new(read: R, newline_char: u8) -> ByteReader { - ByteReader { - inner: BufReader::with_capacity(4096, read), - newline_char, - } - } -} - -impl Read for ByteReader { - fn read(&mut self, buf: &mut [u8]) -> IoResult { - self.inner.read(buf) - } -} - -impl BufRead for ByteReader { - fn fill_buf(&mut self) -> IoResult<&[u8]> { - self.inner.fill_buf() - } - - fn consume(&mut self, amt: usize) { - self.inner.consume(amt) - } -} - -impl ByteReader { - pub fn consume_line(&mut self) -> usize { - let mut bytes_consumed = 0; - let mut consume_val; - let newline_char = self.newline_char; - - loop { - { - // need filled_buf to go out of scope - let filled_buf = match self.fill_buf() { - Ok(b) => { - if b.is_empty() { - return bytes_consumed; - } else { - b - } - } - Err(e) => crash!(1, "read error: {}", e), - }; - - if let Some(idx) = filled_buf.iter().position(|byte| *byte == newline_char) { - consume_val = idx + 1; - bytes_consumed += consume_val; - break; - } - - consume_val = filled_buf.len(); - } - - bytes_consumed += consume_val; - self.consume(consume_val); - } - - self.consume(consume_val); - bytes_consumed - } -} - -impl self::Bytes::Select for ByteReader { - fn select(&mut self, bytes: usize, out: Option<&mut W>) -> Bytes::Selected { - enum SRes { - Comp, - Part, - Newl, - } - - use self::Bytes::Selected::*; - - let newline_char = self.newline_char; - let (res, consume_val) = { - let buffer = match self.fill_buf() { - Err(e) => crash!(1, "read error: {}", e), - Ok(b) => b, - }; - - let (res, consume_val) = match buffer.len() { - 0 => return EndOfFile, - buf_used if bytes < buf_used => { - // because the output delimiter should only be placed between - // segments check if the byte after bytes is a newline - let buf_slice = &buffer[0..=bytes]; - - match buf_slice.iter().position(|byte| *byte == newline_char) { - Some(idx) => (SRes::Newl, idx + 1), - None => (SRes::Comp, bytes), - } - } - _ => match buffer.iter().position(|byte| *byte == newline_char) { - Some(idx) => (SRes::Newl, idx + 1), - None => (SRes::Part, buffer.len()), - }, - }; - - if let Some(out) = out { - crash_if_err!(1, out.write_all(&buffer[0..consume_val])); - } - (res, consume_val) - }; - - self.consume(consume_val); - match res { - SRes::Comp => Complete(consume_val), - SRes::Part => Partial(consume_val), - SRes::Newl => NewlineFound, - } - } -} diff --git a/src/uu/cut/src/cut.rs b/src/uu/cut/src/cut.rs index 6b09b91d9..535027237 100644 --- a/src/uu/cut/src/cut.rs +++ b/src/uu/cut/src/cut.rs @@ -10,15 +10,17 @@ #[macro_use] extern crate uucore; +use bstr::io::BufReadExt; use clap::{App, Arg}; use std::fs::File; -use std::io::{stdin, stdout, BufRead, BufReader, Read, Stdout, Write}; +use std::io::{stdin, stdout, BufReader, BufWriter, Read, Write}; use std::path::Path; use self::searcher::Searcher; +use uucore::fs::is_stdout_interactive; use uucore::ranges::Range; +use uucore::InvalidEncodingHandling; -mod buffer; mod searcher; static NAME: &str = "cut"; @@ -125,6 +127,14 @@ enum Mode { Fields(Vec, FieldOptions), } +fn stdout_writer() -> Box { + if is_stdout_interactive() { + Box::new(stdout()) + } else { + Box::new(BufWriter::new(stdout())) as Box + } +} + fn list_to_ranges(list: &str, complement: bool) -> Result, String> { if complement { Range::from_list(list).map(|r| uucore::ranges::complement(&r)) @@ -134,72 +144,35 @@ fn list_to_ranges(list: &str, complement: bool) -> Result, String> { } fn cut_bytes(reader: R, ranges: &[Range], opts: &Options) -> i32 { - use self::buffer::Bytes::Select; - use self::buffer::Bytes::Selected::*; - let newline_char = if opts.zero_terminated { b'\0' } else { b'\n' }; - let mut buf_read = buffer::ByteReader::new(reader, newline_char); - let mut out = stdout(); + let buf_in = BufReader::new(reader); + let mut out = stdout_writer(); + let delim = opts + .out_delim + .as_ref() + .map_or("", String::as_str) + .as_bytes(); - 'newline: loop { - let mut cur_pos = 1; + let res = buf_in.for_byte_record(newline_char, |line| { let mut print_delim = false; - - for &Range { low, high } in ranges.iter() { - // skip up to low - let orig_pos = cur_pos; - loop { - match buf_read.select(low - cur_pos, None::<&mut Stdout>) { - NewlineFound => { - crash_if_err!(1, out.write_all(&[newline_char])); - continue 'newline; - } - Complete(len) => { - cur_pos += len; - break; - } - Partial(len) => cur_pos += len, - EndOfFile => { - if orig_pos != cur_pos { - crash_if_err!(1, out.write_all(&[newline_char])); - } - - break 'newline; - } - } + for &Range { low, high } in ranges { + if low > line.len() { + break; } - - if let Some(ref delim) = opts.out_delim { - if print_delim { - crash_if_err!(1, out.write_all(delim.as_bytes())); - } + if print_delim { + out.write_all(delim)?; + } else if opts.out_delim.is_some() { print_delim = true; } - - // write out from low to high - loop { - match buf_read.select(high - cur_pos + 1, Some(&mut out)) { - NewlineFound => continue 'newline, - Partial(len) => cur_pos += len, - Complete(_) => { - cur_pos = high + 1; - break; - } - EndOfFile => { - if cur_pos != low || low == high { - crash_if_err!(1, out.write_all(&[newline_char])); - } - - break 'newline; - } - } - } + // change `low` from 1-indexed value to 0-index value + let low = low - 1; + let high = high.min(line.len()); + out.write_all(&line[low..high])?; } - - buf_read.consume_line(); - crash_if_err!(1, out.write_all(&[newline_char])); - } - + out.write_all(&[newline_char])?; + Ok(true) + }); + crash_if_err!(1, res); 0 } @@ -212,23 +185,11 @@ fn cut_fields_delimiter( newline_char: u8, out_delim: &str, ) -> i32 { - let mut buf_in = BufReader::new(reader); - let mut out = stdout(); - let mut buffer = Vec::new(); + let buf_in = BufReader::new(reader); + let mut out = stdout_writer(); + let input_delim_len = delim.len(); - 'newline: loop { - buffer.clear(); - match buf_in.read_until(newline_char, &mut buffer) { - Ok(n) if n == 0 => break, - Err(e) => { - if buffer.is_empty() { - crash!(1, "read error: {}", e); - } - } - _ => (), - } - - let line = &buffer[..]; + let result = buf_in.for_byte_record_with_terminator(newline_char, |line| { let mut fields_pos = 1; let mut low_idx = 0; let mut delim_search = Searcher::new(line, delim.as_bytes()).peekable(); @@ -236,46 +197,46 @@ fn cut_fields_delimiter( if delim_search.peek().is_none() { if !only_delimited { - crash_if_err!(1, out.write_all(line)); + out.write_all(line)?; if line[line.len() - 1] != newline_char { - crash_if_err!(1, out.write_all(&[newline_char])); + out.write_all(&[newline_char])?; } } - continue; + return Ok(true); } - for &Range { low, high } in ranges.iter() { + for &Range { low, high } in ranges { if low - fields_pos > 0 { low_idx = match delim_search.nth(low - fields_pos - 1) { - Some((_, beyond_delim)) => beyond_delim, + Some(index) => index + input_delim_len, None => break, }; } for _ in 0..=high - low { if print_delim { - crash_if_err!(1, out.write_all(out_delim.as_bytes())); + out.write_all(out_delim.as_bytes())?; + } else { + print_delim = true; } match delim_search.next() { - Some((high_idx, next_low_idx)) => { + Some(high_idx) => { let segment = &line[low_idx..high_idx]; - crash_if_err!(1, out.write_all(segment)); + out.write_all(segment)?; - print_delim = true; - - low_idx = next_low_idx; + low_idx = high_idx + input_delim_len; fields_pos = high + 1; } None => { let segment = &line[low_idx..]; - crash_if_err!(1, out.write_all(segment)); + out.write_all(segment)?; if line[line.len() - 1] == newline_char { - continue 'newline; + return Ok(true); } break; } @@ -283,9 +244,10 @@ fn cut_fields_delimiter( } } - crash_if_err!(1, out.write_all(&[newline_char])); - } - + out.write_all(&[newline_char])?; + Ok(true) + }); + crash_if_err!(1, result); 0 } @@ -303,23 +265,11 @@ fn cut_fields(reader: R, ranges: &[Range], opts: &FieldOptions) -> i32 ); } - let mut buf_in = BufReader::new(reader); - let mut out = stdout(); - let mut buffer = Vec::new(); + let buf_in = BufReader::new(reader); + let mut out = stdout_writer(); + let delim_len = opts.delimiter.len(); - 'newline: loop { - buffer.clear(); - match buf_in.read_until(newline_char, &mut buffer) { - Ok(n) if n == 0 => break, - Err(e) => { - if buffer.is_empty() { - crash!(1, "read error: {}", e); - } - } - _ => (), - } - - let line = &buffer[..]; + let result = buf_in.for_byte_record_with_terminator(newline_char, |line| { let mut fields_pos = 1; let mut low_idx = 0; let mut delim_search = Searcher::new(line, opts.delimiter.as_bytes()).peekable(); @@ -327,53 +277,54 @@ fn cut_fields(reader: R, ranges: &[Range], opts: &FieldOptions) -> i32 if delim_search.peek().is_none() { if !opts.only_delimited { - crash_if_err!(1, out.write_all(line)); + out.write_all(line)?; if line[line.len() - 1] != newline_char { - crash_if_err!(1, out.write_all(&[newline_char])); + out.write_all(&[newline_char])?; } } - continue; + return Ok(true); } - for &Range { low, high } in ranges.iter() { + for &Range { low, high } in ranges { if low - fields_pos > 0 { - low_idx = match delim_search.nth(low - fields_pos - 1) { - Some((_, beyond_delim)) => beyond_delim, - None => break, - }; - } - - if print_delim && low_idx >= opts.delimiter.as_bytes().len() { - low_idx -= opts.delimiter.as_bytes().len(); + if let Some(delim_pos) = delim_search.nth(low - fields_pos - 1) { + low_idx = if print_delim { + delim_pos + } else { + delim_pos + delim_len + } + } else { + break; + } } match delim_search.nth(high - low) { - Some((high_idx, next_low_idx)) => { + Some(high_idx) => { let segment = &line[low_idx..high_idx]; - crash_if_err!(1, out.write_all(segment)); + out.write_all(segment)?; print_delim = true; - low_idx = next_low_idx; + low_idx = high_idx; fields_pos = high + 1; } None => { let segment = &line[low_idx..line.len()]; - crash_if_err!(1, out.write_all(segment)); + out.write_all(segment)?; if line[line.len() - 1] == newline_char { - continue 'newline; + return Ok(true); } break; } } } - - crash_if_err!(1, out.write_all(&[newline_char])); - } - + out.write_all(&[newline_char])?; + Ok(true) + }); + crash_if_err!(1, result); 0 } @@ -406,7 +357,7 @@ fn cut_files(mut filenames: Vec, mode: Mode) -> i32 { continue; } - if !path.metadata().is_ok() { + if path.metadata().is_err() { show_error!("{}: No such file or directory", filename); continue; } @@ -443,7 +394,9 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let matches = App::new(executable!()) .name(NAME) @@ -487,7 +440,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .help("filter field columns from the input source") .takes_value(true) .allow_hyphen_values(true) - .value_name("LIST") + .value_name("LIST") .display_order(4), ) .arg( @@ -535,40 +488,36 @@ pub fn uumain(args: impl uucore::Args) -> i32 { matches.value_of(options::CHARACTERS), matches.value_of(options::FIELDS), ) { - (Some(byte_ranges), None, None) => { - list_to_ranges(&byte_ranges[..], complement).map(|ranges| { - Mode::Bytes( - ranges, - Options { - out_delim: Some( - matches - .value_of(options::OUTPUT_DELIMITER) - .unwrap_or_default() - .to_owned(), - ), - zero_terminated: matches.is_present(options::ZERO_TERMINATED), - }, - ) - }) - } - (None, Some(char_ranges), None) => { - list_to_ranges(&char_ranges[..], complement).map(|ranges| { - Mode::Characters( - ranges, - Options { - out_delim: Some( - matches - .value_of(options::OUTPUT_DELIMITER) - .unwrap_or_default() - .to_owned(), - ), - zero_terminated: matches.is_present(options::ZERO_TERMINATED), - }, - ) - }) - } + (Some(byte_ranges), None, None) => list_to_ranges(byte_ranges, complement).map(|ranges| { + Mode::Bytes( + ranges, + Options { + out_delim: Some( + matches + .value_of(options::OUTPUT_DELIMITER) + .unwrap_or_default() + .to_owned(), + ), + zero_terminated: matches.is_present(options::ZERO_TERMINATED), + }, + ) + }), + (None, Some(char_ranges), None) => list_to_ranges(char_ranges, complement).map(|ranges| { + Mode::Characters( + ranges, + Options { + out_delim: Some( + matches + .value_of(options::OUTPUT_DELIMITER) + .unwrap_or_default() + .to_owned(), + ), + zero_terminated: matches.is_present(options::ZERO_TERMINATED), + }, + ) + }), (None, None, Some(field_ranges)) => { - list_to_ranges(&field_ranges[..], complement).and_then(|ranges| { + list_to_ranges(field_ranges, complement).and_then(|ranges| { let out_delim = match matches.value_of(options::OUTPUT_DELIMITER) { Some(s) => { if s.is_empty() { diff --git a/src/uu/cut/src/searcher.rs b/src/uu/cut/src/searcher.rs index f0821ff3a..5fe4a723b 100644 --- a/src/uu/cut/src/searcher.rs +++ b/src/uu/cut/src/searcher.rs @@ -5,7 +5,8 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -#[derive(Clone)] +use memchr::memchr; + pub struct Searcher<'a> { haystack: &'a [u8], needle: &'a [u8], @@ -14,6 +15,7 @@ pub struct Searcher<'a> { impl<'a> Searcher<'a> { pub fn new(haystack: &'a [u8], needle: &'a [u8]) -> Searcher<'a> { + assert!(!needle.is_empty()); Searcher { haystack, needle, @@ -23,30 +25,81 @@ impl<'a> Searcher<'a> { } impl<'a> Iterator for Searcher<'a> { - type Item = (usize, usize); + type Item = usize; - fn next(&mut self) -> Option<(usize, usize)> { - if self.needle.len() == 1 { - for offset in self.position..self.haystack.len() { - if self.haystack[offset] == self.needle[0] { - self.position = offset + 1; - return Some((offset, offset + 1)); + fn next(&mut self) -> Option { + loop { + if let Some(match_idx) = memchr(self.needle[0], self.haystack) { + if self.needle.len() == 1 + || self.haystack[match_idx + 1..].starts_with(&self.needle[1..]) + { + let match_pos = self.position + match_idx; + let skip = match_idx + self.needle.len(); + self.haystack = &self.haystack[skip..]; + self.position += skip; + return Some(match_pos); + } else { + let skip = match_idx + 1; + self.haystack = &self.haystack[skip..]; + self.position += skip; + // continue } - } - - self.position = self.haystack.len(); - return None; - } - - while self.position + self.needle.len() <= self.haystack.len() { - if &self.haystack[self.position..self.position + self.needle.len()] == self.needle { - let match_pos = self.position; - self.position += self.needle.len(); - return Some((match_pos, match_pos + self.needle.len())); } else { - self.position += 1; + return None; } } - None + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + const NEEDLE: &[u8] = "ab".as_bytes(); + + #[test] + fn test_normal() { + let iter = Searcher::new("a.a.a".as_bytes(), "a".as_bytes()); + let items: Vec = iter.collect(); + assert_eq!(vec![0, 2, 4], items); + } + + #[test] + fn test_empty() { + let iter = Searcher::new("".as_bytes(), "a".as_bytes()); + let items: Vec = iter.collect(); + assert_eq!(vec![] as Vec, items); + } + + fn test_multibyte(line: &[u8], expected: Vec) { + let iter = Searcher::new(line, NEEDLE); + let items: Vec = iter.collect(); + assert_eq!(expected, items); + } + + #[test] + fn test_multibyte_normal() { + test_multibyte("...ab...ab...".as_bytes(), vec![3, 8]); + } + + #[test] + fn test_multibyte_needle_head_at_end() { + test_multibyte("a".as_bytes(), vec![]); + } + + #[test] + fn test_multibyte_starting_needle() { + test_multibyte("ab...ab...".as_bytes(), vec![0, 5]); + } + + #[test] + fn test_multibyte_trailing_needle() { + test_multibyte("...ab...ab".as_bytes(), vec![3, 8]); + } + + #[test] + fn test_multibyte_first_byte_false_match() { + test_multibyte("aA..aCaC..ab..aD".as_bytes(), vec![10]); } } diff --git a/src/uu/date/src/date.rs b/src/uu/date/src/date.rs index 43573437d..1fe80c03f 100644 --- a/src/uu/date/src/date.rs +++ b/src/uu/date/src/date.rs @@ -207,11 +207,15 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .alias(OPT_UNIVERSAL_2) .help("print or set Coordinated Universal Time (UTC)"), ) - .arg(Arg::with_name(OPT_FORMAT).multiple(true)) + .arg(Arg::with_name(OPT_FORMAT).multiple(false)) .get_matches_from(args); let format = if let Some(form) = matches.value_of(OPT_FORMAT) { - let form = form[1..].into(); + if !form.starts_with('+') { + eprintln!("date: invalid date ‘{}’", form); + return 1; + } + let form = form[1..].to_string(); Format::Custom(form) } else if let Some(fmt) = matches .values_of(OPT_ISO_8601) @@ -237,7 +241,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let set_to = match matches.value_of(OPT_SET).map(parse_date) { None => None, Some(Err((input, _err))) => { - eprintln!("date: invalid date '{}'", input); + eprintln!("date: invalid date ‘{}’", input); return 1; } Some(Ok(date)) => Some(date), @@ -297,11 +301,13 @@ pub fn uumain(args: impl uucore::Args) -> i32 { for date in dates { match date { Ok(date) => { - let formatted = date.format(format_string); + // GNU `date` uses `%N` for nano seconds, however crate::chrono uses `%f` + let format_string = &format_string.replace("%N", "%f"); + let formatted = date.format(format_string).to_string().replace("%f", "%N"); println!("{}", formatted); } Err((input, _err)) => { - println!("date: invalid date '{}'", input); + println!("date: invalid date ‘{}’", input); } } } @@ -348,7 +354,7 @@ fn set_system_datetime(_date: DateTime) -> i32 { #[cfg(target_os = "macos")] fn set_system_datetime(_date: DateTime) -> i32 { eprintln!("date: setting the date is not supported by macOS"); - return 1; + 1 } #[cfg(all(unix, not(target_os = "macos")))] diff --git a/src/uu/df/Cargo.toml b/src/uu/df/Cargo.toml index 4770cb557..0e65fdb32 100644 --- a/src/uu/df/Cargo.toml +++ b/src/uu/df/Cargo.toml @@ -16,14 +16,10 @@ path = "src/df.rs" [dependencies] clap = "2.33" -libc = "0.2" number_prefix = "0.4" -uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } +uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["libc", "fsext"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } -[target.'cfg(target_os = "windows")'.dependencies] -winapi = { version = "0.3", features = ["errhandlingapi", "fileapi", "handleapi", "winerror"] } - [[bin]] name = "df" path = "src/main.rs" diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 57caf7970..8219b0a27 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -6,22 +6,17 @@ // For the full copyright and license information, please view the LICENSE file // that was distributed with this source code. -// spell-checker:ignore (ToDO) mountinfo mtab BLOCKSIZE getmntinfo fobj mptr noatime Iused overmounted -// spell-checker:ignore (libc/fs) asyncreads asyncwrites autofs bavail bfree bsize charspare cifs debugfs devfs devpts ffree frsize fsid fstypename fusectl inode inodes iosize kernfs mntbufp mntfromname mntonname mqueue namemax pipefs smbfs statfs statvfs subfs syncreads syncwrites sysfs wcslen +// spell-checker:ignore (ToDO) mountinfo BLOCKSIZE fobj mptr noatime Iused overmounted +// spell-checker:ignore (libc/fs) asyncreads asyncwrites autofs bavail bfree bsize charspare cifs debugfs devfs devpts ffree frsize fsid fstypename fusectl inode inodes iosize kernfs mntbufp mntfromname mntonname mqueue namemax pipefs smbfs statvfs subfs syncreads syncwrites sysfs wcslen #[macro_use] extern crate uucore; +#[cfg(unix)] +use uucore::fsext::statfs_fn; +use uucore::fsext::{read_fs_list, FsUsage, MountInfo}; use clap::{App, Arg}; -#[cfg(windows)] -use winapi::um::errhandlingapi::GetLastError; -#[cfg(windows)] -use winapi::um::fileapi::{ - FindFirstVolumeW, FindNextVolumeW, FindVolumeClose, GetDriveTypeW, GetVolumeInformationW, - GetVolumePathNamesForVolumeNameW, QueryDosDeviceW, -}; - use number_prefix::NumberPrefix; use std::cell::Cell; use std::collections::HashMap; @@ -32,41 +27,11 @@ use std::ffi::CString; #[cfg(unix)] use std::mem; -#[cfg(any(target_vendor = "apple", target_os = "freebsd"))] -use libc::c_int; -#[cfg(target_vendor = "apple")] -use libc::statfs; -#[cfg(any(target_vendor = "apple", target_os = "freebsd"))] -use std::ffi::CStr; -#[cfg(any(target_vendor = "apple", target_os = "freebsd", target_os = "windows"))] -use std::ptr; -#[cfg(any(target_vendor = "apple", target_os = "freebsd"))] -use std::slice; - #[cfg(target_os = "freebsd")] -use libc::{c_char, fsid_t, uid_t}; +use uucore::libc::{c_char, fsid_t, uid_t}; -#[cfg(target_os = "linux")] -use std::fs::File; -#[cfg(target_os = "linux")] -use std::io::{BufRead, BufReader}; - -#[cfg(windows)] -use std::ffi::OsString; -#[cfg(windows)] -use std::os::windows::ffi::OsStrExt; -#[cfg(windows)] -use std::os::windows::ffi::OsStringExt; #[cfg(windows)] use std::path::Path; -#[cfg(windows)] -use winapi::shared::minwindef::DWORD; -#[cfg(windows)] -use winapi::um::fileapi::GetDiskFreeSpaceW; -#[cfg(windows)] -use winapi::um::handleapi::INVALID_HANDLE_VALUE; -#[cfg(windows)] -use winapi::um::winbase::DRIVE_REMOTE; static VERSION: &str = env!("CARGO_PKG_VERSION"); static ABOUT: &str = "Show information about the file system on which each FILE resides,\n\ @@ -75,14 +40,6 @@ static ABOUT: &str = "Show information about the file system on which each FILE static EXIT_OK: i32 = 0; static EXIT_ERR: i32 = 1; -#[cfg(windows)] -const MAX_PATH: usize = 266; - -#[cfg(target_os = "linux")] -static LINUX_MOUNTINFO: &str = "/proc/self/mountinfo"; -#[cfg(target_os = "linux")] -static LINUX_MTAB: &str = "/etc/mtab"; - static OPT_ALL: &str = "all"; static OPT_BLOCKSIZE: &str = "blocksize"; static OPT_DIRECT: &str = "direct"; @@ -101,8 +58,6 @@ static OPT_TYPE: &str = "type"; static OPT_PRINT_TYPE: &str = "print-type"; static OPT_EXCLUDE_TYPE: &str = "exclude-type"; -static MOUNT_OPT_BIND: &str = "bind"; - /// Store names of file systems as a selector. /// Note: `exclude` takes priority over `include`. struct FsSelector { @@ -116,142 +71,21 @@ struct Options { show_listed_fs: bool, show_fs_type: bool, show_inode_instead: bool, - print_grand_total: bool, // block_size: usize, human_readable_base: i64, fs_selector: FsSelector, } -#[derive(Debug, Clone)] -struct MountInfo { - // it stores `volume_name` in windows platform and `dev_id` in unix platform - dev_id: String, - dev_name: String, - fs_type: String, - mount_dir: String, - mount_option: String, // we only care "bind" option - mount_root: String, - remote: bool, - dummy: bool, -} - -#[cfg(all( - target_os = "freebsd", - not(all(target_vendor = "apple", target_arch = "x86_64")) -))] -#[repr(C)] -#[derive(Copy, Clone)] -#[allow(non_camel_case_types)] -struct statfs { - f_version: u32, - f_type: u32, - f_flags: u64, - f_bsize: u64, - f_iosize: u64, - f_blocks: u64, - f_bfree: u64, - f_bavail: i64, - f_files: u64, - f_ffree: i64, - f_syncwrites: u64, - f_asyncwrites: u64, - f_syncreads: u64, - f_asyncreads: u64, - f_spare: [u64; 10usize], - f_namemax: u32, - f_owner: uid_t, - f_fsid: fsid_t, - f_charspare: [c_char; 80usize], - f_fstypename: [c_char; 16usize], - f_mntfromname: [c_char; 88usize], - f_mntonname: [c_char; 88usize], -} - -#[derive(Debug, Clone)] -struct FsUsage { - blocksize: u64, - blocks: u64, - bfree: u64, - bavail: u64, - bavail_top_bit_set: bool, - files: u64, - ffree: u64, -} - #[derive(Debug, Clone)] struct Filesystem { mountinfo: MountInfo, usage: FsUsage, } -#[cfg(windows)] -macro_rules! String2LPWSTR { - ($str: expr) => { - OsString::from($str.clone()) - .as_os_str() - .encode_wide() - .chain(Some(0)) - .collect::>() - .as_ptr() - }; -} - -#[cfg(windows)] -#[allow(non_snake_case)] -fn LPWSTR2String(buf: &[u16]) -> String { - let len = unsafe { libc::wcslen(buf.as_ptr()) }; - OsString::from_wide(&buf[..len as usize]) - .into_string() - .unwrap() -} - fn get_usage() -> String { format!("{0} [OPTION]... [FILE]...", executable!()) } -#[cfg(any(target_os = "freebsd", target_vendor = "apple"))] -extern "C" { - #[cfg(all(target_vendor = "apple", target_arch = "x86_64"))] - #[link_name = "getmntinfo$INODE64"] - fn getmntinfo(mntbufp: *mut *mut statfs, flags: c_int) -> c_int; - - #[cfg(any( - all(target_os = "freebsd"), - all(target_vendor = "apple", target_arch = "aarch64") - ))] - fn getmntinfo(mntbufp: *mut *mut statfs, flags: c_int) -> c_int; -} - -#[cfg(any(target_os = "freebsd", target_vendor = "apple"))] -impl From for MountInfo { - fn from(statfs: statfs) -> Self { - let mut info = MountInfo { - dev_id: "".to_string(), - dev_name: unsafe { - CStr::from_ptr(&statfs.f_mntfromname[0]) - .to_string_lossy() - .into_owned() - }, - fs_type: unsafe { - CStr::from_ptr(&statfs.f_fstypename[0]) - .to_string_lossy() - .into_owned() - }, - mount_dir: unsafe { - CStr::from_ptr(&statfs.f_mntonname[0]) - .to_string_lossy() - .into_owned() - }, - mount_root: "".to_string(), - mount_option: "".to_string(), - remote: false, - dummy: false, - }; - info.set_missing_fields(); - info - } -} - impl FsSelector { fn new() -> FsSelector { FsSelector { @@ -286,7 +120,6 @@ impl Options { show_listed_fs: false, show_fs_type: false, show_inode_instead: false, - print_grand_total: false, // block_size: match env::var("BLOCKSIZE") { // Ok(size) => size.parse().unwrap(), // Err(_) => 512, @@ -297,239 +130,6 @@ impl Options { } } -impl MountInfo { - fn set_missing_fields(&mut self) { - #[cfg(unix)] - { - // We want to keep the dev_id on Windows - // but set dev_id - let path = CString::new(self.mount_dir.clone()).unwrap(); - unsafe { - let mut stat = mem::zeroed(); - if libc::stat(path.as_ptr(), &mut stat) == 0 { - self.dev_id = (stat.st_dev as i32).to_string(); - } else { - self.dev_id = "".to_string(); - } - } - } - // set MountInfo::dummy - match self.fs_type.as_ref() { - "autofs" | "proc" | "subfs" - /* for Linux 2.6/3.x */ - | "debugfs" | "devpts" | "fusectl" | "mqueue" | "rpc_pipefs" | "sysfs" - /* FreeBSD, Linux 2.4 */ - | "devfs" - /* for NetBSD 3.0 */ - | "kernfs" - /* for Irix 6.5 */ - | "ignore" => self.dummy = true, - _ => self.dummy = self.fs_type == "none" - && self.mount_option.find(MOUNT_OPT_BIND).is_none(), - } - // set MountInfo::remote - #[cfg(windows)] - { - self.remote = DRIVE_REMOTE == unsafe { GetDriveTypeW(String2LPWSTR!(self.mount_root)) }; - } - #[cfg(unix)] - { - if self.dev_name.find(':').is_some() - || (self.dev_name.starts_with("//") && self.fs_type == "smbfs" - || self.fs_type == "cifs") - || self.dev_name == "-hosts" - { - self.remote = true; - } else { - self.remote = false; - } - } - } - - #[cfg(target_os = "linux")] - fn new(file_name: &str, raw: Vec<&str>) -> Option { - match file_name { - // Format: 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue - // "man proc" for more details - "/proc/self/mountinfo" => { - let mut m = MountInfo { - dev_id: "".to_string(), - dev_name: raw[9].to_string(), - fs_type: raw[8].to_string(), - mount_root: raw[3].to_string(), - mount_dir: raw[4].to_string(), - mount_option: raw[5].to_string(), - remote: false, - dummy: false, - }; - m.set_missing_fields(); - Some(m) - } - "/etc/mtab" => { - let mut m = MountInfo { - dev_id: "".to_string(), - dev_name: raw[0].to_string(), - fs_type: raw[2].to_string(), - mount_root: "".to_string(), - mount_dir: raw[1].to_string(), - mount_option: raw[3].to_string(), - remote: false, - dummy: false, - }; - m.set_missing_fields(); - Some(m) - } - _ => None, - } - } - #[cfg(windows)] - fn new(mut volume_name: String) -> Option { - let mut dev_name_buf = [0u16; MAX_PATH]; - volume_name.pop(); - unsafe { - QueryDosDeviceW( - OsString::from(volume_name.clone()) - .as_os_str() - .encode_wide() - .chain(Some(0)) - .skip(4) - .collect::>() - .as_ptr(), - dev_name_buf.as_mut_ptr(), - dev_name_buf.len() as DWORD, - ) - }; - volume_name.push('\\'); - let dev_name = LPWSTR2String(&dev_name_buf); - - let mut mount_root_buf = [0u16; MAX_PATH]; - let success = unsafe { - GetVolumePathNamesForVolumeNameW( - String2LPWSTR!(volume_name), - mount_root_buf.as_mut_ptr(), - mount_root_buf.len() as DWORD, - ptr::null_mut(), - ) - }; - if 0 == success { - // TODO: support the case when `GetLastError()` returns `ERROR_MORE_DATA` - return None; - } - let mount_root = LPWSTR2String(&mount_root_buf); - - let mut fs_type_buf = [0u16; MAX_PATH]; - let success = unsafe { - GetVolumeInformationW( - String2LPWSTR!(mount_root), - ptr::null_mut(), - 0 as DWORD, - ptr::null_mut(), - ptr::null_mut(), - ptr::null_mut(), - fs_type_buf.as_mut_ptr(), - fs_type_buf.len() as DWORD, - ) - }; - let fs_type = if 0 != success { - Some(LPWSTR2String(&fs_type_buf)) - } else { - None - }; - let mut mn_info = MountInfo { - dev_id: volume_name, - dev_name, - fs_type: fs_type.unwrap_or_else(|| "".to_string()), - mount_root, - mount_dir: "".to_string(), - mount_option: "".to_string(), - remote: false, - dummy: false, - }; - mn_info.set_missing_fields(); - Some(mn_info) - } -} - -impl FsUsage { - #[cfg(unix)] - fn new(statvfs: libc::statvfs) -> FsUsage { - { - FsUsage { - blocksize: if statvfs.f_frsize != 0 { - statvfs.f_frsize as u64 - } else { - statvfs.f_bsize as u64 - }, - blocks: statvfs.f_blocks as u64, - bfree: statvfs.f_bfree as u64, - bavail: statvfs.f_bavail as u64, - bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1))) != 0, - files: statvfs.f_files as u64, - ffree: statvfs.f_ffree as u64, - } - } - } - #[cfg(not(unix))] - fn new(path: &Path) -> FsUsage { - let mut root_path = [0u16; MAX_PATH]; - let success = unsafe { - GetVolumePathNamesForVolumeNameW( - //path_utf8.as_ptr(), - String2LPWSTR!(path.as_os_str()), - root_path.as_mut_ptr(), - root_path.len() as DWORD, - ptr::null_mut(), - ) - }; - if 0 == success { - crash!( - EXIT_ERR, - "GetVolumePathNamesForVolumeNameW failed: {}", - unsafe { GetLastError() } - ); - } - - let mut sectors_per_cluster = 0; - let mut bytes_per_sector = 0; - let mut number_of_free_clusters = 0; - let mut total_number_of_clusters = 0; - - let success = unsafe { - GetDiskFreeSpaceW( - String2LPWSTR!(path.as_os_str()), - &mut sectors_per_cluster, - &mut bytes_per_sector, - &mut number_of_free_clusters, - &mut total_number_of_clusters, - ) - }; - if 0 == success { - // Fails in case of CD for example - //crash!(EXIT_ERR, "GetDiskFreeSpaceW failed: {}", unsafe { - //GetLastError() - //}); - } - - let bytes_per_cluster = sectors_per_cluster as u64 * bytes_per_sector as u64; - FsUsage { - // f_bsize File system block size. - blocksize: bytes_per_cluster as u64, - // f_blocks - Total number of blocks on the file system, in units of f_frsize. - // frsize = Fundamental file system block size (fragment size). - blocks: total_number_of_clusters as u64, - // Total number of free blocks. - bfree: number_of_free_clusters as u64, - // Total number of free blocks available to non-privileged processes. - bavail: 0 as u64, - bavail_top_bit_set: ((bytes_per_sector as u64) & (1u64.rotate_right(1))) != 0, - // Total number of file nodes (inodes) on the file system. - files: 0 as u64, // Not available on windows - // Total number of free file nodes (inodes). - ffree: 4096 as u64, // Meaningless on Windows - } - } -} - impl Filesystem { // TODO: resolve uuid in `mountinfo.dev_name` if exists fn new(mountinfo: MountInfo) -> Option { @@ -550,7 +150,7 @@ impl Filesystem { unsafe { let path = CString::new(_stat_path).unwrap(); let mut statvfs = mem::zeroed(); - if libc::statvfs(path.as_ptr(), &mut statvfs) < 0 { + if statfs_fn(path.as_ptr(), &mut statvfs) < 0 { None } else { Some(Filesystem { @@ -567,80 +167,6 @@ impl Filesystem { } } -/// Read file system list. -fn read_fs_list() -> Vec { - #[cfg(target_os = "linux")] - { - let (file_name, fobj) = File::open(LINUX_MOUNTINFO) - .map(|f| (LINUX_MOUNTINFO, f)) - .or_else(|_| File::open(LINUX_MTAB).map(|f| (LINUX_MTAB, f))) - .expect("failed to find mount list files"); - let reader = BufReader::new(fobj); - reader - .lines() - .filter_map(|line| line.ok()) - .filter_map(|line| { - let raw_data = line.split_whitespace().collect::>(); - MountInfo::new(file_name, raw_data) - }) - .collect::>() - } - #[cfg(any(target_os = "freebsd", target_vendor = "apple"))] - { - let mut mptr: *mut statfs = ptr::null_mut(); - let len = unsafe { getmntinfo(&mut mptr, 1 as c_int) }; - if len < 0 { - crash!(EXIT_ERR, "getmntinfo failed"); - } - let mounts = unsafe { slice::from_raw_parts(mptr, len as usize) }; - mounts - .iter() - .map(|m| MountInfo::from(*m)) - .collect::>() - } - #[cfg(windows)] - { - let mut volume_name_buf = [0u16; MAX_PATH]; - // As recommended in the MS documentation, retrieve the first volume before the others - let find_handle = unsafe { - FindFirstVolumeW(volume_name_buf.as_mut_ptr(), volume_name_buf.len() as DWORD) - }; - if INVALID_HANDLE_VALUE == find_handle { - crash!(EXIT_ERR, "FindFirstVolumeW failed: {}", unsafe { - GetLastError() - }); - } - let mut mounts = Vec::::new(); - loop { - let volume_name = LPWSTR2String(&volume_name_buf); - if !volume_name.starts_with("\\\\?\\") || !volume_name.ends_with('\\') { - show_warning!("A bad path was skipped: {}", volume_name); - continue; - } - if let Some(m) = MountInfo::new(volume_name) { - mounts.push(m); - } - if 0 == unsafe { - FindNextVolumeW( - find_handle, - volume_name_buf.as_mut_ptr(), - volume_name_buf.len() as DWORD, - ) - } { - let err = unsafe { GetLastError() }; - if err != winapi::shared::winerror::ERROR_NO_MORE_FILES { - crash!(EXIT_ERR, "FindNextVolumeW failed: {}", err); - } - break; - } - } - unsafe { - FindVolumeClose(find_handle); - } - mounts - } -} - fn filter_mount_list(vmi: Vec, paths: &[String], opt: &Options) -> Vec { vmi.into_iter() .filter_map(|mi| { @@ -871,9 +397,6 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if matches.is_present(OPT_ALL) { opt.show_all_fs = true; } - if matches.is_present(OPT_TOTAL) { - opt.print_grand_total = true; - } if matches.is_present(OPT_INODES) { opt.show_inode_instead = true; } @@ -921,6 +444,9 @@ pub fn uumain(args: impl uucore::Args) -> i32 { "Use%", ] }); + if cfg!(target_os = "macos") && !opt.show_inode_instead { + header.insert(header.len() - 1, "Capacity"); + } header.push("Mounted on"); for (idx, title) in header.iter().enumerate() { @@ -975,6 +501,11 @@ pub fn uumain(args: impl uucore::Args) -> i32 { "{0: >12} ", human_readable(free_size, opt.human_readable_base) ); + if cfg!(target_os = "macos") { + let used = fs.usage.blocks - fs.usage.bfree; + let blocks = used + fs.usage.bavail; + print!("{0: >12} ", use_size(used, blocks)); + } print!("{0: >5} ", use_size(free_size, total_size)); } print!("{0: <16}", fs.mountinfo.mount_dir); diff --git a/src/uu/dircolors/src/dircolors.rs b/src/uu/dircolors/src/dircolors.rs index 6cb5f9e1b..b6942c2d2 100644 --- a/src/uu/dircolors/src/dircolors.rs +++ b/src/uu/dircolors/src/dircolors.rs @@ -53,7 +53,9 @@ pub fn guess_syntax() -> OutputFmt { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let matches = app!(SYNTAX, SUMMARY, LONG_HELP) .optflag("b", "sh", "output Bourne shell code to set LS_COLORS") @@ -103,7 +105,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if out_format == OutputFmt::Unknown { match guess_syntax() { OutputFmt::Unknown => { - show_info!("no SHELL environment variable, and no shell type option given"); + show_error!("no SHELL environment variable, and no shell type option given"); return 1; } fmt => out_format = fmt, @@ -128,7 +130,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { ) } Err(e) => { - show_info!("{}: {}", matches.free[0], e); + show_error!("{}: {}", matches.free[0], e); return 1; } } @@ -139,7 +141,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { 0 } Err(s) => { - show_info!("{}", s); + show_error!("{}", s); 1 } } @@ -202,6 +204,8 @@ enum ParseState { Pass, } use std::collections::HashMap; +use uucore::InvalidEncodingHandling; + fn parse(lines: T, fmt: OutputFmt, fp: &str) -> Result where T: IntoIterator, diff --git a/src/uu/dirname/src/dirname.rs b/src/uu/dirname/src/dirname.rs index 1cf35d0c4..63693c982 100644 --- a/src/uu/dirname/src/dirname.rs +++ b/src/uu/dirname/src/dirname.rs @@ -10,36 +10,44 @@ extern crate uucore; use clap::{App, Arg}; use std::path::Path; +use uucore::InvalidEncodingHandling; -static NAME: &str = "dirname"; -static SYNTAX: &str = "[OPTION] NAME..."; -static SUMMARY: &str = "strip last component from file name"; +static ABOUT: &str = "strip last component from file name"; static VERSION: &str = env!("CARGO_PKG_VERSION"); -static LONG_HELP: &str = " - Output each NAME with its last non-slash component and trailing slashes - removed; if NAME contains no /'s, output '.' (meaning the current - directory). -"; mod options { pub const ZERO: &str = "zero"; pub const DIR: &str = "dir"; } +fn get_usage() -> String { + format!("{0} [OPTION] NAME...", executable!()) +} + +fn get_long_usage() -> String { + String::from( + "Output each NAME with its last non-slash component and trailing slashes + removed; if NAME contains no /'s, output '.' (meaning the current directory).", + ) +} + pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); + + let usage = get_usage(); + let after_help = get_long_usage(); let matches = App::new(executable!()) - .name(NAME) - .usage(SYNTAX) - .about(SUMMARY) - .after_help(LONG_HELP) + .about(ABOUT) + .usage(&usage[..]) + .after_help(&after_help[..]) .version(VERSION) .arg( Arg::with_name(options::ZERO) - .short(options::ZERO) + .long(options::ZERO) .short("z") - .takes_value(false) .help("separate output with NUL rather than newline"), ) .arg(Arg::with_name(options::DIR).hidden(true).multiple(true)) diff --git a/src/uu/du/Cargo.toml b/src/uu/du/Cargo.toml index 3ce9d8361..023c0a021 100644 --- a/src/uu/du/Cargo.toml +++ b/src/uu/du/Cargo.toml @@ -15,6 +15,7 @@ edition = "2018" path = "src/du.rs" [dependencies] +clap = "2.33" chrono = "0.4" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index 615b66a4e..6bd4f23e4 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -12,10 +12,11 @@ extern crate uucore; use chrono::prelude::DateTime; use chrono::Local; +use clap::{App, Arg}; use std::collections::HashSet; use std::env; use std::fs; -use std::io::{stderr, Result, Write}; +use std::io::{stderr, ErrorKind, Result, Write}; use std::iter; #[cfg(not(windows))] use std::os::unix::fs::MetadataExt; @@ -25,6 +26,7 @@ use std::os::windows::fs::MetadataExt; use std::os::windows::io::AsRawHandle; use std::path::PathBuf; use std::time::{Duration, UNIX_EPOCH}; +use uucore::InvalidEncodingHandling; #[cfg(windows)] use winapi::shared::minwindef::{DWORD, LPVOID}; #[cfg(windows)] @@ -36,6 +38,27 @@ use winapi::um::winbase::GetFileInformationByHandleEx; #[cfg(windows)] use winapi::um::winnt::{FILE_ID_128, ULONGLONG}; +mod options { + pub const NULL: &str = "0"; + pub const ALL: &str = "all"; + pub const APPARENT_SIZE: &str = "apparent-size"; + pub const BLOCK_SIZE: &str = "B"; + pub const BYTES: &str = "b"; + pub const TOTAL: &str = "c"; + pub const MAX_DEPTH: &str = "d"; + pub const HUMAN_READABLE: &str = "h"; + pub const BLOCK_SIZE_1K: &str = "k"; + pub const COUNT_LINKS: &str = "l"; + pub const BLOCK_SIZE_1M: &str = "m"; + pub const SEPARATE_DIRS: &str = "S"; + pub const SUMMARIZE: &str = "s"; + pub const SI: &str = "si"; + pub const TIME: &str = "time"; + pub const TIME_STYLE: &str = "time-style"; + pub const FILE: &str = "FILE"; +} + +const VERSION: &str = env!("CARGO_PKG_VERSION"); const NAME: &str = "du"; const SUMMARY: &str = "estimate file space usage"; const LONG_HELP: &str = " @@ -219,14 +242,14 @@ fn unit_string_to_number(s: &str) -> Option { Some(number * multiple.pow(unit)) } -fn translate_to_pure_number(s: &Option) -> Option { +fn translate_to_pure_number(s: &Option<&str>) -> Option { match *s { Some(ref s) => unit_string_to_number(s), None => None, } } -fn read_block_size(s: Option) -> u64 { +fn read_block_size(s: Option<&str>) -> u64 { match translate_to_pure_number(&s) { Some(v) => v, None => { @@ -235,7 +258,8 @@ fn read_block_size(s: Option) -> u64 { }; for env_var in &["DU_BLOCK_SIZE", "BLOCK_SIZE", "BLOCKSIZE"] { - if let Some(quantity) = translate_to_pure_number(&env::var(env_var).ok()) { + let env_size = env::var(env_var).ok(); + if let Some(quantity) = translate_to_pure_number(&env_size.as_deref()) { return quantity; } } @@ -296,7 +320,21 @@ fn du( } } } - Err(error) => show_error!("{}", error), + Err(error) => match error.kind() { + ErrorKind::PermissionDenied => { + let description = format!( + "cannot access '{}'", + entry + .path() + .as_os_str() + .to_str() + .unwrap_or("") + ); + let error_message = "Permission denied"; + show_error_custom_description!(description, "{}", error_message) + } + _ => show_error!("{}", error), + }, }, Err(error) => show_error!("{}", error), } @@ -322,7 +360,7 @@ fn convert_size_human(size: u64, multiplier: u64, _block_size: u64) -> String { } } if size == 0 { - return format!("0"); + return "0".to_string(); } format!("{}B", size) } @@ -346,124 +384,189 @@ fn convert_size_other(size: u64, _multiplier: u64, block_size: u64) -> String { format!("{}", ((size as f64) / (block_size as f64)).ceil()) } +fn get_usage() -> String { + format!( + "{0} [OPTION]... [FILE]... + {0} [OPTION]... --files0-from=F", + executable!() + ) +} + #[allow(clippy::cognitive_complexity)] pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); - let syntax = format!( - "[OPTION]... [FILE]... - {0} [OPTION]... --files0-from=F", - NAME - ); - let matches = app!(&syntax, SUMMARY, LONG_HELP) - // In task - .optflag( - "a", - "all", - " write counts for all files, not just directories", - ) - // In main - .optflag( - "", - "apparent-size", - "print apparent sizes, rather than disk usage - although the apparent size is usually smaller, it may be larger due to holes - in ('sparse') files, internal fragmentation, indirect blocks, and the like", - ) - // In main - .optopt( - "B", - "block-size", - "scale sizes by SIZE before printing them. - E.g., '-BM' prints sizes in units of 1,048,576 bytes. See SIZE format below.", - "SIZE", - ) - // In main - .optflag( - "b", - "bytes", - "equivalent to '--apparent-size --block-size=1'", - ) - // In main - .optflag("c", "total", "produce a grand total") - // In task - // opts.optflag("D", "dereference-args", "dereference only symlinks that are listed - // on the command line"), - // In main - // opts.optopt("", "files0-from", "summarize disk usage of the NUL-terminated file - // names specified in file F; - // If F is - then read names from standard input", "F"), - // // In task - // opts.optflag("H", "", "equivalent to --dereference-args (-D)"), - // In main - .optflag( - "h", - "human-readable", - "print sizes in human readable format (e.g., 1K 234M 2G)", - ) - // In main - .optflag("", "si", "like -h, but use powers of 1000 not 1024") - // In main - .optflag("k", "", "like --block-size=1K") - // In task - .optflag("l", "count-links", "count sizes many times if hard linked") - // // In main - .optflag("m", "", "like --block-size=1M") - // // In task - // opts.optflag("L", "dereference", "dereference all symbolic links"), - // // In task - // opts.optflag("P", "no-dereference", "don't follow any symbolic links (this is the default)"), - // // In main - .optflag( - "0", - "null", - "end each output line with 0 byte rather than newline", - ) - // In main - .optflag( - "S", - "separate-dirs", - "do not include size of subdirectories", - ) - // In main - .optflag("s", "summarize", "display only a total for each argument") - // // In task - // opts.optflag("x", "one-file-system", "skip directories on different file systems"), - // // In task - // opts.optopt("X", "exclude-from", "exclude files that match any pattern in FILE", "FILE"), - // // In task - // opts.optopt("", "exclude", "exclude files that match PATTERN", "PATTERN"), - // In main - .optopt( - "d", - "max-depth", - "print the total for a directory (or file, with --all) - only if it is N or fewer levels below the command - line argument; --max-depth=0 is the same as --summarize", - "N", - ) - // In main - .optflagopt( - "", - "time", - "show time of the last modification of any file in the - directory, or any of its subdirectories. If WORD is given, show time as WORD instead - of modification time: atime, access, use, ctime or status", - "WORD", - ) - // In main - .optopt( - "", - "time-style", - "show times using style STYLE: - full-iso, long-iso, iso, +FORMAT FORMAT is interpreted like 'date'", - "STYLE", - ) - .parse(args); + let usage = get_usage(); - let summarize = matches.opt_present("summarize"); + let matches = App::new(executable!()) + .version(VERSION) + .about(SUMMARY) + .usage(&usage[..]) + .after_help(LONG_HELP) + .arg( + Arg::with_name(options::ALL) + .short("a") + .long(options::ALL) + .help("write counts for all files, not just directories"), + ) + .arg( + Arg::with_name(options::APPARENT_SIZE) + .long(options::APPARENT_SIZE) + .help( + "print apparent sizes, rather than disk usage \ + although the apparent size is usually smaller, it may be larger due to holes \ + in ('sparse') files, internal fragmentation, indirect blocks, and the like" + ) + ) + .arg( + Arg::with_name(options::BLOCK_SIZE) + .short("B") + .long("block-size") + .value_name("SIZE") + .help( + "scale sizes by SIZE before printing them. \ + E.g., '-BM' prints sizes in units of 1,048,576 bytes. See SIZE format below." + ) + ) + .arg( + Arg::with_name(options::BYTES) + .short("b") + .long("bytes") + .help("equivalent to '--apparent-size --block-size=1'") + ) + .arg( + Arg::with_name(options::TOTAL) + .long("total") + .short("c") + .help("produce a grand total") + ) + .arg( + Arg::with_name(options::MAX_DEPTH) + .short("d") + .long("max-depth") + .value_name("N") + .help( + "print the total for a directory (or file, with --all) \ + only if it is N or fewer levels below the command \ + line argument; --max-depth=0 is the same as --summarize" + ) + ) + .arg( + Arg::with_name(options::HUMAN_READABLE) + .long("human-readable") + .short("h") + .help("print sizes in human readable format (e.g., 1K 234M 2G)") + ) + .arg( + Arg::with_name("inodes") + .long("inodes") + .help( + "list inode usage information instead of block usage like --block-size=1K" + ) + ) + .arg( + Arg::with_name(options::BLOCK_SIZE_1K) + .short("k") + .help("like --block-size=1K") + ) + .arg( + Arg::with_name(options::COUNT_LINKS) + .short("l") + .long("count-links") + .help("count sizes many times if hard linked") + ) + // .arg( + // Arg::with_name("dereference") + // .short("L") + // .long("dereference") + // .help("dereference all symbolic links") + // ) + // .arg( + // Arg::with_name("no-dereference") + // .short("P") + // .long("no-dereference") + // .help("don't follow any symbolic links (this is the default)") + // ) + .arg( + Arg::with_name(options::BLOCK_SIZE_1M) + .short("m") + .help("like --block-size=1M") + ) + .arg( + Arg::with_name(options::NULL) + .short("0") + .long("null") + .help("end each output line with 0 byte rather than newline") + ) + .arg( + Arg::with_name(options::SEPARATE_DIRS) + .short("S") + .long("separate-dirs") + .help("do not include size of subdirectories") + ) + .arg( + Arg::with_name(options::SUMMARIZE) + .short("s") + .long("summarize") + .help("display only a total for each argument") + ) + .arg( + Arg::with_name(options::SI) + .long(options::SI) + .help("like -h, but use powers of 1000 not 1024") + ) + // .arg( + // Arg::with_name("one-file-system") + // .short("x") + // .long("one-file-system") + // .help("skip directories on different file systems") + // ) + // .arg( + // Arg::with_name("") + // .short("x") + // .long("exclude-from") + // .value_name("FILE") + // .help("exclude files that match any pattern in FILE") + // ) + // .arg( + // Arg::with_name("exclude") + // .long("exclude") + // .value_name("PATTERN") + // .help("exclude files that match PATTERN") + // ) + .arg( + Arg::with_name(options::TIME) + .long(options::TIME) + .value_name("WORD") + .require_equals(true) + .min_values(0) + .help( + "show time of the last modification of any file in the \ + directory, or any of its subdirectories. If WORD is given, show time as WORD instead \ + of modification time: atime, access, use, ctime or status" + ) + ) + .arg( + Arg::with_name(options::TIME_STYLE) + .long(options::TIME_STYLE) + .value_name("STYLE") + .help( + "show times using style STYLE: \ + full-iso, long-iso, iso, +FORMAT FORMAT is interpreted like 'date'" + ) + ) + .arg( + Arg::with_name(options::FILE) + .hidden(true) + .multiple(true) + ) + .get_matches_from(args); - let max_depth_str = matches.opt_str("max-depth"); + let summarize = matches.is_present(options::SUMMARIZE); + + let max_depth_str = matches.value_of(options::MAX_DEPTH); let max_depth = max_depth_str.as_ref().and_then(|s| s.parse::().ok()); match (max_depth_str, max_depth) { (Some(ref s), _) if summarize => { @@ -478,34 +581,35 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } let options = Options { - all: matches.opt_present("all"), + all: matches.is_present(options::ALL), program_name: NAME.to_owned(), max_depth, - total: matches.opt_present("total"), - separate_dirs: matches.opt_present("S"), + total: matches.is_present(options::TOTAL), + separate_dirs: matches.is_present(options::SEPARATE_DIRS), }; - let strs = if matches.free.is_empty() { - vec!["./".to_owned()] - } else { - matches.free.clone() + let strs = match matches.value_of(options::FILE) { + Some(_) => matches.values_of(options::FILE).unwrap().collect(), + None => { + vec!["./"] // TODO: gnu `du` doesn't use trailing "/" here + } }; - let block_size = read_block_size(matches.opt_str("block-size")); + let block_size = read_block_size(matches.value_of(options::BLOCK_SIZE)); - let multiplier: u64 = if matches.opt_present("si") { + let multiplier: u64 = if matches.is_present(options::SI) { 1000 } else { 1024 }; let convert_size_fn = { - if matches.opt_present("human-readable") || matches.opt_present("si") { + if matches.is_present(options::HUMAN_READABLE) || matches.is_present(options::SI) { convert_size_human - } else if matches.opt_present("b") { + } else if matches.is_present(options::BYTES) { convert_size_b - } else if matches.opt_present("k") { + } else if matches.is_present(options::BLOCK_SIZE_1K) { convert_size_k - } else if matches.opt_present("m") { + } else if matches.is_present(options::BLOCK_SIZE_1M) { convert_size_m } else { convert_size_other @@ -513,8 +617,8 @@ pub fn uumain(args: impl uucore::Args) -> i32 { }; let convert_size = |size| convert_size_fn(size, multiplier, block_size); - let time_format_str = match matches.opt_str("time-style") { - Some(s) => match &s[..] { + let time_format_str = match matches.value_of("time-style") { + Some(s) => match s { "full-iso" => "%Y-%m-%d %H:%M:%S.%f %z", "long-iso" => "%Y-%m-%d %H:%M", "iso" => "%Y-%m-%d", @@ -535,7 +639,11 @@ Try '{} --help' for more information.", None => "%Y-%m-%d %H:%M", }; - let line_separator = if matches.opt_present("0") { "\0" } else { "\n" }; + let line_separator = if matches.is_present(options::NULL) { + "\0" + } else { + "\n" + }; let mut grand_total = 0; for path_str in strs { @@ -548,18 +656,20 @@ Try '{} --help' for more information.", let (_, len) = iter.size_hint(); let len = len.unwrap(); for (index, stat) in iter.enumerate() { - let size = if matches.opt_present("apparent-size") || matches.opt_present("b") { + let size = if matches.is_present(options::APPARENT_SIZE) + || matches.is_present(options::BYTES) + { stat.size } else { // C's stat is such that each block is assume to be 512 bytes // See: http://linux.die.net/man/2/stat stat.blocks * 512 }; - if matches.opt_present("time") { + if matches.is_present(options::TIME) { let tm = { let secs = { - match matches.opt_str("time") { - Some(s) => match &s[..] { + match matches.value_of(options::TIME) { + Some(s) => match s { "accessed" => stat.accessed, "created" => stat.created, "modified" => stat.modified, @@ -632,8 +742,8 @@ mod test_du { (Some("900KB".to_string()), Some(900 * 1000)), (Some("BAD_STRING".to_string()), None), ]; - for it in test_data.into_iter() { - assert_eq!(translate_to_pure_number(&it.0), it.1); + for it in test_data.iter() { + assert_eq!(translate_to_pure_number(&it.0.as_deref()), it.1); } } @@ -644,8 +754,8 @@ mod test_du { (None, 1024), (Some("BAD_STRING".to_string()), 1024), ]; - for it in test_data.into_iter() { - assert_eq!(read_block_size(it.0.clone()), it.1); + for it in test_data.iter() { + assert_eq!(read_block_size(it.0.as_deref()), it.1); } } } diff --git a/src/uu/echo/src/echo.rs b/src/uu/echo/src/echo.rs index 4d38d7748..56cd967f4 100644 --- a/src/uu/echo/src/echo.rs +++ b/src/uu/echo/src/echo.rs @@ -13,6 +13,7 @@ use clap::{crate_version, App, Arg}; use std::io::{self, Write}; use std::iter::Peekable; use std::str::Chars; +use uucore::InvalidEncodingHandling; const NAME: &str = "echo"; const SUMMARY: &str = "display a line of text"; @@ -113,6 +114,9 @@ fn print_escaped(input: &str, mut output: impl Write) -> io::Result { } pub fn uumain(args: impl uucore::Args) -> i32 { + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .name(NAME) // TrailingVarArg specifies the final positional argument is a VarArg diff --git a/src/uu/expr/src/expr.rs b/src/uu/expr/src/expr.rs index fee85dfe1..5d63bed80 100644 --- a/src/uu/expr/src/expr.rs +++ b/src/uu/expr/src/expr.rs @@ -8,6 +8,8 @@ #[macro_use] extern crate uucore; +use uucore::InvalidEncodingHandling; + mod syntax_tree; mod tokens; @@ -15,7 +17,9 @@ static NAME: &str = "expr"; static VERSION: &str = env!("CARGO_PKG_VERSION"); pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); // For expr utility we do not want getopts. // The following usage should work without escaping hyphens: `expr -15 = 1 + 2 \* \( 3 - -4 \)` @@ -51,7 +55,7 @@ fn print_expr_error(expr_error: &str) -> ! { crash!(2, "{}", expr_error) } -fn evaluate_ast(maybe_ast: Result, String>) -> Result { +fn evaluate_ast(maybe_ast: Result, String>) -> Result { if maybe_ast.is_err() { Err(maybe_ast.err().unwrap()) } else { diff --git a/src/uu/expr/src/syntax_tree.rs b/src/uu/expr/src/syntax_tree.rs index 3381c29bd..a75f4c742 100644 --- a/src/uu/expr/src/syntax_tree.rs +++ b/src/uu/expr/src/syntax_tree.rs @@ -17,10 +17,10 @@ use onig::{Regex, RegexOptions, Syntax}; use crate::tokens::Token; type TokenStack = Vec<(usize, Token)>; -pub type OperandsList = Vec>; +pub type OperandsList = Vec>; #[derive(Debug)] -pub enum ASTNode { +pub enum AstNode { Leaf { token_idx: usize, value: String, @@ -31,7 +31,7 @@ pub enum ASTNode { operands: OperandsList, }, } -impl ASTNode { +impl AstNode { fn debug_dump(&self) { self.debug_dump_impl(1); } @@ -40,7 +40,7 @@ impl ASTNode { print!("\t",); } match *self { - ASTNode::Leaf { + AstNode::Leaf { ref token_idx, ref value, } => println!( @@ -49,7 +49,7 @@ impl ASTNode { token_idx, self.evaluate() ), - ASTNode::Node { + AstNode::Node { ref token_idx, ref op_type, ref operands, @@ -67,23 +67,23 @@ impl ASTNode { } } - fn new_node(token_idx: usize, op_type: &str, operands: OperandsList) -> Box { - Box::new(ASTNode::Node { + fn new_node(token_idx: usize, op_type: &str, operands: OperandsList) -> Box { + Box::new(AstNode::Node { token_idx, op_type: op_type.into(), operands, }) } - fn new_leaf(token_idx: usize, value: &str) -> Box { - Box::new(ASTNode::Leaf { + fn new_leaf(token_idx: usize, value: &str) -> Box { + Box::new(AstNode::Leaf { token_idx, value: value.into(), }) } pub fn evaluate(&self) -> Result { match *self { - ASTNode::Leaf { ref value, .. } => Ok(value.clone()), - ASTNode::Node { ref op_type, .. } => match self.operand_values() { + AstNode::Leaf { ref value, .. } => Ok(value.clone()), + AstNode::Node { ref op_type, .. } => match self.operand_values() { Err(reason) => Err(reason), Ok(operand_values) => match op_type.as_ref() { "+" => infix_operator_two_ints( @@ -153,7 +153,7 @@ impl ASTNode { ":" | "match" => operator_match(&operand_values), "length" => Ok(prefix_operator_length(&operand_values)), "index" => Ok(prefix_operator_index(&operand_values)), - "substr" => prefix_operator_substr(&operand_values), + "substr" => Ok(prefix_operator_substr(&operand_values)), _ => Err(format!("operation not implemented: {}", op_type)), }, @@ -161,7 +161,7 @@ impl ASTNode { } } pub fn operand_values(&self) -> Result, String> { - if let ASTNode::Node { ref operands, .. } = *self { + if let AstNode::Node { ref operands, .. } = *self { let mut out = Vec::with_capacity(operands.len()); for operand in operands { match operand.evaluate() { @@ -178,7 +178,7 @@ impl ASTNode { pub fn tokens_to_ast( maybe_tokens: Result, String>, -) -> Result, String> { +) -> Result, String> { if maybe_tokens.is_err() { Err(maybe_tokens.err().unwrap()) } else { @@ -212,7 +212,7 @@ pub fn tokens_to_ast( } } -fn maybe_dump_ast(result: &Result, String>) { +fn maybe_dump_ast(result: &Result, String>) { use std::env; if let Ok(debug_var) = env::var("EXPR_DEBUG_AST") { if debug_var == "1" { @@ -238,11 +238,11 @@ fn maybe_dump_rpn(rpn: &TokenStack) { } } -fn ast_from_rpn(rpn: &mut TokenStack) -> Result, String> { +fn ast_from_rpn(rpn: &mut TokenStack) -> Result, String> { match rpn.pop() { None => Err("syntax error (premature end of expression)".to_owned()), - Some((token_idx, Token::Value { value })) => Ok(ASTNode::new_leaf(token_idx, &value)), + Some((token_idx, Token::Value { value })) => Ok(AstNode::new_leaf(token_idx, &value)), Some((token_idx, Token::InfixOp { value, .. })) => { maybe_ast_node(token_idx, &value, 2, rpn) @@ -262,7 +262,7 @@ fn maybe_ast_node( op_type: &str, arity: usize, rpn: &mut TokenStack, -) -> Result, String> { +) -> Result, String> { let mut operands = Vec::with_capacity(arity); for _ in 0..arity { match ast_from_rpn(rpn) { @@ -271,7 +271,7 @@ fn maybe_ast_node( } } operands.reverse(); - Ok(ASTNode::new_node(token_idx, op_type, operands)) + Ok(AstNode::new_node(token_idx, op_type, operands)) } fn move_rest_of_ops_to_out( @@ -522,35 +522,23 @@ fn prefix_operator_index(values: &[String]) -> String { "0".to_string() } -fn prefix_operator_substr(values: &[String]) -> Result { +fn prefix_operator_substr(values: &[String]) -> String { assert!(values.len() == 3); let subj = &values[0]; - let mut idx = match values[1].parse::() { - Ok(i) => i, - Err(_) => return Err("expected integer as POS arg to 'substr'".to_string()), + let idx = match values[1] + .parse::() + .ok() + .and_then(|v| v.checked_sub(1)) + { + Some(i) => i, + None => return String::new(), }; - let mut len = match values[2].parse::() { + let len = match values[2].parse::() { Ok(i) => i, - Err(_) => return Err("expected integer as LENGTH arg to 'substr'".to_string()), + Err(_) => return String::new(), }; - if idx <= 0 || len <= 0 { - return Ok("".to_string()); - } - - let mut out_str = String::new(); - for ch in subj.chars() { - idx -= 1; - if idx <= 0 { - if len <= 0 { - break; - } - len -= 1; - - out_str.push(ch); - } - } - Ok(out_str) + subj.chars().skip(idx).take(len).collect() } fn bool_as_int(b: bool) -> i64 { diff --git a/src/uu/expr/src/tokens.rs b/src/uu/expr/src/tokens.rs index b65b0d482..6056e4ba1 100644 --- a/src/uu/expr/src/tokens.rs +++ b/src/uu/expr/src/tokens.rs @@ -63,12 +63,7 @@ impl Token { } } fn is_a_close_paren(&self) -> bool { - #[allow(clippy::match_like_matches_macro)] - // `matches!(...)` macro not stabilized until rust v1.42 - match *self { - Token::ParClose => true, - _ => false, - } + matches!(*self, Token::ParClose) } } diff --git a/src/uu/factor/BENCHMARKING.md b/src/uu/factor/BENCHMARKING.md new file mode 100644 index 000000000..e174d62b7 --- /dev/null +++ b/src/uu/factor/BENCHMARKING.md @@ -0,0 +1,116 @@ +# Benchmarking `factor` + +The benchmarks for `factor` are located under `tests/benches/factor` +and can be invoked with `cargo bench` in that directory. + +They are located outside the `uu_factor` crate, as they do not comply +with the project's minimum supported Rust version, *i.e.* may require +a newer version of `rustc`. + + +## Microbenchmarking deterministic functions + +We currently use [`criterion`] to benchmark deterministic functions, +such as `gcd` and `table::factor`. + +However, µbenchmarks are by nature unstable: not only are they specific to +the hardware, operating system version, etc., but they are noisy and affected +by other tasks on the system (browser, compile jobs, etc.), which can cause +`criterion` to report spurious performance improvements and regressions. + +This can be mitigated by getting as close to [idealised conditions][lemire] +as possible: +- minimize the amount of computation and I/O running concurrently to the + benchmark, *i.e.* close your browser and IM clients, don't compile at the + same time, etc. ; +- ensure the CPU's [frequency stays constant] during the benchmark ; +- [isolate a **physical** core], set it to `nohz_full`, and pin the benchmark + to it, so it won't be preempted in the middle of a measurement ; +- disable ASLR by running `setarch -R cargo bench`, so we can compare results + across multiple executions. + + +[`criterion`]: https://bheisler.github.io/criterion.rs/book/index.html +[lemire]: https://lemire.me/blog/2018/01/16/microbenchmarking-calls-for-idealized-conditions/ +[isolate a **physical** core]: https://pyperf.readthedocs.io/en/latest/system.html#isolate-cpus-on-linux +[frequency stays constant]: XXXTODO + + +### Guidance for designing µbenchmarks + +*Note:* this guidance is specific to `factor` and takes its application domain +into account; do not expect it to generalise to other projects. It is based +on Daniel Lemire's [*Microbenchmarking calls for idealized conditions*][lemire], +which I recommend reading if you want to add benchmarks to `factor`. + +1. Select a small, self-contained, deterministic component + `gcd` and `table::factor` are good example of such: + - no I/O or access to external data structures ; + - no call into other components ; + - behaviour is deterministic: no RNG, no concurrency, ... ; + - the test's body is *fast* (~100ns for `gcd`, ~10µs for `factor::table`), + so each sample takes a very short time, minimizing variability and + maximizing the numbers of samples we can take in a given time. + +2. Benchmarks are immutable (once merged in `uutils`) + Modifying a benchmark means previously-collected values cannot meaningfully + be compared, silently giving nonsensical results. If you must modify an + existing benchmark, rename it. + +3. Test common cases + We are interested in overall performance, rather than specific edge-cases; + use **reproducibly-randomised inputs**, sampling from either all possible + input values or some subset of interest. + +4. Use [`criterion`], `criterion::black_box`, ... + `criterion` isn't perfect, but it is also much better than ad-hoc + solutions in each benchmark. + + +## Wishlist + +### Configurable statistical estimators + +`criterion` always uses the arithmetic average as estimator; in µbenchmarks, +where the code under test is fully deterministic and the measurements are +subject to additive, positive noise, [the minimum is more appropriate][lemire]. + + +### CI & reproducible performance testing + +Measuring performance on real hardware is important, as it relates directly +to what users of `factor` experience; however, such measurements are subject +to the constraints of the real-world, and aren't perfectly reproducible. +Moreover, the mitigations for it (described above) aren't achievable in +virtualized, multi-tenant environments such as CI. + +Instead, we could run the µbenchmarks in a simulated CPU with [`cachegrind`], +measure execution “time” in that model (in CI), and use it to detect and report +performance improvements and regressions. + +[`iai`] is an implementation of this idea for Rust. + +[`cachegrind`]: https://www.valgrind.org/docs/manual/cg-manual.html +[`iai`]: https://bheisler.github.io/criterion.rs/book/iai/iai.html + + +### Comparing randomised implementations across multiple inputs + +`factor` is a challenging target for system benchmarks as it combines two +characteristics: + +1. integer factoring algorithms are randomised, with large variance in + execution time ; + +2. various inputs also have large differences in factoring time, that + corresponds to no natural, linear ordering of the inputs. + + +If (1) was untrue (i.e. if execution time wasn't random), we could faithfully +compare 2 implementations (2 successive versions, or `uutils` and GNU) using +a scatter plot, where each axis corresponds to the perf. of one implementation. + +Similarly, without (2) we could plot numbers on the X axis and their factoring +time on the Y axis, using multiple lines for various quantiles. The large +differences in factoring times for successive numbers, mean that such a plot +would be unreadable. diff --git a/src/uu/factor/Cargo.toml b/src/uu/factor/Cargo.toml index 489c713be..eb977760f 100644 --- a/src/uu/factor/Cargo.toml +++ b/src/uu/factor/Cargo.toml @@ -14,23 +14,19 @@ edition = "2018" [build-dependencies] num-traits = "0.2.13" # used in src/numerics.rs, which is included by build.rs - [dependencies] +coz = { version = "0.1.3", optional = true } num-traits = "0.2.13" # Needs at least version 0.2.13 for "OverflowingAdd" -rand = { version="0.7", features=["small_rng"] } -smallvec = { version="0.6.14, < 1.0" } -uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } -uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } +rand = { version = "0.7", features = ["small_rng"] } +smallvec = { version = "0.6.14, < 1.0" } +uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore" } +uucore_procs = { version = ">=0.0.5", package = "uucore_procs", path = "../../uucore_procs" } +clap = "2.33" [dev-dependencies] -criterion = "0.3" paste = "0.1.18" quickcheck = "0.9.2" -rand_chacha = "0.2.2" -[[bench]] -name = "gcd" -harness = false [[bin]] name = "factor" diff --git a/src/uu/factor/src/cli.rs b/src/uu/factor/src/cli.rs index 34bcf6a2d..69a368479 100644 --- a/src/uu/factor/src/cli.rs +++ b/src/uu/factor/src/cli.rs @@ -13,17 +13,21 @@ use std::error::Error; use std::io::{self, stdin, stdout, BufRead, Write}; mod factor; -pub(crate) use factor::*; +use clap::{App, Arg}; +pub use factor::*; mod miller_rabin; pub mod numeric; mod rho; -mod table; +pub mod table; -static SYNTAX: &str = "[OPTION] [NUMBER]..."; -static SUMMARY: &str = "Print the prime factors of the given number(s). - If none are specified, read from standard input."; -static LONG_HELP: &str = ""; +static VERSION: &str = env!("CARGO_PKG_VERSION"); +static SUMMARY: &str = "Print the prime factors of the given NUMBER(s). +If none are specified, read from standard input."; + +mod options { + pub static NUMBER: &str = "NUMBER"; +} fn print_factors_str(num_str: &str, w: &mut impl io::Write) -> Result<(), Box> { num_str @@ -33,11 +37,21 @@ fn print_factors_str(num_str: &str, w: &mut impl io::Write) -> Result<(), Box i32 { - let matches = app!(SYNTAX, SUMMARY, LONG_HELP).parse(args.collect_str()); + let matches = App::new(executable!()) + .version(VERSION) + .about(SUMMARY) + .arg(Arg::with_name(options::NUMBER).multiple(true)) + .get_matches_from(args); let stdout = stdout(); let mut w = io::BufWriter::new(stdout.lock()); - if matches.free.is_empty() { + if let Some(values) = matches.values_of(options::NUMBER) { + for number in values { + if let Err(e) = print_factors_str(number, &mut w) { + show_warning!("{}: {}", number, e); + } + } + } else { let stdin = stdin(); for line in stdin.lock().lines() { @@ -47,12 +61,6 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } } } - } else { - for number in &matches.free { - if let Err(e) = print_factors_str(number, &mut w) { - show_warning!("{}: {}", number, e); - } - } } if let Err(e) = w.flush() { diff --git a/src/uu/factor/src/factor.rs b/src/uu/factor/src/factor.rs index 7d2e16a11..b279de7fc 100644 --- a/src/uu/factor/src/factor.rs +++ b/src/uu/factor/src/factor.rs @@ -125,6 +125,8 @@ fn _factor(num: u64, f: Factors) -> Factors let n = A::new(num); let divisor = match miller_rabin::test::(n) { Prime => { + #[cfg(feature = "coz")] + coz::progress!("factor found"); let mut r = f; r.push(num); return r; @@ -139,6 +141,8 @@ fn _factor(num: u64, f: Factors) -> Factors } pub fn factor(mut n: u64) -> Factors { + #[cfg(feature = "coz")] + coz::begin!("factorization"); let mut factors = Factors::one(); if n < 2 { @@ -152,16 +156,24 @@ pub fn factor(mut n: u64) -> Factors { } if n == 1 { + #[cfg(feature = "coz")] + coz::end!("factorization"); return factors; } - let (factors, n) = table::factor(n, factors); + table::factor(&mut n, &mut factors); - if n < (1 << 32) { + #[allow(clippy::let_and_return)] + let r = if n < (1 << 32) { _factor::>(n, factors) } else { _factor::>(n, factors) - } + }; + + #[cfg(feature = "coz")] + coz::end!("factorization"); + + r } #[cfg(test)] @@ -227,9 +239,13 @@ mod tests { } #[cfg(test)] -impl quickcheck::Arbitrary for Factors { - fn arbitrary(gen: &mut G) -> Self { - use rand::Rng; +use rand::{ + distributions::{Distribution, Standard}, + Rng, +}; +#[cfg(test)] +impl Distribution for Standard { + fn sample(&self, rng: &mut R) -> Factors { let mut f = Factors::one(); let mut g = 1u64; let mut n = u64::MAX; @@ -240,7 +256,7 @@ impl quickcheck::Arbitrary for Factors { // See Generating Random Factored Numbers, Easily, J. Cryptology (2003) 'attempt: loop { while n > 1 { - n = gen.gen_range(1, n); + n = rng.gen_range(1, n); if miller_rabin::is_prime(n) { if let Some(h) = g.checked_mul(n) { f.push(n); @@ -257,6 +273,13 @@ impl quickcheck::Arbitrary for Factors { } } +#[cfg(test)] +impl quickcheck::Arbitrary for Factors { + fn arbitrary(g: &mut G) -> Self { + g.gen() + } +} + #[cfg(test)] impl std::ops::BitXor for Factors { type Output = Self; @@ -269,6 +292,6 @@ impl std::ops::BitXor for Factors { } debug_assert_eq!(r.product(), self.product().pow(rhs.into())); - return r; + r } } diff --git a/src/uu/factor/src/table.rs b/src/uu/factor/src/table.rs index d6ef796fc..518d4f241 100644 --- a/src/uu/factor/src/table.rs +++ b/src/uu/factor/src/table.rs @@ -8,15 +8,13 @@ // spell-checker: ignore (ToDO) INVS -use std::num::Wrapping; - use crate::Factors; include!(concat!(env!("OUT_DIR"), "/prime_table.rs")); -pub(crate) fn factor(mut num: u64, mut factors: Factors) -> (Factors, u64) { +pub fn factor(num: &mut u64, factors: &mut Factors) { for &(prime, inv, ceil) in P_INVS_U64 { - if num == 1 { + if *num == 1 { break; } @@ -27,12 +25,14 @@ pub(crate) fn factor(mut num: u64, mut factors: Factors) -> (Factors, u64) { // for a nice explanation. let mut k = 0; loop { - let Wrapping(x) = Wrapping(num) * Wrapping(inv); + let x = num.wrapping_mul(inv); // While prime divides num if x <= ceil { - num = x; + *num = x; k += 1; + #[cfg(feature = "coz")] + coz::progress!("factor found"); } else { if k > 0 { factors.add(prime, k); @@ -41,6 +41,61 @@ pub(crate) fn factor(mut num: u64, mut factors: Factors) -> (Factors, u64) { } } } - - (factors, num) +} + +pub const CHUNK_SIZE: usize = 8; +pub fn factor_chunk(n_s: &mut [u64; CHUNK_SIZE], f_s: &mut [Factors; CHUNK_SIZE]) { + for &(prime, inv, ceil) in P_INVS_U64 { + if n_s[0] == 1 && n_s[1] == 1 && n_s[2] == 1 && n_s[3] == 1 { + break; + } + + for (num, factors) in n_s.iter_mut().zip(f_s.iter_mut()) { + if *num == 1 { + continue; + } + let mut k = 0; + loop { + let x = num.wrapping_mul(inv); + + // While prime divides num + if x <= ceil { + *num = x; + k += 1; + } else { + if k > 0 { + factors.add(prime, k); + } + break; + } + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::Factors; + use quickcheck::quickcheck; + use rand::{rngs::SmallRng, Rng, SeedableRng}; + + quickcheck! { + fn chunk_vs_iter(seed: u64) -> () { + let mut rng = SmallRng::seed_from_u64(seed); + let mut n_c: [u64; CHUNK_SIZE] = rng.gen(); + let mut f_c: [Factors; CHUNK_SIZE] = rng.gen(); + + let mut n_i = n_c.clone(); + let mut f_i = f_c.clone(); + for (n, f) in n_i.iter_mut().zip(f_i.iter_mut()) { + factor(n, f); + } + + factor_chunk(&mut n_c, &mut f_c); + + assert_eq!(n_i, n_c); + assert_eq!(f_i, f_c); + } + } } diff --git a/src/uu/fmt/src/linebreak.rs b/src/uu/fmt/src/linebreak.rs index 50cb6f77f..fe9f8568e 100644 --- a/src/uu/fmt/src/linebreak.rs +++ b/src/uu/fmt/src/linebreak.rs @@ -296,7 +296,7 @@ fn find_kp_breakpoints<'a, T: Iterator>>( (0, 0.0) } else { compute_demerits( - (args.opts.goal - tlen) as isize, + args.opts.goal as isize - tlen as isize, stretch, w.word_nchars as isize, active.prev_rat, diff --git a/src/uu/fmt/src/parasplit.rs b/src/uu/fmt/src/parasplit.rs index f74a25413..71b5f62ec 100644 --- a/src/uu/fmt/src/parasplit.rs +++ b/src/uu/fmt/src/parasplit.rs @@ -264,12 +264,9 @@ impl<'a> ParagraphStream<'a> { return false; } - #[allow(clippy::match_like_matches_macro)] - // `matches!(...)` macro not stabilized until rust v1.42 - l_slice[..colon_posn].chars().all(|x| match x as usize { - y if y < 33 || y > 126 => false, - _ => true, - }) + l_slice[..colon_posn] + .chars() + .all(|x| !matches!(x as usize, y if !(33..=126).contains(&y))) } } } @@ -541,12 +538,7 @@ impl<'a> WordSplit<'a> { } fn is_punctuation(c: char) -> bool { - #[allow(clippy::match_like_matches_macro)] - // `matches!(...)` macro not stabilized until rust v1.42 - match c { - '!' | '.' | '?' => true, - _ => false, - } + matches!(c, '!' | '.' | '?') } } diff --git a/src/uu/fold/src/fold.rs b/src/uu/fold/src/fold.rs index c35e996f2..1f52748f1 100644 --- a/src/uu/fold/src/fold.rs +++ b/src/uu/fold/src/fold.rs @@ -14,6 +14,7 @@ use clap::{App, Arg}; use std::fs::File; use std::io::{stdin, BufRead, BufReader, Read}; use std::path::Path; +use uucore::InvalidEncodingHandling; const TAB_WIDTH: usize = 8; @@ -31,7 +32,9 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let (args, obs_width) = handle_obsolete(&args[..]); let matches = App::new(executable!()) @@ -66,7 +69,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .takes_value(true), ) .arg(Arg::with_name(options::FILE).hidden(true).multiple(true)) - .get_matches_from(args.clone()); + .get_matches_from(args); let bytes = matches.is_present(options::BYTES); let spaces = matches.is_present(options::SPACES); diff --git a/src/uu/hashsum/src/hashsum.rs b/src/uu/hashsum/src/hashsum.rs index ee7d2a0f7..b1ba3c217 100644 --- a/src/uu/hashsum/src/hashsum.rs +++ b/src/uu/hashsum/src/hashsum.rs @@ -51,14 +51,23 @@ struct Options { } fn is_custom_binary(program: &str) -> bool { - #[allow(clippy::match_like_matches_macro)] - // `matches!(...)` macro not stabilized until rust v1.42 - match program { - "md5sum" | "sha1sum" | "sha224sum" | "sha256sum" | "sha384sum" | "sha512sum" - | "sha3sum" | "sha3-224sum" | "sha3-256sum" | "sha3-384sum" | "sha3-512sum" - | "shake128sum" | "shake256sum" | "b2sum" => true, - _ => false, - } + matches!( + program, + "md5sum" + | "sha1sum" + | "sha224sum" + | "sha256sum" + | "sha384sum" + | "sha512sum" + | "sha3sum" + | "sha3-224sum" + | "sha3-256sum" + | "sha3-384sum" + | "sha3-512sum" + | "shake128sum" + | "shake256sum" + | "b2sum" + ) } #[allow(clippy::cognitive_complexity)] @@ -78,7 +87,7 @@ fn detect_algo<'a>( "sha512sum" => ("SHA512", Box::new(Sha512::new()) as Box, 512), "b2sum" => ("BLAKE2", Box::new(Blake2b::new(64)) as Box, 512), "sha3sum" => match matches.value_of("bits") { - Some(bits_str) => match usize::from_str_radix(&bits_str, 10) { + Some(bits_str) => match (&bits_str).parse::() { Ok(224) => ( "SHA3-224", Box::new(Sha3_224::new()) as Box, @@ -128,7 +137,7 @@ fn detect_algo<'a>( 512, ), "shake128sum" => match matches.value_of("bits") { - Some(bits_str) => match usize::from_str_radix(&bits_str, 10) { + Some(bits_str) => match (&bits_str).parse::() { Ok(bits) => ( "SHAKE128", Box::new(Shake128::new()) as Box, @@ -139,7 +148,7 @@ fn detect_algo<'a>( None => crash!(1, "--bits required for SHAKE-128"), }, "shake256sum" => match matches.value_of("bits") { - Some(bits_str) => match usize::from_str_radix(&bits_str, 10) { + Some(bits_str) => match (&bits_str).parse::() { Ok(bits) => ( "SHAKE256", Box::new(Shake256::new()) as Box, @@ -182,7 +191,7 @@ fn detect_algo<'a>( } if matches.is_present("sha3") { match matches.value_of("bits") { - Some(bits_str) => match usize::from_str_radix(&bits_str, 10) { + Some(bits_str) => match (&bits_str).parse::() { Ok(224) => set_or_crash( "SHA3-224", Box::new(Sha3_224::new()) as Box, @@ -226,7 +235,7 @@ fn detect_algo<'a>( } if matches.is_present("shake128") { match matches.value_of("bits") { - Some(bits_str) => match usize::from_str_radix(&bits_str, 10) { + Some(bits_str) => match (&bits_str).parse::() { Ok(bits) => set_or_crash("SHAKE128", Box::new(Shake128::new()), bits), Err(err) => crash!(1, "{}", err), }, @@ -235,7 +244,7 @@ fn detect_algo<'a>( } if matches.is_present("shake256") { match matches.value_of("bits") { - Some(bits_str) => match usize::from_str_radix(&bits_str, 10) { + Some(bits_str) => match (&bits_str).parse::() { Ok(bits) => set_or_crash("SHAKE256", Box::new(Shake256::new()), bits), Err(err) => crash!(1, "{}", err), }, @@ -253,7 +262,7 @@ fn detect_algo<'a>( // TODO: return custom error type fn parse_bit_num(arg: &str) -> Result { - usize::from_str_radix(arg, 10) + arg.parse() } fn is_valid_bit_num(arg: String) -> Result<(), String> { diff --git a/src/uu/head/Cargo.toml b/src/uu/head/Cargo.toml index 3c383cb6f..661052f58 100644 --- a/src/uu/head/Cargo.toml +++ b/src/uu/head/Cargo.toml @@ -16,7 +16,7 @@ path = "src/head.rs" [dependencies] clap = "2.33" -uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } +uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["ringbuffer"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } [[bin]] diff --git a/src/uu/head/src/head.rs b/src/uu/head/src/head.rs index 3500af544..3602b4a73 100644 --- a/src/uu/head/src/head.rs +++ b/src/uu/head/src/head.rs @@ -1,8 +1,8 @@ use clap::{App, Arg}; use std::convert::TryFrom; use std::ffi::OsString; -use std::io::{ErrorKind, Read, Seek, SeekFrom, Write}; -use uucore::{crash, executable, show_error}; +use std::io::{self, ErrorKind, Read, Seek, SeekFrom, Write}; +use uucore::{crash, executable, show_error, show_error_custom_description}; const EXIT_FAILURE: i32 = 1; const EXIT_SUCCESS: i32 = 0; @@ -27,8 +27,12 @@ mod options { pub const ZERO_NAME: &str = "ZERO"; pub const FILES_NAME: &str = "FILE"; } +mod lines; mod parse; mod split; +mod take; +use lines::zlines; +use take::take_all_but; fn app<'a>() -> App<'a, 'a> { App::new(executable!()) @@ -206,38 +210,20 @@ impl Default for HeadOptions { } } -fn rbuf_n_bytes(input: &mut impl std::io::BufRead, n: usize) -> std::io::Result<()> { - if n == 0 { - return Ok(()); - } - let mut readbuf = [0u8; BUF_SIZE]; - let mut i = 0usize; +fn rbuf_n_bytes(input: R, n: usize) -> std::io::Result<()> +where + R: Read, +{ + // Read the first `n` bytes from the `input` reader. + let mut reader = input.take(n as u64); + // Write those bytes to `stdout`. let stdout = std::io::stdout(); let mut stdout = stdout.lock(); - loop { - let read = loop { - match input.read(&mut readbuf) { - Ok(n) => break n, - Err(e) => match e.kind() { - ErrorKind::Interrupted => {} - _ => return Err(e), - }, - } - }; - if read == 0 { - // might be unexpected if - // we haven't read `n` bytes - // but this mirrors GNU's behavior - return Ok(()); - } - stdout.write_all(&readbuf[..read.min(n - i)])?; - i += read.min(n - i); - if i == n { - return Ok(()); - } - } + io::copy(&mut reader, &mut stdout)?; + + Ok(()) } fn rbuf_n_lines(input: &mut impl std::io::BufRead, n: usize, zero: bool) -> std::io::Result<()> { @@ -311,36 +297,22 @@ fn rbuf_but_last_n_bytes(input: &mut impl std::io::BufRead, n: usize) -> std::io } fn rbuf_but_last_n_lines( - input: &mut impl std::io::BufRead, + input: impl std::io::BufRead, n: usize, zero: bool, ) -> std::io::Result<()> { - if n == 0 { - //prints everything - return rbuf_n_bytes(input, std::usize::MAX); + if zero { + let stdout = std::io::stdout(); + let mut stdout = stdout.lock(); + for bytes in take_all_but(zlines(input), n) { + stdout.write_all(&bytes?)?; + } + } else { + for line in take_all_but(input.lines(), n) { + println!("{}", line?); + } } - let mut ringbuf = vec![Vec::new(); n]; - let stdout = std::io::stdout(); - let mut stdout = stdout.lock(); - let mut line = Vec::new(); - let mut lines = 0usize; - split::walk_lines(input, zero, |e| match e { - split::Event::Data(dat) => { - line.extend_from_slice(dat); - Ok(true) - } - split::Event::Line => { - if lines < n { - ringbuf[lines] = std::mem::replace(&mut line, Vec::new()); - lines += 1; - } else { - stdout.write_all(&ringbuf[0])?; - ringbuf.rotate_left(1); - ringbuf[n - 1] = std::mem::replace(&mut line, Vec::new()); - } - Ok(true) - } - }) + Ok(()) } fn head_backwards_file(input: &mut std::fs::File, options: &HeadOptions) -> std::io::Result<()> { @@ -418,12 +390,13 @@ fn head_file(input: &mut std::fs::File, options: &HeadOptions) -> std::io::Resul } } -fn uu_head(options: &HeadOptions) { +fn uu_head(options: &HeadOptions) -> Result<(), u32> { + let mut error_count = 0; let mut first = true; for fname in &options.files { let res = match fname.as_str() { "-" => { - if options.verbose { + if (options.files.len() > 1 && !options.quiet) || options.verbose { if !first { println!(); } @@ -451,53 +424,49 @@ fn uu_head(options: &HeadOptions) { name => { let mut file = match std::fs::File::open(name) { Ok(f) => f, - Err(err) => match err.kind() { - ErrorKind::NotFound => { - crash!( - EXIT_FAILURE, - "head: cannot open '{}' for reading: No such file or directory", - name - ); + Err(err) => { + let prefix = format!("cannot open '{}' for reading", name); + match err.kind() { + ErrorKind::NotFound => { + show_error_custom_description!(prefix, "No such file or directory"); + } + ErrorKind::PermissionDenied => { + show_error_custom_description!(prefix, "Permission denied"); + } + _ => { + show_error_custom_description!(prefix, "{}", err); + } } - ErrorKind::PermissionDenied => { - crash!( - EXIT_FAILURE, - "head: cannot open '{}' for reading: Permission denied", - name - ); - } - _ => { - crash!( - EXIT_FAILURE, - "head: cannot open '{}' for reading: {}", - name, - err - ); - } - }, + error_count += 1; + continue; + } }; if (options.files.len() > 1 && !options.quiet) || options.verbose { + if !first { + println!(); + } println!("==> {} <==", name) } head_file(&mut file, options) } }; if res.is_err() { - if fname.as_str() == "-" { - crash!( - EXIT_FAILURE, - "head: error reading standard input: Input/output error" - ); + let name = if fname.as_str() == "-" { + "standard input" } else { - crash!( - EXIT_FAILURE, - "head: error reading {}: Input/output error", - fname - ); - } + fname + }; + let prefix = format!("error reading {}", name); + show_error_custom_description!(prefix, "Input/output error"); + error_count += 1; } first = false; } + if error_count > 0 { + Err(error_count) + } else { + Ok(()) + } } pub fn uumain(args: impl uucore::Args) -> i32 { @@ -507,9 +476,10 @@ pub fn uumain(args: impl uucore::Args) -> i32 { crash!(EXIT_FAILURE, "head: {}", s); } }; - uu_head(&args); - - EXIT_SUCCESS + match uu_head(&args) { + Ok(_) => EXIT_SUCCESS, + Err(_) => EXIT_FAILURE, + } } #[cfg(test)] @@ -625,7 +595,7 @@ mod tests { assert_eq!(arg_outputs("head"), Ok("head".to_owned())); } #[test] - #[cfg(linux)] + #[cfg(target_os = "linux")] fn test_arg_iterate_bad_encoding() { let invalid = unsafe { std::str::from_utf8_unchecked(b"\x80\x81") }; // this arises from a conversion from OsString to &str diff --git a/src/uu/head/src/lines.rs b/src/uu/head/src/lines.rs new file mode 100644 index 000000000..dcae27bc8 --- /dev/null +++ b/src/uu/head/src/lines.rs @@ -0,0 +1,73 @@ +//! Iterate over zero-terminated lines. +use std::io::BufRead; + +/// The zero byte, representing the null character. +const ZERO: u8 = 0; + +/// Returns an iterator over the lines of the given reader. +/// +/// The iterator returned from this function will yield instances of +/// [`io::Result`]<[`Vec`]<[`u8`]>>, representing the bytes of the line +/// *including* the null character (with the possible exception of the +/// last line, which may not have one). +/// +/// # Examples +/// +/// ```rust,ignore +/// use std::io::Cursor; +/// +/// let cursor = Cursor::new(b"x\0y\0z\0"); +/// let mut iter = zlines(cursor).map(|l| l.unwrap()); +/// assert_eq!(iter.next(), Some(b"x\0".to_vec())); +/// assert_eq!(iter.next(), Some(b"y\0".to_vec())); +/// assert_eq!(iter.next(), Some(b"z\0".to_vec())); +/// assert_eq!(iter.next(), None); +/// ``` +pub fn zlines(buf: B) -> ZLines { + ZLines { buf } +} + +/// An iterator over the zero-terminated lines of an instance of `BufRead`. +pub struct ZLines { + buf: B, +} + +impl Iterator for ZLines { + type Item = std::io::Result>; + + fn next(&mut self) -> Option>> { + let mut buf = Vec::new(); + match self.buf.read_until(ZERO, &mut buf) { + Ok(0) => None, + Ok(_) => Some(Ok(buf)), + Err(e) => Some(Err(e)), + } + } +} + +#[cfg(test)] +mod tests { + + use crate::lines::zlines; + use std::io::Cursor; + + #[test] + fn test_null_terminated() { + let cursor = Cursor::new(b"x\0y\0z\0"); + let mut iter = zlines(cursor).map(|l| l.unwrap()); + assert_eq!(iter.next(), Some(b"x\0".to_vec())); + assert_eq!(iter.next(), Some(b"y\0".to_vec())); + assert_eq!(iter.next(), Some(b"z\0".to_vec())); + assert_eq!(iter.next(), None); + } + + #[test] + fn test_not_null_terminated() { + let cursor = Cursor::new(b"x\0y\0z"); + let mut iter = zlines(cursor).map(|l| l.unwrap()); + assert_eq!(iter.next(), Some(b"x\0".to_vec())); + assert_eq!(iter.next(), Some(b"y\0".to_vec())); + assert_eq!(iter.next(), Some(b"z".to_vec())); + assert_eq!(iter.next(), None); + } +} diff --git a/src/uu/head/src/take.rs b/src/uu/head/src/take.rs new file mode 100644 index 000000000..94fa012be --- /dev/null +++ b/src/uu/head/src/take.rs @@ -0,0 +1,93 @@ +//! Take all but the last elements of an iterator. +use uucore::ringbuffer::RingBuffer; + +/// Create an iterator over all but the last `n` elements of `iter`. +/// +/// # Examples +/// +/// ```rust,ignore +/// let data = [1, 2, 3, 4, 5]; +/// let n = 2; +/// let mut iter = take_all_but(data.iter(), n); +/// assert_eq!(Some(4), iter.next()); +/// assert_eq!(Some(5), iter.next()); +/// assert_eq!(None, iter.next()); +/// ``` +pub fn take_all_but(iter: I, n: usize) -> TakeAllBut { + TakeAllBut::new(iter, n) +} + +/// An iterator that only iterates over the last elements of another iterator. +pub struct TakeAllBut { + iter: I, + buf: RingBuffer<::Item>, +} + +impl TakeAllBut { + pub fn new(mut iter: I, n: usize) -> TakeAllBut { + // Create a new ring buffer and fill it up. + // + // If there are fewer than `n` elements in `iter`, then we + // exhaust the iterator so that whenever `TakeAllBut::next()` is + // called, it will return `None`, as expected. + let mut buf = RingBuffer::new(n); + for _ in 0..n { + let value = match iter.next() { + None => { + break; + } + Some(x) => x, + }; + buf.push_back(value); + } + TakeAllBut { iter, buf } + } +} + +impl Iterator for TakeAllBut +where + I: Iterator, +{ + type Item = ::Item; + + fn next(&mut self) -> Option<::Item> { + match self.iter.next() { + Some(value) => self.buf.push_back(value), + None => None, + } + } +} + +#[cfg(test)] +mod tests { + + use crate::take::take_all_but; + + #[test] + fn test_fewer_elements() { + let mut iter = take_all_but([0, 1, 2].iter(), 2); + assert_eq!(Some(&0), iter.next()); + assert_eq!(None, iter.next()); + } + + #[test] + fn test_same_number_of_elements() { + let mut iter = take_all_but([0, 1].iter(), 2); + assert_eq!(None, iter.next()); + } + + #[test] + fn test_more_elements() { + let mut iter = take_all_but([0].iter(), 2); + assert_eq!(None, iter.next()); + } + + #[test] + fn test_zero_elements() { + let mut iter = take_all_but([0, 1, 2].iter(), 0); + assert_eq!(Some(&0), iter.next()); + assert_eq!(Some(&1), iter.next()); + assert_eq!(Some(&2), iter.next()); + assert_eq!(None, iter.next()); + } +} diff --git a/src/uu/hostid/src/hostid.rs b/src/uu/hostid/src/hostid.rs index 5a4909c62..551866521 100644 --- a/src/uu/hostid/src/hostid.rs +++ b/src/uu/hostid/src/hostid.rs @@ -11,6 +11,7 @@ extern crate uucore; use libc::c_long; +use uucore::InvalidEncodingHandling; static SYNTAX: &str = "[options]"; static SUMMARY: &str = ""; @@ -22,7 +23,10 @@ extern "C" { } pub fn uumain(args: impl uucore::Args) -> i32 { - app!(SYNTAX, SUMMARY, LONG_HELP).parse(args.collect_str()); + app!(SYNTAX, SUMMARY, LONG_HELP).parse( + args.collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(), + ); hostid(); 0 } diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index a4f1ca6e6..bb51a7606 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -23,9 +23,11 @@ use std::fs; use std::fs::File; use std::os::unix::fs::MetadataExt; use std::path::{Path, PathBuf}; +use std::process::Command; use std::result::Result; const DEFAULT_MODE: u32 = 0o755; +const DEFAULT_STRIP_PROGRAM: &str = "strip"; #[allow(dead_code)] pub struct Behavior { @@ -37,6 +39,9 @@ pub struct Behavior { verbose: bool, preserve_timestamps: bool, compare: bool, + strip: bool, + strip_program: String, + create_leading: bool, } #[derive(Clone, Eq, PartialEq)] @@ -66,7 +71,7 @@ static OPT_BACKUP: &str = "backup"; static OPT_BACKUP_2: &str = "backup2"; static OPT_DIRECTORY: &str = "directory"; static OPT_IGNORED: &str = "ignored"; -static OPT_CREATED: &str = "created"; +static OPT_CREATE_LEADING: &str = "create-leading"; static OPT_GROUP: &str = "group"; static OPT_MODE: &str = "mode"; static OPT_OWNER: &str = "owner"; @@ -129,9 +134,9 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .arg( // TODO implement flag - Arg::with_name(OPT_CREATED) + Arg::with_name(OPT_CREATE_LEADING) .short("D") - .help("(unimplemented) create all leading components of DEST except the last, then copy SOURCE to DEST") + .help("create all leading components of DEST except the last, then copy SOURCE to DEST") ) .arg( Arg::with_name(OPT_GROUP) @@ -164,17 +169,15 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .help("apply access/modification times of SOURCE files to corresponding destination files") ) .arg( - // TODO implement flag Arg::with_name(OPT_STRIP) .short("s") .long(OPT_STRIP) - .help("(unimplemented) strip symbol tables") + .help("strip symbol tables (no action Windows)") ) .arg( - // TODO implement flag Arg::with_name(OPT_STRIP_PROGRAM) .long(OPT_STRIP_PROGRAM) - .help("(unimplemented) program used to strip binaries") + .help("program used to strip binaries (no action Windows)") .value_name("PROGRAM") ) .arg( @@ -264,12 +267,6 @@ fn check_unimplemented<'a>(matches: &ArgMatches) -> Result<(), &'a str> { Err("--backup") } else if matches.is_present(OPT_BACKUP_2) { Err("-b") - } else if matches.is_present(OPT_CREATED) { - Err("-D") - } else if matches.is_present(OPT_STRIP) { - Err("--strip, -s") - } else if matches.is_present(OPT_STRIP_PROGRAM) { - Err("--strip-program") } else if matches.is_present(OPT_SUFFIX) { Err("--suffix, -S") } else if matches.is_present(OPT_TARGET_DIRECTORY) { @@ -304,7 +301,7 @@ fn behavior(matches: &ArgMatches) -> Result { let specified_mode: Option = if matches.is_present(OPT_MODE) { match matches.value_of(OPT_MODE) { - Some(x) => match mode::parse(&x[..], considering_dir) { + Some(x) => match mode::parse(x, considering_dir) { Ok(y) => Some(y), Err(err) => { show_error!("Invalid mode string: {}", err); @@ -339,6 +336,13 @@ fn behavior(matches: &ArgMatches) -> Result { verbose: matches.is_present(OPT_VERBOSE), preserve_timestamps: matches.is_present(OPT_PRESERVE_TIMESTAMPS), compare: matches.is_present(OPT_COMPARE), + strip: matches.is_present(OPT_STRIP), + strip_program: String::from( + matches + .value_of(OPT_STRIP_PROGRAM) + .unwrap_or(DEFAULT_STRIP_PROGRAM), + ), + create_leading: matches.is_present(OPT_CREATE_LEADING), }) } @@ -366,13 +370,13 @@ fn directory(paths: Vec, b: Behavior) -> i32 { // created ancestor directories will have the default mode. Hence it is safe to use // fs::create_dir_all and then only modify the target's dir mode. if let Err(e) = fs::create_dir_all(path) { - show_info!("{}: {}", path.display(), e); + show_error!("{}: {}", path.display(), e); all_successful = false; continue; } if b.verbose { - show_info!("creating directory '{}'", path.display()); + show_error!("creating directory '{}'", path.display()); } } @@ -406,12 +410,35 @@ fn standard(paths: Vec, b: Behavior) -> i32 { .iter() .map(PathBuf::from) .collect::>(); + let target = Path::new(paths.last().unwrap()); - if (target.is_file() || is_new_file_path(target)) && sources.len() == 1 { - copy_file_to_file(&sources[0], &target.to_path_buf(), &b) - } else { + if sources.len() > 1 || (target.exists() && target.is_dir()) { copy_files_into_dir(sources, &target.to_path_buf(), &b) + } else { + if let Some(parent) = target.parent() { + if !parent.exists() && b.create_leading { + if let Err(e) = fs::create_dir_all(parent) { + show_error!("failed to create {}: {}", parent.display(), e); + return 1; + } + + if mode::chmod(&parent, b.mode()).is_err() { + show_error!("failed to chmod {}", parent.display()); + return 1; + } + } + } + + if target.is_file() || is_new_file_path(target) { + copy_file_to_file(&sources[0], &target.to_path_buf(), &b) + } else { + show_error!( + "invalid target {}: No such file or directory", + target.display() + ); + 1 + } } } @@ -425,7 +452,7 @@ fn standard(paths: Vec, b: Behavior) -> i32 { /// _files_ must all exist as non-directories. /// _target_dir_ must be a directory. /// -fn copy_files_into_dir(files: &[PathBuf], target_dir: &PathBuf, b: &Behavior) -> i32 { +fn copy_files_into_dir(files: &[PathBuf], target_dir: &Path, b: &Behavior) -> i32 { if !target_dir.is_dir() { show_error!("target '{}' is not a directory", target_dir.display()); return 1; @@ -434,7 +461,7 @@ fn copy_files_into_dir(files: &[PathBuf], target_dir: &PathBuf, b: &Behavior) -> let mut all_successful = true; for sourcepath in files.iter() { if !sourcepath.exists() { - show_info!( + show_error!( "cannot stat '{}': No such file or directory", sourcepath.display() ); @@ -444,12 +471,12 @@ fn copy_files_into_dir(files: &[PathBuf], target_dir: &PathBuf, b: &Behavior) -> } if sourcepath.is_dir() { - show_info!("omitting directory '{}'", sourcepath.display()); + show_error!("omitting directory '{}'", sourcepath.display()); all_successful = false; continue; } - let mut targetpath = target_dir.clone().to_path_buf(); + let mut targetpath = target_dir.to_path_buf(); let filename = sourcepath.components().last().unwrap(); targetpath.push(filename); @@ -474,7 +501,7 @@ fn copy_files_into_dir(files: &[PathBuf], target_dir: &PathBuf, b: &Behavior) -> /// _file_ must exist as a non-directory. /// _target_ must be a non-directory /// -fn copy_file_to_file(file: &PathBuf, target: &PathBuf, b: &Behavior) -> i32 { +fn copy_file_to_file(file: &Path, target: &Path, b: &Behavior) -> i32 { if copy(file, &target, b).is_err() { 1 } else { @@ -493,7 +520,7 @@ fn copy_file_to_file(file: &PathBuf, target: &PathBuf, b: &Behavior) -> i32 { /// /// If the copy system call fails, we print a verbose error and return an empty error value. /// -fn copy(from: &PathBuf, to: &PathBuf, b: &Behavior) -> Result<(), ()> { +fn copy(from: &Path, to: &Path, b: &Behavior) -> Result<(), ()> { if b.compare && !need_copy(from, to, b) { return Ok(()); } @@ -521,6 +548,21 @@ fn copy(from: &PathBuf, to: &PathBuf, b: &Behavior) -> Result<(), ()> { return Err(()); } + if b.strip && cfg!(not(windows)) { + match Command::new(&b.strip_program).arg(to).output() { + Ok(o) => { + if !o.status.success() { + crash!( + 1, + "strip program failed: {}", + String::from_utf8(o.stderr).unwrap_or_default() + ); + } + } + Err(e) => crash!(1, "strip program execution failed: {}", e), + } + } + if mode::chmod(&to, b.mode()).is_err() { return Err(()); } @@ -537,7 +579,7 @@ fn copy(from: &PathBuf, to: &PathBuf, b: &Behavior) -> Result<(), ()> { }; let gid = meta.gid(); match wrap_chown( - to.as_path(), + to, &meta, Some(owner_id), Some(gid), @@ -546,10 +588,10 @@ fn copy(from: &PathBuf, to: &PathBuf, b: &Behavior) -> Result<(), ()> { ) { Ok(n) => { if !n.is_empty() { - show_info!("{}", n); + show_error!("{}", n); } } - Err(e) => show_info!("{}", e), + Err(e) => show_error!("{}", e), } } @@ -563,13 +605,13 @@ fn copy(from: &PathBuf, to: &PathBuf, b: &Behavior) -> Result<(), ()> { Ok(g) => g, _ => crash!(1, "no such group: {}", b.group), }; - match wrap_chgrp(to.as_path(), &meta, group_id, false, Verbosity::Normal) { + match wrap_chgrp(to, &meta, group_id, false, Verbosity::Normal) { Ok(n) => { if !n.is_empty() { - show_info!("{}", n); + show_error!("{}", n); } } - Err(e) => show_info!("{}", e), + Err(e) => show_error!("{}", e), } } @@ -582,14 +624,14 @@ fn copy(from: &PathBuf, to: &PathBuf, b: &Behavior) -> Result<(), ()> { let modified_time = FileTime::from_last_modification_time(&meta); let accessed_time = FileTime::from_last_access_time(&meta); - match set_file_times(to.as_path(), accessed_time, modified_time) { + match set_file_times(to, accessed_time, modified_time) { Ok(_) => {} - Err(e) => show_info!("{}", e), + Err(e) => show_error!("{}", e), } } if b.verbose { - show_info!("'{}' -> '{}'", from.display(), to.display()); + show_error!("'{}' -> '{}'", from.display(), to.display()); } Ok(()) @@ -611,7 +653,7 @@ fn copy(from: &PathBuf, to: &PathBuf, b: &Behavior) -> Result<(), ()> { /// /// Crashes the program if a nonexistent owner or group is specified in _b_. /// -fn need_copy(from: &PathBuf, to: &PathBuf, b: &Behavior) -> bool { +fn need_copy(from: &Path, to: &Path, b: &Behavior) -> bool { let from_meta = match fs::metadata(from) { Ok(meta) => meta, Err(_) => return true, diff --git a/src/uu/install/src/mode.rs b/src/uu/install/src/mode.rs index a3de40c68..b8d5cd839 100644 --- a/src/uu/install/src/mode.rs +++ b/src/uu/install/src/mode.rs @@ -23,7 +23,7 @@ pub fn parse(mode_string: &str, considering_dir: bool) -> Result { pub fn chmod(path: &Path, mode: u32) -> Result<(), ()> { use std::os::unix::fs::PermissionsExt; fs::set_permissions(path, fs::Permissions::from_mode(mode)).map_err(|err| { - show_info!("{}: chmod failed with error {}", path.display(), err); + show_error!("{}: chmod failed with error {}", path.display(), err); }) } diff --git a/src/uu/kill/Cargo.toml b/src/uu/kill/Cargo.toml index 6b66806bc..e33411c70 100644 --- a/src/uu/kill/Cargo.toml +++ b/src/uu/kill/Cargo.toml @@ -15,6 +15,7 @@ edition = "2018" path = "src/kill.rs" [dependencies] +clap = "2.33" libc = "0.2.42" uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["signals"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/kill/src/kill.rs b/src/uu/kill/src/kill.rs index 9af9c74f7..362f13f18 100644 --- a/src/uu/kill/src/kill.rs +++ b/src/uu/kill/src/kill.rs @@ -10,17 +10,26 @@ #[macro_use] extern crate uucore; +use clap::{App, Arg}; use libc::{c_int, pid_t}; use std::io::Error; use uucore::signals::ALL_SIGNALS; +use uucore::InvalidEncodingHandling; -static SYNTAX: &str = "[options] [...]"; -static SUMMARY: &str = ""; -static LONG_HELP: &str = ""; +static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = "Send signal to processes or list information about signals."; static EXIT_OK: i32 = 0; static EXIT_ERR: i32 = 1; +pub mod options { + pub static PIDS_OR_SIGNALS: &str = "pids_of_signals"; + pub static LIST: &str = "list"; + pub static TABLE: &str = "table"; + pub static TABLE_OLD: &str = "table_old"; + pub static SIGNAL: &str = "signal"; +} + #[derive(Clone, Copy)] pub enum Mode { Kill, @@ -29,42 +38,73 @@ pub enum Mode { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); - + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let (args, obs_signal) = handle_obsolete(args); - let matches = app!(SYNTAX, SUMMARY, LONG_HELP) - .optopt("s", "signal", "specify the to be sent", "SIGNAL") - .optflagopt( - "l", - "list", - "list all signal names, or convert one to a name", - "LIST", - ) - .optflag("L", "table", "list all signal names in a nice table") - .parse(args); - let mode = if matches.opt_present("table") { + let usage = format!("{} [OPTIONS]... PID...", executable!()); + let matches = App::new(executable!()) + .version(VERSION) + .about(ABOUT) + .usage(&usage[..]) + .arg( + Arg::with_name(options::LIST) + .short("l") + .long(options::LIST) + .help("Lists signals") + .conflicts_with(options::TABLE) + .conflicts_with(options::TABLE_OLD), + ) + .arg( + Arg::with_name(options::TABLE) + .short("t") + .long(options::TABLE) + .help("Lists table of signals"), + ) + .arg(Arg::with_name(options::TABLE_OLD).short("L").hidden(true)) + .arg( + Arg::with_name(options::SIGNAL) + .short("s") + .long(options::SIGNAL) + .help("Sends given signal") + .takes_value(true), + ) + .arg( + Arg::with_name(options::PIDS_OR_SIGNALS) + .hidden(true) + .multiple(true), + ) + .get_matches_from(args); + + let mode = if matches.is_present(options::TABLE) || matches.is_present(options::TABLE_OLD) { Mode::Table - } else if matches.opt_present("list") { + } else if matches.is_present(options::LIST) { Mode::List } else { Mode::Kill }; + let pids_or_signals: Vec = matches + .values_of(options::PIDS_OR_SIGNALS) + .map(|v| v.map(ToString::to_string).collect()) + .unwrap_or_default(); + match mode { Mode::Kill => { - return kill( - &matches - .opt_str("signal") - .unwrap_or_else(|| obs_signal.unwrap_or_else(|| "9".to_owned())), - matches.free, - ) + let sig = match (obs_signal, matches.value_of(options::SIGNAL)) { + (Some(s), Some(_)) => s, // -s takes precedence + (Some(s), None) => s, + (None, Some(s)) => s.to_owned(), + (None, None) => "TERM".to_owned(), + }; + return kill(&sig, &pids_or_signals); } Mode::Table => table(), - Mode::List => list(matches.opt_str("list")), + Mode::List => list(pids_or_signals.get(0).cloned()), } - 0 + EXIT_OK } fn handle_obsolete(mut args: Vec) -> (Vec, Option) { @@ -145,14 +185,14 @@ fn list(arg: Option) { }; } -fn kill(signalname: &str, pids: std::vec::Vec) -> i32 { +fn kill(signalname: &str, pids: &[String]) -> i32 { let mut status = 0; let optional_signal_value = uucore::signals::signal_by_name_or_value(signalname); let signal_value = match optional_signal_value { Some(x) => x, None => crash!(EXIT_ERR, "unknown signal name {}", signalname), }; - for pid in &pids { + for pid in pids { match pid.parse::() { Ok(x) => { if unsafe { libc::kill(x as pid_t, signal_value as c_int) } != 0 { diff --git a/src/uu/link/Cargo.toml b/src/uu/link/Cargo.toml index 13c3453cf..14a6ac7c9 100644 --- a/src/uu/link/Cargo.toml +++ b/src/uu/link/Cargo.toml @@ -18,6 +18,7 @@ path = "src/link.rs" libc = "0.2.42" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } +clap = "2.33" [[bin]] name = "link" diff --git a/src/uu/link/src/link.rs b/src/uu/link/src/link.rs index 51c7acb5f..bd8b33355 100644 --- a/src/uu/link/src/link.rs +++ b/src/uu/link/src/link.rs @@ -8,13 +8,21 @@ #[macro_use] extern crate uucore; +use clap::{App, Arg}; use std::fs::hard_link; use std::io::Error; use std::path::Path; -static SYNTAX: &str = "[OPTIONS] FILE1 FILE2"; -static SUMMARY: &str = "Create a link named FILE2 to FILE1"; -static LONG_HELP: &str = ""; +static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = "Call the link function to create a link named FILE2 to an existing FILE1."; + +pub mod options { + pub static FILES: &str = "FILES"; +} + +fn get_usage() -> String { + format!("{0} FILE1 FILE2", executable!()) +} pub fn normalize_error_message(e: Error) -> String { match e.raw_os_error() { @@ -24,13 +32,27 @@ pub fn normalize_error_message(e: Error) -> String { } pub fn uumain(args: impl uucore::Args) -> i32 { - let matches = app!(SYNTAX, SUMMARY, LONG_HELP).parse(args.collect_str()); - if matches.free.len() != 2 { - crash!(1, "{}", msg_wrong_number_of_arguments!(2)); - } + let usage = get_usage(); + let matches = App::new(executable!()) + .version(VERSION) + .about(ABOUT) + .usage(&usage[..]) + .arg( + Arg::with_name(options::FILES) + .hidden(true) + .required(true) + .min_values(2) + .max_values(2) + .takes_value(true), + ) + .get_matches_from(args); - let old = Path::new(&matches.free[0]); - let new = Path::new(&matches.free[1]); + let files: Vec<_> = matches + .values_of_os(options::FILES) + .unwrap_or_default() + .collect(); + let old = Path::new(files[0]); + let new = Path::new(files[1]); match hard_link(old, new) { Ok(_) => 0, diff --git a/src/uu/ln/src/ln.rs b/src/uu/ln/src/ln.rs index 96a0df813..04358a415 100644 --- a/src/uu/ln/src/ln.rs +++ b/src/uu/ln/src/ln.rs @@ -303,7 +303,7 @@ fn exec(files: &[PathBuf], settings: &Settings) -> i32 { } } -fn link_files_in_dir(files: &[PathBuf], target_dir: &PathBuf, settings: &Settings) -> i32 { +fn link_files_in_dir(files: &[PathBuf], target_dir: &Path, settings: &Settings) -> i32 { if !target_dir.is_dir() { show_error!("target '{}' is not a directory", target_dir.display()); return 1; @@ -329,7 +329,7 @@ fn link_files_in_dir(files: &[PathBuf], target_dir: &PathBuf, settings: &Setting }; } } - target_dir.clone() + target_dir.to_path_buf() } else { match srcpath.as_os_str().to_str() { Some(name) => { @@ -370,7 +370,7 @@ fn link_files_in_dir(files: &[PathBuf], target_dir: &PathBuf, settings: &Setting } } -fn relative_path<'a>(src: &PathBuf, dst: &PathBuf) -> Result> { +fn relative_path<'a>(src: &Path, dst: &Path) -> Result> { let abssrc = canonicalize(src, CanonicalizeMode::Normal)?; let absdst = canonicalize(dst, CanonicalizeMode::Normal)?; let suffix_pos = abssrc @@ -390,7 +390,7 @@ fn relative_path<'a>(src: &PathBuf, dst: &PathBuf) -> Result> { Ok(result.into()) } -fn link(src: &PathBuf, dst: &PathBuf, settings: &Settings) -> Result<()> { +fn link(src: &Path, dst: &Path, settings: &Settings) -> Result<()> { let mut backup_path = None; let source: Cow<'_, Path> = if settings.relative { relative_path(&src, dst)? @@ -453,13 +453,13 @@ fn read_yes() -> bool { } } -fn simple_backup_path(path: &PathBuf, suffix: &str) -> PathBuf { +fn simple_backup_path(path: &Path, suffix: &str) -> PathBuf { let mut p = path.as_os_str().to_str().unwrap().to_owned(); p.push_str(suffix); PathBuf::from(p) } -fn numbered_backup_path(path: &PathBuf) -> PathBuf { +fn numbered_backup_path(path: &Path) -> PathBuf { let mut i: u64 = 1; loop { let new_path = simple_backup_path(path, &format!(".~{}~", i)); @@ -470,7 +470,7 @@ fn numbered_backup_path(path: &PathBuf) -> PathBuf { } } -fn existing_backup_path(path: &PathBuf, suffix: &str) -> PathBuf { +fn existing_backup_path(path: &Path, suffix: &str) -> PathBuf { let test_path = simple_backup_path(path, &".~1~".to_owned()); if test_path.exists() { return numbered_backup_path(path); diff --git a/src/uu/logname/Cargo.toml b/src/uu/logname/Cargo.toml index 416f817d7..4aa4d68f4 100644 --- a/src/uu/logname/Cargo.toml +++ b/src/uu/logname/Cargo.toml @@ -16,6 +16,7 @@ path = "src/logname.rs" [dependencies] libc = "0.2.42" +clap = "2.33" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/logname/src/logname.rs b/src/uu/logname/src/logname.rs index c1f0c31aa..14bf7ef3b 100644 --- a/src/uu/logname/src/logname.rs +++ b/src/uu/logname/src/logname.rs @@ -13,6 +13,9 @@ extern crate uucore; use std::ffi::CStr; +use uucore::InvalidEncodingHandling; + +use clap::App; extern "C" { // POSIX requires using getlogin (or equivalent code) @@ -30,12 +33,24 @@ fn get_userlogin() -> Option { } } -static SYNTAX: &str = ""; static SUMMARY: &str = "Print user's login name"; -static LONG_HELP: &str = ""; +static VERSION: &str = env!("CARGO_PKG_VERSION"); + +fn get_usage() -> String { + String::from(executable!()) +} pub fn uumain(args: impl uucore::Args) -> i32 { - app!(SYNTAX, SUMMARY, LONG_HELP).parse(args.collect_str()); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); + + let usage = get_usage(); + let _ = App::new(executable!()) + .version(VERSION) + .about(SUMMARY) + .usage(&usage[..]) + .get_matches_from(args); match get_userlogin() { Some(userlogin) => println!("{}", userlogin), diff --git a/src/uu/ls/BENCHMARKING.md b/src/uu/ls/BENCHMARKING.md new file mode 100644 index 000000000..b009b703a --- /dev/null +++ b/src/uu/ls/BENCHMARKING.md @@ -0,0 +1,59 @@ +# Benchmarking ls + +ls majorly involves fetching a lot of details (depending upon what details are requested, eg. time/date, inode details, etc) for each path using system calls. Ideally, any system call should be done only once for each of the paths - not adhering to this principle leads to a lot of system call overhead multiplying and bubbling up, especially for recursive ls, therefore it is important to always benchmark multiple scenarios. +This is an overwiew over what was benchmarked, and if you make changes to `ls`, you are encouraged to check +how performance was affected for the workloads listed below. Feel free to add other workloads to the +list that we should improve / make sure not to regress. + +Run `cargo build --release` before benchmarking after you make a change! + +## Simple recursive ls + +- Get a large tree, for example linux kernel source tree. +- Benchmark simple recursive ls with hyperfine: `hyperfine --warmup 2 "target/release/coreutils ls -R tree > /dev/null"`. + +## Recursive ls with all and long options + +- Same tree as above +- Benchmark recursive ls with -al -R options with hyperfine: `hyperfine --warmup 2 "target/release/coreutils ls -al -R tree > /dev/null"`. + +## Comparing with GNU ls + +Hyperfine accepts multiple commands to run and will compare them. To compare performance with GNU ls +duplicate the string you passed to hyperfine but remove the `target/release/coreutils` bit from it. + +Example: `hyperfine --warmup 2 "target/release/coreutils ls -al -R tree > /dev/null"` becomes +`hyperfine --warmup 2 "target/release/coreutils ls -al -R tree > /dev/null" "ls -al -R tree > /dev/null"` +(This assumes GNU ls is installed as `ls`) + +This can also be used to compare with version of ls built before your changes to ensure your change does not regress this. + +Here is a `bash` script for doing this comparison: +```bash +#!/bin/bash +cargo build --no-default-features --features ls --release +args="$@" +hyperfine "ls $args" "target/release/coreutils ls $args" +``` + +**Note**: No localization is currently implemented. This means that the comparison above is not really fair. We can fix this by setting `LC_ALL=C`, so GNU `ls` can ignore localization. + +## Checking system call count + +- Another thing to look at would be system calls count using strace (on linux) or equivalent on other operating systems. +- Example: `strace -c target/release/coreutils ls -al -R tree` + +## Cargo Flamegraph + +With Cargo Flamegraph you can easily make a flamegraph of `ls`: +```bash +cargo flamegraph --cmd coreutils -- ls [additional parameters] +``` + +However, if the `-R` option is given, the output becomes pretty much useless due to recursion. We can fix this by merging all the direct recursive calls with `uniq`, below is a `bash` script that does this. +```bash +#!/bin/bash +cargo build --release --no-default-features --features ls +perf record target/release/coreutils ls "$@" +perf script | uniq | inferno-collapse-perf | inferno-flamegraph > flamegraph.svg +``` \ No newline at end of file diff --git a/src/uu/ls/Cargo.toml b/src/uu/ls/Cargo.toml index dacdc7cd9..ab58a7300 100644 --- a/src/uu/ls/Cargo.toml +++ b/src/uu/ls/Cargo.toml @@ -15,19 +15,22 @@ edition = "2018" path = "src/ls.rs" [dependencies] +locale = "0.2.2" +chrono = "0.4.19" clap = "2.33" -lazy_static = "1.0.1" +unicode-width = "0.1.8" number_prefix = "0.4" term_grid = "0.1.5" termsize = "0.1.6" -time = "0.1.40" -unicode-width = "0.1.5" globset = "0.4.6" -uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["entries", "fs"] } -uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } +lscolors = { version = "0.7.1", features = ["ansi_term"] } +uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore", features = ["entries", "fs"] } +uucore_procs = { version = ">=0.0.5", package = "uucore_procs", path = "../../uucore_procs" } +once_cell = "1.7.2" +atty = "0.2" [target.'cfg(unix)'.dependencies] -atty = "0.2" +lazy_static = "1.4.0" [[bin]] name = "ls" diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index fdc11144a..d467d431a 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -7,41 +7,43 @@ // spell-checker:ignore (ToDO) cpio svgz webm somegroup nlink rmvb xspf +#[macro_use] +extern crate uucore; #[cfg(unix)] #[macro_use] extern crate lazy_static; -#[macro_use] -extern crate uucore; mod quoting_style; mod version_cmp; use clap::{App, Arg}; use globset::{self, Glob, GlobSet, GlobSetBuilder}; +use lscolors::LsColors; use number_prefix::NumberPrefix; +use once_cell::unsync::OnceCell; use quoting_style::{escape_name, QuotingStyle}; -#[cfg(unix)] -use std::collections::HashMap; -use std::fs; -use std::fs::{DirEntry, FileType, Metadata}; -#[cfg(unix)] -use std::os::unix::fs::FileTypeExt; -#[cfg(any(unix, target_os = "redox"))] -use std::os::unix::fs::MetadataExt; #[cfg(windows)] use std::os::windows::fs::MetadataExt; -use std::path::{Path, PathBuf}; +use std::{ + cmp::Reverse, + fs::{self, DirEntry, FileType, Metadata}, + io::{stdout, BufWriter, Stdout, Write}, + path::{Path, PathBuf}, + process::exit, + time::{SystemTime, UNIX_EPOCH}, +}; #[cfg(unix)] -use std::time::Duration; -use std::time::{SystemTime, UNIX_EPOCH}; -use std::{cmp::Reverse, process::exit}; +use std::{ + collections::HashMap, + os::unix::fs::{FileTypeExt, MetadataExt}, + time::Duration, +}; use term_grid::{Cell, Direction, Filling, Grid, GridOptions}; -use time::{strftime, Timespec}; -#[cfg(unix)] + use unicode_width::UnicodeWidthStr; #[cfg(unix)] -use uucore::libc::{mode_t, S_ISGID, S_ISUID, S_ISVTX, S_IWOTH, S_IXGRP, S_IXOTH, S_IXUSR}; +use uucore::libc::{S_IXGRP, S_IXOTH, S_IXUSR}; static VERSION: &str = env!("CARGO_PKG_VERSION"); static ABOUT: &str = " @@ -49,35 +51,13 @@ static ABOUT: &str = " the command line, expect that it will ignore files and directories whose names start with '.' "; +static AFTER_HELP: &str = "The TIME_STYLE argument can be full-iso, long-iso, iso. +Also the TIME_STYLE environment variable sets the default style to use."; fn get_usage() -> String { format!("{0} [OPTION]... [FILE]...", executable!()) } -#[cfg(unix)] -static DEFAULT_COLORS: &str = "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:"; - -#[cfg(unix)] -lazy_static! { - static ref LS_COLORS: String = - std::env::var("LS_COLORS").unwrap_or_else(|_| DEFAULT_COLORS.to_string()); - static ref COLOR_MAP: HashMap<&'static str, &'static str> = { - let codes = LS_COLORS.split(':'); - let mut map = HashMap::new(); - for c in codes { - let p: Vec<_> = c.splitn(2, '=').collect(); - if p.len() == 2 { - map.insert(p[0], p[1]); - } - } - map - }; - static ref RESET_CODE: &'static str = COLOR_MAP.get("rs").unwrap_or(&"0"); - static ref LEFT_CODE: &'static str = COLOR_MAP.get("lc").unwrap_or(&"\x1b["); - static ref RIGHT_CODE: &'static str = COLOR_MAP.get("rc").unwrap_or(&"m"); - static ref END_CODE: &'static str = COLOR_MAP.get("ec").unwrap_or(&""); -} - pub mod options { pub mod format { pub static ONELINE: &str = "1"; @@ -98,6 +78,7 @@ pub mod options { pub static TIME: &str = "t"; pub static NONE: &str = "U"; pub static VERSION: &str = "v"; + pub static EXTENSION: &str = "X"; } pub mod time { pub static ACCESS: &str = "u"; @@ -113,13 +94,16 @@ pub mod options { pub static C: &str = "quote-name"; } pub static QUOTING_STYLE: &str = "quoting-style"; - pub mod indicator_style { - pub static NONE: &str = "none"; - pub static SLASH: &str = "slash"; + pub static SLASH: &str = "p"; pub static FILE_TYPE: &str = "file-type"; pub static CLASSIFY: &str = "classify"; } + pub mod dereference { + pub static ALL: &str = "dereference"; + pub static ARGS: &str = "dereference-command-line"; + pub static DIR_ARGS: &str = "dereference-command-line-symlink-to-dir"; + } pub static HIDE_CONTROL_CHARS: &str = "hide-control-chars"; pub static SHOW_CONTROL_CHARS: &str = "show-control-chars"; pub static WIDTH: &str = "width"; @@ -130,16 +114,14 @@ pub mod options { pub static TIME: &str = "time"; pub static IGNORE_BACKUPS: &str = "ignore-backups"; pub static DIRECTORY: &str = "directory"; - pub static CLASSIFY: &str = "classify"; - pub static FILE_TYPE: &str = "file-type"; - pub static SLASH: &str = "p"; pub static INODE: &str = "inode"; - pub static DEREFERENCE: &str = "dereference"; pub static REVERSE: &str = "reverse"; pub static RECURSIVE: &str = "recursive"; pub static COLOR: &str = "color"; pub static PATHS: &str = "paths"; pub static INDICATOR_STYLE: &str = "indicator-style"; + pub static TIME_STYLE: &str = "time-style"; + pub static FULL_TIME: &str = "full-time"; pub static HIDE: &str = "hide"; pub static IGNORE: &str = "ignore"; } @@ -159,6 +141,7 @@ enum Sort { Size, Time, Version, + Extension, } enum SizeFormat { @@ -178,6 +161,22 @@ enum Time { Modification, Access, Change, + Birth, +} + +#[derive(Debug)] +enum TimeStyle { + FullIso, + LongIso, + Iso, + Locale, +} + +enum Dereference { + None, + DirArgs, + Args, + All, } #[derive(PartialEq, Eq)] @@ -194,19 +193,19 @@ struct Config { sort: Sort, recursive: bool, reverse: bool, - dereference: bool, + dereference: Dereference, ignore_patterns: GlobSet, size_format: SizeFormat, directory: bool, time: Time, #[cfg(unix)] inode: bool, - #[cfg(unix)] - color: bool, + color: Option, long: LongFormat, width: Option, quoting_style: QuotingStyle, indicator_style: IndicatorStyle, + time_style: TimeStyle, } // Fields that can be removed or added to the long format @@ -267,6 +266,7 @@ impl Config { options::format::LONG_NO_OWNER, options::format::LONG_NO_GROUP, options::format::LONG_NUMERIC_UID_GID, + options::FULL_TIME, ] .iter() .flat_map(|opt| options.indices_of(opt)) @@ -296,6 +296,7 @@ impl Config { "time" => Sort::Time, "size" => Sort::Size, "version" => Sort::Version, + "extension" => Sort::Extension, // below should never happen as clap already restricts the values. _ => unreachable!("Invalid field for --sort"), } @@ -307,6 +308,8 @@ impl Config { Sort::None } else if options.is_present(options::sort::VERSION) { Sort::Version + } else if options.is_present(options::sort::EXTENSION) { + Sort::Extension } else { Sort::Name }; @@ -315,6 +318,7 @@ impl Config { match field { "ctime" | "status" => Time::Change, "access" | "atime" | "use" => Time::Access, + "birth" | "creation" => Time::Birth, // below should never happen as clap already restricts the values. _ => unreachable!("Invalid field for --time"), } @@ -326,8 +330,7 @@ impl Config { Time::Modification }; - #[cfg(unix)] - let color = match options.value_of(options::COLOR) { + let needs_color = match options.value_of(options::COLOR) { None => options.is_present(options::COLOR), Some(val) => match val { "" | "always" | "yes" | "force" => true, @@ -336,6 +339,12 @@ impl Config { }, }; + let color = if needs_color { + Some(LsColors::from_env().unwrap_or_default()) + } else { + None + }; + let size_format = if options.is_present(options::size::HUMAN_READABLE) { SizeFormat::Binary } else if options.is_present(options::size::SI) { @@ -370,6 +379,7 @@ impl Config { }) .or_else(|| termsize::get().map(|s| s.cols)); + #[allow(clippy::needless_bool)] let show_control = if options.is_present(options::HIDE_CONTROL_CHARS) { false } else if options.is_present(options::SHOW_CONTROL_CHARS) { @@ -436,24 +446,40 @@ impl Config { "slash" => IndicatorStyle::Slash, &_ => IndicatorStyle::None, } - } else if options.is_present(options::indicator_style::NONE) { - IndicatorStyle::None - } else if options.is_present(options::indicator_style::CLASSIFY) - || options.is_present(options::CLASSIFY) - { + } else if options.is_present(options::indicator_style::CLASSIFY) { IndicatorStyle::Classify - } else if options.is_present(options::indicator_style::SLASH) - || options.is_present(options::SLASH) - { + } else if options.is_present(options::indicator_style::SLASH) { IndicatorStyle::Slash - } else if options.is_present(options::indicator_style::FILE_TYPE) - || options.is_present(options::FILE_TYPE) - { + } else if options.is_present(options::indicator_style::FILE_TYPE) { IndicatorStyle::FileType } else { IndicatorStyle::None }; + let time_style = if let Some(field) = options.value_of(options::TIME_STYLE) { + //If both FULL_TIME and TIME_STYLE are present + //The one added last is dominant + if options.is_present(options::FULL_TIME) + && options.indices_of(options::FULL_TIME).unwrap().last() + > options.indices_of(options::TIME_STYLE).unwrap().last() + { + TimeStyle::FullIso + } else { + //Clap handles the env variable "TIME_STYLE" + match field { + "full-iso" => TimeStyle::FullIso, + "long-iso" => TimeStyle::LongIso, + "iso" => TimeStyle::Iso, + "locale" => TimeStyle::Locale, + // below should never happen as clap already restricts the values. + _ => unreachable!("Invalid field for --time-style"), + } + } + } else if options.is_present(options::FULL_TIME) { + TimeStyle::FullIso + } else { + TimeStyle::Locale + }; let mut ignore_patterns = GlobSetBuilder::new(); if options.is_present(options::IGNORE_BACKUPS) { ignore_patterns.add(Glob::new("*~").unwrap()); @@ -480,20 +506,38 @@ impl Config { } } + if files == Files::Normal { + ignore_patterns.add(Glob::new(".*").unwrap()); + } + let ignore_patterns = ignore_patterns.build().unwrap(); + let dereference = if options.is_present(options::dereference::ALL) { + Dereference::All + } else if options.is_present(options::dereference::ARGS) { + Dereference::Args + } else if options.is_present(options::dereference::DIR_ARGS) { + Dereference::DirArgs + } else if options.is_present(options::DIRECTORY) + || indicator_style == IndicatorStyle::Classify + || format == Format::Long + { + Dereference::None + } else { + Dereference::DirArgs + }; + Config { format, files, sort, recursive: options.is_present(options::RECURSIVE), reverse: options.is_present(options::REVERSE), - dereference: options.is_present(options::DEREFERENCE), + dereference, ignore_patterns, size_format, directory: options.is_present(options::DIRECTORY), time, - #[cfg(unix)] color, #[cfg(unix)] inode: options.is_present(options::INODE), @@ -501,12 +545,15 @@ impl Config { width, quoting_style, indicator_style, + time_style, } } } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let usage = get_usage(); @@ -691,10 +738,11 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .long(options::TIME) .help("Show time in :\n\ \taccess time (-u): atime, access, use;\n\ - \tchange time (-t): ctime, status.") + \tchange time (-t): ctime, status.\n\ + \tbirth time: birth, creation;") .value_name("field") .takes_value(true) - .possible_values(&["atime", "access", "use", "ctime", "status"]) + .possible_values(&["atime", "access", "use", "ctime", "status", "birth", "creation"]) .hide_possible_values(true) .require_equals(true) .overrides_with_all(&[ @@ -755,10 +803,10 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .arg( Arg::with_name(options::SORT) .long(options::SORT) - .help("Sort by : name, none (-U), time (-t) or size (-S)") + .help("Sort by : name, none (-U), time (-t), size (-S) or extension (-X)") .value_name("field") .takes_value(true) - .possible_values(&["name", "none", "time", "size", "version"]) + .possible_values(&["name", "none", "time", "size", "version", "extension"]) .require_equals(true) .overrides_with_all(&[ options::SORT, @@ -766,6 +814,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { options::sort::TIME, options::sort::NONE, options::sort::VERSION, + options::sort::EXTENSION, ]) ) .arg( @@ -778,6 +827,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { options::sort::TIME, options::sort::NONE, options::sort::VERSION, + options::sort::EXTENSION, ]) ) .arg( @@ -790,6 +840,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { options::sort::TIME, options::sort::NONE, options::sort::VERSION, + options::sort::EXTENSION, ]) ) .arg( @@ -802,6 +853,20 @@ pub fn uumain(args: impl uucore::Args) -> i32 { options::sort::TIME, options::sort::NONE, options::sort::VERSION, + options::sort::EXTENSION, + ]) + ) + .arg( + Arg::with_name(options::sort::EXTENSION) + .short(options::sort::EXTENSION) + .help("Sort alphabetically by entry extension.") + .overrides_with_all(&[ + options::SORT, + options::sort::SIZE, + options::sort::TIME, + options::sort::NONE, + options::sort::VERSION, + options::sort::EXTENSION, ]) ) .arg( @@ -816,6 +881,49 @@ pub fn uumain(args: impl uucore::Args) -> i32 { options::sort::TIME, options::sort::NONE, options::sort::VERSION, + options::sort::EXTENSION, + ]) + ) + + // Dereferencing + .arg( + Arg::with_name(options::dereference::ALL) + .short("L") + .long(options::dereference::ALL) + .help( + "When showing file information for a symbolic link, show information for the \ + file the link references rather than the link itself.", + ) + .overrides_with_all(&[ + options::dereference::ALL, + options::dereference::DIR_ARGS, + options::dereference::ARGS, + ]) + ) + .arg( + Arg::with_name(options::dereference::DIR_ARGS) + .long(options::dereference::DIR_ARGS) + .help( + "Do not dereference symlinks except when they link to directories and are \ + given as command line arguments.", + ) + .overrides_with_all(&[ + options::dereference::ALL, + options::dereference::DIR_ARGS, + options::dereference::ARGS, + ]) + ) + .arg( + Arg::with_name(options::dereference::ARGS) + .short("H") + .long(options::dereference::ARGS) + .help( + "Do not dereference symlinks except when given as command line arguments.", + ) + .overrides_with_all(&[ + options::dereference::ALL, + options::dereference::DIR_ARGS, + options::dereference::ARGS, ]) ) @@ -877,15 +985,6 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .long(options::INODE) .help("print the index number of each file"), ) - .arg( - Arg::with_name(options::DEREFERENCE) - .short("L") - .long(options::DEREFERENCE) - .help( - "When showing file information for a symbolic link, show information for the \ - file the link references rather than the link itself.", - ), - ) .arg( Arg::with_name(options::REVERSE) .short("r") @@ -923,50 +1022,75 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .takes_value(true) .possible_values(&["none", "slash", "file-type", "classify"]) .overrides_with_all(&[ - options::FILE_TYPE, - options::SLASH, - options::CLASSIFY, + options::indicator_style::FILE_TYPE, + options::indicator_style::SLASH, + options::indicator_style::CLASSIFY, options::INDICATOR_STYLE, ])) .arg( - Arg::with_name(options::CLASSIFY) + Arg::with_name(options::indicator_style::CLASSIFY) .short("F") - .long(options::CLASSIFY) + .long(options::indicator_style::CLASSIFY) .help("Append a character to each file name indicating the file type. Also, for \ regular files that are executable, append '*'. The file type indicators are \ '/' for directories, '@' for symbolic links, '|' for FIFOs, '=' for sockets, \ '>' for doors, and nothing for regular files.") .overrides_with_all(&[ - options::FILE_TYPE, - options::SLASH, - options::CLASSIFY, + options::indicator_style::FILE_TYPE, + options::indicator_style::SLASH, + options::indicator_style::CLASSIFY, options::INDICATOR_STYLE, ]) ) .arg( - Arg::with_name(options::FILE_TYPE) - .long(options::FILE_TYPE) + Arg::with_name(options::indicator_style::FILE_TYPE) + .long(options::indicator_style::FILE_TYPE) .help("Same as --classify, but do not append '*'") .overrides_with_all(&[ - options::FILE_TYPE, - options::SLASH, - options::CLASSIFY, + options::indicator_style::FILE_TYPE, + options::indicator_style::SLASH, + options::indicator_style::CLASSIFY, options::INDICATOR_STYLE, ])) .arg( - Arg::with_name(options::SLASH) - .short(options::SLASH) + Arg::with_name(options::indicator_style::SLASH) + .short(options::indicator_style::SLASH) .help("Append / indicator to directories." ) .overrides_with_all(&[ - options::FILE_TYPE, - options::SLASH, - options::CLASSIFY, + options::indicator_style::FILE_TYPE, + options::indicator_style::SLASH, + options::indicator_style::CLASSIFY, options::INDICATOR_STYLE, ])) + .arg( + //This still needs support for posix-*, +FORMAT + Arg::with_name(options::TIME_STYLE) + .long(options::TIME_STYLE) + .help("time/date format with -l; see TIME_STYLE below") + .value_name("TIME_STYLE") + .env("TIME_STYLE") + .possible_values(&[ + "full-iso", + "long-iso", + "iso", + "locale", + ]) + .overrides_with_all(&[ + options::TIME_STYLE + ]) + ) + .arg( + Arg::with_name(options::FULL_TIME) + .long(options::FULL_TIME) + .overrides_with(options::FULL_TIME) + .help("like -l --time-style=full-iso") + ) // Positional arguments - .arg(Arg::with_name(options::PATHS).multiple(true).takes_value(true)); + .arg(Arg::with_name(options::PATHS).multiple(true).takes_value(true)) + + .after_help(AFTER_HELP); let matches = app.get_matches_from(args); @@ -978,48 +1102,130 @@ pub fn uumain(args: impl uucore::Args) -> i32 { list(locs, Config::from(matches)) } -fn list(locs: Vec, config: Config) -> i32 { - let number_of_locs = locs.len(); +/// Represents a Path along with it's associated data +/// Any data that will be reused several times makes sense to be added to this structure +/// Caching data here helps eliminate redundant syscalls to fetch same information +struct PathData { + // Result got from symlink_metadata() or metadata() based on config + md: OnceCell>, + ft: OnceCell>, + // Name of the file - will be empty for . or .. + display_name: String, + // PathBuf that all above data corresponds to + p_buf: PathBuf, + must_dereference: bool, +} - let mut files = Vec::::new(); - let mut dirs = Vec::::new(); +impl PathData { + fn new( + p_buf: PathBuf, + file_type: Option>, + file_name: Option, + config: &Config, + command_line: bool, + ) -> Self { + // We cannot use `Path::ends_with` or `Path::Components`, because they remove occurrences of '.' + // For '..', the filename is None + let display_name = if let Some(name) = file_name { + name + } else { + let display_osstr = if command_line { + p_buf.as_os_str() + } else { + p_buf + .file_name() + .unwrap_or_else(|| p_buf.iter().next_back().unwrap()) + }; + + display_osstr.to_string_lossy().into_owned() + }; + let must_dereference = match &config.dereference { + Dereference::All => true, + Dereference::Args => command_line, + Dereference::DirArgs => { + if command_line { + if let Ok(md) = p_buf.metadata() { + md.is_dir() + } else { + false + } + } else { + false + } + } + Dereference::None => false, + }; + let ft = match file_type { + Some(ft) => OnceCell::from(ft.ok()), + None => OnceCell::new(), + }; + + Self { + md: OnceCell::new(), + ft, + display_name, + p_buf, + must_dereference, + } + } + + fn md(&self) -> Option<&Metadata> { + self.md + .get_or_init(|| get_metadata(&self.p_buf, self.must_dereference).ok()) + .as_ref() + } + + fn file_type(&self) -> Option<&FileType> { + self.ft + .get_or_init(|| self.md().map(|md| md.file_type())) + .as_ref() + } +} + +fn list(locs: Vec, config: Config) -> i32 { + let mut files = Vec::::new(); + let mut dirs = Vec::::new(); let mut has_failed = false; - for loc in locs { + + let mut out = BufWriter::new(stdout()); + + for loc in &locs { let p = PathBuf::from(&loc); if !p.exists() { show_error!("'{}': {}", &loc, "No such file or directory"); - // We found an error, the return code of ls should not be 0 - // And no need to continue the execution + /* + We found an error, the return code of ls should not be 0 + And no need to continue the execution + */ has_failed = true; continue; } - let mut dir = false; - if p.is_dir() && !config.directory { - dir = true; - if config.format == Format::Long && !config.dereference { - if let Ok(md) = p.symlink_metadata() { - if md.file_type().is_symlink() && !p.ends_with("/") { - dir = false; - } - } + let path_data = PathData::new(p, None, None, &config, true); + + let show_dir_contents = match path_data.file_type() { + Some(ft) => !config.directory && ft.is_dir(), + None => { + has_failed = true; + false } - } - if dir { - dirs.push(p); + }; + + if show_dir_contents { + dirs.push(path_data); } else { - files.push(p); + files.push(path_data); } } sort_entries(&mut files, &config); - display_items(&files, None, &config); + display_items(&files, &config, &mut out); sort_entries(&mut dirs, &config); for dir in dirs { - if number_of_locs > 1 { - println!("\n{}:", dir.to_string_lossy()); + if locs.len() > 1 { + let _ = writeln!(out, "\n{}:", dir.p_buf.display()); } - enter_directory(&dir, &config); + enter_directory(&dir, &config, &mut out); } if has_failed { 1 @@ -1028,21 +1234,27 @@ fn list(locs: Vec, config: Config) -> i32 { } } -fn sort_entries(entries: &mut Vec, config: &Config) { +fn sort_entries(entries: &mut Vec, config: &Config) { match config.sort { Sort::Time => entries.sort_by_key(|k| { Reverse( - get_metadata(k, config) - .ok() + k.md() .and_then(|md| get_system_time(&md, config)) .unwrap_or(UNIX_EPOCH), ) }), - Sort::Size => entries - .sort_by_key(|k| Reverse(get_metadata(k, config).map(|md| md.len()).unwrap_or(0))), + Sort::Size => { + entries.sort_by_key(|k| Reverse(k.md().as_ref().map(|md| md.len()).unwrap_or(0))) + } // The default sort in GNU ls is case insensitive - Sort::Name => entries.sort_by_key(|k| k.to_string_lossy().to_lowercase()), - Sort::Version => entries.sort_by(version_cmp::version_cmp), + Sort::Name => entries.sort_by(|a, b| a.display_name.cmp(&b.display_name)), + Sort::Version => entries.sort_by(|a, b| version_cmp::version_cmp(&a.p_buf, &b.p_buf)), + Sort::Extension => entries.sort_by(|a, b| { + a.p_buf + .extension() + .cmp(&b.p_buf.extension()) + .then(a.p_buf.file_stem().cmp(&b.p_buf.file_stem())) + }), Sort::None => {} } @@ -1055,65 +1267,76 @@ fn sort_entries(entries: &mut Vec, config: &Config) { fn is_hidden(file_path: &DirEntry) -> bool { let metadata = fs::metadata(file_path.path()).unwrap(); let attr = metadata.file_attributes(); - ((attr & 0x2) > 0) || file_path.file_name().to_string_lossy().starts_with('.') -} - -#[cfg(unix)] -fn is_hidden(file_path: &DirEntry) -> bool { - file_path.file_name().to_string_lossy().starts_with('.') + (attr & 0x2) > 0 } fn should_display(entry: &DirEntry, config: &Config) -> bool { let ffi_name = entry.file_name(); - if config.files == Files::Normal && is_hidden(entry) { - return false; + // For unix, the hidden files are already included in the ignore pattern + #[cfg(windows)] + { + if config.files == Files::Normal && is_hidden(entry) { + return false; + } } - if config.ignore_patterns.is_match(&ffi_name) { - return false; - } - true + !config.ignore_patterns.is_match(&ffi_name) } -fn enter_directory(dir: &PathBuf, config: &Config) { - let mut entries: Vec<_> = safe_unwrap!(fs::read_dir(dir).and_then(Iterator::collect)); - - entries.retain(|e| should_display(e, config)); - - let mut entries: Vec<_> = entries.iter().map(DirEntry::path).collect(); - sort_entries(&mut entries, config); - - if config.files == Files::All { - let mut display_entries = entries.clone(); - display_entries.insert(0, dir.join("..")); - display_entries.insert(0, dir.join(".")); - display_items(&display_entries, Some(dir), config); +fn enter_directory(dir: &PathData, config: &Config, out: &mut BufWriter) { + let mut entries: Vec<_> = if config.files == Files::All { + vec![ + PathData::new( + dir.p_buf.clone(), + Some(Ok(*dir.file_type().unwrap())), + Some(".".into()), + config, + false, + ), + PathData::new(dir.p_buf.join(".."), None, Some("..".into()), config, false), + ] } else { - display_items(&entries, Some(dir), config); - } + vec![] + }; + + let mut temp: Vec<_> = safe_unwrap!(fs::read_dir(&dir.p_buf)) + .map(|res| safe_unwrap!(res)) + .filter(|e| should_display(e, config)) + .map(|e| PathData::new(DirEntry::path(&e), Some(e.file_type()), None, config, false)) + .collect(); + + sort_entries(&mut temp, config); + + entries.append(&mut temp); + + display_items(&entries, config, out); if config.recursive { - for e in entries.iter().filter(|p| p.is_dir()) { - println!("\n{}:", e.to_string_lossy()); - enter_directory(&e, config); + for e in entries + .iter() + .skip(if config.files == Files::All { 2 } else { 0 }) + .filter(|p| p.file_type().map(|ft| ft.is_dir()).unwrap_or(false)) + { + let _ = writeln!(out, "\n{}:", e.p_buf.display()); + enter_directory(&e, config, out); } } } -fn get_metadata(entry: &PathBuf, config: &Config) -> std::io::Result { - if config.dereference { +fn get_metadata(entry: &Path, dereference: bool) -> std::io::Result { + if dereference { entry.metadata().or_else(|_| entry.symlink_metadata()) } else { entry.symlink_metadata() } } -fn display_dir_entry_size(entry: &PathBuf, config: &Config) -> (usize, usize) { - if let Ok(md) = get_metadata(entry, config) { +fn display_dir_entry_size(entry: &PathData, config: &Config) -> (usize, usize) { + if let Some(md) = entry.md() { ( display_symlink_count(&md).len(), - display_file_size(&md, config).len(), + display_size_or_rdev(&md, config).len(), ) } else { (0, 0) @@ -1124,67 +1347,97 @@ fn pad_left(string: String, count: usize) -> String { format!("{:>width$}", string, width = count) } -fn display_items(items: &[PathBuf], strip: Option<&Path>, config: &Config) { +fn display_items(items: &[PathData], config: &Config, out: &mut BufWriter) { if config.format == Format::Long { - let (mut max_links, mut max_size) = (1, 1); + let (mut max_links, mut max_width) = (1, 1); + let mut total_size = 0; + for item in items { - let (links, size) = display_dir_entry_size(item, config); + let (links, width) = display_dir_entry_size(item, config); max_links = links.max(max_links); - max_size = size.max(max_size); + max_width = width.max(max_width); + total_size += item.md().map_or(0, |md| get_block_size(md, config)); } + + if total_size > 0 { + let _ = writeln!(out, "total {}", display_size(total_size, config)); + } + for item in items { - display_item_long(item, strip, max_links, max_size, config); + display_item_long(item, max_links, max_width, config, out); } } else { - let names = items.iter().filter_map(|i| { - let md = get_metadata(i, config); - match md { - Err(e) => { - let filename = get_file_name(i, strip); - show_error!("'{}': {}", filename, e); - None - } - Ok(md) => Some(display_file_name(&i, strip, &md, config)), - } - }); + let names = items.iter().filter_map(|i| display_file_name(&i, config)); match (&config.format, config.width) { - (Format::Columns, Some(width)) => display_grid(names, width, Direction::TopToBottom), - (Format::Across, Some(width)) => display_grid(names, width, Direction::LeftToRight), + (Format::Columns, Some(width)) => { + display_grid(names, width, Direction::TopToBottom, out) + } + (Format::Across, Some(width)) => { + display_grid(names, width, Direction::LeftToRight, out) + } (Format::Commas, width_opt) => { let term_width = width_opt.unwrap_or(1); let mut current_col = 0; let mut names = names; if let Some(name) = names.next() { - print!("{}", name.contents); + let _ = write!(out, "{}", name.contents); current_col = name.width as u16 + 2; } for name in names { let name_width = name.width as u16; if current_col + name_width + 1 > term_width { current_col = name_width + 2; - print!(",\n{}", name.contents); + let _ = write!(out, ",\n{}", name.contents); } else { current_col += name_width + 2; - print!(", {}", name.contents); + let _ = write!(out, ", {}", name.contents); } } // Current col is never zero again if names have been printed. // So we print a newline. if current_col > 0 { - println!(); + let _ = writeln!(out,); } } _ => { for name in names { - println!("{}", name.contents); + let _ = writeln!(out, "{}", name.contents); } } } } } -fn display_grid(names: impl Iterator, width: u16, direction: Direction) { +fn get_block_size(md: &Metadata, config: &Config) -> u64 { + /* GNU ls will display sizes in terms of block size + md.len() will differ from this value when the file has some holes + */ + #[cfg(unix)] + { + // hard-coded for now - enabling setting this remains a TODO + let ls_block_size = 1024; + match config.size_format { + SizeFormat::Binary => md.blocks() * 512, + SizeFormat::Decimal => md.blocks() * 512, + SizeFormat::Bytes => md.blocks() * 512 / ls_block_size, + } + } + + #[cfg(not(unix))] + { + let _ = config; + // no way to get block size for windows, fall-back to file size + md.len() + } +} + +fn display_grid( + names: impl Iterator, + width: u16, + direction: Direction, + out: &mut BufWriter, +) { let mut grid = Grid::new(GridOptions { filling: Filling::Spaces(2), direction, @@ -1195,63 +1448,70 @@ fn display_grid(names: impl Iterator, width: u16, direction: Direct } match grid.fit_into_width(width as usize) { - Some(output) => print!("{}", output), + Some(output) => { + let _ = write!(out, "{}", output); + } // Width is too small for the grid, so we fit it in one column - None => print!("{}", grid.fit_into_columns(1)), + None => { + let _ = write!(out, "{}", grid.fit_into_columns(1)); + } } } use uucore::fs::display_permissions; fn display_item_long( - item: &PathBuf, - strip: Option<&Path>, + item: &PathData, max_links: usize, max_size: usize, config: &Config, + out: &mut BufWriter, ) { - let md = match get_metadata(item, config) { - Err(e) => { - let filename = get_file_name(&item, strip); - show_error!("{}: {}", filename, e); + let md = match item.md() { + None => { + show_error!("could not show file: {}", &item.p_buf.display()); return; } - Ok(md) => md, + Some(md) => md, }; #[cfg(unix)] { if config.inode { - print!("{} ", get_inode(&md)); + let _ = write!(out, "{} ", get_inode(&md)); } } - print!( - "{}{} {}", - display_file_type(md.file_type()), - display_permissions(&md), + let _ = write!( + out, + "{} {}", + display_permissions(&md, true), pad_left(display_symlink_count(&md), max_links), ); if config.long.owner { - print!(" {}", display_uname(&md, config)); + let _ = write!(out, " {}", display_uname(&md, config)); } if config.long.group { - print!(" {}", display_group(&md, config)); + let _ = write!(out, " {}", display_group(&md, config)); } // Author is only different from owner on GNU/Hurd, so we reuse // the owner, since GNU/Hurd is not currently supported by Rust. if config.long.author { - print!(" {}", display_uname(&md, config)); + let _ = write!(out, " {}", display_uname(&md, config)); } - println!( + let _ = writeln!( + out, " {} {} {}", - pad_left(display_file_size(&md, config), max_size), + pad_left(display_size_or_rdev(md, config), max_size), display_date(&md, config), - display_file_name(&item, strip, &md, config).contents, + // unwrap is fine because it fails when metadata is not available + // but we already know that it is because it's checked at the + // start of the function. + display_file_name(&item, config).unwrap().contents, ); } @@ -1263,23 +1523,52 @@ fn get_inode(metadata: &Metadata) -> String { // Currently getpwuid is `linux` target only. If it's broken out into // a posix-compliant attribute this can be updated... #[cfg(unix)] +use std::sync::Mutex; +#[cfg(unix)] use uucore::entries; +use uucore::InvalidEncodingHandling; + +#[cfg(unix)] +fn cached_uid2usr(uid: u32) -> String { + lazy_static! { + static ref UID_CACHE: Mutex> = Mutex::new(HashMap::new()); + } + + let mut uid_cache = UID_CACHE.lock().unwrap(); + uid_cache + .entry(uid) + .or_insert_with(|| entries::uid2usr(uid).unwrap_or_else(|_| uid.to_string())) + .clone() +} #[cfg(unix)] fn display_uname(metadata: &Metadata, config: &Config) -> String { if config.long.numeric_uid_gid { metadata.uid().to_string() } else { - entries::uid2usr(metadata.uid()).unwrap_or_else(|_| metadata.uid().to_string()) + cached_uid2usr(metadata.uid()) } } +#[cfg(unix)] +fn cached_gid2grp(gid: u32) -> String { + lazy_static! { + static ref GID_CACHE: Mutex> = Mutex::new(HashMap::new()); + } + + let mut gid_cache = GID_CACHE.lock().unwrap(); + gid_cache + .entry(gid) + .or_insert_with(|| entries::gid2grp(gid).unwrap_or_else(|_| gid.to_string())) + .clone() +} + #[cfg(unix)] fn display_group(metadata: &Metadata, config: &Config) -> String { if config.long.numeric_uid_gid { metadata.gid().to_string() } else { - entries::gid2grp(metadata.gid()).unwrap_or_else(|_| metadata.gid().to_string()) + cached_gid2grp(metadata.gid()) } } @@ -1289,7 +1578,6 @@ fn display_uname(_metadata: &Metadata, _config: &Config) -> String { } #[cfg(not(unix))] -#[allow(unused_variables)] fn display_group(_metadata: &Metadata, _config: &Config) -> String { "somegroup".to_string() } @@ -1302,6 +1590,7 @@ fn get_system_time(md: &Metadata, config: &Config) -> Option { Time::Change => Some(UNIX_EPOCH + Duration::new(md.ctime() as u64, md.ctime_nsec() as u32)), Time::Modification => md.modified().ok(), Time::Access => md.accessed().ok(), + Time::Birth => md.created().ok(), } } @@ -1310,22 +1599,40 @@ fn get_system_time(md: &Metadata, config: &Config) -> Option { match config.time { Time::Modification => md.modified().ok(), Time::Access => md.accessed().ok(), + Time::Birth => md.created().ok(), _ => None, } } -fn get_time(md: &Metadata, config: &Config) -> Option { - let duration = get_system_time(md, config)? - .duration_since(UNIX_EPOCH) - .ok()?; - let secs = duration.as_secs() as i64; - let nsec = duration.subsec_nanos() as i32; - Some(time::at(Timespec::new(secs, nsec))) +fn get_time(md: &Metadata, config: &Config) -> Option> { + let time = get_system_time(md, config)?; + Some(time.into()) } fn display_date(metadata: &Metadata, config: &Config) -> String { match get_time(metadata, config) { - Some(time) => strftime("%F %R", &time).unwrap(), + Some(time) => { + //Date is recent if from past 6 months + //According to GNU a Gregorian year has 365.2425 * 24 * 60 * 60 == 31556952 seconds on the average. + let recent = time + chrono::Duration::seconds(31556952 / 2) > chrono::Local::now(); + + match config.time_style { + TimeStyle::FullIso => time.format("%Y-%m-%d %H:%M:%S.%f %z"), + TimeStyle::LongIso => time.format("%Y-%m-%d %H:%M"), + TimeStyle::Iso => time.format(if recent { "%m-%d %H:%M" } else { "%Y-%m-%d " }), + TimeStyle::Locale => { + let fmt = if recent { "%b %e %H:%M" } else { "%b %e %Y" }; + + //In this version of chrono translating can be done + //The function is chrono::datetime::DateTime::format_localized + //However it's currently still hard to get the current pure-rust-locale + //So it's not yet implemented + + time.format(fmt) + } + } + .to_string() + } None => "???".into(), } } @@ -1354,171 +1661,87 @@ fn format_prefixed(prefixed: NumberPrefix) -> String { } } -fn display_file_size(metadata: &Metadata, config: &Config) -> String { +fn display_size_or_rdev(metadata: &Metadata, config: &Config) -> String { + #[cfg(unix)] + { + let ft = metadata.file_type(); + if ft.is_char_device() || ft.is_block_device() { + let dev: u64 = metadata.rdev(); + let major = (dev >> 8) as u8; + let minor = dev as u8; + return format!("{}, {}", major, minor); + } + } + + display_size(metadata.len(), config) +} + +fn display_size(size: u64, config: &Config) -> String { // NOTE: The human-readable behaviour deviates from the GNU ls. // The GNU ls uses binary prefixes by default. match config.size_format { - SizeFormat::Binary => format_prefixed(NumberPrefix::binary(metadata.len() as f64)), - SizeFormat::Decimal => format_prefixed(NumberPrefix::decimal(metadata.len() as f64)), - SizeFormat::Bytes => metadata.len().to_string(), + SizeFormat::Binary => format_prefixed(NumberPrefix::binary(size as f64)), + SizeFormat::Decimal => format_prefixed(NumberPrefix::decimal(size as f64)), + SizeFormat::Bytes => size.to_string(), } } -fn display_file_type(file_type: FileType) -> String { +#[cfg(unix)] +fn file_is_executable(md: &Metadata) -> bool { + // Mode always returns u32, but the flags might not be, based on the platform + // e.g. linux has u32, mac has u16. + // S_IXUSR -> user has execute permission + // S_IXGRP -> group has execute persmission + // S_IXOTH -> other users have execute permission + md.mode() & ((S_IXUSR | S_IXGRP | S_IXOTH) as u32) != 0 +} + +#[allow(clippy::clippy::collapsible_else_if)] +fn classify_file(path: &PathData) -> Option { + let file_type = path.file_type()?; + if file_type.is_dir() { - "d".to_string() + Some('/') } else if file_type.is_symlink() { - "l".to_string() + Some('@') } else { - "-".to_string() - } -} - -fn get_file_name(name: &Path, strip: Option<&Path>) -> String { - let mut name = match strip { - Some(prefix) => name.strip_prefix(prefix).unwrap_or(name), - None => name, - }; - if name.as_os_str().is_empty() { - name = Path::new("."); - } - name.to_string_lossy().into_owned() -} - -#[cfg(not(unix))] -fn display_file_name( - path: &Path, - strip: Option<&Path>, - metadata: &Metadata, - config: &Config, -) -> Cell { - let mut name = escape_name(get_file_name(path, strip), &config.quoting_style); - let file_type = metadata.file_type(); - - match config.indicator_style { - IndicatorStyle::Classify | IndicatorStyle::FileType => { - if file_type.is_dir() { - name.push('/'); - } - if file_type.is_symlink() { - name.push('@'); - } - } - IndicatorStyle::Slash => { - if file_type.is_dir() { - name.push('/'); - } - } - _ => (), - }; - - if config.format == Format::Long && metadata.file_type().is_symlink() { - if let Ok(target) = path.read_link() { - // We don't bother updating width here because it's not used for long listings - let target_name = target.to_string_lossy().to_string(); - name.push_str(" -> "); - name.push_str(&target_name); - } - } - - name.into() -} - -#[cfg(unix)] -fn color_name(name: String, typ: &str) -> String { - let mut typ = typ; - if !COLOR_MAP.contains_key(typ) { - if typ == "or" { - typ = "ln"; - } else if typ == "mi" { - typ = "fi"; - } - }; - if let Some(code) = COLOR_MAP.get(typ) { - format!( - "{}{}{}{}{}{}{}{}", - *LEFT_CODE, code, *RIGHT_CODE, name, *END_CODE, *LEFT_CODE, *RESET_CODE, *RIGHT_CODE, - ) - } else { - name - } -} - -#[cfg(unix)] -macro_rules! has { - ($mode:expr, $perm:expr) => { - $mode & ($perm as mode_t) != 0 - }; -} - -#[cfg(unix)] -#[allow(clippy::cognitive_complexity)] -fn display_file_name( - path: &Path, - strip: Option<&Path>, - metadata: &Metadata, - config: &Config, -) -> Cell { - let mut name = escape_name(get_file_name(path, strip), &config.quoting_style); - if config.format != Format::Long && config.inode { - name = get_inode(metadata) + " " + &name; - } - let mut width = UnicodeWidthStr::width(&*name); - - let ext; - if config.color || config.indicator_style != IndicatorStyle::None { - let file_type = metadata.file_type(); - - let (code, sym) = if file_type.is_dir() { - ("di", Some('/')) - } else if file_type.is_symlink() { - if path.exists() { - ("ln", Some('@')) - } else { - ("or", Some('@')) - } - } else if file_type.is_socket() { - ("so", Some('=')) - } else if file_type.is_fifo() { - ("pi", Some('|')) - } else if file_type.is_block_device() { - ("bd", None) - } else if file_type.is_char_device() { - ("cd", None) - } else if file_type.is_file() { - let mode = metadata.mode() as mode_t; - let sym = if has!(mode, S_IXUSR | S_IXGRP | S_IXOTH) { + #[cfg(unix)] + { + if file_type.is_socket() { + Some('=') + } else if file_type.is_fifo() { + Some('|') + } else if file_type.is_file() && file_is_executable(path.md()?) { Some('*') } else { None - }; - if has!(mode, S_ISUID) { - ("su", sym) - } else if has!(mode, S_ISGID) { - ("sg", sym) - } else if has!(mode, S_ISVTX) && has!(mode, S_IWOTH) { - ("tw", sym) - } else if has!(mode, S_ISVTX) { - ("st", sym) - } else if has!(mode, S_IWOTH) { - ("ow", sym) - } else if has!(mode, S_IXUSR | S_IXGRP | S_IXOTH) { - ("ex", sym) - } else if metadata.nlink() > 1 { - ("mh", sym) - } else if let Some(e) = path.extension() { - ext = format!("*.{}", e.to_string_lossy()); - (ext.as_str(), None) - } else { - ("fi", None) } - } else { - ("", None) - }; - - if config.color { - name = color_name(name, code); } + #[cfg(not(unix))] + None + } +} + +fn display_file_name(path: &PathData, config: &Config) -> Option { + let mut name = escape_name(&path.display_name, &config.quoting_style); + + #[cfg(unix)] + { + if config.format != Format::Long && config.inode { + name = get_inode(path.md()?) + " " + &name; + } + } + + // We need to keep track of the width ourselves instead of letting term_grid + // infer it because the color codes mess up term_grid's width calculation. + let mut width = name.width(); + + if let Some(ls_colors) = &config.color { + name = color_name(&ls_colors, &path.p_buf, name, path.md()?); + } + + if config.indicator_style != IndicatorStyle::None { + let sym = classify_file(path); let char_opt = match config.indicator_style { IndicatorStyle::Classify => sym, @@ -1545,19 +1768,23 @@ fn display_file_name( } } - if config.format == Format::Long && metadata.file_type().is_symlink() { - if let Ok(target) = path.read_link() { - // We don't bother updating width here because it's not used for long listings - let code = if target.exists() { "fi" } else { "mi" }; - let target_name = color_name(target.to_string_lossy().to_string(), code); + if config.format == Format::Long && path.file_type()?.is_symlink() { + if let Ok(target) = path.p_buf.read_link() { name.push_str(" -> "); - name.push_str(&target_name); + name.push_str(&target.to_string_lossy()); } } - Cell { + Some(Cell { contents: name, width, + }) +} + +fn color_name(ls_colors: &LsColors, path: &Path, name: String, md: &Metadata) -> String { + match ls_colors.style_for_path_with_metadata(path, Some(&md)) { + Some(style) => style.to_ansi_term_style().paint(name).to_string(), + None => name, } } diff --git a/src/uu/ls/src/quoting_style.rs b/src/uu/ls/src/quoting_style.rs index ceb54466c..01bffa7ec 100644 --- a/src/uu/ls/src/quoting_style.rs +++ b/src/uu/ls/src/quoting_style.rs @@ -1,6 +1,6 @@ use std::char::from_digit; -const SPECIAL_SHELL_CHARS: &str = "~`#$&*()\\|[]{};'\"<>?! "; +const SPECIAL_SHELL_CHARS: &str = "~`#$&*()|[]{};\\'\"<>?! "; pub(super) enum QuotingStyle { Shell { @@ -27,12 +27,10 @@ pub(super) enum Quotes { // This implementation is heavily inspired by the std::char::EscapeDefault implementation // in the Rust standard library. This custom implementation is needed because the // characters \a, \b, \e, \f & \v are not recognized by Rust. -#[derive(Clone, Debug)] struct EscapedChar { state: EscapeState, } -#[derive(Clone, Debug)] enum EscapeState { Done, Char(char), @@ -41,14 +39,12 @@ enum EscapeState { Octal(EscapeOctal), } -#[derive(Clone, Debug)] struct EscapeOctal { c: char, state: EscapeOctalState, idx: usize, } -#[derive(Clone, Debug)] enum EscapeOctalState { Done, Backslash, @@ -135,7 +131,6 @@ impl EscapedChar { '\x0B' => Backslash('v'), '\x0C' => Backslash('f'), '\r' => Backslash('r'), - '\\' => Backslash('\\'), '\x00'..='\x1F' | '\x7F' => Octal(EscapeOctal::from(c)), '\'' => match quotes { Quotes::Single => Backslash('\''), @@ -176,7 +171,7 @@ impl Iterator for EscapedChar { } } -fn shell_without_escape(name: String, quotes: Quotes, show_control_chars: bool) -> (String, bool) { +fn shell_without_escape(name: &str, quotes: Quotes, show_control_chars: bool) -> (String, bool) { let mut must_quote = false; let mut escaped_str = String::with_capacity(name.len()); @@ -206,7 +201,7 @@ fn shell_without_escape(name: String, quotes: Quotes, show_control_chars: bool) (escaped_str, must_quote) } -fn shell_with_escape(name: String, quotes: Quotes) -> (String, bool) { +fn shell_with_escape(name: &str, quotes: Quotes) -> (String, bool) { // We need to keep track of whether we are in a dollar expression // because e.g. \b\n is escaped as $'\b\n' and not like $'b'$'n' let mut in_dollar = false; @@ -254,7 +249,7 @@ fn shell_with_escape(name: String, quotes: Quotes) -> (String, bool) { (escaped_str, must_quote) } -pub(super) fn escape_name(name: String, style: &QuotingStyle) -> String { +pub(super) fn escape_name(name: &str, style: &QuotingStyle) -> String { match style { QuotingStyle::Literal { show_control } => { if !show_control { @@ -262,7 +257,7 @@ pub(super) fn escape_name(name: String, style: &QuotingStyle) -> String { .flat_map(|c| EscapedChar::new_literal(c).hide_control()) .collect() } else { - name + name.into() } } QuotingStyle::C { quotes } => { @@ -359,7 +354,7 @@ mod tests { fn check_names(name: &str, map: Vec<(&str, &str)>) { assert_eq!( map.iter() - .map(|(_, style)| escape_name(name.to_string(), &get_style(style))) + .map(|(_, style)| escape_name(name, &get_style(style))) .collect::>(), map.iter() .map(|(correct, _)| correct.to_string()) @@ -511,6 +506,23 @@ mod tests { ], ); + // A control character followed by a special shell character + check_names( + "one\n&two", + vec![ + ("one?&two", "literal"), + ("one\n&two", "literal-show"), + ("one\\n&two", "escape"), + ("\"one\\n&two\"", "c"), + ("'one?&two'", "shell"), + ("'one\n&two'", "shell-show"), + ("'one?&two'", "shell-always"), + ("'one\n&two'", "shell-always-show"), + ("'one'$'\\n''&two'", "shell-escape"), + ("'one'$'\\n''&two'", "shell-escape-always"), + ], + ); + // The first 16 control characters. NUL is also included, even though it is of // no importance for file names. check_names( @@ -627,4 +639,22 @@ mod tests { ], ); } + + #[test] + fn test_backslash() { + // Escaped in C-style, but not in Shell-style escaping + check_names( + "one\\two", + vec![ + ("one\\two", "literal"), + ("one\\two", "literal-show"), + ("one\\\\two", "escape"), + ("\"one\\\\two\"", "c"), + ("'one\\two'", "shell"), + ("\'one\\two\'", "shell-always"), + ("'one\\two'", "shell-escape"), + ("'one\\two'", "shell-escape-always"), + ], + ); + } } diff --git a/src/uu/ls/src/version_cmp.rs b/src/uu/ls/src/version_cmp.rs index 3cd5989f1..4cd39f916 100644 --- a/src/uu/ls/src/version_cmp.rs +++ b/src/uu/ls/src/version_cmp.rs @@ -1,8 +1,9 @@ -use std::{cmp::Ordering, path::PathBuf}; +use std::cmp::Ordering; +use std::path::Path; -/// Compare pathbufs in a way that matches the GNU version sort, meaning that +/// Compare paths in a way that matches the GNU version sort, meaning that /// numbers get sorted in a natural way. -pub(crate) fn version_cmp(a: &PathBuf, b: &PathBuf) -> Ordering { +pub(crate) fn version_cmp(a: &Path, b: &Path) -> Ordering { let a_string = a.to_string_lossy(); let b_string = b.to_string_lossy(); let mut a = a_string.chars().peekable(); diff --git a/src/uu/mkdir/src/mkdir.rs b/src/uu/mkdir/src/mkdir.rs index 6b9fd68ea..861ef5075 100644 --- a/src/uu/mkdir/src/mkdir.rs +++ b/src/uu/mkdir/src/mkdir.rs @@ -101,7 +101,7 @@ fn exec(dirs: Vec, recursive: bool, mode: u16, verbose: bool) -> i32 { if !recursive { if let Some(parent) = path.parent() { if parent != empty && !parent.exists() { - show_info!( + show_error!( "cannot create directory '{}': No such file or directory", path.display() ); @@ -125,7 +125,7 @@ fn mkdir(path: &Path, recursive: bool, mode: u16, verbose: bool) -> i32 { fs::create_dir }; if let Err(e) = create_dir(path) { - show_info!("{}: {}", path.display(), e.to_string()); + show_error!("{}: {}", path.display(), e.to_string()); return 1; } diff --git a/src/uu/mkfifo/src/mkfifo.rs b/src/uu/mkfifo/src/mkfifo.rs index 14701af4d..2fdd4abec 100644 --- a/src/uu/mkfifo/src/mkfifo.rs +++ b/src/uu/mkfifo/src/mkfifo.rs @@ -11,6 +11,7 @@ extern crate uucore; use clap::{App, Arg}; use libc::mkfifo; use std::ffi::CString; +use uucore::InvalidEncodingHandling; static NAME: &str = "mkfifo"; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -25,7 +26,9 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let matches = App::new(executable!()) .name(NAME) diff --git a/src/uu/mknod/Cargo.toml b/src/uu/mknod/Cargo.toml index 2c3ac8fb9..1320e3546 100644 --- a/src/uu/mknod/Cargo.toml +++ b/src/uu/mknod/Cargo.toml @@ -16,7 +16,7 @@ name = "uu_mknod" path = "src/mknod.rs" [dependencies] -getopts = "0.2.18" +clap = "2.33" libc = "^0.2.42" uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["mode"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/mknod/src/mknod.rs b/src/uu/mknod/src/mknod.rs index 1343501bb..e0cf62024 100644 --- a/src/uu/mknod/src/mknod.rs +++ b/src/uu/mknod/src/mknod.rs @@ -5,22 +5,41 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore (ToDO) parsemode makedev sysmacros makenod newmode perror IFBLK IFCHR IFIFO - -mod parsemode; +// spell-checker:ignore (ToDO) parsemode makedev sysmacros perror IFBLK IFCHR IFIFO #[macro_use] extern crate uucore; +use std::ffi::CString; + +use clap::{App, Arg, ArgMatches}; use libc::{dev_t, mode_t}; use libc::{S_IFBLK, S_IFCHR, S_IFIFO, S_IRGRP, S_IROTH, S_IRUSR, S_IWGRP, S_IWOTH, S_IWUSR}; -use getopts::Options; - -use std::ffi::CString; +use uucore::InvalidEncodingHandling; static NAME: &str = "mknod"; static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = "Create the special file NAME of the given TYPE."; +static USAGE: &str = "mknod [OPTION]... NAME TYPE [MAJOR MINOR]"; +static LONG_HELP: &str = "Mandatory arguments to long options are mandatory for short options too. +-m, --mode=MODE set file permission bits to MODE, not a=rw - umask +--help display this help and exit +--version output version information and exit + +Both MAJOR and MINOR must be specified when TYPE is b, c, or u, and they +must be omitted when TYPE is p. If MAJOR or MINOR begins with 0x or 0X, +it is interpreted as hexadecimal; otherwise, if it begins with 0, as octal; +otherwise, as decimal. TYPE may be: + +b create a block (buffered) special file +c, u create a character (unbuffered) special file +p create a FIFO + +NOTE: your shell may have its own version of mknod, which usually supersedes +the version described here. Please refer to your shell's documentation +for details about the options it supports. +"; const MODE_RW_UGO: mode_t = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; @@ -31,168 +50,172 @@ fn makedev(maj: u64, min: u64) -> dev_t { } #[cfg(windows)] -fn _makenod(path: CString, mode: mode_t, dev: dev_t) -> i32 { +fn _makenod(file_name: &str, mode: mode_t, dev: dev_t) -> i32 { panic!("Unsupported for windows platform") } #[cfg(unix)] -fn _makenod(path: CString, mode: mode_t, dev: dev_t) -> i32 { - unsafe { libc::mknod(path.as_ptr(), mode, dev) } +fn _makenod(file_name: &str, mode: mode_t, dev: dev_t) -> i32 { + let c_str = CString::new(file_name).expect("Failed to convert to CString"); + + // the user supplied a mode + let set_umask = mode & MODE_RW_UGO != MODE_RW_UGO; + + unsafe { + // store prev umask + let last_umask = if set_umask { libc::umask(0) } else { 0 }; + + let errno = libc::mknod(c_str.as_ptr(), mode, dev); + + // set umask back to original value + if set_umask { + libc::umask(last_umask); + } + + if errno == -1 { + let c_str = CString::new(NAME).expect("Failed to convert to CString"); + // shows the error from the mknod syscall + libc::perror(c_str.as_ptr()); + } + errno + } } #[allow(clippy::cognitive_complexity)] pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); - - let mut opts = Options::new(); - + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); // Linux-specific options, not implemented // opts.optflag("Z", "", "set the SELinux security context to default type"); // opts.optopt("", "context", "like -Z, or if CTX is specified then set the SELinux or SMACK security context to CTX"); - opts.optopt( - "m", - "mode", - "set file permission bits to MODE, not a=rw - umask", - "MODE", - ); - opts.optflag("", "help", "display this help and exit"); - opts.optflag("", "version", "output version information and exit"); + let matches = App::new(executable!()) + .version(VERSION) + .usage(USAGE) + .after_help(LONG_HELP) + .about(ABOUT) + .arg( + Arg::with_name("mode") + .short("m") + .long("mode") + .value_name("MODE") + .help("set file permission bits to MODE, not a=rw - umask"), + ) + .arg( + Arg::with_name("name") + .value_name("NAME") + .help("name of the new file") + .required(true) + .index(1), + ) + .arg( + Arg::with_name("type") + .value_name("TYPE") + .help("type of the new file (b, c, u or p)") + .required(true) + .validator(valid_type) + .index(2), + ) + .arg( + Arg::with_name("major") + .value_name("MAJOR") + .help("major file type") + .validator(valid_u64) + .index(3), + ) + .arg( + Arg::with_name("minor") + .value_name("MINOR") + .help("minor file type") + .validator(valid_u64) + .index(4), + ) + .get_matches_from(args); - let matches = match opts.parse(&args[1..]) { - Ok(m) => m, - Err(f) => crash!(1, "{}\nTry '{} --help' for more information.", f, NAME), + let mode = match get_mode(&matches) { + Ok(mode) => mode, + Err(err) => { + show_error!("{}", err); + return 1; + } }; - if matches.opt_present("help") { - println!( - "Usage: {0} [OPTION]... NAME TYPE [MAJOR MINOR] + let file_name = matches.value_of("name").expect("Missing argument 'NAME'"); -Mandatory arguments to long options are mandatory for short options too. - -m, --mode=MODE set file permission bits to MODE, not a=rw - umask - --help display this help and exit - --version output version information and exit + // Only check the first character, to allow mnemonic usage like + // 'mknod /dev/rst0 character 18 0'. + let ch = matches + .value_of("type") + .expect("Missing argument 'TYPE'") + .chars() + .next() + .expect("Failed to get the first char"); -Both MAJOR and MINOR must be specified when TYPE is b, c, or u, and they -must be omitted when TYPE is p. If MAJOR or MINOR begins with 0x or 0X, -it is interpreted as hexadecimal; otherwise, if it begins with 0, as octal; -otherwise, as decimal. TYPE may be: - - b create a block (buffered) special file - c, u create a character (unbuffered) special file - p create a FIFO - -NOTE: your shell may have its own version of mknod, which usually supersedes -the version described here. Please refer to your shell's documentation -for details about the options it supports.", - NAME - ); - return 0; - } - - if matches.opt_present("version") { - println!("{} {}", NAME, VERSION); - return 0; - } - - let mut last_umask: mode_t = 0; - let mut newmode: mode_t = MODE_RW_UGO; - if matches.opt_present("mode") { - match parsemode::parse_mode(matches.opt_str("mode")) { - Ok(parsed) => { - if parsed > 0o777 { - show_info!("mode must specify only file permission bits"); - return 1; - } - newmode = parsed; - } - Err(e) => { - show_info!("{}", e); - return 1; - } + if ch == 'p' { + if matches.is_present("major") || matches.is_present("minor") { + eprintln!("Fifos do not have major and minor device numbers."); + eprintln!("Try '{} --help' for more information.", NAME); + 1 + } else { + _makenod(file_name, S_IFIFO | mode, 0) } - unsafe { - last_umask = libc::umask(0); - } - } + } else { + match (matches.value_of("major"), matches.value_of("minor")) { + (None, None) | (_, None) | (None, _) => { + eprintln!("Special files require major and minor device numbers."); + eprintln!("Try '{} --help' for more information.", NAME); + 1 + } + (Some(major), Some(minor)) => { + let major = major.parse::().expect("validated by clap"); + let minor = minor.parse::().expect("validated by clap"); - let mut ret = 0i32; - match matches.free.len() { - 0 => show_usage_error!("missing operand"), - 1 => show_usage_error!("missing operand after ‘{}’", matches.free[0]), - _ => { - let args = &matches.free; - let c_str = CString::new(args[0].as_str()).expect("Failed to convert to CString"); - - // Only check the first character, to allow mnemonic usage like - // 'mknod /dev/rst0 character 18 0'. - let ch = args[1] - .chars() - .next() - .expect("Failed to get the first char"); - - if ch == 'p' { - if args.len() > 2 { - show_info!("{}: extra operand ‘{}’", NAME, args[2]); - if args.len() == 4 { - eprintln!("Fifos do not have major and minor device numbers."); - } - eprintln!("Try '{} --help' for more information.", NAME); - return 1; - } - - ret = _makenod(c_str, S_IFIFO | newmode, 0); - } else { - if args.len() < 4 { - show_info!("missing operand after ‘{}’", args[args.len() - 1]); - if args.len() == 2 { - eprintln!("Special files require major and minor device numbers."); - } - eprintln!("Try '{} --help' for more information.", NAME); - return 1; - } else if args.len() > 4 { - show_usage_error!("extra operand ‘{}’", args[4]); - return 1; - } else if !"bcu".contains(ch) { - show_usage_error!("invalid device type ‘{}’", args[1]); - return 1; - } - - let maj = args[2].parse::(); - let min = args[3].parse::(); - if maj.is_err() { - show_info!("invalid major device number ‘{}’", args[2]); - return 1; - } else if min.is_err() { - show_info!("invalid minor device number ‘{}’", args[3]); - return 1; - } - - let (maj, min) = (maj.unwrap(), min.unwrap()); - let dev = makedev(maj, min); + let dev = makedev(major, minor); if ch == 'b' { // block special file - ret = _makenod(c_str, S_IFBLK | newmode, dev); - } else { + _makenod(file_name, S_IFBLK | mode, dev) + } else if ch == 'c' || ch == 'u' { // char special file - ret = _makenod(c_str, S_IFCHR | newmode, dev); + _makenod(file_name, S_IFCHR | mode, dev) + } else { + unreachable!("{} was validated to be only b, c or u", ch); } } } } - - if last_umask != 0 { - unsafe { - libc::umask(last_umask); - } - } - if ret == -1 { - let c_str = CString::new(format!("{}: {}", NAME, matches.free[0]).as_str()) - .expect("Failed to convert to CString"); - unsafe { - libc::perror(c_str.as_ptr()); - } - } - - ret +} + +fn get_mode(matches: &ArgMatches) -> Result { + match matches.value_of("mode") { + None => Ok(MODE_RW_UGO), + Some(str_mode) => uucore::mode::parse_mode(str_mode) + .map_err(|e| format!("invalid mode ({})", e)) + .and_then(|mode| { + if mode > 0o777 { + Err("mode must specify only file permission bits".to_string()) + } else { + Ok(mode) + } + }), + } +} + +fn valid_type(tpe: String) -> Result<(), String> { + // Only check the first character, to allow mnemonic usage like + // 'mknod /dev/rst0 character 18 0'. + tpe.chars() + .next() + .ok_or_else(|| "missing device type".to_string()) + .and_then(|first_char| { + if vec!['b', 'c', 'u', 'p'].contains(&first_char) { + Ok(()) + } else { + Err(format!("invalid device type ‘{}’", tpe)) + } + }) +} + +fn valid_u64(num: String) -> Result<(), String> { + num.parse::().map(|_| ()).map_err(|_| num) } diff --git a/src/uu/mknod/src/parsemode.rs b/src/uu/mknod/src/parsemode.rs index 8f8f9af61..026fc4a56 100644 --- a/src/uu/mknod/src/parsemode.rs +++ b/src/uu/mknod/src/parsemode.rs @@ -4,19 +4,16 @@ use libc::{mode_t, S_IRGRP, S_IROTH, S_IRUSR, S_IWGRP, S_IWOTH, S_IWUSR}; use uucore::mode; -pub fn parse_mode(mode: Option) -> Result { - let fperm = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; - if let Some(mode) = mode { - let arr: &[char] = &['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; - let result = if mode.contains(arr) { - mode::parse_numeric(fperm as u32, mode.as_str()) - } else { - mode::parse_symbolic(fperm as u32, mode.as_str(), true) - }; - result.map(|mode| mode as mode_t) +pub const MODE_RW_UGO: mode_t = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; + +pub fn parse_mode(mode: &str) -> Result { + let arr: &[char] = &['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; + let result = if mode.contains(arr) { + mode::parse_numeric(MODE_RW_UGO as u32, mode) } else { - Ok(fperm) - } + mode::parse_symbolic(MODE_RW_UGO as u32, mode, true) + }; + result.map(|mode| mode as mode_t) } #[cfg(test)] @@ -39,20 +36,19 @@ mod test { #[test] fn symbolic_modes() { - assert_eq!(super::parse_mode(Some("u+x".to_owned())).unwrap(), 0o766); + assert_eq!(super::parse_mode("u+x").unwrap(), 0o766); assert_eq!( - super::parse_mode(Some("+x".to_owned())).unwrap(), + super::parse_mode("+x").unwrap(), if !is_wsl() { 0o777 } else { 0o776 } ); - assert_eq!(super::parse_mode(Some("a-w".to_owned())).unwrap(), 0o444); - assert_eq!(super::parse_mode(Some("g-r".to_owned())).unwrap(), 0o626); + assert_eq!(super::parse_mode("a-w").unwrap(), 0o444); + assert_eq!(super::parse_mode("g-r").unwrap(), 0o626); } #[test] fn numeric_modes() { - assert_eq!(super::parse_mode(Some("644".to_owned())).unwrap(), 0o644); - assert_eq!(super::parse_mode(Some("+100".to_owned())).unwrap(), 0o766); - assert_eq!(super::parse_mode(Some("-4".to_owned())).unwrap(), 0o662); - assert_eq!(super::parse_mode(None).unwrap(), 0o666); + assert_eq!(super::parse_mode("644").unwrap(), 0o644); + assert_eq!(super::parse_mode("+100").unwrap(), 0o766); + assert_eq!(super::parse_mode("-4").unwrap(), 0o662); } } diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index ed767ffe0..f6c244bf2 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -15,14 +15,11 @@ use clap::{App, Arg}; use std::env; use std::iter; -use std::mem::forget; use std::path::{is_separator, PathBuf}; use rand::Rng; use tempfile::Builder; -mod tempdir; - static ABOUT: &str = "create a temporary file or directory."; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -157,7 +154,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } if matches.is_present(OPT_TMPDIR) && PathBuf::from(prefix).is_absolute() { - show_info!( + show_error!( "invalid template, ‘{}’; with --tmpdir, it may not be absolute", template ); @@ -213,50 +210,48 @@ pub fn dry_exec(mut tmpdir: PathBuf, prefix: &str, rand: usize, suffix: &str) -> 0 } -fn exec( - tmpdir: PathBuf, - prefix: &str, - rand: usize, - suffix: &str, - make_dir: bool, - quiet: bool, -) -> i32 { - if make_dir { - match tempdir::new_in(&tmpdir, prefix, rand, suffix) { - Ok(ref f) => { - println!("{}", f); - return 0; - } - Err(e) => { - if !quiet { - show_info!("{}: {}", e, tmpdir.display()); +fn exec(dir: PathBuf, prefix: &str, rand: usize, suffix: &str, make_dir: bool, quiet: bool) -> i32 { + let res = if make_dir { + let tmpdir = Builder::new() + .prefix(prefix) + .rand_bytes(rand) + .suffix(suffix) + .tempdir_in(&dir); + + // `into_path` consumes the TempDir without removing it + tmpdir.map(|d| d.into_path().to_string_lossy().to_string()) + } else { + let tmpfile = Builder::new() + .prefix(prefix) + .rand_bytes(rand) + .suffix(suffix) + .tempfile_in(&dir); + + match tmpfile { + Ok(f) => { + // `keep` ensures that the file is not deleted + match f.keep() { + Ok((_, p)) => Ok(p.to_string_lossy().to_string()), + Err(e) => { + show_error!("'{}': {}", dir.display(), e); + return 1; + } } - return 1; } - } - } - let tmpfile = Builder::new() - .prefix(prefix) - .rand_bytes(rand) - .suffix(suffix) - .tempfile_in(tmpdir); - let tmpfile = match tmpfile { - Ok(f) => f, - Err(e) => { - if !quiet { - show_info!("failed to create tempfile: {}", e); - } - return 1; + Err(x) => Err(x), } }; - let tmpname = tmpfile.path().to_string_lossy().to_string(); - - println!("{}", tmpname); - - // CAUTION: Not to call `drop` of tmpfile, which removes the tempfile, - // I call a dangerous function `forget`. - forget(tmpfile); - - 0 + match res { + Ok(ref f) => { + println!("{}", f); + 0 + } + Err(e) => { + if !quiet { + show_error!("{}: {}", e, dir.display()); + } + 1 + } + } } diff --git a/src/uu/mktemp/src/tempdir.rs b/src/uu/mktemp/src/tempdir.rs deleted file mode 100644 index 1b6c9d7b3..000000000 --- a/src/uu/mktemp/src/tempdir.rs +++ /dev/null @@ -1,51 +0,0 @@ -// spell-checker:ignore (ToDO) tempdir tmpdir - -// Mainly taken from crate `tempdir` - -use rand::distributions::Alphanumeric; -use rand::{thread_rng, Rng}; - -use std::io::Result as IOResult; -use std::io::{Error, ErrorKind}; -use std::path::Path; - -// How many times should we (re)try finding an unused random name? It should be -// enough that an attacker will run out of luck before we run out of patience. -const NUM_RETRIES: u32 = 1 << 31; - -#[cfg(any(unix, target_os = "redox"))] -fn create_dir>(path: P) -> IOResult<()> { - use std::fs::DirBuilder; - use std::os::unix::fs::DirBuilderExt; - - DirBuilder::new().mode(0o700).create(path) -} - -#[cfg(windows)] -fn create_dir>(path: P) -> IOResult<()> { - ::std::fs::create_dir(path) -} - -pub fn new_in>( - tmpdir: P, - prefix: &str, - rand: usize, - suffix: &str, -) -> IOResult { - let mut rng = thread_rng(); - for _ in 0..NUM_RETRIES { - let rand_chars: String = rng.sample_iter(&Alphanumeric).take(rand).collect(); - let leaf = format!("{}{}{}", prefix, rand_chars, suffix); - let path = tmpdir.as_ref().join(&leaf); - match create_dir(&path) { - Ok(_) => return Ok(path.to_string_lossy().into_owned()), - Err(ref e) if e.kind() == ErrorKind::AlreadyExists => {} - Err(e) => return Err(e), - } - } - - Err(Error::new( - ErrorKind::AlreadyExists, - "too many temporary directories already exist", - )) -} diff --git a/src/uu/more/src/more.rs b/src/uu/more/src/more.rs index 59e7d0faa..eabdbee85 100644 --- a/src/uu/more/src/more.rs +++ b/src/uu/more/src/more.rs @@ -17,6 +17,7 @@ use std::io::{stdin, stdout, BufRead, BufReader, Read, Write}; extern crate nix; #[cfg(all(unix, not(target_os = "fuchsia")))] use nix::sys::termios::{self, LocalFlags, SetArg}; +use uucore::InvalidEncodingHandling; #[cfg(target_os = "redox")] extern crate redox_termios; @@ -38,6 +39,9 @@ fn get_usage() -> String { pub fn uumain(args: impl uucore::Args) -> i32 { let usage = get_usage(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .version(VERSION) diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index b481aeebc..c61c7caf1 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -20,6 +20,7 @@ use std::os::unix; #[cfg(windows)] use std::os::windows; use std::path::{Path, PathBuf}; +use uucore::backup_control::{self, BackupMode}; use fs_extra::dir::{move_dir, CopyOptions as DirCopyOptions}; @@ -40,16 +41,9 @@ pub enum OverwriteMode { Force, } -#[derive(Clone, Copy, Eq, PartialEq)] -pub enum BackupMode { - NoBackup, - SimpleBackup, - NumberedBackup, - ExistingBackup, -} - static ABOUT: &str = "Move SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY."; static VERSION: &str = env!("CARGO_PKG_VERSION"); +static LONG_HELP: &str = ""; static OPT_BACKUP: &str = "backup"; static OPT_BACKUP_NO_ARG: &str = "b"; @@ -80,20 +74,16 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let matches = App::new(executable!()) .version(VERSION) .about(ABOUT) + .after_help(&*format!("{}\n{}", LONG_HELP, backup_control::BACKUP_CONTROL_LONG_HELP)) .usage(&usage[..]) .arg( Arg::with_name(OPT_BACKUP) .long(OPT_BACKUP) .help("make a backup of each existing destination file") .takes_value(true) - .possible_value("simple") - .possible_value("never") - .possible_value("numbered") - .possible_value("t") - .possible_value("existing") - .possible_value("nil") - .possible_value("none") - .possible_value("off") + .require_equals(true) + .min_values(0) + .possible_values(backup_control::BACKUP_CONTROL_VALUES) .value_name("CONTROL") ) .arg( @@ -172,18 +162,17 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .unwrap_or_default(); let overwrite_mode = determine_overwrite_mode(&matches); - let backup_mode = determine_backup_mode(&matches); + let backup_mode = backup_control::determine_backup_mode( + matches.is_present(OPT_BACKUP_NO_ARG) || matches.is_present(OPT_BACKUP), + matches.value_of(OPT_BACKUP), + ); if overwrite_mode == OverwriteMode::NoClobber && backup_mode != BackupMode::NoBackup { - show_error!( - "options --backup and --no-clobber are mutually exclusive\n\ - Try '{} --help' for more information.", - executable!() - ); + show_usage_error!("options --backup and --no-clobber are mutually exclusive"); return 1; } - let backup_suffix = determine_backup_suffix(backup_mode, &matches); + let backup_suffix = backup_control::determine_backup_suffix(matches.value_of(OPT_SUFFIX)); let behavior = Behavior { overwrite: overwrite_mode, @@ -227,37 +216,6 @@ fn determine_overwrite_mode(matches: &ArgMatches) -> OverwriteMode { } } -fn determine_backup_mode(matches: &ArgMatches) -> BackupMode { - if matches.is_present(OPT_BACKUP_NO_ARG) { - BackupMode::SimpleBackup - } else if matches.is_present(OPT_BACKUP) { - match matches.value_of(OPT_BACKUP).map(String::from) { - None => BackupMode::SimpleBackup, - Some(mode) => match &mode[..] { - "simple" | "never" => BackupMode::SimpleBackup, - "numbered" | "t" => BackupMode::NumberedBackup, - "existing" | "nil" => BackupMode::ExistingBackup, - "none" | "off" => BackupMode::NoBackup, - _ => panic!(), // cannot happen as it is managed by clap - }, - } - } else { - BackupMode::NoBackup - } -} - -fn determine_backup_suffix(backup_mode: BackupMode, matches: &ArgMatches) -> String { - if matches.is_present(OPT_SUFFIX) { - matches.value_of(OPT_SUFFIX).map(String::from).unwrap() - } else if let (Ok(s), BackupMode::SimpleBackup) = - (env::var("SIMPLE_BACKUP_SUFFIX"), backup_mode) - { - s - } else { - "~".to_owned() - } -} - fn exec(files: &[PathBuf], b: Behavior) -> i32 { if let Some(ref name) = b.target_dir { return move_files_into_dir(files, &PathBuf::from(name), &b); @@ -295,7 +253,7 @@ fn exec(files: &[PathBuf], b: Behavior) -> i32 { "cannot move ‘{}’ to ‘{}’: {}", source.display(), target.display(), - e + e.to_string() ); 1 } @@ -335,7 +293,7 @@ fn exec(files: &[PathBuf], b: Behavior) -> i32 { 0 } -fn move_files_into_dir(files: &[PathBuf], target_dir: &PathBuf, b: &Behavior) -> i32 { +fn move_files_into_dir(files: &[PathBuf], target_dir: &Path, b: &Behavior) -> i32 { if !target_dir.is_dir() { show_error!("target ‘{}’ is not a directory", target_dir.display()); return 1; @@ -358,14 +316,15 @@ fn move_files_into_dir(files: &[PathBuf], target_dir: &PathBuf, b: &Behavior) -> if let Err(e) = rename(sourcepath, &targetpath, b) { show_error!( - "mv: cannot move ‘{}’ to ‘{}’: {}", + "cannot move ‘{}’ to ‘{}’: {}", sourcepath.display(), targetpath.display(), - e + e.to_string() ); all_successful = false; } } + if all_successful { 0 } else { @@ -373,7 +332,7 @@ fn move_files_into_dir(files: &[PathBuf], target_dir: &PathBuf, b: &Behavior) -> } } -fn rename(from: &PathBuf, to: &PathBuf, b: &Behavior) -> io::Result<()> { +fn rename(from: &Path, to: &Path, b: &Behavior) -> io::Result<()> { let mut backup_path = None; if to.exists() { @@ -388,12 +347,7 @@ fn rename(from: &PathBuf, to: &PathBuf, b: &Behavior) -> io::Result<()> { OverwriteMode::Force => {} }; - backup_path = match b.backup { - BackupMode::NoBackup => None, - BackupMode::SimpleBackup => Some(simple_backup_path(to, &b.suffix)), - BackupMode::NumberedBackup => Some(numbered_backup_path(to)), - BackupMode::ExistingBackup => Some(existing_backup_path(to, &b.suffix)), - }; + backup_path = backup_control::get_backup_path(b.backup, to, &b.suffix); if let Some(ref backup_path) = backup_path { rename_with_fallback(to, backup_path)?; } @@ -429,7 +383,7 @@ fn rename(from: &PathBuf, to: &PathBuf, b: &Behavior) -> io::Result<()> { /// A wrapper around `fs::rename`, so that if it fails, we try falling back on /// copying and removing. -fn rename_with_fallback(from: &PathBuf, to: &PathBuf) -> io::Result<()> { +fn rename_with_fallback(from: &Path, to: &Path) -> io::Result<()> { if fs::rename(from, to).is_err() { // Get metadata without following symlinks let metadata = from.symlink_metadata()?; @@ -452,7 +406,13 @@ fn rename_with_fallback(from: &PathBuf, to: &PathBuf) -> io::Result<()> { ..DirCopyOptions::new() }; if let Err(err) = move_dir(from, to, &options) { - return Err(io::Error::new(io::ErrorKind::Other, format!("{:?}", err))); + return match err.kind { + fs_extra::error::ErrorKind::PermissionDenied => Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "Permission denied", + )), + _ => Err(io::Error::new(io::ErrorKind::Other, format!("{:?}", err))), + }; } } else { fs::copy(from, to).and_then(|_| fs::remove_file(from))?; @@ -464,7 +424,7 @@ fn rename_with_fallback(from: &PathBuf, to: &PathBuf) -> io::Result<()> { /// Move the given symlink to the given destination. On Windows, dangling /// symlinks return an error. #[inline] -fn rename_symlink_fallback(from: &PathBuf, to: &PathBuf) -> io::Result<()> { +fn rename_symlink_fallback(from: &Path, to: &Path) -> io::Result<()> { let path_symlink_points_to = fs::read_link(from)?; #[cfg(unix)] { @@ -507,29 +467,7 @@ fn read_yes() -> bool { } } -fn simple_backup_path(path: &PathBuf, suffix: &str) -> PathBuf { - let mut p = path.to_string_lossy().into_owned(); - p.push_str(suffix); - PathBuf::from(p) -} - -fn numbered_backup_path(path: &PathBuf) -> PathBuf { - (1_u64..) - .map(|i| path.with_extension(format!("~{}~", i))) - .find(|p| !p.exists()) - .expect("cannot create backup") -} - -fn existing_backup_path(path: &PathBuf, suffix: &str) -> PathBuf { - let test_path = path.with_extension("~1~"); - if test_path.exists() { - numbered_backup_path(path) - } else { - simple_backup_path(path, suffix) - } -} - -fn is_empty_dir(path: &PathBuf) -> bool { +fn is_empty_dir(path: &Path) -> bool { match fs::read_dir(path) { Ok(contents) => contents.peekable().peek().is_none(), Err(_e) => false, diff --git a/src/uu/nl/src/nl.rs b/src/uu/nl/src/nl.rs index 3b5b5a2e8..7c5f01811 100644 --- a/src/uu/nl/src/nl.rs +++ b/src/uu/nl/src/nl.rs @@ -16,6 +16,7 @@ use std::fs::File; use std::io::{stdin, BufRead, BufReader, Read}; use std::iter::repeat; use std::path::Path; +use uucore::InvalidEncodingHandling; mod helper; @@ -84,7 +85,9 @@ pub mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .name(NAME) diff --git a/src/uu/nohup/src/nohup.rs b/src/uu/nohup/src/nohup.rs index afbf2541b..93d9b5e45 100644 --- a/src/uu/nohup/src/nohup.rs +++ b/src/uu/nohup/src/nohup.rs @@ -20,6 +20,7 @@ use std::io::Error; use std::os::unix::prelude::*; use std::path::{Path, PathBuf}; use uucore::fs::{is_stderr_interactive, is_stdin_interactive, is_stdout_interactive}; +use uucore::InvalidEncodingHandling; static VERSION: &str = env!("CARGO_PKG_VERSION"); static ABOUT: &str = "Run COMMAND ignoring hangup signals."; @@ -42,6 +43,9 @@ mod options { pub fn uumain(args: impl uucore::Args) -> i32 { let usage = get_usage(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .version(VERSION) @@ -118,13 +122,13 @@ fn find_stdout() -> File { .open(Path::new(NOHUP_OUT)) { Ok(t) => { - show_info!("ignoring input and appending output to '{}'", NOHUP_OUT); + show_error!("ignoring input and appending output to '{}'", NOHUP_OUT); t } Err(e1) => { let home = match env::var("HOME") { Err(_) => { - show_info!("failed to open '{}': {}", NOHUP_OUT, e1); + show_error!("failed to open '{}': {}", NOHUP_OUT, e1); exit!(internal_failure_code) } Ok(h) => h, @@ -139,12 +143,12 @@ fn find_stdout() -> File { .open(&homeout) { Ok(t) => { - show_info!("ignoring input and appending output to '{}'", homeout_str); + show_error!("ignoring input and appending output to '{}'", homeout_str); t } Err(e2) => { - show_info!("failed to open '{}': {}", NOHUP_OUT, e1); - show_info!("failed to open '{}': {}", homeout_str, e2); + show_error!("failed to open '{}': {}", NOHUP_OUT, e1); + show_error!("failed to open '{}': {}", homeout_str, e2); exit!(internal_failure_code) } } diff --git a/src/uu/numfmt/src/numfmt.rs b/src/uu/numfmt/src/numfmt.rs index e9a476956..6eba699b2 100644 --- a/src/uu/numfmt/src/numfmt.rs +++ b/src/uu/numfmt/src/numfmt.rs @@ -216,7 +216,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { match result { Err(e) => { std::io::stdout().flush().expect("error flushing stdout"); - show_info!("{}", e); + show_error!("{}", e); 1 } _ => 0, diff --git a/src/uu/od/src/od.rs b/src/uu/od/src/od.rs index c3b39fca1..571ca543d 100644 --- a/src/uu/od/src/od.rs +++ b/src/uu/od/src/od.rs @@ -42,6 +42,7 @@ use crate::partialreader::*; use crate::peekreader::*; use crate::prn_char::format_ascii_dump; use clap::{self, AppSettings, Arg, ArgMatches}; +use uucore::InvalidEncodingHandling; static VERSION: &str = env!("CARGO_PKG_VERSION"); const PEEK_BUFFER_SIZE: usize = 4; // utf-8 can be 4 bytes @@ -118,7 +119,7 @@ struct OdOptions { } impl OdOptions { - fn new<'a>(matches: ArgMatches<'a>, args: Vec) -> Result { + fn new(matches: ArgMatches, args: Vec) -> Result { let byte_order = match matches.value_of(options::ENDIAN) { None => ByteOrder::Native, Some("little") => ByteOrder::Little, @@ -221,7 +222,9 @@ impl OdOptions { /// parses and validates command line parameters, prepares data structures, /// opens the input and calls `odfunc` to process the input. pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let clap_opts = clap::App::new(executable!()) .version(VERSION) diff --git a/src/uu/od/src/parse_formats.rs b/src/uu/od/src/parse_formats.rs index 8b32d648c..abf05ea18 100644 --- a/src/uu/od/src/parse_formats.rs +++ b/src/uu/od/src/parse_formats.rs @@ -85,12 +85,7 @@ fn od_format_type(type_char: FormatType, byte_size: u8) -> Option bool { - #[allow(clippy::match_like_matches_macro)] - // `matches!(...)` macro not stabilized until rust v1.42 - match ch { - 'A' | 'j' | 'N' | 'S' | 'w' => true, - _ => false, - } + matches!(ch, 'A' | 'j' | 'N' | 'S' | 'w') } /// Parses format flags from command line diff --git a/src/uu/od/src/parse_inputs.rs b/src/uu/od/src/parse_inputs.rs index 915aa1d92..533f4f106 100644 --- a/src/uu/od/src/parse_inputs.rs +++ b/src/uu/od/src/parse_inputs.rs @@ -63,7 +63,7 @@ pub fn parse_inputs(matches: &dyn CommandLineOpts) -> Result) -> Result Ok(CommandLineInputs::FileAndOffset(( - input_strings[0].clone().to_owned(), + input_strings[0].to_string(), m, None, ))), @@ -118,7 +118,7 @@ pub fn parse_inputs_traditional(input_strings: Vec<&str>) -> Result Ok(CommandLineInputs::FileAndOffset(( - input_strings[0].clone().to_owned(), + input_strings[0].to_string(), n, Some(m), ))), diff --git a/src/uu/pathchk/src/pathchk.rs b/src/uu/pathchk/src/pathchk.rs index c27e52513..5606c4d6a 100644 --- a/src/uu/pathchk/src/pathchk.rs +++ b/src/uu/pathchk/src/pathchk.rs @@ -15,6 +15,7 @@ extern crate uucore; use clap::{App, Arg}; use std::fs; use std::io::{ErrorKind, Write}; +use uucore::InvalidEncodingHandling; // operating mode enum Mode { @@ -45,6 +46,9 @@ fn get_usage() -> String { pub fn uumain(args: impl uucore::Args) -> i32 { let usage = get_usage(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .version(VERSION) diff --git a/src/uu/pinky/Cargo.toml b/src/uu/pinky/Cargo.toml index 3f4a75241..a3c36259a 100644 --- a/src/uu/pinky/Cargo.toml +++ b/src/uu/pinky/Cargo.toml @@ -17,6 +17,7 @@ path = "src/pinky.rs" [dependencies] uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["utmpx", "entries"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } +clap = "2.33.3" [[bin]] name = "pinky" diff --git a/src/uu/pinky/src/pinky.rs b/src/uu/pinky/src/pinky.rs index 772e311d6..d65775c2d 100644 --- a/src/uu/pinky/src/pinky.rs +++ b/src/uu/pinky/src/pinky.rs @@ -15,69 +15,114 @@ use uucore::utmpx::{self, time, Utmpx}; use std::io::prelude::*; use std::io::BufReader; -use std::io::Result as IOResult; use std::fs::File; use std::os::unix::fs::MetadataExt; +use clap::{App, Arg}; use std::path::PathBuf; - -static SYNTAX: &str = "[OPTION]... [USER]..."; -static SUMMARY: &str = "A lightweight 'finger' program; print user information."; +use uucore::InvalidEncodingHandling; const BUFSIZE: usize = 1024; -pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); +static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = "pinky - lightweight finger"; - let long_help = &format!( - " - -l produce long format output for the specified USERs - -b omit the user's home directory and shell in long format - -h omit the user's project file in long format - -p omit the user's plan file in long format - -s do short format output, this is the default - -f omit the line of column headings in short format - -w omit the user's full name in short format - -i omit the user's full name and remote host in short format - -q omit the user's full name, remote host and idle time - in short format - --help display this help and exit - --version output version information and exit +mod options { + pub const LONG_FORMAT: &str = "long_format"; + pub const OMIT_HOME_DIR: &str = "omit_home_dir"; + pub const OMIT_PROJECT_FILE: &str = "omit_project_file"; + pub const OMIT_PLAN_FILE: &str = "omit_plan_file"; + pub const SHORT_FORMAT: &str = "short_format"; + pub const OMIT_HEADINGS: &str = "omit_headings"; + pub const OMIT_NAME: &str = "omit_name"; + pub const OMIT_NAME_HOST: &str = "omit_name_host"; + pub const OMIT_NAME_HOST_TIME: &str = "omit_name_host_time"; + pub const USER: &str = "user"; +} -The utmp file will be {}", +fn get_usage() -> String { + format!("{0} [OPTION]... [USER]...", executable!()) +} + +fn get_long_usage() -> String { + format!( + "A lightweight 'finger' program; print user information.\n\ + The utmp file will be {}.", utmpx::DEFAULT_FILE - ); - let mut opts = app!(SYNTAX, SUMMARY, &long_help); - opts.optflag( - "l", - "", - "produce long format output for the specified USERs", - ); - opts.optflag( - "b", - "", - "omit the user's home directory and shell in long format", - ); - opts.optflag("h", "", "omit the user's project file in long format"); - opts.optflag("p", "", "omit the user's plan file in long format"); - opts.optflag("s", "", "do short format output, this is the default"); - opts.optflag("f", "", "omit the line of column headings in short format"); - opts.optflag("w", "", "omit the user's full name in short format"); - opts.optflag( - "i", - "", - "omit the user's full name and remote host in short format", - ); - opts.optflag( - "q", - "", - "omit the user's full name, remote host and idle time in short format", - ); - opts.optflag("", "help", "display this help and exit"); - opts.optflag("", "version", "output version information and exit"); + ) +} - let matches = opts.parse(args); +pub fn uumain(args: impl uucore::Args) -> i32 { + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); + + let usage = get_usage(); + let after_help = get_long_usage(); + + let matches = App::new(executable!()) + .version(VERSION) + .about(ABOUT) + .usage(&usage[..]) + .after_help(&after_help[..]) + .arg( + Arg::with_name(options::LONG_FORMAT) + .short("l") + .requires(options::USER) + .help("produce long format output for the specified USERs"), + ) + .arg( + Arg::with_name(options::OMIT_HOME_DIR) + .short("b") + .help("omit the user's home directory and shell in long format"), + ) + .arg( + Arg::with_name(options::OMIT_PROJECT_FILE) + .short("h") + .help("omit the user's project file in long format"), + ) + .arg( + Arg::with_name(options::OMIT_PLAN_FILE) + .short("p") + .help("omit the user's plan file in long format"), + ) + .arg( + Arg::with_name(options::SHORT_FORMAT) + .short("s") + .help("do short format output, this is the default"), + ) + .arg( + Arg::with_name(options::OMIT_HEADINGS) + .short("f") + .help("omit the line of column headings in short format"), + ) + .arg( + Arg::with_name(options::OMIT_NAME) + .short("w") + .help("omit the user's full name in short format"), + ) + .arg( + Arg::with_name(options::OMIT_NAME_HOST) + .short("i") + .help("omit the user's full name and remote host in short format"), + ) + .arg( + Arg::with_name(options::OMIT_NAME_HOST_TIME) + .short("q") + .help("omit the user's full name, remote host and idle time in short format"), + ) + .arg( + Arg::with_name(options::USER) + .takes_value(true) + .multiple(true), + ) + .get_matches_from(args); + + let users: Vec = matches + .values_of(options::USER) + .map(|v| v.map(ToString::to_string).collect()) + .unwrap_or_default(); // If true, display the hours:minutes since each user has touched // the keyboard, or blank if within the last minute, or days followed @@ -85,45 +130,40 @@ The utmp file will be {}", let mut include_idle = true; // If true, display a line at the top describing each field. - let include_heading = !matches.opt_present("f"); + let include_heading = !matches.is_present(options::OMIT_HEADINGS); // if true, display the user's full name from pw_gecos. let mut include_fullname = true; // if true, display the user's ~/.project file when doing long format. - let include_project = !matches.opt_present("h"); + let include_project = !matches.is_present(options::OMIT_PROJECT_FILE); // if true, display the user's ~/.plan file when doing long format. - let include_plan = !matches.opt_present("p"); + let include_plan = !matches.is_present(options::OMIT_PLAN_FILE); // if true, display the user's home directory and shell // when doing long format. - let include_home_and_shell = !matches.opt_present("b"); + let include_home_and_shell = !matches.is_present(options::OMIT_HOME_DIR); // if true, use the "short" output format. - let do_short_format = !matches.opt_present("l"); + let do_short_format = !matches.is_present(options::LONG_FORMAT); /* if true, display the ut_host field. */ let mut include_where = true; - if matches.opt_present("w") { + if matches.is_present(options::OMIT_NAME) { include_fullname = false; } - if matches.opt_present("i") { + if matches.is_present(options::OMIT_NAME_HOST) { include_fullname = false; include_where = false; } - if matches.opt_present("q") { + if matches.is_present(options::OMIT_NAME_HOST_TIME) { include_fullname = false; include_idle = false; include_where = false; } - if !do_short_format && matches.free.is_empty() { - show_usage_error!("no username specified; at least one must be specified when using -l"); - return 1; - } - let pk = Pinky { include_idle, include_heading, @@ -132,16 +172,12 @@ The utmp file will be {}", include_plan, include_home_and_shell, include_where, - names: matches.free, + names: users, }; if do_short_format { - if let Err(e) = pk.short_pinky() { - show_usage_error!("{}", e); - 1 - } else { - 0 - } + pk.short_pinky(); + 0 } else { pk.long_pinky() } @@ -250,17 +286,10 @@ impl Pinky { print!(" {}", time_string(&ut)); - if self.include_where && !ut.host().is_empty() { - let ut_host = ut.host(); - let mut res = ut_host.splitn(2, ':'); - let host = match res.next() { - Some(_) => ut.canon_host().unwrap_or_else(|_| ut_host.clone()), - None => ut_host.clone(), - }; - match res.next() { - Some(d) => print!(" {}:{}", host, d), - None => print!(" {}", host), - } + let mut s = ut.host(); + if self.include_where && !s.is_empty() { + s = safe_unwrap!(ut.canon_host()); + print!(" {}", s); } println!(); @@ -282,7 +311,7 @@ impl Pinky { println!(); } - fn short_pinky(&self) -> IOResult<()> { + fn short_pinky(&self) { if self.include_heading { self.print_heading(); } @@ -295,7 +324,6 @@ impl Pinky { } } } - Ok(()) } fn long_pinky(&self) -> i32 { diff --git a/src/uu/pr/src/pr.rs b/src/uu/pr/src/pr.rs index 65fb20c19..8ac9e5bba 100644 --- a/src/uu/pr/src/pr.rs +++ b/src/uu/pr/src/pr.rs @@ -178,7 +178,9 @@ quick_error! { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(uucore::InvalidEncodingHandling::Ignore) + .accept_any(); let mut opts = getopts::Options::new(); opts.opt( diff --git a/src/uu/printf/src/cli.rs b/src/uu/printf/src/cli.rs index 12e80a925..a5e9c9775 100644 --- a/src/uu/printf/src/cli.rs +++ b/src/uu/printf/src/cli.rs @@ -18,18 +18,15 @@ pub fn err_msg(msg: &str) { // by default stdout only flushes // to console when a newline is passed. -#[allow(unused_must_use)] pub fn flush_char(c: char) { print!("{}", c); - stdout().flush(); + let _ = stdout().flush(); } -#[allow(unused_must_use)] pub fn flush_str(s: &str) { print!("{}", s); - stdout().flush(); + let _ = stdout().flush(); } -#[allow(unused_must_use)] pub fn flush_bytes(bslice: &[u8]) { - stdout().write(bslice); - stdout().flush(); + let _ = stdout().write(bslice); + let _ = stdout().flush(); } diff --git a/src/uu/printf/src/printf.rs b/src/uu/printf/src/printf.rs index c2952e5a9..88d18838d 100644 --- a/src/uu/printf/src/printf.rs +++ b/src/uu/printf/src/printf.rs @@ -1,15 +1,15 @@ #![allow(dead_code)] - // spell-checker:ignore (change!) each's // spell-checker:ignore (ToDO) LONGHELP FORMATSTRING templating parameterizing formatstr +use uucore::InvalidEncodingHandling; + mod cli; mod memo; mod tokenize; static NAME: &str = "printf"; static VERSION: &str = env!("CARGO_PKG_VERSION"); -static SHORT_USAGE: &str = "printf: usage: printf [-v var] format [arguments]"; static LONGHELP_LEAD: &str = "printf USAGE: printf FORMATSTRING [ARGUMENT]... @@ -273,7 +273,9 @@ COPYRIGHT : "; pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let location = &args[0]; if args.len() <= 1 { diff --git a/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs b/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs index 79af9abd5..7d1d805c6 100644 --- a/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs +++ b/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs @@ -28,8 +28,7 @@ pub fn arrnum_int_mult(arr_num: &[u8], basenum: u8, base_ten_int_fact: u8) -> Ve } } } - #[allow(clippy::map_clone)] - let ret: Vec = ret_rev.iter().rev().map(|x| *x).collect(); + let ret: Vec = ret_rev.into_iter().rev().collect(); ret } @@ -102,70 +101,6 @@ pub fn arrnum_int_div_step( remainder: rem_out, } } -// pub struct ArrFloat { -// pub leading_zeros: u8, -// pub values: Vec, -// pub basenum: u8 -// } -// -// pub struct ArrFloatDivOut { -// pub quotient: u8, -// pub remainder: ArrFloat -// } -// -// pub fn arrfloat_int_div( -// arrfloat_in : &ArrFloat, -// base_ten_int_divisor : u8, -// precision : u16 -// ) -> DivOut { -// -// let mut remainder = ArrFloat { -// basenum: arrfloat_in.basenum, -// leading_zeros: arrfloat_in.leading_zeroes, -// values: Vec::new() -// } -// let mut quotient = 0; -// -// let mut bufferval : u16 = 0; -// let base : u16 = arrfloat_in.basenum as u16; -// let divisor : u16 = base_ten_int_divisor as u16; -// -// let mut it_f = arrfloat_in.values.iter(); -// let mut position = 0 + arrfloat_in.leading_zeroes as u16; -// let mut at_end = false; -// while position< precision { -// let next_digit = match it_f.next() { -// Some(c) => {} -// None => { 0 } -// } -// match u_cur { -// Some(u) => { -// bufferval += u.clone() as u16; -// if bufferval > divisor { -// while bufferval >= divisor { -// quotient+=1; -// bufferval -= divisor; -// } -// if bufferval == 0 { -// rem_out.position +=1; -// } else { -// rem_out.replace = Some(bufferval as u8); -// } -// break; -// } else { -// bufferval *= base; -// } -// }, -// None => { -// break; -// } -// } -// u_cur = it_f.next().clone(); -// rem_out.position+=1; -// } -// ArrFloatDivOut { quotient: quotient, remainder: remainder } -// } -// pub fn arrnum_int_add(arrnum: &[u8], basenum: u8, base_ten_int_term: u8) -> Vec { let mut carry: u16 = u16::from(base_ten_int_term); let mut rem: u16; @@ -193,14 +128,12 @@ pub fn arrnum_int_add(arrnum: &[u8], basenum: u8, base_ten_int_term: u8) -> Vec< } } } - #[allow(clippy::map_clone)] - let ret: Vec = ret_rev.iter().rev().map(|x| *x).collect(); + let ret: Vec = ret_rev.into_iter().rev().collect(); ret } pub fn base_conv_vec(src: &[u8], radix_src: u8, radix_dest: u8) -> Vec { - let mut result: Vec = Vec::new(); - result.push(0); + let mut result = vec![0]; for i in src { result = arrnum_int_mult(&result, radix_dest, radix_src); result = arrnum_int_add(&result, radix_dest, *i); @@ -220,14 +153,11 @@ pub fn unsigned_to_arrnum(src: u16) -> Vec { } // temporary needs-improvement-function -#[allow(unused_variables)] -pub fn base_conv_float(src: &[u8], radix_src: u8, radix_dest: u8) -> f64 { +pub fn base_conv_float(src: &[u8], radix_src: u8, _radix_dest: u8) -> f64 { // it would require a lot of addl code // to implement this for arbitrary string input. // until then, the below operates as an outline // of how it would work. - let mut result: Vec = Vec::new(); - result.push(0); let mut factor: f64 = 1_f64; let radix_src_float: f64 = f64::from(radix_src); let mut r: f64 = 0_f64; @@ -269,7 +199,6 @@ pub fn arrnum_to_str(src: &[u8], radix_def_dest: &dyn RadixDef) -> String { str_out } -#[allow(unused_variables)] pub fn base_conv_str( src: &str, radix_def_src: &dyn RadixDef, diff --git a/src/uu/printf/src/tokenize/num_format/formatters/cninetyninehexfloatf.rs b/src/uu/printf/src/tokenize/num_format/formatters/cninetyninehexfloatf.rs index 10e58cc32..870e64712 100644 --- a/src/uu/printf/src/tokenize/num_format/formatters/cninetyninehexfloatf.rs +++ b/src/uu/printf/src/tokenize/num_format/formatters/cninetyninehexfloatf.rs @@ -43,45 +43,15 @@ impl Formatter for CninetyNineHexFloatf { // c99 hex has unique requirements of all floating point subs in pretty much every part of building a primitive, from prefix and suffix to need for base conversion (in all other cases if you don't have decimal you must have decimal, here it's the other way around) // on the todo list is to have a trait for get_primitive that is implemented by each float formatter and can override a default. when that happens we can take the parts of get_primitive_dec specific to dec and spin them out to their own functions that can be overridden. -#[allow(unused_variables)] -#[allow(unused_assignments)] fn get_primitive_hex( inprefix: &InPrefix, - str_in: &str, - analysis: &FloatAnalysis, - last_dec_place: usize, + _str_in: &str, + _analysis: &FloatAnalysis, + _last_dec_place: usize, capitalized: bool, ) -> FormatPrimitive { let prefix = Some(String::from(if inprefix.sign == -1 { "-0x" } else { "0x" })); - // assign the digits before and after the decimal points - // to separate slices. If no digits after decimal point, - // assign 0 - let (mut first_segment_raw, second_segment_raw) = match analysis.decimal_pos { - Some(pos) => (&str_in[..pos], &str_in[pos + 1..]), - None => (str_in, "0"), - }; - if first_segment_raw.is_empty() { - first_segment_raw = "0"; - } - // convert to string, hexifying if input is in dec. - // let (first_segment, second_segment) = - // match inprefix.radix_in { - // Base::Ten => { - // (to_hex(first_segment_raw, true), - // to_hex(second_segment_raw, false)) - // } - // _ => { - // (String::from(first_segment_raw), - // String::from(second_segment_raw)) - // } - // }; - // - // - // f.pre_decimal = Some(first_segment); - // f.post_decimal = Some(second_segment); - // - // TODO actual conversion, make sure to get back mantissa. // for hex to hex, it's really just a matter of moving the // decimal point and calculating the mantissa by its initial diff --git a/src/uu/printf/src/tokenize/num_format/formatters/decf.rs b/src/uu/printf/src/tokenize/num_format/formatters/decf.rs index 6b2baa890..448771f22 100644 --- a/src/uu/printf/src/tokenize/num_format/formatters/decf.rs +++ b/src/uu/printf/src/tokenize/num_format/formatters/decf.rs @@ -22,12 +22,11 @@ fn get_len_fprim(fprim: &FormatPrimitive) -> usize { len } -pub struct Decf { - as_num: f64, -} +pub struct Decf; + impl Decf { pub fn new() -> Decf { - Decf { as_num: 0.0 } + Decf } } impl Formatter for Decf { diff --git a/src/uu/printf/src/tokenize/num_format/formatters/floatf.rs b/src/uu/printf/src/tokenize/num_format/formatters/floatf.rs index 97ceafe8d..b3de2f98a 100644 --- a/src/uu/printf/src/tokenize/num_format/formatters/floatf.rs +++ b/src/uu/printf/src/tokenize/num_format/formatters/floatf.rs @@ -5,12 +5,10 @@ use super::super::format_field::FormatField; use super::super::formatter::{FormatPrimitive, Formatter, InPrefix}; use super::float_common::{get_primitive_dec, primitive_to_str_common, FloatAnalysis}; -pub struct Floatf { - as_num: f64, -} +pub struct Floatf; impl Floatf { pub fn new() -> Floatf { - Floatf { as_num: 0.0 } + Floatf } } impl Formatter for Floatf { diff --git a/src/uu/printf/src/tokenize/num_format/formatters/intf.rs b/src/uu/printf/src/tokenize/num_format/formatters/intf.rs index 9231bd027..2e4e67047 100644 --- a/src/uu/printf/src/tokenize/num_format/formatters/intf.rs +++ b/src/uu/printf/src/tokenize/num_format/formatters/intf.rs @@ -11,7 +11,7 @@ use std::i64; use std::u64; pub struct Intf { - a: u32, + _a: u32, } // see the Intf::analyze() function below @@ -24,7 +24,7 @@ struct IntAnalysis { impl Intf { pub fn new() -> Intf { - Intf { a: 0 } + Intf { _a: 0 } } // take a ref to argument string, and basic information // about prefix (offset, radix, sign), and analyze string diff --git a/src/uu/printf/src/tokenize/num_format/formatters/scif.rs b/src/uu/printf/src/tokenize/num_format/formatters/scif.rs index 69a703042..ebac1565e 100644 --- a/src/uu/printf/src/tokenize/num_format/formatters/scif.rs +++ b/src/uu/printf/src/tokenize/num_format/formatters/scif.rs @@ -5,12 +5,11 @@ use super::super::format_field::FormatField; use super::super::formatter::{FormatPrimitive, Formatter, InPrefix}; use super::float_common::{get_primitive_dec, primitive_to_str_common, FloatAnalysis}; -pub struct Scif { - as_num: f64, -} +pub struct Scif; + impl Scif { pub fn new() -> Scif { - Scif { as_num: 0.0 } + Scif } } impl Formatter for Scif { diff --git a/src/uu/printf/src/tokenize/num_format/num_format.rs b/src/uu/printf/src/tokenize/num_format/num_format.rs index 9a519e95e..812f51b5a 100644 --- a/src/uu/printf/src/tokenize/num_format/num_format.rs +++ b/src/uu/printf/src/tokenize/num_format/num_format.rs @@ -263,9 +263,5 @@ pub fn num_format(field: &FormatField, in_str_opt: Option<&String>) -> Option, - args: &mut Peekable>, + _: &mut Peekable>, ) -> Option> { UnescapedText::from_it_core(it, false) } } -#[allow(unused_variables)] impl token::Token for UnescapedText { - fn print(&self, pf_args_it: &mut Peekable>) { + fn print(&self, _: &mut Peekable>) { cli::flush_bytes(&self.0[..]); } } diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index 38327e4e3..d2aa619b4 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -17,6 +17,7 @@ use std::collections::{BTreeSet, HashMap, HashSet}; use std::default::Default; use std::fs::File; use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Read, Write}; +use uucore::InvalidEncodingHandling; static NAME: &str = "ptx"; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -177,14 +178,14 @@ fn get_config(matches: &clap::ArgMatches) -> Config { } if matches.is_present(options::WIDTH) { let width_str = matches.value_of(options::WIDTH).expect(err_msg).to_string(); - config.line_width = crash_if_err!(1, usize::from_str_radix(&width_str, 10)); + config.line_width = crash_if_err!(1, (&width_str).parse::()); } if matches.is_present(options::GAP_SIZE) { let gap_str = matches .value_of(options::GAP_SIZE) .expect(err_msg) .to_string(); - config.gap_size = crash_if_err!(1, usize::from_str_radix(&gap_str, 10)); + config.gap_size = crash_if_err!(1, (&gap_str).parse::()); } if matches.is_present(options::FORMAT_ROFF) { config.format = OutFormat::Roff; @@ -630,7 +631,9 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); // let mut opts = Options::new(); let matches = App::new(executable!()) diff --git a/src/uu/readlink/src/readlink.rs b/src/uu/readlink/src/readlink.rs index 727c2cce5..43a4ca656 100644 --- a/src/uu/readlink/src/readlink.rs +++ b/src/uu/readlink/src/readlink.rs @@ -13,7 +13,7 @@ extern crate uucore; use clap::{App, Arg}; use std::fs; use std::io::{stdout, Write}; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use uucore::fs::{canonicalize, CanonicalizeMode}; const NAME: &str = "readlink"; @@ -160,8 +160,8 @@ pub fn uumain(args: impl uucore::Args) -> i32 { 0 } -fn show(path: &PathBuf, no_newline: bool, use_zero: bool) { - let path = path.as_path().to_str().unwrap(); +fn show(path: &Path, no_newline: bool, use_zero: bool) { + let path = path.to_str().unwrap(); if use_zero { print!("{}\0", path); } else if no_newline { diff --git a/src/uu/realpath/src/realpath.rs b/src/uu/realpath/src/realpath.rs index 5cc8f3d9a..937cee5bd 100644 --- a/src/uu/realpath/src/realpath.rs +++ b/src/uu/realpath/src/realpath.rs @@ -11,8 +11,7 @@ extern crate uucore; use clap::{App, Arg}; -use std::fs; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use uucore::fs::{canonicalize, CanonicalizeMode}; static ABOUT: &str = "print the resolved path"; @@ -75,64 +74,35 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let quiet = matches.is_present(OPT_QUIET); let mut retcode = 0; for path in &paths { - if !resolve_path(path, strip, zero, quiet) { + if let Err(e) = resolve_path(path, strip, zero) { + if !quiet { + show_error!("{}: {}", e, path.display()); + } retcode = 1 }; } retcode } -fn resolve_path(p: &PathBuf, strip: bool, zero: bool, quiet: bool) -> bool { - let abs = canonicalize(p, CanonicalizeMode::Normal).unwrap(); - - if strip { - if zero { - print!("{}\0", p.display()); - } else { - println!("{}", p.display()) - } - return true; - } - - let mut result = PathBuf::new(); - let mut links_left = 256; - - for part in abs.components() { - result.push(part.as_os_str()); - loop { - if links_left == 0 { - if !quiet { - show_error!("Too many symbolic links: {}", p.display()) - }; - return false; - } - match fs::metadata(result.as_path()) { - Err(_) => break, - Ok(ref m) if !m.file_type().is_symlink() => break, - Ok(_) => { - links_left -= 1; - match fs::read_link(result.as_path()) { - Ok(x) => { - result.pop(); - result.push(x.as_path()); - } - _ => { - if !quiet { - show_error!("Invalid path: {}", p.display()) - }; - return false; - } - } - } - } - } - } - - if zero { - print!("{}\0", result.display()); +/// Resolve a path to an absolute form and print it. +/// +/// If `strip` is `true`, then this function does not attempt to resolve +/// symbolic links in the path. If `zero` is `true`, then this function +/// prints the path followed by the null byte (`'\0'`) instead of a +/// newline character (`'\n'`). +/// +/// # Errors +/// +/// This function returns an error if there is a problem resolving +/// symbolic links. +fn resolve_path(p: &Path, strip: bool, zero: bool) -> std::io::Result<()> { + let mode = if strip { + CanonicalizeMode::None } else { - println!("{}", result.display()); - } - - true + CanonicalizeMode::Normal + }; + let abs = canonicalize(p, mode)?; + let line_ending = if zero { '\0' } else { '\n' }; + print!("{}{}", abs.display(), line_ending); + Ok(()) } diff --git a/src/uu/relpath/src/relpath.rs b/src/uu/relpath/src/relpath.rs index 82779107a..f1b2c9a43 100644 --- a/src/uu/relpath/src/relpath.rs +++ b/src/uu/relpath/src/relpath.rs @@ -14,6 +14,7 @@ use clap::{App, Arg}; use std::env; use std::path::{Path, PathBuf}; use uucore::fs::{canonicalize, CanonicalizeMode}; +use uucore::InvalidEncodingHandling; static VERSION: &str = env!("CARGO_PKG_VERSION"); static ABOUT: &str = "Convert TO destination to the relative path from the FROM dir. @@ -30,7 +31,9 @@ fn get_usage() -> String { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let usage = get_usage(); let matches = App::new(executable!()) diff --git a/src/uu/rm/src/rm.rs b/src/uu/rm/src/rm.rs index 09671768b..8010988bb 100644 --- a/src/uu/rm/src/rm.rs +++ b/src/uu/rm/src/rm.rs @@ -176,7 +176,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } else if matches.is_present(OPT_PROMPT_MORE) { InteractiveMode::Once } else if matches.is_present(OPT_INTERACTIVE) { - match &matches.value_of(OPT_INTERACTIVE).unwrap()[..] { + match matches.value_of(OPT_INTERACTIVE).unwrap() { "none" => InteractiveMode::None, "once" => InteractiveMode::Once, "always" => InteractiveMode::Always, @@ -386,13 +386,8 @@ fn prompt(msg: &str) -> bool { let stdin = stdin(); let mut stdin = stdin.lock(); - #[allow(clippy::match_like_matches_macro)] - // `matches!(...)` macro not stabilized until rust v1.42 match stdin.read_until(b'\n', &mut buf) { - Ok(x) if x > 0 => match buf[0] { - b'y' | b'Y' => true, - _ => false, - }, + Ok(x) if x > 0 => matches!(buf[0], b'y' | b'Y'), _ => false, } } diff --git a/src/uu/seq/src/seq.rs b/src/uu/seq/src/seq.rs index 671dd7e1c..c3bba1c78 100644 --- a/src/uu/seq/src/seq.rs +++ b/src/uu/seq/src/seq.rs @@ -102,7 +102,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let mut largest_dec = 0; let mut padding = 0; let first = if numbers.len() > 1 { - let slice = &numbers[0][..]; + let slice = numbers[0]; let len = slice.len(); let dec = slice.find('.').unwrap_or(len); largest_dec = len - dec; @@ -118,7 +118,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { 1.0 }; let increment = if numbers.len() > 2 { - let slice = &numbers[1][..]; + let slice = numbers[1]; let len = slice.len(); let dec = slice.find('.').unwrap_or(len); largest_dec = cmp::max(largest_dec, len - dec); @@ -134,11 +134,11 @@ pub fn uumain(args: impl uucore::Args) -> i32 { 1.0 }; if increment == 0.0 { - show_error!("increment value: '{}'", &numbers[1][..]); + show_error!("increment value: '{}'", numbers[1]); return 1; } let last = { - let slice = &numbers[numbers.len() - 1][..]; + let slice = numbers[numbers.len() - 1]; padding = cmp::max(padding, slice.find('.').unwrap_or_else(|| slice.len())); match parse_float(slice) { Ok(n) => n, diff --git a/src/uu/shred/src/shred.rs b/src/uu/shred/src/shred.rs index d5f910297..15a4eff26 100644 --- a/src/uu/shred/src/shred.rs +++ b/src/uu/shred/src/shred.rs @@ -17,6 +17,7 @@ use std::io; use std::io::prelude::*; use std::io::SeekFrom; use std::path::{Path, PathBuf}; +use uucore::InvalidEncodingHandling; #[macro_use] extern crate uucore; @@ -259,6 +260,7 @@ static AFTER_HELP: &str = "; pub mod options { + pub const FORCE: &str = "force"; pub const FILE: &str = "file"; pub const ITERATIONS: &str = "iterations"; pub const SIZE: &str = "size"; @@ -269,7 +271,9 @@ pub mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let usage = get_usage(); @@ -278,6 +282,12 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .about(ABOUT) .after_help(AFTER_HELP) .usage(&usage[..]) + .arg( + Arg::with_name(options::FORCE) + .long(options::FORCE) + .short("f") + .help("change permissions to allow writing if necessary"), + ) .arg( Arg::with_name(options::ITERATIONS) .long(options::ITERATIONS) @@ -354,13 +364,9 @@ pub fn uumain(args: impl uucore::Args) -> i32 { // TODO: implement --random-source - // TODO: implement --force - + let force = matches.is_present(options::FORCE); let remove = matches.is_present(options::REMOVE); - let size_arg = match matches.value_of(options::SIZE) { - Some(s) => Some(s.to_string()), - None => None, - }; + let size_arg = matches.value_of(options::SIZE).map(|s| s.to_string()); let size = get_size(size_arg); let exact = matches.is_present(options::EXACT) && size.is_none(); // if -s is given, ignore -x let zero = matches.is_present(options::ZERO); @@ -375,7 +381,9 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } for path_str in matches.values_of(options::FILE).unwrap() { - wipe_file(&path_str, iterations, remove, size, exact, zero, verbose); + wipe_file( + &path_str, iterations, remove, size, exact, zero, verbose, force, + ); } 0 @@ -431,6 +439,7 @@ fn pass_name(pass_type: PassType) -> String { } } +#[allow(clippy::too_many_arguments)] fn wipe_file( path_str: &str, n_passes: usize, @@ -439,18 +448,37 @@ fn wipe_file( exact: bool, zero: bool, verbose: bool, + force: bool, ) { // Get these potential errors out of the way first let path: &Path = Path::new(path_str); if !path.exists() { - println!("{}: {}: No such file or directory", NAME, path.display()); + show_error!("{}: No such file or directory", path.display()); return; } if !path.is_file() { - println!("{}: {}: Not a file", NAME, path.display()); + show_error!("{}: Not a file", path.display()); return; } + // If force is true, set file permissions to not-readonly. + if force { + let metadata = match fs::metadata(path) { + Ok(m) => m, + Err(e) => { + show_error!("{}", e); + return; + } + }; + + let mut perms = metadata.permissions(); + perms.set_readonly(false); + if let Err(e) = fs::set_permissions(path, perms) { + show_error!("{}", e); + return; + } + } + // Fill up our pass sequence let mut pass_sequence: Vec = Vec::new(); @@ -489,11 +517,13 @@ fn wipe_file( { let total_passes: usize = pass_sequence.len(); - let mut file: File = OpenOptions::new() - .write(true) - .truncate(false) - .open(path) - .expect("Failed to open file for writing"); + let mut file: File = match OpenOptions::new().write(true).truncate(false).open(path) { + Ok(f) => f, + Err(e) => { + show_error!("{}: failed to open for writing: {}", path.display(), e); + return; + } + }; // NOTE: it does not really matter what we set for total_bytes and gen_type here, so just // use bogus values @@ -523,14 +553,23 @@ fn wipe_file( } } // size is an optional argument for exactly how many bytes we want to shred - do_pass(&mut file, path, &mut generator, *pass_type, size) - .expect("File write pass failed"); + match do_pass(&mut file, path, &mut generator, *pass_type, size) { + Ok(_) => {} + Err(e) => { + show_error!("{}: File write pass failed: {}", path.display(), e); + } + } // Ignore failed writes; just keep trying } } if remove { - do_remove(path, path_str, verbose).expect("Failed to remove file"); + match do_remove(path, path_str, verbose) { + Ok(_) => {} + Err(e) => { + show_error!("{}: failed to remove file: {}", path.display(), e); + } + } } } diff --git a/src/uu/shuf/src/shuf.rs b/src/uu/shuf/src/shuf.rs index f7af05214..9c735673c 100644 --- a/src/uu/shuf/src/shuf.rs +++ b/src/uu/shuf/src/shuf.rs @@ -14,6 +14,13 @@ use clap::{App, Arg}; use rand::Rng; use std::fs::File; use std::io::{stdin, stdout, BufReader, BufWriter, Read, Write}; +use uucore::InvalidEncodingHandling; + +enum Mode { + Default(String), + Echo(Vec), + InputRange((usize, usize)), +} static NAME: &str = "shuf"; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -34,12 +41,6 @@ struct Options { sep: u8, } -enum Mode { - Default(String), - Echo(Vec), - InputRange((usize, usize)), -} - mod options { pub static ECHO: &str = "echo"; pub static INPUT_RANGE: &str = "input-range"; @@ -52,6 +53,10 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); + let matches = App::new(executable!()) .name(NAME) .version(VERSION) diff --git a/src/uu/sort/BENCHMARKING.md b/src/uu/sort/BENCHMARKING.md new file mode 100644 index 000000000..fd728c41d --- /dev/null +++ b/src/uu/sort/BENCHMARKING.md @@ -0,0 +1,155 @@ +# Benchmarking sort + +Most of the time when sorting is spent comparing lines. The comparison functions however differ based +on which arguments are passed to `sort`, therefore it is important to always benchmark multiple scenarios. +This is an overwiew over what was benchmarked, and if you make changes to `sort`, you are encouraged to check +how performance was affected for the workloads listed below. Feel free to add other workloads to the +list that we should improve / make sure not to regress. + +Run `cargo build --release` before benchmarking after you make a change! + +## Sorting a wordlist + +- Get a wordlist, for example with [words]() on Linux. The exact wordlist + doesn't matter for performance comparisons. In this example I'm using `/usr/share/dict/american-english` as the wordlist. +- Shuffle the wordlist by running `sort -R /usr/share/dict/american-english > shuffled_wordlist.txt`. +- Benchmark sorting the wordlist with hyperfine: `hyperfine "target/release/coreutils sort shuffled_wordlist.txt -o output.txt"`. + +## Sorting a wordlist with ignore_case + +- Same wordlist as above +- Benchmark sorting the wordlist ignoring the case with hyperfine: `hyperfine "target/release/coreutils sort shuffled_wordlist.txt -f -o output.txt"`. + +## Sorting numbers + +- Generate a list of numbers: `seq 0 100000 | sort -R > shuffled_numbers.txt`. +- Benchmark numeric sorting with hyperfine: `hyperfine "target/release/coreutils sort shuffled_numbers.txt -n -o output.txt"`. + +## Sorting numbers with -g + +- Same list of numbers as above. +- Benchmark numeric sorting with hyperfine: `hyperfine "target/release/coreutils sort shuffled_numbers.txt -g -o output.txt"`. + +## Sorting numbers with SI prefixes + +- Generate a list of numbers: +
+ Rust script + + ## Cargo.toml + + ```toml + [dependencies] + rand = "0.8.3" + ``` + + ## main.rs + + ```rust + use rand::prelude::*; + fn main() { + let suffixes = ['k', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; + let mut rng = thread_rng(); + for _ in 0..100000 { + println!( + "{}{}", + rng.gen_range(0..1000000), + suffixes.choose(&mut rng).unwrap() + ) + } + } + + ``` + + ## running + + `cargo run > shuffled_numbers_si.txt` + +
+ +- Benchmark numeric sorting with hyperfine: `hyperfine "target/release/coreutils sort shuffled_numbers_si.txt -h -o output.txt"`. + +## External sorting + +Try running commands with the `-S` option set to an amount of memory to be used, such as `1M`. Additionally, you could try sorting +huge files (ideally multiple Gigabytes) with `-S` (or without `-S` to benchmark with our default value). +Creating such a large file can be achieved by running `cat shuffled_wordlist.txt | sort -R >> shuffled_wordlist.txt` +multiple times (this will add the contents of `shuffled_wordlist.txt` to itself). +Example: Run `hyperfine './target/release/coreutils sort shuffled_wordlist.txt -S 1M' 'sort shuffled_wordlist.txt -S 1M'` + +## Merging + +"Merge" sort merges already sorted files. It is a sub-step of external sorting, so benchmarking it separately may be helpful. + +- Splitting `shuffled_wordlist.txt` can be achieved by running `split shuffled_wordlist.txt shuffled_wordlist_slice_ --additional-suffix=.txt` +- Sort each part by running `for f in shuffled_wordlist_slice_*; do sort $f -o $f; done` +- Benchmark merging by running `hyperfine "target/release/coreutils sort -m shuffled_wordlist_slice_*"` + +## Check + +When invoked with -c, we simply check if the input is already ordered. The input for benchmarking should be an already sorted file. + +- Benchmark checking by running `hyperfine "target/release/coreutils sort -c sorted_wordlist.txt"` + +## Stdout and stdin performance + +Try to run the above benchmarks by piping the input through stdin (standard input) and redirect the +output through stdout (standard output): + +- Remove the input file from the arguments and add `cat [inputfile] | ` at the beginning. +- Remove `-o output.txt` and add `> output.txt` at the end. + +Example: `hyperfine "target/release/coreutils sort shuffled_numbers.txt -n -o output.txt"` becomes +`hyperfine "cat shuffled_numbers.txt | target/release/coreutils sort -n > output.txt` + +- Check that performance is similar to the original benchmark. + +## Comparing with GNU sort + +Hyperfine accepts multiple commands to run and will compare them. To compare performance with GNU sort +duplicate the string you passed to hyperfine but remove the `target/release/coreutils` bit from it. + +Example: `hyperfine "target/release/coreutils sort shuffled_numbers_si.txt -h -o output.txt"` becomes +`hyperfine "target/release/coreutils sort shuffled_numbers_si.txt -h -o output.txt" "sort shuffled_numbers_si.txt -h -o output.txt"` +(This assumes GNU sort is installed as `sort`) + +## Memory and CPU usage + +The above benchmarks use hyperfine to measure the speed of sorting. There are however other useful metrics to determine overall +resource usage. One way to measure them is the `time` command. This is not to be confused with the `time` that is built in to the bash shell. +You may have to install `time` first, then you have to run it with `/bin/time -v` to give it precedence over the built in `time`. + +
+ Example output + + Command being timed: "target/release/coreutils sort shuffled_numbers.txt" + User time (seconds): 0.10 + System time (seconds): 0.00 + Percent of CPU this job got: 365% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 25360 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 5802 + Voluntary context switches: 462 + Involuntary context switches: 73 + Swaps: 0 + File system inputs: 1184 + File system outputs: 0 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +
+ +Useful metrics to look at could be: + +- User time +- Percent of CPU this job got +- Maximum resident set size diff --git a/src/uu/sort/Cargo.toml b/src/uu/sort/Cargo.toml index 814e4bbba..f06610248 100644 --- a/src/uu/sort/Cargo.toml +++ b/src/uu/sort/Cargo.toml @@ -15,12 +15,18 @@ edition = "2018" path = "src/sort.rs" [dependencies] -rayon = "1.5" -rand = "0.7" +binary-heap-plus = "0.4.1" clap = "2.33" +compare = "0.1.0" fnv = "1.0.7" -itertools = "0.8.0" +itertools = "0.10.0" +memchr = "2.4.0" +ouroboros = "0.9.3" +rand = "0.7" +rayon = "1.5" semver = "0.9.0" +tempfile = "3" +unicode-width = "0.1.8" uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["fs"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/sort/src/check.rs b/src/uu/sort/src/check.rs new file mode 100644 index 000000000..d3b9d6669 --- /dev/null +++ b/src/uu/sort/src/check.rs @@ -0,0 +1,103 @@ +// * This file is part of the uutils coreutils package. +// * +// * (c) Michael Debertol +// * +// * For the full copyright and license information, please view the LICENSE +// * file that was distributed with this source code. + +//! Check if a file is ordered + +use crate::{ + chunks::{self, Chunk}, + compare_by, open, GlobalSettings, +}; +use itertools::Itertools; +use std::{ + cmp::Ordering, + io::Read, + iter, + sync::mpsc::{sync_channel, Receiver, SyncSender}, + thread, +}; + +/// Check if the file at `path` is ordered. +/// +/// # Returns +/// +/// The code we should exit with. +pub fn check(path: &str, settings: &GlobalSettings) -> i32 { + let file = open(path); + let (recycled_sender, recycled_receiver) = sync_channel(2); + let (loaded_sender, loaded_receiver) = sync_channel(2); + thread::spawn({ + let settings = settings.clone(); + move || reader(file, recycled_receiver, loaded_sender, &settings) + }); + for _ in 0..2 { + recycled_sender + .send(Chunk::new(vec![0; 100 * 1024], |_| Vec::new())) + .unwrap(); + } + + let mut prev_chunk: Option = None; + let mut line_idx = 0; + for chunk in loaded_receiver.iter() { + line_idx += 1; + if let Some(prev_chunk) = prev_chunk.take() { + // Check if the first element of the new chunk is greater than the last + // element from the previous chunk + let prev_last = prev_chunk.borrow_lines().last().unwrap(); + let new_first = chunk.borrow_lines().first().unwrap(); + + if compare_by(prev_last, new_first, &settings) == Ordering::Greater { + if !settings.check_silent { + println!("sort: {}:{}: disorder: {}", path, line_idx, new_first.line); + } + return 1; + } + recycled_sender.send(prev_chunk).ok(); + } + + for (a, b) in chunk.borrow_lines().iter().tuple_windows() { + line_idx += 1; + if compare_by(a, b, &settings) == Ordering::Greater { + if !settings.check_silent { + println!("sort: {}:{}: disorder: {}", path, line_idx, b.line); + } + return 1; + } + } + + prev_chunk = Some(chunk); + } + 0 +} + +/// The function running on the reader thread. +fn reader( + mut file: Box, + receiver: Receiver, + sender: SyncSender, + settings: &GlobalSettings, +) { + let mut sender = Some(sender); + let mut carry_over = vec![]; + for chunk in receiver.iter() { + let (recycled_lines, recycled_buffer) = chunk.recycle(); + chunks::read( + &mut sender, + recycled_buffer, + None, + &mut carry_over, + &mut file, + &mut iter::empty(), + if settings.zero_terminated { + b'\0' + } else { + b'\n' + }, + recycled_lines, + settings, + ) + } +} diff --git a/src/uu/sort/src/chunks.rs b/src/uu/sort/src/chunks.rs new file mode 100644 index 000000000..6ec759211 --- /dev/null +++ b/src/uu/sort/src/chunks.rs @@ -0,0 +1,229 @@ +// * This file is part of the uutils coreutils package. +// * +// * (c) Michael Debertol +// * +// * For the full copyright and license information, please view the LICENSE +// * file that was distributed with this source code. + +//! Utilities for reading files as chunks. + +use std::{ + io::{ErrorKind, Read}, + sync::mpsc::SyncSender, +}; + +use memchr::memchr_iter; +use ouroboros::self_referencing; + +use crate::{GlobalSettings, Line}; + +/// The chunk that is passed around between threads. +/// `lines` consist of slices into `buffer`. +#[self_referencing(pub_extras)] +#[derive(Debug)] +pub struct Chunk { + pub buffer: Vec, + #[borrows(buffer)] + #[covariant] + pub lines: Vec>, +} + +impl Chunk { + /// Destroy this chunk and return its components to be reused. + /// + /// # Returns + /// + /// * The `lines` vector, emptied + /// * The `buffer` vector, **not** emptied + pub fn recycle(mut self) -> (Vec>, Vec) { + let recycled_lines = self.with_lines_mut(|lines| { + lines.clear(); + unsafe { + // SAFETY: It is safe to (temporarily) transmute to a vector of lines with a longer lifetime, + // because the vector is empty. + // Transmuting is necessary to make recycling possible. See https://github.com/rust-lang/rfcs/pull/2802 + // for a rfc to make this unnecessary. Its example is similar to the code here. + std::mem::transmute::>, Vec>>(std::mem::take(lines)) + } + }); + (recycled_lines, self.into_heads().buffer) + } +} + +/// Read a chunk, parse lines and send them. +/// +/// No empty chunk will be sent. If we reach the end of the input, sender_option +/// is set to None. If this function however does not set sender_option to None, +/// it is not guaranteed that there is still input left: If the input fits _exactly_ +/// into a buffer, we will only notice that there's nothing more to read at the next +/// invocation. +/// +/// # Arguments +/// +/// (see also `read_to_chunk` for a more detailed documentation) +/// +/// * `sender_option`: The sender to send the lines to the sorter. If `None`, this function does nothing. +/// * `buffer`: The recycled buffer. All contents will be overwritten, but it must already be filled. +/// (i.e. `buffer.len()` should be equal to `buffer.capacity()`) +/// * `max_buffer_size`: How big `buffer` can be. +/// * `carry_over`: The bytes that must be carried over in between invocations. +/// * `file`: The current file. +/// * `next_files`: What `file` should be updated to next. +/// * `separator`: The line separator. +/// * `lines`: The recycled vector to fill with lines. Must be empty. +/// * `settings`: The global settings. +#[allow(clippy::too_many_arguments)] +pub fn read( + sender_option: &mut Option>, + mut buffer: Vec, + max_buffer_size: Option, + carry_over: &mut Vec, + file: &mut Box, + next_files: &mut impl Iterator>, + separator: u8, + lines: Vec>, + settings: &GlobalSettings, +) { + assert!(lines.is_empty()); + if let Some(sender) = sender_option { + if buffer.len() < carry_over.len() { + buffer.resize(carry_over.len() + 10 * 1024, 0); + } + buffer[..carry_over.len()].copy_from_slice(&carry_over); + let (read, should_continue) = read_to_buffer( + file, + next_files, + &mut buffer, + max_buffer_size, + carry_over.len(), + separator, + ); + carry_over.clear(); + carry_over.extend_from_slice(&buffer[read..]); + + let payload = Chunk::new(buffer, |buf| { + let mut lines = unsafe { + // SAFETY: It is safe to transmute to a vector of lines with shorter lifetime, + // because it was only temporarily transmuted to a Vec> to make recycling possible. + std::mem::transmute::>, Vec>>(lines) + }; + let read = crash_if_err!(1, std::str::from_utf8(&buf[..read])); + parse_lines(read, &mut lines, separator, &settings); + lines + }); + if !payload.borrow_lines().is_empty() { + sender.send(payload).unwrap(); + } + if !should_continue { + *sender_option = None; + } + } +} + +/// Split `read` into `Line`s, and add them to `lines`. +fn parse_lines<'a>( + mut read: &'a str, + lines: &mut Vec>, + separator: u8, + settings: &GlobalSettings, +) { + // Strip a trailing separator. TODO: Once our MinRustV is 1.45 or above, use strip_suffix() instead. + if read.ends_with(separator as char) { + read = &read[..read.len() - 1]; + } + + lines.extend( + read.split(separator as char) + .map(|line| Line::create(line, settings)), + ); +} + +/// Read from `file` into `buffer`. +/// +/// This function makes sure that at least two lines are read (unless we reach EOF and there's no next file), +/// growing the buffer if necessary. +/// The last line is likely to not have been fully read into the buffer. Its bytes must be copied to +/// the front of the buffer for the next invocation so that it can be continued to be read +/// (see the return values and `start_offset`). +/// +/// # Arguments +/// +/// * `file`: The file to start reading from. +/// * `next_files`: When `file` reaches EOF, it is updated to `next_files.next()` if that is `Some`, +/// and this function continues reading. +/// * `buffer`: The buffer that is filled with bytes. Its contents will mostly be overwritten (see `start_offset` +/// as well). It will be grown up to `max_buffer_size` if necessary, but it will always grow to read at least two lines. +/// * `max_buffer_size`: Grow the buffer to at most this length. If None, the buffer will not grow, unless needed to read at least two lines. +/// * `start_offset`: The amount of bytes at the start of `buffer` that were carried over +/// from the previous read and should not be overwritten. +/// * `separator`: The byte that separates lines. +/// +/// # Returns +/// +/// * The amount of bytes in `buffer` that can now be interpreted as lines. +/// The remaining bytes must be copied to the start of the buffer for the next invocation, +/// if another invocation is necessary, which is determined by the other return value. +/// * Whether this function should be called again. +fn read_to_buffer( + file: &mut Box, + next_files: &mut impl Iterator>, + buffer: &mut Vec, + max_buffer_size: Option, + start_offset: usize, + separator: u8, +) -> (usize, bool) { + let mut read_target = &mut buffer[start_offset..]; + loop { + match file.read(read_target) { + Ok(0) => { + if read_target.is_empty() { + // chunk is full + if let Some(max_buffer_size) = max_buffer_size { + if max_buffer_size > buffer.len() { + // we can grow the buffer + let prev_len = buffer.len(); + if buffer.len() < max_buffer_size / 2 { + buffer.resize(buffer.len() * 2, 0); + } else { + buffer.resize(max_buffer_size, 0); + } + read_target = &mut buffer[prev_len..]; + continue; + } + } + let mut sep_iter = memchr_iter(separator, &buffer).rev(); + let last_line_end = sep_iter.next(); + if sep_iter.next().is_some() { + // We read enough lines. + let end = last_line_end.unwrap(); + // We want to include the separator here, because it shouldn't be carried over. + return (end + 1, true); + } else { + // We need to read more lines + let len = buffer.len(); + // resize the vector to 10 KB more + buffer.resize(len + 1024 * 10, 0); + read_target = &mut buffer[len..]; + } + } else { + // This file is empty. + if let Some(next_file) = next_files.next() { + // There is another file. + *file = next_file; + } else { + // This was the last file. + let leftover_len = read_target.len(); + return (buffer.len() - leftover_len, false); + } + } + } + Ok(n) => { + read_target = &mut read_target[n..]; + } + Err(e) if e.kind() == ErrorKind::Interrupted => { + // retry + } + Err(e) => crash!(1, "{}", e), + } + } +} diff --git a/src/uu/sort/src/custom_str_cmp.rs b/src/uu/sort/src/custom_str_cmp.rs new file mode 100644 index 000000000..a087a9fc2 --- /dev/null +++ b/src/uu/sort/src/custom_str_cmp.rs @@ -0,0 +1,64 @@ +// * This file is part of the uutils coreutils package. +// * +// * (c) Michael Debertol +// * +// * For the full copyright and license information, please view the LICENSE +// * file that was distributed with this source code. + +//! Custom string comparisons. +//! +//! The goal is to compare strings without transforming them first (i.e. not allocating new strings) + +use std::cmp::Ordering; + +fn filter_char(c: char, ignore_non_printing: bool, ignore_non_dictionary: bool) -> bool { + if ignore_non_dictionary && !(c.is_ascii_alphanumeric() || c.is_ascii_whitespace()) { + return false; + } + if ignore_non_printing && (c.is_ascii_control() || !c.is_ascii()) { + return false; + } + true +} + +fn cmp_chars(a: char, b: char, ignore_case: bool) -> Ordering { + if ignore_case { + a.to_ascii_uppercase().cmp(&b.to_ascii_uppercase()) + } else { + a.cmp(&b) + } +} + +pub fn custom_str_cmp( + a: &str, + b: &str, + ignore_non_printing: bool, + ignore_non_dictionary: bool, + ignore_case: bool, +) -> Ordering { + if !(ignore_case || ignore_non_dictionary || ignore_non_printing) { + // There are no custom settings. Fall back to the default strcmp, which is faster. + return a.cmp(&b); + } + let mut a_chars = a + .chars() + .filter(|&c| filter_char(c, ignore_non_printing, ignore_non_dictionary)); + let mut b_chars = b + .chars() + .filter(|&c| filter_char(c, ignore_non_printing, ignore_non_dictionary)); + loop { + let a_char = a_chars.next(); + let b_char = b_chars.next(); + match (a_char, b_char) { + (None, None) => return Ordering::Equal, + (Some(_), None) => return Ordering::Greater, + (None, Some(_)) => return Ordering::Less, + (Some(a_char), Some(b_char)) => { + let ordering = cmp_chars(a_char, b_char, ignore_case); + if ordering != Ordering::Equal { + return ordering; + } + } + } + } +} diff --git a/src/uu/sort/src/ext_sort.rs b/src/uu/sort/src/ext_sort.rs new file mode 100644 index 000000000..9b1845efa --- /dev/null +++ b/src/uu/sort/src/ext_sort.rs @@ -0,0 +1,206 @@ +// * This file is part of the uutils coreutils package. +// * +// * (c) Michael Debertol +// * +// * For the full copyright and license information, please view the LICENSE +// * file that was distributed with this source code. + +//! Sort big files by using auxiliary files for storing intermediate chunks. +//! +//! Files are read into chunks of memory which are then sorted individually and +//! written to temporary files. There are two threads: One sorter, and one reader/writer. +//! The buffers for the individual chunks are recycled. There are two buffers. + +use std::cmp::Ordering; +use std::io::{BufWriter, Write}; +use std::path::Path; +use std::{ + fs::OpenOptions, + io::Read, + sync::mpsc::{Receiver, SyncSender}, + thread, +}; + +use itertools::Itertools; + +use tempfile::TempDir; + +use crate::{ + chunks::{self, Chunk}, + compare_by, merge, output_sorted_lines, sort_by, GlobalSettings, +}; + +const MIN_BUFFER_SIZE: usize = 8_000; + +/// Sort files by using auxiliary files for storing intermediate chunks (if needed), and output the result. +pub fn ext_sort(files: &mut impl Iterator>, settings: &GlobalSettings) { + let tmp_dir = crash_if_err!( + 1, + tempfile::Builder::new() + .prefix("uutils_sort") + .tempdir_in(&settings.tmp_dir) + ); + let (sorted_sender, sorted_receiver) = std::sync::mpsc::sync_channel(1); + let (recycled_sender, recycled_receiver) = std::sync::mpsc::sync_channel(1); + thread::spawn({ + let settings = settings.clone(); + move || sorter(recycled_receiver, sorted_sender, settings) + }); + let read_result = reader_writer( + files, + &tmp_dir, + if settings.zero_terminated { + b'\0' + } else { + b'\n' + }, + // Heuristically chosen: Dividing by 10 seems to keep our memory usage roughly + // around settings.buffer_size as a whole. + settings.buffer_size / 10, + settings.clone(), + sorted_receiver, + recycled_sender, + ); + match read_result { + ReadResult::WroteChunksToFile { chunks_written } => { + let files = (0..chunks_written) + .map(|chunk_num| tmp_dir.path().join(chunk_num.to_string())) + .collect::>(); + let mut merger = merge::merge(&files, settings); + merger.write_all(settings); + } + ReadResult::SortedSingleChunk(chunk) => { + output_sorted_lines(chunk.borrow_lines().iter(), settings); + } + ReadResult::SortedTwoChunks([a, b]) => { + let merged_iter = a + .borrow_lines() + .iter() + .merge_by(b.borrow_lines().iter(), |line_a, line_b| { + compare_by(line_a, line_b, settings) != Ordering::Greater + }); + output_sorted_lines(merged_iter, settings); + } + ReadResult::EmptyInput => { + // don't output anything + } + } +} + +/// The function that is executed on the sorter thread. +fn sorter(receiver: Receiver, sender: SyncSender, settings: GlobalSettings) { + while let Ok(mut payload) = receiver.recv() { + payload.with_lines_mut(|lines| sort_by(lines, &settings)); + sender.send(payload).unwrap(); + } +} + +/// Describes how we read the chunks from the input. +enum ReadResult { + /// The input was empty. Nothing was read. + EmptyInput, + /// The input fits into a single Chunk, which was kept in memory. + SortedSingleChunk(Chunk), + /// The input fits into two chunks, which were kept in memory. + SortedTwoChunks([Chunk; 2]), + /// The input was read into multiple chunks, which were written to auxiliary files. + WroteChunksToFile { + /// The number of chunks written to auxiliary files. + chunks_written: usize, + }, +} + +/// The function that is executed on the reader/writer thread. +/// +/// # Returns +/// * The number of chunks read. +fn reader_writer( + mut files: impl Iterator>, + tmp_dir: &TempDir, + separator: u8, + buffer_size: usize, + settings: GlobalSettings, + receiver: Receiver, + sender: SyncSender, +) -> ReadResult { + let mut sender_option = Some(sender); + + let mut file = files.next().unwrap(); + + let mut carry_over = vec![]; + // kick things off with two reads + for _ in 0..2 { + chunks::read( + &mut sender_option, + vec![0; MIN_BUFFER_SIZE], + Some(buffer_size), + &mut carry_over, + &mut file, + &mut files, + separator, + Vec::new(), + &settings, + ); + if sender_option.is_none() { + // We have already read the whole input. Since we are in our first two reads, + // this means that we can fit the whole input into memory. Bypass writing below and + // handle this case in a more straightforward way. + return if let Ok(first_chunk) = receiver.recv() { + if let Ok(second_chunk) = receiver.recv() { + ReadResult::SortedTwoChunks([first_chunk, second_chunk]) + } else { + ReadResult::SortedSingleChunk(first_chunk) + } + } else { + ReadResult::EmptyInput + }; + } + } + + let mut file_number = 0; + loop { + let mut chunk = match receiver.recv() { + Ok(it) => it, + _ => { + return ReadResult::WroteChunksToFile { + chunks_written: file_number, + } + } + }; + + write( + &mut chunk, + &tmp_dir.path().join(file_number.to_string()), + separator, + ); + + file_number += 1; + + let (recycled_lines, recycled_buffer) = chunk.recycle(); + + chunks::read( + &mut sender_option, + recycled_buffer, + None, + &mut carry_over, + &mut file, + &mut files, + separator, + recycled_lines, + &settings, + ); + } +} + +/// Write the lines in `chunk` to `file`, separated by `separator`. +fn write(chunk: &mut Chunk, file: &Path, separator: u8) { + chunk.with_lines_mut(|lines| { + // Write the lines to the file + let file = crash_if_err!(1, OpenOptions::new().create(true).write(true).open(file)); + let mut writer = BufWriter::new(file); + for s in lines.iter() { + crash_if_err!(1, writer.write_all(s.line.as_bytes())); + crash_if_err!(1, writer.write_all(&[separator])); + } + }); +} diff --git a/src/uu/sort/src/merge.rs b/src/uu/sort/src/merge.rs new file mode 100644 index 000000000..696353829 --- /dev/null +++ b/src/uu/sort/src/merge.rs @@ -0,0 +1,224 @@ +//! Merge already sorted files. +//! +//! We achieve performance by splitting the tasks of sorting and writing, and reading and parsing between two threads. +//! The threads communicate over channels. There's one channel per file in the direction reader -> sorter, but only +//! one channel from the sorter back to the reader. The channels to the sorter are used to send the read chunks. +//! The sorter reads the next chunk from the channel whenever it needs the next chunk after running out of lines +//! from the previous read of the file. The channel back from the sorter to the reader has two purposes: To allow the reader +//! to reuse memory allocations and to tell the reader which file to read from next. + +use std::{ + cmp::Ordering, + ffi::OsStr, + io::{Read, Write}, + iter, + rc::Rc, + sync::mpsc::{channel, sync_channel, Receiver, Sender, SyncSender}, + thread, +}; + +use compare::Compare; + +use crate::{ + chunks::{self, Chunk}, + compare_by, open, GlobalSettings, +}; + +// Merge already sorted files. +pub fn merge<'a>(files: &[impl AsRef], settings: &'a GlobalSettings) -> FileMerger<'a> { + let (request_sender, request_receiver) = channel(); + let mut reader_files = Vec::with_capacity(files.len()); + let mut loaded_receivers = Vec::with_capacity(files.len()); + for (file_number, file) in files.iter().map(open).enumerate() { + let (sender, receiver) = sync_channel(2); + loaded_receivers.push(receiver); + reader_files.push(ReaderFile { + file, + sender: Some(sender), + carry_over: vec![], + }); + request_sender + .send((file_number, Chunk::new(vec![0; 8 * 1024], |_| Vec::new()))) + .unwrap(); + } + + for file_number in 0..reader_files.len() { + request_sender + .send((file_number, Chunk::new(vec![0; 8 * 1024], |_| Vec::new()))) + .unwrap(); + } + + thread::spawn({ + let settings = settings.clone(); + move || { + reader( + request_receiver, + &mut reader_files, + &settings, + if settings.zero_terminated { + b'\0' + } else { + b'\n' + }, + ) + } + }); + + let mut mergeable_files = vec![]; + + for (file_number, receiver) in loaded_receivers.into_iter().enumerate() { + mergeable_files.push(MergeableFile { + current_chunk: Rc::new(receiver.recv().unwrap()), + file_number, + line_idx: 0, + receiver, + }) + } + + FileMerger { + heap: binary_heap_plus::BinaryHeap::from_vec_cmp( + mergeable_files, + FileComparator { settings }, + ), + request_sender, + prev: None, + } +} +/// The struct on the reader thread representing an input file +struct ReaderFile { + file: Box, + sender: Option>, + carry_over: Vec, +} + +/// The function running on the reader thread. +fn reader( + recycled_receiver: Receiver<(usize, Chunk)>, + files: &mut [ReaderFile], + settings: &GlobalSettings, + separator: u8, +) { + for (file_idx, chunk) in recycled_receiver.iter() { + let (recycled_lines, recycled_buffer) = chunk.recycle(); + let ReaderFile { + file, + sender, + carry_over, + } = &mut files[file_idx]; + chunks::read( + sender, + recycled_buffer, + None, + carry_over, + file, + &mut iter::empty(), + separator, + recycled_lines, + settings, + ); + } +} +/// The struct on the main thread representing an input file +pub struct MergeableFile { + current_chunk: Rc, + line_idx: usize, + receiver: Receiver, + file_number: usize, +} + +/// A struct to keep track of the previous line we encountered. +/// +/// This is required for deduplication purposes. +struct PreviousLine { + chunk: Rc, + line_idx: usize, + file_number: usize, +} + +/// Merges files together. This is **not** an iterator because of lifetime problems. +pub struct FileMerger<'a> { + heap: binary_heap_plus::BinaryHeap>, + request_sender: Sender<(usize, Chunk)>, + prev: Option, +} + +impl<'a> FileMerger<'a> { + /// Write the merged contents to the output file. + pub fn write_all(&mut self, settings: &GlobalSettings) { + let mut out = settings.out_writer(); + while self.write_next(settings, &mut out) {} + } + + fn write_next(&mut self, settings: &GlobalSettings, out: &mut impl Write) -> bool { + if let Some(file) = self.heap.peek() { + let prev = self.prev.replace(PreviousLine { + chunk: file.current_chunk.clone(), + line_idx: file.line_idx, + file_number: file.file_number, + }); + + file.current_chunk.with_lines(|lines| { + let current_line = &lines[file.line_idx]; + if settings.unique { + if let Some(prev) = &prev { + let cmp = compare_by( + &prev.chunk.borrow_lines()[prev.line_idx], + current_line, + settings, + ); + if cmp == Ordering::Equal { + return; + } + } + } + current_line.print(out, settings); + }); + + let was_last_line_for_file = + file.current_chunk.borrow_lines().len() == file.line_idx + 1; + + if was_last_line_for_file { + if let Ok(next_chunk) = file.receiver.recv() { + let mut file = self.heap.peek_mut().unwrap(); + file.current_chunk = Rc::new(next_chunk); + file.line_idx = 0; + } else { + self.heap.pop(); + } + } else { + self.heap.peek_mut().unwrap().line_idx += 1; + } + + if let Some(prev) = prev { + if let Ok(prev_chunk) = Rc::try_unwrap(prev.chunk) { + self.request_sender + .send((prev.file_number, prev_chunk)) + .ok(); + } + } + } + !self.heap.is_empty() + } +} + +/// Compares files by their current line. +struct FileComparator<'a> { + settings: &'a GlobalSettings, +} + +impl<'a> Compare for FileComparator<'a> { + fn compare(&self, a: &MergeableFile, b: &MergeableFile) -> Ordering { + let mut cmp = compare_by( + &a.current_chunk.borrow_lines()[a.line_idx], + &b.current_chunk.borrow_lines()[b.line_idx], + self.settings, + ); + if cmp == Ordering::Equal { + // To make sorting stable, we need to consider the file number as well, + // as lines from a file with a lower number are to be considered "earlier". + cmp = a.file_number.cmp(&b.file_number); + } + // Our BinaryHeap is a max heap. We use it as a min heap, so we need to reverse the ordering. + cmp.reverse() + } +} diff --git a/src/uu/sort/src/numeric_str_cmp.rs b/src/uu/sort/src/numeric_str_cmp.rs new file mode 100644 index 000000000..03806b0c8 --- /dev/null +++ b/src/uu/sort/src/numeric_str_cmp.rs @@ -0,0 +1,467 @@ +// * This file is part of the uutils coreutils package. +// * +// * (c) Michael Debertol +// * +// * For the full copyright and license information, please view the LICENSE +// * file that was distributed with this source code. + +//! Fast comparison for strings representing a base 10 number without precision loss. +//! +//! To be able to short-circuit when comparing, [NumInfo] must be passed along with each number +//! to [numeric_str_cmp]. [NumInfo] is generally obtained by calling [NumInfo::parse] and should be cached. +//! It is allowed to arbitrarily modify the exponent afterwards, which is equivalent to shifting the decimal point. +//! +//! More specifically, exponent can be understood so that the original number is in (1..10)*10^exponent. +//! From that follows the constraints of this algorithm: It is able to compare numbers in ±(1*10^[i64::MIN]..10*10^[i64::MAX]). + +use std::{cmp::Ordering, ops::Range}; + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +enum Sign { + Negative, + Positive, +} + +#[derive(Debug, PartialEq, Clone)] +pub struct NumInfo { + exponent: i64, + sign: Sign, +} +#[derive(Debug, PartialEq, Clone)] +pub struct NumInfoParseSettings { + pub accept_si_units: bool, + pub thousands_separator: Option, + pub decimal_pt: Option, +} + +impl Default for NumInfoParseSettings { + fn default() -> Self { + Self { + accept_si_units: false, + thousands_separator: None, + decimal_pt: Some('.'), + } + } +} + +impl NumInfo { + /// Parse NumInfo for this number. + /// Also returns the range of num that should be passed to numeric_str_cmp later + pub fn parse(num: &str, parse_settings: NumInfoParseSettings) -> (Self, Range) { + let mut exponent = -1; + let mut had_decimal_pt = false; + let mut had_digit = false; + let mut start = None; + let mut sign = Sign::Positive; + + let mut first_char = true; + + for (idx, char) in num.char_indices() { + if first_char && char.is_whitespace() { + continue; + } + + if first_char && char == '-' { + sign = Sign::Negative; + first_char = false; + continue; + } + first_char = false; + + if matches!( + parse_settings.thousands_separator, + Some(c) if c == char + ) { + continue; + } + + if Self::is_invalid_char(char, &mut had_decimal_pt, &parse_settings) { + let si_unit = if parse_settings.accept_si_units { + match char { + 'K' | 'k' => 3, + 'M' => 6, + 'G' => 9, + 'T' => 12, + 'P' => 15, + 'E' => 18, + 'Z' => 21, + 'Y' => 24, + _ => 0, + } + } else { + 0 + }; + return if let Some(start) = start { + ( + NumInfo { + exponent: exponent + si_unit, + sign, + }, + start..idx, + ) + } else { + ( + NumInfo { + sign: if had_digit { sign } else { Sign::Positive }, + exponent: 0, + }, + 0..0, + ) + }; + } + if Some(char) == parse_settings.decimal_pt { + continue; + } + had_digit = true; + if start.is_none() && char == '0' { + if had_decimal_pt { + // We're parsing a number whose first nonzero digit is after the decimal point. + exponent -= 1; + } else { + // Skip leading zeroes + continue; + } + } + if !had_decimal_pt { + exponent += 1; + } + if start.is_none() && char != '0' { + start = Some(idx); + } + } + if let Some(start) = start { + (NumInfo { exponent, sign }, start..num.len()) + } else { + ( + NumInfo { + sign: if had_digit { sign } else { Sign::Positive }, + exponent: 0, + }, + if had_digit { + // In this case there were only zeroes. + // For debug output to work properly, we have to claim to match the end of the number. + num.len()..num.len() + } else { + // This was no number at all. + // For debug output to work properly, we have to claim to match the start of the number. + 0..0 + }, + ) + } + } + + fn is_invalid_char( + c: char, + had_decimal_pt: &mut bool, + parse_settings: &NumInfoParseSettings, + ) -> bool { + if Some(c) == parse_settings.decimal_pt { + if *had_decimal_pt { + // this is a decimal pt but we already had one, so it is invalid + true + } else { + *had_decimal_pt = true; + false + } + } else { + !c.is_ascii_digit() + } + } +} + +/// compare two numbers as strings without parsing them as a number first. This should be more performant and can handle numbers more precisely. +/// NumInfo is needed to provide a fast path for most numbers. +pub fn numeric_str_cmp((a, a_info): (&str, &NumInfo), (b, b_info): (&str, &NumInfo)) -> Ordering { + // check for a difference in the sign + if a_info.sign != b_info.sign { + return if a.is_empty() && b.is_empty() { + Ordering::Equal + } else { + a_info.sign.cmp(&b_info.sign) + }; + } + + // check for a difference in the exponent + let ordering = if a_info.exponent != b_info.exponent && !a.is_empty() && !b.is_empty() { + a_info.exponent.cmp(&b_info.exponent) + } else { + // walk the characters from the front until we find a difference + let mut a_chars = a.chars().filter(|c| c.is_ascii_digit()); + let mut b_chars = b.chars().filter(|c| c.is_ascii_digit()); + loop { + let a_next = a_chars.next(); + let b_next = b_chars.next(); + match (a_next, b_next) { + (None, None) => break Ordering::Equal, + (Some(c), None) => { + break if c == '0' && a_chars.all(|c| c == '0') { + Ordering::Equal + } else { + Ordering::Greater + } + } + (None, Some(c)) => { + break if c == '0' && b_chars.all(|c| c == '0') { + Ordering::Equal + } else { + Ordering::Less + } + } + (Some(a_char), Some(b_char)) => { + let ord = a_char.cmp(&b_char); + if ord != Ordering::Equal { + break ord; + } + } + } + } + }; + + if a_info.sign == Sign::Negative { + ordering.reverse() + } else { + ordering + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parses_exp() { + let n = "1"; + assert_eq!( + NumInfo::parse(n, Default::default()), + ( + NumInfo { + exponent: 0, + sign: Sign::Positive + }, + 0..1 + ) + ); + let n = "100"; + assert_eq!( + NumInfo::parse(n, Default::default()), + ( + NumInfo { + exponent: 2, + sign: Sign::Positive + }, + 0..3 + ) + ); + let n = "1,000"; + assert_eq!( + NumInfo::parse( + n, + NumInfoParseSettings { + thousands_separator: Some(','), + ..Default::default() + } + ), + ( + NumInfo { + exponent: 3, + sign: Sign::Positive + }, + 0..5 + ) + ); + let n = "1,000"; + assert_eq!( + NumInfo::parse(n, Default::default()), + ( + NumInfo { + exponent: 0, + sign: Sign::Positive + }, + 0..1 + ) + ); + let n = "1000.00"; + assert_eq!( + NumInfo::parse(n, Default::default()), + ( + NumInfo { + exponent: 3, + sign: Sign::Positive + }, + 0..7 + ) + ); + } + #[test] + fn parses_negative_exp() { + let n = "0.00005"; + assert_eq!( + NumInfo::parse(n, Default::default()), + ( + NumInfo { + exponent: -5, + sign: Sign::Positive + }, + 6..7 + ) + ); + let n = "00000.00005"; + assert_eq!( + NumInfo::parse(n, Default::default()), + ( + NumInfo { + exponent: -5, + sign: Sign::Positive + }, + 10..11 + ) + ); + } + + #[test] + fn parses_sign() { + let n = "5"; + assert_eq!( + NumInfo::parse(n, Default::default()), + ( + NumInfo { + exponent: 0, + sign: Sign::Positive + }, + 0..1 + ) + ); + let n = "-5"; + assert_eq!( + NumInfo::parse(n, Default::default()), + ( + NumInfo { + exponent: 0, + sign: Sign::Negative + }, + 1..2 + ) + ); + let n = " -5"; + assert_eq!( + NumInfo::parse(n, Default::default()), + ( + NumInfo { + exponent: 0, + sign: Sign::Negative + }, + 5..6 + ) + ); + } + + fn test_helper(a: &str, b: &str, expected: Ordering) { + let (a_info, a_range) = NumInfo::parse(a, Default::default()); + let (b_info, b_range) = NumInfo::parse(b, Default::default()); + let ordering = numeric_str_cmp( + (&a[a_range.to_owned()], &a_info), + (&b[b_range.to_owned()], &b_info), + ); + assert_eq!(ordering, expected); + let ordering = numeric_str_cmp((&b[b_range], &b_info), (&a[a_range], &a_info)); + assert_eq!(ordering, expected.reverse()); + } + #[test] + fn test_single_digit() { + test_helper("1", "2", Ordering::Less); + test_helper("0", "0", Ordering::Equal); + } + #[test] + fn test_minus() { + test_helper("-1", "-2", Ordering::Greater); + test_helper("-0", "-0", Ordering::Equal); + } + #[test] + fn test_different_len() { + test_helper("-20", "-100", Ordering::Greater); + test_helper("10.0", "2.000000", Ordering::Greater); + } + #[test] + fn test_decimal_digits() { + test_helper("20.1", "20.2", Ordering::Less); + test_helper("20.1", "20.15", Ordering::Less); + test_helper("-20.1", "+20.15", Ordering::Less); + test_helper("-20.1", "-20", Ordering::Less); + } + #[test] + fn test_trailing_zeroes() { + test_helper("20.00000", "20.1", Ordering::Less); + test_helper("20.00000", "20.0", Ordering::Equal); + } + #[test] + fn test_invalid_digits() { + test_helper("foo", "bar", Ordering::Equal); + test_helper("20.1", "a", Ordering::Greater); + test_helper("-20.1", "a", Ordering::Less); + test_helper("a", "0.15", Ordering::Less); + } + #[test] + fn test_multiple_decimal_pts() { + test_helper("10.0.0", "50.0.0", Ordering::Less); + test_helper("0.1.", "0.2.0", Ordering::Less); + test_helper("1.1.", "0", Ordering::Greater); + test_helper("1.1.", "-0", Ordering::Greater); + } + #[test] + fn test_leading_decimal_pts() { + test_helper(".0", ".0", Ordering::Equal); + test_helper(".1", ".0", Ordering::Greater); + test_helper(".02", "0", Ordering::Greater); + } + #[test] + fn test_leading_zeroes() { + test_helper("000000.0", ".0", Ordering::Equal); + test_helper("0.1", "0000000000000.0", Ordering::Greater); + test_helper("-01", "-2", Ordering::Greater); + } + + #[test] + fn minus_zero() { + // This matches GNU sort behavior. + test_helper("-0", "0", Ordering::Equal); + test_helper("-0x", "0", Ordering::Equal); + } + #[test] + fn double_minus() { + test_helper("--1", "0", Ordering::Equal); + } + #[test] + fn single_minus() { + let info = NumInfo::parse("-", Default::default()); + assert_eq!( + info, + ( + NumInfo { + exponent: 0, + sign: Sign::Positive + }, + 0..0 + ) + ); + } + #[test] + fn invalid_with_unit() { + let info = NumInfo::parse( + "-K", + NumInfoParseSettings { + accept_si_units: true, + ..Default::default() + }, + ); + assert_eq!( + info, + ( + NumInfo { + exponent: 0, + sign: Sign::Positive + }, + 0..0 + ) + ); + } +} diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index 4e0e25d65..0efce00e6 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -2,10 +2,10 @@ // * // * (c) Michael Yin // * (c) Robert Swinford +// * (c) Michael Debertol // * // * For the full copyright and license information, please view the LICENSE // * file that was distributed with this source code. -#![allow(dead_code)] // Although these links don't always seem to describe reality, check out the POSIX and GNU specs: // https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html @@ -15,37 +15,71 @@ #[macro_use] extern crate uucore; +mod check; +mod chunks; +mod custom_str_cmp; +mod ext_sort; +mod merge; +mod numeric_str_cmp; + use clap::{App, Arg}; +use custom_str_cmp::custom_str_cmp; +use ext_sort::ext_sort; use fnv::FnvHasher; use itertools::Itertools; +use numeric_str_cmp::{numeric_str_cmp, NumInfo, NumInfoParseSettings}; use rand::distributions::Alphanumeric; use rand::{thread_rng, Rng}; use rayon::prelude::*; use semver::Version; use std::cmp::Ordering; -use std::collections::BinaryHeap; use std::env; +use std::ffi::OsStr; use std::fs::File; use std::hash::{Hash, Hasher}; -use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Lines, Read, Write}; -use std::mem::replace; +use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Read, Write}; +use std::ops::Range; use std::path::Path; -use uucore::fs::is_stdin_interactive; // for Iterator::dedup() +use std::path::PathBuf; +use unicode_width::UnicodeWidthStr; +use uucore::InvalidEncodingHandling; static NAME: &str = "sort"; static ABOUT: &str = "Display sorted concatenation of all FILE(s)."; static VERSION: &str = env!("CARGO_PKG_VERSION"); +const LONG_HELP_KEYS: &str = "The key format is FIELD[.CHAR][OPTIONS][,FIELD[.CHAR]][OPTIONS]. + +Fields by default are separated by the first whitespace after a non-whitespace character. Use -t to specify a custom separator. +In the default case, whitespace is appended at the beginning of each field. Custom separators however are not included in fields. + +FIELD and CHAR both start at 1 (i.e. they are 1-indexed). If there is no end specified after a comma, the end will be the end of the line. +If CHAR is set 0, it means the end of the field. CHAR defaults to 1 for the start position and to 0 for the end position. + +Valid options are: MbdfhnRrV. They override the global options for this key."; + static OPT_HUMAN_NUMERIC_SORT: &str = "human-numeric-sort"; static OPT_MONTH_SORT: &str = "month-sort"; static OPT_NUMERIC_SORT: &str = "numeric-sort"; static OPT_GENERAL_NUMERIC_SORT: &str = "general-numeric-sort"; static OPT_VERSION_SORT: &str = "version-sort"; +static OPT_SORT: &str = "sort"; + +static ALL_SORT_MODES: &[&str] = &[ + OPT_GENERAL_NUMERIC_SORT, + OPT_HUMAN_NUMERIC_SORT, + OPT_MONTH_SORT, + OPT_NUMERIC_SORT, + OPT_VERSION_SORT, + OPT_RANDOM, +]; + static OPT_DICTIONARY_ORDER: &str = "dictionary-order"; static OPT_MERGE: &str = "merge"; static OPT_CHECK: &str = "check"; static OPT_CHECK_SILENT: &str = "check-silent"; +static OPT_DEBUG: &str = "debug"; static OPT_IGNORE_CASE: &str = "ignore-case"; static OPT_IGNORE_BLANKS: &str = "ignore-blanks"; static OPT_IGNORE_NONPRINTING: &str = "ignore-nonprinting"; @@ -53,30 +87,45 @@ static OPT_OUTPUT: &str = "output"; static OPT_REVERSE: &str = "reverse"; static OPT_STABLE: &str = "stable"; static OPT_UNIQUE: &str = "unique"; +static OPT_KEY: &str = "key"; +static OPT_SEPARATOR: &str = "field-separator"; static OPT_RANDOM: &str = "random-sort"; static OPT_ZERO_TERMINATED: &str = "zero-terminated"; static OPT_PARALLEL: &str = "parallel"; static OPT_FILES0_FROM: &str = "files0-from"; +static OPT_BUF_SIZE: &str = "buffer-size"; +static OPT_TMP_DIR: &str = "temporary-directory"; static ARG_FILES: &str = "files"; static DECIMAL_PT: char = '.'; -static THOUSANDS_SEP: char = ','; -static NEGATIVE: char = '-'; -static POSITIVE: char = '+'; -#[derive(Eq, Ord, PartialEq, PartialOrd)] +const NEGATIVE: char = '-'; +const POSITIVE: char = '+'; + +// Choosing a higher buffer size does not result in performance improvements +// (at least not on my machine). TODO: In the future, we should also take the amount of +// available memory into consideration, instead of relying on this constant only. +static DEFAULT_BUF_SIZE: usize = 1_000_000_000; // 1 GB + +#[derive(Eq, Ord, PartialEq, PartialOrd, Clone, Copy)] enum SortMode { Numeric, HumanNumeric, GeneralNumeric, Month, Version, + Random, Default, } - -struct Settings { +#[derive(Clone)] +pub struct GlobalSettings { mode: SortMode, + debug: bool, + ignore_blanks: bool, + ignore_case: bool, + dictionary_order: bool, + ignore_non_printing: bool, merge: bool, reverse: bool, outfile: Option, @@ -84,18 +133,67 @@ struct Settings { unique: bool, check: bool, check_silent: bool, - random: bool, - compare_fn: fn(&str, &str) -> Ordering, - transform_fns: Vec String>, - threads: String, salt: String, + selectors: Vec, + separator: Option, + threads: String, zero_terminated: bool, + buffer_size: usize, + tmp_dir: PathBuf, } -impl Default for Settings { - fn default() -> Settings { - Settings { +impl GlobalSettings { + /// Interpret this `&str` as a number with an optional trailing si unit. + /// + /// If there is no trailing si unit, the implicit unit is K. + /// The suffix B causes the number to be interpreted as a byte count. + fn parse_byte_count(input: &str) -> usize { + const SI_UNITS: &[char] = &['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; + + let input = input.trim(); + + let (num_str, si_unit) = + if input.ends_with(|c: char| SI_UNITS.contains(&c.to_ascii_uppercase())) { + let mut chars = input.chars(); + let si_suffix = chars.next_back().unwrap().to_ascii_uppercase(); + let si_unit = SI_UNITS.iter().position(|&c| c == si_suffix).unwrap(); + let num_str = chars.as_str(); + (num_str, si_unit) + } else { + (input, 1) + }; + + let num_usize: usize = num_str + .trim() + .parse() + .unwrap_or_else(|e| crash!(1, "failed to parse buffer size `{}`: {}", num_str, e)); + + num_usize.saturating_mul(1000usize.saturating_pow(si_unit as u32)) + } + + fn out_writer(&self) -> BufWriter> { + match self.outfile { + Some(ref filename) => match File::create(Path::new(&filename)) { + Ok(f) => BufWriter::new(Box::new(f) as Box), + Err(e) => { + show_error!("{0}: {1}", filename, e.to_string()); + panic!("Could not open output file"); + } + }, + None => BufWriter::new(Box::new(stdout()) as Box), + } + } +} + +impl Default for GlobalSettings { + fn default() -> GlobalSettings { + GlobalSettings { mode: SortMode::Default, + debug: false, + ignore_blanks: false, + ignore_case: false, + dictionary_order: false, + ignore_non_printing: false, merge: false, reverse: false, outfile: None, @@ -103,88 +201,525 @@ impl Default for Settings { unique: false, check: false, check_silent: false, - random: false, - compare_fn: default_compare, - transform_fns: Vec::new(), - threads: String::new(), salt: String::new(), + selectors: vec![], + separator: None, + threads: String::new(), zero_terminated: false, + buffer_size: DEFAULT_BUF_SIZE, + tmp_dir: PathBuf::new(), + } + } +} +#[derive(Clone)] +struct KeySettings { + mode: SortMode, + ignore_blanks: bool, + ignore_case: bool, + dictionary_order: bool, + ignore_non_printing: bool, + reverse: bool, +} + +impl From<&GlobalSettings> for KeySettings { + fn from(settings: &GlobalSettings) -> Self { + Self { + mode: settings.mode, + ignore_blanks: settings.ignore_blanks, + ignore_case: settings.ignore_case, + ignore_non_printing: settings.ignore_non_printing, + reverse: settings.reverse, + dictionary_order: settings.dictionary_order, } } } -struct MergeableFile<'a> { - lines: Lines>>, - current_line: String, - settings: &'a Settings, +#[derive(Clone, Debug)] +enum NumCache { + AsF64(GeneralF64ParseResult), + WithInfo(NumInfo), } -// BinaryHeap depends on `Ord`. Note that we want to pop smallest items -// from the heap first, and BinaryHeap.pop() returns the largest, so we -// trick it into the right order by calling reverse() here. -impl<'a> Ord for MergeableFile<'a> { - fn cmp(&self, other: &MergeableFile) -> Ordering { - compare_by(&self.current_line, &other.current_line, &self.settings).reverse() +impl NumCache { + fn as_f64(&self) -> GeneralF64ParseResult { + match self { + NumCache::AsF64(n) => *n, + _ => unreachable!(), + } + } + fn as_num_info(&self) -> &NumInfo { + match self { + NumCache::WithInfo(n) => n, + _ => unreachable!(), + } } } -impl<'a> PartialOrd for MergeableFile<'a> { - fn partial_cmp(&self, other: &MergeableFile) -> Option { - Some(self.cmp(other)) +#[derive(Clone, Debug)] +struct Selection<'a> { + slice: &'a str, + num_cache: Option>, +} + +type Field = Range; + +#[derive(Clone, Debug)] +pub struct Line<'a> { + line: &'a str, + selections: Box<[Selection<'a>]>, +} + +impl<'a> Line<'a> { + fn create(string: &'a str, settings: &GlobalSettings) -> Self { + let fields = if settings + .selectors + .iter() + .any(|selector| selector.needs_tokens) + { + // Only tokenize if we will need tokens. + Some(tokenize(string, settings.separator)) + } else { + None + }; + + Line { + line: string, + selections: settings + .selectors + .iter() + .filter(|selector| !selector.is_default_selection) + .map(|selector| selector.get_selection(string, fields.as_deref())) + .collect(), + } + } + + fn print(&self, writer: &mut impl Write, settings: &GlobalSettings) { + if settings.zero_terminated && !settings.debug { + crash_if_err!(1, writer.write_all(self.line.as_bytes())); + crash_if_err!(1, writer.write_all("\0".as_bytes())); + } else if !settings.debug { + crash_if_err!(1, writer.write_all(self.line.as_bytes())); + crash_if_err!(1, writer.write_all("\n".as_bytes())); + } else { + crash_if_err!(1, self.print_debug(settings, writer)); + } + } + + /// Writes indicators for the selections this line matched. The original line content is NOT expected + /// to be already printed. + fn print_debug( + &self, + settings: &GlobalSettings, + writer: &mut impl Write, + ) -> std::io::Result<()> { + // We do not consider this function performance critical, as debug output is only useful for small files, + // which are not a performance problem in any case. Therefore there aren't any special performance + // optimizations here. + + let line = self.line.replace('\t', ">"); + writeln!(writer, "{}", line)?; + + let fields = tokenize(&self.line, settings.separator); + for selector in settings.selectors.iter() { + let mut selection = selector.get_range(&self.line, Some(&fields)); + match selector.settings.mode { + SortMode::Numeric | SortMode::HumanNumeric => { + // find out which range is used for numeric comparisons + let (_, num_range) = NumInfo::parse( + &self.line[selection.clone()], + NumInfoParseSettings { + accept_si_units: selector.settings.mode == SortMode::HumanNumeric, + ..Default::default() + }, + ); + let initial_selection = selection.clone(); + + // Shorten selection to num_range. + selection.start += num_range.start; + selection.end = selection.start + num_range.len(); + + // include a trailing si unit + if selector.settings.mode == SortMode::HumanNumeric + && self.line[selection.end..initial_selection.end] + .starts_with(&['k', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'][..]) + { + selection.end += 1; + } + + // include leading zeroes, a leading minus or a leading decimal point + while self.line[initial_selection.start..selection.start] + .ends_with(&['-', '0', '.'][..]) + { + selection.start -= 1; + } + } + SortMode::GeneralNumeric => { + let initial_selection = &self.line[selection.clone()]; + + let leading = get_leading_gen(initial_selection); + + // Shorten selection to leading. + selection.start += leading.start; + selection.end = selection.start + leading.len(); + } + SortMode::Month => { + let initial_selection = &self.line[selection.clone()]; + + let mut month_chars = initial_selection + .char_indices() + .skip_while(|(_, c)| c.is_whitespace()); + + let month = if month_parse(initial_selection) == Month::Unknown { + // We failed to parse a month, which is equivalent to matching nothing. + // Add the "no match for key" marker to the first non-whitespace character. + let first_non_whitespace = month_chars.next(); + first_non_whitespace.map_or( + initial_selection.len()..initial_selection.len(), + |(idx, _)| idx..idx, + ) + } else { + // We parsed a month. Match the first three non-whitespace characters, which must be the month we parsed. + month_chars.next().unwrap().0 + ..month_chars + .nth(2) + .map_or(initial_selection.len(), |(idx, _)| idx) + }; + + // Shorten selection to month. + selection.start += month.start; + selection.end = selection.start + month.len(); + } + _ => {} + } + + write!( + writer, + "{}", + " ".repeat(UnicodeWidthStr::width(&line[..selection.start])) + )?; + + // TODO: Once our minimum supported rust version is at least 1.47, use selection.is_empty() instead. + #[allow(clippy::len_zero)] + { + if selection.len() == 0 { + writeln!(writer, "^ no match for key")?; + } else { + writeln!( + writer, + "{}", + "_".repeat(UnicodeWidthStr::width(&line[selection])) + )?; + } + } + } + if !(settings.mode == SortMode::Random + || settings.stable + || settings.unique + || !(settings.dictionary_order + || settings.ignore_blanks + || settings.ignore_case + || settings.ignore_non_printing + || settings.mode != SortMode::Default)) + { + // A last resort comparator is in use, underline the whole line. + if self.line.is_empty() { + writeln!(writer, "^ no match for key")?; + } else { + writeln!( + writer, + "{}", + "_".repeat(UnicodeWidthStr::width(line.as_str())) + )?; + } + } + Ok(()) } } -impl<'a> PartialEq for MergeableFile<'a> { - fn eq(&self, other: &MergeableFile) -> bool { - Ordering::Equal == compare_by(&self.current_line, &other.current_line, &self.settings) +/// Tokenize a line into fields. +fn tokenize(line: &str, separator: Option) -> Vec { + if let Some(separator) = separator { + tokenize_with_separator(line, separator) + } else { + tokenize_default(line) } } -impl<'a> Eq for MergeableFile<'a> {} - -struct FileMerger<'a> { - heap: BinaryHeap>, - settings: &'a Settings, +/// By default fields are separated by the first whitespace after non-whitespace. +/// Whitespace is included in fields at the start. +fn tokenize_default(line: &str) -> Vec { + let mut tokens = vec![0..0]; + // pretend that there was whitespace in front of the line + let mut previous_was_whitespace = true; + for (idx, char) in line.char_indices() { + if char.is_whitespace() { + if !previous_was_whitespace { + tokens.last_mut().unwrap().end = idx; + tokens.push(idx..0); + } + previous_was_whitespace = true; + } else { + previous_was_whitespace = false; + } + } + tokens.last_mut().unwrap().end = line.len(); + tokens } -impl<'a> FileMerger<'a> { - fn new(settings: &'a Settings) -> FileMerger<'a> { - FileMerger { - heap: BinaryHeap::new(), +/// Split between separators. These separators are not included in fields. +fn tokenize_with_separator(line: &str, separator: char) -> Vec { + let mut tokens = vec![]; + let separator_indices = + line.char_indices() + .filter_map(|(i, c)| if c == separator { Some(i) } else { None }); + let mut start = 0; + for sep_idx in separator_indices { + tokens.push(start..sep_idx); + start = sep_idx + 1; + } + if start < line.len() { + tokens.push(start..line.len()); + } + tokens +} + +#[derive(Clone)] +struct KeyPosition { + /// 1-indexed, 0 is invalid. + field: usize, + /// 1-indexed, 0 is end of field. + char: usize, + ignore_blanks: bool, +} + +impl KeyPosition { + fn parse(key: &str, default_char_index: usize, settings: &mut KeySettings) -> Self { + let mut field_and_char = key.split('.'); + let mut field = field_and_char + .next() + .unwrap_or_else(|| crash!(1, "invalid key `{}`", key)); + let mut char = field_and_char.next(); + + // If there is a char index, we expect options to appear after it. Otherwise we expect them after the field index. + let value_with_options = char.as_mut().unwrap_or(&mut field); + + let mut ignore_blanks = settings.ignore_blanks; + if let Some(options_start) = value_with_options.chars().position(char::is_alphabetic) { + for option in value_with_options[options_start..].chars() { + // valid options: MbdfghinRrV + match option { + 'M' => settings.mode = SortMode::Month, + 'b' => ignore_blanks = true, + 'd' => settings.dictionary_order = true, + 'f' => settings.ignore_case = true, + 'g' => settings.mode = SortMode::GeneralNumeric, + 'h' => settings.mode = SortMode::HumanNumeric, + 'i' => settings.ignore_non_printing = true, + 'n' => settings.mode = SortMode::Numeric, + 'R' => settings.mode = SortMode::Random, + 'r' => settings.reverse = true, + 'V' => settings.mode = SortMode::Version, + c => crash!(1, "invalid option for key: `{}`", c), + } + // All numeric sorts and month sort conflict with dictionary_order and ignore_non_printing. + // Instad of reporting an error, let them overwrite each other. + + // FIXME: This should only override if the overridden flag is a global flag. + // If conflicting flags are attached to the key, GNU sort crashes and we should probably too. + match option { + 'h' | 'n' | 'g' | 'M' => { + settings.dictionary_order = false; + settings.ignore_non_printing = false; + } + 'd' | 'i' => { + settings.mode = match settings.mode { + SortMode::Numeric + | SortMode::HumanNumeric + | SortMode::GeneralNumeric + | SortMode::Month => SortMode::Default, + // Only SortMode::Default and SortMode::Version work with dictionary_order and ignore_non_printing + m @ SortMode::Default + | m @ SortMode::Version + | m @ SortMode::Random => m, + } + } + _ => {} + } + } + // Strip away option characters from the original value so we can parse it later + *value_with_options = &value_with_options[..options_start]; + } + + let field = field + .parse() + .unwrap_or_else(|e| crash!(1, "failed to parse field index for key `{}`: {}", key, e)); + if field == 0 { + crash!(1, "field index was 0"); + } + let char = char.map_or(default_char_index, |char| { + char.parse().unwrap_or_else(|e| { + crash!( + 1, + "failed to parse character index for key `{}`: {}", + key, + e + ) + }) + }); + Self { + field, + char, + ignore_blanks, + } + } +} +#[derive(Clone)] +struct FieldSelector { + from: KeyPosition, + to: Option, + settings: KeySettings, + needs_tokens: bool, + // Whether the selection for each line is going to be the whole line with no NumCache + is_default_selection: bool, +} + +impl FieldSelector { + fn new(from: KeyPosition, to: Option, settings: KeySettings) -> Self { + Self { + is_default_selection: from.field == 1 + && from.char == 1 + && to.is_none() + && !matches!( + settings.mode, + SortMode::Numeric | SortMode::GeneralNumeric | SortMode::HumanNumeric + ), + needs_tokens: from.field != 1 || from.char == 0 || to.is_some(), + from, + to, settings, } } - fn push_file(&mut self, mut lines: Lines>>) { - if let Some(Ok(next_line)) = lines.next() { - let mergeable_file = MergeableFile { - lines, - current_line: next_line, - settings: &self.settings, - }; - self.heap.push(mergeable_file); + + /// Get the selection that corresponds to this selector for the line. + /// If needs_fields returned false, tokens may be None. + fn get_selection<'a>(&self, line: &'a str, tokens: Option<&[Field]>) -> Selection<'a> { + let mut range = &line[self.get_range(&line, tokens)]; + let num_cache = if self.settings.mode == SortMode::Numeric + || self.settings.mode == SortMode::HumanNumeric + { + // Parse NumInfo for this number. + let (info, num_range) = NumInfo::parse( + range, + NumInfoParseSettings { + accept_si_units: self.settings.mode == SortMode::HumanNumeric, + ..Default::default() + }, + ); + // Shorten the range to what we need to pass to numeric_str_cmp later. + range = &range[num_range]; + Some(Box::new(NumCache::WithInfo(info))) + } else if self.settings.mode == SortMode::GeneralNumeric { + // Parse this number as f64, as this is the requirement for general numeric sorting. + Some(Box::new(NumCache::AsF64(general_f64_parse( + &range[get_leading_gen(range)], + )))) + } else { + // This is not a numeric sort, so we don't need a NumCache. + None + }; + Selection { + slice: range, + num_cache, } } -} -impl<'a> Iterator for FileMerger<'a> { - type Item = String; - fn next(&mut self) -> Option { - match self.heap.pop() { - Some(mut current) => { - match current.lines.next() { - Some(Ok(next_line)) => { - let ret = replace(&mut current.current_line, next_line); - self.heap.push(current); - Some(ret) - } - _ => { - // Don't put it back in the heap (it's empty/erroring) - // but its first line is still valid. - Some(current.current_line) - } + /// Look up the range in the line that corresponds to this selector. + /// If needs_fields returned false, tokens may be None. + fn get_range<'a>(&self, line: &'a str, tokens: Option<&[Field]>) -> Range { + enum Resolution { + // The start index of the resolved character, inclusive + StartOfChar(usize), + // The end index of the resolved character, exclusive. + // This is only returned if the character index is 0. + EndOfChar(usize), + // The resolved character would be in front of the first character + TooLow, + // The resolved character would be after the last character + TooHigh, + } + + // Get the index for this line given the KeyPosition + fn resolve_index( + line: &str, + tokens: Option<&[Field]>, + position: &KeyPosition, + ) -> Resolution { + if matches!(tokens, Some(tokens) if tokens.len() < position.field) { + Resolution::TooHigh + } else if position.char == 0 { + let end = tokens.unwrap()[position.field - 1].end; + if end == 0 { + Resolution::TooLow + } else { + Resolution::EndOfChar(end) + } + } else { + let mut idx = if position.field == 1 { + // The first field always starts at 0. + // We don't need tokens for this case. + 0 + } else { + tokens.unwrap()[position.field - 1].start + }; + // strip blanks if needed + if position.ignore_blanks { + idx += line[idx..] + .char_indices() + .find(|(_, c)| !c.is_whitespace()) + .map_or(line[idx..].len(), |(idx, _)| idx); + } + // apply the character index + idx += line[idx..] + .char_indices() + .nth(position.char - 1) + .map_or(line[idx..].len(), |(idx, _)| idx); + if idx >= line.len() { + Resolution::TooHigh + } else { + Resolution::StartOfChar(idx) } } - None => None, + } + + match resolve_index(line, tokens, &self.from) { + Resolution::StartOfChar(from) => { + let to = self.to.as_ref().map(|to| resolve_index(line, tokens, &to)); + + let mut range = match to { + Some(Resolution::StartOfChar(mut to)) => { + // We need to include the character at `to`. + to += line[to..].chars().next().map_or(1, |c| c.len_utf8()); + from..to + } + Some(Resolution::EndOfChar(to)) => from..to, + // If `to` was not given or the match would be after the end of the line, + // match everything until the end of the line. + None | Some(Resolution::TooHigh) => from..line.len(), + // If `to` is before the start of the line, report no match. + // This can happen if the line starts with a separator. + Some(Resolution::TooLow) => 0..0, + }; + if range.start > range.end { + range.end = range.start; + } + range + } + Resolution::TooLow | Resolution::EndOfChar(_) => { + unreachable!("This should only happen if the field start index is 0, but that should already have caused an error.") + } + // While for comparisons it's only important that this is an empty slice, + // to produce accurate debug output we need to match an empty slice at the end of the line. + Resolution::TooHigh => line.len()..line.len(), } } } @@ -201,50 +736,91 @@ With no FILE, or when FILE is -, read standard input.", ) } +fn make_sort_mode_arg<'a, 'b>(mode: &'a str, short: &'b str, help: &'b str) -> Arg<'a, 'b> { + let mut arg = Arg::with_name(mode).short(short).long(mode).help(help); + for possible_mode in ALL_SORT_MODES { + if *possible_mode != mode { + arg = arg.conflicts_with(possible_mode); + } + } + arg +} + pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let usage = get_usage(); - let mut settings: Settings = Default::default(); + let mut settings: GlobalSettings = Default::default(); let matches = App::new(executable!()) .version(VERSION) .about(ABOUT) .usage(&usage[..]) .arg( - Arg::with_name(OPT_HUMAN_NUMERIC_SORT) - .short("h") - .long(OPT_HUMAN_NUMERIC_SORT) - .help("compare according to human readable sizes, eg 1M > 100k"), + Arg::with_name(OPT_SORT) + .long(OPT_SORT) + .takes_value(true) + .possible_values( + &[ + "general-numeric", + "human-numeric", + "month", + "numeric", + "version", + "random", + ] + ) + .conflicts_with_all(ALL_SORT_MODES) ) .arg( - Arg::with_name(OPT_MONTH_SORT) - .short("M") - .long(OPT_MONTH_SORT) - .help("compare according to month name abbreviation"), + make_sort_mode_arg( + OPT_HUMAN_NUMERIC_SORT, + "h", + "compare according to human readable sizes, eg 1M > 100k" + ), ) .arg( - Arg::with_name(OPT_NUMERIC_SORT) - .short("n") - .long(OPT_NUMERIC_SORT) - .help("compare according to string numerical value"), + make_sort_mode_arg( + OPT_MONTH_SORT, + "M", + "compare according to month name abbreviation" + ), ) .arg( - Arg::with_name(OPT_GENERAL_NUMERIC_SORT) - .short("g") - .long(OPT_GENERAL_NUMERIC_SORT) - .help("compare according to string general numerical value"), + make_sort_mode_arg( + OPT_NUMERIC_SORT, + "n", + "compare according to string numerical value" + ), ) .arg( - Arg::with_name(OPT_VERSION_SORT) - .short("V") - .long(OPT_VERSION_SORT) - .help("Sort by SemVer version number, eg 1.12.2 > 1.1.2"), + make_sort_mode_arg( + OPT_GENERAL_NUMERIC_SORT, + "g", + "compare according to string general numerical value" + ), + ) + .arg( + make_sort_mode_arg( + OPT_VERSION_SORT, + "V", + "Sort by SemVer version number, eg 1.12.2 > 1.1.2", + ), + ) + .arg( + make_sort_mode_arg( + OPT_RANDOM, + "R", + "shuffle in random order", + ), ) .arg( Arg::with_name(OPT_DICTIONARY_ORDER) .short("d") .long(OPT_DICTIONARY_ORDER) - .help("consider only blanks and alphanumeric characters"), + .help("consider only blanks and alphanumeric characters") + .conflicts_with_all(&[OPT_NUMERIC_SORT, OPT_GENERAL_NUMERIC_SORT, OPT_HUMAN_NUMERIC_SORT, OPT_MONTH_SORT]), ) .arg( Arg::with_name(OPT_MERGE) @@ -262,7 +838,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { Arg::with_name(OPT_CHECK_SILENT) .short("C") .long(OPT_CHECK_SILENT) - .help("exit successfully if the given file is already sorted, and exit with status 1 otherwise. "), + .help("exit successfully if the given file is already sorted, and exit with status 1 otherwise."), ) .arg( Arg::with_name(OPT_IGNORE_CASE) @@ -272,9 +848,10 @@ pub fn uumain(args: impl uucore::Args) -> i32 { ) .arg( Arg::with_name(OPT_IGNORE_NONPRINTING) - .short("-i") + .short("i") .long(OPT_IGNORE_NONPRINTING) - .help("ignore nonprinting characters"), + .help("ignore nonprinting characters") + .conflicts_with_all(&[OPT_NUMERIC_SORT, OPT_GENERAL_NUMERIC_SORT, OPT_HUMAN_NUMERIC_SORT, OPT_MONTH_SORT]), ) .arg( Arg::with_name(OPT_IGNORE_BLANKS) @@ -290,12 +867,6 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .takes_value(true) .value_name("FILENAME"), ) - .arg( - Arg::with_name(OPT_RANDOM) - .short("R") - .long(OPT_RANDOM) - .help("shuffle in random order"), - ) .arg( Arg::with_name(OPT_REVERSE) .short("r") @@ -315,7 +886,21 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .help("output only the first of an equal run"), ) .arg( - Arg::with_name(OPT_ZERO_TERMINATED) + Arg::with_name(OPT_KEY) + .short("k") + .long(OPT_KEY) + .help("sort by a key") + .long_help(LONG_HELP_KEYS) + .multiple(true) + .takes_value(true), + ) + .arg( + Arg::with_name(OPT_SEPARATOR) + .short("t") + .long(OPT_SEPARATOR) + .help("custom separator for -k") + .takes_value(true)) + .arg(Arg::with_name(OPT_ZERO_TERMINATED) .short("z") .long(OPT_ZERO_TERMINATED) .help("line delimiter is NUL, not newline"), @@ -323,10 +908,26 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .arg( Arg::with_name(OPT_PARALLEL) .long(OPT_PARALLEL) - .help("change the number of threads running concurrently to N") + .help("change the number of threads running concurrently to NUM_THREADS") .takes_value(true) .value_name("NUM_THREADS"), ) + .arg( + Arg::with_name(OPT_BUF_SIZE) + .short("S") + .long(OPT_BUF_SIZE) + .help("sets the maximum SIZE of each segment in number of sorted items") + .takes_value(true) + .value_name("SIZE"), + ) + .arg( + Arg::with_name(OPT_TMP_DIR) + .short("T") + .long(OPT_TMP_DIR) + .help("use DIR for temporaries, not $TMPDIR or /tmp") + .takes_value(true) + .value_name("DIR"), + ) .arg( Arg::with_name(OPT_FILES0_FROM) .long(OPT_FILES0_FROM) @@ -335,9 +936,16 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .value_name("NUL_FILES") .multiple(true), ) + .arg( + Arg::with_name(OPT_DEBUG) + .long(OPT_DEBUG) + .help("underline the parts of the line that are actually used for sorting"), + ) .arg(Arg::with_name(ARG_FILES).multiple(true).takes_value(true)) .get_matches_from(args); + settings.debug = matches.is_present(OPT_DEBUG); + // check whether user specified a zero terminated list of files for input, otherwise read files from args let mut files: Vec = if matches.is_present(OPT_FILES0_FROM) { let files0_from: Vec = matches @@ -347,16 +955,14 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let mut files = Vec::new(); for path in &files0_from { - let (reader, _) = open(path.as_str()).expect("Could not read from file specified."); + let reader = open(path.as_str()); let buf_reader = BufReader::new(reader); - for line in buf_reader.split(b'\0') { - if let Ok(n) = line { - files.push( - std::str::from_utf8(&n) - .expect("Could not parse zero terminated string from input.") - .to_string(), - ); - } + for line in buf_reader.split(b'\0').flatten() { + files.push( + std::str::from_utf8(&line) + .expect("Could not parse string from zero terminated input.") + .to_string(), + ); } } files @@ -367,34 +973,49 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .unwrap_or_default() }; - settings.mode = if matches.is_present(OPT_HUMAN_NUMERIC_SORT) { + settings.mode = if matches.is_present(OPT_HUMAN_NUMERIC_SORT) + || matches.value_of(OPT_SORT) == Some("human-numeric") + { SortMode::HumanNumeric - } else if matches.is_present(OPT_MONTH_SORT) { + } else if matches.is_present(OPT_MONTH_SORT) || matches.value_of(OPT_SORT) == Some("month") { SortMode::Month - } else if matches.is_present(OPT_GENERAL_NUMERIC_SORT) { + } else if matches.is_present(OPT_GENERAL_NUMERIC_SORT) + || matches.value_of(OPT_SORT) == Some("general-numeric") + { SortMode::GeneralNumeric - } else if matches.is_present(OPT_NUMERIC_SORT) { + } else if matches.is_present(OPT_NUMERIC_SORT) || matches.value_of(OPT_SORT) == Some("numeric") + { SortMode::Numeric - } else if matches.is_present(OPT_VERSION_SORT) { + } else if matches.is_present(OPT_VERSION_SORT) || matches.value_of(OPT_SORT) == Some("version") + { SortMode::Version + } else if matches.is_present(OPT_RANDOM) || matches.value_of(OPT_SORT) == Some("random") { + settings.salt = get_rand_string(); + SortMode::Random } else { SortMode::Default }; + settings.dictionary_order = matches.is_present(OPT_DICTIONARY_ORDER); + settings.ignore_non_printing = matches.is_present(OPT_IGNORE_NONPRINTING); if matches.is_present(OPT_PARALLEL) { // "0" is default - threads = num of cores settings.threads = matches .value_of(OPT_PARALLEL) .map(String::from) - .unwrap_or("0".to_string()); + .unwrap_or_else(|| "0".to_string()); env::set_var("RAYON_NUM_THREADS", &settings.threads); } - if matches.is_present(OPT_DICTIONARY_ORDER) { - settings.transform_fns.push(remove_nondictionary_chars); - } else if matches.is_present(OPT_IGNORE_NONPRINTING) { - settings.transform_fns.push(remove_nonprinting_chars); - } + settings.buffer_size = matches + .value_of(OPT_BUF_SIZE) + .map(GlobalSettings::parse_byte_count) + .unwrap_or(DEFAULT_BUF_SIZE); + + settings.tmp_dir = matches + .value_of(OPT_TMP_DIR) + .map(PathBuf::from) + .unwrap_or_else(env::temp_dir); settings.zero_terminated = matches.is_present(OPT_ZERO_TERMINATED); settings.merge = matches.is_present(OPT_MERGE); @@ -405,432 +1026,274 @@ pub fn uumain(args: impl uucore::Args) -> i32 { settings.check = true; }; - if matches.is_present(OPT_IGNORE_CASE) { - settings.transform_fns.push(|s| s.to_uppercase()); - } + settings.ignore_case = matches.is_present(OPT_IGNORE_CASE); - if matches.is_present(OPT_IGNORE_BLANKS) { - settings.transform_fns.push(|s| s.trim_start().to_string()); - } + settings.ignore_blanks = matches.is_present(OPT_IGNORE_BLANKS); settings.outfile = matches.value_of(OPT_OUTPUT).map(String::from); settings.reverse = matches.is_present(OPT_REVERSE); settings.stable = matches.is_present(OPT_STABLE); settings.unique = matches.is_present(OPT_UNIQUE); - if matches.is_present(OPT_RANDOM) { - settings.random = matches.is_present(OPT_RANDOM); - settings.salt = get_rand_string(); - } - - //let mut files = matches.free; if files.is_empty() { /* if no file, default to stdin */ files.push("-".to_owned()); } else if settings.check && files.len() != 1 { - crash!(1, "sort: extra operand `{}' not allowed with -c", files[1]) + crash!(1, "extra operand `{}' not allowed with -c", files[1]) } - settings.compare_fn = match settings.mode { - SortMode::Numeric => numeric_compare, - SortMode::GeneralNumeric => general_numeric_compare, - SortMode::HumanNumeric => human_numeric_size_compare, - SortMode::Month => month_compare, - SortMode::Version => version_compare, - SortMode::Default => default_compare, - }; + if let Some(arg) = matches.args.get(OPT_SEPARATOR) { + let separator = arg.vals[0].to_string_lossy(); + let separator = separator; + if separator.len() != 1 { + crash!(1, "separator must be exactly one character long"); + } + settings.separator = Some(separator.chars().next().unwrap()) + } - exec(files, &mut settings) + if matches.is_present(OPT_KEY) { + for key in &matches.args[OPT_KEY].vals { + let key = key.to_string_lossy(); + let mut from_to = key.split(','); + let mut key_settings = KeySettings::from(&settings); + let from = KeyPosition::parse( + from_to + .next() + .unwrap_or_else(|| crash!(1, "invalid key `{}`", key)), + 1, + &mut key_settings, + ); + if from.char == 0 { + crash!( + 1, + "invalid character index 0 in `{}` for the start position of a field", + key + ) + } + let to = from_to + .next() + .map(|to| KeyPosition::parse(to, 0, &mut key_settings)); + let field_selector = FieldSelector::new(from, to, key_settings); + settings.selectors.push(field_selector); + } + } + + if !settings.stable || !matches.is_present(OPT_KEY) { + // add a default selector matching the whole line + let key_settings = KeySettings::from(&settings); + settings.selectors.push(FieldSelector::new( + KeyPosition { + field: 1, + char: 1, + ignore_blanks: key_settings.ignore_blanks, + }, + None, + key_settings, + )); + } + + exec(&files, &settings) } -fn exec(files: Vec, settings: &mut Settings) -> i32 { - let mut lines = Vec::new(); - let mut file_merger = FileMerger::new(&settings); - - for path in &files { - let (reader, _) = match open(path) { - Some(x) => x, - None => continue, - }; - - let buf_reader = BufReader::new(reader); - - if settings.merge { - file_merger.push_file(buf_reader.lines()); - } else if settings.zero_terminated { - for line in buf_reader.split(b'\0') { - if let Ok(n) = line { - lines.push( - std::str::from_utf8(&n) - .expect("Could not parse string from zero terminated input.") - .to_string(), - ); - } - } - } else { - for line in buf_reader.lines() { - if let Ok(n) = line { - lines.push(n); - } - } - } - } - - if settings.check { - return exec_check_file(lines, &settings); +fn output_sorted_lines<'a>(iter: impl Iterator>, settings: &GlobalSettings) { + if settings.unique { + print_sorted( + iter.dedup_by(|a, b| compare_by(a, b, &settings) == Ordering::Equal), + &settings, + ); } else { - sort_by(&mut lines, &settings); + print_sorted(iter, &settings); } +} +fn exec(files: &[String], settings: &GlobalSettings) -> i32 { if settings.merge { - if settings.unique { - print_sorted(file_merger.dedup(), &settings) - } else { - print_sorted(file_merger, &settings) + let mut file_merger = merge::merge(files, settings); + file_merger.write_all(settings); + } else if settings.check { + if files.len() > 1 { + crash!(1, "only one file allowed with -c"); } - } else if settings.mode == SortMode::Month && settings.unique { - print_sorted( - lines - .iter() - .dedup_by(|a, b| get_months_dedup(a) == get_months_dedup(b)), - &settings, - ) - } else if settings.unique { - print_sorted( - lines - .iter() - .dedup_by(|a, b| get_nums_dedup(a) == get_nums_dedup(b)), - &settings, - ) + return check::check(files.first().unwrap(), settings); } else { - print_sorted(lines.iter(), &settings) - } + let mut lines = files.iter().map(open); + ext_sort(&mut lines, &settings); + } 0 } -fn exec_check_file(unwrapped_lines: Vec, settings: &Settings) -> i32 { - // errors yields the line before each disorder, - // plus the last line (quirk of .coalesce()) - let mut errors = - unwrapped_lines - .iter() - .enumerate() - .coalesce(|(last_i, last_line), (i, line)| { - if compare_by(&last_line, &line, &settings) == Ordering::Greater { - Err(((last_i, last_line), (i, line))) - } else { - Ok((i, line)) - } - }); - if let Some((first_error_index, _line)) = errors.next() { - // Check for a second "error", as .coalesce() always returns the last - // line, no matter what our merging function does. - if let Some(_last_line_or_next_error) = errors.next() { - if !settings.check_silent { - println!("sort: disorder in line {}", first_error_index); - }; - 1 - } else { - // first "error" was actually the last line. - 0 - } +fn sort_by<'a>(unsorted: &mut Vec>, settings: &GlobalSettings) { + if settings.stable || settings.unique { + unsorted.par_sort_by(|a, b| compare_by(a, b, &settings)) } else { - // unwrapped_lines was empty. Empty files are defined to be sorted. - 0 + unsorted.par_sort_unstable_by(|a, b| compare_by(a, b, &settings)) } } -#[inline(always)] -fn transform(line: &str, settings: &Settings) -> String { - let mut transformed = line.to_owned(); - for transform_fn in &settings.transform_fns { - transformed = transform_fn(&transformed); - } - - transformed -} - -#[inline(always)] -fn sort_by(lines: &mut Vec, settings: &Settings) { - lines.par_sort_by(|a, b| compare_by(a, b, &settings)) -} - -fn compare_by(a: &str, b: &str, settings: &Settings) -> Ordering { - let (a_transformed, b_transformed): (String, String); - let (a, b) = if !settings.transform_fns.is_empty() { - a_transformed = transform(&a, &settings); - b_transformed = transform(&b, &settings); - (a_transformed.as_str(), b_transformed.as_str()) - } else { - (a, b) - }; - - // 1st Compare - let mut cmp: Ordering = if settings.random { - random_shuffle(a, b, settings.salt.clone()) - } else { - (settings.compare_fn)(a, b) - }; - - // Call "last resort compare" on any equal - if cmp == Ordering::Equal { - if settings.random || settings.stable || settings.unique { - cmp = Ordering::Equal +fn compare_by<'a>(a: &Line<'a>, b: &Line<'a>, global_settings: &GlobalSettings) -> Ordering { + let mut idx = 0; + for selector in &global_settings.selectors { + let mut _selections = None; + let (a_selection, b_selection) = if selector.is_default_selection { + // We can select the whole line. + // We have to store the selections outside of the if-block so that they live long enough. + _selections = Some(( + Selection { + slice: a.line, + num_cache: None, + }, + Selection { + slice: b.line, + num_cache: None, + }, + )); + // Unwrap the selections again, and return references to them. + ( + &_selections.as_ref().unwrap().0, + &_selections.as_ref().unwrap().1, + ) } else { - cmp = default_compare(a, b) + let selections = (&a.selections[idx], &b.selections[idx]); + idx += 1; + selections }; - }; + let a_str = a_selection.slice; + let b_str = b_selection.slice; + let settings = &selector.settings; - if settings.reverse { - return cmp.reverse(); + let cmp: Ordering = match settings.mode { + SortMode::Random => random_shuffle(a_str, b_str, &global_settings.salt), + SortMode::Numeric | SortMode::HumanNumeric => numeric_str_cmp( + (a_str, a_selection.num_cache.as_ref().unwrap().as_num_info()), + (b_str, b_selection.num_cache.as_ref().unwrap().as_num_info()), + ), + SortMode::GeneralNumeric => general_numeric_compare( + a_selection.num_cache.as_ref().unwrap().as_f64(), + b_selection.num_cache.as_ref().unwrap().as_f64(), + ), + SortMode::Month => month_compare(a_str, b_str), + SortMode::Version => version_compare(a_str, b_str), + SortMode::Default => custom_str_cmp( + a_str, + b_str, + settings.ignore_non_printing, + settings.dictionary_order, + settings.ignore_case, + ), + }; + if cmp != Ordering::Equal { + return if settings.reverse { cmp.reverse() } else { cmp }; + } + } + + // Call "last resort compare" if all selectors returned Equal + let cmp = if global_settings.mode == SortMode::Random + || global_settings.stable + || global_settings.unique + { + Ordering::Equal } else { - return cmp; - } -} - -// Test output against BSDs and GNU with their locale -// env var set to lc_ctype=utf-8 to enjoy the exact same output. -#[inline(always)] -fn default_compare(a: &str, b: &str) -> Ordering { - a.cmp(b) -} - -// This function does the initial detection of numeric lines. -// Lines starting with a number or positive or negative sign. -// It also strips the string of any thing that could never -// be a number for the purposes of any type of numeric comparison. -#[inline(always)] -fn leading_num_common(a: &str) -> &str { - let mut s = ""; - for (idx, c) in a.char_indices() { - // check whether char is numeric, whitespace or decimal point or thousand seperator - if !c.is_numeric() - && !c.is_whitespace() - && !c.eq(&DECIMAL_PT) - && !c.eq(&THOUSANDS_SEP) - // check for e notation - && !c.eq(&'e') - && !c.eq(&'E') - // check whether first char is + or - - && !a.chars().nth(0).unwrap_or('\0').eq(&POSITIVE) - && !a.chars().nth(0).unwrap_or('\0').eq(&NEGATIVE) - { - // Strip string of non-numeric trailing chars - s = &a[..idx]; - break; - } - // If line is not a number line, return the line as is - s = a; - } - s -} - -// This function cleans up the initial comparison done by leading_num_common for a numeric compare. -// GNU sort does its numeric comparison through strnumcmp. However, we don't have or -// may not want to use libc. Instead we emulate the GNU sort numeric compare by ignoring -// those leading number lines GNU sort would not recognize. GNU numeric compare would -// not recognize a positive sign or scientific/E notation so we strip those elements here. -fn get_leading_num(a: &str) -> &str { - let mut s = ""; - let b = leading_num_common(a); - - // GNU numeric sort doesn't recognize '+' or 'e' notation so we strip - for (idx, c) in b.char_indices() { - if c.eq(&'e') || c.eq(&'E') || b.chars().nth(0).unwrap_or('\0').eq(&POSITIVE) { - s = &b[..idx]; - break; - } - // If no further processing needed to be done, return the line as-is to be sorted - s = b; - } - - // And empty number or non-number lines are to be treated as ‘0’ but only for numeric sort - // All '0'-ed lines will be sorted later, but only amongst themselves, during the so-called 'last resort comparison.' - if s.is_empty() { - s = "0"; + a.line.cmp(b.line) }; - s + + if global_settings.reverse { + cmp.reverse() + } else { + cmp + } } // This function cleans up the initial comparison done by leading_num_common for a general numeric compare. // In contrast to numeric compare, GNU general numeric/FP sort *should* recognize positive signs and // scientific notation, so we strip those lines only after the end of the following numeric string. // For example, 5e10KFD would be 5e10 or 5x10^10 and +10000HFKJFK would become 10000. -fn get_leading_gen(a: &str) -> String { - // Make this iter peekable to see if next char is numeric - let mut p_iter = leading_num_common(a).chars().peekable(); - let mut r = String::new(); - // Cleanup raw stripped strings - for c in p_iter.to_owned() { - let next_char_numeric = p_iter.peek().unwrap_or(&'\0').is_numeric(); - // Only general numeric recognizes e notation and, see block below, the '+' sign - if (c.eq(&'e') && !next_char_numeric) || (c.eq(&'E') && !next_char_numeric) { - r = a.split(c).next().unwrap_or("").to_owned(); - break; - // If positive sign and next char is not numeric, split at postive sign at keep trailing numbers - // There is a more elegant way to do this in Rust 1.45, std::str::strip_prefix - } else if c.eq(&POSITIVE) && !next_char_numeric { - let mut v: Vec<&str> = a.split(c).collect(); - let x = v.split_off(1); - r = x.join(""); - break; - // If no further processing needed to be done, return the line as-is to be sorted - } else { - r = a.to_owned(); +fn get_leading_gen(input: &str) -> Range { + let trimmed = input.trim_start(); + let leading_whitespace_len = input.len() - trimmed.len(); + + // check for inf, -inf and nan + for allowed_prefix in &["inf", "-inf", "nan"] { + if trimmed.is_char_boundary(allowed_prefix.len()) + && trimmed[..allowed_prefix.len()].eq_ignore_ascii_case(allowed_prefix) + { + return leading_whitespace_len..(leading_whitespace_len + allowed_prefix.len()); } } - r -} + // Make this iter peekable to see if next char is numeric + let mut char_indices = itertools::peek_nth(trimmed.char_indices()); -fn get_months_dedup(a: &str) -> String { - let pattern = if a.trim().len().ge(&3) { - // Split at 3rd char and get first element of tuple ".0" - a.split_at(3).0 - } else { - "" - }; + let first = char_indices.peek(); - let month = match pattern.to_uppercase().as_ref() { - "JAN" => Month::January, - "FEB" => Month::February, - "MAR" => Month::March, - "APR" => Month::April, - "MAY" => Month::May, - "JUN" => Month::June, - "JUL" => Month::July, - "AUG" => Month::August, - "SEP" => Month::September, - "OCT" => Month::October, - "NOV" => Month::November, - "DEC" => Month::December, - _ => Month::Unknown, - }; - - if month == Month::Unknown { - "".to_owned() - } else { - pattern.to_uppercase() + if matches!(first, Some((_, NEGATIVE)) | Some((_, POSITIVE))) { + char_indices.next(); } -} -// *For all dedups/uniques we must compare leading numbers* -// Also note numeric compare and unique output is specifically *not* the same as a "sort | uniq" -// See: https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html -fn get_nums_dedup(a: &str) -> &str { - // Trim and remove any leading zeros - let s = a.trim().trim_start_matches('0'); - - // Get first char - let c = s.chars().nth(0).unwrap_or('\0'); - - // Empty lines and non-number lines are treated as the same for dedup - if s.is_empty() { - "" - } else if !c.eq(&NEGATIVE) && !c.is_numeric() { - "" - // Prepare lines for comparison of only the numerical leading numbers - } else { - get_leading_num(s) + let mut had_e_notation = false; + let mut had_decimal_pt = false; + while let Some((idx, c)) = char_indices.next() { + if c.is_ascii_digit() { + continue; + } + if c == DECIMAL_PT && !had_decimal_pt && !had_e_notation { + had_decimal_pt = true; + continue; + } + if (c == 'e' || c == 'E') && !had_e_notation { + // we can only consume the 'e' if what follow is either a digit, or a sign followed by a digit. + if let Some(&(_, next_char)) = char_indices.peek() { + if (next_char == '+' || next_char == '-') + && matches!( + char_indices.peek_nth(2), + Some((_, c)) if c.is_ascii_digit() + ) + { + // Consume the sign. The following digits will be consumed by the main loop. + char_indices.next(); + had_e_notation = true; + continue; + } + if next_char.is_ascii_digit() { + had_e_notation = true; + continue; + } + } + } + return leading_whitespace_len..(leading_whitespace_len + idx); } + leading_whitespace_len..input.len() } -/// Parse the beginning string into an f64, returning -inf instead of NaN on errors. +#[derive(Copy, Clone, PartialEq, PartialOrd, Debug)] +enum GeneralF64ParseResult { + Invalid, + NaN, + NegInfinity, + Number(f64), + Infinity, +} + +/// Parse the beginning string into a GeneralF64ParseResult. +/// Using a GeneralF64ParseResult instead of f64 is necessary to correctly order floats. #[inline(always)] -fn permissive_f64_parse(a: &str) -> f64 { - // Remove thousands seperators - let a = a.replace(THOUSANDS_SEP, ""); - - // GNU sort treats "NaN" as non-number in numeric, so it needs special care. - // *Keep this trim before parse* despite what POSIX may say about -b and -n - // because GNU and BSD both seem to require it to match their behavior - match a.trim().parse::() { - Ok(a) if a.is_nan() => std::f64::NEG_INFINITY, - Ok(a) => a, - Err(_) => std::f64::NEG_INFINITY, - } -} - -fn numeric_compare(a: &str, b: &str) -> Ordering { - #![allow(clippy::comparison_chain)] - - let sa = get_leading_num(a); - let sb = get_leading_num(b); - - let fa = permissive_f64_parse(sa); - let fb = permissive_f64_parse(sb); - - // f64::cmp isn't implemented (due to NaN issues); implement directly instead - if fa > fb { - Ordering::Greater - } else if fa < fb { - Ordering::Less - } else { - Ordering::Equal +fn general_f64_parse(a: &str) -> GeneralF64ParseResult { + // The actual behavior here relies on Rust's implementation of parsing floating points. + // For example "nan", "inf" (ignoring the case) and "infinity" are only parsed to floats starting from 1.53. + // TODO: Once our minimum supported Rust version is 1.53 or above, we should add tests for those cases. + match a.parse::() { + Ok(a) if a.is_nan() => GeneralF64ParseResult::NaN, + Ok(a) if a == std::f64::NEG_INFINITY => GeneralF64ParseResult::NegInfinity, + Ok(a) if a == std::f64::INFINITY => GeneralF64ParseResult::Infinity, + Ok(a) => GeneralF64ParseResult::Number(a), + Err(_) => GeneralF64ParseResult::Invalid, } } /// Compares two floats, with errors and non-numerics assumed to be -inf. /// Stops coercing at the first non-numeric char. -fn general_numeric_compare(a: &str, b: &str) -> Ordering { - #![allow(clippy::comparison_chain)] - - let sa = get_leading_gen(a); - let sb = get_leading_gen(b); - - let fa = permissive_f64_parse(&sa); - let fb = permissive_f64_parse(&sb); - - // f64::cmp isn't implemented (due to NaN issues); implement directly instead - if fa > fb { - Ordering::Greater - } else if fa < fb { - Ordering::Less - } else { - Ordering::Equal - } -} - -// GNU/BSD does not handle converting numbers to an equal scale -// properly. GNU/BSD simply recognize that there is a human scale and sorts -// those numbers ahead of other number inputs. There are perhaps limits -// to the type of behavior we should emulate, and this might be such a limit. -// Properly handling these units seems like a value add to me. And when sorting -// these types of numbers, we rarely care about pure performance. -fn human_numeric_convert(a: &str) -> f64 { - let num_str = get_leading_num(a); - let suffix = a.trim_start_matches(num_str); - let num_part = permissive_f64_parse(num_str); - let suffix: f64 = match suffix.parse().unwrap_or('\0') { - // SI Units - 'K' => 1E3, - 'M' => 1E6, - 'G' => 1E9, - 'T' => 1E12, - 'P' => 1E15, - 'E' => 1E18, - 'Z' => 1E21, - 'Y' => 1E24, - _ => 1f64, - }; - num_part * suffix -} - -/// Compare two strings as if they are human readable sizes. -/// AKA 1M > 100k -fn human_numeric_size_compare(a: &str, b: &str) -> Ordering { - #![allow(clippy::comparison_chain)] - let fa = human_numeric_convert(a); - let fb = human_numeric_convert(b); - - // f64::cmp isn't implemented (due to NaN issues); implement directly instead - if fa > fb { - Ordering::Greater - } else if fa < fb { - Ordering::Less - } else { - Ordering::Equal - } +/// We explicitly need to convert to f64 in this case. +fn general_numeric_compare(a: GeneralF64ParseResult, b: GeneralF64ParseResult) -> Ordering { + a.partial_cmp(&b).unwrap() } fn get_rand_string() -> String { @@ -847,17 +1310,16 @@ fn get_hash(t: &T) -> u64 { s.finish() } -fn random_shuffle(a: &str, b: &str, x: String) -> Ordering { +fn random_shuffle(a: &str, b: &str, salt: &str) -> Ordering { #![allow(clippy::comparison_chain)] - let salt_slice = x.as_str(); - let da = get_hash(&[a, salt_slice].concat()); - let db = get_hash(&[b, salt_slice].concat()); + let da = get_hash(&[a, salt].concat()); + let db = get_hash(&[b, salt].concat()); da.cmp(&db) } -#[derive(Eq, Ord, PartialEq, PartialOrd)] +#[derive(Eq, Ord, PartialEq, PartialOrd, Clone, Copy)] enum Month { Unknown, January, @@ -876,32 +1338,36 @@ enum Month { /// Parse the beginning string into a Month, returning Month::Unknown on errors. fn month_parse(line: &str) -> Month { - // GNU splits at any 3 letter match "JUNNNN" is JUN - let pattern = if line.trim().len().ge(&3) { - // Split a 3 and get first element of tuple ".0" - line.split_at(3).0 - } else { - "" - }; + let line = line.trim(); - match pattern.to_uppercase().as_ref() { - "JAN" => Month::January, - "FEB" => Month::February, - "MAR" => Month::March, - "APR" => Month::April, - "MAY" => Month::May, - "JUN" => Month::June, - "JUL" => Month::July, - "AUG" => Month::August, - "SEP" => Month::September, - "OCT" => Month::October, - "NOV" => Month::November, - "DEC" => Month::December, - _ => Month::Unknown, + const MONTHS: [(&str, Month); 12] = [ + ("JAN", Month::January), + ("FEB", Month::February), + ("MAR", Month::March), + ("APR", Month::April), + ("MAY", Month::May), + ("JUN", Month::June), + ("JUL", Month::July), + ("AUG", Month::August), + ("SEP", Month::September), + ("OCT", Month::October), + ("NOV", Month::November), + ("DEC", Month::December), + ]; + + for (month_str, month) in &MONTHS { + if line.is_char_boundary(month_str.len()) + && line[..month_str.len()].eq_ignore_ascii_case(month_str) + { + return *month; + } } + + Month::Unknown } fn month_compare(a: &str, b: &str) -> Ordering { + #![allow(clippy::comparison_chain)] let ma = month_parse(a); let mb = month_parse(b); @@ -914,10 +1380,21 @@ fn month_compare(a: &str, b: &str) -> Ordering { } } +fn version_parse(a: &str) -> Version { + let result = Version::parse(a); + + match result { + Ok(vers_a) => vers_a, + // Non-version lines parse to 0.0.0 + Err(_e) => Version::parse("0.0.0").unwrap(), + } +} + fn version_compare(a: &str, b: &str) -> Ordering { #![allow(clippy::comparison_chain)] - let ver_a = Version::parse(a); - let ver_b = Version::parse(b); + let ver_a = version_parse(a); + let ver_b = version_parse(b); + // Version::cmp is not implemented; implement comparison directly if ver_a > ver_b { Ordering::Greater @@ -928,62 +1405,25 @@ fn version_compare(a: &str, b: &str) -> Ordering { } } -fn remove_nondictionary_chars(s: &str) -> String { - // According to GNU, dictionary chars are those of ASCII - // and a blank is a space or a tab - s.chars() - .filter(|c| c.is_ascii_alphanumeric() || c.is_ascii_whitespace()) - .collect::() -} - -fn remove_nonprinting_chars(s: &str) -> String { - // However, GNU says nonprinting chars are more permissive. - // All of ASCII except control chars ie, escape, newline - s.chars() - .filter(|c| c.is_ascii() && !c.is_ascii_control()) - .collect::() -} - -fn print_sorted>(iter: T, settings: &Settings) -where - S: std::fmt::Display, -{ - let mut file: Box = match settings.outfile { - Some(ref filename) => match File::create(Path::new(&filename)) { - Ok(f) => Box::new(BufWriter::new(f)) as Box, - Err(e) => { - show_error!("sort: {0}: {1}", filename, e.to_string()); - panic!("Could not open output file"); - } - }, - None => Box::new(stdout()) as Box, - }; - - if settings.zero_terminated { - for line in iter { - let str = format!("{}\0", line); - crash_if_err!(1, file.write_all(str.as_bytes())); - } - } else { - for line in iter { - let str = format!("{}\n", line); - crash_if_err!(1, file.write_all(str.as_bytes())); - } +fn print_sorted<'a, T: Iterator>>(iter: T, settings: &GlobalSettings) { + let mut writer = settings.out_writer(); + for line in iter { + line.print(&mut writer, settings); } } // from cat.rs -fn open(path: &str) -> Option<(Box, bool)> { +fn open(path: impl AsRef) -> Box { + let path = path.as_ref(); if path == "-" { let stdin = stdin(); - return Some((Box::new(stdin) as Box, is_stdin_interactive())); + return Box::new(stdin) as Box; } match File::open(Path::new(path)) { - Ok(f) => Some((Box::new(f) as Box, false)), + Ok(f) => Box::new(f) as Box, Err(e) => { - show_error!("sort: {0}: {1}", path, e.to_string()); - None + crash!(2, "cannot read: {0:?}: {1}", path, e); } } } @@ -1006,39 +1446,7 @@ mod tests { let b = "Ted"; let c = get_rand_string(); - assert_eq!(Ordering::Equal, random_shuffle(a, b, c)); - } - - #[test] - fn test_default_compare() { - let a = "your own"; - let b = "your place"; - - assert_eq!(Ordering::Less, default_compare(a, b)); - } - - #[test] - fn test_numeric_compare1() { - let a = "149:7"; - let b = "150:5"; - - assert_eq!(Ordering::Less, numeric_compare(a, b)); - } - - #[test] - fn test_numeric_compare2() { - let a = "-1.02"; - let b = "1"; - - assert_eq!(Ordering::Less, numeric_compare(a, b)); - } - - #[test] - fn test_human_numeric_compare() { - let a = "300K"; - let b = "1M"; - - assert_eq!(Ordering::Less, human_numeric_size_compare(a, b)); + assert_eq!(Ordering::Equal, random_shuffle(a, b, &c)); } #[test] @@ -1055,4 +1463,58 @@ mod tests { assert_eq!(Ordering::Less, version_compare(a, b)); } + + #[test] + fn test_random_compare() { + let a = "9"; + let b = "9"; + let c = get_rand_string(); + + assert_eq!(Ordering::Equal, random_shuffle(a, b, &c)); + } + + #[test] + fn test_tokenize_fields() { + let line = "foo bar b x"; + assert_eq!(tokenize(line, None), vec![0..3, 3..7, 7..9, 9..14,],); + } + + #[test] + fn test_tokenize_fields_leading_whitespace() { + let line = " foo bar b x"; + assert_eq!(tokenize(line, None), vec![0..7, 7..11, 11..13, 13..18,]); + } + + #[test] + fn test_tokenize_fields_custom_separator() { + let line = "aaa foo bar b x"; + assert_eq!( + tokenize(line, Some('a')), + vec![0..0, 1..1, 2..2, 3..9, 10..18,] + ); + } + + #[test] + fn test_tokenize_fields_trailing_custom_separator() { + let line = "a"; + assert_eq!(tokenize(line, Some('a')), vec![0..0]); + let line = "aa"; + assert_eq!(tokenize(line, Some('a')), vec![0..0, 1..1]); + let line = "..a..a"; + assert_eq!(tokenize(line, Some('a')), vec![0..2, 3..5]); + } + + #[test] + #[cfg(target_pointer_width = "64")] + fn test_line_size() { + // We should make sure to not regress the size of the Line struct because + // it is unconditional overhead for every line we sort. + assert_eq!(std::mem::size_of::(), 32); + // These are the fields of Line: + assert_eq!(std::mem::size_of::<&str>(), 16); + assert_eq!(std::mem::size_of::>(), 16); + + // How big is a selection? Constant cost all lines pay when we need selections. + assert_eq!(std::mem::size_of::(), 24); + } } diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index 4f80e25a3..726c9b8cd 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -13,11 +13,11 @@ extern crate uucore; mod platform; use clap::{App, Arg}; -use std::char; use std::env; use std::fs::File; -use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Read, Write}; +use std::io::{stdin, BufRead, BufReader, BufWriter, Read, Write}; use std::path::Path; +use std::{char, fs::remove_file}; static NAME: &str = "split"; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -213,107 +213,145 @@ struct Settings { verbose: bool, } -struct SplitControl { - current_line: String, // Don't touch - request_new_file: bool, // Splitter implementation requests new file -} - trait Splitter { - // Consume the current_line and return the consumed string - fn consume(&mut self, _: &mut SplitControl) -> String; + // Consume as much as possible from `reader` so as to saturate `writer`. + // Equivalent to finishing one of the part files. Returns the number of + // bytes that have been moved. + fn consume( + &mut self, + reader: &mut BufReader>, + writer: &mut BufWriter>, + ) -> u128; } struct LineSplitter { - saved_lines_to_write: usize, - lines_to_write: usize, + lines_per_split: usize, } impl LineSplitter { fn new(settings: &Settings) -> LineSplitter { - let n = match settings.strategy_param.parse() { - Ok(a) => a, - Err(e) => crash!(1, "invalid number of lines: {}", e), - }; LineSplitter { - saved_lines_to_write: n, - lines_to_write: n, + lines_per_split: settings + .strategy_param + .parse() + .unwrap_or_else(|e| crash!(1, "invalid number of lines: {}", e)), } } } impl Splitter for LineSplitter { - fn consume(&mut self, control: &mut SplitControl) -> String { - self.lines_to_write -= 1; - if self.lines_to_write == 0 { - self.lines_to_write = self.saved_lines_to_write; - control.request_new_file = true; + fn consume( + &mut self, + reader: &mut BufReader>, + writer: &mut BufWriter>, + ) -> u128 { + let mut bytes_consumed = 0u128; + let mut buffer = String::with_capacity(1024); + for _ in 0..self.lines_per_split { + let bytes_read = reader + .read_line(&mut buffer) + .unwrap_or_else(|_| crash!(1, "error reading bytes from input file")); + // If we ever read 0 bytes then we know we've hit EOF. + if bytes_read == 0 { + return bytes_consumed; + } + + writer + .write_all(buffer.as_bytes()) + .unwrap_or_else(|_| crash!(1, "error writing bytes to output file")); + // Empty out the String buffer since `read_line` appends instead of + // replaces. + buffer.clear(); + + bytes_consumed += bytes_read as u128; } - control.current_line.clone() + + bytes_consumed } } struct ByteSplitter { - saved_bytes_to_write: usize, - bytes_to_write: usize, - break_on_line_end: bool, - require_whole_line: bool, + bytes_per_split: u128, } impl ByteSplitter { fn new(settings: &Settings) -> ByteSplitter { - let mut strategy_param: Vec = settings.strategy_param.chars().collect(); - let suffix = strategy_param.pop().unwrap(); - let multiplier = match suffix { - '0'..='9' => 1usize, - 'b' => 512usize, - 'k' => 1024usize, - 'm' => 1024usize * 1024usize, - _ => crash!(1, "invalid number of bytes"), - }; - let n = if suffix.is_alphabetic() { - match strategy_param - .iter() - .cloned() - .collect::() - .parse::() - { - Ok(a) => a, - Err(e) => crash!(1, "invalid number of bytes: {}", e), - } - } else { - match settings.strategy_param.parse::() { - Ok(a) => a, - Err(e) => crash!(1, "invalid number of bytes: {}", e), - } - }; + // These multipliers are the same as supported by GNU coreutils. + let modifiers: Vec<(&str, u128)> = vec![ + ("K", 1024u128), + ("M", 1024 * 1024), + ("G", 1024 * 1024 * 1024), + ("T", 1024 * 1024 * 1024 * 1024), + ("P", 1024 * 1024 * 1024 * 1024 * 1024), + ("E", 1024 * 1024 * 1024 * 1024 * 1024 * 1024), + ("Z", 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024), + ("Y", 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024), + ("KB", 1000), + ("MB", 1000 * 1000), + ("GB", 1000 * 1000 * 1000), + ("TB", 1000 * 1000 * 1000 * 1000), + ("PB", 1000 * 1000 * 1000 * 1000 * 1000), + ("EB", 1000 * 1000 * 1000 * 1000 * 1000 * 1000), + ("ZB", 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000), + ("YB", 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000), + ]; + + // This sequential find is acceptable since none of the modifiers are + // suffixes of any other modifiers, a la Huffman codes. + let (suffix, multiplier) = modifiers + .iter() + .find(|(suffix, _)| settings.strategy_param.ends_with(suffix)) + .unwrap_or(&("", 1)); + + // Try to parse the actual numeral. + let n = &settings.strategy_param[0..(settings.strategy_param.len() - suffix.len())] + .parse::() + .unwrap_or_else(|e| crash!(1, "invalid number of bytes: {}", e)); + ByteSplitter { - saved_bytes_to_write: n * multiplier, - bytes_to_write: n * multiplier, - break_on_line_end: settings.strategy == "b", - require_whole_line: false, + bytes_per_split: n * multiplier, } } } impl Splitter for ByteSplitter { - fn consume(&mut self, control: &mut SplitControl) -> String { - let line = control.current_line.clone(); - let n = std::cmp::min(line.chars().count(), self.bytes_to_write); - if self.require_whole_line && n < line.chars().count() { - self.bytes_to_write = self.saved_bytes_to_write; - control.request_new_file = true; - self.require_whole_line = false; - return "".to_owned(); + fn consume( + &mut self, + reader: &mut BufReader>, + writer: &mut BufWriter>, + ) -> u128 { + // We buffer reads and writes. We proceed until `bytes_consumed` is + // equal to `self.bytes_per_split` or we reach EOF. + let mut bytes_consumed = 0u128; + const BUFFER_SIZE: usize = 1024; + let mut buffer = [0u8; BUFFER_SIZE]; + while bytes_consumed < self.bytes_per_split { + // Don't overshoot `self.bytes_per_split`! Note: Using std::cmp::min + // doesn't really work since we have to get types to match which + // can't be done in a way that keeps all conversions safe. + let bytes_desired = if (BUFFER_SIZE as u128) <= self.bytes_per_split - bytes_consumed { + BUFFER_SIZE + } else { + // This is a safe conversion since the difference must be less + // than BUFFER_SIZE in this branch. + (self.bytes_per_split - bytes_consumed) as usize + }; + let bytes_read = reader + .read(&mut buffer[0..bytes_desired]) + .unwrap_or_else(|_| crash!(1, "error reading bytes from input file")); + // If we ever read 0 bytes then we know we've hit EOF. + if bytes_read == 0 { + return bytes_consumed; + } + + writer + .write_all(&buffer[0..bytes_read]) + .unwrap_or_else(|_| crash!(1, "error writing bytes to output file")); + + bytes_consumed += bytes_read as u128; } - self.bytes_to_write -= n; - if n == 0 { - self.bytes_to_write = self.saved_bytes_to_write; - control.request_new_file = true; - } - if self.break_on_line_end && n == line.chars().count() { - self.require_whole_line = self.break_on_line_end; - } - line[..n].to_owned() + + bytes_consumed } } @@ -353,14 +391,13 @@ fn split(settings: &Settings) -> i32 { let mut reader = BufReader::new(if settings.input == "-" { Box::new(stdin()) as Box } else { - let r = match File::open(Path::new(&settings.input)) { - Ok(a) => a, - Err(_) => crash!( + let r = File::open(Path::new(&settings.input)).unwrap_or_else(|_| { + crash!( 1, "cannot open '{}' for reading: No such file or directory", settings.input - ), - }; + ) + }); Box::new(r) as Box }); @@ -370,48 +407,39 @@ fn split(settings: &Settings) -> i32 { a => crash!(1, "strategy {} not supported", a), }; - let mut control = SplitControl { - current_line: "".to_owned(), // Request new line - request_new_file: true, // Request new file - }; - - let mut writer = BufWriter::new(Box::new(stdout()) as Box); let mut fileno = 0; loop { - if control.current_line.chars().count() == 0 { - match reader.read_line(&mut control.current_line) { - Ok(0) | Err(_) => break, - _ => {} + // Get a new part file set up, and construct `writer` for it. + let mut filename = settings.prefix.clone(); + filename.push_str( + if settings.numeric_suffix { + num_prefix(fileno, settings.suffix_length) + } else { + str_prefix(fileno, settings.suffix_length) } - } - if control.request_new_file { - let mut filename = settings.prefix.clone(); - filename.push_str( - if settings.numeric_suffix { - num_prefix(fileno, settings.suffix_length) - } else { - str_prefix(fileno, settings.suffix_length) - } - .as_ref(), - ); - filename.push_str(settings.additional_suffix.as_ref()); + .as_ref(), + ); + filename.push_str(settings.additional_suffix.as_ref()); + let mut writer = platform::instantiate_current_writer(&settings.filter, filename.as_str()); - crash_if_err!(1, writer.flush()); - fileno += 1; - writer = platform::instantiate_current_writer(&settings.filter, filename.as_str()); - control.request_new_file = false; - if settings.verbose { - println!("creating file '{}'", filename); + let bytes_consumed = splitter.consume(&mut reader, &mut writer); + writer + .flush() + .unwrap_or_else(|e| crash!(1, "error flushing to output file: {}", e)); + + // If we didn't write anything we should clean up the empty file, and + // break from the loop. + if bytes_consumed == 0 { + // The output file is only ever created if --filter isn't used. + // Complicated, I know... + if settings.filter.is_none() { + remove_file(filename) + .unwrap_or_else(|e| crash!(1, "error removing empty file: {}", e)); } + break; } - let consumed = splitter.consume(&mut control); - crash_if_err!(1, writer.write_all(consumed.as_bytes())); - - let advance = consumed.chars().count(); - let clone = control.current_line.clone(); - let sl = clone; - control.current_line = sl[advance..sl.chars().count()].to_owned(); + fileno += 1; } 0 } diff --git a/src/uu/stat/Cargo.toml b/src/uu/stat/Cargo.toml index 96bf63ffe..86b7da139 100644 --- a/src/uu/stat/Cargo.toml +++ b/src/uu/stat/Cargo.toml @@ -16,8 +16,7 @@ path = "src/stat.rs" [dependencies] clap = "2.33" -time = "0.1.40" -uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["entries", "libc"] } +uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["entries", "libc", "fs", "fsext"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } [[bin]] diff --git a/src/uu/stat/src/fsext.rs b/src/uu/stat/src/fsext.rs deleted file mode 100644 index d90099892..000000000 --- a/src/uu/stat/src/fsext.rs +++ /dev/null @@ -1,415 +0,0 @@ -// This file is part of the uutils coreutils package. -// -// (c) Jian Zeng -// -// For the full copyright and license information, please view the LICENSE file -// that was distributed with this source code. - -// spell-checker:ignore (ToDO) strerror IFBLK IFCHR IFDIR IFLNK IFIFO IFMT IFREG IFSOCK subsec nanos gnulib statfs Sstatfs bitrig statvfs iosize blksize fnodes fsid namelen bsize bfree bavail ffree frsize namemax errno fstype adfs acfs aufs affs autofs befs bdevfs binfmt ceph cgroups cifs configfs cramfs cgroupfs debugfs devfs devpts ecryptfs btrfs efivarfs exofs fhgfs fuseblk fusectl futexfs gpfs hfsx hostfs hpfs inodefs ibrix inotifyfs isofs jffs logfs hugetlbfs mqueue nsfs ntfs ocfs panfs pipefs ramfs romfs nfsd nilfs pstorefs reiserfs securityfs smackfs snfs sockfs squashfs sysfs sysv tempfs tracefs ubifs usbdevfs vmhgfs tmpfs vxfs wslfs xenfs vzfs openprom overlayfs - -extern crate time; - -use self::time::Timespec; -use std::time::UNIX_EPOCH; -pub use uucore::libc::{ - c_int, mode_t, strerror, S_IFBLK, S_IFCHR, S_IFDIR, S_IFIFO, S_IFLNK, S_IFMT, S_IFREG, - S_IFSOCK, S_IRGRP, S_IROTH, S_IRUSR, S_ISGID, S_ISUID, S_ISVTX, S_IWGRP, S_IWOTH, S_IWUSR, - S_IXGRP, S_IXOTH, S_IXUSR, -}; - -pub trait BirthTime { - fn pretty_birth(&self) -> String; - fn birth(&self) -> String; -} - -use std::fs::Metadata; -impl BirthTime for Metadata { - fn pretty_birth(&self) -> String { - self.created() - .ok() - .and_then(|t| t.duration_since(UNIX_EPOCH).ok()) - .map(|e| pretty_time(e.as_secs() as i64, i64::from(e.subsec_nanos()))) - .unwrap_or_else(|| "-".to_owned()) - } - - fn birth(&self) -> String { - self.created() - .ok() - .and_then(|t| t.duration_since(UNIX_EPOCH).ok()) - .map(|e| format!("{}", e.as_secs())) - .unwrap_or_else(|| "0".to_owned()) - } -} - -#[macro_export] -macro_rules! has { - ($mode:expr, $perm:expr) => { - $mode & $perm != 0 - }; -} - -pub fn pretty_time(sec: i64, nsec: i64) -> String { - // sec == seconds since UNIX_EPOCH - // nsec == nanoseconds since (UNIX_EPOCH + sec) - let tm = time::at(Timespec::new(sec, nsec as i32)); - let res = time::strftime("%Y-%m-%d %H:%M:%S.%f %z", &tm).unwrap(); - if res.ends_with(" -0000") { - res.replace(" -0000", " +0000") - } else { - res - } -} - -pub fn pretty_filetype<'a>(mode: mode_t, size: u64) -> &'a str { - match mode & S_IFMT { - S_IFREG => { - if size != 0 { - "regular file" - } else { - "regular empty file" - } - } - S_IFDIR => "directory", - S_IFLNK => "symbolic link", - S_IFCHR => "character special file", - S_IFBLK => "block special file", - S_IFIFO => "fifo", - S_IFSOCK => "socket", - // TODO: Other file types - // See coreutils/gnulib/lib/file-type.c - _ => "weird file", - } -} - -pub fn pretty_access(mode: mode_t) -> String { - let mut result = String::with_capacity(10); - result.push(match mode & S_IFMT { - S_IFDIR => 'd', - S_IFCHR => 'c', - S_IFBLK => 'b', - S_IFREG => '-', - S_IFIFO => 'p', - S_IFLNK => 'l', - S_IFSOCK => 's', - // TODO: Other file types - _ => '?', - }); - - result.push(if has!(mode, S_IRUSR) { 'r' } else { '-' }); - result.push(if has!(mode, S_IWUSR) { 'w' } else { '-' }); - result.push(if has!(mode, S_ISUID as mode_t) { - if has!(mode, S_IXUSR) { - 's' - } else { - 'S' - } - } else if has!(mode, S_IXUSR) { - 'x' - } else { - '-' - }); - - result.push(if has!(mode, S_IRGRP) { 'r' } else { '-' }); - result.push(if has!(mode, S_IWGRP) { 'w' } else { '-' }); - result.push(if has!(mode, S_ISGID as mode_t) { - if has!(mode, S_IXGRP) { - 's' - } else { - 'S' - } - } else if has!(mode, S_IXGRP) { - 'x' - } else { - '-' - }); - - result.push(if has!(mode, S_IROTH) { 'r' } else { '-' }); - result.push(if has!(mode, S_IWOTH) { 'w' } else { '-' }); - result.push(if has!(mode, S_ISVTX as mode_t) { - if has!(mode, S_IXOTH) { - 't' - } else { - 'T' - } - } else if has!(mode, S_IXOTH) { - 'x' - } else { - '-' - }); - - result -} - -use std::borrow::Cow; -use std::convert::{AsRef, From}; -use std::ffi::CString; -use std::io::Error as IOError; -use std::mem; -use std::path::Path; - -#[cfg(any( - target_os = "linux", - target_vendor = "apple", - target_os = "android", - target_os = "freebsd" -))] -use uucore::libc::statfs as Sstatfs; -#[cfg(any( - target_os = "openbsd", - target_os = "netbsd", - target_os = "openbsd", - target_os = "bitrig", - target_os = "dragonfly" -))] -use uucore::libc::statvfs as Sstatfs; - -#[cfg(any( - target_os = "linux", - target_vendor = "apple", - target_os = "android", - target_os = "freebsd" -))] -use uucore::libc::statfs as statfs_fn; -#[cfg(any( - target_os = "openbsd", - target_os = "netbsd", - target_os = "openbsd", - target_os = "bitrig", - target_os = "dragonfly" -))] -use uucore::libc::statvfs as statfs_fn; - -pub trait FsMeta { - fn fs_type(&self) -> i64; - fn iosize(&self) -> u64; - fn blksize(&self) -> i64; - fn total_blocks(&self) -> u64; - fn free_blocks(&self) -> u64; - fn avail_blocks(&self) -> u64; - fn total_fnodes(&self) -> u64; - fn free_fnodes(&self) -> u64; - fn fsid(&self) -> u64; - fn namelen(&self) -> u64; -} - -impl FsMeta for Sstatfs { - fn blksize(&self) -> i64 { - self.f_bsize as i64 - } - fn total_blocks(&self) -> u64 { - self.f_blocks as u64 - } - fn free_blocks(&self) -> u64 { - self.f_bfree as u64 - } - fn avail_blocks(&self) -> u64 { - self.f_bavail as u64 - } - fn total_fnodes(&self) -> u64 { - self.f_files as u64 - } - fn free_fnodes(&self) -> u64 { - self.f_ffree as u64 - } - #[cfg(any(target_os = "linux", target_vendor = "apple", target_os = "freebsd"))] - fn fs_type(&self) -> i64 { - self.f_type as i64 - } - #[cfg(not(any(target_os = "linux", target_vendor = "apple", target_os = "freebsd")))] - fn fs_type(&self) -> i64 { - // FIXME: statvfs doesn't have an equivalent, so we need to do something else - unimplemented!() - } - - #[cfg(target_os = "linux")] - fn iosize(&self) -> u64 { - self.f_frsize as u64 - } - #[cfg(any(target_vendor = "apple", target_os = "freebsd"))] - fn iosize(&self) -> u64 { - self.f_iosize as u64 - } - // XXX: dunno if this is right - #[cfg(not(any(target_vendor = "apple", target_os = "freebsd", target_os = "linux")))] - fn iosize(&self) -> u64 { - self.f_bsize as u64 - } - - // Linux, SunOS, HP-UX, 4.4BSD, FreeBSD have a system call statfs() that returns - // a struct statfs, containing a fsid_t f_fsid, where fsid_t is defined - // as struct { int val[2]; } - // - // Solaris, Irix and POSIX have a system call statvfs(2) that returns a - // struct statvfs, containing an unsigned long f_fsid - #[cfg(any(target_vendor = "apple", target_os = "freebsd", target_os = "linux"))] - fn fsid(&self) -> u64 { - let f_fsid: &[u32; 2] = - unsafe { &*(&self.f_fsid as *const uucore::libc::fsid_t as *const [u32; 2]) }; - (u64::from(f_fsid[0])) << 32 | u64::from(f_fsid[1]) - } - #[cfg(not(any(target_vendor = "apple", target_os = "freebsd", target_os = "linux")))] - fn fsid(&self) -> u64 { - self.f_fsid as u64 - } - - #[cfg(target_os = "linux")] - fn namelen(&self) -> u64 { - self.f_namelen as u64 - } - #[cfg(target_vendor = "apple")] - fn namelen(&self) -> u64 { - 1024 - } - #[cfg(target_os = "freebsd")] - fn namelen(&self) -> u64 { - self.f_namemax as u64 - } - // XXX: should everything just use statvfs? - #[cfg(not(any(target_vendor = "apple", target_os = "freebsd", target_os = "linux")))] - fn namelen(&self) -> u64 { - self.f_namemax as u64 - } -} - -pub fn statfs>(path: P) -> Result -where - Vec: From

, -{ - match CString::new(path) { - Ok(p) => { - let mut buffer: Sstatfs = unsafe { mem::zeroed() }; - unsafe { - match statfs_fn(p.as_ptr(), &mut buffer) { - 0 => Ok(buffer), - _ => { - let errno = IOError::last_os_error().raw_os_error().unwrap_or(0); - Err(CString::from_raw(strerror(errno)) - .into_string() - .unwrap_or_else(|_| "Unknown Error".to_owned())) - } - } - } - } - Err(e) => Err(e.to_string()), - } -} - -pub fn pretty_fstype<'a>(fstype: i64) -> Cow<'a, str> { - match fstype { - 0x6163_6673 => "acfs".into(), - 0xADF5 => "adfs".into(), - 0xADFF => "affs".into(), - 0x5346_414F => "afs".into(), - 0x0904_1934 => "anon-inode FS".into(), - 0x6175_6673 => "aufs".into(), - 0x0187 => "autofs".into(), - 0x4246_5331 => "befs".into(), - 0x6264_6576 => "bdevfs".into(), - 0x1BAD_FACE => "bfs".into(), - 0xCAFE_4A11 => "bpf_fs".into(), - 0x4249_4E4D => "binfmt_misc".into(), - 0x9123_683E => "btrfs".into(), - 0x7372_7279 => "btrfs_test".into(), - 0x00C3_6400 => "ceph".into(), - 0x0027_E0EB => "cgroupfs".into(), - 0xFF53_4D42 => "cifs".into(), - 0x7375_7245 => "coda".into(), - 0x012F_F7B7 => "coh".into(), - 0x6265_6570 => "configfs".into(), - 0x28CD_3D45 => "cramfs".into(), - 0x453D_CD28 => "cramfs-wend".into(), - 0x6462_6720 => "debugfs".into(), - 0x1373 => "devfs".into(), - 0x1CD1 => "devpts".into(), - 0xF15F => "ecryptfs".into(), - 0xDE5E_81E4 => "efivarfs".into(), - 0x0041_4A53 => "efs".into(), - 0x5DF5 => "exofs".into(), - 0x137D => "ext".into(), - 0xEF53 => "ext2/ext3".into(), - 0xEF51 => "ext2".into(), - 0xF2F5_2010 => "f2fs".into(), - 0x4006 => "fat".into(), - 0x1983_0326 => "fhgfs".into(), - 0x6573_5546 => "fuseblk".into(), - 0x6573_5543 => "fusectl".into(), - 0x0BAD_1DEA => "futexfs".into(), - 0x0116_1970 => "gfs/gfs2".into(), - 0x4750_4653 => "gpfs".into(), - 0x4244 => "hfs".into(), - 0x482B => "hfs+".into(), - 0x4858 => "hfsx".into(), - 0x00C0_FFEE => "hostfs".into(), - 0xF995_E849 => "hpfs".into(), - 0x9584_58F6 => "hugetlbfs".into(), - 0x1130_7854 => "inodefs".into(), - 0x0131_11A8 => "ibrix".into(), - 0x2BAD_1DEA => "inotifyfs".into(), - 0x9660 => "isofs".into(), - 0x4004 => "isofs".into(), - 0x4000 => "isofs".into(), - 0x07C0 => "jffs".into(), - 0x72B6 => "jffs2".into(), - 0x3153_464A => "jfs".into(), - 0x6B41_4653 => "k-afs".into(), - 0xC97E_8168 => "logfs".into(), - 0x0BD0_0BD0 => "lustre".into(), - 0x5346_314D => "m1fs".into(), - 0x137F => "minix".into(), - 0x138F => "minix (30 char.)".into(), - 0x2468 => "minix v2".into(), - 0x2478 => "minix v2 (30 char.)".into(), - 0x4D5A => "minix3".into(), - 0x1980_0202 => "mqueue".into(), - 0x4D44 => "msdos".into(), - 0x564C => "novell".into(), - 0x6969 => "nfs".into(), - 0x6E66_7364 => "nfsd".into(), - 0x3434 => "nilfs".into(), - 0x6E73_6673 => "nsfs".into(), - 0x5346_544E => "ntfs".into(), - 0x9FA1 => "openprom".into(), - 0x7461_636F => "ocfs2".into(), - 0x794C_7630 => "overlayfs".into(), - 0xAAD7_AAEA => "panfs".into(), - 0x5049_5045 => "pipefs".into(), - 0x7C7C_6673 => "prl_fs".into(), - 0x9FA0 => "proc".into(), - 0x6165_676C => "pstorefs".into(), - 0x002F => "qnx4".into(), - 0x6819_1122 => "qnx6".into(), - 0x8584_58F6 => "ramfs".into(), - 0x5265_4973 => "reiserfs".into(), - 0x7275 => "romfs".into(), - 0x6759_6969 => "rpc_pipefs".into(), - 0x7363_6673 => "securityfs".into(), - 0xF97C_FF8C => "selinux".into(), - 0x4341_5D53 => "smackfs".into(), - 0x517B => "smb".into(), - 0xFE53_4D42 => "smb2".into(), - 0xBEEF_DEAD => "snfs".into(), - 0x534F_434B => "sockfs".into(), - 0x7371_7368 => "squashfs".into(), - 0x6265_6572 => "sysfs".into(), - 0x012F_F7B6 => "sysv2".into(), - 0x012F_F7B5 => "sysv4".into(), - 0x0102_1994 => "tmpfs".into(), - 0x7472_6163 => "tracefs".into(), - 0x2405_1905 => "ubifs".into(), - 0x1501_3346 => "udf".into(), - 0x0001_1954 => "ufs".into(), - 0x5419_0100 => "ufs".into(), - 0x9FA2 => "usbdevfs".into(), - 0x0102_1997 => "v9fs".into(), - 0xBACB_ACBC => "vmhgfs".into(), - 0xA501_FCF5 => "vxfs".into(), - 0x565A_4653 => "vzfs".into(), - 0x5346_4846 => "wslfs".into(), - 0xABBA_1974 => "xenfs".into(), - 0x012F_F7B4 => "xenix".into(), - 0x5846_5342 => "xfs".into(), - 0x012F_D16D => "xia".into(), - 0x2FC1_2FC1 => "zfs".into(), - other => format!("UNKNOWN ({:#x})", other).into(), - } -} diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index 5216fb293..582d59841 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -5,21 +5,20 @@ // For the full copyright and license information, please view the LICENSE file // that was distributed with this source code. -// spell-checker:ignore (ToDO) mtab fsext showfs otype fmtstr prec ftype blocksize nlink rdev fnodes fsid namelen blksize inodes fstype iosize statfs gnulib NBLOCKSIZE - -#[macro_use] -mod fsext; -pub use crate::fsext::*; +// spell-checker:ignore (ToDO) showfs otype fmtstr prec ftype blocksize nlink rdev fnodes fsid namelen blksize inodes fstype iosize statfs gnulib NBLOCKSIZE #[macro_use] extern crate uucore; use uucore::entries; +use uucore::fs::display_permissions; +use uucore::fsext::{ + pretty_filetype, pretty_fstype, pretty_time, read_fs_list, statfs, BirthTime, FsMeta, +}; +use uucore::libc::mode_t; use clap::{App, Arg, ArgMatches}; use std::borrow::Cow; use std::convert::AsRef; -use std::fs::File; -use std::io::{BufRead, BufReader}; use std::os::unix::fs::{FileTypeExt, MetadataExt}; use std::path::Path; use std::{cmp, fs, iter}; @@ -97,7 +96,6 @@ pub mod options { static ARG_FILES: &str = "files"; -const MOUNT_INFO: &str = "/etc/mtab"; pub const F_ALTER: u8 = 1; pub const F_ZERO: u8 = 1 << 1; pub const F_LEFT: u8 = 1 << 2; @@ -490,13 +488,9 @@ impl Stater { // mount points aren't displayed when showing filesystem information None } else { - let reader = BufReader::new( - File::open(MOUNT_INFO).unwrap_or_else(|_| panic!("Failed to read {}", MOUNT_INFO)), - ); - let mut mount_list = reader - .lines() - .filter_map(Result::ok) - .filter_map(|line| line.split_whitespace().nth(1).map(ToOwned::to_owned)) + let mut mount_list = read_fs_list() + .iter() + .map(|mi| mi.mount_dir.clone()) .collect::>(); // Reverse sort. The longer comes first. mount_list.sort(); @@ -575,7 +569,7 @@ impl Stater { } // access rights in human readable form 'A' => { - arg = pretty_access(meta.mode() as mode_t); + arg = display_permissions(&meta, true); otype = OutputType::Str; } // number of blocks allocated (see %B) @@ -663,7 +657,7 @@ impl Stater { dst.to_string_lossy() ); } else { - arg = format!("`{}'", file); + arg = file.to_string(); } otype = OutputType::Str; } @@ -755,7 +749,7 @@ impl Stater { } } Err(e) => { - show_info!("cannot stat '{}': {}", file, e); + show_error!("cannot stat '{}': {}", file, e); return 1; } } @@ -848,7 +842,7 @@ impl Stater { } } Err(e) => { - show_info!("cannot read file system information for '{}': {}", file, e); + show_error!("cannot read file system information for '{}': {}", file, e); return 1; } } @@ -1007,7 +1001,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { match Stater::new(matches) { Ok(stater) => stater.exec(), Err(e) => { - show_info!("{}", e); + show_error!("{}", e); 1 } } diff --git a/src/uu/stat/src/test_stat.rs b/src/uu/stat/src/test_stat.rs deleted file mode 100644 index 05e91fb84..000000000 --- a/src/uu/stat/src/test_stat.rs +++ /dev/null @@ -1,76 +0,0 @@ -// spell-checker:ignore (ToDO) scanutil qzxc dqzxc - -pub use super::*; - -#[test] -fn test_scanutil() { - assert_eq!(Some((-5, 2)), "-5zxc".scan_num::()); - assert_eq!(Some((51, 2)), "51zxc".scan_num::()); - assert_eq!(Some((192, 4)), "+192zxc".scan_num::()); - assert_eq!(None, "z192zxc".scan_num::()); - - assert_eq!(Some(('a', 3)), "141zxc".scan_char(8)); - assert_eq!(Some(('\n', 2)), "12qzxc".scan_char(8)); - assert_eq!(Some(('\r', 1)), "dqzxc".scan_char(16)); - assert_eq!(None, "z2qzxc".scan_char(8)); -} - -#[cfg(test)] -mod test_generate_tokens { - use super::*; - - #[test] - fn test_normal_format() { - let s = "%10.2ac%-5.w\n"; - let expected = vec![ - Token::Directive { - flag: 0, - width: 10, - precision: 2, - format: 'a', - }, - Token::Char('c'), - Token::Directive { - flag: F_LEFT, - width: 5, - precision: 0, - format: 'w', - }, - Token::Char('\n'), - ]; - assert_eq!(&expected, &Stater::generate_tokens(s, false).unwrap()); - } - - #[test] - fn test_printf_format() { - let s = "%-# 15a\\r\\\"\\\\\\a\\b\\e\\f\\v%+020.-23w\\x12\\167\\132\\112\\n"; - let expected = vec![ - Token::Directive { - flag: F_LEFT | F_ALTER | F_SPACE, - width: 15, - precision: -1, - format: 'a', - }, - Token::Char('\r'), - Token::Char('"'), - Token::Char('\\'), - Token::Char('\x07'), - Token::Char('\x08'), - Token::Char('\x1B'), - Token::Char('\x0C'), - Token::Char('\x0B'), - Token::Directive { - flag: F_SIGN | F_ZERO, - width: 20, - precision: -1, - format: 'w', - }, - Token::Char('\x12'), - Token::Char('w'), - Token::Char('Z'), - Token::Char('J'), - Token::Char('\n'), - ]; - assert_eq!(&expected, &Stater::generate_tokens(s, true).unwrap()); - } -} diff --git a/src/uu/stdbuf/Cargo.toml b/src/uu/stdbuf/Cargo.toml index 22ce4de6a..884a98785 100644 --- a/src/uu/stdbuf/Cargo.toml +++ b/src/uu/stdbuf/Cargo.toml @@ -15,7 +15,7 @@ edition = "2018" path = "src/stdbuf.rs" [dependencies] -getopts = "0.2.18" +clap = "2.33" tempfile = "3.1" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/stdbuf/src/libstdbuf/src/libstdbuf.rs b/src/uu/stdbuf/src/libstdbuf/src/libstdbuf.rs index fa36d4ab5..d08427d98 100644 --- a/src/uu/stdbuf/src/libstdbuf/src/libstdbuf.rs +++ b/src/uu/stdbuf/src/libstdbuf/src/libstdbuf.rs @@ -35,8 +35,8 @@ extern "C" { fn set_buffer(stream: *mut FILE, value: &str) { let (mode, size): (c_int, size_t) = match value { - "0" => (_IONBF, 0 as size_t), - "L" => (_IOLBF, 0 as size_t), + "0" => (_IONBF, 0_usize), + "L" => (_IOLBF, 0_usize), input => { let buff_size: usize = match input.parse() { Ok(num) => num, diff --git a/src/uu/stdbuf/src/stdbuf.rs b/src/uu/stdbuf/src/stdbuf.rs index 67ed9a838..134247060 100644 --- a/src/uu/stdbuf/src/stdbuf.rs +++ b/src/uu/stdbuf/src/stdbuf.rs @@ -10,7 +10,8 @@ #[macro_use] extern crate uucore; -use getopts::{Matches, Options}; +use clap::{App, AppSettings, Arg, ArgMatches}; +use std::convert::TryFrom; use std::fs::File; use std::io::{self, Write}; use std::os::unix::process::ExitStatusExt; @@ -18,9 +19,37 @@ use std::path::PathBuf; use std::process::Command; use tempfile::tempdir; use tempfile::TempDir; +use uucore::InvalidEncodingHandling; -static NAME: &str = "stdbuf"; static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = + "Run COMMAND, with modified buffering operations for its standard streams.\n\n\ + Mandatory arguments to long options are mandatory for short options too."; +static LONG_HELP: &str = "If MODE is 'L' the corresponding stream will be line buffered.\n\ + This option is invalid with standard input.\n\n\ + If MODE is '0' the corresponding stream will be unbuffered.\n\n\ + Otherwise MODE is a number which may be followed by one of the following:\n\n\ + KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.\n\ + In this case the corresponding stream will be fully buffered with the buffer size set to \ + MODE bytes.\n\n\ + NOTE: If COMMAND adjusts the buffering of its standard streams ('tee' does for e.g.) then \ + that will override corresponding settings changed by 'stdbuf'.\n\ + Also some filters (like 'dd' and 'cat' etc.) don't use streams for I/O, \ + and are thus unaffected by 'stdbuf' settings.\n"; + +mod options { + pub const INPUT: &str = "input"; + pub const INPUT_SHORT: &str = "i"; + pub const OUTPUT: &str = "output"; + pub const OUTPUT_SHORT: &str = "o"; + pub const ERROR: &str = "error"; + pub const ERROR_SHORT: &str = "e"; + pub const COMMAND: &str = "command"; +} + +fn get_usage() -> String { + format!("{0} OPTION... COMMAND", executable!()) +} const STDBUF_INJECT: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/libstdbuf.so")); @@ -36,16 +65,19 @@ struct ProgramOptions { stderr: BufferType, } -enum ErrMsg { - Retry, - Fatal, +impl<'a> TryFrom<&ArgMatches<'a>> for ProgramOptions { + type Error = ProgramOptionsError; + + fn try_from(matches: &ArgMatches) -> Result { + Ok(ProgramOptions { + stdin: check_option(&matches, options::INPUT)?, + stdout: check_option(&matches, options::OUTPUT)?, + stderr: check_option(&matches, options::ERROR)?, + }) + } } -enum OkMsg { - Buffering, - Help, - Version, -} +struct ProgramOptionsError(String); #[cfg(any( target_os = "linux", @@ -73,31 +105,6 @@ fn preload_strings() -> (&'static str, &'static str) { crash!(1, "Command not supported for this operating system!") } -fn print_version() { - println!("{} {}", NAME, VERSION); -} - -fn print_usage(opts: &Options) { - let brief = "Run COMMAND, with modified buffering operations for its standard streams\n \ - Mandatory arguments to long options are mandatory for short options too."; - let explanation = "If MODE is 'L' the corresponding stream will be line buffered.\n \ - This option is invalid with standard input.\n\n \ - If MODE is '0' the corresponding stream will be unbuffered.\n\n \ - Otherwise MODE is a number which may be followed by one of the following:\n\n \ - KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.\n \ - In this case the corresponding stream will be fully buffered with the buffer size set to \ - MODE bytes.\n\n \ - NOTE: If COMMAND adjusts the buffering of its standard streams ('tee' does for e.g.) then \ - that will override corresponding settings changed by 'stdbuf'.\n \ - Also some filters (like 'dd' and 'cat' etc.) don't use streams for I/O, \ - and are thus unaffected by 'stdbuf' settings.\n"; - println!("{} {}", NAME, VERSION); - println!(); - println!("Usage: stdbuf OPTION... COMMAND"); - println!(); - println!("{}\n{}", opts.usage(brief), explanation); -} - fn parse_size(size: &str) -> Option { let ext = size.trim_start_matches(|c: char| c.is_digit(10)); let num = size.trim_end_matches(char::is_alphabetic); @@ -133,65 +140,30 @@ fn parse_size(size: &str) -> Option { Some(buf_size * base.pow(power)) } -fn check_option(matches: &Matches, name: &str, modified: &mut bool) -> Option { - match matches.opt_str(name) { - Some(value) => { - *modified = true; - match &value[..] { - "L" => { - if name == "input" { - show_info!("line buffering stdin is meaningless"); - None - } else { - Some(BufferType::Line) - } - } - x => { - let size = match parse_size(x) { - Some(m) => m, - None => { - show_error!("Invalid mode {}", x); - return None; - } - }; - Some(BufferType::Size(size)) +fn check_option(matches: &ArgMatches, name: &str) -> Result { + match matches.value_of(name) { + Some(value) => match value { + "L" => { + if name == options::INPUT { + Err(ProgramOptionsError( + "line buffering stdin is meaningless".to_string(), + )) + } else { + Ok(BufferType::Line) } } - } - None => Some(BufferType::Default), + x => { + let size = match parse_size(x) { + Some(m) => m, + None => return Err(ProgramOptionsError(format!("invalid mode {}", x))), + }; + Ok(BufferType::Size(size)) + } + }, + None => Ok(BufferType::Default), } } -fn parse_options( - args: &[String], - options: &mut ProgramOptions, - optgrps: &Options, -) -> Result { - let matches = match optgrps.parse(args) { - Ok(m) => m, - Err(_) => return Err(ErrMsg::Retry), - }; - if matches.opt_present("help") { - return Ok(OkMsg::Help); - } - if matches.opt_present("version") { - return Ok(OkMsg::Version); - } - let mut modified = false; - options.stdin = check_option(&matches, "input", &mut modified).ok_or(ErrMsg::Fatal)?; - options.stdout = check_option(&matches, "output", &mut modified).ok_or(ErrMsg::Fatal)?; - options.stderr = check_option(&matches, "error", &mut modified).ok_or(ErrMsg::Fatal)?; - - if matches.free.len() != 1 { - return Err(ErrMsg::Retry); - } - if !modified { - show_error!("you must specify a buffering mode option"); - return Err(ErrMsg::Fatal); - } - Ok(OkMsg::Buffering) -} - fn set_command_env(command: &mut Command, buffer_name: &str, buffer_type: BufferType) { match buffer_type { BufferType::Size(m) => { @@ -215,72 +187,65 @@ fn get_preload_env(tmp_dir: &mut TempDir) -> io::Result<(String, PathBuf)> { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); + let usage = get_usage(); - let mut opts = Options::new(); + let matches = App::new(executable!()) + .version(VERSION) + .about(ABOUT) + .usage(&usage[..]) + .after_help(LONG_HELP) + .setting(AppSettings::TrailingVarArg) + .arg( + Arg::with_name(options::INPUT) + .long(options::INPUT) + .short(options::INPUT_SHORT) + .help("adjust standard input stream buffering") + .value_name("MODE") + .required_unless_one(&[options::OUTPUT, options::ERROR]), + ) + .arg( + Arg::with_name(options::OUTPUT) + .long(options::OUTPUT) + .short(options::OUTPUT_SHORT) + .help("adjust standard output stream buffering") + .value_name("MODE") + .required_unless_one(&[options::INPUT, options::ERROR]), + ) + .arg( + Arg::with_name(options::ERROR) + .long(options::ERROR) + .short(options::ERROR_SHORT) + .help("adjust standard error stream buffering") + .value_name("MODE") + .required_unless_one(&[options::INPUT, options::OUTPUT]), + ) + .arg( + Arg::with_name(options::COMMAND) + .multiple(true) + .takes_value(true) + .hidden(true) + .required(true), + ) + .get_matches_from(args); - opts.optopt( - "i", - "input", - "adjust standard input stream buffering", - "MODE", - ); - opts.optopt( - "o", - "output", - "adjust standard output stream buffering", - "MODE", - ); - opts.optopt( - "e", - "error", - "adjust standard error stream buffering", - "MODE", - ); - opts.optflag("", "help", "display this help and exit"); - opts.optflag("", "version", "output version information and exit"); + let options = ProgramOptions::try_from(&matches) + .unwrap_or_else(|e| crash!(125, "{}\nTry 'stdbuf --help' for more information.", e.0)); - let mut options = ProgramOptions { - stdin: BufferType::Default, - stdout: BufferType::Default, - stderr: BufferType::Default, - }; - let mut command_idx: i32 = -1; - for i in 1..=args.len() { - match parse_options(&args[1..i], &mut options, &opts) { - Ok(OkMsg::Buffering) => { - command_idx = (i as i32) - 1; - break; - } - Ok(OkMsg::Help) => { - print_usage(&opts); - return 0; - } - Ok(OkMsg::Version) => { - print_version(); - return 0; - } - Err(ErrMsg::Fatal) => break, - Err(ErrMsg::Retry) => continue, - } - } - if command_idx == -1 { - crash!( - 125, - "Invalid options\nTry 'stdbuf --help' for more information." - ); - } - let command_name = &args[command_idx as usize]; - let mut command = Command::new(command_name); + let mut command_values = matches.values_of::<&str>(options::COMMAND).unwrap(); + let mut command = Command::new(command_values.next().unwrap()); + let command_params: Vec<&str> = command_values.collect(); let mut tmp_dir = tempdir().unwrap(); let (preload_env, libstdbuf) = return_if_err!(1, get_preload_env(&mut tmp_dir)); - command - .args(&args[(command_idx as usize) + 1..]) - .env(preload_env, libstdbuf); + command.env(preload_env, libstdbuf); set_command_env(&mut command, "_STDBUF_I", options.stdin); set_command_env(&mut command, "_STDBUF_O", options.stdout); set_command_env(&mut command, "_STDBUF_E", options.stderr); + command.args(command_params); + let mut process = match command.spawn() { Ok(p) => p, Err(e) => crash!(1, "failed to execute process: {}", e), diff --git a/src/uu/sum/src/sum.rs b/src/uu/sum/src/sum.rs index ed5655a3d..ea833c0d2 100644 --- a/src/uu/sum/src/sum.rs +++ b/src/uu/sum/src/sum.rs @@ -14,6 +14,7 @@ use clap::{App, Arg}; use std::fs::File; use std::io::{stdin, Read, Result}; use std::path::Path; +use uucore::InvalidEncodingHandling; static NAME: &str = "sum"; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -75,7 +76,7 @@ fn open(name: &str) -> Result> { "Is a directory", )); }; - if !path.metadata().is_ok() { + if path.metadata().is_err() { return Err(std::io::Error::new( std::io::ErrorKind::NotFound, "No such file or directory", @@ -94,7 +95,9 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .name(NAME) diff --git a/src/uu/tac/src/tac.rs b/src/uu/tac/src/tac.rs index 68dae94e2..a638d578d 100644 --- a/src/uu/tac/src/tac.rs +++ b/src/uu/tac/src/tac.rs @@ -13,6 +13,7 @@ extern crate uucore; use clap::{App, Arg}; use std::io::{stdin, stdout, BufReader, Read, Stdout, Write}; use std::{fs::File, path::Path}; +use uucore::InvalidEncodingHandling; static NAME: &str = "tac"; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -27,7 +28,9 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .name(NAME) @@ -90,11 +93,16 @@ fn tac(filenames: Vec, before: bool, _: bool, separator: &str) -> i32 { Box::new(stdin()) as Box } else { let path = Path::new(filename); - if path.is_dir() || !path.metadata().is_ok() { - show_error!( - "failed to open '{}' for reading: No such file or directory", - filename - ); + if path.is_dir() || path.metadata().is_err() { + if path.is_dir() { + show_error!("dir: read error: Invalid argument"); + } else { + show_error!( + "failed to open '{}' for reading: No such file or directory", + filename + ); + } + exit_code = 1; continue; } match File::open(path) { diff --git a/src/uu/tail/Cargo.toml b/src/uu/tail/Cargo.toml index d3f60e09b..273c67bb3 100644 --- a/src/uu/tail/Cargo.toml +++ b/src/uu/tail/Cargo.toml @@ -17,7 +17,7 @@ path = "src/tail.rs" [dependencies] clap = "2.33" libc = "0.2.42" -uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } +uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["ringbuffer"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } winapi = { version="0.3", features=["fileapi", "handleapi", "processthreadsapi", "synchapi", "winbase"] } diff --git a/src/uu/tail/src/chunks.rs b/src/uu/tail/src/chunks.rs new file mode 100644 index 000000000..57a26dabf --- /dev/null +++ b/src/uu/tail/src/chunks.rs @@ -0,0 +1,83 @@ +//! Iterating over a file by chunks, starting at the end of the file. +//! +//! Use [`ReverseChunks::new`] to create a new iterator over chunks of +//! bytes from the file. +use std::fs::File; +use std::io::{Read, Seek, SeekFrom}; + +/// When reading files in reverse in `bounded_tail`, this is the size of each +/// block read at a time. +pub const BLOCK_SIZE: u64 = 1 << 16; + +/// An iterator over a file in non-overlapping chunks from the end of the file. +/// +/// Each chunk is a [`Vec`]<[`u8`]> of size [`BLOCK_SIZE`] (except +/// possibly the last chunk, which might be smaller). Each call to +/// [`next`] will seek backwards through the given file. +pub struct ReverseChunks<'a> { + /// The file to iterate over, by blocks, from the end to the beginning. + file: &'a File, + + /// The total number of bytes in the file. + size: u64, + + /// The total number of blocks to read. + max_blocks_to_read: usize, + + /// The index of the next block to read. + block_idx: usize, +} + +impl<'a> ReverseChunks<'a> { + pub fn new(file: &'a mut File) -> ReverseChunks<'a> { + let size = file.seek(SeekFrom::End(0)).unwrap(); + let max_blocks_to_read = (size as f64 / BLOCK_SIZE as f64).ceil() as usize; + let block_idx = 0; + ReverseChunks { + file, + size, + max_blocks_to_read, + block_idx, + } + } +} + +impl<'a> Iterator for ReverseChunks<'a> { + type Item = Vec; + + fn next(&mut self) -> Option { + // If there are no more chunks to read, terminate the iterator. + if self.block_idx >= self.max_blocks_to_read { + return None; + } + + // The chunk size is `BLOCK_SIZE` for all but the last chunk + // (that is, the chunk closest to the beginning of the file), + // which contains the remainder of the bytes. + let block_size = if self.block_idx == self.max_blocks_to_read - 1 { + self.size % BLOCK_SIZE + } else { + BLOCK_SIZE + }; + + // Seek backwards by the next chunk, read the full chunk into + // `buf`, and then seek back to the start of the chunk again. + let mut buf = vec![0; BLOCK_SIZE as usize]; + let pos = self + .file + .seek(SeekFrom::Current(-(block_size as i64))) + .unwrap(); + self.file + .read_exact(&mut buf[0..(block_size as usize)]) + .unwrap(); + let pos2 = self + .file + .seek(SeekFrom::Current(-(block_size as i64))) + .unwrap(); + assert_eq!(pos, pos2); + + self.block_idx += 1; + + Some(buf[0..(block_size as usize)].to_vec()) + } +} diff --git a/src/uu/tail/src/tail.rs b/src/uu/tail/src/tail.rs index ffe27e26c..15a819d35 100644 --- a/src/uu/tail/src/tail.rs +++ b/src/uu/tail/src/tail.rs @@ -15,7 +15,9 @@ extern crate clap; #[macro_use] extern crate uucore; +mod chunks; mod platform; +use chunks::ReverseChunks; use clap::{App, Arg}; use std::collections::VecDeque; @@ -26,6 +28,7 @@ use std::io::{stdin, stdout, BufRead, BufReader, Read, Seek, SeekFrom, Write}; use std::path::Path; use std::thread::sleep; use std::time::Duration; +use uucore::ringbuffer::RingBuffer; pub mod options { pub mod verbosity { @@ -117,6 +120,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .arg( Arg::with_name(options::SLEEP_INT) .short("s") + .takes_value(true) .long(options::SLEEP_INT) .help("Number or seconds to sleep between polling the file when running with -f"), ) @@ -238,7 +242,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } let mut file = File::open(&path).unwrap(); if is_seekable(&mut file) { - bounded_tail(&file, &settings); + bounded_tail(&mut file, &settings); if settings.follow { let reader = BufReader::new(file); readers.push(reader); @@ -352,10 +356,6 @@ pub fn parse_size(mut size_slice: &str) -> Result { } } -/// When reading files in reverse in `bounded_tail`, this is the size of each -/// block read at a time. -const BLOCK_SIZE: u64 = 1 << 16; - fn follow(readers: &mut [BufReader], filenames: &[String], settings: &Settings) { assert!(settings.follow); let mut last = readers.len() - 1; @@ -393,48 +393,42 @@ fn follow(readers: &mut [BufReader], filenames: &[String], settings: } } -/// Iterate over bytes in the file, in reverse, until `should_stop` returns -/// true. The `file` is left seek'd to the position just after the byte that -/// `should_stop` returned true for. -fn backwards_thru_file( - mut file: &File, - size: u64, - buf: &mut Vec, - delimiter: u8, - should_stop: &mut F, -) where - F: FnMut(u8) -> bool, -{ - assert!(buf.len() >= BLOCK_SIZE as usize); +/// Iterate over bytes in the file, in reverse, until we find the +/// `num_delimiters` instance of `delimiter`. The `file` is left seek'd to the +/// position just after that delimiter. +fn backwards_thru_file(file: &mut File, num_delimiters: usize, delimiter: u8) { + // This variable counts the number of delimiters found in the file + // so far (reading from the end of the file toward the beginning). + let mut counter = 0; - let max_blocks_to_read = (size as f64 / BLOCK_SIZE as f64).ceil() as usize; + for (block_idx, slice) in ReverseChunks::new(file).enumerate() { + // Iterate over each byte in the slice in reverse order. + let mut iter = slice.iter().enumerate().rev(); - for block_idx in 0..max_blocks_to_read { - let block_size = if block_idx == max_blocks_to_read - 1 { - size % BLOCK_SIZE - } else { - BLOCK_SIZE - }; - - // Seek backwards by the next block, read the full block into - // `buf`, and then seek back to the start of the block again. - let pos = file.seek(SeekFrom::Current(-(block_size as i64))).unwrap(); - file.read_exact(&mut buf[0..(block_size as usize)]).unwrap(); - let pos2 = file.seek(SeekFrom::Current(-(block_size as i64))).unwrap(); - assert_eq!(pos, pos2); - - // Iterate backwards through the bytes, calling `should_stop` on each - // one. - let slice = &buf[0..(block_size as usize)]; - for (i, ch) in slice.iter().enumerate().rev() { - // Ignore one trailing newline. - if block_idx == 0 && i as u64 == block_size - 1 && *ch == delimiter { - continue; + // Ignore a trailing newline in the last block, if there is one. + if block_idx == 0 { + if let Some(c) = slice.last() { + if *c == delimiter { + iter.next(); + } } + } - if should_stop(*ch) { - file.seek(SeekFrom::Current((i + 1) as i64)).unwrap(); - return; + // For each byte, increment the count of the number of + // delimiters found. If we have found more than the specified + // number of delimiters, terminate the search and seek to the + // appropriate location in the file. + for (i, ch) in iter { + if *ch == delimiter { + counter += 1; + if counter >= num_delimiters { + // After each iteration of the outer loop, the + // cursor in the file is at the *beginning* of the + // block, so seeking forward by `i + 1` bytes puts + // us right after the found delimiter. + file.seek(SeekFrom::Current((i + 1) as i64)).unwrap(); + return; + } } } } @@ -445,21 +439,11 @@ fn backwards_thru_file( /// end of the file, and then read the file "backwards" in blocks of size /// `BLOCK_SIZE` until we find the location of the first line/byte. This ends up /// being a nice performance win for very large files. -fn bounded_tail(mut file: &File, settings: &Settings) { - let size = file.seek(SeekFrom::End(0)).unwrap(); - let mut buf = vec![0; BLOCK_SIZE as usize]; - +fn bounded_tail(file: &mut File, settings: &Settings) { // Find the position in the file to start printing from. match settings.mode { - FilterMode::Lines(mut count, delimiter) => { - backwards_thru_file(&file, size, &mut buf, delimiter, &mut |byte| { - if byte == delimiter { - count -= 1; - count == 0 - } else { - false - } - }); + FilterMode::Lines(count, delimiter) => { + backwards_thru_file(file, count as usize, delimiter); } FilterMode::Bytes(count) => { file.seek(SeekFrom::End(-(count as i64))).unwrap(); @@ -467,17 +451,37 @@ fn bounded_tail(mut file: &File, settings: &Settings) { } // Print the target section of the file. - loop { - let bytes_read = file.read(&mut buf).unwrap(); + let stdout = stdout(); + let mut stdout = stdout.lock(); + std::io::copy(file, &mut stdout).unwrap(); +} - let mut stdout = stdout(); - for b in &buf[0..bytes_read] { - print_byte(&mut stdout, *b); - } - - if bytes_read == 0 { - break; - } +/// Collect the last elements of an iterator into a `VecDeque`. +/// +/// This function returns a [`VecDeque`] containing either the last +/// `count` elements of `iter`, an [`Iterator`] over [`Result`] +/// instances, or all but the first `count` elements of `iter`. If +/// `beginning` is `true`, then all but the first `count` elements are +/// returned. +/// +/// # Panics +/// +/// If any element of `iter` is an [`Err`], then this function panics. +fn unbounded_tail_collect( + iter: impl Iterator>, + count: u64, + beginning: bool, +) -> VecDeque +where + E: fmt::Debug, +{ + if beginning { + // GNU `tail` seems to index bytes and lines starting at 1, not + // at 0. It seems to treat `+0` and `+1` as the same thing. + let i = count.max(1) - 1; + iter.skip(i as usize).map(|r| r.unwrap()).collect() + } else { + RingBuffer::from_iter(iter.map(|r| r.unwrap()), count as usize).data } } @@ -486,66 +490,15 @@ fn unbounded_tail(reader: &mut BufReader, settings: &Settings) { // contains count lines/chars. When reaching the end of file, output the // data in the ringbuf. match settings.mode { - FilterMode::Lines(mut count, _delimiter) => { - let mut ringbuf: VecDeque = VecDeque::new(); - let mut skip = if settings.beginning { - let temp = count; - count = ::std::u64::MAX; - temp - 1 - } else { - 0 - }; - loop { - let mut datum = String::new(); - match reader.read_line(&mut datum) { - Ok(0) => break, - Ok(_) => { - if skip > 0 { - skip -= 1; - } else { - if count <= ringbuf.len() as u64 { - ringbuf.pop_front(); - } - ringbuf.push_back(datum); - } - } - Err(err) => panic!("{}", err), - } - } - let mut stdout = stdout(); - for datum in &ringbuf { - print_string(&mut stdout, datum); + FilterMode::Lines(count, _) => { + for line in unbounded_tail_collect(reader.lines(), count, settings.beginning) { + println!("{}", line); } } - FilterMode::Bytes(mut count) => { - let mut ringbuf: VecDeque = VecDeque::new(); - let mut skip = if settings.beginning { - let temp = count; - count = ::std::u64::MAX; - temp - 1 - } else { - 0 - }; - loop { - let mut datum = [0; 1]; - match reader.read(&mut datum) { - Ok(0) => break, - Ok(_) => { - if skip > 0 { - skip -= 1; - } else { - if count <= ringbuf.len() as u64 { - ringbuf.pop_front(); - } - ringbuf.push_back(datum[0]); - } - } - Err(err) => panic!("{}", err), - } - } - let mut stdout = stdout(); - for datum in &ringbuf { - print_byte(&mut stdout, *datum); + FilterMode::Bytes(count) => { + for byte in unbounded_tail_collect(reader.bytes(), count, settings.beginning) { + let mut stdout = stdout(); + print_byte(&mut stdout, byte); } } } @@ -561,8 +514,3 @@ fn print_byte(stdout: &mut T, ch: u8) { crash!(1, "{}", err); } } - -#[inline] -fn print_string(_: &mut T, s: &str) { - print!("{}", s); -} diff --git a/src/uu/tee/src/tee.rs b/src/uu/tee/src/tee.rs index 7c6a86b4c..c21559b3b 100644 --- a/src/uu/tee/src/tee.rs +++ b/src/uu/tee/src/tee.rs @@ -166,7 +166,7 @@ impl Write for MultiWriter { let result = writer.write_all(buf); match result { Err(f) => { - show_info!("{}: {}", writer.name, f.to_string()); + show_error!("{}: {}", writer.name, f.to_string()); false } _ => true, @@ -180,7 +180,7 @@ impl Write for MultiWriter { let result = writer.flush(); match result { Err(f) => { - show_info!("{}: {}", writer.name, f.to_string()); + show_error!("{}: {}", writer.name, f.to_string()); false } _ => true, @@ -213,7 +213,7 @@ impl Read for NamedReader { fn read(&mut self, buf: &mut [u8]) -> Result { match self.inner.read(buf) { Err(f) => { - show_info!("{}: {}", Path::new("stdin").display(), f.to_string()); + show_error!("{}: {}", Path::new("stdin").display(), f.to_string()); Err(f) } okay => okay, diff --git a/src/uu/test/src/parser.rs b/src/uu/test/src/parser.rs new file mode 100644 index 000000000..0fcb25bd5 --- /dev/null +++ b/src/uu/test/src/parser.rs @@ -0,0 +1,328 @@ +// This file is part of the uutils coreutils package. +// +// (c) Daniel Rocco +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. + +use std::ffi::OsString; +use std::iter::Peekable; + +/// Represents a parsed token from a test expression +#[derive(Debug, PartialEq)] +pub enum Symbol { + LParen, + Bang, + BoolOp(OsString), + Literal(OsString), + StringOp(OsString), + IntOp(OsString), + FileOp(OsString), + StrlenOp(OsString), + FiletestOp(OsString), + None, +} + +impl Symbol { + /// Create a new Symbol from an OsString. + /// + /// Returns Symbol::None in place of None + fn new(token: Option) -> Symbol { + match token { + Some(s) => match s.to_string_lossy().as_ref() { + "(" => Symbol::LParen, + "!" => Symbol::Bang, + "-a" | "-o" => Symbol::BoolOp(s), + "=" | "==" | "!=" => Symbol::StringOp(s), + "-eq" | "-ge" | "-gt" | "-le" | "-lt" | "-ne" => Symbol::IntOp(s), + "-ef" | "-nt" | "-ot" => Symbol::FileOp(s), + "-n" | "-z" => Symbol::StrlenOp(s), + "-b" | "-c" | "-d" | "-e" | "-f" | "-g" | "-G" | "-h" | "-k" | "-L" | "-O" + | "-p" | "-r" | "-s" | "-S" | "-t" | "-u" | "-w" | "-x" => Symbol::FiletestOp(s), + _ => Symbol::Literal(s), + }, + None => Symbol::None, + } + } + + /// Convert this Symbol into a Symbol::Literal, useful for cases where + /// test treats an operator as a string operand (test has no reserved + /// words). + /// + /// # Panics + /// + /// Panics if `self` is Symbol::None + fn into_literal(self) -> Symbol { + Symbol::Literal(match self { + Symbol::LParen => OsString::from("("), + Symbol::Bang => OsString::from("!"), + Symbol::BoolOp(s) + | Symbol::Literal(s) + | Symbol::StringOp(s) + | Symbol::IntOp(s) + | Symbol::FileOp(s) + | Symbol::StrlenOp(s) + | Symbol::FiletestOp(s) => s, + Symbol::None => panic!(), + }) + } +} + +/// Recursive descent parser for test, which converts a list of OsStrings +/// (typically command line arguments) into a stack of Symbols in postfix +/// order. +/// +/// Grammar: +/// +/// EXPR → TERM | EXPR BOOLOP EXPR +/// TERM → ( EXPR ) +/// TERM → ( ) +/// TERM → ! EXPR +/// TERM → UOP str +/// UOP → STRLEN | FILETEST +/// TERM → str OP str +/// TERM → str | 𝜖 +/// OP → STRINGOP | INTOP | FILEOP +/// STRINGOP → = | == | != +/// INTOP → -eq | -ge | -gt | -le | -lt | -ne +/// FILEOP → -ef | -nt | -ot +/// STRLEN → -n | -z +/// FILETEST → -b | -c | -d | -e | -f | -g | -G | -h | -k | -L | -O | -p | +/// -r | -s | -S | -t | -u | -w | -x +/// BOOLOP → -a | -o +/// +#[derive(Debug)] +struct Parser { + tokens: Peekable>, + pub stack: Vec, +} + +impl Parser { + /// Construct a new Parser from a `Vec` of tokens. + fn new(tokens: Vec) -> Parser { + Parser { + tokens: tokens.into_iter().peekable(), + stack: vec![], + } + } + + /// Fetch the next token from the input stream as a Symbol. + fn next_token(&mut self) -> Symbol { + Symbol::new(self.tokens.next()) + } + + /// Peek at the next token from the input stream, returning it as a Symbol. + /// The stream is unchanged and will return the same Symbol on subsequent + /// calls to `next()` or `peek()`. + fn peek(&mut self) -> Symbol { + Symbol::new(self.tokens.peek().map(|s| s.to_os_string())) + } + + /// Test if the next token in the stream is a BOOLOP (-a or -o), without + /// removing the token from the stream. + fn peek_is_boolop(&mut self) -> bool { + matches!(self.peek(), Symbol::BoolOp(_)) + } + + /// Parse an expression. + /// + /// EXPR → TERM | EXPR BOOLOP EXPR + fn expr(&mut self) { + if !self.peek_is_boolop() { + self.term(); + } + self.maybe_boolop(); + } + + /// Parse a term token and possible subsequent symbols: "(", "!", UOP, + /// literal, or None. + fn term(&mut self) { + let symbol = self.next_token(); + + match symbol { + Symbol::LParen => self.lparen(), + Symbol::Bang => self.bang(), + Symbol::StrlenOp(_) => self.uop(symbol), + Symbol::FiletestOp(_) => self.uop(symbol), + Symbol::None => self.stack.push(symbol), + literal => self.literal(literal), + } + } + + /// Parse a (possibly) parenthesized expression. + /// + /// test has no reserved keywords, so "(" will be interpreted as a literal + /// if it is followed by nothing or a comparison operator OP. + fn lparen(&mut self) { + match self.peek() { + // lparen is a literal when followed by nothing or comparison + Symbol::None | Symbol::StringOp(_) | Symbol::IntOp(_) | Symbol::FileOp(_) => { + self.literal(Symbol::LParen.into_literal()); + } + // empty parenthetical + Symbol::Literal(s) if s == ")" => {} + _ => { + self.expr(); + match self.next_token() { + Symbol::Literal(s) if s == ")" => (), + _ => panic!("expected ‘)’"), + } + } + } + } + + /// Parse a (possibly) negated expression. + /// + /// Example cases: + /// + /// * `! =`: negate the result of the implicit string length test of `=` + /// * `! = foo`: compare the literal strings `!` and `foo` + /// * `! = = str`: negate comparison of literal `=` and `str` + /// * `!`: bang followed by nothing is literal + /// * `! EXPR`: negate the result of the expression + /// + /// Combined Boolean & negation: + /// + /// * `! ( EXPR ) [BOOLOP EXPR]`: negate the parenthesized expression only + /// * `! UOP str BOOLOP EXPR`: negate the unary subexpression + /// * `! str BOOLOP str`: negate the entire Boolean expression + /// * `! str BOOLOP EXPR BOOLOP EXPR`: negate the value of the first `str` term + /// + fn bang(&mut self) { + match self.peek() { + Symbol::StringOp(_) | Symbol::IntOp(_) | Symbol::FileOp(_) | Symbol::BoolOp(_) => { + // we need to peek ahead one more token to disambiguate the first + // three cases listed above + let peek2 = Symbol::new(self.tokens.clone().nth(1)); + + match peek2 { + // case 1: `! ` + // case 3: `! = OP str` + Symbol::StringOp(_) | Symbol::None => { + // op is literal + let op = self.next_token().into_literal(); + self.literal(op); + self.stack.push(Symbol::Bang); + } + // case 2: ` OP str [BOOLOP EXPR]`. + _ => { + // bang is literal; parsing continues with op + self.literal(Symbol::Bang.into_literal()); + self.maybe_boolop(); + } + } + } + + // bang followed by nothing is literal + Symbol::None => self.stack.push(Symbol::Bang.into_literal()), + + _ => { + // peek ahead up to 4 tokens to determine if we need to negate + // the entire expression or just the first term + let peek4: Vec = self + .tokens + .clone() + .take(4) + .map(|token| Symbol::new(Some(token))) + .collect(); + + match peek4.as_slice() { + // we peeked ahead 4 but there were only 3 tokens left + [Symbol::Literal(_), Symbol::BoolOp(_), Symbol::Literal(_)] => { + self.expr(); + self.stack.push(Symbol::Bang); + } + _ => { + self.term(); + self.stack.push(Symbol::Bang); + } + } + } + } + } + + /// Peek at the next token and parse it as a BOOLOP or string literal, + /// as appropriate. + fn maybe_boolop(&mut self) { + if self.peek_is_boolop() { + let symbol = self.next_token(); + + // BoolOp by itself interpreted as Literal + if let Symbol::None = self.peek() { + self.literal(symbol.into_literal()); + } else { + self.boolop(symbol); + self.maybe_boolop(); + } + } + } + + /// Parse a Boolean expression. + /// + /// Logical and (-a) has higher precedence than or (-o), so in an + /// expression like `foo -o '' -a ''`, the and subexpression is evaluated + /// first. + fn boolop(&mut self, op: Symbol) { + if op == Symbol::BoolOp(OsString::from("-a")) { + self.term(); + self.stack.push(op); + } else { + self.expr(); + self.stack.push(op); + } + } + + /// Parse a (possible) unary argument test (string length or file + /// attribute check). + /// + /// If a UOP is followed by nothing it is interpreted as a literal string. + fn uop(&mut self, op: Symbol) { + match self.next_token() { + Symbol::None => self.stack.push(op.into_literal()), + symbol => { + self.stack.push(symbol.into_literal()); + self.stack.push(op); + } + } + } + + /// Parse a string literal, optionally followed by a comparison operator + /// and a second string literal. + fn literal(&mut self, token: Symbol) { + self.stack.push(token.into_literal()); + + // EXPR → str OP str + match self.peek() { + Symbol::StringOp(_) | Symbol::IntOp(_) | Symbol::FileOp(_) => { + let op = self.next_token(); + + match self.next_token() { + Symbol::None => panic!("missing argument after {:?}", op), + token => self.stack.push(token.into_literal()), + } + + self.stack.push(op); + } + _ => {} + } + } + + /// Parser entry point: parse the token stream `self.tokens`, storing the + /// resulting `Symbol` stack in `self.stack`. + fn parse(&mut self) -> Result<(), String> { + self.expr(); + + match self.tokens.next() { + Some(token) => Err(format!("extra argument ‘{}’", token.to_string_lossy())), + None => Ok(()), + } + } +} + +/// Parse the token stream `args`, returning a `Symbol` stack representing the +/// operations to perform in postfix order. +pub fn parse(args: Vec) -> Result, String> { + let mut p = Parser::new(args); + p.parse()?; + Ok(p.stack) +} diff --git a/src/uu/test/src/test.rs b/src/uu/test/src/test.rs index 4394e4a8e..86950ecc2 100644 --- a/src/uu/test/src/test.rs +++ b/src/uu/test/src/test.rs @@ -1,144 +1,154 @@ -// * This file is part of the uutils coreutils package. -// * -// * (c) mahkoh (ju.orth [at] gmail [dot] com) -// * -// * For the full copyright and license information, please view the LICENSE -// * file that was distributed with this source code. +// This file is part of the uutils coreutils package. +// +// (c) mahkoh (ju.orth [at] gmail [dot] com) +// (c) Daniel Rocco +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. // spell-checker:ignore (ToDO) retval paren prec subprec cond -use std::collections::HashMap; -use std::str::from_utf8; +mod parser; -static NAME: &str = "test"; +use parser::{parse, Symbol}; +use std::ffi::{OsStr, OsString}; pub fn uumain(args: impl uucore::Args) -> i32 { - let args: Vec<_> = args.collect(); - // This is completely disregarding valid windows paths that aren't valid unicode - let args = args - .iter() - .map(|a| a.to_str().unwrap().as_bytes()) - .collect::>(); - if args.is_empty() { - return 2; - } - let args = if !args[0].ends_with(NAME.as_bytes()) { - &args[1..] - } else { - &args[..] - }; - let args = match args[0] { - b"[" => match args[args.len() - 1] { - b"]" => &args[1..args.len() - 1], - _ => return 2, - }, - _ => &args[1..args.len()], - }; - let mut error = false; - let retval = 1 - parse_expr(args, &mut error) as i32; - if error { - 2 - } else { - retval - } -} + // TODO: handle being called as `[` + let args: Vec<_> = args.skip(1).collect(); -fn one(args: &[&[u8]]) -> bool { - !args[0].is_empty() -} + let result = parse(args).and_then(|mut stack| eval(&mut stack)); -fn two(args: &[&[u8]], error: &mut bool) -> bool { - match args[0] { - b"!" => !one(&args[1..]), - b"-b" => path(args[1], PathCondition::BlockSpecial), - b"-c" => path(args[1], PathCondition::CharacterSpecial), - b"-d" => path(args[1], PathCondition::Directory), - b"-e" => path(args[1], PathCondition::Exists), - b"-f" => path(args[1], PathCondition::Regular), - b"-g" => path(args[1], PathCondition::GroupIDFlag), - b"-h" => path(args[1], PathCondition::SymLink), - b"-L" => path(args[1], PathCondition::SymLink), - b"-n" => one(&args[1..]), - b"-p" => path(args[1], PathCondition::FIFO), - b"-r" => path(args[1], PathCondition::Readable), - b"-S" => path(args[1], PathCondition::Socket), - b"-s" => path(args[1], PathCondition::NonEmpty), - b"-t" => isatty(args[1]), - b"-u" => path(args[1], PathCondition::UserIDFlag), - b"-w" => path(args[1], PathCondition::Writable), - b"-x" => path(args[1], PathCondition::Executable), - b"-z" => !one(&args[1..]), - _ => { - *error = true; - false - } - } -} - -fn three(args: &[&[u8]], error: &mut bool) -> bool { - match args[1] { - b"=" => args[0] == args[2], - b"==" => args[0] == args[2], - b"!=" => args[0] != args[2], - b"-eq" => integers(args[0], args[2], IntegerCondition::Equal), - b"-ne" => integers(args[0], args[2], IntegerCondition::Unequal), - b"-gt" => integers(args[0], args[2], IntegerCondition::Greater), - b"-ge" => integers(args[0], args[2], IntegerCondition::GreaterEqual), - b"-lt" => integers(args[0], args[2], IntegerCondition::Less), - b"-le" => integers(args[0], args[2], IntegerCondition::LessEqual), - _ => match args[0] { - b"!" => !two(&args[1..], error), - _ => { - *error = true; - false + match result { + Ok(result) => { + if result { + 0 + } else { + 1 } - }, - } -} - -fn four(args: &[&[u8]], error: &mut bool) -> bool { - match args[0] { - b"!" => !three(&args[1..], error), - _ => { - *error = true; - false + } + Err(e) => { + eprintln!("test: {}", e); + 2 } } } -enum IntegerCondition { - Equal, - Unequal, - Greater, - GreaterEqual, - Less, - LessEqual, -} +/// Evaluate a stack of Symbols, returning the result of the evaluation or +/// an error message if evaluation failed. +fn eval(stack: &mut Vec) -> Result { + macro_rules! pop_literal { + () => { + match stack.pop() { + Some(Symbol::Literal(s)) => s, + _ => panic!(), + } + }; + } -fn integers(a: &[u8], b: &[u8], cond: IntegerCondition) -> bool { - let (a, b): (&str, &str) = match (from_utf8(a), from_utf8(b)) { - (Ok(a), Ok(b)) => (a, b), - _ => return false, - }; - let (a, b): (i64, i64) = match (a.parse(), b.parse()) { - (Ok(a), Ok(b)) => (a, b), - _ => return false, - }; - match cond { - IntegerCondition::Equal => a == b, - IntegerCondition::Unequal => a != b, - IntegerCondition::Greater => a > b, - IntegerCondition::GreaterEqual => a >= b, - IntegerCondition::Less => a < b, - IntegerCondition::LessEqual => a <= b, + let s = stack.pop(); + + match s { + Some(Symbol::Bang) => { + let result = eval(stack)?; + + Ok(!result) + } + Some(Symbol::StringOp(op)) => { + let b = stack.pop(); + let a = stack.pop(); + Ok(if op == "!=" { a != b } else { a == b }) + } + Some(Symbol::IntOp(op)) => { + let b = pop_literal!(); + let a = pop_literal!(); + + Ok(integers(&a, &b, &op)?) + } + Some(Symbol::FileOp(_op)) => unimplemented!(), + Some(Symbol::StrlenOp(op)) => { + let s = match stack.pop() { + Some(Symbol::Literal(s)) => s, + Some(Symbol::None) => OsString::from(""), + None => { + return Ok(true); + } + _ => { + return Err(format!("missing argument after ‘{:?}’", op)); + } + }; + + Ok(if op == "-z" { + s.is_empty() + } else { + !s.is_empty() + }) + } + Some(Symbol::FiletestOp(op)) => { + let op = op.to_string_lossy(); + + let f = pop_literal!(); + + Ok(match op.as_ref() { + "-b" => path(&f, PathCondition::BlockSpecial), + "-c" => path(&f, PathCondition::CharacterSpecial), + "-d" => path(&f, PathCondition::Directory), + "-e" => path(&f, PathCondition::Exists), + "-f" => path(&f, PathCondition::Regular), + "-g" => path(&f, PathCondition::GroupIdFlag), + "-h" => path(&f, PathCondition::SymLink), + "-L" => path(&f, PathCondition::SymLink), + "-p" => path(&f, PathCondition::Fifo), + "-r" => path(&f, PathCondition::Readable), + "-S" => path(&f, PathCondition::Socket), + "-s" => path(&f, PathCondition::NonEmpty), + "-t" => isatty(&f)?, + "-u" => path(&f, PathCondition::UserIdFlag), + "-w" => path(&f, PathCondition::Writable), + "-x" => path(&f, PathCondition::Executable), + _ => panic!(), + }) + } + Some(Symbol::Literal(s)) => Ok(!s.is_empty()), + Some(Symbol::None) => Ok(false), + Some(Symbol::BoolOp(op)) => { + let b = eval(stack)?; + let a = eval(stack)?; + + Ok(if op == "-a" { a && b } else { a || b }) + } + None => Ok(false), + _ => Err("expected value".to_string()), } } -fn isatty(fd: &[u8]) -> bool { - from_utf8(fd) - .ok() - .and_then(|s| s.parse().ok()) - .map_or(false, |i| { +fn integers(a: &OsStr, b: &OsStr, cond: &OsStr) -> Result { + let format_err = |value| format!("invalid integer ‘{}’", value); + + let a = a.to_string_lossy(); + let a: i64 = a.parse().map_err(|_| format_err(a))?; + + let b = b.to_string_lossy(); + let b: i64 = b.parse().map_err(|_| format_err(b))?; + + let cond = cond.to_string_lossy(); + Ok(match cond.as_ref() { + "-eq" => a == b, + "-ne" => a != b, + "-gt" => a > b, + "-ge" => a >= b, + "-lt" => a < b, + "-le" => a <= b, + _ => return Err(format!("unknown operator ‘{}’", cond)), + }) +} + +fn isatty(fd: &OsStr) -> Result { + let fd = fd.to_string_lossy(); + + fd.parse() + .map_err(|_| format!("invalid integer ‘{}’", fd)) + .map(|i| { #[cfg(not(target_os = "redox"))] unsafe { libc::isatty(i) == 1 @@ -148,173 +158,6 @@ fn isatty(fd: &[u8]) -> bool { }) } -fn dispatch(args: &mut &[&[u8]], error: &mut bool) -> bool { - let (val, idx) = match args.len() { - 0 => { - *error = true; - (false, 0) - } - 1 => (one(*args), 1), - 2 => dispatch_two(args, error), - 3 => dispatch_three(args, error), - _ => dispatch_four(args, error), - }; - *args = &(*args)[idx..]; - val -} - -fn dispatch_two(args: &mut &[&[u8]], error: &mut bool) -> (bool, usize) { - let val = two(*args, error); - if *error { - *error = false; - (one(*args), 1) - } else { - (val, 2) - } -} - -fn dispatch_three(args: &mut &[&[u8]], error: &mut bool) -> (bool, usize) { - let val = three(*args, error); - if *error { - *error = false; - dispatch_two(args, error) - } else { - (val, 3) - } -} - -fn dispatch_four(args: &mut &[&[u8]], error: &mut bool) -> (bool, usize) { - let val = four(*args, error); - if *error { - *error = false; - dispatch_three(args, error) - } else { - (val, 4) - } -} - -#[derive(Clone, Copy)] -enum Precedence { - Unknown = 0, - Paren, // FIXME: this is useless (parentheses have not been implemented) - Or, - And, - BUnOp, - BinOp, - UnOp, -} - -fn parse_expr(mut args: &[&[u8]], error: &mut bool) -> bool { - if args.is_empty() { - false - } else { - let hashmap = setup_hashmap(); - let lhs = dispatch(&mut args, error); - - if !args.is_empty() { - parse_expr_helper(&hashmap, &mut args, lhs, Precedence::Unknown, error) - } else { - lhs - } - } -} - -fn parse_expr_helper<'a>( - hashmap: &HashMap<&'a [u8], Precedence>, - args: &mut &[&'a [u8]], - mut lhs: bool, - min_prec: Precedence, - error: &mut bool, -) -> bool { - let mut prec = *hashmap.get(&args[0]).unwrap_or_else(|| { - *error = true; - &min_prec - }); - while !*error && !args.is_empty() && prec as usize >= min_prec as usize { - let op = args[0]; - *args = &(*args)[1..]; - let mut rhs = dispatch(args, error); - while !args.is_empty() { - let subprec = *hashmap.get(&args[0]).unwrap_or_else(|| { - *error = true; - &min_prec - }); - if subprec as usize <= prec as usize || *error { - break; - } - rhs = parse_expr_helper(hashmap, args, rhs, subprec, error); - } - lhs = match prec { - Precedence::UnOp | Precedence::BUnOp => { - *error = true; - false - } - Precedence::And => lhs && rhs, - Precedence::Or => lhs || rhs, - Precedence::BinOp => three( - &[ - if lhs { b" " } else { b"" }, - op, - if rhs { b" " } else { b"" }, - ], - error, - ), - Precedence::Paren => unimplemented!(), // TODO: implement parentheses - _ => unreachable!(), - }; - if !args.is_empty() { - prec = *hashmap.get(&args[0]).unwrap_or_else(|| { - *error = true; - &min_prec - }); - } - } - lhs -} - -#[inline] -fn setup_hashmap<'a>() -> HashMap<&'a [u8], Precedence> { - let mut hashmap = HashMap::<&'a [u8], Precedence>::new(); - - hashmap.insert(b"-b", Precedence::UnOp); - hashmap.insert(b"-c", Precedence::UnOp); - hashmap.insert(b"-d", Precedence::UnOp); - hashmap.insert(b"-e", Precedence::UnOp); - hashmap.insert(b"-f", Precedence::UnOp); - hashmap.insert(b"-g", Precedence::UnOp); - hashmap.insert(b"-h", Precedence::UnOp); - hashmap.insert(b"-L", Precedence::UnOp); - hashmap.insert(b"-n", Precedence::UnOp); - hashmap.insert(b"-p", Precedence::UnOp); - hashmap.insert(b"-r", Precedence::UnOp); - hashmap.insert(b"-S", Precedence::UnOp); - hashmap.insert(b"-s", Precedence::UnOp); - hashmap.insert(b"-t", Precedence::UnOp); - hashmap.insert(b"-u", Precedence::UnOp); - hashmap.insert(b"-w", Precedence::UnOp); - hashmap.insert(b"-x", Precedence::UnOp); - hashmap.insert(b"-z", Precedence::UnOp); - - hashmap.insert(b"=", Precedence::BinOp); - hashmap.insert(b"!=", Precedence::BinOp); - hashmap.insert(b"-eq", Precedence::BinOp); - hashmap.insert(b"-ne", Precedence::BinOp); - hashmap.insert(b"-gt", Precedence::BinOp); - hashmap.insert(b"-ge", Precedence::BinOp); - hashmap.insert(b"-lt", Precedence::BinOp); - hashmap.insert(b"-le", Precedence::BinOp); - - hashmap.insert(b"!", Precedence::BUnOp); - - hashmap.insert(b"-a", Precedence::And); - hashmap.insert(b"-o", Precedence::Or); - - hashmap.insert(b"(", Precedence::Paren); - hashmap.insert(b")", Precedence::Paren); - - hashmap -} - #[derive(Eq, PartialEq)] enum PathCondition { BlockSpecial, @@ -322,26 +165,22 @@ enum PathCondition { Directory, Exists, Regular, - GroupIDFlag, + GroupIdFlag, SymLink, - FIFO, + Fifo, Readable, Socket, NonEmpty, - UserIDFlag, + UserIdFlag, Writable, Executable, } #[cfg(not(windows))] -fn path(path: &[u8], cond: PathCondition) -> bool { - use std::ffi::OsStr; +fn path(path: &OsStr, cond: PathCondition) -> bool { use std::fs::{self, Metadata}; - use std::os::unix::ffi::OsStrExt; use std::os::unix::fs::{FileTypeExt, MetadataExt}; - let path = OsStr::from_bytes(path); - const S_ISUID: u32 = 0o4000; const S_ISGID: u32 = 0o2000; @@ -390,39 +229,40 @@ fn path(path: &[u8], cond: PathCondition) -> bool { PathCondition::Directory => file_type.is_dir(), PathCondition::Exists => true, PathCondition::Regular => file_type.is_file(), - PathCondition::GroupIDFlag => metadata.mode() & S_ISGID != 0, + PathCondition::GroupIdFlag => metadata.mode() & S_ISGID != 0, PathCondition::SymLink => metadata.file_type().is_symlink(), - PathCondition::FIFO => file_type.is_fifo(), + PathCondition::Fifo => file_type.is_fifo(), PathCondition::Readable => perm(metadata, Permission::Read), PathCondition::Socket => file_type.is_socket(), PathCondition::NonEmpty => metadata.size() > 0, - PathCondition::UserIDFlag => metadata.mode() & S_ISUID != 0, + PathCondition::UserIdFlag => metadata.mode() & S_ISUID != 0, PathCondition::Writable => perm(metadata, Permission::Write), PathCondition::Executable => perm(metadata, Permission::Execute), } } #[cfg(windows)] -fn path(path: &[u8], cond: PathCondition) -> bool { +fn path(path: &OsStr, cond: PathCondition) -> bool { use std::fs::metadata; - let path = from_utf8(path).unwrap(); + let stat = match metadata(path) { Ok(s) => s, _ => return false, }; + match cond { PathCondition::BlockSpecial => false, PathCondition::CharacterSpecial => false, PathCondition::Directory => stat.is_dir(), PathCondition::Exists => true, PathCondition::Regular => stat.is_file(), - PathCondition::GroupIDFlag => false, + PathCondition::GroupIdFlag => false, PathCondition::SymLink => false, - PathCondition::FIFO => false, + PathCondition::Fifo => false, PathCondition::Readable => false, // TODO PathCondition::Socket => false, PathCondition::NonEmpty => stat.len() > 0, - PathCondition::UserIDFlag => false, + PathCondition::UserIdFlag => false, PathCondition::Writable => false, // TODO PathCondition::Executable => false, // TODO } diff --git a/src/uu/timeout/src/timeout.rs b/src/uu/timeout/src/timeout.rs index 23e2ec842..7d557f1ce 100644 --- a/src/uu/timeout/src/timeout.rs +++ b/src/uu/timeout/src/timeout.rs @@ -18,6 +18,7 @@ use std::process::{Command, Stdio}; use std::time::Duration; use uucore::process::ChildExt; use uucore::signals::signal_by_name_or_value; +use uucore::InvalidEncodingHandling; static VERSION: &str = env!("CARGO_PKG_VERSION"); static ABOUT: &str = "Start COMMAND, and kill it if still running after DURATION."; @@ -98,7 +99,10 @@ impl Config { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); + let usage = get_usage(); let app = App::new("timeout") diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 39405900e..b158fdc0e 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -18,6 +18,7 @@ use filetime::*; use std::fs::{self, File}; use std::io::Error; use std::path::Path; +use std::process; static VERSION: &str = env!("CARGO_PKG_VERSION"); static ABOUT: &str = "Update the access and modification times of each FILE to the current time."; @@ -137,7 +138,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let (mut atime, mut mtime) = if matches.is_present(options::sources::REFERENCE) { stat( - &matches.value_of(options::sources::REFERENCE).unwrap()[..], + matches.value_of(options::sources::REFERENCE).unwrap(), !matches.is_present(options::NO_DEREF), ) } else if matches.is_present(options::sources::DATE) @@ -261,7 +262,27 @@ fn parse_timestamp(s: &str) -> FileTime { }; match time::strptime(&ts, format) { - Ok(tm) => local_tm_to_filetime(to_local(tm)), + Ok(tm) => { + let mut local = to_local(tm); + local.tm_isdst = -1; + let ft = local_tm_to_filetime(local); + + // We have to check that ft is valid time. Due to daylight saving + // time switch, local time can jump from 1:59 AM to 3:00 AM, + // in which case any time between 2:00 AM and 2:59 AM is not valid. + // Convert back to local time and see if we got the same value back. + let ts = time::Timespec { + sec: ft.unix_seconds(), + nsec: 0, + }; + let tm2 = time::at(ts); + if tm.tm_hour != tm2.tm_hour { + show_error!("invalid date format {}", s); + process::exit(1); + } + + ft + } Err(e) => panic!("Unable to parse timestamp\n{}", e), } } diff --git a/src/uu/tr/src/expand.rs b/src/uu/tr/src/expand.rs index e71cf262c..73612a065 100644 --- a/src/uu/tr/src/expand.rs +++ b/src/uu/tr/src/expand.rs @@ -24,7 +24,7 @@ use std::ops::RangeInclusive; fn parse_sequence(s: &str) -> (char, usize) { let c = s.chars().next().expect("invalid escape: empty string"); - if '0' <= c && c <= '7' { + if ('0'..='7').contains(&c) { let mut v = c.to_digit(8).unwrap(); let mut consumed = 1; let bits_per_digit = 3; diff --git a/src/uu/tr/src/tr.rs b/src/uu/tr/src/tr.rs index b94b11b9d..a44f2733c 100644 --- a/src/uu/tr/src/tr.rs +++ b/src/uu/tr/src/tr.rs @@ -21,12 +21,11 @@ use fnv::FnvHashMap; use std::io::{stdin, stdout, BufRead, BufWriter, Write}; use crate::expand::ExpandSet; +use uucore::InvalidEncodingHandling; -static NAME: &str = "tr"; static VERSION: &str = env!("CARGO_PKG_VERSION"); static ABOUT: &str = "translate or delete characters"; -static LONG_HELP: &str = "Translate, squeeze, and/or delete characters from standard input, -writing to standard output."; + const BUFFER_LEN: usize = 1024; mod options { @@ -124,10 +123,17 @@ impl SymbolTranslator for DeleteAndSqueezeOperation { struct TranslateOperation { translate_map: FnvHashMap, + complement: bool, + s2_last: char, } impl TranslateOperation { - fn new(set1: ExpandSet, set2: &mut ExpandSet, truncate: bool) -> TranslateOperation { + fn new( + set1: ExpandSet, + set2: &mut ExpandSet, + truncate: bool, + complement: bool, + ) -> TranslateOperation { let mut map = FnvHashMap::default(); let mut s2_prev = '_'; for i in set1 { @@ -140,13 +146,54 @@ impl TranslateOperation { map.insert(i as usize, s2_prev); } } - TranslateOperation { translate_map: map } + TranslateOperation { + translate_map: map, + complement, + s2_last: set2.last().unwrap_or(s2_prev), + } } } impl SymbolTranslator for TranslateOperation { fn translate(&self, c: char, _prev_c: char) -> Option { - Some(*self.translate_map.get(&(c as usize)).unwrap_or(&c)) + if self.complement { + Some(if self.translate_map.contains_key(&(c as usize)) { + c + } else { + self.s2_last + }) + } else { + Some(*self.translate_map.get(&(c as usize)).unwrap_or(&c)) + } + } +} + +struct TranslateAndSqueezeOperation { + translate: TranslateOperation, + squeeze: SqueezeOperation, +} + +impl TranslateAndSqueezeOperation { + fn new( + set1: ExpandSet, + set2: &mut ExpandSet, + set2_: ExpandSet, + truncate: bool, + complement: bool, + ) -> TranslateAndSqueezeOperation { + TranslateAndSqueezeOperation { + translate: TranslateOperation::new(set1, set2, truncate, complement), + squeeze: SqueezeOperation::new(set2_, complement), + } + } +} + +impl SymbolTranslator for TranslateAndSqueezeOperation { + fn translate(&self, c: char, prev_c: char) -> Option { + // `unwrap()` will never panic because `Translate.translate()` + // always returns `Some`. + self.squeeze + .translate(self.translate.translate(c, 0 as char).unwrap(), prev_c) } } @@ -167,8 +214,11 @@ fn translate_input( // isolation to make borrow checker happy let filtered = buf.chars().filter_map(|c| { let res = translator.translate(c, prev_c); - if res.is_some() { - prev_c = c; + // Set `prev_c` to the post-translate character. This + // allows the squeeze operation to correctly function + // after the translate operation. + if let Some(rc) = res { + prev_c = rc; } res }); @@ -185,21 +235,38 @@ fn get_usage() -> String { format!("{} [OPTION]... SET1 [SET2]", executable!()) } +fn get_long_usage() -> String { + String::from( + "Translate, squeeze, and/or delete characters from standard input, +writing to standard output.", + ) +} + pub fn uumain(args: impl uucore::Args) -> i32 { + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); + let usage = get_usage(); + let after_help = get_long_usage(); let matches = App::new(executable!()) .version(VERSION) .about(ABOUT) .usage(&usage[..]) - .after_help(LONG_HELP) + .after_help(&after_help[..]) .arg( Arg::with_name(options::COMPLEMENT) - .short("C") + // .visible_short_alias('C') // TODO: requires clap "3.0.0-beta.2" .short("c") .long(options::COMPLEMENT) .help("use the complement of SET1"), ) + .arg( + Arg::with_name("C") // work around for `Arg::visible_short_alias` + .short("C") + .help("same as -c"), + ) .arg( Arg::with_name(options::DELETE) .short("d") @@ -212,8 +279,8 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .short("s") .help( "replace each sequence of a repeated character that is - listed in the last specified SET, with a single occurrence - of that character", + listed in the last specified SET, with a single occurrence + of that character", ), ) .arg( @@ -226,7 +293,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .get_matches_from(args); let delete_flag = matches.is_present(options::DELETE); - let complement_flag = matches.is_present(options::COMPLEMENT); + let complement_flag = matches.is_present(options::COMPLEMENT) || matches.is_present("C"); let squeeze_flag = matches.is_present(options::SQUEEZE); let truncate_flag = matches.is_present(options::TRUNCATE); @@ -238,7 +305,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if sets.is_empty() { show_error!( "missing operand\nTry `{} --help` for more information.", - NAME + executable!() ); return 1; } @@ -247,16 +314,11 @@ pub fn uumain(args: impl uucore::Args) -> i32 { show_error!( "missing operand after ‘{}’\nTry `{} --help` for more information.", sets[0], - NAME + executable!() ); return 1; } - if complement_flag && !delete_flag && !squeeze_flag { - show_error!("-c is only supported with -d or -s"); - return 1; - } - let stdin = stdin(); let mut locked_stdin = stdin.lock(); let stdout = stdout(); @@ -274,12 +336,25 @@ pub fn uumain(args: impl uucore::Args) -> i32 { translate_input(&mut locked_stdin, &mut buffered_stdout, op); } } else if squeeze_flag { - let op = SqueezeOperation::new(set1, complement_flag); - translate_input(&mut locked_stdin, &mut buffered_stdout, op); + if sets.len() < 2 { + let op = SqueezeOperation::new(set1, complement_flag); + translate_input(&mut locked_stdin, &mut buffered_stdout, op); + } else { + let mut set2 = ExpandSet::new(sets[1].as_ref()); + let set2_ = ExpandSet::new(sets[1].as_ref()); + let op = TranslateAndSqueezeOperation::new( + set1, + &mut set2, + set2_, + complement_flag, + truncate_flag, + ); + translate_input(&mut locked_stdin, &mut buffered_stdout, op); + } } else { let mut set2 = ExpandSet::new(sets[1].as_ref()); - let op = TranslateOperation::new(set1, &mut set2, truncate_flag); - translate_input(&mut locked_stdin, &mut buffered_stdout, op) + let op = TranslateOperation::new(set1, &mut set2, truncate_flag, complement_flag); + translate_input(&mut locked_stdin, &mut buffered_stdout, op); } 0 diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index 9cd5865b7..3a6077b3c 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -11,18 +11,44 @@ extern crate uucore; use clap::{App, Arg}; -use std::fs::{metadata, File, OpenOptions}; +use std::fs::{metadata, OpenOptions}; +use std::io::ErrorKind; use std::path::Path; -#[derive(Eq, PartialEq)] +#[derive(Debug, Eq, PartialEq)] enum TruncateMode { - Reference, - Extend, - Reduce, - AtMost, - AtLeast, - RoundDown, - RoundUp, + Absolute(u64), + Extend(u64), + Reduce(u64), + AtMost(u64), + AtLeast(u64), + RoundDown(u64), + RoundUp(u64), +} + +impl TruncateMode { + /// Compute a target size in bytes for this truncate mode. + /// + /// `fsize` is the size of the reference file, in bytes. + /// + /// # Examples + /// + /// ```rust,ignore + /// let mode = TruncateMode::Extend(5); + /// let fsize = 10; + /// assert_eq!(mode.to_size(fsize), 15); + /// ``` + fn to_size(&self, fsize: u64) -> u64 { + match self { + TruncateMode::Absolute(modsize) => *modsize, + TruncateMode::Extend(modsize) => fsize + modsize, + TruncateMode::Reduce(modsize) => fsize - modsize, + TruncateMode::AtMost(modsize) => fsize.min(*modsize), + TruncateMode::AtLeast(modsize) => fsize.max(*modsize), + TruncateMode::RoundDown(modsize) => fsize - fsize % modsize, + TruncateMode::RoundUp(modsize) => fsize + fsize % modsize, + } + } } static ABOUT: &str = "Shrink or extend the size of each file to the specified size."; @@ -114,140 +140,303 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let no_create = matches.is_present(options::NO_CREATE); let reference = matches.value_of(options::REFERENCE).map(String::from); let size = matches.value_of(options::SIZE).map(String::from); - if reference.is_none() && size.is_none() { - crash!(1, "you must specify either --reference or --size"); - } else { - truncate(no_create, io_blocks, reference, size, files); + if let Err(e) = truncate(no_create, io_blocks, reference, size, files) { + match e.kind() { + ErrorKind::NotFound => { + // TODO Improve error-handling so that the error + // returned by `truncate()` provides the necessary + // parameter for formatting the error message. + let reference = matches.value_of(options::REFERENCE).map(String::from); + crash!( + 1, + "cannot stat '{}': No such file or directory", + reference.unwrap() + ); + } + _ => crash!(1, "{}", e.to_string()), + } } } 0 } +/// Truncate the named file to the specified size. +/// +/// If `create` is true, then the file will be created if it does not +/// already exist. If `size` is larger than the number of bytes in the +/// file, then the file will be padded with zeros. If `size` is smaller +/// than the number of bytes in the file, then the file will be +/// truncated and any bytes beyond `size` will be lost. +/// +/// # Errors +/// +/// If the file could not be opened, or there was a problem setting the +/// size of the file. +fn file_truncate(filename: &str, create: bool, size: u64) -> std::io::Result<()> { + let path = Path::new(filename); + let f = OpenOptions::new().write(true).create(create).open(path)?; + f.set_len(size) +} + +/// Truncate files to a size relative to a given file. +/// +/// `rfilename` is the name of the reference file. +/// +/// `size_string` gives the size relative to the reference file to which +/// to set the target files. For example, "+3K" means "set each file to +/// be three kilobytes larger than the size of the reference file". +/// +/// If `create` is true, then each file will be created if it does not +/// already exist. +/// +/// # Errors +/// +/// If the any file could not be opened, or there was a problem setting +/// the size of at least one file. +fn truncate_reference_and_size( + rfilename: &str, + size_string: &str, + filenames: Vec, + create: bool, +) -> std::io::Result<()> { + let mode = match parse_mode_and_size(size_string) { + Ok(m) => match m { + TruncateMode::Absolute(_) => { + crash!(1, "you must specify a relative ‘--size’ with ‘--reference’") + } + _ => m, + }, + Err(_) => crash!(1, "Invalid number: ‘{}’", size_string), + }; + let fsize = metadata(rfilename)?.len(); + let tsize = mode.to_size(fsize); + for filename in &filenames { + file_truncate(filename, create, tsize)?; + } + Ok(()) +} + +/// Truncate files to match the size of a given reference file. +/// +/// `rfilename` is the name of the reference file. +/// +/// If `create` is true, then each file will be created if it does not +/// already exist. +/// +/// # Errors +/// +/// If the any file could not be opened, or there was a problem setting +/// the size of at least one file. +fn truncate_reference_file_only( + rfilename: &str, + filenames: Vec, + create: bool, +) -> std::io::Result<()> { + let tsize = metadata(rfilename)?.len(); + for filename in &filenames { + file_truncate(filename, create, tsize)?; + } + Ok(()) +} + +/// Truncate files to a specified size. +/// +/// `size_string` gives either an absolute size or a relative size. A +/// relative size adjusts the size of each file relative to its current +/// size. For example, "3K" means "set each file to be three kilobytes" +/// whereas "+3K" means "set each file to be three kilobytes larger than +/// its current size". +/// +/// If `create` is true, then each file will be created if it does not +/// already exist. +/// +/// # Errors +/// +/// If the any file could not be opened, or there was a problem setting +/// the size of at least one file. +fn truncate_size_only( + size_string: &str, + filenames: Vec, + create: bool, +) -> std::io::Result<()> { + let mode = match parse_mode_and_size(size_string) { + Ok(m) => m, + Err(_) => crash!(1, "Invalid number: ‘{}’", size_string), + }; + for filename in &filenames { + let fsize = metadata(filename).map(|m| m.len()).unwrap_or(0); + let tsize = mode.to_size(fsize); + file_truncate(filename, create, tsize)?; + } + Ok(()) +} + fn truncate( no_create: bool, _: bool, reference: Option, size: Option, filenames: Vec, -) { - let (refsize, mode) = match reference { - Some(rfilename) => { - let _ = match File::open(Path::new(&rfilename)) { - Ok(m) => m, - Err(f) => crash!(1, "{}", f.to_string()), - }; - match metadata(rfilename) { - Ok(meta) => (meta.len(), TruncateMode::Reference), - Err(f) => crash!(1, "{}", f.to_string()), - } - } - None => parse_size(size.unwrap().as_ref()), - }; - for filename in &filenames { - let path = Path::new(filename); - match OpenOptions::new() - .read(true) - .write(true) - .create(!no_create) - .open(path) - { - Ok(file) => { - let fsize = match metadata(filename) { - Ok(meta) => meta.len(), - Err(f) => { - show_warning!("{}", f.to_string()); - continue; - } - }; - let tsize: u64 = match mode { - TruncateMode::Reference => refsize, - TruncateMode::Extend => fsize + refsize, - TruncateMode::Reduce => fsize - refsize, - TruncateMode::AtMost => { - if fsize > refsize { - refsize - } else { - fsize - } - } - TruncateMode::AtLeast => { - if fsize < refsize { - refsize - } else { - fsize - } - } - TruncateMode::RoundDown => fsize - fsize % refsize, - TruncateMode::RoundUp => fsize + fsize % refsize, - }; - match file.set_len(tsize) { - Ok(_) => {} - Err(f) => crash!(1, "{}", f.to_string()), - }; - } - Err(f) => crash!(1, "{}", f.to_string()), +) -> std::io::Result<()> { + let create = !no_create; + // There are four possibilities + // - reference file given and size given, + // - reference file given but no size given, + // - no reference file given but size given, + // - no reference file given and no size given, + match (reference, size) { + (Some(rfilename), Some(size_string)) => { + truncate_reference_and_size(&rfilename, &size_string, filenames, create) } + (Some(rfilename), None) => truncate_reference_file_only(&rfilename, filenames, create), + (None, Some(size_string)) => truncate_size_only(&size_string, filenames, create), + (None, None) => crash!(1, "you must specify either --reference or --size"), } } -fn parse_size(size: &str) -> (u64, TruncateMode) { - let mode = match size.chars().next().unwrap() { +/// Decide whether a character is one of the size modifiers, like '+' or '<'. +fn is_modifier(c: char) -> bool { + c == '+' || c == '-' || c == '<' || c == '>' || c == '/' || c == '%' +} + +/// Parse a size string with optional modifier symbol as its first character. +/// +/// A size string is as described in [`parse_size`]. The first character +/// of `size_string` might be a modifier symbol, like `'+'` or +/// `'<'`. The first element of the pair returned by this function +/// indicates which modifier symbol was present, or +/// [`TruncateMode::Absolute`] if none. +/// +/// # Panics +/// +/// If `size_string` is empty, or if no number could be parsed from the +/// given string (for example, if the string were `"abc"`). +/// +/// # Examples +/// +/// ```rust,ignore +/// assert_eq!(parse_mode_and_size("+123"), (TruncateMode::Extend, 123)); +/// ``` +fn parse_mode_and_size(size_string: &str) -> Result { + // Trim any whitespace. + let size_string = size_string.trim(); + + // Get the modifier character from the size string, if any. For + // example, if the argument is "+123", then the modifier is '+'. + let c = size_string.chars().next().unwrap(); + let size_string = if is_modifier(c) { + &size_string[1..] + } else { + size_string + }; + parse_size(size_string).map(match c { '+' => TruncateMode::Extend, '-' => TruncateMode::Reduce, '<' => TruncateMode::AtMost, '>' => TruncateMode::AtLeast, '/' => TruncateMode::RoundDown, - '*' => TruncateMode::RoundUp, - _ => TruncateMode::Reference, /* assume that the size is just a number */ - }; - let bytes = { - let mut slice = if mode == TruncateMode::Reference { - size - } else { - &size[1..] - }; - if slice.chars().last().unwrap().is_alphabetic() { - slice = &slice[..slice.len() - 1]; - if !slice.is_empty() && slice.chars().last().unwrap().is_alphabetic() { - slice = &slice[..slice.len() - 1]; - } - } - slice - } - .to_owned(); - let mut number: u64 = match bytes.parse() { - Ok(num) => num, - Err(e) => crash!(1, "'{}' is not a valid number: {}", size, e), - }; - if size.chars().last().unwrap().is_alphabetic() { - number *= match size.chars().last().unwrap().to_ascii_uppercase() { - 'B' => match size - .chars() - .nth(size.len() - 2) - .unwrap() - .to_ascii_uppercase() - { - 'K' => 1000u64, - 'M' => 1000u64.pow(2), - 'G' => 1000u64.pow(3), - 'T' => 1000u64.pow(4), - 'P' => 1000u64.pow(5), - 'E' => 1000u64.pow(6), - 'Z' => 1000u64.pow(7), - 'Y' => 1000u64.pow(8), - letter => crash!(1, "'{}B' is not a valid suffix.", letter), - }, - 'K' => 1024u64, - 'M' => 1024u64.pow(2), - 'G' => 1024u64.pow(3), - 'T' => 1024u64.pow(4), - 'P' => 1024u64.pow(5), - 'E' => 1024u64.pow(6), - 'Z' => 1024u64.pow(7), - 'Y' => 1024u64.pow(8), - letter => crash!(1, "'{}' is not a valid suffix.", letter), - }; - } - (number, mode) + '%' => TruncateMode::RoundUp, + _ => TruncateMode::Absolute, + }) +} + +/// Parse a size string into a number of bytes. +/// +/// A size string comprises an integer and an optional unit. The unit +/// may be K, M, G, T, P, E, Z, or Y (powers of 1024) or KB, MB, +/// etc. (powers of 1000). +/// +/// # Errors +/// +/// This function returns an error if the string does not begin with a +/// numeral, or if the unit is not one of the supported units described +/// in the preceding section. +/// +/// # Examples +/// +/// ```rust,ignore +/// assert_eq!(parse_size("123").unwrap(), 123); +/// assert_eq!(parse_size("123K").unwrap(), 123 * 1024); +/// assert_eq!(parse_size("123KB").unwrap(), 123 * 1000); +/// ``` +fn parse_size(size: &str) -> Result { + // Get the numeric part of the size argument. For example, if the + // argument is "123K", then the numeric part is "123". + let numeric_string: String = size.chars().take_while(|c| c.is_digit(10)).collect(); + let number: u64 = match numeric_string.parse() { + Ok(n) => n, + Err(_) => return Err(()), + }; + + // Get the alphabetic units part of the size argument and compute + // the factor it represents. For example, if the argument is "123K", + // then the unit part is "K" and the factor is 1024. This may be the + // empty string, in which case, the factor is 1. + let n = numeric_string.len(); + let (base, exponent): (u64, u32) = match &size[n..] { + "" => (1, 0), + "K" | "k" => (1024, 1), + "M" | "m" => (1024, 2), + "G" | "g" => (1024, 3), + "T" | "t" => (1024, 4), + "P" | "p" => (1024, 5), + "E" | "e" => (1024, 6), + "Z" | "z" => (1024, 7), + "Y" | "y" => (1024, 8), + "KB" | "kB" => (1000, 1), + "MB" | "mB" => (1000, 2), + "GB" | "gB" => (1000, 3), + "TB" | "tB" => (1000, 4), + "PB" | "pB" => (1000, 5), + "EB" | "eB" => (1000, 6), + "ZB" | "zB" => (1000, 7), + "YB" | "yB" => (1000, 8), + _ => return Err(()), + }; + let factor = base.pow(exponent); + Ok(number * factor) +} + +#[cfg(test)] +mod tests { + use crate::parse_mode_and_size; + use crate::parse_size; + use crate::TruncateMode; + + #[test] + fn test_parse_size_zero() { + assert_eq!(parse_size("0").unwrap(), 0); + assert_eq!(parse_size("0K").unwrap(), 0); + assert_eq!(parse_size("0KB").unwrap(), 0); + } + + #[test] + fn test_parse_size_without_factor() { + assert_eq!(parse_size("123").unwrap(), 123); + } + + #[test] + fn test_parse_size_kilobytes() { + assert_eq!(parse_size("123K").unwrap(), 123 * 1024); + assert_eq!(parse_size("123KB").unwrap(), 123 * 1000); + } + + #[test] + fn test_parse_size_megabytes() { + assert_eq!(parse_size("123").unwrap(), 123); + assert_eq!(parse_size("123M").unwrap(), 123 * 1024 * 1024); + assert_eq!(parse_size("123MB").unwrap(), 123 * 1000 * 1000); + } + + #[test] + fn test_parse_mode_and_size() { + assert_eq!(parse_mode_and_size("10"), Ok(TruncateMode::Absolute(10))); + assert_eq!(parse_mode_and_size("+10"), Ok(TruncateMode::Extend(10))); + assert_eq!(parse_mode_and_size("-10"), Ok(TruncateMode::Reduce(10))); + assert_eq!(parse_mode_and_size("<10"), Ok(TruncateMode::AtMost(10))); + assert_eq!(parse_mode_and_size(">10"), Ok(TruncateMode::AtLeast(10))); + assert_eq!(parse_mode_and_size("/10"), Ok(TruncateMode::RoundDown(10))); + assert_eq!(parse_mode_and_size("%10"), Ok(TruncateMode::RoundUp(10))); + } } diff --git a/src/uu/tsort/src/tsort.rs b/src/uu/tsort/src/tsort.rs index 3440972a2..c96939b20 100644 --- a/src/uu/tsort/src/tsort.rs +++ b/src/uu/tsort/src/tsort.rs @@ -14,10 +14,11 @@ use std::collections::{HashMap, HashSet}; use std::fs::File; use std::io::{stdin, BufRead, BufReader, Read}; use std::path::Path; +use uucore::InvalidEncodingHandling; static VERSION: &str = env!("CARGO_PKG_VERSION"); -static SUMMARY: &str = "Topological sort the strings in FILE. -Strings are defined as any sequence of tokens separated by whitespace (tab, space, or newline). +static SUMMARY: &str = "Topological sort the strings in FILE. +Strings are defined as any sequence of tokens separated by whitespace (tab, space, or newline). If FILE is not passed in, stdin is used instead."; static USAGE: &str = "tsort [OPTIONS] FILE"; @@ -26,19 +27,24 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .version(VERSION) .usage(USAGE) .about(SUMMARY) - .arg(Arg::with_name(options::FILE).hidden(true)) + .arg( + Arg::with_name(options::FILE) + .default_value("-") + .hidden(true), + ) .get_matches_from(args); - let input = match matches.value_of(options::FILE) { - Some(v) => v, - None => "-", - }; + let input = matches + .value_of(options::FILE) + .expect("Value is required by clap"); let mut stdin_buf; let mut file_buf; diff --git a/src/uu/tty/src/tty.rs b/src/uu/tty/src/tty.rs index 18d69db46..ef2d848e9 100644 --- a/src/uu/tty/src/tty.rs +++ b/src/uu/tty/src/tty.rs @@ -15,6 +15,7 @@ extern crate uucore; use clap::{App, Arg}; use std::ffi::CStr; use uucore::fs::is_stdin_interactive; +use uucore::InvalidEncodingHandling; static VERSION: &str = env!("CARGO_PKG_VERSION"); static ABOUT: &str = "Print the file name of the terminal connected to standard input."; @@ -28,8 +29,10 @@ fn get_usage() -> String { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); let usage = get_usage(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); let matches = App::new(executable!()) .version(VERSION) @@ -65,9 +68,9 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } } - return if is_stdin_interactive() { + if is_stdin_interactive() { libc::EXIT_SUCCESS } else { libc::EXIT_FAILURE - }; + } } diff --git a/src/uu/unexpand/src/unexpand.rs b/src/uu/unexpand/src/unexpand.rs index 5b08c33cf..22b6b807a 100644 --- a/src/uu/unexpand/src/unexpand.rs +++ b/src/uu/unexpand/src/unexpand.rs @@ -16,6 +16,7 @@ use std::fs::File; use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Read, Stdout, Write}; use std::str::from_utf8; use unicode_width::UnicodeWidthChar; +use uucore::InvalidEncodingHandling; static NAME: &str = "unexpand"; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -90,7 +91,9 @@ impl Options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); let matches = App::new(executable!()) .name(NAME) @@ -149,10 +152,8 @@ fn next_tabstop(tabstops: &[usize], col: usize) -> Option { Some(tabstops[0] - col % tabstops[0]) } else { // find next larger tab - match tabstops.iter().find(|&&t| t > col) { - Some(t) => Some(t - col), - None => None, // if there isn't one in the list, tab becomes a single space - } + // if there isn't one in the list, tab becomes a single space + tabstops.iter().find(|&&t| t > col).map(|t| t - col) } } diff --git a/src/uu/uniq/src/uniq.rs b/src/uu/uniq/src/uniq.rs index a61a78a61..7e9862e65 100644 --- a/src/uu/uniq/src/uniq.rs +++ b/src/uu/uniq/src/uniq.rs @@ -61,34 +61,43 @@ impl Uniq { reader: &mut BufReader, writer: &mut BufWriter, ) { - let mut lines: Vec = vec![]; let mut first_line_printed = false; - let delimiters = self.delimiters; + let mut group_count = 1; let line_terminator = self.get_line_terminator(); - // Don't print any delimiting lines before, after or between groups if delimiting method is 'none' - let no_delimiters = delimiters == Delimiters::None; - // The 'prepend' and 'both' delimit methods will cause output to start with delimiter line - let prepend_delimiter = delimiters == Delimiters::Prepend || delimiters == Delimiters::Both; - // The 'append' and 'both' delimit methods will cause output to end with delimiter line - let append_delimiter = delimiters == Delimiters::Append || delimiters == Delimiters::Both; + let mut lines = reader.split(line_terminator).map(get_line_string); + let mut line = match lines.next() { + Some(l) => l, + None => return, + }; - for line in reader.split(line_terminator).map(get_line_string) { - if !lines.is_empty() && self.cmp_keys(&lines[0], &line) { - // Print delimiter if delimit method is not 'none' and any line has been output - // before or if we need to start output with delimiter - let print_delimiter = !no_delimiters && (prepend_delimiter || first_line_printed); - first_line_printed |= self.print_lines(writer, &lines, print_delimiter); - lines.truncate(0); + // compare current `line` with consecutive lines (`next_line`) of the input + // and if needed, print `line` based on the command line options provided + for next_line in lines { + if self.cmp_keys(&line, &next_line) { + if (group_count == 1 && !self.repeats_only) + || (group_count > 1 && !self.uniques_only) + { + self.print_line(writer, &line, group_count, first_line_printed); + first_line_printed = true; + } + line = next_line; + group_count = 1; + } else { + if self.all_repeated { + self.print_line(writer, &line, group_count, first_line_printed); + first_line_printed = true; + line = next_line; + } + group_count += 1; } - lines.push(line); } - if !lines.is_empty() { - // Print delimiter if delimit method is not 'none' and any line has been output - // before or if we need to start output with delimiter - let print_delimiter = !no_delimiters && (prepend_delimiter || first_line_printed); - first_line_printed |= self.print_lines(writer, &lines, print_delimiter); + if (group_count == 1 && !self.repeats_only) || (group_count > 1 && !self.uniques_only) { + self.print_line(writer, &line, group_count, first_line_printed); + first_line_printed = true; } - if append_delimiter && first_line_printed { + if (self.delimiters == Delimiters::Append || self.delimiters == Delimiters::Both) + && first_line_printed + { crash_if_err!(1, writer.write_all(&[line_terminator])); } } @@ -163,27 +172,17 @@ impl Uniq { } } - fn print_lines( - &self, - writer: &mut BufWriter, - lines: &[String], - print_delimiter: bool, - ) -> bool { - let mut first_line_printed = false; - let mut count = if self.all_repeated { 1 } else { lines.len() }; - if lines.len() == 1 && !self.repeats_only || lines.len() > 1 && !self.uniques_only { - self.print_line(writer, &lines[0], count, print_delimiter); - first_line_printed = true; - count += 1; - } - if self.all_repeated { - for line in lines[1..].iter() { - self.print_line(writer, line, count, print_delimiter && !first_line_printed); - first_line_printed = true; - count += 1; - } - } - first_line_printed + fn should_print_delimiter(&self, group_count: usize, first_line_printed: bool) -> bool { + // if no delimiter option is selected then no other checks needed + self.delimiters != Delimiters::None + // print delimiter only before the first line of a group, not between lines of a group + && group_count == 1 + // if at least one line has been output before current group then print delimiter + && (first_line_printed + // or if we need to prepend delimiter then print it even at the start of the output + || self.delimiters == Delimiters::Prepend + // the 'both' delimit mode should prepend and append delimiters + || self.delimiters == Delimiters::Both) } fn print_line( @@ -191,11 +190,11 @@ impl Uniq { writer: &mut BufWriter, line: &str, count: usize, - print_delimiter: bool, + first_line_printed: bool, ) { let line_terminator = self.get_line_terminator(); - if print_delimiter { + if self.should_print_delimiter(count, first_line_printed) { crash_if_err!(1, writer.write_all(&[line_terminator])); } diff --git a/src/uu/unlink/Cargo.toml b/src/uu/unlink/Cargo.toml index b193bd1b5..08da2624e 100644 --- a/src/uu/unlink/Cargo.toml +++ b/src/uu/unlink/Cargo.toml @@ -15,7 +15,7 @@ edition = "2018" path = "src/unlink.rs" [dependencies] -getopts = "0.2.18" +clap = "2.33" libc = "0.2.42" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } diff --git a/src/uu/unlink/src/unlink.rs b/src/uu/unlink/src/unlink.rs index b85b6ea94..9d9d6385b 100644 --- a/src/uu/unlink/src/unlink.rs +++ b/src/uu/unlink/src/unlink.rs @@ -12,59 +12,56 @@ #[macro_use] extern crate uucore; -use getopts::Options; +use clap::{App, Arg}; use libc::{lstat, stat, unlink}; use libc::{S_IFLNK, S_IFMT, S_IFREG}; use std::ffi::CString; use std::io::{Error, ErrorKind}; +use uucore::InvalidEncodingHandling; -static NAME: &str = "unlink"; static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = "Unlink the file at [FILE]."; +static OPT_PATH: &str = "FILE"; + +fn get_usage() -> String { + format!("{} [OPTION]... FILE", executable!()) +} pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::ConvertLossy) + .accept_any(); - let mut opts = Options::new(); + let usage = get_usage(); - opts.optflag("h", "help", "display this help and exit"); - opts.optflag("V", "version", "output version information and exit"); + let matches = App::new(executable!()) + .version(VERSION) + .about(ABOUT) + .usage(&usage[..]) + .arg(Arg::with_name(OPT_PATH).hidden(true).multiple(true)) + .get_matches_from(args); - let matches = match opts.parse(&args[1..]) { - Ok(m) => m, - Err(f) => crash!(1, "invalid options\n{}", f), - }; + let paths: Vec = matches + .values_of(OPT_PATH) + .map(|v| v.map(ToString::to_string).collect()) + .unwrap_or_default(); - if matches.opt_present("help") { - println!("{} {}", NAME, VERSION); - println!(); - println!("Usage:"); - println!(" {} [FILE]... [OPTION]...", NAME); - println!(); - println!("{}", opts.usage("Unlink the file at [FILE].")); - return 0; - } - - if matches.opt_present("version") { - println!("{} {}", NAME, VERSION); - return 0; - } - - if matches.free.is_empty() { + if paths.is_empty() { crash!( 1, "missing operand\nTry '{0} --help' for more information.", - NAME + executable!() ); - } else if matches.free.len() > 1 { + } else if paths.len() > 1 { crash!( 1, "extra operand: '{1}'\nTry '{0} --help' for more information.", - NAME, - matches.free[1] + executable!(), + paths[1] ); } - let c_string = CString::new(matches.free[0].clone()).unwrap(); // unwrap() cannot fail, the string comes from argv so it cannot contain a \0. + let c_string = CString::new(paths[0].clone()).unwrap(); // unwrap() cannot fail, the string comes from argv so it cannot contain a \0. let st_mode = { #[allow(deprecated)] @@ -72,12 +69,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let result = unsafe { lstat(c_string.as_ptr(), &mut buf as *mut stat) }; if result < 0 { - crash!( - 1, - "Cannot stat '{}': {}", - matches.free[0], - Error::last_os_error() - ); + crash!(1, "Cannot stat '{}': {}", paths[0], Error::last_os_error()); } buf.st_mode & S_IFMT @@ -101,7 +93,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { match result { Ok(_) => (), Err(e) => { - crash!(1, "cannot unlink '{0}': {1}", matches.free[0], e); + crash!(1, "cannot unlink '{0}': {1}", paths[0], e); } } diff --git a/src/uu/users/src/users.rs b/src/uu/users/src/users.rs index 4bb628441..99e06c1af 100644 --- a/src/uu/users/src/users.rs +++ b/src/uu/users/src/users.rs @@ -6,19 +6,14 @@ // * For the full copyright and license information, please view the LICENSE // * file that was distributed with this source code. -/* last synced with: whoami (GNU coreutils) 8.22 */ -// Allow dead code here in order to keep all fields, constants here, for consistency. -#![allow(dead_code)] - #[macro_use] extern crate uucore; -use uucore::utmpx::*; - use clap::{App, Arg}; +use uucore::utmpx::{self, Utmpx}; -static ABOUT: &str = "Display who is currently logged in, according to FILE."; static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = "Print the user names of users currently logged in to the current host"; static ARG_FILES: &str = "files"; @@ -26,13 +21,23 @@ fn get_usage() -> String { format!("{0} [FILE]", executable!()) } +fn get_long_usage() -> String { + format!( + "Output who is currently logged in according to FILE. +If FILE is not specified, use {}. /var/log/wtmp as FILE is common.", + utmpx::DEFAULT_FILE + ) +} + pub fn uumain(args: impl uucore::Args) -> i32 { let usage = get_usage(); + let after_help = get_long_usage(); let matches = App::new(executable!()) .version(VERSION) .about(ABOUT) .usage(&usage[..]) + .after_help(&after_help[..]) .arg(Arg::with_name(ARG_FILES).takes_value(true).max_values(1)) .get_matches_from(args); @@ -44,7 +49,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let filename = if !files.is_empty() { files[0].as_ref() } else { - DEFAULT_FILE + utmpx::DEFAULT_FILE }; let mut users = Utmpx::iter_all_records() diff --git a/src/uu/wc/src/count_bytes.rs b/src/uu/wc/src/count_bytes.rs index dc90f67cc..7f06f8171 100644 --- a/src/uu/wc/src/count_bytes.rs +++ b/src/uu/wc/src/count_bytes.rs @@ -20,6 +20,21 @@ use nix::unistd::pipe; const BUF_SIZE: usize = 16384; +/// Splice wrapper which handles short writes +#[cfg(any(target_os = "linux", target_os = "android"))] +#[inline] +fn splice_exact(read_fd: RawFd, write_fd: RawFd, num_bytes: usize) -> nix::Result<()> { + let mut left = num_bytes; + loop { + let written = splice(read_fd, None, write_fd, None, left, SpliceFFlags::empty())?; + left -= written; + if left == 0 { + break; + } + } + Ok(()) +} + /// This is a Linux-specific function to count the number of bytes using the /// `splice` system call, which is faster than using `read`. #[inline] @@ -39,7 +54,7 @@ fn count_bytes_using_splice(fd: RawFd) -> nix::Result { break; } byte_count += res; - splice(pipe_rd, None, null, None, res, SpliceFFlags::empty())?; + splice_exact(pipe_rd, null, res)?; } Ok(byte_count) @@ -57,30 +72,27 @@ pub(crate) fn count_bytes_fast(handle: &mut T) -> WcResult { - // If the file is regular, then the `st_size` should hold - // the file's size in bytes. - if (stat.st_mode & S_IFREG) != 0 { - return Ok(stat.st_size as usize); - } - #[cfg(any(target_os = "linux", target_os = "android"))] - { - // Else, if we're on Linux and our file is a FIFO pipe - // (or stdin), we use splice to count the number of bytes. - if (stat.st_mode & S_IFIFO) != 0 { - if let Ok(n) = count_bytes_using_splice(fd) { - return Ok(n); - } + if let Ok(stat) = fstat(fd) { + // If the file is regular, then the `st_size` should hold + // the file's size in bytes. + if (stat.st_mode & S_IFREG) != 0 { + return Ok(stat.st_size as usize); + } + #[cfg(any(target_os = "linux", target_os = "android"))] + { + // Else, if we're on Linux and our file is a FIFO pipe + // (or stdin), we use splice to count the number of bytes. + if (stat.st_mode & S_IFIFO) != 0 { + if let Ok(n) = count_bytes_using_splice(fd) { + return Ok(n); } } } - _ => {} } } // Fall back on `read`, but without the overhead of counting words and lines. - let mut buf = [0 as u8; BUF_SIZE]; + let mut buf = [0_u8; BUF_SIZE]; let mut byte_count = 0; loop { match handle.read(&mut buf) { diff --git a/src/uu/wc/src/countable.rs b/src/uu/wc/src/countable.rs new file mode 100644 index 000000000..3da910a03 --- /dev/null +++ b/src/uu/wc/src/countable.rs @@ -0,0 +1,72 @@ +//! Traits and implementations for iterating over lines in a file-like object. +//! +//! This module provides a [`WordCountable`] trait and implementations +//! for some common file-like objects. Use the [`WordCountable::lines`] +//! method to get an iterator over lines of a file-like object. +use std::fs::File; +use std::io::{self, BufRead, BufReader, Read, StdinLock}; + +#[cfg(unix)] +use std::os::unix::io::AsRawFd; + +#[cfg(unix)] +pub trait WordCountable: AsRawFd + Read { + type Buffered: BufRead; + fn lines(self) -> Lines; +} + +#[cfg(not(unix))] +pub trait WordCountable: Read { + type Buffered: BufRead; + fn lines(self) -> Lines; +} + +impl WordCountable for StdinLock<'_> { + type Buffered = Self; + + fn lines(self) -> Lines + where + Self: Sized, + { + Lines { buf: self } + } +} +impl WordCountable for File { + type Buffered = BufReader; + + fn lines(self) -> Lines + where + Self: Sized, + { + Lines { + buf: BufReader::new(self), + } + } +} + +/// An iterator over the lines of an instance of `BufRead`. +/// +/// Similar to [`io::Lines`] but yields each line as a `Vec` and +/// includes the newline character (`\n`, the `0xA` byte) that +/// terminates the line. +/// +/// [`io::Lines`]:: io::Lines +pub struct Lines { + buf: B, +} + +impl Iterator for Lines { + type Item = io::Result>; + + fn next(&mut self) -> Option { + let mut line = Vec::new(); + + // reading from a TTY seems to raise a condition on, rather than return Some(0) like a file. + // hence the option wrapped in a result here + match self.buf.read_until(b'\n', &mut line) { + Ok(0) => None, + Ok(_n) => Some(Ok(line)), + Err(e) => Some(Err(e)), + } + } +} diff --git a/src/uu/wc/src/wc.rs b/src/uu/wc/src/wc.rs index 22463caa4..6e95254ee 100644 --- a/src/uu/wc/src/wc.rs +++ b/src/uu/wc/src/wc.rs @@ -11,19 +11,21 @@ extern crate uucore; mod count_bytes; +mod countable; +mod wordcount; use count_bytes::count_bytes_fast; +use countable::WordCountable; +use wordcount::{TitledWordCount, WordCount}; use clap::{App, Arg, ArgMatches}; use thiserror::Error; -use std::cmp::max; -use std::fs::File; -use std::io::{self, BufRead, BufReader, Read, StdinLock, Write}; -use std::ops::{Add, AddAssign}; -#[cfg(unix)] -use std::os::unix::io::AsRawFd; +use std::fs::{self, File}; +use std::io::{self, ErrorKind, Write}; use std::path::Path; -use std::str::from_utf8; + +/// The minimum character width for formatting counts when reading from stdin. +const MINIMUM_WIDTH: usize = 7; #[derive(Error, Debug)] pub enum WcError { @@ -82,80 +84,6 @@ impl Settings { } } -#[cfg(unix)] -trait WordCountable: AsRawFd + Read { - type Buffered: BufRead; - fn get_buffered(self) -> Self::Buffered; -} -#[cfg(not(unix))] -trait WordCountable: Read { - type Buffered: BufRead; - fn get_buffered(self) -> Self::Buffered; -} - -impl WordCountable for StdinLock<'_> { - type Buffered = Self; - - fn get_buffered(self) -> Self::Buffered { - self - } -} -impl WordCountable for File { - type Buffered = BufReader; - - fn get_buffered(self) -> Self::Buffered { - BufReader::new(self) - } -} - -#[derive(Debug, Default, Copy, Clone)] -struct WordCount { - bytes: usize, - chars: usize, - lines: usize, - words: usize, - max_line_length: usize, -} - -impl Add for WordCount { - type Output = Self; - - fn add(self, other: Self) -> Self { - Self { - bytes: self.bytes + other.bytes, - chars: self.chars + other.chars, - lines: self.lines + other.lines, - words: self.words + other.words, - max_line_length: max(self.max_line_length, other.max_line_length), - } - } -} - -impl AddAssign for WordCount { - fn add_assign(&mut self, other: Self) { - *self = *self + other - } -} - -impl WordCount { - fn with_title<'a>(self, title: &'a str) -> TitledWordCount<'a> { - return TitledWordCount { - title: title, - count: self, - }; - } -} - -/// This struct supplements the actual word count with a title that is displayed -/// to the user at the end of the program. -/// The reason we don't simply include title in the `WordCount` struct is that -/// it would result in unneccesary copying of `String`. -#[derive(Debug, Default, Clone)] -struct TitledWordCount<'a> { - title: &'a str, - count: WordCount, -} - static ABOUT: &str = "Display newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified."; static VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -178,6 +106,34 @@ fn get_usage() -> String { ) } +enum StdinKind { + /// Stdin specified on command-line with "-". + Explicit, + + /// Stdin implicitly specified on command-line by not passing any positional argument. + Implicit, +} + +/// Supported inputs. +enum Input { + /// A regular file. + Path(String), + + /// Standard input. + Stdin(StdinKind), +} + +impl Input { + /// Converts input to title that appears in stats. + fn to_title(&self) -> Option<&str> { + match self { + Input::Path(path) => Some(path), + Input::Stdin(StdinKind::Explicit) => Some("-"), + Input::Stdin(StdinKind::Implicit) => None, + } + } +} + pub fn uumain(args: impl uucore::Args) -> i32 { let usage = get_usage(); @@ -218,40 +174,37 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .arg(Arg::with_name(ARG_FILES).multiple(true).takes_value(true)) .get_matches_from(args); - let mut files: Vec = matches + let mut inputs: Vec = matches .values_of(ARG_FILES) - .map(|v| v.map(ToString::to_string).collect()) + .map(|v| { + v.map(|i| { + if i == "-" { + Input::Stdin(StdinKind::Explicit) + } else { + Input::Path(ToString::to_string(i)) + } + }) + .collect() + }) .unwrap_or_default(); - if files.is_empty() { - files.push("-".to_owned()); + if inputs.is_empty() { + inputs.push(Input::Stdin(StdinKind::Implicit)); } let settings = Settings::new(&matches); - if wc(files, &settings).is_ok() { + if wc(inputs, &settings).is_ok() { 0 } else { 1 } } -const CR: u8 = b'\r'; -const LF: u8 = b'\n'; -const SPACE: u8 = b' '; -const TAB: u8 = b'\t'; -const SYN: u8 = 0x16_u8; -const FF: u8 = 0x0C_u8; - -#[inline(always)] -fn is_word_separator(byte: u8) -> bool { - byte == SPACE || byte == TAB || byte == CR || byte == SYN || byte == FF -} - fn word_count_from_reader( mut reader: T, settings: &Settings, - path: &String, + path: &str, ) -> WcResult { let only_count_bytes = settings.show_bytes && (!(settings.show_chars @@ -268,115 +221,181 @@ fn word_count_from_reader( // we do not need to decode the byte stream if we're only counting bytes/newlines let decode_chars = settings.show_chars || settings.show_words || settings.show_max_line_length; - let mut line_count: usize = 0; - let mut word_count: usize = 0; - let mut byte_count: usize = 0; - let mut char_count: usize = 0; - let mut longest_line_length: usize = 0; - let mut raw_line = Vec::new(); - let mut ends_lf: bool; - - // reading from a TTY seems to raise a condition on, rather than return Some(0) like a file. - // hence the option wrapped in a result here - let mut buffered_reader = reader.get_buffered(); - loop { - match buffered_reader.read_until(LF, &mut raw_line) { - Ok(n) => { - if n == 0 { - break; - } + // Sum the WordCount for each line. Show a warning for each line + // that results in an IO error when trying to read it. + let total = reader + .lines() + .filter_map(|res| match res { + Ok(line) => Some(line), + Err(e) => { + show_warning!("Error while reading {}: {}", path, e); + None } - Err(ref e) => { - if !raw_line.is_empty() { - show_warning!("Error while reading {}: {}", path, e); - } else { - break; - } - } - }; - - // GNU 'wc' only counts lines that end in LF as lines - ends_lf = *raw_line.last().unwrap() == LF; - line_count += ends_lf as usize; - - byte_count += raw_line.len(); - - if decode_chars { - // try and convert the bytes to UTF-8 first - let current_char_count; - match from_utf8(&raw_line[..]) { - Ok(line) => { - word_count += line.split_whitespace().count(); - current_char_count = line.chars().count(); - } - Err(..) => { - word_count += raw_line.split(|&x| is_word_separator(x)).count(); - current_char_count = raw_line.iter().filter(|c| c.is_ascii()).count() - } - } - char_count += current_char_count; - if current_char_count > longest_line_length { - // -L is a GNU 'wc' extension so same behavior on LF - longest_line_length = current_char_count - (ends_lf as usize); - } - } - - raw_line.truncate(0); - } - - Ok(WordCount { - bytes: byte_count, - chars: char_count, - lines: line_count, - words: word_count, - max_line_length: longest_line_length, - }) + }) + .map(|line| WordCount::from_line(&line, decode_chars)) + .sum(); + Ok(total) } -fn word_count_from_path(path: &String, settings: &Settings) -> WcResult { - if path == "-" { - let stdin = io::stdin(); - let stdin_lock = stdin.lock(); - return Ok(word_count_from_reader(stdin_lock, settings, path)?); - } else { - let path_obj = Path::new(path); - if path_obj.is_dir() { - return Err(WcError::IsDirectory(path.clone())); - } else { - let file = File::open(path)?; - return Ok(word_count_from_reader(file, settings, path)?); +fn word_count_from_input(input: &Input, settings: &Settings) -> WcResult { + match input { + Input::Stdin(_) => { + let stdin = io::stdin(); + let stdin_lock = stdin.lock(); + word_count_from_reader(stdin_lock, settings, "-") + } + Input::Path(path) => { + let path_obj = Path::new(path); + if path_obj.is_dir() { + Err(WcError::IsDirectory(path.to_owned())) + } else { + let file = File::open(path)?; + word_count_from_reader(file, settings, path) + } } } } -fn wc(files: Vec, settings: &Settings) -> Result<(), u32> { - let mut total_word_count = WordCount::default(); - let mut results = vec![]; - let mut max_width: usize = 0; +/// Print a message appropriate for the particular error to `stderr`. +/// +/// # Examples +/// +/// This will print `wc: /tmp: Is a directory` to `stderr`. +/// +/// ```rust,ignore +/// show_error(Input::Path("/tmp"), WcError::IsDirectory("/tmp")) +/// ``` +fn show_error(input: &Input, err: WcError) { + match (input, err) { + (_, WcError::IsDirectory(path)) => { + show_error_custom_description!(path, "Is a directory"); + } + (Input::Path(path), WcError::Io(e)) if e.kind() == ErrorKind::NotFound => { + show_error_custom_description!(path, "No such file or directory"); + } + (_, e) => { + show_error!("{}", e); + } + }; +} + +/// Compute the number of digits needed to represent any count for this input. +/// +/// If `input` is [`Input::Stdin`], then this function returns +/// [`MINIMUM_WIDTH`]. Otherwise, if metadata could not be read from +/// `input` then this function returns 1. +/// +/// # Errors +/// +/// This function will return an error if `input` is a [`Input::Path`] +/// and there is a problem accessing the metadata of the given `input`. +/// +/// # Examples +/// +/// A [`Input::Stdin`] gets a default minimum width: +/// +/// ```rust,ignore +/// let input = Input::Stdin(StdinKind::Explicit); +/// assert_eq!(7, digit_width(input)); +/// ``` +fn digit_width(input: &Input) -> WcResult> { + match input { + Input::Stdin(_) => Ok(Some(MINIMUM_WIDTH)), + Input::Path(filename) => { + let path = Path::new(filename); + let metadata = fs::metadata(path)?; + if metadata.is_file() { + // TODO We are now computing the number of bytes in a file + // twice: once here and once in `WordCount::from_line()` (or + // in `count_bytes_fast()` if that function is called + // instead). See GitHub issue #2201. + let num_bytes = metadata.len(); + let num_digits = num_bytes.to_string().len(); + Ok(Some(num_digits)) + } else { + Ok(None) + } + } + } +} + +/// Compute the number of digits needed to represent all counts in all inputs. +/// +/// `inputs` may include zero or more [`Input::Stdin`] entries, each of +/// which represents reading from `stdin`. The presence of any such +/// entry causes this function to return a width that is at least +/// [`MINIMUM_WIDTH`]. +/// +/// If `input` is empty, then this function returns 1. If file metadata +/// could not be read from any of the [`Input::Path`] inputs and there +/// are no [`Input::Stdin`] inputs, then this function returns 1. +/// +/// If there is a problem accessing the metadata, this function will +/// silently ignore the error and assume that the number of digits +/// needed to display the counts for that file is 1. +/// +/// # Examples +/// +/// An empty slice implies a width of 1: +/// +/// ```rust,ignore +/// assert_eq!(1, max_width(&vec![])); +/// ``` +/// +/// The presence of [`Input::Stdin`] implies a minimum width: +/// +/// ```rust,ignore +/// let inputs = vec![Input::Stdin(StdinKind::Explicit)]; +/// assert_eq!(7, max_width(&inputs)); +/// ``` +fn max_width(inputs: &[Input]) -> usize { + let mut result = 1; + for input in inputs { + match digit_width(input) { + Ok(maybe_n) => { + if let Some(n) = maybe_n { + result = result.max(n); + } + } + Err(_) => continue, + } + } + result +} + +fn wc(inputs: Vec, settings: &Settings) -> Result<(), u32> { + // Compute the width, in digits, to use when formatting counts. + // + // The width is the number of digits needed to print the number of + // bytes in the largest file. This is true regardless of whether + // the `settings` indicate that the bytes will be displayed. let mut error_count = 0; + let max_width = max_width(&inputs); - let num_files = files.len(); + let mut total_word_count = WordCount::default(); - for path in &files { - let word_count = word_count_from_path(&path, settings).unwrap_or_else(|err| { - show_error!("{}", err); + let num_inputs = inputs.len(); + + for input in &inputs { + let word_count = word_count_from_input(&input, settings).unwrap_or_else(|err| { + show_error(&input, err); error_count += 1; WordCount::default() }); - max_width = max(max_width, word_count.bytes.to_string().len() + 1); total_word_count += word_count; - results.push(word_count.with_title(path)); - } - - for result in &results { + let result = word_count.with_title(input.to_title()); if let Err(err) = print_stats(settings, &result, max_width) { - show_warning!("failed to print result for {}: {}", result.title, err); + show_warning!( + "failed to print result for {}: {}", + result.title.unwrap_or(""), + err + ); error_count += 1; } } - if num_files > 1 { - let total_result = total_word_count.with_title("total"); + if num_inputs > 1 { + let total_result = total_word_count.with_title(Some("total")); if let Err(err) = print_stats(settings, &total_result, max_width) { show_warning!("failed to print total: {}", err); error_count += 1; @@ -404,19 +423,40 @@ fn print_stats( min_width = 0; } + let mut is_first: bool = true; + if settings.show_lines { + if !is_first { + write!(stdout_lock, " ")?; + } write!(stdout_lock, "{:1$}", result.count.lines, min_width)?; + is_first = false; } if settings.show_words { + if !is_first { + write!(stdout_lock, " ")?; + } write!(stdout_lock, "{:1$}", result.count.words, min_width)?; + is_first = false; } if settings.show_bytes { + if !is_first { + write!(stdout_lock, " ")?; + } write!(stdout_lock, "{:1$}", result.count.bytes, min_width)?; + is_first = false; } if settings.show_chars { + if !is_first { + write!(stdout_lock, " ")?; + } write!(stdout_lock, "{:1$}", result.count.chars, min_width)?; + is_first = false; } if settings.show_max_line_length { + if !is_first { + write!(stdout_lock, " ")?; + } write!( stdout_lock, "{:1$}", @@ -424,10 +464,10 @@ fn print_stats( )?; } - if result.title == "-" { - writeln!(stdout_lock, "")?; + if let Some(title) = result.title { + writeln!(stdout_lock, " {}", title)?; } else { - writeln!(stdout_lock, " {}", result.title)?; + writeln!(stdout_lock)?; } Ok(()) diff --git a/src/uu/wc/src/wordcount.rs b/src/uu/wc/src/wordcount.rs new file mode 100644 index 000000000..9e2a81fca --- /dev/null +++ b/src/uu/wc/src/wordcount.rs @@ -0,0 +1,131 @@ +use std::cmp::max; +use std::iter::Sum; +use std::ops::{Add, AddAssign}; +use std::str::from_utf8; + +const CR: u8 = b'\r'; +const LF: u8 = b'\n'; +const SPACE: u8 = b' '; +const TAB: u8 = b'\t'; +const SYN: u8 = 0x16_u8; +const FF: u8 = 0x0C_u8; + +#[inline(always)] +fn is_word_separator(byte: u8) -> bool { + byte == SPACE || byte == TAB || byte == CR || byte == SYN || byte == FF +} + +#[derive(Debug, Default, Copy, Clone)] +pub struct WordCount { + pub bytes: usize, + pub chars: usize, + pub lines: usize, + pub words: usize, + pub max_line_length: usize, +} + +impl Add for WordCount { + type Output = Self; + + fn add(self, other: Self) -> Self { + Self { + bytes: self.bytes + other.bytes, + chars: self.chars + other.chars, + lines: self.lines + other.lines, + words: self.words + other.words, + max_line_length: max(self.max_line_length, other.max_line_length), + } + } +} + +impl AddAssign for WordCount { + fn add_assign(&mut self, other: Self) { + *self = *self + other + } +} + +impl Sum for WordCount { + fn sum(iter: I) -> WordCount + where + I: Iterator, + { + iter.fold(WordCount::default(), |acc, x| acc + x) + } +} + +impl WordCount { + /// Count the characters and whitespace-separated words in the given bytes. + /// + /// `line` is a slice of bytes that will be decoded as ASCII characters. + fn ascii_word_and_char_count(line: &[u8]) -> (usize, usize) { + let word_count = line.split(|&x| is_word_separator(x)).count(); + let char_count = line.iter().filter(|c| c.is_ascii()).count(); + (word_count, char_count) + } + + /// Create a [`WordCount`] from a sequence of bytes representing a line. + /// + /// If the last byte of `line` encodes a newline character (`\n`), + /// then the [`lines`] field will be set to 1. Otherwise, it will + /// be set to 0. The [`bytes`] field is simply the length of + /// `line`. + /// + /// If `decode_chars` is `false`, the [`chars`] and [`words`] + /// fields will be set to 0. If it is `true`, this function will + /// attempt to decode the bytes first as UTF-8, and failing that, + /// as ASCII. + pub fn from_line(line: &[u8], decode_chars: bool) -> WordCount { + // GNU 'wc' only counts lines that end in LF as lines + let lines = (*line.last().unwrap() == LF) as usize; + let bytes = line.len(); + let (words, chars) = if decode_chars { + WordCount::word_and_char_count(line) + } else { + (0, 0) + }; + // -L is a GNU 'wc' extension so same behavior on LF + let max_line_length = if chars > 0 { chars - lines } else { 0 }; + WordCount { + bytes, + chars, + lines, + words, + max_line_length, + } + } + + /// Count the UTF-8 characters and words in the given string slice. + /// + /// `s` is a string slice that is assumed to be a UTF-8 string. + fn utf8_word_and_char_count(s: &str) -> (usize, usize) { + let word_count = s.split_whitespace().count(); + let char_count = s.chars().count(); + (word_count, char_count) + } + + pub fn with_title(self, title: Option<&str>) -> TitledWordCount { + TitledWordCount { title, count: self } + } + + /// Count the characters and words in the given slice of bytes. + /// + /// `line` is a slice of bytes that will be decoded as UTF-8 + /// characters, or if that fails, as ASCII characters. + fn word_and_char_count(line: &[u8]) -> (usize, usize) { + // try and convert the bytes to UTF-8 first + match from_utf8(line) { + Ok(s) => WordCount::utf8_word_and_char_count(s), + Err(..) => WordCount::ascii_word_and_char_count(line), + } + } +} + +/// This struct supplements the actual word count with an optional title that is +/// displayed to the user at the end of the program. +/// The reason we don't simply include title in the `WordCount` struct is that +/// it would result in unneccesary copying of `String`. +#[derive(Debug, Default, Clone)] +pub struct TitledWordCount<'a> { + pub title: Option<&'a str>, + pub count: WordCount, +} diff --git a/src/uu/who/Cargo.toml b/src/uu/who/Cargo.toml index c0cd63795..4d8eccb45 100644 --- a/src/uu/who/Cargo.toml +++ b/src/uu/who/Cargo.toml @@ -17,6 +17,7 @@ path = "src/who.rs" [dependencies] uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["utmpx"] } uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } +clap = "2.33.3" [[bin]] name = "who" diff --git a/src/uu/who/src/who.rs b/src/uu/who/src/who.rs index 8c7ff3211..19ae3addb 100644 --- a/src/uu/who/src/who.rs +++ b/src/uu/who/src/who.rs @@ -12,76 +12,173 @@ extern crate uucore; use uucore::libc::{ttyname, STDIN_FILENO, S_IWGRP}; use uucore::utmpx::{self, time, Utmpx}; +use clap::{App, Arg}; use std::borrow::Cow; use std::ffi::CStr; use std::os::unix::fs::MetadataExt; use std::path::PathBuf; +use uucore::InvalidEncodingHandling; -static SYNTAX: &str = "[OPTION]... [ FILE | ARG1 ARG2 ]"; -static SUMMARY: &str = "Print information about users who are currently logged in."; -static LONG_HELP: &str = " - -a, --all same as -b -d --login -p -r -t -T -u - -b, --boot time of last system boot - -d, --dead print dead processes - -H, --heading print line of column headings - -l, --login print system login processes - --lookup attempt to canonicalize hostnames via DNS - -m only hostname and user associated with stdin - -p, --process print active processes spawned by init - -q, --count all login names and number of users logged on - -r, --runlevel print current runlevel (not available on BSDs) - -s, --short print only name, line, and time (default) - -t, --time print last system clock change - -T, -w, --mesg add user's message status as +, - or ? - -u, --users list users logged in - --message same as -T - --writable same as -T - --help display this help and exit - --version output version information and exit +mod options { + pub const ALL: &str = "all"; + pub const BOOT: &str = "boot"; + pub const DEAD: &str = "dead"; + pub const HEADING: &str = "heading"; + pub const LOGIN: &str = "login"; + pub const LOOKUP: &str = "lookup"; + pub const ONLY_HOSTNAME_USER: &str = "only_hostname_user"; + pub const PROCESS: &str = "process"; + pub const COUNT: &str = "count"; + pub const RUNLEVEL: &str = "runlevel"; + pub const SHORT: &str = "short"; + pub const TIME: &str = "time"; + pub const USERS: &str = "users"; + pub const MESG: &str = "mesg"; // aliases: --message, --writable + pub const FILE: &str = "FILE"; // if length=1: FILE, if length=2: ARG1 ARG2 +} -If FILE is not specified, use /var/run/utmp. /var/log/wtmp as FILE is common. -If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual. -"; +static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = "Print information about users who are currently logged in."; + +#[cfg(any(target_os = "linux"))] +static RUNLEVEL_HELP: &str = "print current runlevel"; +#[cfg(not(target_os = "linux"))] +static RUNLEVEL_HELP: &str = "print current runlevel (This is meaningless on non Linux)"; + +fn get_usage() -> String { + format!("{0} [OPTION]... [ FILE | ARG1 ARG2 ]", executable!()) +} + +fn get_long_usage() -> String { + format!( + "If FILE is not specified, use {}. /var/log/wtmp as FILE is common.\n\ + If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.", + utmpx::DEFAULT_FILE, + ) +} pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); + let args = args + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); - let mut opts = app!(SYNTAX, SUMMARY, LONG_HELP); - opts.optflag("a", "all", "same as -b -d --login -p -r -t -T -u"); - opts.optflag("b", "boot", "time of last system boot"); - opts.optflag("d", "dead", "print dead processes"); - opts.optflag("H", "heading", "print line of column headings"); - opts.optflag("l", "login", "print system login processes"); - opts.optflag("", "lookup", "attempt to canonicalize hostnames via DNS"); - opts.optflag("m", "", "only hostname and user associated with stdin"); - opts.optflag("p", "process", "print active processes spawned by init"); - opts.optflag( - "q", - "count", - "all login names and number of users logged on", - ); - #[cfg(any(target_vendor = "apple", target_os = "linux", target_os = "android"))] - opts.optflag("r", "runlevel", "print current runlevel"); - opts.optflag("s", "short", "print only name, line, and time (default)"); - opts.optflag("t", "time", "print last system clock change"); - opts.optflag("u", "users", "list users logged in"); - opts.optflag("w", "mesg", "add user's message status as +, - or ?"); - // --message, --writable are the same as --mesg - opts.optflag("T", "message", ""); - opts.optflag("T", "writable", ""); + let usage = get_usage(); + let after_help = get_long_usage(); - opts.optflag("", "help", "display this help and exit"); - opts.optflag("", "version", "output version information and exit"); + let matches = App::new(executable!()) + .version(VERSION) + .about(ABOUT) + .usage(&usage[..]) + .after_help(&after_help[..]) + .arg( + Arg::with_name(options::ALL) + .long(options::ALL) + .short("a") + .help("same as -b -d --login -p -r -t -T -u"), + ) + .arg( + Arg::with_name(options::BOOT) + .long(options::BOOT) + .short("b") + .help("time of last system boot"), + ) + .arg( + Arg::with_name(options::DEAD) + .long(options::DEAD) + .short("d") + .help("print dead processes"), + ) + .arg( + Arg::with_name(options::HEADING) + .long(options::HEADING) + .short("H") + .help("print line of column headings"), + ) + .arg( + Arg::with_name(options::LOGIN) + .long(options::LOGIN) + .short("l") + .help("print system login processes"), + ) + .arg( + Arg::with_name(options::LOOKUP) + .long(options::LOOKUP) + .help("attempt to canonicalize hostnames via DNS"), + ) + .arg( + Arg::with_name(options::ONLY_HOSTNAME_USER) + .short("m") + .help("only hostname and user associated with stdin"), + ) + .arg( + Arg::with_name(options::PROCESS) + .long(options::PROCESS) + .short("p") + .help("print active processes spawned by init"), + ) + .arg( + Arg::with_name(options::COUNT) + .long(options::COUNT) + .short("q") + .help("all login names and number of users logged on"), + ) + .arg( + Arg::with_name(options::RUNLEVEL) + .long(options::RUNLEVEL) + .short("r") + .help(RUNLEVEL_HELP), + ) + .arg( + Arg::with_name(options::SHORT) + .long(options::SHORT) + .short("s") + .help("print only name, line, and time (default)"), + ) + .arg( + Arg::with_name(options::TIME) + .long(options::TIME) + .short("t") + .help("print last system clock change"), + ) + .arg( + Arg::with_name(options::USERS) + .long(options::USERS) + .short("u") + .help("list users logged in"), + ) + .arg( + Arg::with_name(options::MESG) + .long(options::MESG) + .short("T") + // .visible_short_alias('w') // TODO: requires clap "3.0.0-beta.2" + .visible_aliases(&["message", "writable"]) + .help("add user's message status as +, - or ?"), + ) + .arg( + Arg::with_name("w") // work around for `Arg::visible_short_alias` + .short("w") + .help("same as -T"), + ) + .arg( + Arg::with_name(options::FILE) + .takes_value(true) + .min_values(1) + .max_values(2), + ) + .get_matches_from(args); - let matches = opts.parse(args); + let files: Vec = matches + .values_of(options::FILE) + .map(|v| v.map(ToString::to_string).collect()) + .unwrap_or_default(); // If true, attempt to canonicalize hostnames via a DNS lookup. - let do_lookup = matches.opt_present("lookup"); + let do_lookup = matches.is_present(options::LOOKUP); // If true, display only a list of usernames and count of // the users logged on. // Ignored for 'who am i'. - let short_list = matches.opt_present("q"); + let short_list = matches.is_present(options::COUNT); // If true, display only name, line, and time fields. let mut short_output = false; @@ -92,12 +189,13 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let mut include_idle = false; // If true, display a line at the top describing each field. - let include_heading = matches.opt_present("H"); + let include_heading = matches.is_present(options::HEADING); // If true, display a '+' for each user if mesg y, a '-' if mesg n, // or a '?' if their tty cannot be statted. - let include_mesg = - matches.opt_present("a") || matches.opt_present("T") || matches.opt_present("w"); + let include_mesg = matches.is_present(options::ALL) + || matches.is_present(options::MESG) + || matches.is_present("w"); // If true, display process termination & exit status. let mut include_exit = false; @@ -130,7 +228,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { #[allow(clippy::useless_let_if_seq)] { - if matches.opt_present("a") { + if matches.is_present(options::ALL) { need_boottime = true; need_deadprocs = true; need_login = true; @@ -143,49 +241,49 @@ pub fn uumain(args: impl uucore::Args) -> i32 { assumptions = false; } - if matches.opt_present("b") { + if matches.is_present(options::BOOT) { need_boottime = true; assumptions = false; } - if matches.opt_present("d") { + if matches.is_present(options::DEAD) { need_deadprocs = true; include_idle = true; include_exit = true; assumptions = false; } - if matches.opt_present("l") { + if matches.is_present(options::LOGIN) { need_login = true; include_idle = true; assumptions = false; } - if matches.opt_present("m") || matches.free.len() == 2 { + if matches.is_present(options::ONLY_HOSTNAME_USER) || files.len() == 2 { my_line_only = true; } - if matches.opt_present("p") { + if matches.is_present(options::PROCESS) { need_initspawn = true; assumptions = false; } - if matches.opt_present("r") { + if matches.is_present(options::RUNLEVEL) { need_runlevel = true; include_idle = true; assumptions = false; } - if matches.opt_present("s") { + if matches.is_present(options::SHORT) { short_output = true; } - if matches.opt_present("t") { + if matches.is_present(options::TIME) { need_clockchange = true; assumptions = false; } - if matches.opt_present("u") { + if matches.is_present(options::USERS) { need_users = true; include_idle = true; assumptions = false; @@ -199,11 +297,6 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if include_exit { short_output = false; } - - if matches.free.len() > 2 { - show_usage_error!("{}", msg_wrong_number_of_arguments!()); - exit!(1); - } } let mut who = Who { @@ -222,8 +315,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { need_runlevel, need_users, my_line_only, - has_records: false, - args: matches.free, + args: files, }; who.exec(); @@ -247,7 +339,6 @@ struct Who { need_runlevel: bool, need_users: bool, my_line_only: bool, - has_records: bool, args: Vec, } @@ -296,15 +387,12 @@ fn current_tty() -> String { impl Who { fn exec(&mut self) { - let run_level_chk = |record: i16| { - #[allow(unused_assignments)] - let mut res = false; + let run_level_chk = |_record: i16| { + #[cfg(not(target_os = "linux"))] + return false; - #[cfg(any(target_vendor = "apple", target_os = "linux", target_os = "android"))] - { - res = record == utmpx::RUN_LVL; - } - res + #[cfg(target_os = "linux")] + return _record == utmpx::RUN_LVL; }; let f = if self.args.len() == 1 { @@ -321,8 +409,7 @@ impl Who { println!("{}", users.join(" ")); println!("# users={}", users.len()); } else { - let mut records = Utmpx::iter_all_records().read_from(f).peekable(); - self.has_records = records.peek().is_some(); + let records = Utmpx::iter_all_records().read_from(f).peekable(); if self.include_heading { self.print_heading() @@ -338,7 +425,9 @@ impl Who { if self.need_users && ut.is_user_process() { self.print_user(&ut); } else if self.need_runlevel && run_level_chk(ut.record_type()) { - self.print_runlevel(&ut); + if cfg!(target_os = "linux") { + self.print_runlevel(&ut); + } } else if self.need_boottime && ut.record_type() == utmpx::BOOT_TIME { self.print_boottime(&ut); } else if self.need_clockchange && ut.record_type() == utmpx::NEW_TIME { @@ -462,20 +551,10 @@ impl Who { " ?".into() }; - let mut buf = vec![]; - let ut_host = ut.host(); - let mut res = ut_host.splitn(2, ':'); - if let Some(h) = res.next() { - if self.do_lookup { - buf.push(ut.canon_host().unwrap_or_else(|_| h.to_owned())); - } else { - buf.push(h.to_owned()); - } + let mut s = ut.host(); + if self.do_lookup { + s = safe_unwrap!(ut.canon_host()); } - if let Some(h) = res.next() { - buf.push(h.to_owned()); - } - let s = buf.join(":"); let hoststr = if s.is_empty() { s } else { format!("({})", s) }; self.print_line( diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 855e64b36..482252680 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -16,6 +16,7 @@ edition = "2018" path="src/lib/lib.rs" [dependencies] +dns-lookup = "1.0.5" dunce = "1.0.0" getopts = "<= 0.2.21" wild = "2.0.4" @@ -24,11 +25,14 @@ thiserror = { version="1.0", optional=true } lazy_static = { version="1.3", optional=true } nix = { version="<= 0.13", optional=true } platform-info = { version="<= 0.1", optional=true } -time = { version="<= 0.1.42", optional=true } +time = { version="<= 0.1.43", optional=true } # * "problem" dependencies (pinned) data-encoding = { version="~2.1", optional=true } ## data-encoding: require v2.1; but v2.2.0 breaks the build for MinSRV v1.31.0 libc = { version="0.2.15, <= 0.2.85", optional=true } ## libc: initial utmp support added in v0.2.15; but v0.2.68 breaks the build for MinSRV v1.31.0 +[target.'cfg(target_os = "windows")'.dependencies] +winapi = { version = "0.3", features = ["errhandlingapi", "fileapi", "handleapi", "winerror"] } + [target.'cfg(target_os = "redox")'.dependencies] termion = "1.5" @@ -38,10 +42,12 @@ default = [] encoding = ["data-encoding", "thiserror"] entries = ["libc"] fs = ["libc"] +fsext = ["libc", "time"] mode = ["libc"] parse_time = [] perms = ["libc"] process = ["libc"] +ringbuffer = [] signals = [] utf8 = [] utmpx = ["time", "libc"] diff --git a/src/uucore/src/lib/features.rs b/src/uucore/src/lib/features.rs index c26225cb7..310a41fe1 100644 --- a/src/uucore/src/lib/features.rs +++ b/src/uucore/src/lib/features.rs @@ -4,8 +4,12 @@ pub mod encoding; #[cfg(feature = "fs")] pub mod fs; +#[cfg(feature = "fsext")] +pub mod fsext; #[cfg(feature = "parse_time")] pub mod parse_time; +#[cfg(feature = "ringbuffer")] +pub mod ringbuffer; #[cfg(feature = "zero-copy")] pub mod zero_copy; diff --git a/src/uucore/src/lib/features/fs.rs b/src/uucore/src/lib/features/fs.rs index a72d6ea82..afaa07af1 100644 --- a/src/uucore/src/lib/features/fs.rs +++ b/src/uucore/src/lib/features/fs.rs @@ -8,8 +8,9 @@ #[cfg(unix)] use libc::{ - mode_t, S_IRGRP, S_IROTH, S_IRUSR, S_ISGID, S_ISUID, S_ISVTX, S_IWGRP, S_IWOTH, S_IWUSR, - S_IXGRP, S_IXOTH, S_IXUSR, + mode_t, S_IFBLK, S_IFCHR, S_IFDIR, S_IFIFO, S_IFLNK, S_IFMT, S_IFREG, S_IFSOCK, S_IRGRP, + S_IROTH, S_IRUSR, S_ISGID, S_ISUID, S_ISVTX, S_IWGRP, S_IWOTH, S_IWUSR, S_IXGRP, S_IXOTH, + S_IXUSR, }; use std::borrow::Cow; use std::env; @@ -23,9 +24,10 @@ use std::os::unix::fs::MetadataExt; use std::path::{Component, Path, PathBuf}; #[cfg(unix)] +#[macro_export] macro_rules! has { ($mode:expr, $perm:expr) => { - $mode & ($perm as u32) != 0 + $mode & $perm != 0 }; } @@ -52,11 +54,19 @@ pub fn resolve_relative_path(path: &Path) -> Cow { result.into() } +/// Controls how symbolic links should be handled when canonicalizing a path. #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum CanonicalizeMode { + /// Do not resolve any symbolic links. None, + + /// Resolve all symbolic links. Normal, + + /// Resolve symbolic links, ignoring errors on the final component. Existing, + + /// Resolve symbolic links, ignoring errors on the non-final components. Missing, } @@ -123,6 +133,24 @@ fn resolve>(original: P) -> IOResult { Ok(result) } +/// Return the canonical, absolute form of a path. +/// +/// This function is a generalization of [`std::fs::canonicalize`] that +/// allows controlling how symbolic links are resolved and how to deal +/// with missing components. It returns the canonical, absolute form of +/// a path. The `can_mode` parameter controls how symbolic links are +/// resolved: +/// +/// * [`CanonicalizeMode::Normal`] makes this function behave like +/// [`std::fs::canonicalize`], resolving symbolic links and returning +/// an error if the path does not exist. +/// * [`CanonicalizeMode::Missing`] makes this function ignore non-final +/// components of the path that could not be resolved. +/// * [`CanonicalizeMode::Existing`] makes this function return an error +/// if the final component of the path does not exist. +/// * [`CanonicalizeMode::None`] makes this function not try to resolve +/// any symbolic links. +/// pub fn canonicalize>(original: P, can_mode: CanonicalizeMode) -> IOResult { // Create an absolute path let original = original.as_ref(); @@ -178,6 +206,10 @@ pub fn canonicalize>(original: P, can_mode: CanonicalizeMode) -> result.push(parts.last().unwrap()); + if can_mode == CanonicalizeMode::None { + return Ok(result); + } + match resolve(&result) { Err(e) => { if can_mode == CanonicalizeMode::Existing { @@ -240,22 +272,42 @@ pub fn is_stderr_interactive() -> bool { #[cfg(not(unix))] #[allow(unused_variables)] -pub fn display_permissions(metadata: &fs::Metadata) -> String { +pub fn display_permissions(metadata: &fs::Metadata, display_file_type: bool) -> String { + if display_file_type { + return String::from("----------"); + } String::from("---------") } #[cfg(unix)] -pub fn display_permissions(metadata: &fs::Metadata) -> String { +pub fn display_permissions(metadata: &fs::Metadata, display_file_type: bool) -> String { let mode: mode_t = metadata.mode() as mode_t; - display_permissions_unix(mode as u32) + display_permissions_unix(mode, display_file_type) } #[cfg(unix)] -pub fn display_permissions_unix(mode: u32) -> String { - let mut result = String::with_capacity(9); +pub fn display_permissions_unix(mode: mode_t, display_file_type: bool) -> String { + let mut result; + if display_file_type { + result = String::with_capacity(10); + result.push(match mode & S_IFMT { + S_IFDIR => 'd', + S_IFCHR => 'c', + S_IFBLK => 'b', + S_IFREG => '-', + S_IFIFO => 'p', + S_IFLNK => 'l', + S_IFSOCK => 's', + // TODO: Other file types + _ => '?', + }); + } else { + result = String::with_capacity(9); + } + result.push(if has!(mode, S_IRUSR) { 'r' } else { '-' }); result.push(if has!(mode, S_IWUSR) { 'w' } else { '-' }); - result.push(if has!(mode, S_ISUID) { + result.push(if has!(mode, S_ISUID as mode_t) { if has!(mode, S_IXUSR) { 's' } else { @@ -269,7 +321,7 @@ pub fn display_permissions_unix(mode: u32) -> String { result.push(if has!(mode, S_IRGRP) { 'r' } else { '-' }); result.push(if has!(mode, S_IWGRP) { 'w' } else { '-' }); - result.push(if has!(mode, S_ISGID) { + result.push(if has!(mode, S_ISGID as mode_t) { if has!(mode, S_IXGRP) { 's' } else { @@ -283,7 +335,7 @@ pub fn display_permissions_unix(mode: u32) -> String { result.push(if has!(mode, S_IROTH) { 'r' } else { '-' }); result.push(if has!(mode, S_IWOTH) { 'w' } else { '-' }); - result.push(if has!(mode, S_ISVTX) { + result.push(if has!(mode, S_ISVTX as mode_t) { if has!(mode, S_IXOTH) { 't' } else { @@ -355,4 +407,57 @@ mod tests { ); } } + + #[cfg(unix)] + #[test] + fn test_display_permissions() { + assert_eq!( + "drwxr-xr-x", + display_permissions_unix(S_IFDIR | 0o755, true) + ); + assert_eq!( + "rwxr-xr-x", + display_permissions_unix(S_IFDIR | 0o755, false) + ); + assert_eq!( + "-rw-r--r--", + display_permissions_unix(S_IFREG | 0o644, true) + ); + assert_eq!( + "srw-r-----", + display_permissions_unix(S_IFSOCK | 0o640, true) + ); + assert_eq!( + "lrw-r-xr-x", + display_permissions_unix(S_IFLNK | 0o655, true) + ); + assert_eq!("?rw-r-xr-x", display_permissions_unix(0o655, true)); + + assert_eq!( + "brwSr-xr-x", + display_permissions_unix(S_IFBLK | S_ISUID as mode_t | 0o655, true) + ); + assert_eq!( + "brwsr-xr-x", + display_permissions_unix(S_IFBLK | S_ISUID as mode_t | 0o755, true) + ); + + assert_eq!( + "prw---sr--", + display_permissions_unix(S_IFIFO | S_ISGID as mode_t | 0o614, true) + ); + assert_eq!( + "prw---Sr--", + display_permissions_unix(S_IFIFO | S_ISGID as mode_t | 0o604, true) + ); + + assert_eq!( + "c---r-xr-t", + display_permissions_unix(S_IFCHR | S_ISVTX as mode_t | 0o055, true) + ); + assert_eq!( + "c---r-xr-T", + display_permissions_unix(S_IFCHR | S_ISVTX as mode_t | 0o054, true) + ); + } } diff --git a/src/uucore/src/lib/features/fsext.rs b/src/uucore/src/lib/features/fsext.rs new file mode 100644 index 000000000..19c634b0b --- /dev/null +++ b/src/uucore/src/lib/features/fsext.rs @@ -0,0 +1,821 @@ +// This file is part of the uutils coreutils package. +// +// (c) Jian Zeng +// (c) Fangxu Hu +// (c) Sylvestre Ledru +// +// For the full copyright and license information, please view the LICENSE file +// that was distributed with this source code. + +// spell-checker:ignore (ToDO) strerror IFBLK IFCHR IFDIR IFLNK IFIFO IFMT IFREG IFSOCK subsec nanos gnulib statfs Sstatfs bitrig statvfs iosize blksize fnodes fsid namelen bsize bfree bavail ffree frsize namemax errno fstype adfs acfs aufs affs autofs befs bdevfs binfmt ceph cgroups cifs configfs cramfs cgroupfs debugfs devfs devpts ecryptfs btrfs efivarfs exofs fhgfs fuseblk fusectl futexfs gpfs hfsx hostfs hpfs inodefs ibrix inotifyfs isofs jffs logfs hugetlbfs mqueue nsfs ntfs ocfs panfs pipefs ramfs romfs nfsd nilfs pstorefs reiserfs securityfs smackfs snfs sockfs squashfs sysfs sysv tempfs tracefs ubifs usbdevfs vmhgfs tmpfs vxfs wslfs xenfs vzfs openprom overlayfs + +extern crate time; + +pub use crate::*; // import macros from `../../macros.rs` + +#[cfg(target_os = "linux")] +const LINUX_MTAB: &str = "/etc/mtab"; +#[cfg(target_os = "linux")] +const LINUX_MOUNTINFO: &str = "/proc/self/mountinfo"; +static MOUNT_OPT_BIND: &str = "bind"; +#[cfg(windows)] +const MAX_PATH: usize = 266; +#[cfg(not(unix))] +static EXIT_ERR: i32 = 1; + +#[cfg(windows)] +use std::ffi::OsString; +#[cfg(windows)] +use std::os::windows::ffi::OsStrExt; +#[cfg(windows)] +use std::os::windows::ffi::OsStringExt; +#[cfg(windows)] +use winapi::shared::minwindef::DWORD; +#[cfg(windows)] +use winapi::um::errhandlingapi::GetLastError; +#[cfg(windows)] +use winapi::um::fileapi::GetDiskFreeSpaceW; +#[cfg(windows)] +use winapi::um::fileapi::{ + FindFirstVolumeW, FindNextVolumeW, FindVolumeClose, GetDriveTypeW, GetVolumeInformationW, + GetVolumePathNamesForVolumeNameW, QueryDosDeviceW, +}; +#[cfg(windows)] +use winapi::um::handleapi::INVALID_HANDLE_VALUE; +#[cfg(windows)] +use winapi::um::winbase::DRIVE_REMOTE; + +#[cfg(windows)] +macro_rules! String2LPWSTR { + ($str: expr) => { + OsString::from($str.clone()) + .as_os_str() + .encode_wide() + .chain(Some(0)) + .collect::>() + .as_ptr() + }; +} + +#[cfg(windows)] +#[allow(non_snake_case)] +fn LPWSTR2String(buf: &[u16]) -> String { + let len = unsafe { libc::wcslen(buf.as_ptr()) }; + OsString::from_wide(&buf[..len as usize]) + .into_string() + .unwrap() +} + +use self::time::Timespec; +#[cfg(unix)] +use libc::{ + mode_t, strerror, S_IFBLK, S_IFCHR, S_IFDIR, S_IFIFO, S_IFLNK, S_IFMT, S_IFREG, S_IFSOCK, +}; +use std::borrow::Cow; +use std::convert::{AsRef, From}; +#[cfg(unix)] +use std::ffi::CString; +#[cfg(unix)] +use std::io::Error as IOError; +#[cfg(unix)] +use std::mem; +use std::path::Path; +use std::time::UNIX_EPOCH; + +#[cfg(any( + target_os = "linux", + target_vendor = "apple", + target_os = "android", + target_os = "freebsd" +))] +pub use libc::statfs as Sstatfs; +#[cfg(any( + target_os = "openbsd", + target_os = "netbsd", + target_os = "openbsd", + target_os = "bitrig", + target_os = "dragonfly" +))] +pub use libc::statvfs as Sstatfs; + +#[cfg(any( + target_os = "linux", + target_vendor = "apple", + target_os = "android", + target_os = "freebsd" +))] +pub use libc::statfs as statfs_fn; +#[cfg(any( + target_os = "openbsd", + target_os = "netbsd", + target_os = "openbsd", + target_os = "bitrig", + target_os = "dragonfly" +))] +pub use libc::statvfs as statfs_fn; + +pub trait BirthTime { + fn pretty_birth(&self) -> String; + fn birth(&self) -> String; +} + +use std::fs::Metadata; +impl BirthTime for Metadata { + fn pretty_birth(&self) -> String { + self.created() + .ok() + .and_then(|t| t.duration_since(UNIX_EPOCH).ok()) + .map(|e| pretty_time(e.as_secs() as i64, i64::from(e.subsec_nanos()))) + .unwrap_or_else(|| "-".to_owned()) + } + + fn birth(&self) -> String { + self.created() + .ok() + .and_then(|t| t.duration_since(UNIX_EPOCH).ok()) + .map(|e| format!("{}", e.as_secs())) + .unwrap_or_else(|| "0".to_owned()) + } +} + +#[derive(Debug, Clone)] +pub struct MountInfo { + // it stores `volume_name` in windows platform and `dev_id` in unix platform + pub dev_id: String, + pub dev_name: String, + pub fs_type: String, + pub mount_dir: String, + pub mount_option: String, // we only care "bind" option + pub mount_root: String, + pub remote: bool, + pub dummy: bool, +} + +impl MountInfo { + fn set_missing_fields(&mut self) { + #[cfg(unix)] + { + // We want to keep the dev_id on Windows + // but set dev_id + let path = CString::new(self.mount_dir.clone()).unwrap(); + unsafe { + let mut stat = mem::zeroed(); + if libc::stat(path.as_ptr(), &mut stat) == 0 { + self.dev_id = (stat.st_dev as i32).to_string(); + } else { + self.dev_id = "".to_string(); + } + } + } + // set MountInfo::dummy + match self.fs_type.as_ref() { + "autofs" | "proc" | "subfs" + /* for Linux 2.6/3.x */ + | "debugfs" | "devpts" | "fusectl" | "mqueue" | "rpc_pipefs" | "sysfs" + /* FreeBSD, Linux 2.4 */ + | "devfs" + /* for NetBSD 3.0 */ + | "kernfs" + /* for Irix 6.5 */ + | "ignore" => self.dummy = true, + _ => self.dummy = self.fs_type == "none" + && self.mount_option.find(MOUNT_OPT_BIND).is_none(), + } + // set MountInfo::remote + #[cfg(windows)] + { + self.remote = DRIVE_REMOTE == unsafe { GetDriveTypeW(String2LPWSTR!(self.mount_root)) }; + } + #[cfg(unix)] + { + if self.dev_name.find(':').is_some() + || (self.dev_name.starts_with("//") && self.fs_type == "smbfs" + || self.fs_type == "cifs") + || self.dev_name == "-hosts" + { + self.remote = true; + } else { + self.remote = false; + } + } + } + + #[cfg(target_os = "linux")] + fn new(file_name: &str, raw: Vec<&str>) -> Option { + match file_name { + // Format: 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue + // "man proc" for more details + LINUX_MOUNTINFO => { + let mut m = MountInfo { + dev_id: "".to_string(), + dev_name: raw[9].to_string(), + fs_type: raw[8].to_string(), + mount_root: raw[3].to_string(), + mount_dir: raw[4].to_string(), + mount_option: raw[5].to_string(), + remote: false, + dummy: false, + }; + m.set_missing_fields(); + Some(m) + } + LINUX_MTAB => { + let mut m = MountInfo { + dev_id: "".to_string(), + dev_name: raw[0].to_string(), + fs_type: raw[2].to_string(), + mount_root: "".to_string(), + mount_dir: raw[1].to_string(), + mount_option: raw[3].to_string(), + remote: false, + dummy: false, + }; + m.set_missing_fields(); + Some(m) + } + _ => None, + } + } + #[cfg(windows)] + fn new(mut volume_name: String) -> Option { + let mut dev_name_buf = [0u16; MAX_PATH]; + volume_name.pop(); + unsafe { + QueryDosDeviceW( + OsString::from(volume_name.clone()) + .as_os_str() + .encode_wide() + .chain(Some(0)) + .skip(4) + .collect::>() + .as_ptr(), + dev_name_buf.as_mut_ptr(), + dev_name_buf.len() as DWORD, + ) + }; + volume_name.push('\\'); + let dev_name = LPWSTR2String(&dev_name_buf); + + let mut mount_root_buf = [0u16; MAX_PATH]; + let success = unsafe { + GetVolumePathNamesForVolumeNameW( + String2LPWSTR!(volume_name), + mount_root_buf.as_mut_ptr(), + mount_root_buf.len() as DWORD, + ptr::null_mut(), + ) + }; + if 0 == success { + // TODO: support the case when `GetLastError()` returns `ERROR_MORE_DATA` + return None; + } + let mount_root = LPWSTR2String(&mount_root_buf); + + let mut fs_type_buf = [0u16; MAX_PATH]; + let success = unsafe { + GetVolumeInformationW( + String2LPWSTR!(mount_root), + ptr::null_mut(), + 0, + ptr::null_mut(), + ptr::null_mut(), + ptr::null_mut(), + fs_type_buf.as_mut_ptr(), + fs_type_buf.len() as DWORD, + ) + }; + let fs_type = if 0 != success { + Some(LPWSTR2String(&fs_type_buf)) + } else { + None + }; + let mut mn_info = MountInfo { + dev_id: volume_name, + dev_name, + fs_type: fs_type.unwrap_or_else(|| "".to_string()), + mount_root, + mount_dir: "".to_string(), + mount_option: "".to_string(), + remote: false, + dummy: false, + }; + mn_info.set_missing_fields(); + Some(mn_info) + } +} + +#[cfg(any(target_vendor = "apple", target_os = "freebsd"))] +use std::ffi::CStr; +#[cfg(any(target_os = "freebsd", target_vendor = "apple"))] +impl From for MountInfo { + fn from(statfs: Sstatfs) -> Self { + let mut info = MountInfo { + dev_id: "".to_string(), + dev_name: unsafe { + CStr::from_ptr(&statfs.f_mntfromname[0]) + .to_string_lossy() + .into_owned() + }, + fs_type: unsafe { + CStr::from_ptr(&statfs.f_fstypename[0]) + .to_string_lossy() + .into_owned() + }, + mount_dir: unsafe { + CStr::from_ptr(&statfs.f_mntonname[0]) + .to_string_lossy() + .into_owned() + }, + mount_root: "".to_string(), + mount_option: "".to_string(), + remote: false, + dummy: false, + }; + info.set_missing_fields(); + info + } +} + +#[cfg(any(target_os = "freebsd", target_vendor = "apple"))] +use libc::c_int; +#[cfg(any(target_os = "freebsd", target_vendor = "apple"))] +extern "C" { + #[cfg(all(target_vendor = "apple", target_arch = "x86_64"))] + #[link_name = "getmntinfo$INODE64"] + fn getmntinfo(mntbufp: *mut *mut Sstatfs, flags: c_int) -> c_int; + + #[cfg(any( + all(target_os = "freebsd"), + all(target_vendor = "apple", target_arch = "aarch64") + ))] + fn getmntinfo(mntbufp: *mut *mut Sstatfs, flags: c_int) -> c_int; +} + +#[cfg(target_os = "linux")] +use std::fs::File; +#[cfg(target_os = "linux")] +use std::io::{BufRead, BufReader}; +#[cfg(any(target_vendor = "apple", target_os = "freebsd", target_os = "windows"))] +use std::ptr; +#[cfg(any(target_vendor = "apple", target_os = "freebsd"))] +use std::slice; +/// Read file system list. +pub fn read_fs_list() -> Vec { + #[cfg(target_os = "linux")] + { + let (file_name, fobj) = File::open(LINUX_MOUNTINFO) + .map(|f| (LINUX_MOUNTINFO, f)) + .or_else(|_| File::open(LINUX_MTAB).map(|f| (LINUX_MTAB, f))) + .expect("failed to find mount list files"); + let reader = BufReader::new(fobj); + reader + .lines() + .filter_map(|line| line.ok()) + .filter_map(|line| { + let raw_data = line.split_whitespace().collect::>(); + MountInfo::new(file_name, raw_data) + }) + .collect::>() + } + #[cfg(any(target_os = "freebsd", target_vendor = "apple"))] + { + let mut mptr: *mut Sstatfs = ptr::null_mut(); + let len = unsafe { getmntinfo(&mut mptr, 1_i32) }; + if len < 0 { + crash!(1, "getmntinfo failed"); + } + let mounts = unsafe { slice::from_raw_parts(mptr, len as usize) }; + mounts + .iter() + .map(|m| MountInfo::from(*m)) + .collect::>() + } + #[cfg(windows)] + { + let mut volume_name_buf = [0u16; MAX_PATH]; + // As recommended in the MS documentation, retrieve the first volume before the others + let find_handle = unsafe { + FindFirstVolumeW(volume_name_buf.as_mut_ptr(), volume_name_buf.len() as DWORD) + }; + if INVALID_HANDLE_VALUE == find_handle { + crash!(EXIT_ERR, "FindFirstVolumeW failed: {}", unsafe { + GetLastError() + }); + } + let mut mounts = Vec::::new(); + loop { + let volume_name = LPWSTR2String(&volume_name_buf); + if !volume_name.starts_with("\\\\?\\") || !volume_name.ends_with('\\') { + show_warning!("A bad path was skipped: {}", volume_name); + continue; + } + if let Some(m) = MountInfo::new(volume_name) { + mounts.push(m); + } + if 0 == unsafe { + FindNextVolumeW( + find_handle, + volume_name_buf.as_mut_ptr(), + volume_name_buf.len() as DWORD, + ) + } { + let err = unsafe { GetLastError() }; + if err != winapi::shared::winerror::ERROR_NO_MORE_FILES { + crash!(EXIT_ERR, "FindNextVolumeW failed: {}", err); + } + break; + } + } + unsafe { + FindVolumeClose(find_handle); + } + mounts + } +} + +#[derive(Debug, Clone)] +pub struct FsUsage { + pub blocksize: u64, + pub blocks: u64, + pub bfree: u64, + pub bavail: u64, + pub bavail_top_bit_set: bool, + pub files: u64, + pub ffree: u64, +} + +impl FsUsage { + #[cfg(unix)] + pub fn new(statvfs: Sstatfs) -> FsUsage { + { + FsUsage { + blocksize: statvfs.f_bsize as u64, // or `statvfs.f_frsize` ? + blocks: statvfs.f_blocks as u64, + bfree: statvfs.f_bfree as u64, + bavail: statvfs.f_bavail as u64, + bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1))) != 0, + files: statvfs.f_files as u64, + ffree: statvfs.f_ffree as u64, + } + } + } + #[cfg(not(unix))] + pub fn new(path: &Path) -> FsUsage { + let mut root_path = [0u16; MAX_PATH]; + let success = unsafe { + GetVolumePathNamesForVolumeNameW( + //path_utf8.as_ptr(), + String2LPWSTR!(path.as_os_str()), + root_path.as_mut_ptr(), + root_path.len() as DWORD, + ptr::null_mut(), + ) + }; + if 0 == success { + crash!( + EXIT_ERR, + "GetVolumePathNamesForVolumeNameW failed: {}", + unsafe { GetLastError() } + ); + } + + let mut sectors_per_cluster = 0; + let mut bytes_per_sector = 0; + let mut number_of_free_clusters = 0; + let mut total_number_of_clusters = 0; + + let success = unsafe { + GetDiskFreeSpaceW( + String2LPWSTR!(path.as_os_str()), + &mut sectors_per_cluster, + &mut bytes_per_sector, + &mut number_of_free_clusters, + &mut total_number_of_clusters, + ) + }; + if 0 == success { + // Fails in case of CD for example + //crash!(EXIT_ERR, "GetDiskFreeSpaceW failed: {}", unsafe { + //GetLastError() + //}); + } + + let bytes_per_cluster = sectors_per_cluster as u64 * bytes_per_sector as u64; + FsUsage { + // f_bsize File system block size. + blocksize: bytes_per_cluster as u64, + // f_blocks - Total number of blocks on the file system, in units of f_frsize. + // frsize = Fundamental file system block size (fragment size). + blocks: total_number_of_clusters as u64, + // Total number of free blocks. + bfree: number_of_free_clusters as u64, + // Total number of free blocks available to non-privileged processes. + bavail: 0, + bavail_top_bit_set: ((bytes_per_sector as u64) & (1u64.rotate_right(1))) != 0, + // Total number of file nodes (inodes) on the file system. + files: 0, // Not available on windows + // Total number of free file nodes (inodes). + ffree: 4096, // Meaningless on Windows + } + } +} + +#[cfg(unix)] +pub trait FsMeta { + fn fs_type(&self) -> i64; + fn iosize(&self) -> u64; + fn blksize(&self) -> i64; + fn total_blocks(&self) -> u64; + fn free_blocks(&self) -> u64; + fn avail_blocks(&self) -> u64; + fn total_fnodes(&self) -> u64; + fn free_fnodes(&self) -> u64; + fn fsid(&self) -> u64; + fn namelen(&self) -> u64; +} + +#[cfg(unix)] +impl FsMeta for Sstatfs { + fn blksize(&self) -> i64 { + self.f_bsize as i64 + } + fn total_blocks(&self) -> u64 { + self.f_blocks as u64 + } + fn free_blocks(&self) -> u64 { + self.f_bfree as u64 + } + fn avail_blocks(&self) -> u64 { + self.f_bavail as u64 + } + fn total_fnodes(&self) -> u64 { + self.f_files as u64 + } + fn free_fnodes(&self) -> u64 { + self.f_ffree as u64 + } + #[cfg(any(target_os = "linux", target_vendor = "apple", target_os = "freebsd"))] + fn fs_type(&self) -> i64 { + self.f_type as i64 + } + #[cfg(not(any(target_os = "linux", target_vendor = "apple", target_os = "freebsd")))] + fn fs_type(&self) -> i64 { + // FIXME: statvfs doesn't have an equivalent, so we need to do something else + unimplemented!() + } + + #[cfg(target_os = "linux")] + fn iosize(&self) -> u64 { + self.f_frsize as u64 + } + #[cfg(any(target_vendor = "apple", target_os = "freebsd"))] + fn iosize(&self) -> u64 { + self.f_iosize as u64 + } + // XXX: dunno if this is right + #[cfg(not(any(target_vendor = "apple", target_os = "freebsd", target_os = "linux")))] + fn iosize(&self) -> u64 { + self.f_bsize as u64 + } + + // Linux, SunOS, HP-UX, 4.4BSD, FreeBSD have a system call statfs() that returns + // a struct statfs, containing a fsid_t f_fsid, where fsid_t is defined + // as struct { int val[2]; } + // + // Solaris, Irix and POSIX have a system call statvfs(2) that returns a + // struct statvfs, containing an unsigned long f_fsid + #[cfg(any(target_vendor = "apple", target_os = "freebsd", target_os = "linux"))] + fn fsid(&self) -> u64 { + let f_fsid: &[u32; 2] = + unsafe { &*(&self.f_fsid as *const libc::fsid_t as *const [u32; 2]) }; + (u64::from(f_fsid[0])) << 32 | u64::from(f_fsid[1]) + } + #[cfg(not(any(target_vendor = "apple", target_os = "freebsd", target_os = "linux")))] + fn fsid(&self) -> u64 { + self.f_fsid as u64 + } + + #[cfg(target_os = "linux")] + fn namelen(&self) -> u64 { + self.f_namelen as u64 + } + #[cfg(target_vendor = "apple")] + fn namelen(&self) -> u64 { + 1024 + } + #[cfg(target_os = "freebsd")] + fn namelen(&self) -> u64 { + self.f_namemax as u64 + } + // XXX: should everything just use statvfs? + #[cfg(not(any(target_vendor = "apple", target_os = "freebsd", target_os = "linux")))] + fn namelen(&self) -> u64 { + self.f_namemax as u64 + } +} + +#[cfg(unix)] +pub fn statfs>(path: P) -> Result +where + Vec: From

, +{ + match CString::new(path) { + Ok(p) => { + let mut buffer: Sstatfs = unsafe { mem::zeroed() }; + unsafe { + match statfs_fn(p.as_ptr(), &mut buffer) { + 0 => Ok(buffer), + _ => { + let errno = IOError::last_os_error().raw_os_error().unwrap_or(0); + Err(CString::from_raw(strerror(errno)) + .into_string() + .unwrap_or_else(|_| "Unknown Error".to_owned())) + } + } + } + } + Err(e) => Err(e.to_string()), + } +} + +pub fn pretty_time(sec: i64, nsec: i64) -> String { + // sec == seconds since UNIX_EPOCH + // nsec == nanoseconds since (UNIX_EPOCH + sec) + let tm = time::at(Timespec::new(sec, nsec as i32)); + let res = time::strftime("%Y-%m-%d %H:%M:%S.%f %z", &tm).unwrap(); + if res.ends_with(" -0000") { + res.replace(" -0000", " +0000") + } else { + res + } +} + +#[cfg(unix)] +pub fn pretty_filetype<'a>(mode: mode_t, size: u64) -> &'a str { + match mode & S_IFMT { + S_IFREG => { + if size != 0 { + "regular file" + } else { + "regular empty file" + } + } + S_IFDIR => "directory", + S_IFLNK => "symbolic link", + S_IFCHR => "character special file", + S_IFBLK => "block special file", + S_IFIFO => "fifo", + S_IFSOCK => "socket", + // TODO: Other file types + // See coreutils/gnulib/lib/file-type.c + _ => "weird file", + } +} + +pub fn pretty_fstype<'a>(fstype: i64) -> Cow<'a, str> { + match fstype { + 0x6163_6673 => "acfs".into(), + 0xADF5 => "adfs".into(), + 0xADFF => "affs".into(), + 0x5346_414F => "afs".into(), + 0x0904_1934 => "anon-inode FS".into(), + 0x6175_6673 => "aufs".into(), + 0x0187 => "autofs".into(), + 0x4246_5331 => "befs".into(), + 0x6264_6576 => "bdevfs".into(), + 0x1BAD_FACE => "bfs".into(), + 0xCAFE_4A11 => "bpf_fs".into(), + 0x4249_4E4D => "binfmt_misc".into(), + 0x9123_683E => "btrfs".into(), + 0x7372_7279 => "btrfs_test".into(), + 0x00C3_6400 => "ceph".into(), + 0x0027_E0EB => "cgroupfs".into(), + 0xFF53_4D42 => "cifs".into(), + 0x7375_7245 => "coda".into(), + 0x012F_F7B7 => "coh".into(), + 0x6265_6570 => "configfs".into(), + 0x28CD_3D45 => "cramfs".into(), + 0x453D_CD28 => "cramfs-wend".into(), + 0x6462_6720 => "debugfs".into(), + 0x1373 => "devfs".into(), + 0x1CD1 => "devpts".into(), + 0xF15F => "ecryptfs".into(), + 0xDE5E_81E4 => "efivarfs".into(), + 0x0041_4A53 => "efs".into(), + 0x5DF5 => "exofs".into(), + 0x137D => "ext".into(), + 0xEF53 => "ext2/ext3".into(), + 0xEF51 => "ext2".into(), + 0xF2F5_2010 => "f2fs".into(), + 0x4006 => "fat".into(), + 0x1983_0326 => "fhgfs".into(), + 0x6573_5546 => "fuseblk".into(), + 0x6573_5543 => "fusectl".into(), + 0x0BAD_1DEA => "futexfs".into(), + 0x0116_1970 => "gfs/gfs2".into(), + 0x4750_4653 => "gpfs".into(), + 0x4244 => "hfs".into(), + 0x482B => "hfs+".into(), + 0x4858 => "hfsx".into(), + 0x00C0_FFEE => "hostfs".into(), + 0xF995_E849 => "hpfs".into(), + 0x9584_58F6 => "hugetlbfs".into(), + 0x1130_7854 => "inodefs".into(), + 0x0131_11A8 => "ibrix".into(), + 0x2BAD_1DEA => "inotifyfs".into(), + 0x9660 => "isofs".into(), + 0x4004 => "isofs".into(), + 0x4000 => "isofs".into(), + 0x07C0 => "jffs".into(), + 0x72B6 => "jffs2".into(), + 0x3153_464A => "jfs".into(), + 0x6B41_4653 => "k-afs".into(), + 0xC97E_8168 => "logfs".into(), + 0x0BD0_0BD0 => "lustre".into(), + 0x5346_314D => "m1fs".into(), + 0x137F => "minix".into(), + 0x138F => "minix (30 char.)".into(), + 0x2468 => "minix v2".into(), + 0x2478 => "minix v2 (30 char.)".into(), + 0x4D5A => "minix3".into(), + 0x1980_0202 => "mqueue".into(), + 0x4D44 => "msdos".into(), + 0x564C => "novell".into(), + 0x6969 => "nfs".into(), + 0x6E66_7364 => "nfsd".into(), + 0x3434 => "nilfs".into(), + 0x6E73_6673 => "nsfs".into(), + 0x5346_544E => "ntfs".into(), + 0x9FA1 => "openprom".into(), + 0x7461_636F => "ocfs2".into(), + 0x794C_7630 => "overlayfs".into(), + 0xAAD7_AAEA => "panfs".into(), + 0x5049_5045 => "pipefs".into(), + 0x7C7C_6673 => "prl_fs".into(), + 0x9FA0 => "proc".into(), + 0x6165_676C => "pstorefs".into(), + 0x002F => "qnx4".into(), + 0x6819_1122 => "qnx6".into(), + 0x8584_58F6 => "ramfs".into(), + 0x5265_4973 => "reiserfs".into(), + 0x7275 => "romfs".into(), + 0x6759_6969 => "rpc_pipefs".into(), + 0x7363_6673 => "securityfs".into(), + 0xF97C_FF8C => "selinux".into(), + 0x4341_5D53 => "smackfs".into(), + 0x517B => "smb".into(), + 0xFE53_4D42 => "smb2".into(), + 0xBEEF_DEAD => "snfs".into(), + 0x534F_434B => "sockfs".into(), + 0x7371_7368 => "squashfs".into(), + 0x6265_6572 => "sysfs".into(), + 0x012F_F7B6 => "sysv2".into(), + 0x012F_F7B5 => "sysv4".into(), + 0x0102_1994 => "tmpfs".into(), + 0x7472_6163 => "tracefs".into(), + 0x2405_1905 => "ubifs".into(), + 0x1501_3346 => "udf".into(), + 0x0001_1954 => "ufs".into(), + 0x5419_0100 => "ufs".into(), + 0x9FA2 => "usbdevfs".into(), + 0x0102_1997 => "v9fs".into(), + 0xBACB_ACBC => "vmhgfs".into(), + 0xA501_FCF5 => "vxfs".into(), + 0x565A_4653 => "vzfs".into(), + 0x5346_4846 => "wslfs".into(), + 0xABBA_1974 => "xenfs".into(), + 0x012F_F7B4 => "xenix".into(), + 0x5846_5342 => "xfs".into(), + 0x012F_D16D => "xia".into(), + 0x2FC1_2FC1 => "zfs".into(), + other => format!("UNKNOWN ({:#x})", other).into(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[cfg(unix)] + fn test_file_type() { + assert_eq!("block special file", pretty_filetype(S_IFBLK, 0)); + assert_eq!("character special file", pretty_filetype(S_IFCHR, 0)); + assert_eq!("regular file", pretty_filetype(S_IFREG, 1)); + assert_eq!("regular empty file", pretty_filetype(S_IFREG, 0)); + assert_eq!("weird file", pretty_filetype(0, 0)); + } + + #[test] + fn test_fs_type() { + assert_eq!("ext2/ext3", pretty_fstype(0xEF53)); + assert_eq!("tmpfs", pretty_fstype(0x01021994)); + assert_eq!("nfs", pretty_fstype(0x6969)); + assert_eq!("btrfs", pretty_fstype(0x9123683e)); + assert_eq!("xfs", pretty_fstype(0x58465342)); + assert_eq!("zfs", pretty_fstype(0x2FC12FC1)); + assert_eq!("ntfs", pretty_fstype(0x5346544e)); + assert_eq!("fat", pretty_fstype(0x4006)); + assert_eq!("UNKNOWN (0x1234)", pretty_fstype(0x1234)); + } +} diff --git a/src/uucore/src/lib/features/mode.rs b/src/uucore/src/lib/features/mode.rs index 8b5e71799..4fb5a6509 100644 --- a/src/uucore/src/lib/features/mode.rs +++ b/src/uucore/src/lib/features/mode.rs @@ -7,6 +7,8 @@ // spell-checker:ignore (vars) fperm srwx +use libc::{mode_t, S_IRGRP, S_IROTH, S_IRUSR, S_IWGRP, S_IWOTH, S_IWUSR}; + pub fn parse_numeric(fperm: u32, mut mode: &str) -> Result { let (op, pos) = parse_op(mode, Some('='))?; mode = mode[pos..].trim().trim_start_matches('0'); @@ -129,3 +131,36 @@ fn parse_change(mode: &str, fperm: u32, considering_dir: bool) -> (u32, usize) { } (srwx, pos) } + +pub fn parse_mode(mode: &str) -> Result { + let fperm = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; + let arr: &[char] = &['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; + let result = if mode.contains(arr) { + parse_numeric(fperm as u32, mode) + } else { + parse_symbolic(fperm as u32, mode, true) + }; + result.map(|mode| mode as mode_t) +} + +#[cfg(test)] +mod test { + + #[test] + fn symbolic_modes() { + assert_eq!(super::parse_mode("u+x").unwrap(), 0o766); + assert_eq!( + super::parse_mode("+x").unwrap(), + if !crate::os::is_wsl_1() { 0o777 } else { 0o776 } + ); + assert_eq!(super::parse_mode("a-w").unwrap(), 0o444); + assert_eq!(super::parse_mode("g-r").unwrap(), 0o626); + } + + #[test] + fn numeric_modes() { + assert_eq!(super::parse_mode("644").unwrap(), 0o644); + assert_eq!(super::parse_mode("+100").unwrap(), 0o766); + assert_eq!(super::parse_mode("-4").unwrap(), 0o662); + } +} diff --git a/src/uucore/src/lib/features/perms.rs b/src/uucore/src/lib/features/perms.rs index 66db15451..36f56206d 100644 --- a/src/uucore/src/lib/features/perms.rs +++ b/src/uucore/src/lib/features/perms.rs @@ -31,9 +31,9 @@ fn chgrp>(path: P, dgid: gid_t, follow: bool) -> IOResult<()> { let s = CString::new(path.as_os_str().as_bytes()).unwrap(); let ret = unsafe { if follow { - libc::chown(s.as_ptr(), (0 as gid_t).wrapping_sub(1), dgid) + libc::chown(s.as_ptr(), 0_u32.wrapping_sub(1), dgid) } else { - lchown(s.as_ptr(), (0 as gid_t).wrapping_sub(1), dgid) + lchown(s.as_ptr(), 0_u32.wrapping_sub(1), dgid) } }; if ret == 0 { diff --git a/src/uucore/src/lib/features/ringbuffer.rs b/src/uucore/src/lib/features/ringbuffer.rs new file mode 100644 index 000000000..60847df8f --- /dev/null +++ b/src/uucore/src/lib/features/ringbuffer.rs @@ -0,0 +1,134 @@ +//! A fixed-size ring buffer. +use std::collections::VecDeque; + +/// A fixed-size ring buffer backed by a `VecDeque`. +/// +/// If the ring buffer is not full, then calling the [`push_back`] +/// method appends elements, as in a [`VecDeque`]. If the ring buffer +/// is full, then calling [`push_back`] removes the element at the +/// front of the buffer (in a first-in, first-out manner) before +/// appending the new element to the back of the buffer. +/// +/// Use [`from_iter`] to take the last `size` elements from an +/// iterator. +/// +/// # Examples +/// +/// After exceeding the size limit, the oldest elements are dropped in +/// favor of the newest element: +/// +/// ```rust,ignore +/// let mut buffer: RingBuffer = RingBuffer::new(2); +/// buffer.push_back(0); +/// buffer.push_back(1); +/// buffer.push_back(2); +/// assert_eq!(vec![1, 2], buffer.data); +/// ``` +/// +/// Take the last `n` elements from an iterator: +/// +/// ```rust,ignore +/// let iter = [0, 1, 2].iter(); +/// let actual = RingBuffer::from_iter(iter, 2).data; +/// let expected = VecDeque::from_iter([1, 2].iter()); +/// assert_eq!(expected, actual); +/// ``` +pub struct RingBuffer { + pub data: VecDeque, + size: usize, +} + +impl RingBuffer { + pub fn new(size: usize) -> RingBuffer { + RingBuffer { + data: VecDeque::new(), + size, + } + } + + pub fn from_iter(iter: impl Iterator, size: usize) -> RingBuffer { + let mut ringbuf = RingBuffer::new(size); + for value in iter { + ringbuf.push_back(value); + } + ringbuf + } + + /// Append a value to the end of the ring buffer. + /// + /// If the ring buffer is not full, this method return [`None`]. If + /// the ring buffer is full, appending a new element will cause the + /// oldest element to be evicted. In that case this method returns + /// that element, or `None`. + /// + /// In the special case where the size limit is zero, each call to + /// this method with input `value` returns `Some(value)`, because + /// the input is immediately evicted. + /// + /// # Examples + /// + /// Appending an element when the buffer is full returns the oldest + /// element: + /// + /// ```rust,ignore + /// let mut buf = RingBuffer::new(3); + /// assert_eq!(None, buf.push_back(0)); + /// assert_eq!(None, buf.push_back(1)); + /// assert_eq!(None, buf.push_back(2)); + /// assert_eq!(Some(0), buf.push_back(3)); + /// ``` + /// + /// If the size limit is zero, then this method always returns the + /// input value: + /// + /// ```rust,ignore + /// let mut buf = RingBuffer::new(0); + /// assert_eq!(Some(0), buf.push_back(0)); + /// assert_eq!(Some(1), buf.push_back(1)); + /// assert_eq!(Some(2), buf.push_back(2)); + /// ``` + pub fn push_back(&mut self, value: T) -> Option { + if self.size == 0 { + return Some(value); + } + let result = if self.size <= self.data.len() { + self.data.pop_front() + } else { + None + }; + self.data.push_back(value); + result + } +} + +#[cfg(test)] +mod tests { + + use crate::ringbuffer::RingBuffer; + use std::collections::VecDeque; + use std::iter::FromIterator; + + #[test] + fn test_size_limit_zero() { + let mut buf = RingBuffer::new(0); + assert_eq!(Some(0), buf.push_back(0)); + assert_eq!(Some(1), buf.push_back(1)); + assert_eq!(Some(2), buf.push_back(2)); + } + + #[test] + fn test_evict_oldest() { + let mut buf = RingBuffer::new(2); + assert_eq!(None, buf.push_back(0)); + assert_eq!(None, buf.push_back(1)); + assert_eq!(Some(0), buf.push_back(2)); + } + + #[test] + fn test_from_iter() { + let iter = [0, 1, 2].iter(); + let actual = RingBuffer::from_iter(iter, 2).data; + let expected = VecDeque::from_iter([1, 2].iter()); + assert_eq!(expected, actual); + } +} diff --git a/src/uucore/src/lib/features/utmpx.rs b/src/uucore/src/lib/features/utmpx.rs index 0308d8a5e..826831ba6 100644 --- a/src/uucore/src/lib/features/utmpx.rs +++ b/src/uucore/src/lib/features/utmpx.rs @@ -54,6 +54,8 @@ pub unsafe extern "C" fn utmpxname(_file: *const libc::c_char) -> libc::c_int { 0 } +pub use crate::*; // import macros from `../../macros.rs` + // In case the c_char array doesn't end with NULL macro_rules! chars2string { ($arr:expr) => { @@ -188,47 +190,40 @@ impl Utmpx { /// Canonicalize host name using DNS pub fn canon_host(&self) -> IOResult { - const AI_CANONNAME: libc::c_int = 0x2; let host = self.host(); - let host = host.split(':').next().unwrap(); - let hints = libc::addrinfo { - ai_flags: AI_CANONNAME, - ai_family: 0, - ai_socktype: 0, - ai_protocol: 0, - ai_addrlen: 0, - ai_addr: ptr::null_mut(), - ai_canonname: ptr::null_mut(), - ai_next: ptr::null_mut(), - }; - let c_host = CString::new(host).unwrap(); - let mut res = ptr::null_mut(); - let status = unsafe { - libc::getaddrinfo( - c_host.as_ptr(), - ptr::null(), - &hints as *const _, - &mut res as *mut _, - ) - }; - if status == 0 { - let info: libc::addrinfo = unsafe { ptr::read(res as *const _) }; - // http://lists.gnu.org/archive/html/bug-coreutils/2006-09/msg00300.html - // says Darwin 7.9.0 getaddrinfo returns 0 but sets - // res->ai_canonname to NULL. - let ret = if info.ai_canonname.is_null() { - Ok(String::from(host)) - } else { - Ok(unsafe { CString::from_raw(info.ai_canonname).into_string().unwrap() }) + + // TODO: change to use `split_once` when MSRV hits 1.52.0 + // let (hostname, display) = host.split_once(':').unwrap_or((&host, "")); + let mut h = host.split(':'); + let hostname = h.next().unwrap_or(&host); + let display = h.next().unwrap_or(""); + + if !hostname.is_empty() { + extern crate dns_lookup; + use dns_lookup::{getaddrinfo, AddrInfoHints}; + + const AI_CANONNAME: i32 = 0x2; + let hints = AddrInfoHints { + flags: AI_CANONNAME, + ..AddrInfoHints::default() }; - unsafe { - libc::freeaddrinfo(res); + let sockets = getaddrinfo(Some(&hostname), None, Some(hints)) + .unwrap() + .collect::>>()?; + for socket in sockets { + if let Some(ai_canonname) = socket.canonname { + return Ok(if display.is_empty() { + ai_canonname + } else { + format!("{}:{}", ai_canonname, display) + }); + } } - ret - } else { - Err(IOError::last_os_error()) } + + Ok(host.to_string()) } + pub fn iter_all_records() -> UtmpxIter { UtmpxIter } @@ -247,7 +242,7 @@ impl UtmpxIter { utmpxname(cstr.as_ptr()) }; if res != 0 { - println!("Warning: {}", IOError::last_os_error()); + show_warning!("utmpxname: {}", IOError::last_os_error()); } unsafe { setutxent(); diff --git a/src/uucore/src/lib/lib.rs b/src/uucore/src/lib/lib.rs index 324095b6a..c17f14516 100644 --- a/src/uucore/src/lib/lib.rs +++ b/src/uucore/src/lib/lib.rs @@ -25,7 +25,9 @@ mod features; // feature-gated code modules mod mods; // core cross-platform modules // * cross-platform modules +pub use crate::mods::backup_control; pub use crate::mods::coreopts; +pub use crate::mods::os; pub use crate::mods::panic; pub use crate::mods::ranges; @@ -34,8 +36,12 @@ pub use crate::mods::ranges; pub use crate::features::encoding; #[cfg(feature = "fs")] pub use crate::features::fs; +#[cfg(feature = "fsext")] +pub use crate::features::fsext; #[cfg(feature = "parse_time")] pub use crate::features::parse_time; +#[cfg(feature = "ringbuffer")] +pub use crate::features::ringbuffer; #[cfg(feature = "zero-copy")] pub use crate::features::zero_copy; @@ -67,10 +73,94 @@ pub use crate::features::wide; use std::ffi::OsString; +pub enum InvalidEncodingHandling { + Ignore, + ConvertLossy, + Panic, +} + +#[must_use] +pub enum ConversionResult { + Complete(Vec), + Lossy(Vec), +} + +impl ConversionResult { + pub fn accept_any(self) -> Vec { + match self { + Self::Complete(result) => result, + Self::Lossy(result) => result, + } + } + + pub fn expect_lossy(self, msg: &str) -> Vec { + match self { + Self::Lossy(result) => result, + Self::Complete(_) => { + panic!("{}", msg); + } + } + } + + pub fn expect_complete(self, msg: &str) -> Vec { + match self { + Self::Complete(result) => result, + Self::Lossy(_) => { + panic!("{}", msg); + } + } + } +} + pub trait Args: Iterator + Sized { - fn collect_str(self) -> Vec { - // FIXME: avoid unwrap() - self.map(|s| s.into_string().unwrap()).collect() + /// Converts each iterator item to a String and collects these into a vector + /// On invalid encoding, the result will depend on the argument. This method allows to either drop entries with illegal encoding + /// completely (```InvalidEncodingHandling::Ignore```), convert them using lossy-conversion (```InvalidEncodingHandling::Lossy```) which will + /// result in strange strings or can chosen to panic (```InvalidEncodingHandling::Panic```). + /// # Arguments + /// * `handling` - This switch allows to switch the behavior, when invalid encoding is encountered + /// # Panics + /// * Occurs, when invalid encoding is encountered and handling is set to ```InvalidEncodingHandling::Panic``` + fn collect_str(self, handling: InvalidEncodingHandling) -> ConversionResult { + let mut full_conversion = true; + let result_vector: Vec = self + .map(|s| match s.into_string() { + Ok(string) => Ok(string), + Err(s_ret) => { + full_conversion = false; + let lossy_conversion = s_ret.to_string_lossy(); + eprintln!( + "Input with broken encoding occured! (s = '{}') ", + &lossy_conversion + ); + match handling { + InvalidEncodingHandling::Ignore => Err(String::new()), + InvalidEncodingHandling::ConvertLossy => Err(lossy_conversion.to_string()), + InvalidEncodingHandling::Panic => { + panic!("Broken encoding found but caller cannot handle it") + } + } + } + }) + .filter(|s| match handling { + InvalidEncodingHandling::Ignore => s.is_ok(), + _ => true, + }) + .map(|s| match s.is_ok() { + true => s.unwrap(), + false => s.unwrap_err(), + }) + .collect(); + + match full_conversion { + true => ConversionResult::Complete(result_vector), + false => ConversionResult::Lossy(result_vector), + } + } + + /// convience function for a more slim interface + fn collect_str_lossy(self) -> ConversionResult { + self.collect_str(InvalidEncodingHandling::ConvertLossy) } } @@ -84,3 +174,85 @@ pub fn args() -> impl Iterator { pub fn args_os() -> impl Iterator { wild::args_os() } + +#[cfg(test)] +mod tests { + use super::*; + use std::ffi::OsStr; + + fn make_os_vec(os_str: &OsStr) -> Vec { + vec![ + OsString::from("test"), + OsString::from("สวัสดี"), + os_str.to_os_string(), + ] + } + + fn collect_os_str(vec: Vec, handling: InvalidEncodingHandling) -> ConversionResult { + vec.into_iter().collect_str(handling) + } + + #[cfg(any(unix, target_os = "redox"))] + fn test_invalid_utf8_args_lossy(os_str: &OsStr) { + //assert our string is invalid utf8 + assert!(os_str.to_os_string().into_string().is_err()); + let test_vec = make_os_vec(os_str); + let collected_to_str = + collect_os_str(test_vec.clone(), InvalidEncodingHandling::ConvertLossy) + .expect_lossy("Lossy conversion expected in this test: bad encoding entries should be converted as good as possible"); + //conservation of length - when accepting lossy conversion no arguments may be dropped + assert_eq!(collected_to_str.len(), test_vec.len()); + //first indices identical + for index in 0..2 { + assert_eq!( + collected_to_str.get(index).unwrap(), + test_vec.get(index).unwrap().to_str().unwrap() + ); + } + //lossy conversion for string with illegal encoding is done + assert_eq!( + *collected_to_str.get(2).unwrap(), + os_str.to_os_string().to_string_lossy() + ); + } + + #[cfg(any(unix, target_os = "redox"))] + fn test_invalid_utf8_args_ignore(os_str: &OsStr) { + //assert our string is invalid utf8 + assert!(os_str.to_os_string().into_string().is_err()); + let test_vec = make_os_vec(os_str); + let collected_to_str = collect_os_str(test_vec.clone(), InvalidEncodingHandling::Ignore) + .expect_lossy( + "Lossy conversion expected in this test: bad encoding entries should be filtered", + ); + //assert that the broken entry is filtered out + assert_eq!(collected_to_str.len(), test_vec.len() - 1); + //assert that the unbroken indices are converted as expected + for index in 0..2 { + assert_eq!( + collected_to_str.get(index).unwrap(), + test_vec.get(index).unwrap().to_str().unwrap() + ); + } + } + + #[test] + fn valid_utf8_encoding_args() { + //create a vector containing only correct encoding + let test_vec = make_os_vec(&OsString::from("test2")); + //expect complete conversion without losses, even when lossy conversion is accepted + let _ = collect_os_str(test_vec, InvalidEncodingHandling::ConvertLossy) + .expect_complete("Lossy conversion not expected in this test"); + } + + #[cfg(any(unix, target_os = "redox"))] + #[test] + fn invalid_utf8_args_unix() { + use std::os::unix::ffi::OsStrExt; + + let source = [0x66, 0x6f, 0x80, 0x6f]; + let os_str = OsStr::from_bytes(&source[..]); + test_invalid_utf8_args_lossy(os_str); + test_invalid_utf8_args_ignore(os_str); + } +} diff --git a/src/uucore/src/lib/macros.rs b/src/uucore/src/lib/macros.rs index 24b392ebd..438fec960 100644 --- a/src/uucore/src/lib/macros.rs +++ b/src/uucore/src/lib/macros.rs @@ -25,25 +25,24 @@ macro_rules! executable( #[macro_export] macro_rules! show_error( ($($args:tt)+) => ({ - eprint!("{}: error: ", executable!()); + eprint!("{}: ", executable!()); eprintln!($($args)+); }) ); /// Show a warning to stderr in a silimar style to GNU coreutils. #[macro_export] -macro_rules! show_warning( - ($($args:tt)+) => ({ - eprint!("{}: warning: ", executable!()); +macro_rules! show_error_custom_description ( + ($err:expr,$($args:tt)+) => ({ + eprint!("{}: {}: ", executable!(), $err); eprintln!($($args)+); }) ); -/// Show an info message to stderr in a silimar style to GNU coreutils. #[macro_export] -macro_rules! show_info( +macro_rules! show_warning( ($($args:tt)+) => ({ - eprint!("{}: ", executable!()); + eprint!("{}: warning: ", executable!()); eprintln!($($args)+); }) ); @@ -168,13 +167,6 @@ macro_rules! msg_invalid_input { }; } -#[macro_export] -macro_rules! snippet_no_file_at_path { - ($path:expr) => { - format!("nonexistent path {}", $path) - }; -} - // -- message templates : invalid input : flag #[macro_export] @@ -221,55 +213,6 @@ macro_rules! msg_opt_invalid_should_be { }; } -// -- message templates : invalid input : args - -#[macro_export] -macro_rules! msg_arg_invalid_value { - ($expects:expr, $received:expr) => { - msg_invalid_input!(format!( - "expects its argument to be {}, but was provided {}", - $expects, $received - )) - }; -} - -#[macro_export] -macro_rules! msg_args_invalid_value { - ($expects:expr, $received:expr) => { - msg_invalid_input!(format!( - "expects its arguments to be {}, but was provided {}", - $expects, $received - )) - }; - ($msg:expr) => { - msg_invalid_input!($msg) - }; -} - -#[macro_export] -macro_rules! msg_args_nonexistent_file { - ($received:expr) => { - msg_args_invalid_value!("paths to files", snippet_no_file_at_path!($received)) - }; -} - -#[macro_export] -macro_rules! msg_wrong_number_of_arguments { - () => { - msg_args_invalid_value!("wrong number of arguments") - }; - ($min:expr, $max:expr) => { - msg_args_invalid_value!(format!("expects {}-{} arguments", $min, $max)) - }; - ($exact:expr) => { - if $exact == 1 { - msg_args_invalid_value!("expects 1 argument") - } else { - msg_args_invalid_value!(format!("expects {} arguments", $exact)) - } - }; -} - // -- message templates : invalid input : input combinations #[macro_export] diff --git a/src/uucore/src/lib/mods.rs b/src/uucore/src/lib/mods.rs index c73909dcc..2689361a0 100644 --- a/src/uucore/src/lib/mods.rs +++ b/src/uucore/src/lib/mods.rs @@ -1,5 +1,7 @@ // mods ~ cross-platforms modules (core/bundler file) +pub mod backup_control; pub mod coreopts; +pub mod os; pub mod panic; pub mod ranges; diff --git a/src/uucore/src/lib/mods/backup_control.rs b/src/uucore/src/lib/mods/backup_control.rs new file mode 100644 index 000000000..6004ae84d --- /dev/null +++ b/src/uucore/src/lib/mods/backup_control.rs @@ -0,0 +1,97 @@ +use std::{ + env, + path::{Path, PathBuf}, +}; + +pub static BACKUP_CONTROL_VALUES: &[&str] = &[ + "simple", "never", "numbered", "t", "existing", "nil", "none", "off", +]; + +pub static BACKUP_CONTROL_LONG_HELP: &str = "The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX. Here are the version control values: + +none, off + never make backups (even if --backup is given) + +numbered, t + make numbered backups + +existing, nil + numbered if numbered backups exist, simple otherwise + +simple, never + always make simple backups"; + +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub enum BackupMode { + NoBackup, + SimpleBackup, + NumberedBackup, + ExistingBackup, +} + +pub fn determine_backup_suffix(supplied_suffix: Option<&str>) -> String { + if let Some(suffix) = supplied_suffix { + String::from(suffix) + } else { + env::var("SIMPLE_BACKUP_SUFFIX").unwrap_or("~".to_owned()) + } +} + +pub fn determine_backup_mode(backup_opt_exists: bool, backup_opt: Option<&str>) -> BackupMode { + if backup_opt_exists { + match backup_opt.map(String::from) { + // default is existing, see: + // https://www.gnu.org/software/coreutils/manual/html_node/Backup-options.html + None => BackupMode::ExistingBackup, + Some(mode) => match &mode[..] { + "simple" | "never" => BackupMode::SimpleBackup, + "numbered" | "t" => BackupMode::NumberedBackup, + "existing" | "nil" => BackupMode::ExistingBackup, + "none" | "off" => BackupMode::NoBackup, + _ => panic!(), // cannot happen as it is managed by clap + }, + } + } else { + BackupMode::NoBackup + } +} + +pub fn get_backup_path( + backup_mode: BackupMode, + backup_path: &Path, + suffix: &str, +) -> Option { + match backup_mode { + BackupMode::NoBackup => None, + BackupMode::SimpleBackup => Some(simple_backup_path(backup_path, suffix)), + BackupMode::NumberedBackup => Some(numbered_backup_path(backup_path)), + BackupMode::ExistingBackup => Some(existing_backup_path(backup_path, suffix)), + } +} + +pub fn simple_backup_path(path: &Path, suffix: &str) -> PathBuf { + let mut p = path.to_string_lossy().into_owned(); + p.push_str(suffix); + PathBuf::from(p) +} + +pub fn numbered_backup_path(path: &Path) -> PathBuf { + for i in 1_u64.. { + let path_str = &format!("{}.~{}~", path.to_string_lossy(), i); + let path = Path::new(path_str); + if !path.exists() { + return path.to_path_buf(); + } + } + panic!("cannot create backup") +} + +pub fn existing_backup_path(path: &Path, suffix: &str) -> PathBuf { + let test_path_str = &format!("{}.~1~", path.to_string_lossy()); + let test_path = Path::new(test_path_str); + if test_path.exists() { + numbered_backup_path(path) + } else { + simple_backup_path(path, suffix) + } +} diff --git a/src/uucore/src/lib/mods/os.rs b/src/uucore/src/lib/mods/os.rs new file mode 100644 index 000000000..da2002161 --- /dev/null +++ b/src/uucore/src/lib/mods/os.rs @@ -0,0 +1,30 @@ +/// Test if the program is running under WSL +// ref: @@ +pub fn is_wsl_1() -> bool { + #[cfg(target_os = "linux")] + { + if is_wsl_2() { + return false; + } + if let Ok(b) = std::fs::read("/proc/sys/kernel/osrelease") { + if let Ok(s) = std::str::from_utf8(&b) { + let a = s.to_ascii_lowercase(); + return a.contains("microsoft") || a.contains("wsl"); + } + } + } + false +} + +pub fn is_wsl_2() -> bool { + #[cfg(target_os = "linux")] + { + if let Ok(b) = std::fs::read("/proc/sys/kernel/osrelease") { + if let Ok(s) = std::str::from_utf8(&b) { + let a = s.to_ascii_lowercase(); + return a.contains("wsl2"); + } + } + } + false +} diff --git a/src/uucore_procs/src/lib.rs b/src/uucore_procs/src/lib.rs index 10368a5bd..e0d247c3f 100644 --- a/src/uucore_procs/src/lib.rs +++ b/src/uucore_procs/src/lib.rs @@ -1,6 +1,3 @@ -#![allow(dead_code)] // work-around for GH:rust-lang/rust#62127; maint: can be removed when MinSRV >= v1.38.0 -#![allow(unused_macros)] // work-around for GH:rust-lang/rust#62127; maint: can be removed when MinSRV >= v1.38.0 - // Copyright (C) ~ Roy Ivy III ; MIT license extern crate proc_macro; @@ -44,7 +41,6 @@ impl syn::parse::Parse for Tokens { } #[proc_macro] -#[cfg(not(test))] // work-around for GH:rust-lang/rust#62127; maint: can be removed when MinSRV >= v1.38.0 pub fn main(stream: proc_macro::TokenStream) -> proc_macro::TokenStream { let Tokens { expr } = syn::parse_macro_input!(stream as Tokens); proc_dbg!(&expr); diff --git a/tests/benches/factor/Cargo.toml b/tests/benches/factor/Cargo.toml new file mode 100644 index 000000000..b3b718477 --- /dev/null +++ b/tests/benches/factor/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "uu_factor_benches" +version = "0.0.0" +authors = ["nicoo "] +license = "MIT" +description = "Benchmarks for the uu_factor integer factorization tool" +homepage = "https://github.com/uutils/coreutils" +edition = "2018" + +[dependencies] +uu_factor = { path = "../../../src/uu/factor" } + +[dev-dependencies] +array-init = "2.0.0" +criterion = "0.3" +rand = "0.7" +rand_chacha = "0.2.2" + + +[[bench]] +name = "gcd" +harness = false + +[[bench]] +name = "table" +harness = false diff --git a/src/uu/factor/benches/gcd.rs b/tests/benches/factor/benches/gcd.rs similarity index 100% rename from src/uu/factor/benches/gcd.rs rename to tests/benches/factor/benches/gcd.rs diff --git a/tests/benches/factor/benches/table.rs b/tests/benches/factor/benches/table.rs new file mode 100644 index 000000000..0b31b2b4c --- /dev/null +++ b/tests/benches/factor/benches/table.rs @@ -0,0 +1,78 @@ +use array_init::array_init; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +use std::convert::TryInto; +use uu_factor::{table::*, Factors}; + +fn table(c: &mut Criterion) { + #[cfg(target_os = "linux")] + check_personality(); + + const INPUT_SIZE: usize = 128; + assert!( + INPUT_SIZE % CHUNK_SIZE == 0, + "INPUT_SIZE ({}) is not divisible by CHUNK_SIZE ({})", + INPUT_SIZE, + CHUNK_SIZE + ); + let inputs = { + // Deterministic RNG; use an explicitely-named RNG to guarantee stability + use rand::{RngCore, SeedableRng}; + use rand_chacha::ChaCha8Rng; + const SEED: u64 = 0xdead_bebe_ea75_cafe; + let mut rng = ChaCha8Rng::seed_from_u64(SEED); + + std::iter::repeat_with(move || array_init::<_, _, INPUT_SIZE>(|_| rng.next_u64())) + }; + + let mut group = c.benchmark_group("table"); + group.throughput(Throughput::Elements(INPUT_SIZE as _)); + for a in inputs.take(10) { + let a_str = format!("{:?}", a); + group.bench_with_input(BenchmarkId::new("factor_chunk", &a_str), &a, |b, &a| { + b.iter(|| { + let mut n_s = a.clone(); + let mut f_s: [_; INPUT_SIZE] = array_init(|_| Factors::one()); + for (n_s, f_s) in n_s.chunks_mut(CHUNK_SIZE).zip(f_s.chunks_mut(CHUNK_SIZE)) { + factor_chunk(n_s.try_into().unwrap(), f_s.try_into().unwrap()) + } + }) + }); + group.bench_with_input(BenchmarkId::new("factor", &a_str), &a, |b, &a| { + b.iter(|| { + let mut n_s = a.clone(); + let mut f_s: [_; INPUT_SIZE] = array_init(|_| Factors::one()); + for (n, f) in n_s.iter_mut().zip(f_s.iter_mut()) { + factor(n, f) + } + }) + }); + } + group.finish() +} + +#[cfg(target_os = "linux")] +fn check_personality() { + use std::fs; + const ADDR_NO_RANDOMIZE: u64 = 0x0040000; + const PERSONALITY_PATH: &'static str = "/proc/self/personality"; + + let p_string = fs::read_to_string(PERSONALITY_PATH) + .expect(&format!("Couldn't read '{}'", PERSONALITY_PATH)) + .strip_suffix("\n") + .unwrap() + .to_owned(); + + let personality = u64::from_str_radix(&p_string, 16).expect(&format!( + "Expected a hex value for personality, got '{:?}'", + p_string + )); + if personality & ADDR_NO_RANDOMIZE == 0 { + eprintln!( + "WARNING: Benchmarking with ASLR enabled (personality is {:x}), results might not be reproducible.", + personality + ); + } +} + +criterion_group!(benches, table); +criterion_main!(benches); diff --git a/tests/by-util/test_arch.rs b/tests/by-util/test_arch.rs index d2ec138d9..909e0ee80 100644 --- a/tests/by-util/test_arch.rs +++ b/tests/by-util/test_arch.rs @@ -2,17 +2,13 @@ use crate::common::util::*; #[test] fn test_arch() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.run(); - assert!(result.success); + new_ucmd!().succeeds(); } #[test] fn test_arch_help() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("--help").run(); - assert!(result.success); - assert!(result.stdout.contains("architecture name")); + new_ucmd!() + .arg("--help") + .succeeds() + .stdout_contains("architecture name"); } diff --git a/tests/by-util/test_base32.rs b/tests/by-util/test_base32.rs index d3527d26a..e36c376be 100644 --- a/tests/by-util/test_base32.rs +++ b/tests/by-util/test_base32.rs @@ -15,6 +15,21 @@ fn test_encode() { .pipe_in(input) .succeeds() .stdout_only("JBSWY3DPFQQFO33SNRSCC===\n"); + + // Using '-' as our file + new_ucmd!() + .arg("-") + .pipe_in(input) + .succeeds() + .stdout_only("JBSWY3DPFQQFO33SNRSCC===\n"); +} + +#[test] +fn test_base32_encode_file() { + new_ucmd!() + .arg("input-simple.txt") + .succeeds() + .stdout_only("JBSWY3DPFQQFO33SNRSCCCQ=\n"); } #[test] @@ -71,8 +86,7 @@ fn test_wrap() { fn test_wrap_no_arg() { for wrap_param in vec!["-w", "--wrap"] { new_ucmd!().arg(wrap_param).fails().stderr_only(format!( - "base32: error: Argument to option '{}' missing\n", - if wrap_param == "-w" { "w" } else { "wrap" } + "error: The argument '--wrap \' requires a value but none was supplied\n\nUSAGE:\n base32 [OPTION]... [FILE]\n\nFor more information try --help" )); } } @@ -84,6 +98,24 @@ fn test_wrap_bad_arg() { .arg(wrap_param) .arg("b") .fails() - .stderr_only("base32: error: invalid wrap size: ‘b’: invalid digit found in string\n"); + .stderr_only("base32: Invalid wrap size: ‘b’: invalid digit found in string\n"); } } + +#[test] +fn test_base32_extra_operand() { + // Expect a failure when multiple files are specified. + new_ucmd!() + .arg("a.txt") + .arg("a.txt") + .fails() + .stderr_only("base32: extra operand ‘a.txt’"); +} + +#[test] +fn test_base32_file_not_found() { + new_ucmd!() + .arg("a.txt") + .fails() + .stderr_only("base32: a.txt: No such file or directory"); +} diff --git a/tests/by-util/test_base64.rs b/tests/by-util/test_base64.rs index 6bc0436c5..89405d791 100644 --- a/tests/by-util/test_base64.rs +++ b/tests/by-util/test_base64.rs @@ -7,6 +7,21 @@ fn test_encode() { .pipe_in(input) .succeeds() .stdout_only("aGVsbG8sIHdvcmxkIQ==\n"); + + // Using '-' as our file + new_ucmd!() + .arg("-") + .pipe_in(input) + .succeeds() + .stdout_only("aGVsbG8sIHdvcmxkIQ==\n"); +} + +#[test] +fn test_base64_encode_file() { + new_ucmd!() + .arg("input-simple.txt") + .succeeds() + .stdout_only("SGVsbG8sIFdvcmxkIQo=\n"); } #[test] @@ -60,10 +75,9 @@ fn test_wrap() { #[test] fn test_wrap_no_arg() { for wrap_param in vec!["-w", "--wrap"] { - new_ucmd!().arg(wrap_param).fails().stderr_only(format!( - "base64: error: Argument to option '{}' missing\n", - if wrap_param == "-w" { "w" } else { "wrap" } - )); + new_ucmd!().arg(wrap_param).fails().stderr_contains( + &"The argument '--wrap ' requires a value but none was supplied", + ); } } @@ -74,6 +88,24 @@ fn test_wrap_bad_arg() { .arg(wrap_param) .arg("b") .fails() - .stderr_only("base64: error: invalid wrap size: ‘b’: invalid digit found in string\n"); + .stderr_only("base64: Invalid wrap size: ‘b’: invalid digit found in string\n"); } } + +#[test] +fn test_base64_extra_operand() { + // Expect a failure when multiple files are specified. + new_ucmd!() + .arg("a.txt") + .arg("a.txt") + .fails() + .stderr_only("base64: extra operand ‘a.txt’"); +} + +#[test] +fn test_base64_file_not_found() { + new_ucmd!() + .arg("a.txt") + .fails() + .stderr_only("base64: a.txt: No such file or directory"); +} diff --git a/tests/by-util/test_basename.rs b/tests/by-util/test_basename.rs index fa599644d..1d26a922a 100644 --- a/tests/by-util/test_basename.rs +++ b/tests/by-util/test_basename.rs @@ -1,4 +1,29 @@ use crate::common::util::*; +#[cfg(any(unix, target_os = "redox"))] +use std::ffi::OsStr; + +#[test] +fn test_help() { + for help_flg in vec!["-h", "--help"] { + new_ucmd!() + .arg(&help_flg) + .succeeds() + .no_stderr() + .stdout_contains("USAGE:"); + } +} + +#[test] +fn test_version() { + for version_flg in vec!["-V", "--version"] { + assert!(new_ucmd!() + .arg(&version_flg) + .succeeds() + .no_stderr() + .stdout_str() + .starts_with("basename")); + } +} #[test] fn test_directory() { @@ -66,7 +91,7 @@ fn test_zero_param() { } fn expect_error(input: Vec<&str>) { - assert!(new_ucmd!().args(&input).fails().no_stdout().stderr.len() > 0); + assert!(new_ucmd!().args(&input).fails().no_stdout().stderr().len() > 0); } #[test] @@ -80,7 +105,38 @@ fn test_no_args() { expect_error(vec![]); } +#[test] +fn test_no_args_output() { + new_ucmd!() + .fails() + .stderr_is("basename: missing operand\nTry 'basename --help' for more information."); +} + #[test] fn test_too_many_args() { expect_error(vec!["a", "b", "c"]); } + +#[test] +fn test_too_many_args_output() { + new_ucmd!() + .args(&["a", "b", "c"]) + .fails() + .stderr_is("basename: extra operand 'c'\nTry 'basename --help' for more information."); +} + +#[cfg(any(unix, target_os = "redox"))] +fn test_invalid_utf8_args(os_str: &OsStr) { + let test_vec = vec![os_str.to_os_string()]; + new_ucmd!().args(&test_vec).succeeds().stdout_is("fo�o\n"); +} + +#[cfg(any(unix, target_os = "redox"))] +#[test] +fn invalid_utf8_args_unix() { + use std::os::unix::ffi::OsStrExt; + + let source = [0x66, 0x6f, 0x80, 0x6f]; + let os_str = OsStr::from_bytes(&source[..]); + test_invalid_utf8_args(os_str); +} diff --git a/tests/by-util/test_cat.rs b/tests/by-util/test_cat.rs index 481b1683d..adda905b3 100644 --- a/tests/by-util/test_cat.rs +++ b/tests/by-util/test_cat.rs @@ -1,7 +1,8 @@ -#[cfg(unix)] -extern crate unix_socket; - use crate::common::util::*; +#[cfg(unix)] +use std::fs::OpenOptions; +#[cfg(unix)] +use std::io::Read; #[test] fn test_output_simple() { @@ -11,6 +12,198 @@ fn test_output_simple() { .stdout_only("abcde\nfghij\nklmno\npqrst\nuvwxyz\n"); } +#[test] +fn test_no_options() { + for fixture in &["empty.txt", "alpha.txt", "nonewline.txt"] { + // Give fixture through command line file argument + new_ucmd!() + .args(&[fixture]) + .succeeds() + .stdout_is_fixture(fixture); + // Give fixture through stdin + new_ucmd!() + .pipe_in_fixture(fixture) + .succeeds() + .stdout_is_fixture(fixture); + } +} + +#[test] +#[cfg(any(target_vendor = "apple", target_os = "linux", target_os = "android"))] +fn test_no_options_big_input() { + for &n in &[ + 0, + 1, + 42, + 16 * 1024 - 7, + 16 * 1024 - 1, + 16 * 1024, + 16 * 1024 + 1, + 16 * 1024 + 3, + 32 * 1024, + 64 * 1024, + 80 * 1024, + 96 * 1024, + 112 * 1024, + 128 * 1024, + ] { + let data = vec_of_size(n); + let data2 = data.clone(); + assert_eq!(data.len(), data2.len()); + new_ucmd!().pipe_in(data).succeeds().stdout_is_bytes(&data2); + } +} + +#[test] +#[cfg(unix)] +fn test_fifo_symlink() { + use std::io::Write; + use std::thread; + + let s = TestScenario::new(util_name!()); + s.fixtures.mkdir("dir"); + s.fixtures.mkfifo("dir/pipe"); + assert!(s.fixtures.is_fifo("dir/pipe")); + + // Make cat read the pipe through a symlink + s.fixtures.symlink_file("dir/pipe", "sympipe"); + let proc = s.ucmd().args(&["sympipe"]).run_no_wait(); + + let data = vec_of_size(128 * 1024); + let data2 = data.clone(); + + let pipe_path = s.fixtures.plus("dir/pipe"); + let thread = thread::spawn(move || { + let mut pipe = OpenOptions::new() + .write(true) + .create(false) + .open(pipe_path) + .unwrap(); + pipe.write_all(&data).unwrap(); + }); + + let output = proc.wait_with_output().unwrap(); + assert_eq!(&output.stdout, &data2); + thread.join().unwrap(); +} + +#[test] +#[cfg(unix)] +fn test_piped_to_regular_file() { + use std::fs::read_to_string; + + for &append in &[true, false] { + let s = TestScenario::new(util_name!()); + let file_path = s.fixtures.plus("file.txt"); + + { + let file = OpenOptions::new() + .create_new(true) + .write(true) + .append(append) + .open(&file_path) + .unwrap(); + + s.ucmd() + .set_stdout(file) + .pipe_in_fixture("alpha.txt") + .succeeds(); + } + let contents = read_to_string(&file_path).unwrap(); + assert_eq!(contents, "abcde\nfghij\nklmno\npqrst\nuvwxyz\n"); + } +} + +#[test] +#[cfg(unix)] +fn test_piped_to_dev_null() { + for &append in &[true, false] { + let s = TestScenario::new(util_name!()); + { + let dev_null = OpenOptions::new() + .write(true) + .append(append) + .open("/dev/null") + .unwrap(); + + s.ucmd() + .set_stdout(dev_null) + .pipe_in_fixture("alpha.txt") + .succeeds(); + } + } +} + +#[test] +#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "netbsd"))] +fn test_piped_to_dev_full() { + for &append in &[true, false] { + let s = TestScenario::new(util_name!()); + { + let dev_full = OpenOptions::new() + .write(true) + .append(append) + .open("/dev/full") + .unwrap(); + + s.ucmd() + .set_stdout(dev_full) + .pipe_in_fixture("alpha.txt") + .fails() + .stderr_contains(&"No space left on device".to_owned()); + } + } +} + +#[test] +fn test_directory() { + let s = TestScenario::new(util_name!()); + s.fixtures.mkdir("test_directory"); + s.ucmd() + .args(&["test_directory"]) + .fails() + .stderr_is("cat: test_directory: Is a directory"); +} + +#[test] +fn test_directory_and_file() { + let s = TestScenario::new(util_name!()); + s.fixtures.mkdir("test_directory2"); + for fixture in &["empty.txt", "alpha.txt", "nonewline.txt"] { + s.ucmd() + .args(&["test_directory2", fixture]) + .fails() + .stderr_is("cat: test_directory2: Is a directory") + .stdout_is_fixture(fixture); + } +} + +#[test] +#[cfg(unix)] +fn test_three_directories_and_file_and_stdin() { + let s = TestScenario::new(util_name!()); + s.fixtures.mkdir("test_directory3"); + s.fixtures.mkdir("test_directory3/test_directory4"); + s.fixtures.mkdir("test_directory3/test_directory5"); + s.ucmd() + .args(&[ + "test_directory3/test_directory4", + "alpha.txt", + "-", + "filewhichdoesnotexist.txt", + "nonewline.txt", + "test_directory3/test_directory5", + "test_directory3/../test_directory3/test_directory5", + "test_directory3", + ]) + .pipe_in("stdout bytes") + .fails() + .stderr_is_fixture("three_directories_and_file_and_stdin.stderr.expected") + .stdout_is( + "abcde\nfghij\nklmno\npqrst\nuvwxyz\nstdout bytestext without a trailing newline", + ); +} + #[test] fn test_output_multi_files_print_all_chars() { new_ucmd!() @@ -149,29 +342,93 @@ fn test_squeeze_blank_before_numbering() { } } +/// This tests reading from Unix character devices #[test] -#[cfg(foo)] -fn test_domain_socket() { - use self::tempdir::TempDir; - use self::unix_socket::UnixListener; - use std::io::prelude::*; - use std::thread; +#[cfg(unix)] +fn test_dev_random() { + let mut buf = [0; 2048]; + #[cfg(target_os = "linux")] + const DEV_RANDOM: &str = "/dev/urandom"; - let dir = TempDir::new("unix_socket").expect("failed to create dir"); + #[cfg(not(target_os = "linux"))] + const DEV_RANDOM: &str = "/dev/random"; + + let mut proc = new_ucmd!().args(&[DEV_RANDOM]).run_no_wait(); + let mut proc_stdout = proc.stdout.take().unwrap(); + proc_stdout.read_exact(&mut buf).unwrap(); + + let num_zeroes = buf.iter().fold(0, |mut acc, &n| { + if n == 0 { + acc += 1; + } + acc + }); + // The probability of more than 512 zero bytes is essentially zero if the + // output is truly random. + assert!(num_zeroes < 512); + proc.kill().unwrap(); +} + +/// Reading from /dev/full should return an infinite amount of zero bytes. +/// Wikipedia says there is support on Linux, FreeBSD, and NetBSD. +#[test] +#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "netbsd"))] +fn test_dev_full() { + let mut buf = [0; 2048]; + let mut proc = new_ucmd!().args(&["/dev/full"]).run_no_wait(); + let mut proc_stdout = proc.stdout.take().unwrap(); + let expected = [0; 2048]; + proc_stdout.read_exact(&mut buf).unwrap(); + assert_eq!(&buf[..], &expected[..]); + proc.kill().unwrap(); +} + +#[test] +#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "netbsd"))] +fn test_dev_full_show_all() { + let mut buf = [0; 2048]; + let mut proc = new_ucmd!().args(&["-A", "/dev/full"]).run_no_wait(); + let mut proc_stdout = proc.stdout.take().unwrap(); + proc_stdout.read_exact(&mut buf).unwrap(); + + let expected: Vec = (0..buf.len()) + .map(|n| if n & 1 == 0 { b'^' } else { b'@' }) + .collect(); + + assert_eq!(&buf[..], &expected[..]); + proc.kill().unwrap(); +} + +#[test] +#[cfg(unix)] +#[ignore] +fn test_domain_socket() { + use std::io::prelude::*; + use std::sync::{Arc, Barrier}; + use std::thread; + use unix_socket::UnixListener; + + let dir = tempfile::Builder::new().prefix("unix_socket").tempdir().expect("failed to create dir"); let socket_path = dir.path().join("sock"); let listener = UnixListener::bind(&socket_path).expect("failed to create socket"); + // use a barrier to ensure we don't run cat before the listener is setup + let barrier = Arc::new(Barrier::new(2)); + let barrier2 = Arc::clone(&barrier); + let thread = thread::spawn(move || { let mut stream = listener.accept().expect("failed to accept connection").0; + barrier2.wait(); stream .write_all(b"a\tb") .expect("failed to write test data"); }); - new_ucmd!() - .args(&[socket_path]) - .succeeds() - .stdout_only("a\tb"); + let child = new_ucmd!().args(&[socket_path]).run_no_wait(); + barrier.wait(); + let stdout = &child.wait_with_output().unwrap().stdout.clone(); + let output = String::from_utf8_lossy(&stdout); + assert_eq!("a\tb", output); thread.join().unwrap(); } diff --git a/tests/by-util/test_chgrp.rs b/tests/by-util/test_chgrp.rs index 613f52fd2..a7848b1b6 100644 --- a/tests/by-util/test_chgrp.rs +++ b/tests/by-util/test_chgrp.rs @@ -104,7 +104,7 @@ fn test_reference() { // skip for root or MS-WSL // * MS-WSL is bugged (as of 2019-12-25), allowing non-root accounts su-level privileges for `chgrp` // * for MS-WSL, succeeds and stdout == 'group of /etc retained as root' - if !(get_effective_gid() == 0 || is_wsl()) { + if !(get_effective_gid() == 0 || uucore::os::is_wsl_1()) { new_ucmd!() .arg("-v") .arg("--reference=/etc/passwd") @@ -149,7 +149,7 @@ fn test_big_h() { .arg("bin") .arg("/proc/self/fd") .fails() - .stderr + .stderr_str() .lines() .fold(0, |acc, _| acc + 1) > 1 diff --git a/tests/by-util/test_chmod.rs b/tests/by-util/test_chmod.rs index b85567166..f20429a6e 100644 --- a/tests/by-util/test_chmod.rs +++ b/tests/by-util/test_chmod.rs @@ -47,8 +47,8 @@ fn run_single_test(test: &TestCase, at: AtPath, mut ucmd: UCommand) { ucmd.arg(arg); } let r = ucmd.run(); - if !r.success { - println!("{}", r.stderr); + if !r.succeeded() { + println!("{}", r.stderr_str()); panic!("{:?}: failed", ucmd.raw); } @@ -282,6 +282,26 @@ fn test_chmod_reference_file() { run_single_test(&tests[0], at, ucmd); } +#[test] +fn test_permission_denied() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.mkdir("d/"); + at.mkdir("d/no-x"); + at.mkdir("d/no-x/y"); + + scene.ucmd().arg("u=rw").arg("d/no-x").succeeds(); + + scene + .ucmd() + .arg("-R") + .arg("o=r") + .arg("d") + .fails() + .stderr_is("chmod: 'd/no-x/y': Permission denied"); +} + #[test] fn test_chmod_recursive() { let _guard = UMASK_MUTEX.lock(); @@ -297,13 +317,14 @@ fn test_chmod_recursive() { mkfile(&at.plus_as_string("a/b/c/c"), 0o100444); mkfile(&at.plus_as_string("z/y"), 0o100444); - let result = ucmd - .arg("-R") + ucmd.arg("-R") .arg("--verbose") .arg("-r,a+w") .arg("a") .arg("z") - .succeeds(); + .succeeds() + .stderr_contains(&"to 333 (-wx-wx-wx)") + .stderr_contains(&"to 222 (-w--w--w-)"); assert_eq!(at.metadata("z/y").permissions().mode(), 0o100222); assert_eq!(at.metadata("a/a").permissions().mode(), 0o100222); @@ -312,8 +333,6 @@ fn test_chmod_recursive() { println!("mode {:o}", at.metadata("a").permissions().mode()); assert_eq!(at.metadata("a").permissions().mode(), 0o40333); assert_eq!(at.metadata("z").permissions().mode(), 0o40333); - assert!(result.stderr.contains("to 333 (-wx-wx-wx)")); - assert!(result.stderr.contains("to 222 (-w--w--w-)")); unsafe { umask(original_umask); @@ -322,30 +341,24 @@ fn test_chmod_recursive() { #[test] fn test_chmod_non_existing_file() { - let (_at, mut ucmd) = at_and_ucmd!(); - let result = ucmd + new_ucmd!() .arg("-R") .arg("--verbose") .arg("-r,a+w") .arg("dont-exist") - .fails(); - assert!(result - .stderr - .contains("cannot access 'dont-exist': No such file or directory")); + .fails() + .stderr_contains(&"cannot access 'dont-exist': No such file or directory"); } #[test] fn test_chmod_preserve_root() { - let (_at, mut ucmd) = at_and_ucmd!(); - let result = ucmd + new_ucmd!() .arg("-R") .arg("--preserve-root") .arg("755") .arg("/") - .fails(); - assert!(result - .stderr - .contains("chmod: error: it is dangerous to operate recursively on '/'")); + .fails() + .stderr_contains(&"chmod: it is dangerous to operate recursively on '/'"); } #[test] @@ -362,33 +375,29 @@ fn test_chmod_symlink_non_existing_file() { let expected_stderr = &format!("cannot operate on dangling symlink '{}'", test_symlink); at.symlink_file(non_existing, test_symlink); - let mut result; // this cannot succeed since the symbolic link dangles - result = scene.ucmd().arg("755").arg("-v").arg(test_symlink).fails(); - - println!("stdout = {:?}", result.stdout); - println!("stderr = {:?}", result.stderr); - - assert!(result.stdout.contains(expected_stdout)); - assert!(result.stderr.contains(expected_stderr)); - assert_eq!(result.code, Some(1)); + scene + .ucmd() + .arg("755") + .arg("-v") + .arg(test_symlink) + .fails() + .code_is(1) + .stdout_contains(expected_stdout) + .stderr_contains(expected_stderr); // this should be the same than with just '-v' but without stderr - result = scene + scene .ucmd() .arg("755") .arg("-v") .arg("-f") .arg(test_symlink) - .fails(); - - println!("stdout = {:?}", result.stdout); - println!("stderr = {:?}", result.stderr); - - assert!(result.stdout.contains(expected_stdout)); - assert!(result.stderr.is_empty()); - assert_eq!(result.code, Some(1)); + .run() + .code_is(1) + .no_stderr() + .stdout_contains(expected_stdout); } #[test] @@ -405,18 +414,16 @@ fn test_chmod_symlink_non_existing_file_recursive() { non_existing, &format!("{}/{}", test_directory, test_symlink), ); - let mut result; // this should succeed - result = scene + scene .ucmd() .arg("-R") .arg("755") .arg(test_directory) - .succeeds(); - assert_eq!(result.code, Some(0)); - assert!(result.stdout.is_empty()); - assert!(result.stderr.is_empty()); + .succeeds() + .no_stderr() + .no_stdout(); let expected_stdout = &format!( "mode of '{}' retained as 0755 (rwxr-xr-x)\nneither symbolic link '{}/{}' nor referent has been changed", @@ -424,37 +431,27 @@ fn test_chmod_symlink_non_existing_file_recursive() { ); // '-v': this should succeed without stderr - result = scene + scene .ucmd() .arg("-R") .arg("-v") .arg("755") .arg(test_directory) - .succeeds(); - - println!("stdout = {:?}", result.stdout); - println!("stderr = {:?}", result.stderr); - - assert!(result.stdout.contains(expected_stdout)); - assert!(result.stderr.is_empty()); - assert_eq!(result.code, Some(0)); + .succeeds() + .stdout_contains(expected_stdout) + .no_stderr(); // '-vf': this should be the same than with just '-v' - result = scene + scene .ucmd() .arg("-R") .arg("-v") .arg("-f") .arg("755") .arg(test_directory) - .succeeds(); - - println!("stdout = {:?}", result.stdout); - println!("stderr = {:?}", result.stderr); - - assert!(result.stdout.contains(expected_stdout)); - assert!(result.stderr.is_empty()); - assert_eq!(result.code, Some(0)); + .succeeds() + .stdout_contains(expected_stdout) + .no_stderr(); } #[test] diff --git a/tests/by-util/test_chown.rs b/tests/by-util/test_chown.rs index 7b663e9c9..3d94632a6 100644 --- a/tests/by-util/test_chown.rs +++ b/tests/by-util/test_chown.rs @@ -4,6 +4,34 @@ use rust_users::get_effective_uid; extern crate chown; +// Apparently some CI environments have configuration issues, e.g. with 'whoami' and 'id'. +// If we are running inside the CI and "needle" is in "stderr" skipping this test is +// considered okay. If we are not inside the CI this calls assert!(result.success). +// +// From the Logs: "Build (ubuntu-18.04, x86_64-unknown-linux-gnu, feat_os_unix, use-cross)" +// +// stderr: "whoami: cannot find name for user ID 1001" +// TODO: Maybe `adduser --uid 1001 username` can put things right? +// +// stderr: "id: cannot find name for group ID 116" +// stderr: "thread 'main' panicked at 'called `Result::unwrap()` on an `Err` +// value: Custom { kind: NotFound, error: "No such id: 1001" }', +// /project/src/uucore/src/lib/features/perms.rs:176:44" +// +fn skipping_test_is_okay(result: &CmdResult, needle: &str) -> bool { + if !result.succeeded() { + println!("result.stdout = {}", result.stdout_str()); + println!("result.stderr = {}", result.stderr_str()); + if is_ci() && result.stderr_str().contains(needle) { + println!("test skipped:"); + return true; + } else { + result.success(); + } + } + false +} + #[cfg(test)] mod test_passgrp { use super::chown::entries::{gid2grp, grp2gid, uid2usr, usr2uid}; @@ -49,338 +77,427 @@ fn test_invalid_option() { } #[test] -fn test_chown_myself() { +fn test_chown_only_owner() { // test chown username file.txt + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + let result = scene.cmd("whoami").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + if skipping_test_is_okay(&result, "whoami: cannot find name for user ID") { return; } - println!("results {}", result.stdout); - let username = result.stdout.trim_end(); - - let (at, mut ucmd) = at_and_ucmd!(); - let file1 = "test_install_target_dir_file_a1"; + let user_name = String::from(result.stdout_str().trim()); + assert!(!user_name.is_empty()); + let file1 = "test_chown_file1"; at.touch(file1); - let result = ucmd.arg(username).arg(file1).run(); - println!("results stdout {}", result.stdout); - println!("results stderr {}", result.stderr); - if is_ci() && result.stderr.contains("invalid user") { - // In the CI, some server are failing to return id. - // As seems to be a configuration issue, ignoring it - return; - } - assert!(result.success); -} -#[test] -fn test_chown_myself_second() { - // test chown username: file.txt - let scene = TestScenario::new(util_name!()); - let result = scene.cmd("whoami").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it - return; - } - println!("results {}", result.stdout); - - let (at, mut ucmd) = at_and_ucmd!(); - let file1 = "test_install_target_dir_file_a1"; - - at.touch(file1); - let result = ucmd - .arg(result.stdout.trim_end().to_owned() + ":") + // since only superuser can change owner, we have to change from ourself to ourself + let result = scene + .ucmd() + .arg(user_name) + .arg("--verbose") .arg(file1) .run(); + result.stderr_contains(&"retained as"); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); + // try to change to another existing user, e.g. 'root' + scene + .ucmd() + .arg("root") + .arg("--verbose") + .arg(file1) + .fails() + .stderr_contains(&"failed to change"); } #[test] -fn test_chown_myself_group() { - // test chown username:group file.txt +fn test_chown_only_owner_colon() { + // test chown username: file.txt + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + let result = scene.cmd("whoami").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + if skipping_test_is_okay(&result, "whoami: cannot find name for user ID") { return; } - println!("user name = {}", result.stdout); - let username = result.stdout.trim_end(); + let user_name = String::from(result.stdout_str().trim()); + assert!(!user_name.is_empty()); + + let file1 = "test_chown_file1"; + at.touch(file1); + + scene + .ucmd() + .arg(format!("{}:", user_name)) + .arg("--verbose") + .arg(file1) + .succeeds() + .stderr_contains(&"retained as"); + + scene + .ucmd() + .arg("root:") + .arg("--verbose") + .arg(file1) + .fails() + .stderr_contains(&"failed to change"); +} + +#[test] +fn test_chown_only_colon() { + // test chown : file.txt + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let file1 = "test_chown_file1"; + at.touch(file1); + + // expected: + // $ chown -v : file.txt 2>out_err ; echo $? ; cat out_err + // ownership of 'file.txt' retained + // 0 + let result = scene.ucmd().arg(":").arg("--verbose").arg(file1).run(); + if skipping_test_is_okay(&result, "No such id") { + return; + } + result.stderr_contains(&"retained as"); // TODO: verbose is not printed to stderr in GNU chown + + // test chown : file.txt + // expected: + // $ chown -v :: file.txt 2>out_err ; echo $? ; cat out_err + // 1 + // chown: invalid group: ‘::’ + scene + .ucmd() + .arg("::") + .arg("--verbose") + .arg(file1) + .fails() + .stderr_contains(&"invalid group: ‘::’"); +} + +#[test] +fn test_chown_failed_stdout() { + // test chown root file.txt + + // TODO: implement once output "failed to change" to stdout is fixed + // expected: + // $ chown -v root file.txt 2>out_err ; echo $? ; cat out_err + // failed to change ownership of 'file.txt' from jhs to root + // 1 + // chown: changing ownership of 'file.txt': Operation not permitted +} + +#[test] +fn test_chown_owner_group() { + // test chown username:group file.txt + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let result = scene.cmd("whoami").run(); + if skipping_test_is_okay(&result, "whoami: cannot find name for user ID") { + return; + } + + let user_name = String::from(result.stdout_str().trim()); + assert!(!user_name.is_empty()); + + let file1 = "test_chown_file1"; + at.touch(file1); let result = scene.cmd("id").arg("-gn").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + if skipping_test_is_okay(&result, "id: cannot find name for group ID") { return; } - println!("group name = {}", result.stdout); - let group = result.stdout.trim_end(); + let group_name = String::from(result.stdout_str().trim()); + assert!(!group_name.is_empty()); - let (at, mut ucmd) = at_and_ucmd!(); - let file1 = "test_install_target_dir_file_a1"; - let perm = username.to_owned() + ":" + group; - at.touch(file1); - let result = ucmd.arg(perm).arg(file1).run(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - if is_ci() && result.stderr.contains("chown: invalid group:") { - // With some Ubuntu into the CI, we can get this answer + let result = scene + .ucmd() + .arg(format!("{}:{}", user_name, group_name)) + .arg("--verbose") + .arg(file1) + .run(); + if skipping_test_is_okay(&result, "chown: invalid group:") { return; } - assert!(result.success); + result.stderr_contains(&"retained as"); + + // TODO: on macos group name is not recognized correctly: "chown: invalid group: 'root:root' + #[cfg(any(windows, all(unix, not(target_os = "macos"))))] + scene + .ucmd() + .arg("root:root") + .arg("--verbose") + .arg(file1) + .fails() + .stderr_contains(&"failed to change"); } #[test] +// TODO: on macos group name is not recognized correctly: "chown: invalid group: ':groupname' +#[cfg(any(windows, all(unix, not(target_os = "macos"))))] fn test_chown_only_group() { // test chown :group file.txt + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + let result = scene.cmd("whoami").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + if skipping_test_is_okay(&result, "whoami: cannot find name for user ID") { return; } - println!("results {}", result.stdout); + let user_name = String::from(result.stdout_str().trim()); + assert!(!user_name.is_empty()); - let (at, mut ucmd) = at_and_ucmd!(); - let file1 = "test_install_target_dir_file_a1"; - let perm = ":".to_owned() + result.stdout.trim_end(); + let file1 = "test_chown_file1"; at.touch(file1); - let result = ucmd.arg(perm).arg(file1).run(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - - if is_ci() && result.stderr.contains("Operation not permitted") { + let result = scene + .ucmd() + .arg(format!(":{}", user_name)) + .arg("--verbose") + .arg(file1) + .run(); + if is_ci() && result.stderr_str().contains("Operation not permitted") { // With ubuntu with old Rust in the CI, we can get an error return; } - if is_ci() && result.stderr.contains("chown: invalid group:") { + if is_ci() && result.stderr_str().contains("chown: invalid group:") { // With mac into the CI, we can get this answer return; } - assert!(result.success); + result.stderr_contains(&"retained as"); + result.success(); + + scene + .ucmd() + .arg(":root") + .arg("--verbose") + .arg(file1) + .fails() + .stderr_contains(&"failed to change"); } #[test] -fn test_chown_only_id() { +fn test_chown_only_user_id() { // test chown 1111 file.txt - let result = TestScenario::new("id").ucmd_keepenv().arg("-u").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let result = scene.cmd_keepenv("id").arg("-u").run(); + if skipping_test_is_okay(&result, "id: cannot find name for group ID") { return; } - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let id = String::from(result.stdout.trim()); - - let (at, mut ucmd) = at_and_ucmd!(); - let file1 = "test_install_target_dir_file_a1"; + let user_id = String::from(result.stdout_str().trim()); + assert!(!user_id.is_empty()); + let file1 = "test_chown_file1"; at.touch(file1); - let result = ucmd.arg(id).arg(file1).run(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - if is_ci() && result.stderr.contains("chown: invalid user:") { - // With some Ubuntu into the CI, we can get this answer + let result = scene.ucmd().arg(user_id).arg("--verbose").arg(file1).run(); + if skipping_test_is_okay(&result, "invalid user") { + // From the Logs: "Build (ubuntu-18.04, x86_64-unknown-linux-gnu, feat_os_unix, use-cross)" + // stderr: "chown: invalid user: '1001' return; } - assert!(result.success); + result.stderr_contains(&"retained as"); + + scene + .ucmd() + .arg("0") + .arg("--verbose") + .arg(file1) + .fails() + .stderr_contains(&"failed to change"); } #[test] fn test_chown_only_group_id() { // test chown :1111 file.txt - let result = TestScenario::new("id").ucmd_keepenv().arg("-g").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let result = scene.cmd_keepenv("id").arg("-g").run(); + if skipping_test_is_okay(&result, "id: cannot find name for group ID") { return; } - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let id = String::from(result.stdout.trim()); - - let (at, mut ucmd) = at_and_ucmd!(); - let file1 = "test_install_target_dir_file_a1"; + let group_id = String::from(result.stdout_str().trim()); + assert!(!group_id.is_empty()); + let file1 = "test_chown_file1"; at.touch(file1); - let perm = ":".to_owned() + &id; - let result = ucmd.arg(perm).arg(file1).run(); - - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - if is_ci() && result.stderr.contains("chown: invalid group:") { + let result = scene + .ucmd() + .arg(format!(":{}", group_id)) + .arg("--verbose") + .arg(file1) + .run(); + if skipping_test_is_okay(&result, "chown: invalid group:") { // With mac into the CI, we can get this answer return; } - assert!(result.success); + result.stderr_contains(&"retained as"); + + // Apparently on CI "macos-latest, x86_64-apple-darwin, feat_os_macos" + // the process has the rights to change from runner:staff to runner:wheel + #[cfg(any(windows, all(unix, not(target_os = "macos"))))] + scene + .ucmd() + .arg(":0") + .arg("--verbose") + .arg(file1) + .fails() + .stderr_contains(&"failed to change"); } #[test] -fn test_chown_both_id() { +fn test_chown_owner_group_id() { // test chown 1111:1111 file.txt - let result = TestScenario::new("id").ucmd_keepenv().arg("-u").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let result = scene.cmd_keepenv("id").arg("-u").run(); + if skipping_test_is_okay(&result, "id: cannot find name for group ID") { return; } - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let id_user = String::from(result.stdout.trim()); + let user_id = String::from(result.stdout_str().trim()); + assert!(!user_id.is_empty()); - let result = TestScenario::new("id").ucmd_keepenv().arg("-g").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + let result = scene.cmd_keepenv("id").arg("-g").run(); + if skipping_test_is_okay(&result, "id: cannot find name for group ID") { return; } - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let id_group = String::from(result.stdout.trim()); - - let (at, mut ucmd) = at_and_ucmd!(); - let file1 = "test_install_target_dir_file_a1"; + let group_id = String::from(result.stdout_str().trim()); + assert!(!group_id.is_empty()); + let file1 = "test_chown_file1"; at.touch(file1); - let perm = id_user + &":".to_owned() + &id_group; - let result = ucmd.arg(perm).arg(file1).run(); - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - - if is_ci() && result.stderr.contains("invalid user") { - // In the CI, some server are failing to return id. - // As seems to be a configuration issue, ignoring it + let result = scene + .ucmd() + .arg(format!("{}:{}", user_id, group_id)) + .arg("--verbose") + .arg(file1) + .run(); + if skipping_test_is_okay(&result, "invalid user") { + // From the Logs: "Build (ubuntu-18.04, x86_64-unknown-linux-gnu, feat_os_unix, use-cross)" + // stderr: "chown: invalid user: '1001:116' return; } + result.stderr_contains(&"retained as"); - assert!(result.success); + scene + .ucmd() + .arg("0:0") + .arg("--verbose") + .arg(file1) + .fails() + .stderr_contains(&"failed to change"); } #[test] -fn test_chown_both_mix() { - // test chown 1111:1111 file.txt - let result = TestScenario::new("id").ucmd_keepenv().arg("-u").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it +fn test_chown_owner_group_mix() { + // test chown 1111:group file.txt + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let result = scene.cmd_keepenv("id").arg("-u").run(); + if skipping_test_is_okay(&result, "id: cannot find name for group ID") { return; } - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let id_user = String::from(result.stdout.trim()); + let user_id = String::from(result.stdout_str().trim()); + assert!(!user_id.is_empty()); - let result = TestScenario::new("id").ucmd_keepenv().arg("-gn").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + let result = scene.cmd_keepenv("id").arg("-gn").run(); + if skipping_test_is_okay(&result, "id: cannot find name for group ID") { return; } - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let group_name = String::from(result.stdout.trim()); - - let (at, mut ucmd) = at_and_ucmd!(); - let file1 = "test_install_target_dir_file_a1"; + let group_name = String::from(result.stdout_str().trim()); + assert!(!group_name.is_empty()); + let file1 = "test_chown_file1"; at.touch(file1); - let perm = id_user + &":".to_owned() + &group_name; - let result = ucmd.arg(perm).arg(file1).run(); + let result = scene + .ucmd() + .arg(format!("{}:{}", user_id, group_name)) + .arg("--verbose") + .arg(file1) + .run(); + result.stderr_contains(&"retained as"); - if is_ci() && result.stderr.contains("invalid user") { - // In the CI, some server are failing to return id. - // As seems to be a configuration issue, ignoring it - return; - } - assert!(result.success); + // TODO: on macos group name is not recognized correctly: "chown: invalid group: '0:root' + #[cfg(any(windows, all(unix, not(target_os = "macos"))))] + scene + .ucmd() + .arg("0:root") + .arg("--verbose") + .arg(file1) + .fails() + .stderr_contains(&"failed to change"); } #[test] fn test_chown_recursive() { let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + let result = scene.cmd("whoami").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + if skipping_test_is_okay(&result, "whoami: cannot find name for user ID") { return; } - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let username = result.stdout.trim_end(); + let user_name = String::from(result.stdout_str().trim()); + assert!(!user_name.is_empty()); - let (at, mut ucmd) = at_and_ucmd!(); - at.mkdir("a"); - at.mkdir("a/b"); - at.mkdir("a/b/c"); + at.mkdir_all("a/b/c"); at.mkdir("z"); at.touch(&at.plus_as_string("a/a")); at.touch(&at.plus_as_string("a/b/b")); at.touch(&at.plus_as_string("a/b/c/c")); at.touch(&at.plus_as_string("z/y")); - let result = ucmd + let result = scene + .ucmd() .arg("-R") .arg("--verbose") - .arg(username) + .arg(user_name) .arg("a") .arg("z") .run(); - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - if is_ci() && result.stderr.contains("invalid user") { - // In the CI, some server are failing to return id. - // As seems to be a configuration issue, ignoring it - return; - } - - assert!(result.stderr.contains("ownership of 'a/a' retained as")); - assert!(result.stderr.contains("ownership of 'z/y' retained as")); - assert!(result.success); + result.stderr_contains(&"ownership of 'a/a' retained as"); + result.stderr_contains(&"ownership of 'z/y' retained as"); } #[test] fn test_root_preserve() { let scene = TestScenario::new(util_name!()); + let result = scene.cmd("whoami").run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + if skipping_test_is_okay(&result, "whoami: cannot find name for user ID") { return; } - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let username = result.stdout.trim_end(); + let user_name = String::from(result.stdout_str().trim()); + assert!(!user_name.is_empty()); - let result = new_ucmd!() + let result = scene + .ucmd() .arg("--preserve-root") .arg("-R") - .arg(username) + .arg(user_name) .arg("/") .fails(); - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - if is_ci() && result.stderr.contains("invalid user") { - // In the CI, some server are failing to return id. - // As seems to be a configuration issue, ignoring it - return; - } - assert!(result - .stderr - .contains("chown: it is dangerous to operate recursively")); + result.stderr_contains(&"chown: it is dangerous to operate recursively"); } #[cfg(target_os = "linux")] @@ -392,8 +509,34 @@ fn test_big_p() { .arg("bin") .arg("/proc/self/cwd") .fails() - .stderr_is( - "chown: changing ownership of '/proc/self/cwd': Operation not permitted (os error 1)\n", + .stderr_contains( + "chown: changing ownership of '/proc/self/cwd': Operation not permitted (os error 1)", ); } } + +#[test] +fn test_chown_file_notexisting() { + // test chown username not_existing + + let scene = TestScenario::new(util_name!()); + + let result = scene.cmd("whoami").run(); + if skipping_test_is_okay(&result, "whoami: cannot find name for user ID") { + return; + } + let user_name = String::from(result.stdout_str().trim()); + assert!(!user_name.is_empty()); + + let _result = scene + .ucmd() + .arg(user_name) + .arg("--verbose") + .arg("not_existing") + .fails(); + + // TODO: uncomment once "failed to change ownership of '{}' to {}" added to stdout + // result.stderr_contains(&"retained as"); + // TODO: uncomment once message changed from "cannot dereference" to "cannot access" + // result.stderr_contains(&"cannot access 'not_existing': No such file or directory"); +} diff --git a/tests/by-util/test_chroot.rs b/tests/by-util/test_chroot.rs index 9a8fb71dd..0479e7c3a 100644 --- a/tests/by-util/test_chroot.rs +++ b/tests/by-util/test_chroot.rs @@ -4,14 +4,11 @@ use crate::common::util::*; fn test_missing_operand() { let result = new_ucmd!().run(); - assert_eq!( - true, - result - .stderr - .starts_with("error: The following required arguments were not provided") - ); + assert!(result + .stderr_str() + .starts_with("error: The following required arguments were not provided")); - assert_eq!(true, result.stderr.contains("")); + assert!(result.stderr_str().contains("")); } #[test] @@ -20,14 +17,11 @@ fn test_enter_chroot_fails() { at.mkdir("jail"); - let result = ucmd.arg("jail").run(); + let result = ucmd.arg("jail").fails(); - assert_eq!( - true, - result.stderr.starts_with( - "chroot: error: cannot chroot to jail: Operation not permitted (os error 1)" - ) - ) + assert!(result + .stderr_str() + .starts_with("chroot: cannot chroot to jail: Operation not permitted (os error 1)")); } #[test] @@ -38,7 +32,7 @@ fn test_no_such_directory() { ucmd.arg("a") .fails() - .stderr_is("chroot: error: cannot change root directory to `a`: no such directory"); + .stderr_is("chroot: cannot change root directory to `a`: no such directory"); } #[test] @@ -47,39 +41,36 @@ fn test_invalid_user_spec() { at.mkdir("a"); - let result = ucmd.arg("a").arg("--userspec=ARABA:").run(); + let result = ucmd.arg("a").arg("--userspec=ARABA:").fails(); - assert_eq!( - true, - result.stderr.starts_with("chroot: error: invalid userspec") - ); + assert!(result.stderr_str().starts_with("chroot: invalid userspec")); } #[test] fn test_preference_of_userspec() { let scene = TestScenario::new(util_name!()); let result = scene.cmd("whoami").run(); - if is_ci() && result.stderr.contains("No such user/group") { + if is_ci() && result.stderr_str().contains("No such user/group") { // In the CI, some server are failing to return whoami. // As seems to be a configuration issue, ignoring it return; } - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let username = result.stdout.trim_end(); + println!("result.stdout = {}", result.stdout_str()); + println!("result.stderr = {}", result.stderr_str()); + let username = result.stdout_str().trim_end(); let ts = TestScenario::new("id"); let result = ts.cmd("id").arg("-g").arg("-n").run(); - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); + println!("result.stdout = {}", result.stdout_str()); + println!("result.stderr = {}", result.stderr_str()); - if is_ci() && result.stderr.contains("cannot find name for user ID") { + if is_ci() && result.stderr_str().contains("cannot find name for user ID") { // In the CI, some server are failing to return id. // As seems to be a configuration issue, ignoring it return; } - let group_name = result.stdout.trim_end(); + let group_name = result.stdout_str().trim_end(); let (at, mut ucmd) = at_and_ucmd!(); at.mkdir("a"); @@ -93,6 +84,6 @@ fn test_preference_of_userspec() { .arg(format!("--userspec={}:{}", username, group_name)) .run(); - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); + println!("result.stdout = {}", result.stdout_str()); + println!("result.stderr = {}", result.stderr_str()); } diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index 8b41c782c..81ef4c177 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -31,41 +31,50 @@ fn test_empty() { at.touch("a"); - ucmd.arg("a").succeeds().stdout.ends_with("0 a"); + ucmd.arg("a") + .succeeds() + .no_stderr() + .normalized_newlines_stdout_is("4294967295 0 a\n"); } #[test] -#[ignore] fn test_arg_overrides_stdin() { let (at, mut ucmd) = at_and_ucmd!(); let input = "foobarfoobar"; at.touch("a"); - let result = ucmd.arg("a").pipe_in(input.as_bytes()).run(); - - println!("{}, {}", result.stdout, result.stderr); - - assert!(result.stdout.ends_with("0 a\n")) + ucmd.arg("a") + .pipe_in(input.as_bytes()) + // the command might have exited before all bytes have been pipe in. + // in that case, we don't care about the error (broken pipe) + .ignore_stdin_write_error() + .succeeds() + .no_stderr() + .normalized_newlines_stdout_is("4294967295 0 a\n"); } #[test] fn test_invalid_file() { - let (_, mut ucmd) = at_and_ucmd!(); + let ts = TestScenario::new(util_name!()); + let at = ts.fixtures.clone(); - let ls = TestScenario::new("ls"); - let files = ls.cmd("ls").arg("-l").run(); - println!("{:?}", files.stdout); - println!("{:?}", files.stderr); + let folder_name = "asdf"; - let folder_name = "asdf".to_string(); + // First check when file doesn't exist + ts.ucmd() + .arg(folder_name) + .fails() + .no_stdout() + .stderr_contains("cksum: 'asdf' No such file or directory"); - let result = ucmd.arg(&folder_name).run(); - - println!("stdout: {:?}", result.stdout); - println!("stderr: {:?}", result.stderr); - assert!(result.stderr.contains("cksum: error: 'asdf'")); - assert!(!result.success); + // Then check when the file is of an invalid type + at.mkdir(folder_name); + ts.ucmd() + .arg(folder_name) + .fails() + .no_stdout() + .stderr_contains("cksum: 'asdf' Is a directory"); } // Make sure crc is correct for files larger than 32 bytes @@ -74,14 +83,13 @@ fn test_invalid_file() { fn test_crc_for_bigger_than_32_bytes() { let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("chars.txt").run(); + let result = ucmd.arg("chars.txt").succeeds(); - let mut stdout_splitted = result.stdout.split(" "); + let mut stdout_splitted = result.stdout_str().split(" "); let cksum: i64 = stdout_splitted.next().unwrap().parse().unwrap(); let bytes_cnt: i64 = stdout_splitted.next().unwrap().parse().unwrap(); - assert!(result.success); assert_eq!(cksum, 586047089); assert_eq!(bytes_cnt, 16); } @@ -90,14 +98,13 @@ fn test_crc_for_bigger_than_32_bytes() { fn test_stdin_larger_than_128_bytes() { let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("larger_than_2056_bytes.txt").run(); + let result = ucmd.arg("larger_than_2056_bytes.txt").succeeds(); - let mut stdout_splitted = result.stdout.split(" "); + let mut stdout_splitted = result.stdout_str().split(" "); let cksum: i64 = stdout_splitted.next().unwrap().parse().unwrap(); let bytes_cnt: i64 = stdout_splitted.next().unwrap().parse().unwrap(); - assert!(result.success); assert_eq!(cksum, 945881979); assert_eq!(bytes_cnt, 2058); } diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 1fa8212ca..d49219b04 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -42,13 +42,9 @@ static TEST_MOUNT_OTHER_FILESYSTEM_FILE: &str = "mount/DO_NOT_copy_me.txt"; fn test_cp_cp() { let (at, mut ucmd) = at_and_ucmd!(); // Invoke our binary to make the copy. - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HELLO_WORLD_DEST) - .run(); - - // Check that the exit code represents a successful copy. - assert!(result.success); + .succeeds(); // Check the content of the destination file that was copied. assert_eq!(at.read(TEST_HELLO_WORLD_DEST), "Hello, World!\n"); @@ -57,12 +53,9 @@ fn test_cp_cp() { #[test] fn test_cp_existing_target() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_EXISTING_FILE) - .run(); - - assert!(result.success); + .succeeds(); // Check the content of the destination file assert_eq!(at.read(TEST_EXISTING_FILE), "Hello, World!\n"); @@ -74,52 +67,41 @@ fn test_cp_existing_target() { #[test] fn test_cp_duplicate_files() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_COPY_TO_FOLDER) - .run(); - - assert!(result.success); - assert!(result.stderr.contains("specified more than once")); + .succeeds() + .stderr_contains("specified more than once"); assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n"); } #[test] fn test_cp_multiple_files_target_is_file() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd + new_ucmd!() .arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_EXISTING_FILE) - .run(); - - assert!(!result.success); - assert!(result.stderr.contains("not a directory")); + .fails() + .stderr_contains("not a directory"); } #[test] fn test_cp_directory_not_recursive() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd + new_ucmd!() .arg(TEST_COPY_TO_FOLDER) .arg(TEST_HELLO_WORLD_DEST) - .run(); - - assert!(!result.success); - assert!(result.stderr.contains("omitting directory")); + .fails() + .stderr_contains("omitting directory"); } #[test] fn test_cp_multiple_files() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HOW_ARE_YOU_SOURCE) .arg(TEST_COPY_TO_FOLDER) - .run(); + .succeeds(); - assert!(result.success); assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n"); assert_eq!(at.read(TEST_HOW_ARE_YOU_DEST), "How are you?\n"); } @@ -129,14 +111,11 @@ fn test_cp_multiple_files() { #[cfg(not(macos))] fn test_cp_recurse() { let (at, mut ucmd) = at_and_ucmd!(); - - let result = ucmd - .arg("-r") + ucmd.arg("-r") .arg(TEST_COPY_FROM_FOLDER) .arg(TEST_COPY_TO_FOLDER_NEW) - .run(); + .succeeds(); - assert!(result.success); // Check the content of the destination file that was copied. assert_eq!(at.read(TEST_COPY_TO_FOLDER_NEW_FILE), "Hello, World!\n"); } @@ -144,14 +123,10 @@ fn test_cp_recurse() { #[test] fn test_cp_with_dirs_t() { let (at, mut ucmd) = at_and_ucmd!(); - - //using -t option - let result_to_dir_t = ucmd - .arg("-t") + ucmd.arg("-t") .arg(TEST_COPY_TO_FOLDER) .arg(TEST_HELLO_WORLD_SOURCE) - .run(); - assert!(result_to_dir_t.success); + .succeeds(); assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n"); } @@ -162,63 +137,52 @@ fn test_cp_with_dirs() { let scene = TestScenario::new(util_name!()); let at = &scene.fixtures; - //using -t option - let result_to_dir = scene + scene .ucmd() .arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_COPY_TO_FOLDER) - .run(); - assert!(result_to_dir.success); + .succeeds(); assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n"); - let result_from_dir = scene + scene .ucmd() .arg(TEST_COPY_FROM_FOLDER_FILE) .arg(TEST_HELLO_WORLD_DEST) - .run(); - assert!(result_from_dir.success); + .succeeds(); assert_eq!(at.read(TEST_HELLO_WORLD_DEST), "Hello, World!\n"); } #[test] fn test_cp_arg_target_directory() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg("-t") .arg(TEST_COPY_TO_FOLDER) - .run(); + .succeeds(); - assert!(result.success); assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n"); } #[test] fn test_cp_arg_no_target_directory() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd + new_ucmd!() .arg(TEST_HELLO_WORLD_SOURCE) .arg("-v") .arg("-T") .arg(TEST_COPY_TO_FOLDER) - .run(); - - assert!(!result.success); - assert!(result.stderr.contains("cannot overwrite directory")); + .fails() + .stderr_contains("cannot overwrite directory"); } #[test] fn test_cp_arg_interactive() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd + new_ucmd!() .arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HOW_ARE_YOU_SOURCE) .arg("-i") .pipe_in("N\n") - .run(); - - assert!(result.success); - assert!(result.stderr.contains("Not overwriting")); + .succeeds() + .stderr_contains("Not overwriting"); } #[test] @@ -227,39 +191,33 @@ fn test_cp_arg_link() { use std::os::linux::fs::MetadataExt; let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg("--link") .arg(TEST_HELLO_WORLD_DEST) - .run(); + .succeeds(); - assert!(result.success); assert_eq!(at.metadata(TEST_HELLO_WORLD_SOURCE).st_nlink(), 2); } #[test] fn test_cp_arg_symlink() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg("--symbolic-link") .arg(TEST_HELLO_WORLD_DEST) - .run(); + .succeeds(); - assert!(result.success); assert!(at.is_symlink(TEST_HELLO_WORLD_DEST)); } #[test] fn test_cp_arg_no_clobber() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) - .arg("--no-clobber") + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HOW_ARE_YOU_SOURCE) - .run(); + .arg("--no-clobber") + .succeeds(); - assert!(result.success); assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "How are you?\n"); } @@ -267,34 +225,31 @@ fn test_cp_arg_no_clobber() { fn test_cp_arg_no_clobber_twice() { let scene = TestScenario::new(util_name!()); let at = &scene.fixtures; + at.touch("source.txt"); - let result = scene + scene .ucmd() .arg("--no-clobber") .arg("source.txt") .arg("dest.txt") - .run(); + .succeeds() + .no_stderr(); - println!("stderr = {:?}", result.stderr); - println!("stdout = {:?}", result.stdout); - assert!(result.success); - assert!(result.stderr.is_empty()); assert_eq!(at.read("source.txt"), ""); at.append("source.txt", "some-content"); - let result = scene + scene .ucmd() .arg("--no-clobber") .arg("source.txt") .arg("dest.txt") - .run(); + .succeeds() + .stdout_does_not_contain("Not overwriting"); - assert!(result.success); assert_eq!(at.read("source.txt"), "some-content"); // Should be empty as the "no-clobber" should keep // the previous version assert_eq!(at.read("dest.txt"), ""); - assert!(!result.stderr.contains("Not overwriting")); } #[test] @@ -311,16 +266,11 @@ fn test_cp_arg_force() { permissions.set_readonly(true); set_permissions(at.plus(TEST_HELLO_WORLD_DEST), permissions).unwrap(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg("--force") .arg(TEST_HELLO_WORLD_DEST) - .run(); + .succeeds(); - println!("{:?}", result.stderr); - println!("{:?}", result.stdout); - - assert!(result.success); assert_eq!(at.read(TEST_HELLO_WORLD_DEST), "Hello, World!\n"); } @@ -342,13 +292,11 @@ fn test_cp_arg_remove_destination() { permissions.set_readonly(true); set_permissions(at.plus(TEST_HELLO_WORLD_DEST), permissions).unwrap(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg("--remove-destination") .arg(TEST_HELLO_WORLD_DEST) - .run(); + .succeeds(); - assert!(result.success); assert_eq!(at.read(TEST_HELLO_WORLD_DEST), "Hello, World!\n"); } @@ -356,13 +304,43 @@ fn test_cp_arg_remove_destination() { fn test_cp_arg_backup() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) - .arg("--backup") + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HOW_ARE_YOU_SOURCE) - .run(); + .arg("-b") + .succeeds(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert_eq!( + at.read(&*format!("{}~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_arg_backup_with_other_args() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .arg("-vbL") + .succeeds(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert_eq!( + at.read(&*format!("{}~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_arg_backup_arg_first() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds(); - assert!(result.success); assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); assert_eq!( at.read(&*format!("{}~", TEST_HOW_ARE_YOU_SOURCE)), @@ -374,14 +352,13 @@ fn test_cp_arg_backup() { fn test_cp_arg_suffix() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) + .arg("-b") .arg("--suffix") .arg(".bak") .arg(TEST_HOW_ARE_YOU_SOURCE) - .run(); + .succeeds(); - assert!(result.success); assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); assert_eq!( at.read(&*format!("{}.bak", TEST_HOW_ARE_YOU_SOURCE)), @@ -390,10 +367,210 @@ fn test_cp_arg_suffix() { } #[test] -fn test_cp_deref_conflicting_options() { - let (_at, mut ucmd) = at_and_ucmd!(); +fn test_cp_custom_backup_suffix_via_env() { + let (at, mut ucmd) = at_and_ucmd!(); + let suffix = "super-suffix-of-the-century"; - ucmd.arg("-LP") + ucmd.arg("-b") + .env("SIMPLE_BACKUP_SUFFIX", suffix) + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert_eq!( + at.read(&*format!("{}{}", TEST_HOW_ARE_YOU_SOURCE, suffix)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_backup_numbered_with_t() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup=t") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert_eq!( + at.read(&*format!("{}.~1~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_backup_numbered() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup=numbered") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert_eq!( + at.read(&*format!("{}.~1~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_backup_existing() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup=existing") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert_eq!( + at.read(&*format!("{}~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_backup_nil() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup=nil") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert_eq!( + at.read(&*format!("{}~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_numbered_if_existing_backup_existing() { + let (at, mut ucmd) = at_and_ucmd!(); + let existing_backup = &*format!("{}.~1~", TEST_HOW_ARE_YOU_SOURCE); + at.touch(existing_backup); + + ucmd.arg("--backup=existing") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(TEST_HOW_ARE_YOU_SOURCE)); + assert!(at.file_exists(existing_backup)); + assert_eq!( + at.read(&*format!("{}.~2~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_numbered_if_existing_backup_nil() { + let (at, mut ucmd) = at_and_ucmd!(); + let existing_backup = &*format!("{}.~1~", TEST_HOW_ARE_YOU_SOURCE); + + at.touch(existing_backup); + ucmd.arg("--backup=nil") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(TEST_HOW_ARE_YOU_SOURCE)); + assert!(at.file_exists(existing_backup)); + assert_eq!( + at.read(&*format!("{}.~2~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_backup_simple() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup=simple") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert_eq!( + at.read(&*format!("{}~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_backup_never() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup=never") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert_eq!( + at.read(&*format!("{}~", TEST_HOW_ARE_YOU_SOURCE)), + "How are you?\n" + ); +} + +#[test] +fn test_cp_backup_none() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup=none") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert!(!at.file_exists(&format!("{}~", TEST_HOW_ARE_YOU_SOURCE))); +} + +#[test] +fn test_cp_backup_off() { + let (at, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup=off") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .succeeds() + .no_stderr(); + + assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); + assert!(!at.file_exists(&format!("{}~", TEST_HOW_ARE_YOU_SOURCE))); +} + +#[test] +fn test_cp_backup_no_clobber_conflicting_options() { + let (_, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup") + .arg("--no-clobber") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .fails() + .stderr_is("cp: options --backup and --no-clobber are mutually exclusive\nTry 'cp --help' for more information."); +} + +#[test] +fn test_cp_deref_conflicting_options() { + new_ucmd!() + .arg("-LP") .arg(TEST_COPY_TO_FOLDER) .arg(TEST_HELLO_WORLD_SOURCE) .fails(); @@ -401,8 +578,7 @@ fn test_cp_deref_conflicting_options() { #[test] fn test_cp_deref() { - let scene = TestScenario::new(util_name!()); - let at = &scene.fixtures; + let (at, mut ucmd) = at_and_ucmd!(); #[cfg(not(windows))] let _r = fs::symlink( @@ -415,16 +591,12 @@ fn test_cp_deref() { at.subdir.join(TEST_HELLO_WORLD_SOURCE_SYMLINK), ); //using -L option - let result = scene - .ucmd() - .arg("-L") + ucmd.arg("-L") .arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HELLO_WORLD_SOURCE_SYMLINK) .arg(TEST_COPY_TO_FOLDER) - .run(); + .succeeds(); - // Check that the exit code represents a successful copy. - assert!(result.success); let path_to_new_symlink = at .subdir .join(TEST_COPY_TO_FOLDER) @@ -444,8 +616,7 @@ fn test_cp_deref() { } #[test] fn test_cp_no_deref() { - let scene = TestScenario::new(util_name!()); - let at = &scene.fixtures; + let (at, mut ucmd) = at_and_ucmd!(); #[cfg(not(windows))] let _r = fs::symlink( @@ -458,16 +629,12 @@ fn test_cp_no_deref() { at.subdir.join(TEST_HELLO_WORLD_SOURCE_SYMLINK), ); //using -P option - let result = scene - .ucmd() - .arg("-P") + ucmd.arg("-P") .arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HELLO_WORLD_SOURCE_SYMLINK) .arg(TEST_COPY_TO_FOLDER) - .run(); + .succeeds(); - // Check that the exit code represents a successful copy. - assert!(result.success); let path_to_new_symlink = at .subdir .join(TEST_COPY_TO_FOLDER) @@ -490,14 +657,10 @@ fn test_cp_strip_trailing_slashes() { let (at, mut ucmd) = at_and_ucmd!(); //using --strip-trailing-slashes option - let result = ucmd - .arg("--strip-trailing-slashes") + ucmd.arg("--strip-trailing-slashes") .arg(format!("{}/", TEST_HELLO_WORLD_SOURCE)) .arg(TEST_HELLO_WORLD_DEST) - .run(); - - // Check that the exit code represents a successful copy. - assert!(result.success); + .succeeds(); // Check the content of the destination file that was copied. assert_eq!(at.read(TEST_HELLO_WORLD_DEST), "Hello, World!\n"); @@ -507,14 +670,11 @@ fn test_cp_strip_trailing_slashes() { fn test_cp_parents() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg("--parents") + ucmd.arg("--parents") .arg(TEST_COPY_FROM_FOLDER_FILE) .arg(TEST_COPY_TO_FOLDER) - .run(); + .succeeds(); - assert!(result.success); - // Check the content of the destination file that was copied. assert_eq!( at.read(&format!( "{}/{}", @@ -528,14 +688,12 @@ fn test_cp_parents() { fn test_cp_parents_multiple_files() { let (at, mut ucmd) = at_and_ucmd!(); - let result = ucmd - .arg("--parents") + ucmd.arg("--parents") .arg(TEST_COPY_FROM_FOLDER_FILE) .arg(TEST_HOW_ARE_YOU_SOURCE) .arg(TEST_COPY_TO_FOLDER) - .run(); + .succeeds(); - assert!(result.success); assert_eq!( at.read(&format!( "{}/{}", @@ -554,20 +712,12 @@ fn test_cp_parents_multiple_files() { #[test] fn test_cp_parents_dest_not_directory() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd + new_ucmd!() .arg("--parents") .arg(TEST_COPY_FROM_FOLDER_FILE) .arg(TEST_HELLO_WORLD_DEST) - .run(); - println!("{:?}", result); - - // Check that we did not succeed in copying. - assert!(!result.success); - assert!(result - .stderr - .contains("with --parents, the destination must be a directory")); + .fails() + .stderr_contains("with --parents, the destination must be a directory"); } #[test] @@ -594,29 +744,25 @@ fn test_cp_deref_folder_to_folder() { assert!(env::set_current_dir(&cwd).is_ok()); //using -P -R option - let result = scene + scene .ucmd() .arg("-L") .arg("-R") .arg("-v") .arg(TEST_COPY_FROM_FOLDER) .arg(TEST_COPY_TO_FOLDER_NEW) - .run(); - println!("cp output {}", result.stdout); - - // Check that the exit code represents a successful copy. - assert!(result.success); + .succeeds(); #[cfg(not(windows))] { let scene2 = TestScenario::new("ls"); let result = scene2.cmd("ls").arg("-al").arg(path_to_new_symlink).run(); - println!("ls source {}", result.stdout); + println!("ls source {}", result.stdout_str()); let path_to_new_symlink = at.subdir.join(TEST_COPY_TO_FOLDER_NEW); let result = scene2.cmd("ls").arg("-al").arg(path_to_new_symlink).run(); - println!("ls dest {}", result.stdout); + println!("ls dest {}", result.stdout_str()); } #[cfg(windows)] @@ -698,29 +844,25 @@ fn test_cp_no_deref_folder_to_folder() { assert!(env::set_current_dir(&cwd).is_ok()); //using -P -R option - let result = scene + scene .ucmd() .arg("-P") .arg("-R") .arg("-v") .arg(TEST_COPY_FROM_FOLDER) .arg(TEST_COPY_TO_FOLDER_NEW) - .run(); - println!("cp output {}", result.stdout); - - // Check that the exit code represents a successful copy. - assert!(result.success); + .succeeds(); #[cfg(not(windows))] { let scene2 = TestScenario::new("ls"); let result = scene2.cmd("ls").arg("-al").arg(path_to_new_symlink).run(); - println!("ls source {}", result.stdout); + println!("ls source {}", result.stdout_str()); let path_to_new_symlink = at.subdir.join(TEST_COPY_TO_FOLDER_NEW); let result = scene2.cmd("ls").arg("-al").arg(path_to_new_symlink).run(); - println!("ls dest {}", result.stdout); + println!("ls dest {}", result.stdout_str()); } #[cfg(windows)] @@ -791,13 +933,11 @@ fn test_cp_archive() { previous, ) .unwrap(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg("--archive") .arg(TEST_HOW_ARE_YOU_SOURCE) - .run(); + .succeeds(); - assert!(result.success); assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); let metadata = std_fs::metadata(at.subdir.join(TEST_HELLO_WORLD_SOURCE)).unwrap(); @@ -807,11 +947,10 @@ fn test_cp_archive() { let creation2 = metadata2.modified().unwrap(); let scene2 = TestScenario::new("ls"); - let result = scene2.cmd("ls").arg("-al").arg(at.subdir).run(); + let result = scene2.cmd("ls").arg("-al").arg(at.subdir).succeeds(); - println!("ls dest {}", result.stdout); + println!("ls dest {}", result.stdout_str()); assert_eq!(creation, creation2); - assert!(result.success); } #[test] @@ -850,11 +989,10 @@ fn test_cp_archive_recursive() { // Back to the initial cwd (breaks the other tests) assert!(env::set_current_dir(&cwd).is_ok()); - let resultg = ucmd - .arg("--archive") + ucmd.arg("--archive") .arg(TEST_COPY_TO_FOLDER) .arg(TEST_COPY_TO_FOLDER_NEW) - .run(); + .fails(); // fails for now let scene2 = TestScenario::new("ls"); let result = scene2 @@ -863,16 +1001,15 @@ fn test_cp_archive_recursive() { .arg(&at.subdir.join(TEST_COPY_TO_FOLDER)) .run(); - println!("ls dest {}", result.stdout); + println!("ls dest {}", result.stdout_str()); - let scene2 = TestScenario::new("ls"); let result = scene2 .cmd("ls") .arg("-al") .arg(&at.subdir.join(TEST_COPY_TO_FOLDER_NEW)) .run(); - println!("ls dest {}", result.stdout); + println!("ls dest {}", result.stdout_str()); assert!(at.file_exists( &at.subdir .join(TEST_COPY_TO_FOLDER_NEW) @@ -910,9 +1047,6 @@ fn test_cp_archive_recursive() { .join("2.link") .to_string_lossy() )); - - // fails for now - assert!(resultg.success); } #[test] @@ -928,13 +1062,11 @@ fn test_cp_preserve_timestamps() { previous, ) .unwrap(); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg("--preserve=timestamps") .arg(TEST_HOW_ARE_YOU_SOURCE) - .run(); + .succeeds(); - assert!(result.success); assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); let metadata = std_fs::metadata(at.subdir.join(TEST_HELLO_WORLD_SOURCE)).unwrap(); @@ -946,9 +1078,8 @@ fn test_cp_preserve_timestamps() { let scene2 = TestScenario::new("ls"); let result = scene2.cmd("ls").arg("-al").arg(at.subdir).run(); - println!("ls dest {}", result.stdout); + println!("ls dest {}", result.stdout_str()); assert_eq!(creation, creation2); - assert!(result.success); } #[test] @@ -966,13 +1097,11 @@ fn test_cp_dont_preserve_timestamps() { .unwrap(); sleep(Duration::from_secs(3)); - let result = ucmd - .arg(TEST_HELLO_WORLD_SOURCE) + ucmd.arg(TEST_HELLO_WORLD_SOURCE) .arg("--no-preserve=timestamps") .arg(TEST_HOW_ARE_YOU_SOURCE) - .run(); + .succeeds(); - assert!(result.success); assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n"); let metadata = std_fs::metadata(at.subdir.join(TEST_HELLO_WORLD_SOURCE)).unwrap(); @@ -984,7 +1113,7 @@ fn test_cp_dont_preserve_timestamps() { let scene2 = TestScenario::new("ls"); let result = scene2.cmd("ls").arg("-al").arg(at.subdir).run(); - println!("ls dest {}", result.stdout); + println!("ls dest {}", result.stdout_str()); println!("creation {:?} / {:?}", creation, creation2); assert_ne!(creation, creation2); @@ -992,7 +1121,6 @@ fn test_cp_dont_preserve_timestamps() { // Some margins with time check assert!(res.as_secs() > 3595); assert!(res.as_secs() < 3605); - assert!(result.success); } #[test] @@ -1017,7 +1145,7 @@ fn test_cp_one_file_system() { let scene = TestScenario::new(util_name!()); // Test must be run as root (or with `sudo -E`) - if scene.cmd("whoami").run().stdout != "root\n" { + if scene.cmd("whoami").run().stdout_str() != "root\n" { return; } @@ -1029,7 +1157,7 @@ fn test_cp_one_file_system() { at_src.mkdir(TEST_MOUNT_MOUNTPOINT); let mountpoint_path = &at_src.plus_as_string(TEST_MOUNT_MOUNTPOINT); - let _r = scene + scene .cmd("mount") .arg("-t") .arg("tmpfs") @@ -1037,24 +1165,21 @@ fn test_cp_one_file_system() { .arg("size=640k") // ought to be enough .arg("tmpfs") .arg(mountpoint_path) - .run(); - assert!(_r.code == Some(0), "{}", _r.stderr); + .succeeds(); at_src.touch(TEST_MOUNT_OTHER_FILESYSTEM_FILE); // Begin testing -x flag - let result = scene + scene .ucmd() .arg("-rx") .arg(TEST_MOUNT_COPY_FROM_FOLDER) .arg(TEST_COPY_TO_FOLDER_NEW) - .run(); + .succeeds(); // Ditch the mount before the asserts - let _r = scene.cmd("umount").arg(mountpoint_path).run(); - assert!(_r.code == Some(0), "{}", _r.stderr); + scene.cmd("umount").arg(mountpoint_path).succeeds(); - assert!(result.success); assert!(!at_dst.file_exists(TEST_MOUNT_OTHER_FILESYSTEM_FILE)); // Check if the other files were copied from the source folder hirerarchy for entry in WalkDir::new(at_src.as_string()) { @@ -1074,3 +1199,59 @@ fn test_cp_one_file_system() { } } } + +#[test] +#[cfg(any(target_os = "linux", target_os = "macos"))] +fn test_cp_reflink_always() { + let (at, mut ucmd) = at_and_ucmd!(); + let result = ucmd + .arg("--reflink=always") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_EXISTING_FILE) + .run(); + + if result.succeeded() { + // Check the content of the destination file + assert_eq!(at.read(TEST_EXISTING_FILE), "Hello, World!\n"); + } else { + // Older Linux versions do not support cloning. + } +} + +#[test] +#[cfg(any(target_os = "linux", target_os = "macos"))] +fn test_cp_reflink_auto() { + let (at, mut ucmd) = at_and_ucmd!(); + ucmd.arg("--reflink=auto") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_EXISTING_FILE) + .succeeds(); + + // Check the content of the destination file + assert_eq!(at.read(TEST_EXISTING_FILE), "Hello, World!\n"); +} + +#[test] +#[cfg(any(target_os = "linux", target_os = "macos"))] +fn test_cp_reflink_never() { + let (at, mut ucmd) = at_and_ucmd!(); + ucmd.arg("--reflink=never") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_EXISTING_FILE) + .succeeds(); + + // Check the content of the destination file + assert_eq!(at.read(TEST_EXISTING_FILE), "Hello, World!\n"); +} + +#[test] +#[cfg(any(target_os = "linux", target_os = "macos"))] +fn test_cp_reflink_bad() { + let (_, mut ucmd) = at_and_ucmd!(); + let _result = ucmd + .arg("--reflink=bad") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_EXISTING_FILE) + .fails() + .stderr_contains("invalid argument"); +} diff --git a/tests/by-util/test_csplit.rs b/tests/by-util/test_csplit.rs index 51cab483c..ae0885ff8 100644 --- a/tests/by-util/test_csplit.rs +++ b/tests/by-util/test_csplit.rs @@ -208,7 +208,7 @@ fn test_up_to_match_repeat_over() { ucmd.args(&["numbers50.txt", "/9$/", "{50}"]) .fails() .stdout_is("16\n29\n30\n30\n30\n6\n") - .stderr_is("csplit: error: '/9$/': match not found on repetition 5"); + .stderr_is("csplit: '/9$/': match not found on repetition 5"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -219,7 +219,7 @@ fn test_up_to_match_repeat_over() { ucmd.args(&["numbers50.txt", "/9$/", "{50}", "-k"]) .fails() .stdout_is("16\n29\n30\n30\n30\n6\n") - .stderr_is("csplit: error: '/9$/': match not found on repetition 5"); + .stderr_is("csplit: '/9$/': match not found on repetition 5"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -365,7 +365,7 @@ fn test_option_keep() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["-k", "numbers50.txt", "/20/", "/nope/"]) .fails() - .stderr_is("csplit: error: '/nope/': match not found") + .stderr_is("csplit: '/nope/': match not found") .stdout_is("48\n93\n"); let count = glob(&at.plus_as_string("xx*")) @@ -541,7 +541,7 @@ fn test_up_to_match_context_overflow() { ucmd.args(&["numbers50.txt", "/45/+10"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '/45/+10': line number out of range"); + .stderr_is("csplit: '/45/+10': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -552,7 +552,7 @@ fn test_up_to_match_context_overflow() { ucmd.args(&["numbers50.txt", "/45/+10", "-k"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '/45/+10': line number out of range"); + .stderr_is("csplit: '/45/+10': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -567,7 +567,7 @@ fn test_skip_to_match_context_underflow() { ucmd.args(&["numbers50.txt", "%5%-10"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '%5%-10': line number out of range"); + .stderr_is("csplit: '%5%-10': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -578,7 +578,7 @@ fn test_skip_to_match_context_underflow() { ucmd.args(&["numbers50.txt", "%5%-10", "-k"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '%5%-10': line number out of range"); + .stderr_is("csplit: '%5%-10': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -592,7 +592,7 @@ fn test_skip_to_match_context_overflow() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "%45%+10"]) .fails() - .stderr_only("csplit: error: '%45%+10': line number out of range"); + .stderr_only("csplit: '%45%+10': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -602,7 +602,7 @@ fn test_skip_to_match_context_overflow() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "%45%+10", "-k"]) .fails() - .stderr_only("csplit: error: '%45%+10': line number out of range"); + .stderr_only("csplit: '%45%+10': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -616,7 +616,7 @@ fn test_up_to_no_match1() { ucmd.args(&["numbers50.txt", "/4/", "/nope/"]) .fails() .stdout_is("6\n135\n") - .stderr_is("csplit: error: '/nope/': match not found"); + .stderr_is("csplit: '/nope/': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -627,7 +627,7 @@ fn test_up_to_no_match1() { ucmd.args(&["numbers50.txt", "/4/", "/nope/", "-k"]) .fails() .stdout_is("6\n135\n") - .stderr_is("csplit: error: '/nope/': match not found"); + .stderr_is("csplit: '/nope/': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -643,7 +643,7 @@ fn test_up_to_no_match2() { ucmd.args(&["numbers50.txt", "/4/", "/nope/", "{50}"]) .fails() .stdout_is("6\n135\n") - .stderr_is("csplit: error: '/nope/': match not found"); + .stderr_is("csplit: '/nope/': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -654,7 +654,7 @@ fn test_up_to_no_match2() { ucmd.args(&["numbers50.txt", "/4/", "/nope/", "{50}", "-k"]) .fails() .stdout_is("6\n135\n") - .stderr_is("csplit: error: '/nope/': match not found"); + .stderr_is("csplit: '/nope/': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -670,7 +670,7 @@ fn test_up_to_no_match3() { ucmd.args(&["numbers50.txt", "/0$/", "{50}"]) .fails() .stdout_is("18\n30\n30\n30\n30\n3\n") - .stderr_is("csplit: error: '/0$/': match not found on repetition 5"); + .stderr_is("csplit: '/0$/': match not found on repetition 5"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -681,7 +681,7 @@ fn test_up_to_no_match3() { ucmd.args(&["numbers50.txt", "/0$/", "{50}", "-k"]) .fails() .stdout_is("18\n30\n30\n30\n30\n3\n") - .stderr_is("csplit: error: '/0$/': match not found on repetition 5"); + .stderr_is("csplit: '/0$/': match not found on repetition 5"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -701,7 +701,7 @@ fn test_up_to_no_match4() { ucmd.args(&["numbers50.txt", "/nope/", "/4/"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '/nope/': match not found"); + .stderr_is("csplit: '/nope/': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -712,7 +712,7 @@ fn test_up_to_no_match4() { ucmd.args(&["numbers50.txt", "/nope/", "/4/", "-k"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '/nope/': match not found"); + .stderr_is("csplit: '/nope/': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -741,7 +741,7 @@ fn test_up_to_no_match6() { ucmd.args(&["numbers50.txt", "/nope/-5"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '/nope/-5': match not found"); + .stderr_is("csplit: '/nope/-5': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -752,7 +752,7 @@ fn test_up_to_no_match6() { ucmd.args(&["numbers50.txt", "/nope/-5", "-k"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '/nope/-5': match not found"); + .stderr_is("csplit: '/nope/-5': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -767,7 +767,7 @@ fn test_up_to_no_match7() { ucmd.args(&["numbers50.txt", "/nope/+5"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '/nope/+5': match not found"); + .stderr_is("csplit: '/nope/+5': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -778,7 +778,7 @@ fn test_up_to_no_match7() { ucmd.args(&["numbers50.txt", "/nope/+5", "-k"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '/nope/+5': match not found"); + .stderr_is("csplit: '/nope/+5': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -792,7 +792,7 @@ fn test_skip_to_no_match1() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "%nope%"]) .fails() - .stderr_only("csplit: error: '%nope%': match not found"); + .stderr_only("csplit: '%nope%': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -805,7 +805,7 @@ fn test_skip_to_no_match2() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "%nope%", "{50}"]) .fails() - .stderr_only("csplit: error: '%nope%': match not found"); + .stderr_only("csplit: '%nope%': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -818,7 +818,7 @@ fn test_skip_to_no_match3() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "%0$%", "{50}"]) .fails() - .stderr_only("csplit: error: '%0$%': match not found on repetition 5"); + .stderr_only("csplit: '%0$%': match not found on repetition 5"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -831,7 +831,7 @@ fn test_skip_to_no_match4() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "%nope%", "/4/"]) .fails() - .stderr_only("csplit: error: '%nope%': match not found"); + .stderr_only("csplit: '%nope%': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -858,7 +858,7 @@ fn test_skip_to_no_match6() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "%nope%-5"]) .fails() - .stderr_only("csplit: error: '%nope%-5': match not found"); + .stderr_only("csplit: '%nope%-5': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -871,7 +871,7 @@ fn test_skip_to_no_match7() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "%nope%+5"]) .fails() - .stderr_only("csplit: error: '%nope%+5': match not found"); + .stderr_only("csplit: '%nope%+5': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -884,7 +884,7 @@ fn test_no_match() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "%nope%"]) .fails() - .stderr_only("csplit: error: '%nope%': match not found"); + .stderr_only("csplit: '%nope%': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -895,7 +895,7 @@ fn test_no_match() { ucmd.args(&["numbers50.txt", "/nope/"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '/nope/': match not found"); + .stderr_is("csplit: '/nope/': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -992,7 +992,7 @@ fn test_too_small_linenum_repeat() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "/20/", "10", "{*}"]) .fails() - .stderr_is("csplit: error: '10': line number out of range on repetition 5") + .stderr_is("csplit: '10': line number out of range on repetition 5") .stdout_is("48\n0\n0\n30\n30\n30\n3\n"); let count = glob(&at.plus_as_string("xx*")) @@ -1003,7 +1003,7 @@ fn test_too_small_linenum_repeat() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "/20/", "10", "{*}", "-k"]) .fails() - .stderr_is("csplit: error: '10': line number out of range on repetition 5") + .stderr_is("csplit: '10': line number out of range on repetition 5") .stdout_is("48\n0\n0\n30\n30\n30\n3\n"); let count = glob(&at.plus_as_string("xx*")) @@ -1025,7 +1025,7 @@ fn test_linenum_out_of_range1() { ucmd.args(&["numbers50.txt", "100"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '100': line number out of range"); + .stderr_is("csplit: '100': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -1036,7 +1036,7 @@ fn test_linenum_out_of_range1() { ucmd.args(&["numbers50.txt", "100", "-k"]) .fails() .stdout_is("141\n") - .stderr_is("csplit: error: '100': line number out of range"); + .stderr_is("csplit: '100': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -1051,7 +1051,7 @@ fn test_linenum_out_of_range2() { ucmd.args(&["numbers50.txt", "10", "100"]) .fails() .stdout_is("18\n123\n") - .stderr_is("csplit: error: '100': line number out of range"); + .stderr_is("csplit: '100': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -1062,7 +1062,7 @@ fn test_linenum_out_of_range2() { ucmd.args(&["numbers50.txt", "10", "100", "-k"]) .fails() .stdout_is("18\n123\n") - .stderr_is("csplit: error: '100': line number out of range"); + .stderr_is("csplit: '100': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -1078,7 +1078,7 @@ fn test_linenum_out_of_range3() { ucmd.args(&["numbers50.txt", "40", "{2}"]) .fails() .stdout_is("108\n33\n") - .stderr_is("csplit: error: '40': line number out of range on repetition 1"); + .stderr_is("csplit: '40': line number out of range on repetition 1"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -1089,7 +1089,7 @@ fn test_linenum_out_of_range3() { ucmd.args(&["numbers50.txt", "40", "{2}", "-k"]) .fails() .stdout_is("108\n33\n") - .stderr_is("csplit: error: '40': line number out of range on repetition 1"); + .stderr_is("csplit: '40': line number out of range on repetition 1"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -1105,7 +1105,7 @@ fn test_linenum_out_of_range4() { ucmd.args(&["numbers50.txt", "40", "{*}"]) .fails() .stdout_is("108\n33\n") - .stderr_is("csplit: error: '40': line number out of range on repetition 1"); + .stderr_is("csplit: '40': line number out of range on repetition 1"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -1116,7 +1116,7 @@ fn test_linenum_out_of_range4() { ucmd.args(&["numbers50.txt", "40", "{*}", "-k"]) .fails() .stdout_is("108\n33\n") - .stderr_is("csplit: error: '40': line number out of range on repetition 1"); + .stderr_is("csplit: '40': line number out of range on repetition 1"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -1132,7 +1132,7 @@ fn test_skip_to_match_negative_offset_before_a_match() { ucmd.args(&["numbers50.txt", "/20/-10", "/15/"]) .fails() .stdout_is("18\n123\n") - .stderr_is("csplit: error: '/15/': match not found"); + .stderr_is("csplit: '/15/': match not found"); let count = glob(&at.plus_as_string("xx*")) .expect("there should be splits created") @@ -1177,7 +1177,7 @@ fn test_corner_case2() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "/10/-5", "/10/"]) .fails() - .stderr_is("csplit: error: '/10/': match not found") + .stderr_is("csplit: '/10/': match not found") .stdout_is("8\n133\n"); let count = glob(&at.plus_as_string("xx*")) @@ -1191,7 +1191,7 @@ fn test_corner_case3() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "/15/-3", "14", "/15/"]) .fails() - .stderr_is("csplit: error: '/15/': match not found") + .stderr_is("csplit: '/15/': match not found") .stdout_is("24\n6\n111\n"); let count = glob(&at.plus_as_string("xx*")) @@ -1223,7 +1223,7 @@ fn test_up_to_match_context_underflow() { ucmd.args(&["numbers50.txt", "/5/-10"]) .fails() .stdout_is("0\n141\n") - .stderr_is("csplit: error: '/5/-10': line number out of range"); + .stderr_is("csplit: '/5/-10': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -1234,7 +1234,7 @@ fn test_up_to_match_context_underflow() { ucmd.args(&["numbers50.txt", "/5/-10", "-k"]) .fails() .stdout_is("0\n141\n") - .stderr_is("csplit: error: '/5/-10': line number out of range"); + .stderr_is("csplit: '/5/-10': line number out of range"); let count = glob(&at.plus_as_string("xx*")) .expect("counting splits") @@ -1251,7 +1251,7 @@ fn test_linenum_range_with_up_to_match1() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "10", "/12/-5"]) .fails() - .stderr_is("csplit: error: '/12/-5': line number out of range") + .stderr_is("csplit: '/12/-5': line number out of range") .stdout_is("18\n0\n123\n"); let count = glob(&at.plus_as_string("xx*")) @@ -1262,7 +1262,7 @@ fn test_linenum_range_with_up_to_match1() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "10", "/12/-5", "-k"]) .fails() - .stderr_is("csplit: error: '/12/-5': line number out of range") + .stderr_is("csplit: '/12/-5': line number out of range") .stdout_is("18\n0\n123\n"); let count = glob(&at.plus_as_string("xx*")) @@ -1281,7 +1281,7 @@ fn test_linenum_range_with_up_to_match2() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "10", "/12/-15"]) .fails() - .stderr_is("csplit: error: '/12/-15': line number out of range") + .stderr_is("csplit: '/12/-15': line number out of range") .stdout_is("18\n0\n123\n"); let count = glob(&at.plus_as_string("xx*")) @@ -1292,7 +1292,7 @@ fn test_linenum_range_with_up_to_match2() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "10", "/12/-15", "-k"]) .fails() - .stderr_is("csplit: error: '/12/-15': line number out of range") + .stderr_is("csplit: '/12/-15': line number out of range") .stdout_is("18\n0\n123\n"); let count = glob(&at.plus_as_string("xx*")) @@ -1310,7 +1310,7 @@ fn test_linenum_range_with_up_to_match3() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["numbers50.txt", "10", "/10/", "-k"]) .fails() - .stderr_is("csplit: error: '/10/': match not found") + .stderr_is("csplit: '/10/': match not found") .stdout_is("18\n123\n"); let count = glob(&at.plus_as_string("xx*")) diff --git a/tests/by-util/test_cut.rs b/tests/by-util/test_cut.rs index 875317721..413b73154 100644 --- a/tests/by-util/test_cut.rs +++ b/tests/by-util/test_cut.rs @@ -149,11 +149,11 @@ fn test_directory_and_no_such_file() { ucmd.arg("-b1") .arg("some") .run() - .stderr_is("cut: error: some: Is a directory\n"); + .stderr_is("cut: some: Is a directory\n"); new_ucmd!() .arg("-b1") .arg("some") .run() - .stderr_is("cut: error: some: No such file or directory\n"); + .stderr_is("cut: some: No such file or directory\n"); } diff --git a/tests/by-util/test_date.rs b/tests/by-util/test_date.rs index 5619aed94..f4990566a 100644 --- a/tests/by-util/test_date.rs +++ b/tests/by-util/test_date.rs @@ -7,174 +7,170 @@ use rust_users::*; #[test] fn test_date_email() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("--rfc-email").run(); - assert!(result.success); + new_ucmd!().arg("--rfc-email").succeeds(); } #[test] fn test_date_email2() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("-R").run(); - assert!(result.success); + new_ucmd!().arg("-R").succeeds(); } #[test] fn test_date_rfc_3339() { let scene = TestScenario::new(util_name!()); - let mut result = scene.ucmd().arg("--rfc-3339=ns").succeeds(); + let rfc_regexp = concat!( + r#"(\d+)-(0[1-9]|1[012])-(0[1-9]|[12]\d|3[01])\s([01]\d|2[0-3]):"#, + r#"([0-5]\d):([0-5]\d|60)(\.\d+)?(([Zz])|([\+|\-]([01]\d|2[0-3])))"# + ); + let re = Regex::new(rfc_regexp).unwrap(); // Check that the output matches the regexp - let rfc_regexp = r"(\d+)-(0[1-9]|1[012])-(0[1-9]|[12]\d|3[01])\s([01]\d|2[0-3]):([0-5]\d):([0-5]\d|60)(\.\d+)?(([Zz])|([\+|\-]([01]\d|2[0-3])))"; - let re = Regex::new(rfc_regexp).unwrap(); - assert!(re.is_match(&result.stdout.trim())); + scene + .ucmd() + .arg("--rfc-3339=ns") + .succeeds() + .stdout_matches(&re); - result = scene.ucmd().arg("--rfc-3339=seconds").succeeds(); - - // Check that the output matches the regexp - let re = Regex::new(rfc_regexp).unwrap(); - assert!(re.is_match(&result.stdout.trim())); + scene + .ucmd() + .arg("--rfc-3339=seconds") + .succeeds() + .stdout_matches(&re); } #[test] fn test_date_rfc_8601() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("--iso-8601=ns").run(); - assert!(result.success); + new_ucmd!().arg("--iso-8601=ns").succeeds(); } #[test] fn test_date_rfc_8601_second() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("--iso-8601=second").run(); - assert!(result.success); + new_ucmd!().arg("--iso-8601=second").succeeds(); } #[test] fn test_date_utc() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("--utc").run(); - assert!(result.success); + new_ucmd!().arg("--utc").succeeds(); } #[test] fn test_date_universal() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("--universal").run(); - assert!(result.success); + new_ucmd!().arg("--universal").succeeds(); } #[test] fn test_date_format_y() { let scene = TestScenario::new(util_name!()); - let mut result = scene.ucmd().arg("+%Y").succeeds(); - - assert!(result.success); let mut re = Regex::new(r"^\d{4}$").unwrap(); - assert!(re.is_match(&result.stdout.trim())); + scene.ucmd().arg("+%Y").succeeds().stdout_matches(&re); - result = scene.ucmd().arg("+%y").succeeds(); - - assert!(result.success); re = Regex::new(r"^\d{2}$").unwrap(); - assert!(re.is_match(&result.stdout.trim())); + scene.ucmd().arg("+%y").succeeds().stdout_matches(&re); } #[test] fn test_date_format_m() { let scene = TestScenario::new(util_name!()); - let mut result = scene.ucmd().arg("+%b").succeeds(); - - assert!(result.success); let mut re = Regex::new(r"\S+").unwrap(); - assert!(re.is_match(&result.stdout.trim())); + scene.ucmd().arg("+%b").succeeds().stdout_matches(&re); - result = scene.ucmd().arg("+%m").succeeds(); - - assert!(result.success); re = Regex::new(r"^\d{2}$").unwrap(); - assert!(re.is_match(&result.stdout.trim())); + scene.ucmd().arg("+%m").succeeds().stdout_matches(&re); } #[test] fn test_date_format_day() { let scene = TestScenario::new(util_name!()); - let mut result = scene.ucmd().arg("+%a").succeeds(); - - assert!(result.success); let mut re = Regex::new(r"\S+").unwrap(); - assert!(re.is_match(&result.stdout.trim())); - - result = scene.ucmd().arg("+%A").succeeds(); - - assert!(result.success); + scene.ucmd().arg("+%a").succeeds().stdout_matches(&re); re = Regex::new(r"\S+").unwrap(); - assert!(re.is_match(&result.stdout.trim())); + scene.ucmd().arg("+%A").succeeds().stdout_matches(&re); - result = scene.ucmd().arg("+%u").succeeds(); - - assert!(result.success); re = Regex::new(r"^\d{1}$").unwrap(); - assert!(re.is_match(&result.stdout.trim())); + scene.ucmd().arg("+%u").succeeds().stdout_matches(&re); } #[test] fn test_date_format_full_day() { - let scene = TestScenario::new(util_name!()); - - let result = scene.ucmd().arg("+'%a %Y-%m-%d'").succeeds(); - - assert!(result.success); let re = Regex::new(r"\S+ \d{4}-\d{2}-\d{2}").unwrap(); - assert!(re.is_match(&result.stdout.trim())); + new_ucmd!() + .arg("+'%a %Y-%m-%d'") + .succeeds() + .stdout_matches(&re); +} + +#[test] +fn test_date_nano_seconds() { + // %N nanoseconds (000000000..999999999) + let re = Regex::new(r"^\d{1,9}$").unwrap(); + new_ucmd!().arg("+%N").succeeds().stdout_matches(&re); +} + +#[test] +fn test_date_format_without_plus() { + // [+FORMAT] + new_ucmd!() + .arg("%s") + .fails() + .stderr_contains("date: invalid date ‘%s’") + .code_is(1); +} + +#[test] +fn test_date_format_literal() { + new_ucmd!().arg("+%%s").succeeds().stdout_is("%s\n"); + new_ucmd!().arg("+%%N").succeeds().stdout_is("%N\n"); } #[test] #[cfg(all(unix, not(target_os = "macos")))] fn test_date_set_valid() { if get_effective_uid() == 0 { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd + new_ucmd!() .arg("--set") .arg("2020-03-12 13:30:00+08:00") - .succeeds(); - result.no_stdout().no_stderr(); + .succeeds() + .no_stdout() + .no_stderr(); } } #[test] #[cfg(any(windows, all(unix, not(target_os = "macos"))))] fn test_date_set_invalid() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("--set").arg("123abcd").fails(); - let result = result.no_stdout(); - assert!(result.stderr.starts_with("date: invalid date ")); + let result = new_ucmd!().arg("--set").arg("123abcd").fails(); + result.no_stdout(); + assert!(result.stderr_str().starts_with("date: invalid date ")); } #[test] #[cfg(all(unix, not(target_os = "macos")))] fn test_date_set_permissions_error() { - if !(get_effective_uid() == 0 || is_wsl()) { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("--set").arg("2020-03-11 21:45:00+08:00").fails(); - let result = result.no_stdout(); - assert!(result.stderr.starts_with("date: cannot set date: ")); + if !(get_effective_uid() == 0 || uucore::os::is_wsl_1()) { + let result = new_ucmd!() + .arg("--set") + .arg("2020-03-11 21:45:00+08:00") + .fails(); + result.no_stdout(); + assert!(result.stderr_str().starts_with("date: cannot set date: ")); } } #[test] #[cfg(target_os = "macos")] fn test_date_set_mac_unavailable() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("--set").arg("2020-03-11 21:45:00+08:00").fails(); - let result = result.no_stdout(); + let result = new_ucmd!() + .arg("--set") + .arg("2020-03-11 21:45:00+08:00") + .fails(); + result.no_stdout(); assert!(result - .stderr + .stderr_str() .starts_with("date: setting the date is not supported by macOS")); } @@ -183,13 +179,12 @@ fn test_date_set_mac_unavailable() { /// TODO: expected to fail currently; change to succeeds() when required. fn test_date_set_valid_2() { if get_effective_uid() == 0 { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd + let result = new_ucmd!() .arg("--set") .arg("Sat 20 Mar 2021 14:53:01 AWST") .fails(); - let result = result.no_stdout(); - assert!(result.stderr.starts_with("date: invalid date ")); + result.no_stdout(); + assert!(result.stderr_str().starts_with("date: invalid date ")); } } @@ -198,13 +193,12 @@ fn test_date_set_valid_2() { /// TODO: expected to fail currently; change to succeeds() when required. fn test_date_set_valid_3() { if get_effective_uid() == 0 { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd + let result = new_ucmd!() .arg("--set") .arg("Sat 20 Mar 2021 14:53:01") // Local timezone .fails(); - let result = result.no_stdout(); - assert!(result.stderr.starts_with("date: invalid date ")); + result.no_stdout(); + assert!(result.stderr_str().starts_with("date: invalid date ")); } } @@ -213,12 +207,11 @@ fn test_date_set_valid_3() { /// TODO: expected to fail currently; change to succeeds() when required. fn test_date_set_valid_4() { if get_effective_uid() == 0 { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd + let result = new_ucmd!() .arg("--set") .arg("2020-03-11 21:45:00") // Local timezone .fails(); - let result = result.no_stdout(); - assert!(result.stderr.starts_with("date: invalid date ")); + result.no_stdout(); + assert!(result.stderr_str().starts_with("date: invalid date ")); } } diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index f79d1beb5..ac3776b96 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -2,30 +2,34 @@ use crate::common::util::*; #[test] fn test_df_compatible_no_size_arg() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("-a").run(); - assert!(result.success); + new_ucmd!().arg("-a").succeeds(); } #[test] fn test_df_compatible() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("-ah").run(); - assert!(result.success); + new_ucmd!().arg("-ah").succeeds(); } #[test] fn test_df_compatible_type() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("-aT").run(); - assert!(result.success); + new_ucmd!().arg("-aT").succeeds(); } #[test] fn test_df_compatible_si() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("-aH").run(); - assert!(result.success); + new_ucmd!().arg("-aH").succeeds(); +} + +#[test] +fn test_df_output() { + if cfg!(target_os = "macos") { + new_ucmd!().arg("-H").arg("-total").succeeds(). + stdout_only("Filesystem Size Used Available Capacity Use% Mounted on \n"); + } else { + new_ucmd!().arg("-H").arg("-total").succeeds().stdout_only( + "Filesystem Size Used Available Use% Mounted on \n", + ); + } } // ToDO: more tests... diff --git a/tests/by-util/test_dirname.rs b/tests/by-util/test_dirname.rs index bcb4378d6..026ac22bb 100644 --- a/tests/by-util/test_dirname.rs +++ b/tests/by-util/test_dirname.rs @@ -16,6 +16,21 @@ fn test_path_without_trailing_slashes() { .stdout_is("/root/alpha/beta/gamma/delta/epsilon\n"); } +#[test] +fn test_path_without_trailing_slashes_and_zero() { + new_ucmd!() + .arg("-z") + .arg("/root/alpha/beta/gamma/delta/epsilon/omega") + .succeeds() + .stdout_is("/root/alpha/beta/gamma/delta/epsilon\u{0}"); + + new_ucmd!() + .arg("--zero") + .arg("/root/alpha/beta/gamma/delta/epsilon/omega") + .succeeds() + .stdout_is("/root/alpha/beta/gamma/delta/epsilon\u{0}"); +} + #[test] fn test_root() { new_ucmd!().arg("/").run().stdout_is("/\n"); diff --git a/tests/by-util/test_du.rs b/tests/by-util/test_du.rs index 30dcd9bb3..c5d262c3b 100644 --- a/tests/by-util/test_du.rs +++ b/tests/by-util/test_du.rs @@ -7,13 +7,10 @@ const SUB_LINK: &str = "subdir/links/sublink.txt"; #[test] fn test_du_basics() { - let (_at, mut ucmd) = at_and_ucmd!(); - let result = ucmd.run(); - assert!(result.success); - assert_eq!(result.stderr, ""); + new_ucmd!().succeeds().no_stderr(); } #[cfg(target_vendor = "apple")] -fn _du_basics(s: String) { +fn _du_basics(s: &str) { let answer = "32\t./subdir 8\t./subdir/deeper 24\t./subdir/links @@ -22,7 +19,7 @@ fn _du_basics(s: String) { assert_eq!(s, answer); } #[cfg(not(target_vendor = "apple"))] -fn _du_basics(s: String) { +fn _du_basics(s: &str) { let answer = "28\t./subdir 8\t./subdir/deeper 16\t./subdir/links @@ -33,26 +30,41 @@ fn _du_basics(s: String) { #[test] fn test_du_basics_subdir() { - let (_at, mut ucmd) = at_and_ucmd!(); + let scene = TestScenario::new(util_name!()); - let result = ucmd.arg(SUB_DIR).run(); - assert!(result.success); - assert_eq!(result.stderr, ""); - _du_basics_subdir(result.stdout); + let result = scene.ucmd().arg(SUB_DIR).succeeds(); + + #[cfg(target_os = "linux")] + { + let result_reference = scene.cmd("du").arg(SUB_DIR).run(); + if result_reference.succeeded() { + assert_eq!(result.stdout_str(), result_reference.stdout_str()); + return; + } + } + _du_basics_subdir(result.stdout_str()); } #[cfg(target_vendor = "apple")] -fn _du_basics_subdir(s: String) { +fn _du_basics_subdir(s: &str) { assert_eq!(s, "4\tsubdir/deeper\n"); } #[cfg(target_os = "windows")] -fn _du_basics_subdir(s: String) { +fn _du_basics_subdir(s: &str) { assert_eq!(s, "0\tsubdir/deeper\n"); } -#[cfg(all(not(target_vendor = "apple"), not(target_os = "windows")))] -fn _du_basics_subdir(s: String) { +#[cfg(target_os = "freebsd")] +fn _du_basics_subdir(s: &str) { + assert_eq!(s, "8\tsubdir/deeper\n"); +} +#[cfg(all( + not(target_vendor = "apple"), + not(target_os = "windows"), + not(target_os = "freebsd") +))] +fn _du_basics_subdir(s: &str) { // MS-WSL linux has altered expected output - if !is_wsl() { + if !uucore::os::is_wsl_1() { assert_eq!(s, "8\tsubdir/deeper\n"); } else { assert_eq!(s, "0\tsubdir/deeper\n"); @@ -61,42 +73,53 @@ fn _du_basics_subdir(s: String) { #[test] fn test_du_basics_bad_name() { - let (_at, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("bad_name").run(); - assert_eq!(result.stdout, ""); - assert_eq!( - result.stderr, - "du: error: bad_name: No such file or directory\n" - ); + new_ucmd!() + .arg("bad_name") + .succeeds() // TODO: replace with ".fails()" once `du` is fixed + .stderr_only("du: bad_name: No such file or directory\n"); } #[test] fn test_du_soft_link() { - let ts = TestScenario::new("du"); + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; - let link = ts.ccmd("ln").arg("-s").arg(SUB_FILE).arg(SUB_LINK).run(); - assert!(link.success); + at.symlink_file(SUB_FILE, SUB_LINK); - let result = ts.ucmd().arg(SUB_DIR_LINKS).run(); - assert!(result.success); - assert_eq!(result.stderr, ""); - _du_soft_link(result.stdout); + let result = scene.ucmd().arg(SUB_DIR_LINKS).succeeds(); + + #[cfg(target_os = "linux")] + { + let result_reference = scene.cmd("du").arg(SUB_DIR_LINKS).run(); + if result_reference.succeeded() { + assert_eq!(result.stdout_str(), result_reference.stdout_str()); + return; + } + } + _du_soft_link(result.stdout_str()); } #[cfg(target_vendor = "apple")] -fn _du_soft_link(s: String) { +fn _du_soft_link(s: &str) { // 'macos' host variants may have `du` output variation for soft links assert!((s == "12\tsubdir/links\n") || (s == "16\tsubdir/links\n")); } #[cfg(target_os = "windows")] -fn _du_soft_link(s: String) { +fn _du_soft_link(s: &str) { assert_eq!(s, "8\tsubdir/links\n"); } -#[cfg(all(not(target_vendor = "apple"), not(target_os = "windows")))] -fn _du_soft_link(s: String) { +#[cfg(target_os = "freebsd")] +fn _du_soft_link(s: &str) { + assert_eq!(s, "16\tsubdir/links\n"); +} +#[cfg(all( + not(target_vendor = "apple"), + not(target_os = "windows"), + not(target_os = "freebsd") +))] +fn _du_soft_link(s: &str) { // MS-WSL linux has altered expected output - if !is_wsl() { + if !uucore::os::is_wsl_1() { assert_eq!(s, "16\tsubdir/links\n"); } else { assert_eq!(s, "8\tsubdir/links\n"); @@ -105,30 +128,45 @@ fn _du_soft_link(s: String) { #[test] fn test_du_hard_link() { - let ts = TestScenario::new("du"); + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; - let link = ts.ccmd("ln").arg(SUB_FILE).arg(SUB_LINK).run(); - assert!(link.success); + at.hard_link(SUB_FILE, SUB_LINK); - let result = ts.ucmd().arg(SUB_DIR_LINKS).run(); - assert!(result.success); - assert_eq!(result.stderr, ""); + let result = scene.ucmd().arg(SUB_DIR_LINKS).succeeds(); + + #[cfg(target_os = "linux")] + { + let result_reference = scene.cmd("du").arg(SUB_DIR_LINKS).run(); + if result_reference.succeeded() { + assert_eq!(result.stdout_str(), result_reference.stdout_str()); + return; + } + } // We do not double count hard links as the inodes are identical - _du_hard_link(result.stdout); + _du_hard_link(result.stdout_str()); } #[cfg(target_vendor = "apple")] -fn _du_hard_link(s: String) { +fn _du_hard_link(s: &str) { assert_eq!(s, "12\tsubdir/links\n") } #[cfg(target_os = "windows")] -fn _du_hard_link(s: String) { +fn _du_hard_link(s: &str) { assert_eq!(s, "8\tsubdir/links\n") } -#[cfg(all(not(target_vendor = "apple"), not(target_os = "windows")))] -fn _du_hard_link(s: String) { +#[cfg(target_os = "freebsd")] +fn _du_hard_link(s: &str) { + assert_eq!(s, "16\tsubdir/links\n") +} +#[cfg(all( + not(target_vendor = "apple"), + not(target_os = "windows"), + not(target_os = "freebsd") +))] +fn _du_hard_link(s: &str) { // MS-WSL linux has altered expected output - if !is_wsl() { + if !uucore::os::is_wsl_1() { assert_eq!(s, "16\tsubdir/links\n"); } else { assert_eq!(s, "8\tsubdir/links\n"); @@ -137,26 +175,46 @@ fn _du_hard_link(s: String) { #[test] fn test_du_d_flag() { - let ts = TestScenario::new("du"); + let scene = TestScenario::new(util_name!()); - let result = ts.ucmd().arg("-d").arg("1").run(); - assert!(result.success); - assert_eq!(result.stderr, ""); - _du_d_flag(result.stdout); + let result = scene.ucmd().arg("-d1").succeeds(); + + #[cfg(target_os = "linux")] + { + let result_reference = scene.cmd("du").arg("-d1").run(); + if result_reference.succeeded() { + assert_eq!( + // TODO: gnu `du` doesn't use trailing "/" here + // result.stdout_str(), result_reference.stdout_str() + result.stdout_str().trim_end_matches("/\n"), + result_reference.stdout_str().trim_end_matches("\n") + ); + return; + } + } + _du_d_flag(result.stdout_str()); } #[cfg(target_vendor = "apple")] -fn _du_d_flag(s: String) { +fn _du_d_flag(s: &str) { assert_eq!(s, "16\t./subdir\n20\t./\n"); } #[cfg(target_os = "windows")] -fn _du_d_flag(s: String) { +fn _du_d_flag(s: &str) { assert_eq!(s, "8\t./subdir\n8\t./\n"); } -#[cfg(all(not(target_vendor = "apple"), not(target_os = "windows")))] -fn _du_d_flag(s: String) { +#[cfg(target_os = "freebsd")] +fn _du_d_flag(s: &str) { + assert_eq!(s, "28\t./subdir\n36\t./\n"); +} +#[cfg(all( + not(target_vendor = "apple"), + not(target_os = "windows"), + not(target_os = "freebsd") +))] +fn _du_d_flag(s: &str) { // MS-WSL linux has altered expected output - if !is_wsl() { + if !uucore::os::is_wsl_1() { assert_eq!(s, "28\t./subdir\n36\t./\n"); } else { assert_eq!(s, "8\t./subdir\n8\t./\n"); @@ -165,28 +223,71 @@ fn _du_d_flag(s: String) { #[test] fn test_du_h_flag_empty_file() { - let ts = TestScenario::new("du"); - - let result = ts.ucmd().arg("-h").arg("empty.txt").run(); - assert!(result.success); - assert_eq!(result.stderr, ""); - assert_eq!(result.stdout, "0\tempty.txt\n"); + new_ucmd!() + .arg("-h") + .arg("empty.txt") + .succeeds() + .stdout_only("0\tempty.txt\n"); } #[cfg(feature = "touch")] #[test] fn test_du_time() { - let ts = TestScenario::new("du"); + let scene = TestScenario::new(util_name!()); - let touch = ts.ccmd("touch").arg("-a").arg("-m").arg("-t").arg("201505150000").arg("date_test").run(); - assert!(touch.success); + scene + .ccmd("touch") + .arg("-a") + .arg("-m") + .arg("-t") + .arg("201505150000") + .arg("date_test") + .succeeds(); - let result = ts.ucmd().arg("--time").arg("date_test").run(); - - // cleanup by removing test file - ts.cmd("rm").arg("date_test").run(); - - assert!(result.success); - assert_eq!(result.stderr, ""); - assert_eq!(result.stdout, "0\t2015-05-15 00:00\tdate_test\n"); + scene + .ucmd() + .arg("--time") + .arg("date_test") + .succeeds() + .stdout_only("0\t2015-05-15 00:00\tdate_test\n"); +} + +#[cfg(not(target_os = "windows"))] +#[cfg(feature = "chmod")] +#[test] +fn test_du_no_permission() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.mkdir_all(SUB_DIR_LINKS); + + scene.ccmd("chmod").arg("-r").arg(SUB_DIR_LINKS).succeeds(); + + let result = scene.ucmd().arg(SUB_DIR_LINKS).run(); // TODO: replace with ".fails()" once `du` is fixed + result.stderr_contains( + "du: cannot read directory ‘subdir/links‘: Permission denied (os error 13)", + ); + + #[cfg(target_os = "linux")] + { + let result_reference = scene.cmd("du").arg(SUB_DIR_LINKS).fails(); + if result_reference + .stderr_str() + .contains("du: cannot read directory 'subdir/links': Permission denied") + { + assert_eq!(result.stdout_str(), result_reference.stdout_str()); + return; + } + } + + _du_no_permission(result.stdout_str()); +} + +#[cfg(target_vendor = "apple")] +fn _du_no_permission(s: &str) { + assert_eq!(s, "0\tsubdir/links\n"); +} +#[cfg(all(not(target_vendor = "apple"), not(target_os = "windows")))] +fn _du_no_permission(s: &str) { + assert_eq!(s, "4\tsubdir/links\n"); } diff --git a/tests/by-util/test_echo.rs b/tests/by-util/test_echo.rs index 7394ffc1e..5d1b68e6c 100644 --- a/tests/by-util/test_echo.rs +++ b/tests/by-util/test_echo.rs @@ -2,22 +2,17 @@ use crate::common::util::*; #[test] fn test_default() { - //CmdResult.stdout_only(...) trims trailing newlines - assert_eq!("hi\n", new_ucmd!().arg("hi").succeeds().no_stderr().stdout); + new_ucmd!().arg("hi").succeeds().stdout_only("hi\n"); } #[test] fn test_no_trailing_newline() { - //CmdResult.stdout_only(...) trims trailing newlines - assert_eq!( - "hi", - new_ucmd!() - .arg("-n") - .arg("hi") - .succeeds() - .no_stderr() - .stdout - ); + new_ucmd!() + .arg("-n") + .arg("hi") + .succeeds() + .no_stderr() + .stdout_only("hi"); } #[test] @@ -192,39 +187,38 @@ fn test_hyphen_values_inside_string() { new_ucmd!() .arg("'\"\n'CXXFLAGS=-g -O2'\n\"'") .succeeds() - .stdout - .contains("CXXFLAGS"); + .stdout_contains("CXXFLAGS"); } #[test] fn test_hyphen_values_at_start() { - let result = new_ucmd!() + new_ucmd!() .arg("-E") .arg("-test") .arg("araba") .arg("-merci") - .run(); - - assert!(result.success); - assert_eq!(false, result.stdout.contains("-E")); - assert_eq!(result.stdout, "-test araba -merci\n"); + .run() + .success() + .stdout_does_not_contain("-E") + .stdout_is("-test araba -merci\n"); } #[test] fn test_hyphen_values_between() { - let result = new_ucmd!().arg("test").arg("-E").arg("araba").run(); + new_ucmd!() + .arg("test") + .arg("-E") + .arg("araba") + .run() + .success() + .stdout_is("test -E araba\n"); - assert!(result.success); - assert_eq!(result.stdout, "test -E araba\n"); - - let result = new_ucmd!() + new_ucmd!() .arg("dumdum ") .arg("dum dum dum") .arg("-e") .arg("dum") - .run(); - - assert!(result.success); - assert_eq!(result.stdout, "dumdum dum dum dum -e dum\n"); - assert_eq!(true, result.stdout.contains("-e")); + .run() + .success() + .stdout_is("dumdum dum dum dum -e dum\n"); } diff --git a/tests/by-util/test_env.rs b/tests/by-util/test_env.rs index 2ffb2bc48..e86a41783 100644 --- a/tests/by-util/test_env.rs +++ b/tests/by-util/test_env.rs @@ -8,45 +8,36 @@ use tempfile::tempdir; #[test] fn test_env_help() { - assert!(new_ucmd!() + new_ucmd!() .arg("--help") .succeeds() .no_stderr() - .stdout - .contains("OPTIONS:")); + .stdout_contains("OPTIONS:"); } #[test] fn test_env_version() { - assert!(new_ucmd!() + new_ucmd!() .arg("--version") .succeeds() .no_stderr() - .stdout - .contains(util_name!())); + .stdout_contains(util_name!()); } #[test] fn test_echo() { - // assert!(new_ucmd!().arg("printf").arg("FOO-bar").succeeds().no_stderr().stdout.contains("FOO-bar")); - let mut cmd = new_ucmd!(); - cmd.arg("echo").arg("FOO-bar"); - println!("cmd={:?}", cmd); + let result = new_ucmd!().arg("echo").arg("FOO-bar").succeeds(); - let result = cmd.run(); - println!("success={:?}", result.success); - println!("stdout={:?}", result.stdout); - println!("stderr={:?}", result.stderr); - assert!(result.success); - - let out = result.stdout.trim_end(); - - assert_eq!(out, "FOO-bar"); + assert_eq!(result.stdout_str().trim(), "FOO-bar"); } #[test] fn test_file_option() { - let out = new_ucmd!().arg("-f").arg("vars.conf.txt").run().stdout; + let out = new_ucmd!() + .arg("-f") + .arg("vars.conf.txt") + .run() + .stdout_move_str(); assert_eq!( out.lines() @@ -63,7 +54,7 @@ fn test_combined_file_set() { .arg("vars.conf.txt") .arg("FOO=bar.alt") .run() - .stdout; + .stdout_move_str(); assert_eq!(out.lines().filter(|&line| line == "FOO=bar.alt").count(), 1); } @@ -76,8 +67,8 @@ fn test_combined_file_set_unset() { .arg("-f") .arg("vars.conf.txt") .arg("FOO=bar.alt") - .run() - .stdout; + .succeeds() + .stdout_move_str(); assert_eq!( out.lines() @@ -89,17 +80,18 @@ fn test_combined_file_set_unset() { #[test] fn test_single_name_value_pair() { - let out = new_ucmd!().arg("FOO=bar").run().stdout; + let out = new_ucmd!().arg("FOO=bar").run(); - assert!(out.lines().any(|line| line == "FOO=bar")); + assert!(out.stdout_str().lines().any(|line| line == "FOO=bar")); } #[test] fn test_multiple_name_value_pairs() { - let out = new_ucmd!().arg("FOO=bar").arg("ABC=xyz").run().stdout; + let out = new_ucmd!().arg("FOO=bar").arg("ABC=xyz").run(); assert_eq!( - out.lines() + out.stdout_str() + .lines() .filter(|&line| line == "FOO=bar" || line == "ABC=xyz") .count(), 2 @@ -110,13 +102,8 @@ fn test_multiple_name_value_pairs() { fn test_ignore_environment() { let scene = TestScenario::new(util_name!()); - let out = scene.ucmd().arg("-i").run().stdout; - - assert_eq!(out, ""); - - let out = scene.ucmd().arg("-").run().stdout; - - assert_eq!(out, ""); + scene.ucmd().arg("-i").run().no_stdout(); + scene.ucmd().arg("-").run().no_stdout(); } #[test] @@ -126,8 +113,8 @@ fn test_null_delimiter() { .arg("--null") .arg("FOO=bar") .arg("ABC=xyz") - .run() - .stdout; + .succeeds() + .stdout_move_str(); let mut vars: Vec<_> = out.split('\0').collect(); assert_eq!(vars.len(), 3); @@ -145,16 +132,19 @@ fn test_unset_variable() { .ucmd_keepenv() .arg("-u") .arg("HOME") - .run() - .stdout; + .succeeds() + .stdout_move_str(); assert_eq!(out.lines().any(|line| line.starts_with("HOME=")), false); } #[test] fn test_fail_null_with_program() { - let out = new_ucmd!().arg("--null").arg("cd").fails().stderr; - assert!(out.contains("cannot specify --null (-0) with command")); + new_ucmd!() + .arg("--null") + .arg("cd") + .fails() + .stderr_contains("cannot specify --null (-0) with command"); } #[cfg(not(windows))] @@ -173,8 +163,8 @@ fn test_change_directory() { .arg("--chdir") .arg(&temporary_path) .arg(pwd) - .run() - .stdout; + .succeeds() + .stdout_move_str(); assert_eq!(out.trim(), temporary_path.as_os_str()) } @@ -193,8 +183,8 @@ fn test_change_directory() { .ucmd() .arg("--chdir") .arg(&temporary_path) - .run() - .stdout; + .succeeds() + .stdout_move_str(); assert_eq!( out.lines() .any(|line| line.ends_with(temporary_path.file_name().unwrap().to_str().unwrap())), @@ -214,6 +204,6 @@ fn test_fail_change_directory() { .arg(some_non_existing_path) .arg("pwd") .fails() - .stderr; + .stderr_move_str(); assert!(out.contains("env: cannot change directory to ")); } diff --git a/tests/by-util/test_expand.rs b/tests/by-util/test_expand.rs index 801bf9d98..834a09736 100644 --- a/tests/by-util/test_expand.rs +++ b/tests/by-util/test_expand.rs @@ -2,57 +2,54 @@ use crate::common::util::*; #[test] fn test_with_tab() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("with-tab.txt").run(); - assert!(result.success); - assert!(result.stdout.contains(" ")); - assert!(!result.stdout.contains("\t")); + new_ucmd!() + .arg("with-tab.txt") + .succeeds() + .stdout_contains(" ") + .stdout_does_not_contain("\t"); } #[test] fn test_with_trailing_tab() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("with-trailing-tab.txt").run(); - assert!(result.success); - assert!(result.stdout.contains("with tabs=> ")); - assert!(!result.stdout.contains("\t")); + new_ucmd!() + .arg("with-trailing-tab.txt") + .succeeds() + .stdout_contains("with tabs=> ") + .stdout_does_not_contain("\t"); } #[test] fn test_with_trailing_tab_i() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("with-trailing-tab.txt").arg("-i").run(); - assert!(result.success); - assert!(result.stdout.contains(" // with tabs=>\t")); + new_ucmd!() + .arg("with-trailing-tab.txt") + .arg("-i") + .succeeds() + .stdout_contains(" // with tabs=>\t"); } #[test] fn test_with_tab_size() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("with-tab.txt").arg("--tabs=10").run(); - assert!(result.success); - assert!(result.stdout.contains(" ")); + new_ucmd!() + .arg("with-tab.txt") + .arg("--tabs=10") + .succeeds() + .stdout_contains(" "); } #[test] fn test_with_space() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("with-spaces.txt").run(); - assert!(result.success); - assert!(result.stdout.contains(" return")); + new_ucmd!() + .arg("with-spaces.txt") + .succeeds() + .stdout_contains(" return"); } #[test] fn test_with_multiple_files() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("with-spaces.txt").arg("with-tab.txt").run(); - assert!(result.success); - assert!(result.stdout.contains(" return")); - assert!(result.stdout.contains(" ")); + new_ucmd!() + .arg("with-spaces.txt") + .arg("with-tab.txt") + .succeeds() + .stdout_contains(" return") + .stdout_contains(" "); } diff --git a/tests/by-util/test_expr.rs b/tests/by-util/test_expr.rs index bb0760676..f20739e13 100644 --- a/tests/by-util/test_expr.rs +++ b/tests/by-util/test_expr.rs @@ -17,11 +17,11 @@ fn test_complex_arithmetic() { .args(&["9223372036854775807", "+", "9223372036854775807"]) .run(); run.stdout_is(""); - run.stderr_is("expr: error: +: Numerical result out of range"); + run.stderr_is("expr: +: Numerical result out of range"); let run = new_ucmd!().args(&["9", "/", "0"]).run(); run.stdout_is(""); - run.stderr_is("expr: error: division by zero"); + run.stderr_is("expr: division by zero"); } #[test] @@ -54,3 +54,32 @@ fn test_and() { new_ucmd!().args(&["", "&", "1"]).run().stdout_is("0\n"); } + +#[test] +fn test_substr() { + new_ucmd!() + .args(&["substr", "abc", "1", "1"]) + .succeeds() + .stdout_only("a\n"); +} + +#[test] +fn test_invalid_substr() { + new_ucmd!() + .args(&["substr", "abc", "0", "1"]) + .fails() + .status_code(1) + .stdout_only("\n"); + + new_ucmd!() + .args(&["substr", "abc", &(std::usize::MAX.to_string() + "0"), "1"]) + .fails() + .status_code(1) + .stdout_only("\n"); + + new_ucmd!() + .args(&["substr", "abc", "0", &(std::usize::MAX.to_string() + "0")]) + .fails() + .status_code(1) + .stdout_only("\n"); +} diff --git a/tests/by-util/test_factor.rs b/tests/by-util/test_factor.rs index 5bde17cdb..7b856d1b8 100644 --- a/tests/by-util/test_factor.rs +++ b/tests/by-util/test_factor.rs @@ -32,16 +32,25 @@ fn test_first_100000_integers() { } println!("STDIN='{}'", instring); - let result = new_ucmd!().pipe_in(instring.as_bytes()).run(); - let stdout = result.stdout; - - assert!(result.success); + let result = new_ucmd!().pipe_in(instring.as_bytes()).succeeds(); // `seq 0 100000 | factor | sha1sum` => "4ed2d8403934fa1c76fe4b84c5d4b8850299c359" - let hash_check = sha1::Sha1::from(stdout.as_bytes()).hexdigest(); + let hash_check = sha1::Sha1::from(result.stdout()).hexdigest(); assert_eq!(hash_check, "4ed2d8403934fa1c76fe4b84c5d4b8850299c359"); } +#[test] +fn test_cli_args() { + // Make sure that factor works with CLI arguments as well. + new_ucmd!().args(&["3"]).succeeds().stdout_contains("3: 3"); + + new_ucmd!() + .args(&["3", "6"]) + .succeeds() + .stdout_contains("3: 3") + .stdout_contains("6: 2 3"); +} + #[test] fn test_random() { use conv::prelude::*; diff --git a/tests/by-util/test_fmt.rs b/tests/by-util/test_fmt.rs index 4533cdf24..0d6d9bb24 100644 --- a/tests/by-util/test_fmt.rs +++ b/tests/by-util/test_fmt.rs @@ -5,7 +5,7 @@ fn test_fmt() { let result = new_ucmd!().arg("one-word-per-line.txt").run(); //.stdout_is_fixture("call_graph.expected"); assert_eq!( - result.stdout.trim(), + result.stdout_str().trim(), "this is a file with one word per line" ); } @@ -15,7 +15,7 @@ fn test_fmt_q() { let result = new_ucmd!().arg("-q").arg("one-word-per-line.txt").run(); //.stdout_is_fixture("call_graph.expected"); assert_eq!( - result.stdout.trim(), + result.stdout_str().trim(), "this is a file with one word per line" ); } @@ -29,22 +29,20 @@ fn test_fmt_w_too_big() { .run(); //.stdout_is_fixture("call_graph.expected"); assert_eq!( - result.stderr.trim(), - "fmt: error: invalid width: '2501': Numerical result out of range" + result.stderr_str().trim(), + "fmt: invalid width: '2501': Numerical result out of range" ); } -/* #[test] - Fails for now, see https://github.com/uutils/coreutils/issues/1501 +#[test] fn test_fmt_w() { let result = new_ucmd!() .arg("-w") .arg("10") .arg("one-word-per-line.txt") .run(); - //.stdout_is_fixture("call_graph.expected"); - assert_eq!(result.stdout.trim(), "this is a file with one word per line"); + //.stdout_is_fixture("call_graph.expected"); + assert_eq!( + result.stdout_str().trim(), + "this is\na file\nwith one\nword per\nline" + ); } - - -fmt is pretty broken in general, needs more works to have more tests - */ diff --git a/tests/by-util/test_fold.rs b/tests/by-util/test_fold.rs index ffcd65737..5224a50dc 100644 --- a/tests/by-util/test_fold.rs +++ b/tests/by-util/test_fold.rs @@ -542,4 +542,4 @@ fn test_obsolete_syntax() { .arg("space_separated_words.txt") .succeeds() .stdout_is("test1\n \ntest2\n \ntest3\n \ntest4\n \ntest5\n \ntest6\n "); -} \ No newline at end of file +} diff --git a/tests/by-util/test_groups.rs b/tests/by-util/test_groups.rs index 5c326fe2d..cee13bdc3 100644 --- a/tests/by-util/test_groups.rs +++ b/tests/by-util/test_groups.rs @@ -2,26 +2,25 @@ use crate::common::util::*; #[test] fn test_groups() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.run(); - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - if is_ci() && result.stdout.trim().is_empty() { + let result = new_ucmd!().run(); + println!("result.stdout = {}", result.stdout_str()); + println!("result.stderr = {}", result.stderr_str()); + if is_ci() && result.stdout_str().trim().is_empty() { // In the CI, some server are failing to return the group. // As seems to be a configuration issue, ignoring it return; } - assert!(result.success); - assert!(!result.stdout.trim().is_empty()); + result.success(); + assert!(!result.stdout_str().trim().is_empty()); } #[test] fn test_groups_arg() { // get the username with the "id -un" command let result = TestScenario::new("id").ucmd_keepenv().arg("-un").run(); - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - let s1 = String::from(result.stdout.trim()); + println!("result.stdout = {}", result.stdout_str()); + println!("result.stderr = {}", result.stderr_str()); + let s1 = String::from(result.stdout_str().trim()); if is_ci() && s1.parse::().is_ok() { // In the CI, some server are failing to return id -un. // So, if we are getting a uid, just skip this test @@ -29,18 +28,14 @@ fn test_groups_arg() { return; } - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - assert!(!result.stdout.is_empty()); - let username = result.stdout.trim(); + println!("result.stdout = {}", result.stdout_str()); + println!("result.stderr = {}", result.stderr_str()); + result.success(); + assert!(!result.stdout_str().is_empty()); + let username = result.stdout_str().trim(); // call groups with the user name to check that we // are getting something - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg(username).run(); - println!("result.stdout {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - assert!(!result.stdout.is_empty()); + new_ucmd!().arg(username).succeeds(); + assert!(!result.stdout_str().is_empty()); } diff --git a/tests/by-util/test_hashsum.rs b/tests/by-util/test_hashsum.rs index 6e7d59107..f059e53f3 100644 --- a/tests/by-util/test_hashsum.rs +++ b/tests/by-util/test_hashsum.rs @@ -17,14 +17,14 @@ macro_rules! test_digest { fn test_single_file() { let ts = TestScenario::new("hashsum"); assert_eq!(ts.fixtures.read(EXPECTED_FILE), - get_hash!(ts.ucmd().arg(DIGEST_ARG).arg(BITS_ARG).arg("input.txt").succeeds().no_stderr().stdout)); + get_hash!(ts.ucmd().arg(DIGEST_ARG).arg(BITS_ARG).arg("input.txt").succeeds().no_stderr().stdout_str())); } #[test] fn test_stdin() { let ts = TestScenario::new("hashsum"); assert_eq!(ts.fixtures.read(EXPECTED_FILE), - get_hash!(ts.ucmd().arg(DIGEST_ARG).arg(BITS_ARG).pipe_in_fixture("input.txt").succeeds().no_stderr().stdout)); + get_hash!(ts.ucmd().arg(DIGEST_ARG).arg(BITS_ARG).pipe_in_fixture("input.txt").succeeds().no_stderr().stdout_str())); } } )*) diff --git a/tests/by-util/test_head.rs b/tests/by-util/test_head.rs index d91cc1289..b2a3cf0cb 100755 --- a/tests/by-util/test_head.rs +++ b/tests/by-util/test_head.rs @@ -129,6 +129,15 @@ fn test_zero_terminated_syntax_2() { .stdout_is("x\0y"); } +#[test] +fn test_zero_terminated_negative_lines() { + new_ucmd!() + .args(&["-z", "-n", "-1"]) + .pipe_in("x\0y\0z\0") + .run() + .stdout_is("x\0y\0"); +} + #[test] fn test_negative_byte_syntax() { new_ucmd!() @@ -156,14 +165,22 @@ fn test_negative_zero_bytes() { } #[test] fn test_no_such_file_or_directory() { - let result = new_ucmd!().arg("no_such_file.toml").run(); + new_ucmd!() + .arg("no_such_file.toml") + .fails() + .stderr_contains("cannot open 'no_such_file.toml' for reading: No such file or directory"); +} - assert_eq!( - true, - result - .stderr - .contains("cannot open 'no_such_file.toml' for reading: No such file or directory") - ) +/// Test that each non-existent files gets its own error message printed. +#[test] +fn test_multiple_nonexistent_files() { + new_ucmd!() + .args(&["bogusfile1", "bogusfile2"]) + .fails() + .stdout_does_not_contain("==> bogusfile1 <==") + .stderr_contains("cannot open 'bogusfile1' for reading: No such file or directory") + .stdout_does_not_contain("==> bogusfile2 <==") + .stderr_contains("cannot open 'bogusfile2' for reading: No such file or directory"); } // there was a bug not caught by previous tests @@ -200,3 +217,28 @@ fn test_obsolete_extras() { .succeeds() .stdout_is("==> standard input <==\n1\02\03\04\05\0"); } + +#[test] +fn test_multiple_files() { + new_ucmd!() + .args(&["emptyfile.txt", "emptyfile.txt"]) + .succeeds() + .stdout_is("==> emptyfile.txt <==\n\n==> emptyfile.txt <==\n"); +} + +#[test] +fn test_multiple_files_with_stdin() { + new_ucmd!() + .args(&["emptyfile.txt", "-", "emptyfile.txt"]) + .pipe_in("hello\n") + .succeeds() + .stdout_is( + "==> emptyfile.txt <== + +==> standard input <== +hello + +==> emptyfile.txt <== +", + ); +} diff --git a/tests/by-util/test_hostid.rs b/tests/by-util/test_hostid.rs index 17aad4aff..3ea818480 100644 --- a/tests/by-util/test_hostid.rs +++ b/tests/by-util/test_hostid.rs @@ -4,10 +4,6 @@ use self::regex::Regex; #[test] fn test_normal() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.run(); - - assert!(result.success); let re = Regex::new(r"^[0-9a-f]{8}").unwrap(); - assert!(re.is_match(&result.stdout.trim())); + new_ucmd!().succeeds().stdout_matches(&re); } diff --git a/tests/by-util/test_hostname.rs b/tests/by-util/test_hostname.rs index 804d47642..3fcb1ae8b 100644 --- a/tests/by-util/test_hostname.rs +++ b/tests/by-util/test_hostname.rs @@ -6,25 +6,25 @@ fn test_hostname() { let ls_short_res = new_ucmd!().arg("-s").succeeds(); let ls_domain_res = new_ucmd!().arg("-d").succeeds(); - assert!(ls_default_res.stdout.len() >= ls_short_res.stdout.len()); - assert!(ls_default_res.stdout.len() >= ls_domain_res.stdout.len()); + assert!(ls_default_res.stdout().len() >= ls_short_res.stdout().len()); + assert!(ls_default_res.stdout().len() >= ls_domain_res.stdout().len()); } // FixME: fails for "MacOS" #[cfg(not(target_vendor = "apple"))] #[test] fn test_hostname_ip() { - let result = new_ucmd!().arg("-i").run(); - println!("{:#?}", result); - assert!(result.success); - assert!(!result.stdout.trim().is_empty()); + let result = new_ucmd!().arg("-i").succeeds(); + assert!(!result.stdout_str().trim().is_empty()); } #[test] fn test_hostname_full() { - let result = new_ucmd!().arg("-f").succeeds(); - assert!(!result.stdout.trim().is_empty()); - let ls_short_res = new_ucmd!().arg("-s").succeeds(); - assert!(result.stdout.trim().contains(ls_short_res.stdout.trim())); + assert!(!ls_short_res.stdout_str().trim().is_empty()); + + new_ucmd!() + .arg("-f") + .succeeds() + .stdout_contains(ls_short_res.stdout_str().trim()); } diff --git a/tests/by-util/test_id.rs b/tests/by-util/test_id.rs index 116c73995..1f8249aab 100644 --- a/tests/by-util/test_id.rs +++ b/tests/by-util/test_id.rs @@ -1,93 +1,91 @@ use crate::common::util::*; +// Apparently some CI environments have configuration issues, e.g. with 'whoami' and 'id'. +// If we are running inside the CI and "needle" is in "stderr" skipping this test is +// considered okay. If we are not inside the CI this calls assert!(result.success). +// +// From the Logs: "Build (ubuntu-18.04, x86_64-unknown-linux-gnu, feat_os_unix, use-cross)" +// stderr: "whoami: cannot find name for user ID 1001" +// Maybe: "adduser --uid 1001 username" can put things right? +// stderr = id: Could not find uid 1001: No such id: 1001 +fn skipping_test_is_okay(result: &CmdResult, needle: &str) -> bool { + if !result.succeeded() { + println!("result.stdout = {}", result.stdout_str()); + println!("result.stderr = {}", result.stderr_str()); + if is_ci() && result.stderr_str().contains(needle) { + println!("test skipped:"); + return true; + } else { + result.success(); + } + } + false +} + fn return_whoami_username() -> String { let scene = TestScenario::new("whoami"); let result = scene.cmd("whoami").run(); - if is_ci() && result.stderr.contains("cannot find name for user ID") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + if skipping_test_is_okay(&result, "whoami: cannot find name for user ID") { + println!("test skipped:"); return String::from(""); } - result.stdout.trim().to_string() + result.stdout_str().trim().to_string() } #[test] fn test_id() { let scene = TestScenario::new(util_name!()); - let mut result = scene.ucmd().arg("-u").run(); - if result.stderr.contains("cannot find name for user ID") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it - return; - } - assert!(result.success); + let result = scene.ucmd().arg("-u").succeeds(); + let uid = result.stdout_str().trim(); - let uid = String::from(result.stdout.trim()); - result = scene.ucmd().run(); - if is_ci() && result.stderr.contains("cannot find name for user ID") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + let result = scene.ucmd().run(); + if skipping_test_is_okay(&result, "Could not find uid") { return; } - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - if !result.stderr.contains("Could not find uid") { - // Verify that the id found by --user/-u exists in the list - assert!(result.stdout.contains(&uid)); - } + + // Verify that the id found by --user/-u exists in the list + result.stdout_contains(uid); } #[test] fn test_id_from_name() { let username = return_whoami_username(); - if username == "" { - // Sometimes, the CI is failing here + if username.is_empty() { return; } let scene = TestScenario::new(util_name!()); - let result = scene.ucmd().arg(&username).succeeds(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - let uid = String::from(result.stdout.trim()); - let result = scene.ucmd().succeeds(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - // Verify that the id found by --user/-u exists in the list - assert!(result.stdout.contains(&uid)); - // Verify that the username found by whoami exists in the list - assert!(result.stdout.contains(&username)); + let result = scene.ucmd().arg(&username).run(); + if skipping_test_is_okay(&result, "Could not find uid") { + return; + } + + let uid = result.stdout_str().trim(); + + let result = scene.ucmd().run(); + if skipping_test_is_okay(&result, "Could not find uid") { + return; + } + + result + // Verify that the id found by --user/-u exists in the list + .stdout_contains(uid) + // Verify that the username found by whoami exists in the list + .stdout_contains(username); } #[test] fn test_id_name_from_id() { - let mut scene = TestScenario::new(util_name!()); - let result = scene.ucmd().arg("-u").run(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - let uid = String::from(result.stdout.trim()); + let result = new_ucmd!().arg("-nu").run(); - scene = TestScenario::new(util_name!()); - let result = scene.ucmd().arg("-nu").arg(uid).run(); - if is_ci() && result.stderr.contains("No such user/group") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + let username_id = result.stdout_str().trim(); + + let username_whoami = return_whoami_username(); + if username_whoami.is_empty() { return; } - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - - let username_id = String::from(result.stdout.trim()); - - scene = TestScenario::new("whoami"); - let result = scene.cmd("whoami").run(); - - let username_whoami = result.stdout.trim(); assert_eq!(username_id, username_whoami); } @@ -97,17 +95,11 @@ fn test_id_group() { let scene = TestScenario::new(util_name!()); let mut result = scene.ucmd().arg("-g").succeeds(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - let s1 = String::from(result.stdout.trim()); + let s1 = result.stdout_str().trim(); assert!(s1.parse::().is_ok()); result = scene.ucmd().arg("--group").succeeds(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - let s1 = String::from(result.stdout.trim()); + let s1 = result.stdout_str().trim(); assert!(s1.parse::().is_ok()); } @@ -116,19 +108,13 @@ fn test_id_groups() { let scene = TestScenario::new(util_name!()); let result = scene.ucmd().arg("-G").succeeds(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - let groups = result.stdout.trim().split_whitespace(); + let groups = result.stdout_str().trim().split_whitespace(); for s in groups { assert!(s.parse::().is_ok()); } let result = scene.ucmd().arg("--groups").succeeds(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - let groups = result.stdout.trim().split_whitespace(); + let groups = result.stdout_str().trim().split_whitespace(); for s in groups { assert!(s.parse::().is_ok()); } @@ -138,50 +124,46 @@ fn test_id_groups() { fn test_id_user() { let scene = TestScenario::new(util_name!()); - let mut result = scene.ucmd().arg("-u").succeeds(); - assert!(result.success); - let s1 = String::from(result.stdout.trim()); + let result = scene.ucmd().arg("-u").succeeds(); + let s1 = result.stdout_str().trim(); assert!(s1.parse::().is_ok()); - result = scene.ucmd().arg("--user").succeeds(); - assert!(result.success); - let s1 = String::from(result.stdout.trim()); + + let result = scene.ucmd().arg("--user").succeeds(); + let s1 = result.stdout_str().trim(); assert!(s1.parse::().is_ok()); } #[test] fn test_id_pretty_print() { let username = return_whoami_username(); - if username == "" { - // Sometimes, the CI is failing here + if username.is_empty() { return; } let scene = TestScenario::new(util_name!()); let result = scene.ucmd().arg("-p").run(); - if result.stdout.trim() == "" { - // Sometimes, the CI is failing here with - // old rust versions on Linux + if result.stdout_str().trim().is_empty() { + // this fails only on: "MinRustV (ubuntu-latest, feat_os_unix)" + // `rustc 1.40.0 (73528e339 2019-12-16)` + // run: /home/runner/work/coreutils/coreutils/target/debug/coreutils id -p + // thread 'test_id::test_id_pretty_print' panicked at 'Command was expected to succeed. + // stdout = + // stderr = ', tests/common/util.rs:157:13 + println!("test skipped:"); return; } - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - assert!(result.stdout.contains(&username)); + + result.success().stdout_contains(username); } #[test] fn test_id_password_style() { let username = return_whoami_username(); - if username == "" { - // Sometimes, the CI is failing here + if username.is_empty() { return; } - let scene = TestScenario::new(util_name!()); - let result = scene.ucmd().arg("-P").succeeds(); + let result = new_ucmd!().arg("-P").succeeds(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - assert!(result.success); - assert!(result.stdout.starts_with(&username)); + assert!(result.stdout_str().starts_with(&username)); } diff --git a/tests/by-util/test_install.rs b/tests/by-util/test_install.rs index 8ac6396fd..fb79454c1 100644 --- a/tests/by-util/test_install.rs +++ b/tests/by-util/test_install.rs @@ -2,6 +2,8 @@ use crate::common::util::*; use filetime::FileTime; use rust_users::*; use std::os::unix::fs::PermissionsExt; +#[cfg(not(windows))] +use std::process::Command; #[cfg(target_os = "linux")] use std::thread::sleep; @@ -9,12 +11,10 @@ use std::thread::sleep; fn test_install_help() { let (_, mut ucmd) = at_and_ucmd!(); - assert!(ucmd - .arg("--help") + ucmd.arg("--help") .succeeds() .no_stderr() - .stdout - .contains("FLAGS:")); + .stdout_contains("FLAGS:"); } #[test] @@ -57,13 +57,11 @@ fn test_install_failing_not_dir() { at.touch(file1); at.touch(file2); at.touch(file3); - assert!(ucmd - .arg(file1) + ucmd.arg(file1) .arg(file2) .arg(file3) .fails() - .stderr - .contains("not a directory")); + .stderr_contains("not a directory"); } #[test] @@ -75,13 +73,11 @@ fn test_install_unimplemented_arg() { at.touch(file); at.mkdir(dir); - assert!(ucmd - .arg(context_arg) + ucmd.arg(context_arg) .arg(file) .arg(dir) .fails() - .stderr - .contains("Unimplemented")); + .stderr_contains("Unimplemented"); assert!(!at.file_exists(&format!("{}/{}", dir, file))); } @@ -193,12 +189,8 @@ fn test_install_mode_numeric() { let mode_arg = "-m 0333"; at.mkdir(dir2); - let result = scene.ucmd().arg(mode_arg).arg(file).arg(dir2).run(); + scene.ucmd().arg(mode_arg).arg(file).arg(dir2).succeeds(); - println!("stderr = {:?}", result.stderr); - println!("stdout = {:?}", result.stdout); - - assert!(result.success); let dest_file = &format!("{}/{}", dir2, file); assert!(at.file_exists(file)); assert!(at.file_exists(dest_file)); @@ -233,13 +225,11 @@ fn test_install_mode_failing() { at.touch(file); at.mkdir(dir); - assert!(ucmd - .arg(file) + ucmd.arg(file) .arg(dir) .arg(mode_arg) .fails() - .stderr - .contains("Invalid mode string: invalid digit found in string")); + .stderr_contains("Invalid mode string: invalid digit found in string"); let dest_file = &format!("{}/{}", dir, file); assert!(at.file_exists(file)); @@ -311,16 +301,13 @@ fn test_install_target_new_file_with_group() { .arg(format!("{}/{}", dir, file)) .run(); - println!("stderr = {:?}", result.stderr); - println!("stdout = {:?}", result.stdout); - - if is_ci() && result.stderr.contains("error: no such group:") { + if is_ci() && result.stderr_str().contains("no such group:") { // In the CI, some server are failing to return the group. // As seems to be a configuration issue, ignoring it return; } - assert!(result.success); + result.success(); assert!(at.file_exists(file)); assert!(at.file_exists(&format!("{}/{}", dir, file))); } @@ -341,16 +328,13 @@ fn test_install_target_new_file_with_owner() { .arg(format!("{}/{}", dir, file)) .run(); - println!("stderr = {:?}", result.stderr); - println!("stdout = {:?}", result.stdout); - - if is_ci() && result.stderr.contains("error: no such user:") { + if is_ci() && result.stderr_str().contains("no such user:") { // In the CI, some server are failing to return the user id. // As seems to be a configuration issue, ignoring it return; } - assert!(result.success); + result.success(); assert!(at.file_exists(file)); assert!(at.file_exists(&format!("{}/{}", dir, file))); } @@ -364,13 +348,10 @@ fn test_install_target_new_file_failing_nonexistent_parent() { at.touch(file1); - let err = ucmd - .arg(file1) + ucmd.arg(file1) .arg(format!("{}/{}", dir, file2)) .fails() - .stderr; - - assert!(err.contains("not a directory")) + .stderr_contains(&"No such file or directory"); } #[test] @@ -415,18 +396,12 @@ fn test_install_copy_file() { #[test] #[cfg(target_os = "linux")] fn test_install_target_file_dev_null() { - let scene = TestScenario::new(util_name!()); - let at = &scene.fixtures; + let (at, mut ucmd) = at_and_ucmd!(); let file1 = "/dev/null"; let file2 = "target_file"; - let result = scene.ucmd().arg(file1).arg(file2).run(); - - println!("stderr = {:?}", result.stderr); - println!("stdout = {:?}", result.stdout); - - assert!(result.success); + ucmd.arg(file1).arg(file2).succeeds(); assert!(at.file_exists(file2)); } @@ -460,9 +435,12 @@ fn test_install_failing_omitting_directory() { at.mkdir(dir2); at.touch(file1); - let r = ucmd.arg(dir1).arg(file1).arg(dir2).run(); - assert!(r.code == Some(1)); - assert!(r.stderr.contains("omitting directory")); + ucmd.arg(dir1) + .arg(file1) + .arg(dir2) + .fails() + .code_is(1) + .stderr_contains("omitting directory"); } #[test] @@ -475,9 +453,12 @@ fn test_install_failing_no_such_file() { at.mkdir(dir1); at.touch(file1); - let r = ucmd.arg(file1).arg(file2).arg(dir1).run(); - assert!(r.code == Some(1)); - assert!(r.stderr.contains("No such file or directory")); + ucmd.arg(file1) + .arg(file2) + .arg(dir1) + .fails() + .code_is(1) + .stderr_contains("No such file or directory"); } #[test] @@ -566,3 +547,128 @@ fn test_install_copy_then_compare_file_with_extra_mode() { assert!(after_install_sticky != after_install_sticky_again); } + +const STRIP_TARGET_FILE: &str = "helloworld_installed"; +const SYMBOL_DUMP_PROGRAM: &str = "objdump"; +const STRIP_SOURCE_FILE_SYMBOL: &str = "main"; + +fn strip_source_file() -> &'static str { + if cfg!(target_os = "macos") { + "helloworld_macos" + } else { + "helloworld_linux" + } +} + +#[test] +#[cfg(not(windows))] +fn test_install_and_strip() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + scene + .ucmd() + .arg("-s") + .arg(strip_source_file()) + .arg(STRIP_TARGET_FILE) + .succeeds() + .no_stderr(); + + let output = Command::new(SYMBOL_DUMP_PROGRAM) + .arg("-t") + .arg(at.plus(STRIP_TARGET_FILE)) + .output() + .unwrap(); + + let stdout = String::from_utf8(output.stdout).unwrap(); + assert!(!stdout.contains(STRIP_SOURCE_FILE_SYMBOL)); +} + +#[test] +#[cfg(not(windows))] +fn test_install_and_strip_with_program() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + scene + .ucmd() + .arg("-s") + .arg("--strip-program") + .arg("/usr/bin/strip") + .arg(strip_source_file()) + .arg(STRIP_TARGET_FILE) + .succeeds() + .no_stderr(); + + let output = Command::new(SYMBOL_DUMP_PROGRAM) + .arg("-t") + .arg(at.plus(STRIP_TARGET_FILE)) + .output() + .unwrap(); + + let stdout = String::from_utf8(output.stdout).unwrap(); + assert!(!stdout.contains(STRIP_SOURCE_FILE_SYMBOL)); +} + +#[test] +#[cfg(not(windows))] +fn test_install_and_strip_with_invalid_program() { + new_ucmd!() + .arg("-s") + .arg("--strip-program") + .arg("/bin/date") + .arg(strip_source_file()) + .arg(STRIP_TARGET_FILE) + .fails() + .stderr_contains("strip program failed"); +} + +#[test] +#[cfg(not(windows))] +fn test_install_and_strip_with_non_existent_program() { + new_ucmd!() + .arg("-s") + .arg("--strip-program") + .arg("/usr/bin/non_existent_program") + .arg(strip_source_file()) + .arg(STRIP_TARGET_FILE) + .fails() + .stderr_contains("No such file or directory"); +} + +#[test] +fn test_install_creating_leading_dirs() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let source = "create_leading_test_file"; + let target = "dir1/dir2/dir3/test_file"; + + at.touch(source); + + scene + .ucmd() + .arg("-D") + .arg(source) + .arg(at.plus(target)) + .succeeds() + .no_stderr(); +} + +#[test] +#[cfg(not(windows))] +fn test_install_creating_leading_dir_fails_on_long_name() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let source = "create_leading_test_file"; + let target = format!("{}/test_file", "d".repeat(libc::PATH_MAX as usize + 1)); + + at.touch(source); + + scene + .ucmd() + .arg("-D") + .arg(source) + .arg(at.plus(target.as_str())) + .fails() + .stderr_contains("failed to create"); +} diff --git a/tests/by-util/test_join.rs b/tests/by-util/test_join.rs index b0311df84..a8f046851 100644 --- a/tests/by-util/test_join.rs +++ b/tests/by-util/test_join.rs @@ -148,7 +148,7 @@ fn multitab_character() { .arg("-t") .arg("э") .fails() - .stderr_is("join: error: multi-character tab э"); + .stderr_is("join: multi-character tab э"); } #[test] @@ -211,7 +211,7 @@ fn empty_format() { .arg("-o") .arg("") .fails() - .stderr_is("join: error: invalid file number in field spec: ''"); + .stderr_is("join: invalid file number in field spec: ''"); } #[test] diff --git a/tests/by-util/test_kill.rs b/tests/by-util/test_kill.rs index 651491045..637aea9a2 100644 --- a/tests/by-util/test_kill.rs +++ b/tests/by-util/test_kill.rs @@ -1 +1,126 @@ -// ToDO: add tests +use crate::common::util::*; +use regex::Regex; +use std::os::unix::process::ExitStatusExt; +use std::process::{Child, Command}; + +// A child process the tests will try to kill. +struct Target { + child: Child, + killed: bool, +} + +impl Target { + // Creates a target that will naturally die after some time if not killed + // fast enough. + // This timeout avoids hanging failing tests. + fn new() -> Target { + Target { + child: Command::new("sleep") + .arg("30") + .spawn() + .expect("cannot spawn target"), + killed: false, + } + } + + // Waits for the target to complete and returns the signal it received if any. + fn wait_for_signal(&mut self) -> Option { + let sig = self.child.wait().expect("cannot wait on target").signal(); + self.killed = true; + sig + } + + fn pid(&self) -> u32 { + self.child.id() + } +} + +impl Drop for Target { + // Terminates this target to avoid littering test boxes with zombi processes + // when a test fails after creating a target but before killing it. + fn drop(&mut self) { + if !self.killed { + self.child.kill().expect("cannot kill target"); + } + } +} + +#[test] +fn test_kill_list_all_signals() { + // Check for a few signals. Do not try to be comprehensive. + new_ucmd!() + .arg("-l") + .succeeds() + .stdout_contains("KILL") + .stdout_contains("TERM") + .stdout_contains("HUP"); +} + +#[test] +fn test_kill_list_all_signals_as_table() { + // Check for a few signals. Do not try to be comprehensive. + new_ucmd!() + .arg("-t") + .succeeds() + .stdout_contains("KILL") + .stdout_contains("TERM") + .stdout_contains("HUP"); +} + +#[test] +fn test_kill_list_one_signal_from_name() { + // Use SIGKILL because it is 9 on all unixes. + new_ucmd!() + .arg("-l") + .arg("KILL") + .succeeds() + .stdout_matches(&Regex::new("\\b9\\b").unwrap()); +} + +#[test] +fn test_kill_set_bad_signal_name() { + new_ucmd!() + .arg("-s") + .arg("IAMNOTASIGNAL") + .fails() + .stderr_contains("unknown signal"); +} + +#[test] +fn test_kill_with_default_signal() { + let mut target = Target::new(); + new_ucmd!().arg(format!("{}", target.pid())).succeeds(); + assert_eq!(target.wait_for_signal(), Some(libc::SIGTERM)); +} + +#[test] +fn test_kill_with_signal_number_old_form() { + let mut target = Target::new(); + new_ucmd!() + .arg("-9") + .arg(format!("{}", target.pid())) + .succeeds(); + assert_eq!(target.wait_for_signal(), Some(9)); +} + +#[test] +fn test_kill_with_signal_number_new_form() { + let mut target = Target::new(); + new_ucmd!() + .arg("-s") + .arg("9") + .arg(format!("{}", target.pid())) + .succeeds(); + assert_eq!(target.wait_for_signal(), Some(9)); +} + +#[test] +fn test_kill_with_signal_name_new_form() { + let mut target = Target::new(); + new_ucmd!() + .arg("-s") + .arg("KILL") + .arg(format!("{}", target.pid())) + .succeeds(); + assert_eq!(target.wait_for_signal(), Some(libc::SIGKILL)); +} diff --git a/tests/by-util/test_link.rs b/tests/by-util/test_link.rs index 381ea168a..6ac3f35cc 100644 --- a/tests/by-util/test_link.rs +++ b/tests/by-util/test_link.rs @@ -23,7 +23,7 @@ fn test_link_no_circular() { ucmd.args(&[link, link]) .fails() - .stderr_is("link: error: No such file or directory (os error 2)\n"); + .stderr_is("link: No such file or directory (os error 2)\n"); assert!(!at.file_exists(link)); } @@ -35,7 +35,29 @@ fn test_link_nonexistent_file() { ucmd.args(&[file, link]) .fails() - .stderr_is("link: error: No such file or directory (os error 2)\n"); + .stderr_is("link: No such file or directory (os error 2)\n"); assert!(!at.file_exists(file)); assert!(!at.file_exists(link)); } + +#[test] +fn test_link_one_argument() { + let (_, mut ucmd) = at_and_ucmd!(); + let file = "test_link_argument"; + ucmd.args(&[file]).fails().stderr_contains( + "error: The argument '...' requires at least 2 values, but only 1 was provide", + ); +} + +#[test] +fn test_link_three_arguments() { + let (_, mut ucmd) = at_and_ucmd!(); + let arguments = vec![ + "test_link_argument1", + "test_link_argument2", + "test_link_argument3", + ]; + ucmd.args(&arguments[..]).fails().stderr_contains( + format!("error: The value '{}' was provided to '...', but it wasn't expecting any more values", arguments[2]), + ); +} diff --git a/tests/by-util/test_ln.rs b/tests/by-util/test_ln.rs index 89261036d..f2508ecbf 100644 --- a/tests/by-util/test_ln.rs +++ b/tests/by-util/test_ln.rs @@ -299,13 +299,11 @@ fn test_symlink_overwrite_dir_fail() { at.touch(path_a); at.mkdir(path_b); - assert!( - ucmd.args(&["-s", "-T", path_a, path_b]) - .fails() - .stderr - .len() - > 0 - ); + assert!(!ucmd + .args(&["-s", "-T", path_a, path_b]) + .fails() + .stderr_str() + .is_empty()); } #[test] @@ -358,7 +356,11 @@ fn test_symlink_target_only() { at.mkdir(dir); - assert!(ucmd.args(&["-s", "-t", dir]).fails().stderr.len() > 0); + assert!(!ucmd + .args(&["-s", "-t", dir]) + .fails() + .stderr_str() + .is_empty()); } #[test] @@ -407,7 +409,7 @@ fn test_symlink_missing_destination() { at.touch(file); ucmd.args(&["-s", "-T", file]).fails().stderr_is(format!( - "ln: error: missing destination file operand after '{}'", + "ln: missing destination file operand after '{}'", file )); } @@ -520,10 +522,7 @@ fn test_symlink_no_deref_dir() { scene.ucmd().args(&["-sn", dir1, link]).fails(); // Try with the no-deref - let result = scene.ucmd().args(&["-sfn", dir1, link]).run(); - println!("stdout {}", result.stdout); - println!("stderr {}", result.stderr); - assert!(result.success); + scene.ucmd().args(&["-sfn", dir1, link]).succeeds(); assert!(at.dir_exists(dir1)); assert!(at.dir_exists(dir2)); assert!(at.is_symlink(link)); @@ -566,10 +565,7 @@ fn test_symlink_no_deref_file() { scene.ucmd().args(&["-sn", file1, link]).fails(); // Try with the no-deref - let result = scene.ucmd().args(&["-sfn", file1, link]).run(); - println!("stdout {}", result.stdout); - println!("stderr {}", result.stderr); - assert!(result.success); + scene.ucmd().args(&["-sfn", file1, link]).succeeds(); assert!(at.file_exists(file1)); assert!(at.file_exists(file2)); assert!(at.is_symlink(link)); diff --git a/tests/by-util/test_logname.rs b/tests/by-util/test_logname.rs index b15941c06..0e8125191 100644 --- a/tests/by-util/test_logname.rs +++ b/tests/by-util/test_logname.rs @@ -3,23 +3,19 @@ use std::env; #[test] fn test_normal() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.run(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); + let result = new_ucmd!().run(); println!("env::var(CI).is_ok() = {}", env::var("CI").is_ok()); for (key, value) in env::vars() { println!("{}: {}", key, value); } - if (is_ci() || is_wsl()) && result.stderr.contains("error: no login name") { + if (is_ci() || uucore::os::is_wsl_1()) && result.stderr_str().contains("no login name") { // ToDO: investigate WSL failure // In the CI, some server are failing to return logname. // As seems to be a configuration issue, ignoring it return; } - assert!(result.success); - assert!(!result.stdout.trim().is_empty()); + result.success(); + assert!(!result.stdout_str().trim().is_empty()); } diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index f0db7ca9c..01c5ab5c4 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -5,6 +5,8 @@ use crate::common::util::*; extern crate regex; use self::regex::Regex; +use std::collections::HashMap; +use std::path::Path; use std::thread::sleep; use std::time::Duration; @@ -17,9 +19,7 @@ use std::path::PathBuf; #[cfg(not(windows))] use std::sync::Mutex; #[cfg(not(windows))] -extern crate tempdir; -#[cfg(not(windows))] -use self::tempdir::TempDir; +extern crate tempfile; #[cfg(not(windows))] lazy_static! { @@ -42,23 +42,74 @@ fn test_ls_a() { let scene = TestScenario::new(util_name!()); let at = &scene.fixtures; at.touch(".test-1"); + at.mkdir("some-dir"); + at.touch( + Path::new("some-dir") + .join(".test-2") + .as_os_str() + .to_str() + .unwrap(), + ); - let result = scene.ucmd().succeeds(); - let stdout = result.stdout_str(); - assert!(!stdout.contains(".test-1")); - assert!(!stdout.contains("..")); + let re_pwd = Regex::new(r"^\.\n").unwrap(); + + // Using the present working directory + scene + .ucmd() + .arg("-1") + .succeeds() + .stdout_does_not_contain(".test-1") + .stdout_does_not_contain("..") + .stdout_does_not_match(&re_pwd); scene .ucmd() .arg("-a") + .arg("-1") .succeeds() .stdout_contains(&".test-1") - .stdout_contains(&".."); + .stdout_contains(&"..") + .stdout_matches(&re_pwd); - let result = scene.ucmd().arg("-A").succeeds(); - result.stdout_contains(".test-1"); - let stdout = result.stdout_str(); - assert!(!stdout.contains("..")); + scene + .ucmd() + .arg("-A") + .arg("-1") + .succeeds() + .stdout_contains(".test-1") + .stdout_does_not_contain("..") + .stdout_does_not_match(&re_pwd); + + // Using a subdirectory + scene + .ucmd() + .arg("-1") + .arg("some-dir") + .succeeds() + .stdout_does_not_contain(".test-2") + .stdout_does_not_contain("..") + .stdout_does_not_match(&re_pwd); + + scene + .ucmd() + .arg("-a") + .arg("-1") + .arg("some-dir") + .succeeds() + .stdout_contains(&".test-2") + .stdout_contains(&"..") + .no_stderr() + .stdout_matches(&re_pwd); + + scene + .ucmd() + .arg("-A") + .arg("-1") + .arg("some-dir") + .succeeds() + .stdout_contains(".test-2") + .stdout_does_not_contain("..") + .stdout_does_not_match(&re_pwd); } #[test] @@ -102,6 +153,20 @@ fn test_ls_width() { .succeeds() .stdout_only("test-width-1\ntest-width-2\ntest-width-3\ntest-width-4\n"); } + + scene + .ucmd() + .arg("-w=bad") + .fails() + .stderr_contains("invalid line width"); + + for option in &["-w 1a", "-w=1a", "--width=1a", "--width 1a"] { + scene + .ucmd() + .args(&option.split(" ").collect::>()) + .fails() + .stderr_only("ls: invalid line width: ‘1a’"); + } } #[test] @@ -242,6 +307,50 @@ fn test_ls_long() { } } +#[test] +fn test_ls_long_total_size() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + at.touch(&at.plus_as_string("test-long")); + at.append("test-long", "1"); + at.touch(&at.plus_as_string("test-long2")); + at.append("test-long2", "2"); + + let expected_prints: HashMap<_, _> = if cfg!(unix) { + [ + ("long_vanilla", "total 8"), + ("long_human_readable", "total 8.0K"), + ("long_si", "total 8.2k"), + ] + .iter() + .cloned() + .collect() + } else { + [ + ("long_vanilla", "total 2"), + ("long_human_readable", "total 2"), + ("long_si", "total 2"), + ] + .iter() + .cloned() + .collect() + }; + + for arg in &["-l", "--long", "--format=long", "--format=verbose"] { + let result = scene.ucmd().arg(arg).succeeds(); + result.stdout_contains(expected_prints["long_vanilla"]); + + for arg2 in &["-h", "--human-readable", "--si"] { + let result = scene.ucmd().arg(arg).arg(arg2).succeeds(); + result.stdout_contains(if *arg2 == "--si" { + expected_prints["long_si"] + } else { + expected_prints["long_human_readable"] + }); + } + } +} + #[test] fn test_ls_long_formats() { let scene = TestScenario::new(util_name!()); @@ -435,6 +544,53 @@ fn test_ls_deref() { assert!(!re.is_match(result.stdout_str().trim())); } +#[test] +fn test_ls_sort_none() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.touch("test-3"); + at.touch("test-1"); + at.touch("test-2"); + + // Order is not specified so we just check that it doesn't + // give any errors. + scene.ucmd().arg("--sort=none").succeeds(); + scene.ucmd().arg("-U").succeeds(); +} + +#[test] +fn test_ls_sort_name() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.touch("test-3"); + at.touch("test-1"); + at.touch("test-2"); + + let sep = if cfg!(unix) { "\n" } else { " " }; + + scene + .ucmd() + .arg("--sort=name") + .succeeds() + .stdout_is(["test-1", "test-2", "test-3\n"].join(sep)); + + let scene_dot = TestScenario::new(util_name!()); + let at = &scene_dot.fixtures; + at.touch(".a"); + at.touch("a"); + at.touch(".b"); + at.touch("b"); + + scene_dot + .ucmd() + .arg("--sort=name") + .arg("-A") + .succeeds() + .stdout_is([".a", ".b", "a", "b\n"].join(sep)); +} + #[test] fn test_ls_order_size() { let scene = TestScenario::new(util_name!()); @@ -463,6 +619,18 @@ fn test_ls_order_size() { result.stdout_only("test-1\ntest-2\ntest-3\ntest-4\n"); #[cfg(windows)] result.stdout_only("test-1 test-2 test-3 test-4\n"); + + let result = scene.ucmd().arg("--sort=size").succeeds(); + #[cfg(not(windows))] + result.stdout_only("test-4\ntest-3\ntest-2\ntest-1\n"); + #[cfg(windows)] + result.stdout_only("test-4 test-3 test-2 test-1\n"); + + let result = scene.ucmd().arg("--sort=size").arg("-r").succeeds(); + #[cfg(not(windows))] + result.stdout_only("test-1\ntest-2\ntest-3\ntest-4\n"); + #[cfg(windows)] + result.stdout_only("test-1 test-2 test-3 test-4\n"); } #[test] @@ -471,13 +639,123 @@ fn test_ls_long_ctime() { let at = &scene.fixtures; at.touch("test-long-ctime-1"); - let result = scene.ucmd().arg("-lc").succeeds(); - // Should show the time on Unix, but question marks on windows. - #[cfg(unix)] - result.stdout_contains(":"); - #[cfg(not(unix))] - result.stdout_contains("???"); + for arg in &["-c", "--time=ctime", "--time=status"] { + let result = scene.ucmd().arg("-l").arg(arg).succeeds(); + + // Should show the time on Unix, but question marks on windows. + #[cfg(unix)] + result.stdout_contains(":"); + #[cfg(not(unix))] + result.stdout_contains("???"); + } +} + +#[test] +#[ignore] +fn test_ls_order_birthtime() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + /* + Here we make 2 files with a timeout in between. + After creating the first file try to sync it. + This ensures the file gets created immediately instead of being saved + inside the OS's IO operation buffer. + Without this, both files might accidentally be created at the same time. + */ + at.make_file("test-birthtime-1").sync_all().unwrap(); + at.make_file("test-birthtime-2").sync_all().unwrap(); + at.open("test-birthtime-1"); + + let result = scene.ucmd().arg("--time=birth").arg("-t").run(); + + #[cfg(not(windows))] + assert_eq!(result.stdout_str(), "test-birthtime-2\ntest-birthtime-1\n"); + #[cfg(windows)] + assert_eq!(result.stdout_str(), "test-birthtime-2 test-birthtime-1\n"); +} + +#[test] +fn test_ls_styles() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + at.touch("test"); + + let re_full = Regex::new( + r"[a-z-]* \d* \w* \w* \d* \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d* (\+|\-)\d{4} test\n", + ) + .unwrap(); + let re_long = + Regex::new(r"[a-z-]* \d* \w* \w* \d* \d{4}-\d{2}-\d{2} \d{2}:\d{2} test\n").unwrap(); + let re_iso = Regex::new(r"[a-z-]* \d* \w* \w* \d* \d{2}-\d{2} \d{2}:\d{2} test\n").unwrap(); + let re_locale = + Regex::new(r"[a-z-]* \d* \w* \w* \d* [A-Z][a-z]{2} ( |\d)\d \d{2}:\d{2} test\n").unwrap(); + + //full-iso + let result = scene + .ucmd() + .arg("-l") + .arg("--time-style=full-iso") + .succeeds(); + assert!(re_full.is_match(&result.stdout_str())); + //long-iso + let result = scene + .ucmd() + .arg("-l") + .arg("--time-style=long-iso") + .succeeds(); + assert!(re_long.is_match(&result.stdout_str())); + //iso + let result = scene.ucmd().arg("-l").arg("--time-style=iso").succeeds(); + assert!(re_iso.is_match(&result.stdout_str())); + //locale + let result = scene.ucmd().arg("-l").arg("--time-style=locale").succeeds(); + assert!(re_locale.is_match(&result.stdout_str())); + + //Overwrite options tests + let result = scene + .ucmd() + .arg("-l") + .arg("--time-style=long-iso") + .arg("--time-style=iso") + .succeeds(); + assert!(re_iso.is_match(&result.stdout_str())); + let result = scene + .ucmd() + .arg("--time-style=iso") + .arg("--full-time") + .succeeds(); + assert!(re_full.is_match(&result.stdout_str())); + let result = scene + .ucmd() + .arg("--full-time") + .arg("--time-style=iso") + .succeeds(); + assert!(re_iso.is_match(&result.stdout_str())); + + let result = scene + .ucmd() + .arg("--full-time") + .arg("--time-style=iso") + .arg("--full-time") + .succeeds(); + assert!(re_full.is_match(&result.stdout_str())); + + let result = scene + .ucmd() + .arg("--full-time") + .arg("-x") + .arg("-l") + .succeeds(); + assert!(re_full.is_match(&result.stdout_str())); + + at.touch("test2"); + let result = scene.ucmd().arg("--full-time").arg("-x").succeeds(); + #[cfg(not(windows))] + assert_eq!(result.stdout_str(), "test\ntest2\n"); + #[cfg(windows)] + assert_eq!(result.stdout_str(), "test test2\n"); } #[test] @@ -518,32 +796,46 @@ fn test_ls_order_time() { #[cfg(windows)] result.stdout_only("test-4 test-3 test-2 test-1\n"); + let result = scene.ucmd().arg("--sort=time").succeeds(); + #[cfg(not(windows))] + result.stdout_only("test-4\ntest-3\ntest-2\ntest-1\n"); + #[cfg(windows)] + result.stdout_only("test-4 test-3 test-2 test-1\n"); + let result = scene.ucmd().arg("-tr").succeeds(); #[cfg(not(windows))] result.stdout_only("test-1\ntest-2\ntest-3\ntest-4\n"); #[cfg(windows)] result.stdout_only("test-1 test-2 test-3 test-4\n"); + let result = scene.ucmd().arg("--sort=time").arg("-r").succeeds(); + #[cfg(not(windows))] + result.stdout_only("test-1\ntest-2\ntest-3\ntest-4\n"); + #[cfg(windows)] + result.stdout_only("test-1 test-2 test-3 test-4\n"); + // 3 was accessed last in the read // So the order should be 2 3 4 1 - let result = scene.ucmd().arg("-tu").succeeds(); - let file3_access = at.open("test-3").metadata().unwrap().accessed().unwrap(); - let file4_access = at.open("test-4").metadata().unwrap().accessed().unwrap(); + for arg in &["-u", "--time=atime", "--time=access", "--time=use"] { + let result = scene.ucmd().arg("-t").arg(arg).succeeds(); + let file3_access = at.open("test-3").metadata().unwrap().accessed().unwrap(); + let file4_access = at.open("test-4").metadata().unwrap().accessed().unwrap(); - // It seems to be dependent on the platform whether the access time is actually set - if file3_access > file4_access { - if cfg!(not(windows)) { - result.stdout_only("test-3\ntest-4\ntest-2\ntest-1\n"); + // It seems to be dependent on the platform whether the access time is actually set + if file3_access > file4_access { + if cfg!(not(windows)) { + result.stdout_only("test-3\ntest-4\ntest-2\ntest-1\n"); + } else { + result.stdout_only("test-3 test-4 test-2 test-1\n"); + } } else { - result.stdout_only("test-3 test-4 test-2 test-1\n"); - } - } else { - // Access time does not seem to be set on Windows and some other - // systems so the order is 4 3 2 1 - if cfg!(not(windows)) { - result.stdout_only("test-4\ntest-3\ntest-2\ntest-1\n"); - } else { - result.stdout_only("test-4 test-3 test-2 test-1\n"); + // Access time does not seem to be set on Windows and some other + // systems so the order is 4 3 2 1 + if cfg!(not(windows)) { + result.stdout_only("test-4\ntest-3\ntest-2\ntest-1\n"); + } else { + result.stdout_only("test-4 test-3 test-2 test-1\n"); + } } } @@ -581,7 +873,7 @@ fn test_ls_files_dirs() { .ucmd() .arg("doesntexist") .fails() - .stderr_contains(&"error: 'doesntexist': No such file or directory"); + .stderr_contains(&"'doesntexist': No such file or directory"); // One exists, the other doesn't scene @@ -589,7 +881,7 @@ fn test_ls_files_dirs() { .arg("a") .arg("doesntexist") .fails() - .stderr_contains(&"error: 'doesntexist': No such file or directory") + .stderr_contains(&"'doesntexist': No such file or directory") .stdout_contains(&"a:"); } @@ -620,20 +912,27 @@ fn test_ls_recursive() { result.stdout_contains(&"a\\b:\nb"); } -#[cfg(unix)] #[test] -fn test_ls_ls_color() { +fn test_ls_color() { let scene = TestScenario::new(util_name!()); let at = &scene.fixtures; at.mkdir("a"); - at.mkdir("a/nested_dir"); + let nested_dir = Path::new("a") + .join("nested_dir") + .to_string_lossy() + .to_string(); + at.mkdir(&nested_dir); at.mkdir("z"); - at.touch(&at.plus_as_string("a/nested_file")); + let nested_file = Path::new("a") + .join("nested_file") + .to_string_lossy() + .to_string(); + at.touch(&nested_file); at.touch("test-color"); - let a_with_colors = "\x1b[01;34ma\x1b[0m"; - let z_with_colors = "\x1b[01;34mz\x1b[0m"; - let nested_dir_with_colors = "\x1b[01;34mnested_dir\x1b[0m"; + let a_with_colors = "\x1b[1;34ma\x1b[0m"; + let z_with_colors = "\x1b[1;34mz\x1b[0m"; + let nested_dir_with_colors = "\x1b[1;34mnested_dir\x1b[0m"; // Color is disabled by default let result = scene.ucmd().succeeds(); @@ -669,14 +968,6 @@ fn test_ls_ls_color() { .succeeds() .stdout_contains(nested_dir_with_colors); - // Color has no effect - scene - .ucmd() - .arg("--color=always") - .arg("a/nested_file") - .succeeds() - .stdout_contains("a/nested_file\n"); - // No output scene .ucmd() @@ -684,6 +975,18 @@ fn test_ls_ls_color() { .arg("z") .succeeds() .stdout_only(""); + + // The colors must not mess up the grid layout + at.touch("b"); + scene + .ucmd() + .arg("--color") + .arg("-w=15") + .succeeds() + .stdout_only(format!( + "{} test-color\nb {}\n", + a_with_colors, z_with_colors + )); } #[cfg(unix)] @@ -782,7 +1085,7 @@ fn test_ls_indicator_style() { { use self::unix_socket::UnixListener; - let dir = TempDir::new("unix_socket").expect("failed to create dir"); + let dir = tempfile::Builder::new().prefix("unix_socket").tempdir().expect("failed to create dir"); let socket_path = dir.path().join("sock"); let _listener = UnixListener::bind(&socket_path).expect("failed to create socket"); @@ -816,7 +1119,7 @@ fn test_ls_indicator_style() { let options = vec!["classify", "file-type", "slash"]; for opt in options { // Verify that classify and file-type both contain indicators for symlinks. - let result = scene + scene .ucmd() .arg(format!("--indicator-style={}", opt)) .succeeds() @@ -826,7 +1129,7 @@ fn test_ls_indicator_style() { // Same test as above, but with the alternate flags. let options = vec!["--classify", "--file-type", "-p"]; for opt in options { - let result = scene + scene .ucmd() .arg(format!("{}", opt)) .succeeds() @@ -837,7 +1140,7 @@ fn test_ls_indicator_style() { let options = vec!["classify", "file-type"]; for opt in options { // Verify that classify and file-type both contain indicators for symlinks. - let result = scene + scene .ucmd() .arg(format!("--indicator-style={}", opt)) .succeeds() @@ -961,7 +1264,7 @@ fn test_ls_hidden_windows() { let result = scene.ucmd().succeeds(); assert!(!result.stdout_str().contains(file)); - let result = scene.ucmd().arg("-a").succeeds().stdout_contains(file); + scene.ucmd().arg("-a").succeeds().stdout_contains(file); } #[test] @@ -1051,9 +1354,11 @@ fn test_ls_quoting_style() { at.touch("one"); // It seems that windows doesn't allow \n in filenames. + // And it also doesn't like \, of course. #[cfg(unix)] { at.touch("one\ntwo"); + at.touch("one\\two"); // Default is shell-escape scene .ucmd() @@ -1115,6 +1420,42 @@ fn test_ls_quoting_style() { .succeeds() .stdout_only(format!("{}\n", correct)); } + + for (arg, correct) in &[ + ("--quoting-style=literal", "one\\two"), + ("-N", "one\\two"), + ("--quoting-style=c", "\"one\\\\two\""), + ("-Q", "\"one\\\\two\""), + ("--quote-name", "\"one\\\\two\""), + ("--quoting-style=escape", "one\\\\two"), + ("-b", "one\\\\two"), + ("--quoting-style=shell-escape", "'one\\two'"), + ("--quoting-style=shell-escape-always", "'one\\two'"), + ("--quoting-style=shell", "'one\\two'"), + ("--quoting-style=shell-always", "'one\\two'"), + ] { + scene + .ucmd() + .arg(arg) + .arg("one\\two") + .succeeds() + .stdout_only(format!("{}\n", correct)); + } + + // Tests for a character that forces quotation in shell-style escaping + // after a character in a dollar expression + at.touch("one\n&two"); + for (arg, correct) in &[ + ("--quoting-style=shell-escape", "'one'$'\\n''&two'"), + ("--quoting-style=shell-escape-always", "'one'$'\\n''&two'"), + ] { + scene + .ucmd() + .arg(arg) + .arg("one\n&two") + .succeeds() + .stdout_only(format!("{}\n", correct)); + } } scene @@ -1314,3 +1655,357 @@ fn test_ls_ignore_hide() { .stderr_contains(&"Invalid pattern") .stdout_is("CONTRIBUTING.md\nREADME.md\nREADMECAREFULLY.md\nsome_other_file\n"); } + +#[test] +fn test_ls_ignore_backups() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.touch("somefile"); + at.touch("somebackup~"); + at.touch(".somehiddenfile"); + at.touch(".somehiddenbackup~"); + + scene.ucmd().arg("-B").succeeds().stdout_is("somefile\n"); + scene + .ucmd() + .arg("--ignore-backups") + .succeeds() + .stdout_is("somefile\n"); + + scene + .ucmd() + .arg("-aB") + .succeeds() + .stdout_contains(".somehiddenfile") + .stdout_contains("somefile") + .stdout_does_not_contain("somebackup") + .stdout_does_not_contain(".somehiddenbackup~"); + + scene + .ucmd() + .arg("-a") + .arg("--ignore-backups") + .succeeds() + .stdout_contains(".somehiddenfile") + .stdout_contains("somefile") + .stdout_does_not_contain("somebackup") + .stdout_does_not_contain(".somehiddenbackup~"); +} + +#[test] +fn test_ls_directory() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.mkdir("some_dir"); + at.symlink_dir("some_dir", "sym_dir"); + + at.touch(Path::new("some_dir").join("nested_file").to_str().unwrap()); + + scene + .ucmd() + .arg("some_dir") + .succeeds() + .stdout_is("nested_file\n"); + + scene + .ucmd() + .arg("--directory") + .arg("some_dir") + .succeeds() + .stdout_is("some_dir\n"); + + scene + .ucmd() + .arg("sym_dir") + .succeeds() + .stdout_is("nested_file\n"); +} + +#[test] +fn test_ls_deref_command_line() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.touch("some_file"); + at.symlink_file("some_file", "sym_file"); + + scene + .ucmd() + .arg("sym_file") + .succeeds() + .stdout_is("sym_file\n"); + + // -l changes the default to no dereferencing + scene + .ucmd() + .arg("-l") + .arg("sym_file") + .succeeds() + .stdout_contains("sym_file ->"); + + scene + .ucmd() + .arg("--dereference-command-line-symlink-to-dir") + .arg("sym_file") + .succeeds() + .stdout_is("sym_file\n"); + + scene + .ucmd() + .arg("-l") + .arg("--dereference-command-line-symlink-to-dir") + .arg("sym_file") + .succeeds() + .stdout_contains("sym_file ->"); + + scene + .ucmd() + .arg("--dereference-command-line") + .arg("sym_file") + .succeeds() + .stdout_is("sym_file\n"); + + let result = scene + .ucmd() + .arg("-l") + .arg("--dereference-command-line") + .arg("sym_file") + .succeeds(); + + assert!(!result.stdout_str().contains("->")); + + let result = scene.ucmd().arg("-lH").arg("sym_file").succeeds(); + + assert!(!result.stdout_str().contains("sym_file ->")); + + // If the symlink is not a command line argument, it must be shown normally + scene + .ucmd() + .arg("-l") + .arg("--dereference-command-line") + .succeeds() + .stdout_contains("sym_file ->"); +} + +#[test] +fn test_ls_deref_command_line_dir() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.mkdir("some_dir"); + at.symlink_dir("some_dir", "sym_dir"); + + at.touch(Path::new("some_dir").join("nested_file").to_str().unwrap()); + + scene + .ucmd() + .arg("sym_dir") + .succeeds() + .stdout_contains("nested_file"); + + scene + .ucmd() + .arg("-l") + .arg("sym_dir") + .succeeds() + .stdout_contains("sym_dir ->"); + + scene + .ucmd() + .arg("--dereference-command-line-symlink-to-dir") + .arg("sym_dir") + .succeeds() + .stdout_contains("nested_file"); + + scene + .ucmd() + .arg("-l") + .arg("--dereference-command-line-symlink-to-dir") + .arg("sym_dir") + .succeeds() + .stdout_contains("nested_file"); + + scene + .ucmd() + .arg("--dereference-command-line") + .arg("sym_dir") + .succeeds() + .stdout_contains("nested_file"); + + scene + .ucmd() + .arg("-l") + .arg("--dereference-command-line") + .arg("sym_dir") + .succeeds() + .stdout_contains("nested_file"); + + scene + .ucmd() + .arg("-lH") + .arg("sym_dir") + .succeeds() + .stdout_contains("nested_file"); + + // If the symlink is not a command line argument, it must be shown normally + scene + .ucmd() + .arg("-l") + .arg("--dereference-command-line") + .succeeds() + .stdout_contains("sym_dir ->"); + + scene + .ucmd() + .arg("-lH") + .succeeds() + .stdout_contains("sym_dir ->"); + + scene + .ucmd() + .arg("-l") + .arg("--dereference-command-line-symlink-to-dir") + .succeeds() + .stdout_contains("sym_dir ->"); + + // --directory does not dereference anything by default + scene + .ucmd() + .arg("-l") + .arg("--directory") + .arg("sym_dir") + .succeeds() + .stdout_contains("sym_dir ->"); + + let result = scene + .ucmd() + .arg("-l") + .arg("--directory") + .arg("--dereference-command-line-symlink-to-dir") + .arg("sym_dir") + .succeeds(); + + assert!(!result.stdout_str().ends_with("sym_dir")); + + // --classify does not dereference anything by default + scene + .ucmd() + .arg("-l") + .arg("--directory") + .arg("sym_dir") + .succeeds() + .stdout_contains("sym_dir ->"); + + let result = scene + .ucmd() + .arg("-l") + .arg("--directory") + .arg("--dereference-command-line-symlink-to-dir") + .arg("sym_dir") + .succeeds(); + + assert!(!result.stdout_str().ends_with("sym_dir")); +} + +#[test] +fn test_ls_sort_extension() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + for filename in &[ + "file1", + "file2", + "anotherFile", + ".hidden", + ".file.1", + ".file.2", + "file.1", + "file.2", + "anotherFile.1", + "anotherFile.2", + "file.ext", + "file.debug", + "anotherFile.ext", + "anotherFile.debug", + ] { + at.touch(filename); + } + + let expected = vec![ + ".", + "..", + ".hidden", + "anotherFile", + "file1", + "file2", + ".file.1", + "anotherFile.1", + "file.1", + ".file.2", + "anotherFile.2", + "file.2", + "anotherFile.debug", + "file.debug", + "anotherFile.ext", + "file.ext", + "", // because of '\n' at the end of the output + ]; + + let result = scene.ucmd().arg("-1aX").run(); + assert_eq!( + result.stdout_str().split('\n').collect::>(), + expected, + ); + + let result = scene.ucmd().arg("-1a").arg("--sort=extension").run(); + assert_eq!( + result.stdout_str().split('\n').collect::>(), + expected, + ); +} + +#[test] +fn test_ls_path() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let file1 = "file1"; + let file2 = "file2"; + let dir = "dir"; + let path = &format!("{}/{}", dir, file2); + + at.mkdir(dir); + at.touch(file1); + at.touch(path); + + let expected_stdout = &format!("{}\n", path); + scene.ucmd().arg(path).run().stdout_is(expected_stdout); + + let expected_stdout = &format!("./{}\n", path); + scene + .ucmd() + .arg(format!("./{}", path)) + .run() + .stdout_is(expected_stdout); + + let abs_path = format!("{}/{}", at.as_string(), path); + let expected_stdout = if cfg!(windows) { + format!("\'{}\'\n", abs_path) + } else { + format!("{}\n", abs_path) + }; + scene.ucmd().arg(&abs_path).run().stdout_is(expected_stdout); + + let expected_stdout = if cfg!(windows) { + format!("{} {}\n", path, file1) + } else { + format!("{}\n{}\n", path, file1) + }; + scene + .ucmd() + .arg(file1) + .arg(path) + .run() + .stdout_is(expected_stdout); +} diff --git a/tests/by-util/test_mkfifo.rs b/tests/by-util/test_mkfifo.rs index f60c0a4b8..318a2ea5d 100644 --- a/tests/by-util/test_mkfifo.rs +++ b/tests/by-util/test_mkfifo.rs @@ -2,9 +2,7 @@ use crate::common::util::*; #[test] fn test_create_fifo_missing_operand() { - new_ucmd!() - .fails() - .stderr_is("mkfifo: error: missing operand"); + new_ucmd!().fails().stderr_is("mkfifo: missing operand"); } #[test] @@ -19,8 +17,7 @@ fn test_create_one_fifo_with_invalid_mode() { .arg("-m") .arg("invalid") .fails() - .stderr - .contains("invalid mode"); + .stderr_contains("invalid mode"); } #[test] @@ -44,5 +41,5 @@ fn test_create_one_fifo_already_exists() { .arg("abcdef") .arg("abcdef") .fails() - .stderr_is("mkfifo: error: cannot create fifo 'abcdef': File exists"); + .stderr_is("mkfifo: cannot create fifo 'abcdef': File exists"); } diff --git a/tests/by-util/test_mknod.rs b/tests/by-util/test_mknod.rs index 651491045..1d39372ac 100644 --- a/tests/by-util/test_mknod.rs +++ b/tests/by-util/test_mknod.rs @@ -1 +1,124 @@ -// ToDO: add tests +use crate::common::util::*; + +#[cfg(not(windows))] +#[test] +fn test_mknod_help() { + new_ucmd!() + .arg("--help") + .succeeds() + .no_stderr() + .stdout_contains("USAGE:"); +} + +#[test] +#[cfg(not(windows))] +fn test_mknod_version() { + assert!(new_ucmd!() + .arg("--version") + .succeeds() + .no_stderr() + .stdout_str() + .starts_with("mknod")); +} + +#[test] +#[cfg(not(windows))] +fn test_mknod_fifo_default_writable() { + let ts = TestScenario::new(util_name!()); + ts.ucmd().arg("test_file").arg("p").succeeds(); + assert!(ts.fixtures.is_fifo("test_file")); + assert!(!ts.fixtures.metadata("test_file").permissions().readonly()); +} + +#[test] +#[cfg(not(windows))] +fn test_mknod_fifo_mnemonic_usage() { + let ts = TestScenario::new(util_name!()); + ts.ucmd().arg("test_file").arg("pipe").succeeds(); + assert!(ts.fixtures.is_fifo("test_file")); +} + +#[test] +#[cfg(not(windows))] +fn test_mknod_fifo_read_only() { + let ts = TestScenario::new(util_name!()); + ts.ucmd() + .arg("-m") + .arg("a=r") + .arg("test_file") + .arg("p") + .succeeds(); + assert!(ts.fixtures.is_fifo("test_file")); + assert!(ts.fixtures.metadata("test_file").permissions().readonly()); +} + +#[test] +#[cfg(not(windows))] +fn test_mknod_fifo_invalid_extra_operand() { + new_ucmd!() + .arg("test_file") + .arg("p") + .arg("1") + .arg("2") + .fails() + .stderr_contains(&"Fifos do not have major and minor device numbers"); +} + +#[test] +#[cfg(not(windows))] +fn test_mknod_character_device_requires_major_and_minor() { + new_ucmd!() + .arg("test_file") + .arg("c") + .fails() + .status_code(1) + .stderr_contains(&"Special files require major and minor device numbers."); + new_ucmd!() + .arg("test_file") + .arg("c") + .arg("1") + .fails() + .status_code(1) + .stderr_contains(&"Special files require major and minor device numbers."); + new_ucmd!() + .arg("test_file") + .arg("c") + .arg("1") + .arg("c") + .fails() + .status_code(1) + .stderr_contains(&"Invalid value for ''"); + new_ucmd!() + .arg("test_file") + .arg("c") + .arg("c") + .arg("1") + .fails() + .status_code(1) + .stderr_contains(&"Invalid value for ''"); +} + +#[test] +#[cfg(not(windows))] +fn test_mknod_invalid_arg() { + new_ucmd!() + .arg("--foo") + .fails() + .status_code(1) + .no_stdout() + .stderr_contains(&"Found argument '--foo' which wasn't expected"); +} + +#[test] +#[cfg(not(windows))] +fn test_mknod_invalid_mode() { + new_ucmd!() + .arg("--mode") + .arg("rw") + .arg("test_file") + .arg("p") + .fails() + .no_stdout() + .status_code(1) + .stderr_contains(&"invalid mode"); +} diff --git a/tests/by-util/test_mktemp.rs b/tests/by-util/test_mktemp.rs index 2639a2c2f..617f0fd06 100644 --- a/tests/by-util/test_mktemp.rs +++ b/tests/by-util/test_mktemp.rs @@ -113,17 +113,14 @@ fn test_mktemp_mktemp_t() { .arg("-t") .arg(TEST_TEMPLATE7) .succeeds(); - let result = scene + scene .ucmd() .env(TMPDIR, &pathname) .arg("-t") .arg(TEST_TEMPLATE8) - .fails(); - println!("stdout {}", result.stdout); - println!("stderr {}", result.stderr); - assert!(result - .stderr - .contains("error: suffix cannot contain any path separators")); + .fails() + .no_stdout() + .stderr_contains("suffix cannot contain any path separators"); } #[test] @@ -391,10 +388,8 @@ fn test_mktemp_tmpdir_one_arg() { .arg("--tmpdir") .arg("apt-key-gpghome.XXXXXXXXXX") .succeeds(); - println!("stdout {}", result.stdout); - println!("stderr {}", result.stderr); - assert!(result.stdout.contains("apt-key-gpghome.")); - assert!(PathBuf::from(result.stdout.trim()).is_file()); + result.no_stderr().stdout_contains("apt-key-gpghome."); + assert!(PathBuf::from(result.stdout_str().trim()).is_file()); } #[test] @@ -407,8 +402,6 @@ fn test_mktemp_directory_tmpdir() { .arg("--tmpdir") .arg("apt-key-gpghome.XXXXXXXXXX") .succeeds(); - println!("stdout {}", result.stdout); - println!("stderr {}", result.stderr); - assert!(result.stdout.contains("apt-key-gpghome.")); - assert!(PathBuf::from(result.stdout.trim()).is_dir()); + result.no_stderr().stdout_contains("apt-key-gpghome."); + assert!(PathBuf::from(result.stdout_str().trim()).is_dir()); } diff --git a/tests/by-util/test_more.rs b/tests/by-util/test_more.rs index 736fb6956..9245733ca 100644 --- a/tests/by-util/test_more.rs +++ b/tests/by-util/test_more.rs @@ -2,18 +2,15 @@ use crate::common::util::*; #[test] fn test_more_no_arg() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.run(); - assert!(!result.success); + // stderr = more: Reading from stdin isn't supported yet. + new_ucmd!().fails(); } #[test] fn test_more_dir_arg() { - let (_, mut ucmd) = at_and_ucmd!(); - ucmd.arg("."); - let result = ucmd.run(); - assert!(!result.success); + let result = new_ucmd!().arg(".").run(); + result.failure(); const EXPECTED_ERROR_MESSAGE: &str = "more: '.' is a directory.\nTry 'more --help' for more information."; - assert_eq!(result.stderr.trim(), EXPECTED_ERROR_MESSAGE); + assert_eq!(result.stderr_str().trim(), EXPECTED_ERROR_MESSAGE); } diff --git a/tests/by-util/test_mv.rs b/tests/by-util/test_mv.rs index 0caeb1ef1..e0bdd9ef3 100644 --- a/tests/by-util/test_mv.rs +++ b/tests/by-util/test_mv.rs @@ -251,6 +251,40 @@ fn test_mv_simple_backup() { assert!(at.file_exists(&format!("{}~", file_b))); } +#[test] +fn test_mv_simple_backup_with_file_extension() { + let (at, mut ucmd) = at_and_ucmd!(); + let file_a = "test_mv_simple_backup_file_a.txt"; + let file_b = "test_mv_simple_backup_file_b.txt"; + + at.touch(file_a); + at.touch(file_b); + ucmd.arg("-b") + .arg(file_a) + .arg(file_b) + .succeeds() + .no_stderr(); + + assert!(!at.file_exists(file_a)); + assert!(at.file_exists(file_b)); + assert!(at.file_exists(&format!("{}~", file_b))); +} + +#[test] +fn test_mv_arg_backup_arg_first() { + let (at, mut ucmd) = at_and_ucmd!(); + let file_a = "test_mv_simple_backup_file_a"; + let file_b = "test_mv_simple_backup_file_b"; + + at.touch(file_a); + at.touch(file_b); + ucmd.arg("--backup").arg(file_a).arg(file_b).succeeds(); + + assert!(!at.file_exists(file_a)); + assert!(at.file_exists(file_b)); + assert!(at.file_exists(&format!("{}~", file_b))); +} + #[test] fn test_mv_custom_backup_suffix() { let (at, mut ucmd) = at_and_ucmd!(); @@ -293,7 +327,7 @@ fn test_mv_custom_backup_suffix_via_env() { } #[test] -fn test_mv_backup_numbering() { +fn test_mv_backup_numbered_with_t() { let (at, mut ucmd) = at_and_ucmd!(); let file_a = "test_mv_backup_numbering_file_a"; let file_b = "test_mv_backup_numbering_file_b"; @@ -311,6 +345,25 @@ fn test_mv_backup_numbering() { assert!(at.file_exists(&format!("{}.~1~", file_b))); } +#[test] +fn test_mv_backup_numbered() { + let (at, mut ucmd) = at_and_ucmd!(); + let file_a = "test_mv_backup_numbering_file_a"; + let file_b = "test_mv_backup_numbering_file_b"; + + at.touch(file_a); + at.touch(file_b); + ucmd.arg("--backup=numbered") + .arg(file_a) + .arg(file_b) + .succeeds() + .no_stderr(); + + assert!(!at.file_exists(file_a)); + assert!(at.file_exists(file_b)); + assert!(at.file_exists(&format!("{}.~1~", file_b))); +} + #[test] fn test_mv_backup_existing() { let (at, mut ucmd) = at_and_ucmd!(); @@ -330,6 +383,67 @@ fn test_mv_backup_existing() { assert!(at.file_exists(&format!("{}~", file_b))); } +#[test] +fn test_mv_backup_nil() { + let (at, mut ucmd) = at_and_ucmd!(); + let file_a = "test_mv_backup_numbering_file_a"; + let file_b = "test_mv_backup_numbering_file_b"; + + at.touch(file_a); + at.touch(file_b); + ucmd.arg("--backup=nil") + .arg(file_a) + .arg(file_b) + .succeeds() + .no_stderr(); + + assert!(!at.file_exists(file_a)); + assert!(at.file_exists(file_b)); + assert!(at.file_exists(&format!("{}~", file_b))); +} + +#[test] +fn test_mv_numbered_if_existing_backup_existing() { + let (at, mut ucmd) = at_and_ucmd!(); + let file_a = "test_mv_backup_numbering_file_a"; + let file_b = "test_mv_backup_numbering_file_b"; + let file_b_backup = "test_mv_backup_numbering_file_b.~1~"; + + at.touch(file_a); + at.touch(file_b); + at.touch(file_b_backup); + ucmd.arg("--backup=existing") + .arg(file_a) + .arg(file_b) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(file_b)); + assert!(at.file_exists(file_b_backup)); + assert!(at.file_exists(&*format!("{}.~2~", file_b))); +} + +#[test] +fn test_mv_numbered_if_existing_backup_nil() { + let (at, mut ucmd) = at_and_ucmd!(); + let file_a = "test_mv_backup_numbering_file_a"; + let file_b = "test_mv_backup_numbering_file_b"; + let file_b_backup = "test_mv_backup_numbering_file_b.~1~"; + + at.touch(file_a); + at.touch(file_b); + at.touch(file_b_backup); + ucmd.arg("--backup=nil") + .arg(file_a) + .arg(file_b) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(file_b)); + assert!(at.file_exists(file_b_backup)); + assert!(at.file_exists(&*format!("{}.~2~", file_b))); +} + #[test] fn test_mv_backup_simple() { let (at, mut ucmd) = at_and_ucmd!(); @@ -349,6 +463,25 @@ fn test_mv_backup_simple() { assert!(at.file_exists(&format!("{}~", file_b))); } +#[test] +fn test_mv_backup_never() { + let (at, mut ucmd) = at_and_ucmd!(); + let file_a = "test_mv_backup_numbering_file_a"; + let file_b = "test_mv_backup_numbering_file_b"; + + at.touch(file_a); + at.touch(file_b); + ucmd.arg("--backup=never") + .arg(file_a) + .arg(file_b) + .succeeds() + .no_stderr(); + + assert!(!at.file_exists(file_a)); + assert!(at.file_exists(file_b)); + assert!(at.file_exists(&format!("{}~", file_b))); +} + #[test] fn test_mv_backup_none() { let (at, mut ucmd) = at_and_ucmd!(); @@ -369,17 +502,14 @@ fn test_mv_backup_none() { } #[test] -fn test_mv_existing_backup() { +fn test_mv_backup_off() { let (at, mut ucmd) = at_and_ucmd!(); - let file_a = "test_mv_existing_backup_file_a"; - let file_b = "test_mv_existing_backup_file_b"; - let file_b_backup = "test_mv_existing_backup_file_b.~1~"; - let resulting_backup = "test_mv_existing_backup_file_b.~2~"; + let file_a = "test_mv_backup_numbering_file_a"; + let file_b = "test_mv_backup_numbering_file_b"; at.touch(file_a); at.touch(file_b); - at.touch(file_b_backup); - ucmd.arg("--backup=nil") + ucmd.arg("--backup=off") .arg(file_a) .arg(file_b) .succeeds() @@ -387,8 +517,19 @@ fn test_mv_existing_backup() { assert!(!at.file_exists(file_a)); assert!(at.file_exists(file_b)); - assert!(at.file_exists(file_b_backup)); - assert!(at.file_exists(resulting_backup)); + assert!(!at.file_exists(&format!("{}~", file_b))); +} + +#[test] +fn test_mv_backup_no_clobber_conflicting_options() { + let (_, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup") + .arg("--no-clobber") + .arg("file1") + .arg("file2") + .fails() + .stderr_is("mv: options --backup and --no-clobber are mutually exclusive\nTry 'mv --help' for more information."); } #[test] @@ -472,20 +613,13 @@ fn test_mv_overwrite_nonempty_dir() { at.touch(dummy); // Not same error as GNU; the error message is a rust builtin // TODO: test (and implement) correct error message (or at least decide whether to do so) - // Current: "mv: error: couldn't rename path (Directory not empty; from=a; to=b)" + // Current: "mv: couldn't rename path (Directory not empty; from=a; to=b)" // GNU: "mv: cannot move ‘a’ to ‘b’: Directory not empty" // Verbose output for the move should not be shown on failure - assert!( - ucmd.arg("-vT") - .arg(dir_a) - .arg(dir_b) - .fails() - .no_stdout() - .stderr - .len() - > 0 - ); + let result = ucmd.arg("-vT").arg(dir_a).arg(dir_b).fails(); + result.no_stdout(); + assert!(!result.stderr_str().is_empty()); assert!(at.dir_exists(dir_a)); assert!(at.dir_exists(dir_b)); @@ -526,15 +660,15 @@ fn test_mv_errors() { // $ mv -T -t a b // mv: cannot combine --target-directory (-t) and --no-target-directory (-T) - let result = scene + scene .ucmd() .arg("-T") .arg("-t") .arg(dir) .arg(file_a) .arg(file_b) - .fails(); - assert!(result.stderr.contains("cannot be used with")); + .fails() + .stderr_contains("cannot be used with"); // $ at.touch file && at.mkdir dir // $ mv -T file dir @@ -546,14 +680,20 @@ fn test_mv_errors() { .arg(dir) .fails() .stderr_is(format!( - "mv: error: cannot overwrite directory ‘{}’ with non-directory\n", + "mv: cannot overwrite directory ‘{}’ with non-directory\n", dir )); // $ at.mkdir dir && at.touch file // $ mv dir file // err == mv: cannot overwrite non-directory ‘file’ with directory ‘dir’ - assert!(scene.ucmd().arg(dir).arg(file_a).fails().stderr.len() > 0); + assert!(!scene + .ucmd() + .arg(dir) + .arg(file_a) + .fails() + .stderr_str() + .is_empty()); } #[test] @@ -588,6 +728,24 @@ fn test_mv_verbose() { )); } +#[test] +fn test_mv_permission_error() { + let scene = TestScenario::new("mkdir"); + let folder1 = "bar"; + let folder2 = "foo"; + let folder_to_move = "bar/foo"; + scene.ucmd().arg("-m444").arg(folder1).succeeds(); + scene.ucmd().arg("-m777").arg(folder2).succeeds(); + + scene + .cmd_keepenv(util_name!()) + .arg(folder2) + .arg(folder_to_move) + .run() + .stderr_str() + .ends_with("Permission denied"); +} + // Todo: // $ at.touch a b diff --git a/tests/by-util/test_nice.rs b/tests/by-util/test_nice.rs index 7e704fc00..9e004b98b 100644 --- a/tests/by-util/test_nice.rs +++ b/tests/by-util/test_nice.rs @@ -16,7 +16,7 @@ fn test_negative_adjustment() { let res = new_ucmd!().args(&["-n", "-1", "true"]).run(); assert!(res - .stderr + .stderr_str() .starts_with("nice: warning: setpriority: Permission denied")); } @@ -25,7 +25,7 @@ fn test_adjustment_with_no_command_should_error() { new_ucmd!() .args(&["-n", "19"]) .run() - .stderr_is("nice: error: A command must be given with an adjustment.\nTry \"nice --help\" for more information.\n"); + .stderr_is("nice: A command must be given with an adjustment.\nTry \"nice --help\" for more information.\n"); } #[test] diff --git a/tests/by-util/test_nproc.rs b/tests/by-util/test_nproc.rs index 055b4890d..abf758829 100644 --- a/tests/by-util/test_nproc.rs +++ b/tests/by-util/test_nproc.rs @@ -2,54 +2,46 @@ use crate::common::util::*; #[test] fn test_nproc() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.run(); - assert!(result.success); - let nproc: u8 = result.stdout.trim().parse().unwrap(); + let nproc: u8 = new_ucmd!().succeeds().stdout_str().trim().parse().unwrap(); assert!(nproc > 0); } #[test] fn test_nproc_all_omp() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("--all").run(); - assert!(result.success); - let nproc: u8 = result.stdout.trim().parse().unwrap(); + let result = new_ucmd!().arg("--all").succeeds(); + + let nproc: u8 = result.stdout_str().trim().parse().unwrap(); assert!(nproc > 0); let result = TestScenario::new(util_name!()) .ucmd_keepenv() .env("OMP_NUM_THREADS", "1") - .run(); - assert!(result.success); - let nproc_omp: u8 = result.stdout.trim().parse().unwrap(); + .succeeds(); + + let nproc_omp: u8 = result.stdout_str().trim().parse().unwrap(); assert!(nproc - 1 == nproc_omp); let result = TestScenario::new(util_name!()) .ucmd_keepenv() .env("OMP_NUM_THREADS", "1") // Has no effect .arg("--all") - .run(); - assert!(result.success); - let nproc_omp: u8 = result.stdout.trim().parse().unwrap(); + .succeeds(); + let nproc_omp: u8 = result.stdout_str().trim().parse().unwrap(); assert!(nproc == nproc_omp); } #[test] fn test_nproc_ignore() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.run(); - assert!(result.success); - let nproc: u8 = result.stdout.trim().parse().unwrap(); + let result = new_ucmd!().succeeds(); + let nproc: u8 = result.stdout_str().trim().parse().unwrap(); if nproc > 1 { // Ignore all CPU but one let result = TestScenario::new(util_name!()) .ucmd_keepenv() .arg("--ignore") .arg((nproc - 1).to_string()) - .run(); - assert!(result.success); - let nproc: u8 = result.stdout.trim().parse().unwrap(); + .succeeds(); + let nproc: u8 = result.stdout_str().trim().parse().unwrap(); assert!(nproc == 1); } } diff --git a/tests/by-util/test_numfmt.rs b/tests/by-util/test_numfmt.rs index 64fc5360d..b52dbc359 100644 --- a/tests/by-util/test_numfmt.rs +++ b/tests/by-util/test_numfmt.rs @@ -281,6 +281,7 @@ fn test_leading_whitespace_in_free_argument_should_imply_padding() { } #[test] +#[ignore] fn test_should_calculate_implicit_padding_per_free_argument() { new_ucmd!() .args(&["--from=auto", " 1Ki", " 2K"]) diff --git a/tests/by-util/test_pinky.rs b/tests/by-util/test_pinky.rs index c8e8334ab..ccabb7345 100644 --- a/tests/by-util/test_pinky.rs +++ b/tests/by-util/test_pinky.rs @@ -20,64 +20,92 @@ fn test_long_format() { let ulogin = "root"; let pw: Passwd = Passwd::locate(ulogin).unwrap(); let real_name = pw.user_info().replace("&", &pw.name().capitalize()); - new_ucmd!().arg("-l").arg(ulogin).run().stdout_is(format!( - "Login name: {:<28}In real life: {}\nDirectory: {:<29}Shell: {}\n\n", - ulogin, - real_name, - pw.user_dir(), - pw.user_shell() - )); + new_ucmd!() + .arg("-l") + .arg(ulogin) + .succeeds() + .stdout_is(format!( + "Login name: {:<28}In real life: {}\nDirectory: {:<29}Shell: {}\n\n", + ulogin, + real_name, + pw.user_dir(), + pw.user_shell() + )); - new_ucmd!().arg("-lb").arg(ulogin).run().stdout_is(format!( - "Login name: {:<28}In real life: {1}\n\n", - ulogin, real_name - )); + new_ucmd!() + .arg("-lb") + .arg(ulogin) + .succeeds() + .stdout_is(format!( + "Login name: {:<28}In real life: {1}\n\n", + ulogin, real_name + )); } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] +#[test] +fn test_long_format_multiple_users() { + let args = ["-l", "root", "root", "root"]; + + new_ucmd!() + .args(&args) + .succeeds() + .stdout_is(expected_result(&args)); +} + +#[test] +fn test_long_format_wo_user() { + // "no username specified; at least one must be specified when using -l" + new_ucmd!().arg("-l").fails().code_is(1); +} + +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_short_format_i() { // allow whitespace variation // * minor whitespace differences occur between platform built-in outputs; specifically, the number of trailing TABs may be variant let args = ["-i"]; - let actual = TestScenario::new(util_name!()) - .ucmd() - .args(&args) - .run() - .stdout; + let actual = new_ucmd!().args(&args).succeeds().stdout_move_str(); let expect = expected_result(&args); - println!("actual: {:?}", actual); - println!("expect: {:?}", expect); let v_actual: Vec<&str> = actual.split_whitespace().collect(); let v_expect: Vec<&str> = expect.split_whitespace().collect(); assert_eq!(v_actual, v_expect); } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_short_format_q() { // allow whitespace variation // * minor whitespace differences occur between platform built-in outputs; specifically, the number of trailing TABs may be variant let args = ["-q"]; - let actual = TestScenario::new(util_name!()) - .ucmd() - .args(&args) - .run() - .stdout; + let actual = new_ucmd!().args(&args).succeeds().stdout_move_str(); let expect = expected_result(&args); - println!("actual: {:?}", actual); - println!("expect: {:?}", expect); let v_actual: Vec<&str> = actual.split_whitespace().collect(); let v_expect: Vec<&str> = expect.split_whitespace().collect(); assert_eq!(v_actual, v_expect); } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] +#[test] +fn test_no_flag() { + let actual = new_ucmd!().succeeds().stdout_move_str(); + let expect = expected_result(&[]); + let v_actual: Vec<&str> = actual.split_whitespace().collect(); + let v_expect: Vec<&str> = expect.split_whitespace().collect(); + assert_eq!(v_actual, v_expect); +} + +#[cfg(any(target_vendor = "apple", target_os = "linux"))] fn expected_result(args: &[&str]) -> String { - TestScenario::new(util_name!()) - .cmd_keepenv(util_name!()) + #[cfg(target_os = "linux")] + let util_name = util_name!(); + #[cfg(target_vendor = "apple")] + let util_name = format!("g{}", util_name!()); + + TestScenario::new(&util_name) + .cmd_keepenv(util_name) .env("LANGUAGE", "C") .args(args) - .run() - .stdout + .succeeds() + .stdout_move_str() } diff --git a/tests/by-util/test_printenv.rs b/tests/by-util/test_printenv.rs index 9d90051ea..bc0bc0f3c 100644 --- a/tests/by-util/test_printenv.rs +++ b/tests/by-util/test_printenv.rs @@ -7,10 +7,11 @@ fn test_get_all() { env::set_var(key, "VALUE"); assert_eq!(env::var(key), Ok("VALUE".to_string())); - let result = TestScenario::new(util_name!()).ucmd_keepenv().run(); - assert!(result.success); - assert!(result.stdout.contains("HOME=")); - assert!(result.stdout.contains("KEY=VALUE")); + TestScenario::new(util_name!()) + .ucmd_keepenv() + .succeeds() + .stdout_contains("HOME=") + .stdout_contains("KEY=VALUE"); } #[test] @@ -22,9 +23,8 @@ fn test_get_var() { let result = TestScenario::new(util_name!()) .ucmd_keepenv() .arg("KEY") - .run(); + .succeeds(); - assert!(result.success); - assert!(!result.stdout.is_empty()); - assert!(result.stdout.trim() == "VALUE"); + assert!(!result.stdout_str().is_empty()); + assert!(result.stdout_str().trim() == "VALUE"); } diff --git a/tests/by-util/test_readlink.rs b/tests/by-util/test_readlink.rs index 84747b24c..cae5eafee 100644 --- a/tests/by-util/test_readlink.rs +++ b/tests/by-util/test_readlink.rs @@ -5,7 +5,7 @@ static GIBBERISH: &'static str = "supercalifragilisticexpialidocious"; #[test] fn test_canonicalize() { let (at, mut ucmd) = at_and_ucmd!(); - let actual = ucmd.arg("-f").arg(".").run().stdout; + let actual = ucmd.arg("-f").arg(".").run().stdout_move_str(); let expect = at.root_dir_resolved() + "\n"; println!("actual: {:?}", actual); println!("expect: {:?}", expect); @@ -15,7 +15,7 @@ fn test_canonicalize() { #[test] fn test_canonicalize_existing() { let (at, mut ucmd) = at_and_ucmd!(); - let actual = ucmd.arg("-e").arg(".").run().stdout; + let actual = ucmd.arg("-e").arg(".").run().stdout_move_str(); let expect = at.root_dir_resolved() + "\n"; println!("actual: {:?}", actual); println!("expect: {:?}", expect); @@ -25,7 +25,7 @@ fn test_canonicalize_existing() { #[test] fn test_canonicalize_missing() { let (at, mut ucmd) = at_and_ucmd!(); - let actual = ucmd.arg("-m").arg(GIBBERISH).run().stdout; + let actual = ucmd.arg("-m").arg(GIBBERISH).run().stdout_move_str(); let expect = path_concat!(at.root_dir_resolved(), GIBBERISH) + "\n"; println!("actual: {:?}", actual); println!("expect: {:?}", expect); @@ -37,7 +37,7 @@ fn test_long_redirection_to_current_dir() { let (at, mut ucmd) = at_and_ucmd!(); // Create a 256-character path to current directory let dir = path_concat!(".", ..128); - let actual = ucmd.arg("-n").arg("-m").arg(dir).run().stdout; + let actual = ucmd.arg("-n").arg("-m").arg(dir).run().stdout_move_str(); let expect = at.root_dir_resolved(); println!("actual: {:?}", actual); println!("expect: {:?}", expect); @@ -48,7 +48,12 @@ fn test_long_redirection_to_current_dir() { fn test_long_redirection_to_root() { // Create a 255-character path to root let dir = path_concat!("..", ..85); - let actual = new_ucmd!().arg("-n").arg("-m").arg(dir).run().stdout; + let actual = new_ucmd!() + .arg("-n") + .arg("-m") + .arg(dir) + .run() + .stdout_move_str(); let expect = get_root_path(); println!("actual: {:?}", actual); println!("expect: {:?}", expect); diff --git a/tests/by-util/test_relpath.rs b/tests/by-util/test_relpath.rs index cc17b45c3..70d9f2a5d 100644 --- a/tests/by-util/test_relpath.rs +++ b/tests/by-util/test_relpath.rs @@ -103,7 +103,7 @@ fn test_relpath_with_from_with_d() { at.mkdir_all(from); // d is part of subpath -> expect relative path - let mut result_stdout = scene + let mut _result_stdout = scene .ucmd() .arg(to) .arg(from) @@ -112,17 +112,17 @@ fn test_relpath_with_from_with_d() { .stdout_move_str(); // relax rules for windows test environment #[cfg(not(windows))] - assert!(Path::new(&result_stdout).is_relative()); + assert!(Path::new(&_result_stdout).is_relative()); // d is not part of subpath -> expect absolut path - result_stdout = scene + _result_stdout = scene .ucmd() .arg(to) .arg(from) .arg("-dnon_existing") .succeeds() .stdout_move_str(); - assert!(Path::new(&result_stdout).is_absolute()); + assert!(Path::new(&_result_stdout).is_absolute()); } } @@ -135,12 +135,12 @@ fn test_relpath_no_from_no_d() { let to: &str = &convert_path(test.to); at.mkdir_all(to); - let result_stdout = scene.ucmd().arg(to).succeeds().stdout_move_str(); + let _result_stdout = scene.ucmd().arg(to).succeeds().stdout_move_str(); #[cfg(not(windows))] - assert_eq!(result_stdout, format!("{}\n", to)); + assert_eq!(_result_stdout, format!("{}\n", to)); // relax rules for windows test environment #[cfg(windows)] - assert!(result_stdout.ends_with(&format!("{}\n", to))); + assert!(_result_stdout.ends_with(&format!("{}\n", to))); } } @@ -155,7 +155,7 @@ fn test_relpath_no_from_with_d() { at.mkdir_all(to); // d is part of subpath -> expect relative path - let mut result_stdout = scene + let _result_stdout = scene .ucmd() .arg(to) .arg(&format!("-d{}", pwd)) @@ -163,10 +163,10 @@ fn test_relpath_no_from_with_d() { .stdout_move_str(); // relax rules for windows test environment #[cfg(not(windows))] - assert!(Path::new(&result_stdout).is_relative()); + assert!(Path::new(&_result_stdout).is_relative()); // d is not part of subpath -> expect absolut path - result_stdout = scene + let result_stdout = scene .ucmd() .arg(to) .arg("-dnon_existing") diff --git a/tests/by-util/test_rm.rs b/tests/by-util/test_rm.rs index 9a068887c..2a87038d5 100644 --- a/tests/by-util/test_rm.rs +++ b/tests/by-util/test_rm.rs @@ -258,7 +258,7 @@ fn test_rm_no_operand() { let mut ucmd = new_ucmd!(); ucmd.fails() - .stderr_is("rm: error: missing an argument\nrm: error: for help, try 'rm --help'\n"); + .stderr_is("rm: missing an argument\nrm: for help, try 'rm --help'\n"); } #[test] diff --git a/tests/by-util/test_rmdir.rs b/tests/by-util/test_rmdir.rs index 34531cf22..eef2d50f5 100644 --- a/tests/by-util/test_rmdir.rs +++ b/tests/by-util/test_rmdir.rs @@ -39,7 +39,7 @@ fn test_rmdir_nonempty_directory_no_parents() { assert!(at.file_exists(file)); ucmd.arg(dir).fails().stderr_is( - "rmdir: error: failed to remove 'test_rmdir_nonempty_no_parents': Directory not \ + "rmdir: failed to remove 'test_rmdir_nonempty_no_parents': Directory not \ empty\n", ); @@ -59,9 +59,9 @@ fn test_rmdir_nonempty_directory_with_parents() { assert!(at.file_exists(file)); ucmd.arg("-p").arg(dir).fails().stderr_is( - "rmdir: error: failed to remove 'test_rmdir_nonempty/with/parents': Directory not \ - empty\nrmdir: error: failed to remove 'test_rmdir_nonempty/with': Directory not \ - empty\nrmdir: error: failed to remove 'test_rmdir_nonempty': Directory not \ + "rmdir: failed to remove 'test_rmdir_nonempty/with/parents': Directory not \ + empty\nrmdir: failed to remove 'test_rmdir_nonempty/with': Directory not \ + empty\nrmdir: failed to remove 'test_rmdir_nonempty': Directory not \ empty\n", ); diff --git a/tests/by-util/test_shred.rs b/tests/by-util/test_shred.rs index 651491045..b29b9bfec 100644 --- a/tests/by-util/test_shred.rs +++ b/tests/by-util/test_shred.rs @@ -1 +1,49 @@ -// ToDO: add tests +use crate::common::util::*; + +#[test] +fn test_shred_remove() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let file_a = "test_shred_remove_a"; + let file_b = "test_shred_remove_b"; + + // Create file_a and file_b. + at.touch(file_a); + at.touch(file_b); + + // Shred file_a. + scene.ucmd().arg("-u").arg(file_a).run(); + + // file_a was deleted, file_b exists. + assert!(!at.file_exists(file_a)); + assert!(at.file_exists(file_b)); +} + +#[cfg(not(target_os = "freebsd"))] +#[test] +fn test_shred_force() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let file = "test_shred_force"; + + // Create file_a. + at.touch(file); + assert!(at.file_exists(file)); + + // Make file_a readonly. + at.set_readonly(file); + + // Try shred -u. + scene.ucmd().arg("-u").arg(file).run(); + + // file_a was not deleted because it is readonly. + assert!(at.file_exists(file)); + + // Try shred -u -f. + scene.ucmd().arg("-u").arg("-f").arg(file).run(); + + // file_a was deleted. + assert!(!at.file_exists(file)); +} diff --git a/tests/by-util/test_shuf.rs b/tests/by-util/test_shuf.rs index 717971bd4..f925f8357 100644 --- a/tests/by-util/test_shuf.rs +++ b/tests/by-util/test_shuf.rs @@ -9,35 +9,28 @@ fn test_output_is_random_permutation() { .collect::>() .join("\n"); - let result = new_ucmd!() - .pipe_in(input.as_bytes()) - .succeeds() - .no_stderr() - .stdout - .clone(); + let result = new_ucmd!().pipe_in(input.as_bytes()).succeeds(); + result.no_stderr(); let mut result_seq: Vec = result + .stdout_str() .split("\n") .filter(|x| !x.is_empty()) .map(|x| x.parse().unwrap()) .collect(); result_seq.sort(); - assert_ne!(result, input, "Output is not randomised"); + assert_ne!(result.stdout_str(), input, "Output is not randomised"); assert_eq!(result_seq, input_seq, "Output is not a permutation"); } #[test] fn test_zero_termination() { let input_seq = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - let result = new_ucmd!() - .arg("-z") - .arg("-i1-10") - .succeeds() - .no_stderr() - .stdout - .clone(); + let result = new_ucmd!().arg("-z").arg("-i1-10").succeeds(); + result.no_stderr(); let mut result_seq: Vec = result + .stdout_str() .split("\0") .filter(|x| !x.is_empty()) .map(|x| x.parse().unwrap()) @@ -57,12 +50,11 @@ fn test_echo() { .map(|x| x.to_string()) .collect::>(), ) - .succeeds() - .no_stderr() - .stdout - .clone(); + .succeeds(); + result.no_stderr(); let mut result_seq: Vec = result + .stdout_str() .split("\n") .filter(|x| !x.is_empty()) .map(|x| x.parse().unwrap()) @@ -84,12 +76,11 @@ fn test_head_count() { let result = new_ucmd!() .args(&["-n", &repeat_limit.to_string()]) .pipe_in(input.as_bytes()) - .succeeds() - .no_stderr() - .stdout - .clone(); + .succeeds(); + result.no_stderr(); let mut result_seq: Vec = result + .stdout_str() .split("\n") .filter(|x| !x.is_empty()) .map(|x| x.parse().unwrap()) @@ -99,7 +90,7 @@ fn test_head_count() { assert!( result_seq.iter().all(|x| input_seq.contains(x)), "Output includes element not from input: {}", - result + result.stdout_str() ) } @@ -117,12 +108,11 @@ fn test_repeat() { .arg("-r") .args(&["-n", &repeat_limit.to_string()]) .pipe_in(input.as_bytes()) - .succeeds() - .no_stderr() - .stdout - .clone(); + .succeeds(); + result.no_stderr(); let result_seq: Vec = result + .stdout_str() .split("\n") .filter(|x| !x.is_empty()) .map(|x| x.parse().unwrap()) @@ -146,14 +136,11 @@ fn test_repeat() { fn test_file_input() { let expected_seq = vec![11, 12, 13, 14, 15, 16, 17, 18, 19, 20]; - let result = new_ucmd!() - .arg("file_input.txt") - .succeeds() - .no_stderr() - .stdout - .clone(); + let result = new_ucmd!().arg("file_input.txt").succeeds(); + result.no_stderr(); let mut result_seq: Vec = result + .stdout_str() .split("\n") .filter(|x| !x.is_empty()) .map(|x| x.parse().unwrap()) @@ -164,52 +151,50 @@ fn test_file_input() { #[test] fn test_shuf_echo_and_input_range_not_allowed() { - let result = new_ucmd!().args(&["-e", "0", "-i", "0-2"]).run(); - - assert!(!result.success); - assert!(result - .stderr - .contains("The argument '--input-range ' cannot be used with '--echo ...'")); + new_ucmd!() + .args(&["-e", "0", "-i", "0-2"]) + .fails() + .stderr_contains( + "The argument '--input-range ' cannot be used with '--echo ...'", + ); } #[test] fn test_shuf_input_range_and_file_not_allowed() { - let result = new_ucmd!().args(&["-i", "0-9", "file"]).run(); - - assert!(!result.success); - assert!(result - .stderr - .contains("The argument '' cannot be used with '--input-range '")); + new_ucmd!() + .args(&["-i", "0-9", "file"]) + .fails() + .stderr_contains("The argument '' cannot be used with '--input-range '"); } #[test] fn test_shuf_invalid_input_range_one() { - let result = new_ucmd!().args(&["-i", "0"]).run(); - - assert!(!result.success); - assert!(result.stderr.contains("invalid input range")); + new_ucmd!() + .args(&["-i", "0"]) + .fails() + .stderr_contains("invalid input range"); } #[test] fn test_shuf_invalid_input_range_two() { - let result = new_ucmd!().args(&["-i", "a-9"]).run(); - - assert!(!result.success); - assert!(result.stderr.contains("invalid input range: 'a'")); + new_ucmd!() + .args(&["-i", "a-9"]) + .fails() + .stderr_contains("invalid input range: 'a'"); } #[test] fn test_shuf_invalid_input_range_three() { - let result = new_ucmd!().args(&["-i", "0-b"]).run(); - - assert!(!result.success); - assert!(result.stderr.contains("invalid input range: 'b'")); + new_ucmd!() + .args(&["-i", "0-b"]) + .fails() + .stderr_contains("invalid input range: 'b'"); } #[test] fn test_shuf_invalid_input_line_count() { - let result = new_ucmd!().args(&["-n", "a"]).run(); - - assert!(!result.success); - assert!(result.stderr.contains("invalid line count: 'a'")); + new_ucmd!() + .args(&["-n", "a"]) + .fails() + .stderr_contains("invalid line count: 'a'"); } diff --git a/tests/by-util/test_sort.rs b/tests/by-util/test_sort.rs index 43aaf1da1..3c0af259f 100644 --- a/tests/by-util/test_sort.rs +++ b/tests/by-util/test_sort.rs @@ -1,5 +1,126 @@ use crate::common::util::*; +fn test_helper(file_name: &str, possible_args: &[&str]) { + for args in possible_args { + new_ucmd!() + .arg(format!("{}.txt", file_name)) + .args(&args.split_whitespace().collect::>()) + .succeeds() + .stdout_is_fixture(format!("{}.expected", file_name)); + + new_ucmd!() + .arg(format!("{}.txt", file_name)) + .arg("--debug") + .args(&args.split_whitespace().collect::>()) + .succeeds() + .stdout_is_fixture(format!("{}.expected.debug", file_name)); + } +} + +#[test] +fn test_buffer_sizes() { + let buffer_sizes = [ + "0", "50K", "50k", "1M", "100M", "1000G", "10T", "500E", "1Y", + ]; + for buffer_size in &buffer_sizes { + new_ucmd!() + .arg("-n") + .arg("-S") + .arg(buffer_size) + .arg("ext_sort.txt") + .succeeds() + .stdout_is_fixture("ext_sort.expected"); + } +} + +#[test] +fn test_invalid_buffer_size() { + let buffer_sizes = ["asd", "100f"]; + for invalid_buffer_size in &buffer_sizes { + new_ucmd!() + .arg("-S") + .arg(invalid_buffer_size) + .fails() + .stderr_only(format!( + "sort: failed to parse buffer size `{}`: invalid digit found in string", + invalid_buffer_size + )); + } +} + +#[test] +fn test_ext_sort_stable() { + new_ucmd!() + .arg("-n") + .arg("--stable") + .arg("-S") + .arg("0M") + .arg("ext_stable.txt") + .succeeds() + .stdout_only_fixture("ext_stable.expected"); +} + +#[test] +fn test_extsort_zero_terminated() { + new_ucmd!() + .arg("-z") + .arg("-S") + .arg("10K") + .arg("zero-terminated.txt") + .succeeds() + .stdout_is_fixture("zero-terminated.expected"); +} + +#[test] +fn test_months_whitespace() { + test_helper("months-whitespace", &["-M", "--month-sort", "--sort=month"]); +} + +#[test] +fn test_version_empty_lines() { + new_ucmd!() + .arg("-V") + .arg("version-empty-lines.txt") + .succeeds() + .stdout_is("\n\n\n\n\n\n\n1.2.3-alpha\n1.2.3-alpha2\n\t\t\t1.12.4\n11.2.3\n"); +} + +#[test] +fn test_human_numeric_whitespace() { + test_helper( + "human-numeric-whitespace", + &["-h", "--human-numeric-sort", "--sort=human-numeric"], + ); +} + +// This tests where serde often fails when reading back JSON +// if it finds a null value +#[test] +fn test_extsort_as64_bailout() { + new_ucmd!() + .arg("-g") + .arg("-S 5K") + .arg("multiple_decimals_general.txt") + .succeeds() + .stdout_is_fixture("multiple_decimals_general.expected"); +} + +#[test] +fn test_multiple_decimals_general() { + test_helper( + "multiple_decimals_general", + &["-g", "--general-numeric-sort", "--sort=general-numeric"], + ) +} + +#[test] +fn test_multiple_decimals_numeric() { + test_helper( + "multiple_decimals_numeric", + &["-n", "--numeric-sort", "--sort=numeric"], + ) +} + #[test] fn test_check_zero_terminated_failure() { new_ucmd!() @@ -7,7 +128,7 @@ fn test_check_zero_terminated_failure() { .arg("-c") .arg("zero-terminated.txt") .fails() - .stdout_is("sort: disorder in line 0\n"); + .stdout_is("sort: zero-terminated.txt:2: disorder: ../../fixtures/du\n"); } #[test] @@ -22,9 +143,9 @@ fn test_check_zero_terminated_success() { #[test] fn test_random_shuffle_len() { // check whether output is the same length as the input - const FILE: &'static str = "default_unsorted_ints.expected"; + const FILE: &str = "default_unsorted_ints.expected"; let (at, _ucmd) = at_and_ucmd!(); - let result = new_ucmd!().arg("-R").arg(FILE).run().stdout; + let result = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str(); let expected = at.read(FILE); assert_ne!(result, expected); @@ -34,26 +155,41 @@ fn test_random_shuffle_len() { #[test] fn test_random_shuffle_contains_all_lines() { // check whether lines of input are all in output - const FILE: &'static str = "default_unsorted_ints.expected"; + const FILE: &str = "default_unsorted_ints.expected"; let (at, _ucmd) = at_and_ucmd!(); - let result = new_ucmd!().arg("-R").arg(FILE).run().stdout; + let result = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str(); let expected = at.read(FILE); - let result_sorted = new_ucmd!().pipe_in(result.clone()).run().stdout; + let result_sorted = new_ucmd!().pipe_in(result.clone()).run().stdout_move_str(); assert_ne!(result, expected); assert_eq!(result_sorted, expected); } +#[test] +fn test_random_shuffle_two_runs_not_the_same() { + // check to verify that two random shuffles are not equal; this has the + // potential to fail in the very unlikely event that the random order is the same + // as the starting order, or if both random sorts end up having the same order. + const FILE: &str = "default_unsorted_ints.expected"; + let (at, _ucmd) = at_and_ucmd!(); + let result = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str(); + let expected = at.read(FILE); + let unexpected = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str(); + + assert_ne!(result, expected); + assert_ne!(result, unexpected); +} + #[test] fn test_random_shuffle_contains_two_runs_not_the_same() { // check to verify that two random shuffles are not equal; this has the // potential to fail in the unlikely event that random order is the same // as the starting order, or if both random sorts end up having the same order. - const FILE: &'static str = "default_unsorted_ints.expected"; + const FILE: &str = "default_unsorted_ints.expected"; let (at, _ucmd) = at_and_ucmd!(); - let result = new_ucmd!().arg("-R").arg(FILE).run().stdout; + let result = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str(); let expected = at.read(FILE); - let unexpected = new_ucmd!().arg("-R").arg(FILE).run().stdout; + let unexpected = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str(); assert_ne!(result, expected); assert_ne!(result, unexpected); @@ -61,72 +197,93 @@ fn test_random_shuffle_contains_two_runs_not_the_same() { #[test] fn test_numeric_floats_and_ints() { - test_helper("numeric_floats_and_ints", "-n"); + test_helper( + "numeric_floats_and_ints", + &["-n", "--numeric-sort", "--sort=numeric"], + ); } #[test] fn test_numeric_floats() { - test_helper("numeric_floats", "-n"); + test_helper( + "numeric_floats", + &["-n", "--numeric-sort", "--sort=numeric"], + ); } #[test] fn test_numeric_floats_with_nan() { - test_helper("numeric_floats_with_nan", "-n"); + test_helper( + "numeric_floats_with_nan", + &["-n", "--numeric-sort", "--sort=numeric"], + ); } #[test] fn test_numeric_unfixed_floats() { - test_helper("numeric_unfixed_floats", "-n"); + test_helper( + "numeric_unfixed_floats", + &["-n", "--numeric-sort", "--sort=numeric"], + ); } #[test] fn test_numeric_fixed_floats() { - test_helper("numeric_fixed_floats", "-n"); + test_helper( + "numeric_fixed_floats", + &["-n", "--numeric-sort", "--sort=numeric"], + ); } #[test] fn test_numeric_unsorted_ints() { - test_helper("numeric_unsorted_ints", "-n"); + test_helper( + "numeric_unsorted_ints", + &["-n", "--numeric-sort", "--sort=numeric"], + ); } #[test] fn test_human_block_sizes() { - test_helper("human_block_sizes", "-h"); + test_helper( + "human_block_sizes", + &["-h", "--human-numeric-sort", "--sort=human-numeric"], + ); } #[test] fn test_month_default() { - test_helper("month_default", "-M"); + test_helper("month_default", &["-M", "--month-sort", "--sort=month"]); } #[test] fn test_month_stable() { - test_helper("month_stable", "-Ms"); + test_helper("month_stable", &["-Ms"]); } #[test] fn test_default_unsorted_ints() { - test_helper("default_unsorted_ints", ""); + test_helper("default_unsorted_ints", &[""]); } #[test] fn test_numeric_unique_ints() { - test_helper("numeric_unsorted_ints_unique", "-nu"); + test_helper("numeric_unsorted_ints_unique", &["-nu"]); } #[test] fn test_version() { - test_helper("version", "-V"); + test_helper("version", &["-V"]); } #[test] fn test_ignore_case() { - test_helper("ignore_case", "-f"); + test_helper("ignore_case", &["-f"]); } #[test] fn test_dictionary_order() { - test_helper("dictionary_order", "-d"); + test_helper("dictionary_order", &["-d"]); } #[test] @@ -144,52 +301,62 @@ fn test_dictionary_order2() { fn test_non_printing_chars() { for non_printing_chars_param in vec!["-i"] { new_ucmd!() - .pipe_in("a👦🏻aa b\naaaa b") + .pipe_in("a👦🏻aa\naaaa") .arg(non_printing_chars_param) .succeeds() - .stdout_only("aaaa b\na👦🏻aa b\n"); + .stdout_only("a👦🏻aa\naaaa\n"); } } #[test] fn test_exponents_positive_general_fixed() { - for exponents_positive_general_param in vec!["-g"] { - new_ucmd!() - .pipe_in("100E6\n\n50e10\n+100000\n\n10000K78\n10E\n\n\n1000EDKLD\n\n\n100E6\n\n50e10\n+100000\n\n") - .arg(exponents_positive_general_param) - .succeeds() - .stdout_only("\n\n\n\n\n\n\n\n10000K78\n1000EDKLD\n10E\n+100000\n+100000\n100E6\n100E6\n50e10\n50e10\n"); - } + test_helper("exponents_general", &["-g"]); } #[test] fn test_exponents_positive_numeric() { - test_helper("exponents-positive-numeric", "-n"); + test_helper( + "exponents-positive-numeric", + &["-n", "--numeric-sort", "--sort=numeric"], + ); } #[test] fn test_months_dedup() { - test_helper("months-dedup", "-Mu"); + test_helper("months-dedup", &["-Mu"]); } #[test] fn test_mixed_floats_ints_chars_numeric() { - test_helper("mixed_floats_ints_chars_numeric", "-n"); + test_helper( + "mixed_floats_ints_chars_numeric", + &["-n", "--numeric-sort", "--sort=numeric"], + ); } #[test] fn test_mixed_floats_ints_chars_numeric_unique() { - test_helper("mixed_floats_ints_chars_numeric_unique", "-nu"); + test_helper("mixed_floats_ints_chars_numeric_unique", &["-nu"]); +} + +#[test] +fn test_words_unique() { + test_helper("words_unique", &["-u"]); +} + +#[test] +fn test_numeric_unique() { + test_helper("numeric_unique", &["-nu"]); } #[test] fn test_mixed_floats_ints_chars_numeric_reverse() { - test_helper("mixed_floats_ints_chars_numeric_unique_reverse", "-nur"); + test_helper("mixed_floats_ints_chars_numeric_unique_reverse", &["-nur"]); } #[test] fn test_mixed_floats_ints_chars_numeric_stable() { - test_helper("mixed_floats_ints_chars_numeric_stable", "-ns"); + test_helper("mixed_floats_ints_chars_numeric_stable", &["-ns"]); } #[test] @@ -218,12 +385,15 @@ fn test_numeric_floats2() { #[test] fn test_numeric_floats_with_nan2() { - test_helper("numeric-floats-with-nan2", "-n"); + test_helper( + "numeric-floats-with-nan2", + &["-n", "--numeric-sort", "--sort=numeric"], + ); } #[test] fn test_human_block_sizes2() { - for human_numeric_sort_param in vec!["-h", "--human-numeric-sort"] { + for human_numeric_sort_param in &["-h", "--human-numeric-sort", "--sort=human-numeric"] { let input = "8981K\n909991M\n-8T\n21G\n0.8M"; new_ucmd!() .arg(human_numeric_sort_param) @@ -235,7 +405,7 @@ fn test_human_block_sizes2() { #[test] fn test_month_default2() { - for month_sort_param in vec!["-M", "--month-sort"] { + for month_sort_param in &["-M", "--month-sort", "--sort=month"] { let input = "JAn\nMAY\n000may\nJun\nFeb"; new_ucmd!() .arg(month_sort_param) @@ -266,9 +436,159 @@ fn test_numeric_unique_ints2() { } } +#[test] +fn test_keys_open_ended() { + test_helper("keys_open_ended", &["-k 2.3"]); +} + +#[test] +fn test_keys_closed_range() { + test_helper("keys_closed_range", &["-k 2.2,2.2"]); +} + +#[test] +fn test_keys_multiple_ranges() { + test_helper("keys_multiple_ranges", &["-k 2,2 -k 3,3"]); +} + +#[test] +fn test_keys_no_field_match() { + test_helper("keys_no_field_match", &["-k 4,4"]); +} + +#[test] +fn test_keys_no_char_match() { + test_helper("keys_no_char_match", &["-k 1.2"]); +} + +#[test] +fn test_keys_custom_separator() { + test_helper("keys_custom_separator", &["-k 2.2,2.2 -t x"]); +} + +#[test] +fn test_keys_invalid_field() { + new_ucmd!() + .args(&["-k", "1."]) + .fails() + .stderr_only("sort: failed to parse character index for key `1.`: cannot parse integer from empty string"); +} + +#[test] +fn test_keys_invalid_field_option() { + new_ucmd!() + .args(&["-k", "1.1x"]) + .fails() + .stderr_only("sort: invalid option for key: `x`"); +} + +#[test] +fn test_keys_invalid_field_zero() { + new_ucmd!() + .args(&["-k", "0.1"]) + .fails() + .stderr_only("sort: field index was 0"); +} + +#[test] +fn test_keys_invalid_char_zero() { + new_ucmd!() + .args(&["-k", "1.0"]) + .fails() + .stderr_only("sort: invalid character index 0 in `1.0` for the start position of a field"); +} + +#[test] +fn test_keys_with_options() { + let input = "aa 3 cc\ndd 1 ff\ngg 2 cc\n"; + for param in &[ + &["-k", "2,2n"][..], + &["-k", "2n,2"][..], + &["-k", "2,2", "-n"][..], + ] { + new_ucmd!() + .args(param) + .pipe_in(input) + .succeeds() + .stdout_only("dd 1 ff\ngg 2 cc\naa 3 cc\n"); + } +} + +#[test] +fn test_keys_with_options_blanks_start() { + let input = "aa 3 cc\ndd 1 ff\ngg 2 cc\n"; + for param in &[&["-k", "2b,2"][..], &["-k", "2,2", "-b"][..]] { + new_ucmd!() + .args(param) + .pipe_in(input) + .succeeds() + .stdout_only("dd 1 ff\ngg 2 cc\naa 3 cc\n"); + } +} + +#[test] +fn test_keys_blanks_with_char_idx() { + test_helper("keys_blanks", &["-k 1.2b"]) +} + +#[test] +fn test_keys_with_options_blanks_end() { + let input = "a b +a b +a b +"; + new_ucmd!() + .args(&["-k", "1,2.1b", "-s"]) + .pipe_in(input) + .succeeds() + .stdout_only( + "a b +a b +a b +", + ); +} + +#[test] +fn test_keys_stable() { + let input = "a b +a b +a b +"; + new_ucmd!() + .args(&["-k", "1,2.1", "-s"]) + .pipe_in(input) + .succeeds() + .stdout_only( + "a b +a b +a b +", + ); +} + +#[test] +fn test_keys_empty_match() { + let input = "a a a a +aaaa +"; + new_ucmd!() + .args(&["-k", "1,1", "-t", "a"]) + .pipe_in(input) + .succeeds() + .stdout_only(input); +} + +#[test] +fn test_keys_negative_size_match() { + // If the end of a field is before its start, we should not crash. + // Debug output should report "no match for key" at the start position (i.e. the later position). + test_helper("keys_negative_size", &["-k 3,1"]); +} + #[test] fn test_zero_terminated() { - test_helper("zero-terminated", "-z"); + test_helper("zero-terminated", &["-z"]); } #[test] @@ -307,6 +627,18 @@ fn test_merge_unique() { .stdout_only_fixture("merge_ints_interleaved.expected"); } +#[test] +fn test_merge_stable() { + new_ucmd!() + .arg("-m") + .arg("--stable") + .arg("-n") + .arg("merge_stable_1.txt") + .arg("merge_stable_2.txt") + .succeeds() + .stdout_only_fixture("merge_stable.expected"); +} + #[test] fn test_merge_reversed() { new_ucmd!() @@ -338,7 +670,7 @@ fn test_check() { .arg("-c") .arg("check_fail.txt") .fails() - .stdout_is("sort: disorder in line 4\n"); + .stdout_is("sort: check_fail.txt:6: disorder: 5\n"); new_ucmd!() .arg("-c") @@ -356,10 +688,52 @@ fn test_check_silent() { .stdout_is(""); } -fn test_helper(file_name: &str, args: &str) { - new_ucmd!() - .arg(args) - .arg(format!("{}{}", file_name, ".txt")) - .succeeds() - .stdout_is_fixture(format!("{}{}", file_name, ".expected")); +#[test] +fn test_dictionary_and_nonprinting_conflicts() { + let conflicting_args = ["n", "h", "g", "M"]; + for restricted_arg in &["d", "i"] { + for conflicting_arg in &conflicting_args { + new_ucmd!() + .arg(&format!("-{}{}", restricted_arg, conflicting_arg)) + .fails(); + } + for conflicting_arg in &conflicting_args { + new_ucmd!() + .args(&[ + format!("-{}", restricted_arg).as_str(), + "-k", + &format!("1,1{}", conflicting_arg), + ]) + .succeeds(); + } + for conflicting_arg in &conflicting_args { + // FIXME: this should ideally fail. + new_ucmd!() + .args(&["-k", &format!("1{},1{}", restricted_arg, conflicting_arg)]) + .succeeds(); + } + } +} + +#[test] +fn test_trailing_separator() { + new_ucmd!() + .args(&["-t", "x", "-k", "1,1"]) + .pipe_in("aax\naaa\n") + .succeeds() + .stdout_is("aax\naaa\n"); +} + +#[test] +fn test_nonexistent_file() { + new_ucmd!() + .arg("nonexistent.txt") + .fails() + .status_code(2) + .stderr_only( + #[cfg(not(windows))] + "sort: cannot read: \"nonexistent.txt\": No such file or directory (os error 2)", + #[cfg(windows)] + "sort: cannot read: \"nonexistent.txt\": The system cannot find the file specified. (os error 2)", + ); } diff --git a/tests/by-util/test_split.rs b/tests/by-util/test_split.rs index 521cbbe9a..d83de4323 100644 --- a/tests/by-util/test_split.rs +++ b/tests/by-util/test_split.rs @@ -4,11 +4,15 @@ extern crate regex; use self::rand::{thread_rng, Rng}; use self::regex::Regex; use crate::common::util::*; +use rand::SeedableRng; #[cfg(not(windows))] use std::env; -use std::fs::{read_dir, File}; use std::io::Write; use std::path::Path; +use std::{ + fs::{read_dir, File}, + io::BufWriter, +}; fn random_chars(n: usize) -> String { thread_rng() @@ -58,7 +62,7 @@ impl Glob { files.sort(); let mut data: Vec = vec![]; for name in &files { - data.extend(self.directory.read(name).into_bytes()); + data.extend(self.directory.read_bytes(name)); } data } @@ -81,20 +85,30 @@ impl RandomFile { } fn add_bytes(&mut self, bytes: usize) { - let chunk_size: usize = if bytes >= 1024 { 1024 } else { bytes }; - let mut n = bytes; - while n > chunk_size { - let _ = write!(self.inner, "{}", random_chars(chunk_size)); - n -= chunk_size; + // Note that just writing random characters isn't enough to cover all + // cases. We need truly random bytes. + let mut writer = BufWriter::new(&self.inner); + + // Seed the rng so as to avoid spurious test failures. + let mut rng = rand::rngs::StdRng::seed_from_u64(123); + let mut buffer = [0; 1024]; + let mut remaining_size = bytes; + + while remaining_size > 0 { + let to_write = std::cmp::min(remaining_size, buffer.len()); + let buf = &mut buffer[..to_write]; + rng.fill(buf); + writer.write(buf).unwrap(); + + remaining_size -= to_write; } - let _ = write!(self.inner, "{}", random_chars(n)); } /// Add n lines each of size `RandomFile::LINESIZE` fn add_lines(&mut self, lines: usize) { let mut n = lines; while n > 0 { - let _ = writeln!(self.inner, "{}", random_chars(RandomFile::LINESIZE)); + writeln!(self.inner, "{}", random_chars(RandomFile::LINESIZE)).unwrap(); n -= 1; } } @@ -104,18 +118,18 @@ impl RandomFile { fn test_split_default() { let (at, mut ucmd) = at_and_ucmd!(); let name = "split_default"; - let glob = Glob::new(&at, ".", r"x[[:alpha:]][[:alpha:]]$"); RandomFile::new(&at, name).add_lines(2000); ucmd.args(&[name]).succeeds(); + + let glob = Glob::new(&at, ".", r"x[[:alpha:]][[:alpha:]]$"); assert_eq!(glob.count(), 2); - assert_eq!(glob.collate(), at.read(name).into_bytes()); + assert_eq!(glob.collate(), at.read_bytes(name)); } #[test] fn test_split_numeric_prefixed_chunks_by_bytes() { let (at, mut ucmd) = at_and_ucmd!(); let name = "split_num_prefixed_chunks_by_bytes"; - let glob = Glob::new(&at, ".", r"a\d\d$"); RandomFile::new(&at, name).add_bytes(10000); ucmd.args(&[ "-d", // --numeric-suffixes @@ -123,52 +137,89 @@ fn test_split_numeric_prefixed_chunks_by_bytes() { "1000", name, "a", ]) .succeeds(); + + let glob = Glob::new(&at, ".", r"a\d\d$"); assert_eq!(glob.count(), 10); - assert_eq!(glob.collate(), at.read(name).into_bytes()); + for filename in glob.collect() { + assert_eq!(glob.directory.metadata(&filename).len(), 1000); + } + assert_eq!(glob.collate(), at.read_bytes(name)); } #[test] fn test_split_str_prefixed_chunks_by_bytes() { let (at, mut ucmd) = at_and_ucmd!(); let name = "split_str_prefixed_chunks_by_bytes"; - let glob = Glob::new(&at, ".", r"b[[:alpha:]][[:alpha:]]$"); RandomFile::new(&at, name).add_bytes(10000); + // Important that this is less than 1024 since that's our internal buffer + // size. Good to test that we don't overshoot. ucmd.args(&["-b", "1000", name, "b"]).succeeds(); + + let glob = Glob::new(&at, ".", r"b[[:alpha:]][[:alpha:]]$"); assert_eq!(glob.count(), 10); - assert_eq!(glob.collate(), at.read(name).into_bytes()); + for filename in glob.collect() { + assert_eq!(glob.directory.metadata(&filename).len(), 1000); + } + assert_eq!(glob.collate(), at.read_bytes(name)); +} + +// This is designed to test what happens when the desired part size is not a +// multiple of the buffer size and we hopefully don't overshoot the desired part +// size. +#[test] +fn test_split_bytes_prime_part_size() { + let (at, mut ucmd) = at_and_ucmd!(); + let name = "test_split_bytes_prime_part_size"; + RandomFile::new(&at, name).add_bytes(10000); + // 1753 is prime and greater than the buffer size, 1024. + ucmd.args(&["-b", "1753", name, "b"]).succeeds(); + + let glob = Glob::new(&at, ".", r"b[[:alpha:]][[:alpha:]]$"); + assert_eq!(glob.count(), 6); + let mut fns = glob.collect(); + // glob.collect() is not guaranteed to return in sorted order, so we sort. + fns.sort(); + for i in 0..5 { + assert_eq!(glob.directory.metadata(&fns[i]).len(), 1753); + } + assert_eq!(glob.directory.metadata(&fns[5]).len(), 1235); + assert_eq!(glob.collate(), at.read_bytes(name)); } #[test] fn test_split_num_prefixed_chunks_by_lines() { let (at, mut ucmd) = at_and_ucmd!(); let name = "split_num_prefixed_chunks_by_lines"; - let glob = Glob::new(&at, ".", r"c\d\d$"); RandomFile::new(&at, name).add_lines(10000); ucmd.args(&["-d", "-l", "1000", name, "c"]).succeeds(); + + let glob = Glob::new(&at, ".", r"c\d\d$"); assert_eq!(glob.count(), 10); - assert_eq!(glob.collate(), at.read(name).into_bytes()); + assert_eq!(glob.collate(), at.read_bytes(name)); } #[test] fn test_split_str_prefixed_chunks_by_lines() { let (at, mut ucmd) = at_and_ucmd!(); let name = "split_str_prefixed_chunks_by_lines"; - let glob = Glob::new(&at, ".", r"d[[:alpha:]][[:alpha:]]$"); RandomFile::new(&at, name).add_lines(10000); ucmd.args(&["-l", "1000", name, "d"]).succeeds(); + + let glob = Glob::new(&at, ".", r"d[[:alpha:]][[:alpha:]]$"); assert_eq!(glob.count(), 10); - assert_eq!(glob.collate(), at.read(name).into_bytes()); + assert_eq!(glob.collate(), at.read_bytes(name)); } #[test] fn test_split_additional_suffix() { let (at, mut ucmd) = at_and_ucmd!(); let name = "split_additional_suffix"; - let glob = Glob::new(&at, ".", r"x[[:alpha:]][[:alpha:]].txt$"); RandomFile::new(&at, name).add_lines(2000); ucmd.args(&["--additional-suffix", ".txt", name]).succeeds(); + + let glob = Glob::new(&at, ".", r"x[[:alpha:]][[:alpha:]].txt$"); assert_eq!(glob.count(), 2); - assert_eq!(glob.collate(), at.read(name).into_bytes()); + assert_eq!(glob.collate(), at.read_bytes(name)); } // note: the test_filter* tests below are unix-only @@ -182,15 +233,16 @@ fn test_filter() { // like `test_split_default()` but run a command before writing let (at, mut ucmd) = at_and_ucmd!(); let name = "filtered"; - let glob = Glob::new(&at, ".", r"x[[:alpha:]][[:alpha:]]$"); let n_lines = 3; RandomFile::new(&at, name).add_lines(n_lines); // change all characters to 'i' ucmd.args(&["--filter=sed s/./i/g > $FILE", name]) .succeeds(); + // assert all characters are 'i' / no character is not 'i' // (assert that command succeded) + let glob = Glob::new(&at, ".", r"x[[:alpha:]][[:alpha:]]$"); assert!( glob.collate().iter().find(|&&c| { // is not i @@ -209,7 +261,6 @@ fn test_filter_with_env_var_set() { // implemented like `test_split_default()` but run a command before writing let (at, mut ucmd) = at_and_ucmd!(); let name = "filtered"; - let glob = Glob::new(&at, ".", r"x[[:alpha:]][[:alpha:]]$"); let n_lines = 3; RandomFile::new(&at, name).add_lines(n_lines); @@ -217,7 +268,9 @@ fn test_filter_with_env_var_set() { env::set_var("FILE", &env_var_value); ucmd.args(&[format!("--filter={}", "cat > $FILE").as_str(), name]) .succeeds(); - assert_eq!(glob.collate(), at.read(name).into_bytes()); + + let glob = Glob::new(&at, ".", r"x[[:alpha:]][[:alpha:]]$"); + assert_eq!(glob.collate(), at.read_bytes(name)); assert!(env::var("FILE").unwrap_or("var was unset".to_owned()) == env_var_value); } diff --git a/tests/by-util/test_stat.rs b/tests/by-util/test_stat.rs index 225ea52cd..44bce9cd8 100644 --- a/tests/by-util/test_stat.rs +++ b/tests/by-util/test_stat.rs @@ -5,69 +5,6 @@ use crate::common::util::*; extern crate stat; pub use self::stat::*; -#[cfg(test)] -mod test_fsext { - use super::*; - - #[test] - fn test_access() { - assert_eq!("drwxr-xr-x", pretty_access(S_IFDIR | 0o755)); - assert_eq!("-rw-r--r--", pretty_access(S_IFREG | 0o644)); - assert_eq!("srw-r-----", pretty_access(S_IFSOCK | 0o640)); - assert_eq!("lrw-r-xr-x", pretty_access(S_IFLNK | 0o655)); - assert_eq!("?rw-r-xr-x", pretty_access(0o655)); - - assert_eq!( - "brwSr-xr-x", - pretty_access(S_IFBLK | S_ISUID as mode_t | 0o655) - ); - assert_eq!( - "brwsr-xr-x", - pretty_access(S_IFBLK | S_ISUID as mode_t | 0o755) - ); - - assert_eq!( - "prw---sr--", - pretty_access(S_IFIFO | S_ISGID as mode_t | 0o614) - ); - assert_eq!( - "prw---Sr--", - pretty_access(S_IFIFO | S_ISGID as mode_t | 0o604) - ); - - assert_eq!( - "c---r-xr-t", - pretty_access(S_IFCHR | S_ISVTX as mode_t | 0o055) - ); - assert_eq!( - "c---r-xr-T", - pretty_access(S_IFCHR | S_ISVTX as mode_t | 0o054) - ); - } - - #[test] - fn test_file_type() { - assert_eq!("block special file", pretty_filetype(S_IFBLK, 0)); - assert_eq!("character special file", pretty_filetype(S_IFCHR, 0)); - assert_eq!("regular file", pretty_filetype(S_IFREG, 1)); - assert_eq!("regular empty file", pretty_filetype(S_IFREG, 0)); - assert_eq!("weird file", pretty_filetype(0, 0)); - } - - #[test] - fn test_fs_type() { - assert_eq!("ext2/ext3", pretty_fstype(0xEF53)); - assert_eq!("tmpfs", pretty_fstype(0x01021994)); - assert_eq!("nfs", pretty_fstype(0x6969)); - assert_eq!("btrfs", pretty_fstype(0x9123683e)); - assert_eq!("xfs", pretty_fstype(0x58465342)); - assert_eq!("zfs", pretty_fstype(0x2FC12FC1)); - assert_eq!("ntfs", pretty_fstype(0x5346544e)); - assert_eq!("fat", pretty_fstype(0x4006)); - assert_eq!("UNKNOWN (0x1234)", pretty_fstype(0x1234)); - } -} - #[test] fn test_scanutil() { assert_eq!(Some((-5, 2)), "-5zxc".scan_num::()); @@ -159,10 +96,10 @@ fn test_invalid_option() { new_ucmd!().arg("-w").arg("-q").arg("/").fails(); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_vendor = "apple"))] const NORMAL_FMTSTR: &'static str = "%a %A %b %B %d %D %f %F %g %G %h %i %m %n %o %s %u %U %x %X %y %Y %z %Z"; // avoid "%w %W" (birth/creation) due to `stat` limitations and linux kernel & rust version capability variations -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux"))] const DEV_FMTSTR: &'static str = "%a %A %b %B %d %D %f %F %g %G %h %i %m %n %o %s (%t/%T) %u %U %w %W %x %X %y %Y %z %Z"; #[cfg(target_os = "linux")] @@ -188,19 +125,26 @@ fn test_fs_format() { .stdout_is(expected_result(&args)); } +#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[test] -#[cfg(target_os = "linux")] fn test_terse_normal_format() { // note: contains birth/creation date which increases test fragility // * results may vary due to built-in `stat` limitations as well as linux kernel and rust version capability variations let args = ["-t", "/"]; - let actual = new_ucmd!().args(&args).run().stdout; + let actual = new_ucmd!().args(&args).succeeds().stdout_move_str(); let expect = expected_result(&args); println!("actual: {:?}", actual); println!("expect: {:?}", expect); - let v_actual: Vec<&str> = actual.split(' ').collect(); - let v_expect: Vec<&str> = expect.split(' ').collect(); + let v_actual: Vec<&str> = actual.trim().split(' ').collect(); + let mut v_expect: Vec<&str> = expect.trim().split(' ').collect(); assert!(!v_expect.is_empty()); + + // uu_stat does not support selinux + if v_actual.len() == v_expect.len() - 1 && v_expect[v_expect.len() - 1].contains(":") { + // assume last element contains: `SELinux security context string` + v_expect.pop(); + } + // * allow for inequality if `stat` (aka, expect) returns "0" (unknown value) assert!( expect == "0" @@ -212,11 +156,11 @@ fn test_terse_normal_format() { ); } +#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[test] -#[cfg(target_os = "linux")] fn test_format_created_time() { - let args = ["-c", "%w", "/boot"]; - let actual = new_ucmd!().args(&args).run().stdout; + let args = ["-c", "%w", "/bin"]; + let actual = new_ucmd!().args(&args).succeeds().stdout_move_str(); let expect = expected_result(&args); println!("actual: {:?}", actual); println!("expect: {:?}", expect); @@ -236,11 +180,11 @@ fn test_format_created_time() { ); } +#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[test] -#[cfg(target_os = "linux")] fn test_format_created_seconds() { - let args = ["-c", "%W", "/boot"]; - let actual = new_ucmd!().args(&args).run().stdout; + let args = ["-c", "%W", "/bin"]; + let actual = new_ucmd!().args(&args).succeeds().stdout_move_str(); let expect = expected_result(&args); println!("actual: {:?}", actual); println!("expect: {:?}", expect); @@ -260,65 +204,97 @@ fn test_format_created_seconds() { ); } +#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[test] -#[cfg(target_os = "linux")] fn test_normal_format() { - let args = ["-c", NORMAL_FMTSTR, "/boot"]; + let args = ["-c", NORMAL_FMTSTR, "/bin"]; new_ucmd!() .args(&args) - .run() + .succeeds() .stdout_is(expected_result(&args)); } +#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[test] -#[cfg(target_os = "linux")] -fn test_follow_symlink() { - let args = ["-L", "-c", DEV_FMTSTR, "/dev/cdrom"]; - new_ucmd!() - .args(&args) - .run() - .stdout_is(expected_result(&args)); +fn test_symlinks() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let mut tested: bool = false; + // arbitrarily chosen symlinks with hope that the CI environment provides at least one of them + for file in vec![ + "/bin/sh", + "/bin/sudoedit", + "/usr/bin/ex", + "/etc/localtime", + "/etc/aliases", + ] { + if at.file_exists(file) && at.is_symlink(file) { + tested = true; + let args = ["-c", NORMAL_FMTSTR, file]; + scene + .ucmd() + .args(&args) + .succeeds() + .stdout_is(expected_result(&args)); + // -L, --dereference follow links + let args = ["-L", "-c", NORMAL_FMTSTR, file]; + scene + .ucmd() + .args(&args) + .succeeds() + .stdout_is(expected_result(&args)); + } + } + if !tested { + panic!("No symlink found to test in this environment"); + } } +#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[test] -#[cfg(target_os = "linux")] -fn test_symlink() { - let args = ["-c", DEV_FMTSTR, "/dev/cdrom"]; - new_ucmd!() - .args(&args) - .run() - .stdout_is(expected_result(&args)); -} - -#[test] -#[cfg(target_os = "linux")] fn test_char() { - let args = ["-c", DEV_FMTSTR, "/dev/pts/ptmx"]; + // TODO: "(%t) (%x) (%w)" deviate from GNU stat for `character special file` on macOS + // Diff < left / right > : + // <"(f0000) (2021-05-20 23:08:03.442555000 +0200) (1970-01-01 01:00:00.000000000 +0100)\n" + // >"(f) (2021-05-20 23:08:03.455598000 +0200) (-)\n" + let args = [ + "-c", + #[cfg(target_os = "linux")] + DEV_FMTSTR, + #[cfg(target_os = "linux")] + "/dev/pts/ptmx", + #[cfg(any(target_vendor = "apple"))] + "%a %A %b %B %d %D %f %F %g %G %h %i %m %n %o %s (/%T) %u %U %W %X %y %Y %z %Z", + #[cfg(any(target_vendor = "apple"))] + "/dev/ptmx", + ]; new_ucmd!() .args(&args) - .run() + .succeeds() .stdout_is(expected_result(&args)); } +#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[test] -#[cfg(target_os = "linux")] fn test_multi_files() { let args = [ "-c", NORMAL_FMTSTR, "/dev", "/usr/lib", + #[cfg(target_os = "linux")] "/etc/fstab", "/var", ]; new_ucmd!() .args(&args) - .run() + .succeeds() .stdout_is(expected_result(&args)); } +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] -#[cfg(target_os = "linux")] fn test_printf() { let args = [ "--printf=123%-# 15q\\r\\\"\\\\\\a\\b\\e\\f\\v%+020.23m\\x12\\167\\132\\112\\n", @@ -326,16 +302,21 @@ fn test_printf() { ]; new_ucmd!() .args(&args) - .run() + .succeeds() .stdout_is(expected_result(&args)); } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] fn expected_result(args: &[&str]) -> String { - TestScenario::new(util_name!()) - .cmd_keepenv(util_name!()) + #[cfg(target_os = "linux")] + let util_name = util_name!(); + #[cfg(target_vendor = "apple")] + let util_name = format!("g{}", util_name!()); + + TestScenario::new(&util_name) + .cmd_keepenv(util_name) .env("LANGUAGE", "C") .args(args) - .run() - .stdout + .succeeds() + .stdout_move_str() } diff --git a/tests/by-util/test_stdbuf.rs b/tests/by-util/test_stdbuf.rs index 9adb0cfda..2e09601ce 100644 --- a/tests/by-util/test_stdbuf.rs +++ b/tests/by-util/test_stdbuf.rs @@ -1,13 +1,64 @@ +#[cfg(not(target_os = "windows"))] use crate::common::util::*; +#[cfg(not(target_os = "windows"))] #[test] fn test_stdbuf_unbuffered_stdout() { - if cfg!(target_os = "linux") { - // This is a basic smoke test - new_ucmd!() - .args(&["-o0", "head"]) - .pipe_in("The quick brown fox jumps over the lazy dog.") - .run() - .stdout_is("The quick brown fox jumps over the lazy dog."); - } + // This is a basic smoke test + new_ucmd!() + .args(&["-o0", "head"]) + .pipe_in("The quick brown fox jumps over the lazy dog.") + .run() + .stdout_is("The quick brown fox jumps over the lazy dog."); +} + +#[cfg(not(target_os = "windows"))] +#[test] +fn test_stdbuf_line_buffered_stdout() { + new_ucmd!() + .args(&["-oL", "head"]) + .pipe_in("The quick brown fox jumps over the lazy dog.") + .run() + .stdout_is("The quick brown fox jumps over the lazy dog."); +} + +#[cfg(not(target_os = "windows"))] +#[test] +fn test_stdbuf_no_buffer_option_fails() { + new_ucmd!().args(&["head"]).fails().stderr_is( + "error: The following required arguments were not provided:\n \ + --error \n \ + --input \n \ + --output \n\n\ + USAGE:\n \ + stdbuf OPTION... COMMAND\n\n\ + For more information try --help", + ); +} + +#[cfg(not(target_os = "windows"))] +#[test] +fn test_stdbuf_trailing_var_arg() { + new_ucmd!() + .args(&["-i", "1024", "tail", "-1"]) + .pipe_in("The quick brown fox\njumps over the lazy dog.") + .run() + .stdout_is("jumps over the lazy dog."); +} + +#[cfg(not(target_os = "windows"))] +#[test] +fn test_stdbuf_line_buffering_stdin_fails() { + new_ucmd!().args(&["-i", "L", "head"]).fails().stderr_is( + "stdbuf: line buffering stdin is meaningless\nTry 'stdbuf --help' for more information.", + ); +} + +#[cfg(not(target_os = "windows"))] +#[test] +fn test_stdbuf_invalid_mode_fails() { + new_ucmd!() + .args(&["-i", "1024R", "head"]) + .fails() + .stderr_is("stdbuf: invalid mode 1024R\nTry 'stdbuf --help' for more information."); } diff --git a/tests/by-util/test_sum.rs b/tests/by-util/test_sum.rs index d12455749..f09ba9d00 100644 --- a/tests/by-util/test_sum.rs +++ b/tests/by-util/test_sum.rs @@ -59,9 +59,7 @@ fn test_invalid_file() { at.mkdir("a"); - ucmd.arg("a") - .fails() - .stderr_is("sum: error: 'a' Is a directory"); + ucmd.arg("a").fails().stderr_is("sum: 'a' Is a directory"); } #[test] @@ -70,5 +68,5 @@ fn test_invalid_metadata() { ucmd.arg("b") .fails() - .stderr_is("sum: error: 'b' No such file or directory"); + .stderr_is("sum: 'b' No such file or directory"); } diff --git a/tests/by-util/test_sync.rs b/tests/by-util/test_sync.rs index ddd6969a3..033651910 100644 --- a/tests/by-util/test_sync.rs +++ b/tests/by-util/test_sync.rs @@ -5,8 +5,7 @@ use tempfile::tempdir; #[test] fn test_sync_default() { - let result = new_ucmd!().run(); - assert!(result.success); + new_ucmd!().succeeds(); } #[test] @@ -18,8 +17,10 @@ fn test_sync_incorrect_arg() { fn test_sync_fs() { let temporary_directory = tempdir().unwrap(); let temporary_path = fs::canonicalize(temporary_directory.path()).unwrap(); - let result = new_ucmd!().arg("--file-system").arg(&temporary_path).run(); - assert!(result.success); + new_ucmd!() + .arg("--file-system") + .arg(&temporary_path) + .succeeds(); } #[test] @@ -27,12 +28,14 @@ fn test_sync_data() { // Todo add a second arg let temporary_directory = tempdir().unwrap(); let temporary_path = fs::canonicalize(temporary_directory.path()).unwrap(); - let result = new_ucmd!().arg("--data").arg(&temporary_path).run(); - assert!(result.success); + new_ucmd!().arg("--data").arg(&temporary_path).succeeds(); } #[test] fn test_sync_no_existing_files() { - let result = new_ucmd!().arg("--data").arg("do-no-exist").fails(); - assert!(result.stderr.contains("error: cannot stat")); + new_ucmd!() + .arg("--data") + .arg("do-no-exist") + .fails() + .stderr_contains("cannot stat"); } diff --git a/tests/by-util/test_tac.rs b/tests/by-util/test_tac.rs index 3733adbec..a8adbb28e 100644 --- a/tests/by-util/test_tac.rs +++ b/tests/by-util/test_tac.rs @@ -52,18 +52,19 @@ fn test_single_non_newline_separator_before() { #[test] fn test_invalid_input() { - let (_, mut ucmd) = at_and_ucmd!(); + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; - ucmd.arg("b") - .run() - .stderr - .contains("tac: error: failed to open 'b' for reading"); - - let (at, mut ucmd) = at_and_ucmd!(); + scene + .ucmd() + .arg("b") + .fails() + .stderr_contains("failed to open 'b' for reading: No such file or directory"); at.mkdir("a"); - ucmd.arg("a") - .run() - .stderr - .contains("tac: error: failed to read 'a'"); + scene + .ucmd() + .arg("a") + .fails() + .stderr_contains("dir: read error: Invalid argument"); } diff --git a/tests/by-util/test_tail.rs b/tests/by-util/test_tail.rs index 5edff4d55..f3c9a7b11 100644 --- a/tests/by-util/test_tail.rs +++ b/tests/by-util/test_tail.rs @@ -226,8 +226,8 @@ fn test_bytes_big() { .arg(FILE) .arg("-c") .arg(format!("{}", N_ARG)) - .run() - .stdout; + .succeeds() + .stdout_move_str(); let expected = at.read(EXPECTED_FILE); assert_eq!(result.len(), expected.len()); @@ -340,6 +340,51 @@ fn test_negative_indexing() { let negative_bytes_index = new_ucmd!().arg("-c").arg("-20").arg(FOOBAR_TXT).run(); - assert_eq!(positive_lines_index.stdout, negative_lines_index.stdout); - assert_eq!(positive_bytes_index.stdout, negative_bytes_index.stdout); + assert_eq!(positive_lines_index.stdout(), negative_lines_index.stdout()); + assert_eq!(positive_bytes_index.stdout(), negative_bytes_index.stdout()); +} + +#[test] +fn test_sleep_interval() { + new_ucmd!().arg("-s").arg("10").arg(FOOBAR_TXT).succeeds(); +} + +/// Test for reading all but the first NUM bytes: `tail -c +3`. +#[test] +fn test_positive_bytes() { + new_ucmd!() + .args(&["-c", "+3"]) + .pipe_in("abcde") + .succeeds() + .stdout_is("cde"); +} + +/// Test for reading all bytes, specified by `tail -c +0`. +#[test] +fn test_positive_zero_bytes() { + new_ucmd!() + .args(&["-c", "+0"]) + .pipe_in("abcde") + .succeeds() + .stdout_is("abcde"); +} + +/// Test for reading all but the first NUM lines: `tail -n +3`. +#[test] +fn test_positive_lines() { + new_ucmd!() + .args(&["-n", "+3"]) + .pipe_in("a\nb\nc\nd\ne\n") + .succeeds() + .stdout_is("c\nd\ne\n"); +} + +/// Test for reading all lines, specified by `tail -n +0`. +#[test] +fn test_positive_zero_lines() { + new_ucmd!() + .args(&["-n", "+0"]) + .pipe_in("a\nb\nc\nd\ne\n") + .succeeds() + .stdout_is("a\nb\nc\nd\ne\n"); } diff --git a/tests/by-util/test_test.rs b/tests/by-util/test_test.rs index 4b9a9ff55..3a55f772a 100644 --- a/tests/by-util/test_test.rs +++ b/tests/by-util/test_test.rs @@ -2,6 +2,7 @@ // This file is part of the uutils coreutils package. // // (c) mahkoh (ju.orth [at] gmail [dot] com) +// (c) Daniel Rocco // // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. @@ -9,11 +10,483 @@ use crate::common::util::*; +#[test] +fn test_empty_test_equivalent_to_false() { + new_ucmd!().run().status_code(1); +} + +#[test] +fn test_empty_string_is_false() { + new_ucmd!().arg("").run().status_code(1); +} + +#[test] +fn test_solo_not() { + new_ucmd!().arg("!").succeeds(); +} + +#[test] +fn test_solo_and_or_or_is_a_literal() { + // /bin/test '' -a '' => 1; so test(1) must interpret `-a` by itself as + // a literal string + new_ucmd!().arg("-a").succeeds(); + new_ucmd!().arg("-o").succeeds(); +} + +#[test] +fn test_double_not_is_false() { + new_ucmd!().args(&["!", "!"]).run().status_code(1); +} + +#[test] +fn test_and_not_is_false() { + new_ucmd!().args(&["-a", "!"]).run().status_code(1); +} + +#[test] +fn test_not_and_is_false() { + // `-a` is a literal here & has nonzero length + new_ucmd!().args(&["!", "-a"]).run().status_code(1); +} + +#[test] +fn test_not_and_not_succeeds() { + new_ucmd!().args(&["!", "-a", "!"]).succeeds(); +} + +#[test] +fn test_simple_or() { + new_ucmd!().args(&["foo", "-o", ""]).succeeds(); +} + +#[test] +fn test_negated_or() { + new_ucmd!() + .args(&["!", "foo", "-o", "bar"]) + .run() + .status_code(1); + new_ucmd!().args(&["foo", "-o", "!", "bar"]).succeeds(); + new_ucmd!() + .args(&["!", "foo", "-o", "!", "bar"]) + .run() + .status_code(1); +} + +#[test] +fn test_strlen_of_nothing() { + // odd but matches GNU, which must interpret -n as a literal here + new_ucmd!().arg("-n").succeeds(); +} + +#[test] +fn test_strlen_of_empty() { + new_ucmd!().args(&["-n", ""]).run().status_code(1); + + // STRING equivalent to -n STRING + new_ucmd!().arg("").run().status_code(1); +} + +#[test] +fn test_nothing_is_empty() { + // -z is a literal here and has nonzero length + new_ucmd!().arg("-z").succeeds(); +} + +#[test] +fn test_zero_len_of_empty() { + new_ucmd!().args(&["-z", ""]).succeeds(); +} + +#[test] +fn test_solo_paren_is_literal() { + let scenario = TestScenario::new(util_name!()); + let tests = [["("], [")"]]; + + for test in &tests { + scenario.ucmd().args(&test[..]).succeeds(); + } +} + +#[test] +fn test_solo_empty_parenthetical_is_error() { + new_ucmd!().args(&["(", ")"]).run().status_code(2); +} + +#[test] +fn test_zero_len_equals_zero_len() { + new_ucmd!().args(&["", "=", ""]).succeeds(); +} + +#[test] +fn test_zero_len_not_equals_zero_len_is_false() { + new_ucmd!().args(&["", "!=", ""]).run().status_code(1); +} + +#[test] +fn test_double_equal_is_string_comparison_op() { + // undocumented but part of the GNU test suite + new_ucmd!().args(&["t", "==", "t"]).succeeds(); + new_ucmd!().args(&["t", "==", "f"]).run().status_code(1); +} + +#[test] +fn test_string_comparison() { + let scenario = TestScenario::new(util_name!()); + let tests = [ + ["foo", "!=", "bar"], + ["contained\nnewline", "=", "contained\nnewline"], + ["(", "=", "("], + ["(", "!=", ")"], + ["!", "=", "!"], + ["=", "=", "="], + ]; + + for test in &tests { + scenario.ucmd().args(&test[..]).succeeds(); + } + + // run the inverse of all these tests + for test in &tests { + scenario + .ucmd() + .arg("!") + .args(&test[..]) + .run() + .status_code(1); + } +} + +#[test] +#[ignore = "fixme: error reporting"] +fn test_dangling_string_comparison_is_error() { + new_ucmd!() + .args(&["missing_something", "="]) + .run() + .status_code(2) + .stderr_is("test: missing argument after ‘=’"); +} + +#[test] +fn test_stringop_is_literal_after_bang() { + let scenario = TestScenario::new(util_name!()); + let tests = [ + ["!", "="], + ["!", "!="], + ["!", "-eq"], + ["!", "-ne"], + ["!", "-lt"], + ["!", "-le"], + ["!", "-gt"], + ["!", "-ge"], + ["!", "-ef"], + ["!", "-nt"], + ["!", "-ot"], + ]; + + for test in &tests { + scenario.ucmd().args(&test[..]).run().status_code(1); + } +} + +#[test] +fn test_a_bunch_of_not() { + new_ucmd!() + .args(&["!", "", "!=", "", "-a", "!", "", "!=", ""]) + .succeeds(); +} + +#[test] +fn test_pseudofloat_equal() { + new_ucmd!().args(&["123.45", "=", "123.45"]).succeeds(); +} + +#[test] +fn test_pseudofloat_not_equal() { + new_ucmd!().args(&["123.45", "!=", "123.450"]).succeeds(); +} + +#[test] +fn test_negative_arg_is_a_string() { + new_ucmd!().arg("-12345").succeeds(); + new_ucmd!().arg("--qwert").succeeds(); +} + +#[test] +fn test_some_int_compares() { + let scenario = TestScenario::new(util_name!()); + + let tests = [ + ["0", "-eq", "0"], + ["0", "-ne", "1"], + ["421", "-lt", "3720"], + ["0", "-le", "0"], + ["11", "-gt", "10"], + ["1024", "-ge", "512"], + ["9223372036854775806", "-le", "9223372036854775807"], + ]; + + for test in &tests { + scenario.ucmd().args(&test[..]).succeeds(); + } +} + +#[test] +#[ignore = "fixme: evaluation error (code 1); GNU returns 0"] +fn test_values_greater_than_i64_allowed() { + new_ucmd!() + .args(&["9223372036854775808", "-gt", "0"]) + .succeeds(); +} + +#[test] +fn test_negative_int_compare() { + let scenario = TestScenario::new(util_name!()); + + let tests = [ + ["-1", "-eq", "-1"], + ["-1", "-ne", "-2"], + ["-3720", "-lt", "-421"], + ["-10", "-le", "-10"], + ["-21", "-gt", "-22"], + ["-128", "-ge", "-256"], + ["-9223372036854775808", "-le", "-9223372036854775807"], + ]; + + for test in &tests { + scenario.ucmd().args(&test[..]).succeeds(); + } +} + +#[test] +fn test_float_inequality_is_error() { + new_ucmd!() + .args(&["123.45", "-ge", "6"]) + .run() + .status_code(2) + .stderr_is("test: invalid integer ‘123.45’"); +} + +#[test] +#[cfg(not(windows))] +fn test_invalid_utf8_integer_compare() { + use std::ffi::OsStr; + use std::os::unix::ffi::OsStrExt; + + let source = [0x66, 0x6f, 0x80, 0x6f]; + let arg = OsStr::from_bytes(&source[..]); + + let mut cmd = new_ucmd!(); + cmd.arg("123").arg("-ne"); + cmd.raw.arg(arg); + + cmd.run() + .status_code(2) + .stderr_is("test: invalid integer ‘fo�o’"); + + let mut cmd = new_ucmd!(); + cmd.raw.arg(arg); + cmd.arg("-eq").arg("456"); + + cmd.run() + .status_code(2) + .stderr_is("test: invalid integer ‘fo�o’"); +} + +#[test] +#[ignore = "fixme: parse/evaluation error (code 2); GNU returns 1"] +fn test_file_is_itself() { + new_ucmd!() + .args(&["regular_file", "-ef", "regular_file"]) + .succeeds(); +} + +#[test] +#[ignore = "fixme: parse/evaluation error (code 2); GNU returns 1"] +fn test_file_is_newer_than_and_older_than_itself() { + // odd but matches GNU + new_ucmd!() + .args(&["regular_file", "-nt", "regular_file"]) + .run() + .status_code(1); + new_ucmd!() + .args(&["regular_file", "-ot", "regular_file"]) + .run() + .status_code(1); +} + +#[test] +#[ignore = "todo: implement these"] +fn test_newer_file() { + let scenario = TestScenario::new(util_name!()); + + scenario.cmd("touch").arg("newer_file").succeeds(); + scenario + .cmd("touch") + .args(&["-m", "-d", "last Thursday", "regular_file"]) + .succeeds(); + + scenario + .ucmd() + .args(&["newer_file", "-nt", "regular_file"]) + .succeeds(); + scenario + .ucmd() + .args(&["regular_file", "-ot", "newer_file"]) + .succeeds(); +} + +#[test] +fn test_file_exists() { + new_ucmd!().args(&["-e", "regular_file"]).succeeds(); +} + +#[test] +fn test_nonexistent_file_does_not_exist() { + new_ucmd!() + .args(&["-e", "nonexistent_file"]) + .run() + .status_code(1); +} + +#[test] +fn test_nonexistent_file_is_not_regular() { + new_ucmd!() + .args(&["-f", "nonexistent_file"]) + .run() + .status_code(1); +} + +#[test] +fn test_file_exists_and_is_regular() { + new_ucmd!().args(&["-f", "regular_file"]).succeeds(); +} + +#[test] +#[cfg(not(windows))] // FIXME: implement on Windows +fn test_file_is_readable() { + new_ucmd!().args(&["-r", "regular_file"]).succeeds(); +} + +#[test] +#[cfg(not(windows))] // FIXME: implement on Windows +fn test_file_is_not_readable() { + let scenario = TestScenario::new(util_name!()); + let mut ucmd = scenario.ucmd(); + let mut chmod = scenario.cmd("chmod"); + + scenario.fixtures.touch("crypto_file"); + chmod.args(&["u-r", "crypto_file"]).succeeds(); + + ucmd.args(&["!", "-r", "crypto_file"]).succeeds(); +} + +#[test] +#[cfg(not(windows))] // FIXME: implement on Windows +fn test_file_is_writable() { + new_ucmd!().args(&["-w", "regular_file"]).succeeds(); +} + +#[test] +#[cfg(not(windows))] // FIXME: implement on Windows +fn test_file_is_not_writable() { + let scenario = TestScenario::new(util_name!()); + let mut ucmd = scenario.ucmd(); + let mut chmod = scenario.cmd("chmod"); + + scenario.fixtures.touch("immutable_file"); + chmod.args(&["u-w", "immutable_file"]).succeeds(); + + ucmd.args(&["!", "-w", "immutable_file"]).succeeds(); +} + +#[test] +fn test_file_is_not_executable() { + new_ucmd!().args(&["!", "-x", "regular_file"]).succeeds(); +} + +#[test] +#[cfg(not(windows))] // FIXME: implement on Windows +fn test_file_is_executable() { + let scenario = TestScenario::new(util_name!()); + let mut chmod = scenario.cmd("chmod"); + + chmod.args(&["u+x", "regular_file"]).succeeds(); + + scenario.ucmd().args(&["-x", "regular_file"]).succeeds(); +} + +#[test] +fn test_is_not_empty() { + new_ucmd!().args(&["-s", "non_empty_file"]).succeeds(); +} + +#[test] +fn test_nonexistent_file_size_test_is_false() { + new_ucmd!() + .args(&["-s", "nonexistent_file"]) + .run() + .status_code(1); +} + +#[test] +fn test_not_is_not_empty() { + new_ucmd!().args(&["!", "-s", "regular_file"]).succeeds(); +} + +#[test] +#[cfg(not(windows))] +fn test_symlink_is_symlink() { + let scenario = TestScenario::new(util_name!()); + let at = &scenario.fixtures; + + at.symlink_file("regular_file", "symlink"); + + // FIXME: implement on Windows + scenario.ucmd().args(&["-h", "symlink"]).succeeds(); + scenario.ucmd().args(&["-L", "symlink"]).succeeds(); +} + +#[test] +fn test_file_is_not_symlink() { + let scenario = TestScenario::new(util_name!()); + + scenario + .ucmd() + .args(&["!", "-h", "regular_file"]) + .succeeds(); + scenario + .ucmd() + .args(&["!", "-L", "regular_file"]) + .succeeds(); +} + +#[test] +fn test_nonexistent_file_is_not_symlink() { + let scenario = TestScenario::new(util_name!()); + + scenario + .ucmd() + .args(&["!", "-h", "nonexistent_file"]) + .succeeds(); + scenario + .ucmd() + .args(&["!", "-L", "nonexistent_file"]) + .succeeds(); +} + #[test] fn test_op_prec_and_or_1() { new_ucmd!().args(&[" ", "-o", "", "-a", ""]).succeeds(); } +#[test] +fn test_op_prec_and_or_1_overridden_by_parentheses() { + new_ucmd!() + .args(&["(", " ", "-o", "", ")", "-a", ""]) + .run() + .status_code(1); +} + #[test] fn test_op_prec_and_or_2() { new_ucmd!() @@ -22,6 +495,129 @@ fn test_op_prec_and_or_2() { } #[test] -fn test_or_as_filename() { - new_ucmd!().args(&["x", "-a", "-z", "-o"]).fails(); +fn test_op_prec_and_or_2_overridden_by_parentheses() { + new_ucmd!() + .args(&["", "-a", "(", "", "-o", " ", ")", "-a", " "]) + .run() + .status_code(1); +} + +#[test] +fn test_negated_boolean_precedence() { + let scenario = TestScenario::new(util_name!()); + + let tests = [ + vec!["!", "(", "foo", ")", "-o", "bar"], + vec!["!", "", "-o", "", "-a", ""], + vec!["!", "(", "", "-a", "", ")", "-o", ""], + ]; + + for test in &tests { + scenario.ucmd().args(&test[..]).succeeds(); + } + + let negative_tests = [ + vec!["!", "-n", "", "-a", ""], + vec!["", "-a", "", "-o", ""], + vec!["!", "", "-a", "", "-o", ""], + vec!["!", "(", "", "-a", "", ")", "-a", ""], + ]; + + for test in &negative_tests { + scenario.ucmd().args(&test[..]).run().status_code(1); + } +} + +#[test] +fn test_bang_boolop_precedence() { + // For a Boolean combination of two literals, bang inverts the entire expression + new_ucmd!().args(&["!", "", "-a", ""]).succeeds(); + new_ucmd!().args(&["!", "", "-o", ""]).succeeds(); + + new_ucmd!() + .args(&["!", "a value", "-o", "another value"]) + .run() + .status_code(1); + + // Introducing a UOP — even one that is equivalent to a bare string — causes + // bang to invert only the first term + new_ucmd!() + .args(&["!", "-n", "", "-a", ""]) + .run() + .status_code(1); + new_ucmd!() + .args(&["!", "", "-a", "-n", ""]) + .run() + .status_code(1); + + // for compound Boolean expressions, bang inverts the _next_ expression + // only, not the entire compound expression + new_ucmd!() + .args(&["!", "", "-a", "", "-a", ""]) + .run() + .status_code(1); + + // parentheses can override this + new_ucmd!() + .args(&["!", "(", "", "-a", "", "-a", "", ")"]) + .succeeds(); +} + +#[test] +fn test_inverted_parenthetical_boolop_precedence() { + // For a Boolean combination of two literals, bang inverts the entire expression + new_ucmd!() + .args(&["!", "a value", "-o", "another value"]) + .run() + .status_code(1); + + // only the parenthetical is inverted, not the entire expression + new_ucmd!() + .args(&["!", "(", "a value", ")", "-o", "another value"]) + .succeeds(); +} + +#[test] +#[ignore = "fixme: error reporting"] +fn test_dangling_parenthesis() { + new_ucmd!() + .args(&["(", "(", "a", "!=", "b", ")", "-o", "-n", "c"]) + .run() + .status_code(2); + new_ucmd!() + .args(&["(", "(", "a", "!=", "b", ")", "-o", "-n", "c", ")"]) + .succeeds(); +} + +#[test] +fn test_complicated_parenthesized_expression() { + new_ucmd!() + .args(&[ + "(", "(", "!", "(", "a", "=", "b", ")", "-o", "c", "=", "d", ")", "-a", "(", "q", "!=", + "r", ")", ")", + ]) + .succeeds(); +} + +#[test] +fn test_erroneous_parenthesized_expression() { + new_ucmd!() + .args(&["a", "!=", "(", "b", "-a", "b", ")", "!=", "c"]) + .run() + .status_code(2) + .stderr_is("test: extra argument ‘b’"); +} + +#[test] +fn test_or_as_filename() { + new_ucmd!() + .args(&["x", "-a", "-z", "-o"]) + .run() + .status_code(1); +} + +#[test] +#[ignore = "GNU considers this an error"] +fn test_strlen_and_nothing() { + new_ucmd!().args(&["-n", "a", "-a"]).run().status_code(2); } diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index 9921c16b5..40fbb8aa9 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -29,6 +29,7 @@ fn set_file_times(at: &AtPath, path: &str, atime: FileTime, mtime: FileTime) { fn str_to_filetime(format: &str, s: &str) -> FileTime { let mut tm = time::strptime(s, format).unwrap(); tm.tm_utcoff = time::now().tm_utcoff; + tm.tm_isdst = -1; // Unknown flag DST let ts = tm.to_timespec(); FileTime::from_unix_time(ts.sec as i64, ts.nsec as u32) } @@ -352,3 +353,72 @@ fn test_touch_set_date() { assert_eq!(atime, start_of_year); assert_eq!(mtime, start_of_year); } + +#[test] +fn test_touch_mtime_dst_succeeds() { + let (at, mut ucmd) = at_and_ucmd!(); + let file = "test_touch_set_mtime_dst_succeeds"; + + ucmd.args(&["-m", "-t", "202103140300", file]) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(file)); + + let target_time = str_to_filetime("%Y%m%d%H%M", "202103140300"); + let (_, mtime) = get_file_times(&at, file); + assert!(target_time == mtime); +} + +// is_dst_switch_hour returns true if timespec ts is just before the switch +// to Daylight Saving Time. +// For example, in EST (UTC-5), Timespec { sec: 1583647200, nsec: 0 } +// for March 8 2020 01:00:00 AM +// is just before the switch because on that day clock jumps by 1 hour, +// so 1 minute after 01:59:00 is 03:00:00. +fn is_dst_switch_hour(ts: time::Timespec) -> bool { + let ts_after = ts + time::Duration::hours(1); + let tm = time::at(ts); + let tm_after = time::at(ts_after); + tm_after.tm_hour == tm.tm_hour + 2 +} + +// get_dstswitch_hour returns date string for which touch -m -t fails. +// For example, in EST (UTC-5), that will be "202003080200" so +// touch -m -t 202003080200 somefile +// fails (that date/time does not exist). +// In other locales it will be a different date/time, and in some locales +// it doesn't exist at all, in which case this function will return None. +fn get_dstswitch_hour() -> Option { + let now = time::now(); + // Start from January 1, 2020, 00:00. + let mut tm = time::strptime("20200101-0000", "%Y%m%d-%H%M").unwrap(); + tm.tm_isdst = -1; + tm.tm_utcoff = now.tm_utcoff; + let mut ts = tm.to_timespec(); + // Loop through all hours in year 2020 until we find the hour just + // before the switch to DST. + for _i in 0..(366 * 24) { + if is_dst_switch_hour(ts) { + let mut tm = time::at(ts); + tm.tm_hour = tm.tm_hour + 1; + let s = time::strftime("%Y%m%d%H%M", &tm).unwrap().to_string(); + return Some(s); + } + ts = ts + time::Duration::hours(1); + } + None +} + +#[test] +fn test_touch_mtime_dst_fails() { + let (_at, mut ucmd) = at_and_ucmd!(); + let file = "test_touch_set_mtime_dst_fails"; + + match get_dstswitch_hour() { + Some(s) => { + ucmd.args(&["-m", "-t", &s, file]).fails(); + } + None => (), + } +} diff --git a/tests/by-util/test_tr.rs b/tests/by-util/test_tr.rs index a1500bcf6..29712b44a 100644 --- a/tests/by-util/test_tr.rs +++ b/tests/by-util/test_tr.rs @@ -45,6 +45,70 @@ fn test_delete_complement() { .stdout_is("ac"); } +#[test] +fn test_delete_complement_2() { + new_ucmd!() + .args(&["-d", "-C", "0-9"]) + .pipe_in("Phone: 01234 567890") + .succeeds() + .stdout_is("01234567890"); + new_ucmd!() + .args(&["-d", "--complement", "0-9"]) + .pipe_in("Phone: 01234 567890") + .succeeds() + .stdout_is("01234567890"); +} + +#[test] +fn test_complement1() { + new_ucmd!() + .args(&["-c", "a", "X"]) + .pipe_in("ab") + .run() + .stdout_is("aX"); +} + +#[test] +fn test_complement2() { + new_ucmd!() + .args(&["-c", "0-9", "x"]) + .pipe_in("Phone: 01234 567890") + .run() + .stdout_is("xxxxxxx01234x567890"); +} + +#[test] +fn test_complement3() { + new_ucmd!() + .args(&["-c", "abcdefgh", "123"]) + .pipe_in("the cat and the bat") + .run() + .stdout_is("3he3ca33a3d33he3ba3"); +} + +#[test] +fn test_complement4() { + // $ echo -n '0x1y2z3' | tr -c '0-@' '*-~' + // 0~1~2~3 + new_ucmd!() + .args(&["-c", "0-@", "*-~"]) + .pipe_in("0x1y2z3") + .run() + .stdout_is("0~1~2~3"); +} + +#[test] +#[ignore = "fixme: GNU tr returns '0a1b2c3' instead of '0~1~2~3', see #2158"] +fn test_complement5() { + // $ echo '0x1y2z3' | tr -c '\0-@' '*-~' + // 0a1b2c3 + new_ucmd!() + .args(&["-c", "\\0-@", "*-~"]) + .pipe_in("0x1y2z3") + .run() + .stdout_is("0a1b2c3"); +} + #[test] fn test_squeeze() { new_ucmd!() @@ -63,6 +127,24 @@ fn test_squeeze_complement() { .stdout_is("aaBcDcc"); } +#[test] +fn test_translate_and_squeeze() { + new_ucmd!() + .args(&["-s", "x", "y"]) + .pipe_in("xx") + .run() + .stdout_is("y"); +} + +#[test] +fn test_translate_and_squeeze_multiple_lines() { + new_ucmd!() + .args(&["-s", "x", "y"]) + .pipe_in("xxaax\nxaaxx") + .run() + .stdout_is("yaay\nyaay"); +} + #[test] fn test_delete_and_squeeze() { new_ucmd!() @@ -120,19 +202,15 @@ fn test_truncate_with_set1_shorter_than_set2() { #[test] fn missing_args_fails() { let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.run(); - - assert!(!result.success); - assert!(result.stderr.contains("missing operand")); + ucmd.fails().stderr_contains("missing operand"); } #[test] fn missing_required_second_arg_fails() { let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.args(&["foo"]).run(); - - assert!(!result.success); - assert!(result.stderr.contains("missing operand after")); + ucmd.args(&["foo"]) + .fails() + .stderr_contains("missing operand after"); } #[test] diff --git a/tests/by-util/test_truncate.rs b/tests/by-util/test_truncate.rs index ce7964d57..6323b058f 100644 --- a/tests/by-util/test_truncate.rs +++ b/tests/by-util/test_truncate.rs @@ -6,26 +6,41 @@ static TFILE2: &'static str = "truncate_test_2"; #[test] fn test_increase_file_size() { + let expected = 5 * 1024; let (at, mut ucmd) = at_and_ucmd!(); let mut file = at.make_file(TFILE1); ucmd.args(&["-s", "+5K", TFILE1]).succeeds(); file.seek(SeekFrom::End(0)).unwrap(); - assert!(file.seek(SeekFrom::Current(0)).unwrap() == 5 * 1024); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); } #[test] fn test_increase_file_size_kb() { + let expected = 5 * 1000; let (at, mut ucmd) = at_and_ucmd!(); let mut file = at.make_file(TFILE1); ucmd.args(&["-s", "+5KB", TFILE1]).succeeds(); file.seek(SeekFrom::End(0)).unwrap(); - assert!(file.seek(SeekFrom::Current(0)).unwrap() == 5 * 1000); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); } #[test] fn test_reference() { + let expected = 5 * 1000; let scene = TestScenario::new(util_name!()); let at = &scene.fixtures; let mut file = at.make_file(TFILE2); @@ -40,17 +55,47 @@ fn test_reference() { .run(); file.seek(SeekFrom::End(0)).unwrap(); - assert!(file.seek(SeekFrom::Current(0)).unwrap() == 5 * 1000); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); } #[test] fn test_decrease_file_size() { + let expected = 6; let (at, mut ucmd) = at_and_ucmd!(); let mut file = at.make_file(TFILE2); file.write_all(b"1234567890").unwrap(); ucmd.args(&["--size=-4", TFILE2]).succeeds(); file.seek(SeekFrom::End(0)).unwrap(); - assert!(file.seek(SeekFrom::Current(0)).unwrap() == 6); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); +} + +#[test] +fn test_space_in_size() { + let expected = 4; + let (at, mut ucmd) = at_and_ucmd!(); + let mut file = at.make_file(TFILE2); + file.write_all(b"1234567890").unwrap(); + ucmd.args(&["--size", " 4", TFILE2]).succeeds(); + file.seek(SeekFrom::End(0)).unwrap(); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); } #[test] @@ -69,3 +114,159 @@ fn test_failed_incorrect_arg() { let (_at, mut ucmd) = at_and_ucmd!(); ucmd.args(&["-s", "+5A", TFILE1]).fails(); } + +#[test] +fn test_at_most_shrinks() { + let expected = 4; + let (at, mut ucmd) = at_and_ucmd!(); + let mut file = at.make_file(TFILE2); + file.write_all(b"1234567890").unwrap(); + ucmd.args(&["--size", "<4", TFILE2]).succeeds(); + file.seek(SeekFrom::End(0)).unwrap(); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); +} + +#[test] +fn test_at_most_no_change() { + let expected = 10; + let (at, mut ucmd) = at_and_ucmd!(); + let mut file = at.make_file(TFILE2); + file.write_all(b"1234567890").unwrap(); + ucmd.args(&["--size", "<40", TFILE2]).succeeds(); + file.seek(SeekFrom::End(0)).unwrap(); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); +} + +#[test] +fn test_at_least_grows() { + let expected = 15; + let (at, mut ucmd) = at_and_ucmd!(); + let mut file = at.make_file(TFILE2); + file.write_all(b"1234567890").unwrap(); + ucmd.args(&["--size", ">15", TFILE2]).succeeds(); + file.seek(SeekFrom::End(0)).unwrap(); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); +} + +#[test] +fn test_at_least_no_change() { + let expected = 10; + let (at, mut ucmd) = at_and_ucmd!(); + let mut file = at.make_file(TFILE2); + file.write_all(b"1234567890").unwrap(); + ucmd.args(&["--size", ">4", TFILE2]).succeeds(); + file.seek(SeekFrom::End(0)).unwrap(); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); +} + +#[test] +fn test_round_down() { + let expected = 8; + let (at, mut ucmd) = at_and_ucmd!(); + let mut file = at.make_file(TFILE2); + file.write_all(b"1234567890").unwrap(); + ucmd.args(&["--size", "/4", TFILE2]).succeeds(); + file.seek(SeekFrom::End(0)).unwrap(); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); +} + +#[test] +fn test_round_up() { + let expected = 12; + let (at, mut ucmd) = at_and_ucmd!(); + let mut file = at.make_file(TFILE2); + file.write_all(b"1234567890").unwrap(); + ucmd.args(&["--size", "%4", TFILE2]).succeeds(); + file.seek(SeekFrom::End(0)).unwrap(); + let actual = file.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); +} + +#[test] +fn test_size_and_reference() { + let expected = 15; + let (at, mut ucmd) = at_and_ucmd!(); + let mut file1 = at.make_file(TFILE1); + let mut file2 = at.make_file(TFILE2); + file1.write_all(b"1234567890").unwrap(); + ucmd.args(&["--reference", TFILE1, "--size", "+5", TFILE2]) + .succeeds(); + file2.seek(SeekFrom::End(0)).unwrap(); + let actual = file2.seek(SeekFrom::Current(0)).unwrap(); + assert!( + expected == actual, + "expected '{}' got '{}'", + expected, + actual + ); +} + +#[test] +fn test_invalid_numbers() { + // TODO For compatibility with GNU, `truncate -s 0X` should cause + // the same error as `truncate -s 0X file`, but currently it returns + // a different error. + new_ucmd!() + .args(&["-s", "0X", "file"]) + .fails() + .stderr_contains("Invalid number: ‘0X’"); + new_ucmd!() + .args(&["-s", "0XB", "file"]) + .fails() + .stderr_contains("Invalid number: ‘0XB’"); + new_ucmd!() + .args(&["-s", "0B", "file"]) + .fails() + .stderr_contains("Invalid number: ‘0B’"); +} + +#[test] +fn test_reference_file_not_found() { + new_ucmd!() + .args(&["-r", "a", "b"]) + .fails() + .stderr_contains("cannot stat 'a': No such file or directory"); +} + +#[test] +fn test_reference_with_size_file_not_found() { + new_ucmd!() + .args(&["-r", "a", "-s", "+1", "b"]) + .fails() + .stderr_contains("cannot stat 'a': No such file or directory"); +} diff --git a/tests/by-util/test_tsort.rs b/tests/by-util/test_tsort.rs index 159b80025..0da6f44e4 100644 --- a/tests/by-util/test_tsort.rs +++ b/tests/by-util/test_tsort.rs @@ -18,33 +18,35 @@ fn test_sort_self_loop() { #[test] fn test_no_such_file() { - let result = new_ucmd!().arg("invalid_file_txt").run(); - - assert_eq!(true, result.stderr.contains("No such file or directory")); + new_ucmd!() + .arg("invalid_file_txt") + .fails() + .stderr_contains("No such file or directory"); } #[test] fn test_version_flag() { - let version_short = new_ucmd!().arg("-V").run(); - let version_long = new_ucmd!().arg("--version").run(); + let version_short = new_ucmd!().arg("-V").succeeds(); + let version_long = new_ucmd!().arg("--version").succeeds(); - assert_eq!(version_short.stdout, version_long.stdout); + assert_eq!(version_short.stdout_str(), version_long.stdout_str()); } #[test] fn test_help_flag() { - let help_short = new_ucmd!().arg("-h").run(); - let help_long = new_ucmd!().arg("--help").run(); + let help_short = new_ucmd!().arg("-h").succeeds(); + let help_long = new_ucmd!().arg("--help").succeeds(); - assert_eq!(help_short.stdout, help_long.stdout); + assert_eq!(help_short.stdout_str(), help_long.stdout_str()); } #[test] fn test_multiple_arguments() { - let result = new_ucmd!() + new_ucmd!() .arg("call_graph.txt") - .arg("invalid_file.txt") - .run(); - - assert_eq!(true, result.stderr.contains("error: Found argument 'invalid_file.txt' which wasn't expected, or isn't valid in this context")) + .arg("invalid_file") + .fails() + .stderr_contains( + "Found argument 'invalid_file' which wasn't expected, or isn't valid in this context", + ); } diff --git a/tests/by-util/test_uname.rs b/tests/by-util/test_uname.rs index f0e32b430..d878ed7ac 100644 --- a/tests/by-util/test_uname.rs +++ b/tests/by-util/test_uname.rs @@ -2,60 +2,46 @@ use crate::common::util::*; #[test] fn test_uname_compatible() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("-a").run(); - assert!(result.success); + new_ucmd!().arg("-a").succeeds(); } #[test] fn test_uname_name() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("-n").run(); - assert!(result.success); + new_ucmd!().arg("-n").succeeds(); } #[test] fn test_uname_processor() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("-p").run(); - assert!(result.success); - assert_eq!(result.stdout.trim_end(), "unknown"); + let result = new_ucmd!().arg("-p").succeeds(); + assert_eq!(result.stdout_str().trim_end(), "unknown"); } #[test] fn test_uname_hwplatform() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("-i").run(); - assert!(result.success); - assert_eq!(result.stdout.trim_end(), "unknown"); + let result = new_ucmd!().arg("-i").succeeds(); + assert_eq!(result.stdout_str().trim_end(), "unknown"); } #[test] fn test_uname_machine() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("-m").run(); - assert!(result.success); + new_ucmd!().arg("-m").succeeds(); } #[test] fn test_uname_kernel_version() { - let (_, mut ucmd) = at_and_ucmd!(); - - let result = ucmd.arg("-v").run(); - assert!(result.success); + new_ucmd!().arg("-v").succeeds(); } #[test] fn test_uname_kernel() { let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.arg("-o").run(); - assert!(result.success); #[cfg(target_os = "linux")] - assert!(result.stdout.to_lowercase().contains("linux")); + { + let result = ucmd.arg("-o").succeeds(); + assert!(result.stdout_str().to_lowercase().contains("linux")); + } + + #[cfg(not(target_os = "linux"))] + ucmd.arg("-o").succeeds(); } diff --git a/tests/by-util/test_uniq.rs b/tests/by-util/test_uniq.rs index c1e53faf3..2645c38ca 100644 --- a/tests/by-util/test_uniq.rs +++ b/tests/by-util/test_uniq.rs @@ -145,7 +145,7 @@ fn test_invalid_utf8() { .arg("not-utf8-sequence.txt") .run() .failure() - .stderr_only("uniq: error: invalid utf-8 sequence of 1 bytes from index 0"); + .stderr_only("uniq: invalid utf-8 sequence of 1 bytes from index 0"); } #[test] diff --git a/tests/by-util/test_unlink.rs b/tests/by-util/test_unlink.rs index fa8f962c4..1999e965c 100644 --- a/tests/by-util/test_unlink.rs +++ b/tests/by-util/test_unlink.rs @@ -22,7 +22,7 @@ fn test_unlink_multiple_files() { at.touch(file_b); ucmd.arg(file_a).arg(file_b).fails().stderr_is( - "unlink: error: extra operand: 'test_unlink_multiple_file_b'\nTry 'unlink --help' \ + "unlink: extra operand: 'test_unlink_multiple_file_b'\nTry 'unlink --help' \ for more information.\n", ); } @@ -35,7 +35,7 @@ fn test_unlink_directory() { at.mkdir(dir); ucmd.arg(dir).fails().stderr_is( - "unlink: error: cannot unlink 'test_unlink_empty_directory': Not a regular file \ + "unlink: cannot unlink 'test_unlink_empty_directory': Not a regular file \ or symlink\n", ); } @@ -45,7 +45,7 @@ fn test_unlink_nonexistent() { let file = "test_unlink_nonexistent"; new_ucmd!().arg(file).fails().stderr_is( - "unlink: error: Cannot stat 'test_unlink_nonexistent': No such file or directory \ + "unlink: Cannot stat 'test_unlink_nonexistent': No such file or directory \ (os error 2)\n", ); } diff --git a/tests/by-util/test_uptime.rs b/tests/by-util/test_uptime.rs index c8f6a11d3..d20ad90c9 100644 --- a/tests/by-util/test_uptime.rs +++ b/tests/by-util/test_uptime.rs @@ -4,33 +4,23 @@ use crate::common::util::*; #[test] fn test_uptime() { - let result = TestScenario::new(util_name!()).ucmd_keepenv().run(); + TestScenario::new(util_name!()) + .ucmd_keepenv() + .succeeds() + .stdout_contains("load average:") + .stdout_contains(" up "); - println!("stdout = {}", result.stdout); - println!("stderr = {}", result.stderr); - - assert!(result.success); - assert!(result.stdout.contains("load average:")); - assert!(result.stdout.contains(" up ")); // Don't check for users as it doesn't show in some CI } #[test] fn test_uptime_since() { - let scene = TestScenario::new(util_name!()); - - let result = scene.ucmd().arg("--since").succeeds(); - - println!("stdout = {}", result.stdout); - println!("stderr = {}", result.stderr); - - assert!(result.success); let re = Regex::new(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}").unwrap(); - assert!(re.is_match(&result.stdout.trim())); + + new_ucmd!().arg("--since").succeeds().stdout_matches(&re); } #[test] fn test_failed() { - let (_at, mut ucmd) = at_and_ucmd!(); - ucmd.arg("willfail").fails(); + new_ucmd!().arg("willfail").fails(); } diff --git a/tests/by-util/test_users.rs b/tests/by-util/test_users.rs index cb444b8be..89c3fdd0f 100644 --- a/tests/by-util/test_users.rs +++ b/tests/by-util/test_users.rs @@ -1,30 +1,23 @@ use crate::common::util::*; -use std::env; #[test] fn test_users_noarg() { - let (_, mut ucmd) = at_and_ucmd!(); - let result = ucmd.run(); - assert!(result.success); + new_ucmd!().succeeds(); } + #[test] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] fn test_users_check_name() { - let result = TestScenario::new(util_name!()).ucmd_keepenv().run(); - assert!(result.success); + #[cfg(target_os = "linux")] + let util_name = util_name!(); + #[cfg(target_vendor = "apple")] + let util_name = format!("g{}", util_name!()); - // Expectation: USER is often set - let key = "USER"; + let expected = TestScenario::new(&util_name) + .cmd_keepenv(util_name) + .env("LANGUAGE", "C") + .succeeds() + .stdout_move_str(); - match env::var(key) { - Err(e) => println!("Key {} isn't set. Found {}", &key, e), - Ok(username) => - // Check if "users" contains the name of the user - { - println!("username found {}", &username); - println!("result.stdout {}", &result.stdout); - if !&result.stdout.is_empty() { - assert!(result.stdout.contains(&username)) - } - } - } + new_ucmd!().succeeds().stdout_is(&expected); } diff --git a/tests/by-util/test_wc.rs b/tests/by-util/test_wc.rs index fc1665efc..1203c0b1d 100644 --- a/tests/by-util/test_wc.rs +++ b/tests/by-util/test_wc.rs @@ -1,11 +1,48 @@ use crate::common::util::*; +#[test] +fn test_count_bytes_large_stdin() { + for &n in &[ + 0, + 1, + 42, + 16 * 1024 - 7, + 16 * 1024 - 1, + 16 * 1024, + 16 * 1024 + 1, + 16 * 1024 + 3, + 32 * 1024, + 64 * 1024, + 80 * 1024, + 96 * 1024, + 112 * 1024, + 128 * 1024, + ] { + let data = vec_of_size(n); + let expected = format!("{}\n", n); + new_ucmd!() + .args(&["-c"]) + .pipe_in(data) + .succeeds() + .stdout_is_bytes(&expected.as_bytes()); + } +} + #[test] fn test_stdin_default() { new_ucmd!() .pipe_in_fixture("lorem_ipsum.txt") .run() - .stdout_is(" 13 109 772\n"); + .stdout_is(" 13 109 772\n"); +} + +#[test] +fn test_stdin_explicit() { + new_ucmd!() + .pipe_in_fixture("lorem_ipsum.txt") + .arg("-") + .run() + .stdout_is(" 13 109 772 -\n"); } #[test] @@ -14,9 +51,11 @@ fn test_utf8() { .args(&["-lwmcL"]) .pipe_in_fixture("UTF_8_test.txt") .run() - .stdout_is(" 300 4969 22781 22213 79\n"); - // GNU returns " 300 2086 22219 22781 79" - // TODO: we should fix that to match GNU's behavior + .stdout_is(" 300 4969 22781 22213 79\n"); + // GNU returns " 300 2086 22219 22781 79" + // + // TODO: we should fix the word, character, and byte count to + // match the behavior of GNU wc } #[test] @@ -43,7 +82,7 @@ fn test_stdin_all_counts() { .args(&["-c", "-m", "-l", "-L", "-w"]) .pipe_in_fixture("alice_in_wonderland.txt") .run() - .stdout_is(" 5 57 302 302 66\n"); + .stdout_is(" 5 57 302 302 66\n"); } #[test] @@ -51,7 +90,7 @@ fn test_single_default() { new_ucmd!() .arg("moby_dick.txt") .run() - .stdout_is(" 18 204 1115 moby_dick.txt\n"); + .stdout_is(" 18 204 1115 moby_dick.txt\n"); } #[test] @@ -67,7 +106,7 @@ fn test_single_all_counts() { new_ucmd!() .args(&["-c", "-l", "-L", "-m", "-w", "alice_in_wonderland.txt"]) .run() - .stdout_is(" 5 57 302 302 66 alice_in_wonderland.txt\n"); + .stdout_is(" 5 57 302 302 66 alice_in_wonderland.txt\n"); } #[test] @@ -80,7 +119,101 @@ fn test_multiple_default() { ]) .run() .stdout_is( - " 13 109 772 lorem_ipsum.txt\n 18 204 1115 moby_dick.txt\n 5 57 302 \ - alice_in_wonderland.txt\n 36 370 2189 total\n", + " 13 109 772 lorem_ipsum.txt\n 18 204 1115 moby_dick.txt\n 5 57 302 \ + alice_in_wonderland.txt\n 36 370 2189 total\n", ); } + +/// Test for an empty file. +#[test] +fn test_file_empty() { + new_ucmd!() + .args(&["-clmwL", "emptyfile.txt"]) + .run() + .stdout_is("0 0 0 0 0 emptyfile.txt\n"); +} + +/// Test for an file containing a single non-whitespace character +/// *without* a trailing newline. +#[test] +fn test_file_single_line_no_trailing_newline() { + new_ucmd!() + .args(&["-clmwL", "notrailingnewline.txt"]) + .run() + .stdout_is("1 1 2 2 1 notrailingnewline.txt\n"); +} + +/// Test for a file that has 100 empty lines (that is, the contents of +/// the file are the newline character repeated one hundred times). +#[test] +fn test_file_many_empty_lines() { + new_ucmd!() + .args(&["-clmwL", "manyemptylines.txt"]) + .run() + .stdout_is("100 0 100 100 0 manyemptylines.txt\n"); +} + +/// Test for a file that has one long line comprising only spaces. +#[test] +fn test_file_one_long_line_only_spaces() { + new_ucmd!() + .args(&["-clmwL", "onelongemptyline.txt"]) + .run() + .stdout_is(" 1 0 10001 10001 10000 onelongemptyline.txt\n"); +} + +/// Test for a file that has one long line comprising a single "word". +#[test] +fn test_file_one_long_word() { + new_ucmd!() + .args(&["-clmwL", "onelongword.txt"]) + .run() + .stdout_is(" 1 1 10001 10001 10000 onelongword.txt\n"); +} + +/// Test that the number of bytes in the file dictate the display width. +/// +/// The width in digits of any count is the width in digits of the +/// number of bytes in the file, regardless of whether the number of +/// bytes are displayed. +#[test] +fn test_file_bytes_dictate_width() { + // This file has 10,001 bytes. Five digits are required to + // represent that. Even though the number of lines is 1 and the + // number of words is 0, each of those counts is formatted with + // five characters, filled with whitespace. + new_ucmd!() + .args(&["-lw", "onelongemptyline.txt"]) + .run() + .stdout_is(" 1 0 onelongemptyline.txt\n"); + + // This file has zero bytes. Only one digit is required to + // represent that. + new_ucmd!() + .args(&["-lw", "emptyfile.txt"]) + .run() + .stdout_is("0 0 emptyfile.txt\n"); +} + +/// Test that getting counts from a directory is an error. +#[test] +fn test_read_from_directory_error() { + // TODO To match GNU `wc`, the `stdout` should be: + // + // " 0 0 0 .\n" + // + new_ucmd!() + .args(&["."]) + .fails() + .stderr_contains(".: Is a directory\n") + .stdout_is("0 0 0 .\n"); +} + +/// Test that getting counts from nonexistent file is an error. +#[test] +fn test_read_from_nonexistent_file() { + new_ucmd!() + .args(&["bogusfile"]) + .fails() + .stderr_contains("bogusfile: No such file or directory\n"); +} diff --git a/tests/by-util/test_who.rs b/tests/by-util/test_who.rs index 89b7cec93..21b5eb93e 100644 --- a/tests/by-util/test_who.rs +++ b/tests/by-util/test_who.rs @@ -1,30 +1,36 @@ -#[cfg(target_os = "linux")] use crate::common::util::*; -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_count() { for opt in vec!["-q", "--count"] { - new_ucmd!().arg(opt).run().stdout_is(expected_result(opt)); + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); } } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_boot() { for opt in vec!["-b", "--boot"] { - new_ucmd!().arg(opt).run().stdout_is(expected_result(opt)); + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); } } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_heading() { - for opt in vec!["-H"] { + for opt in vec!["-H", "--heading"] { // allow whitespace variation - // * minor whitespace differences occur between platform built-in outputs; specifically number of TABs between "TIME" and "COMMENT" may be variant - let actual = new_ucmd!().arg(opt).run().stdout; - let expect = expected_result(opt); + // * minor whitespace differences occur between platform built-in outputs; + // specifically number of TABs between "TIME" and "COMMENT" may be variant + let actual = new_ucmd!().arg(opt).succeeds().stdout_move_str(); + let expect = expected_result(&[opt]); println!("actual: {:?}", actual); println!("expect: {:?}", expect); let v_actual: Vec<&str> = actual.split_whitespace().collect(); @@ -33,52 +39,208 @@ fn test_heading() { } } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_short() { for opt in vec!["-s", "--short"] { - new_ucmd!().arg(opt).run().stdout_is(expected_result(opt)); + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); } } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_login() { for opt in vec!["-l", "--login"] { - new_ucmd!().arg(opt).run().stdout_is(expected_result(opt)); + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); } } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_m() { for opt in vec!["-m"] { - new_ucmd!().arg(opt).run().stdout_is(expected_result(opt)); + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); } } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] +#[test] +fn test_process() { + for opt in vec!["-p", "--process"] { + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); + } +} + +#[test] +fn test_runlevel() { + for opt in vec!["-r", "--runlevel"] { + #[cfg(any(target_vendor = "apple", target_os = "linux"))] + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); + + #[cfg(not(target_os = "linux"))] + new_ucmd!().arg(opt).succeeds().stdout_is(""); + } +} + +#[cfg(any(target_vendor = "apple", target_os = "linux"))] +#[test] +fn test_time() { + for opt in vec!["-t", "--time"] { + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); + } +} + +#[cfg(any(target_vendor = "apple", target_os = "linux"))] +#[test] +fn test_mesg() { + // -T, -w, --mesg + // add user's message status as +, - or ? + // --message + // same as -T + // --writable + // same as -T + for opt in vec!["-T", "-w", "--mesg", "--message", "--writable"] { + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); + } +} + +#[test] +fn test_arg1_arg2() { + let args = ["am", "i"]; + + new_ucmd!() + .args(&args) + .succeeds() + .stdout_is(expected_result(&args)); +} + +#[test] +fn test_too_many_args() { + const EXPECTED: &str = + "error: The value 'u' was provided to '...', but it wasn't expecting any more values"; + + let args = ["am", "i", "u"]; + new_ucmd!().args(&args).fails().stderr_contains(EXPECTED); +} + +#[cfg(any(target_vendor = "apple", target_os = "linux"))] +#[test] +fn test_users() { + for opt in vec!["-u", "--users"] { + let actual = new_ucmd!().arg(opt).succeeds().stdout_move_str(); + let expect = expected_result(&[opt]); + println!("actual: {:?}", actual); + println!("expect: {:?}", expect); + + let mut v_actual: Vec<&str> = actual.split_whitespace().collect(); + let mut v_expect: Vec<&str> = expect.split_whitespace().collect(); + + // TODO: `--users` differs from GNU's output on macOS + // Diff < left / right > : + // <"runner console 2021-05-20 22:03 00:08 196\n" + // >"runner console 2021-05-20 22:03 old 196\n" + if cfg!(target_os = "macos") { + v_actual.remove(4); + v_expect.remove(4); + } + + assert_eq!(v_actual, v_expect); + } +} + +#[cfg(any(target_vendor = "apple", target_os = "linux"))] +#[test] +fn test_lookup() { + for opt in vec!["--lookup"] { + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); + } +} + +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_dead() { for opt in vec!["-d", "--dead"] { - new_ucmd!().arg(opt).run().stdout_is(expected_result(opt)); + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); } } -#[cfg(target_os = "linux")] +#[cfg(any(target_vendor = "apple", target_os = "linux"))] +#[test] +fn test_all_separately() { + if cfg!(target_os = "macos") { + // TODO: fix `-u`, see: test_users + return; + } + + // -a, --all same as -b -d --login -p -r -t -T -u + let args = ["-b", "-d", "--login", "-p", "-r", "-t", "-T", "-u"]; + let scene = TestScenario::new(util_name!()); + scene + .ucmd() + .args(&args) + .succeeds() + .stdout_is(expected_result(&args)); + scene + .ucmd() + .arg("--all") + .succeeds() + .stdout_is(expected_result(&args)); +} + +#[cfg(any(target_vendor = "apple", target_os = "linux"))] #[test] fn test_all() { + if cfg!(target_os = "macos") { + // TODO: fix `-u`, see: test_users + return; + } + for opt in vec!["-a", "--all"] { - new_ucmd!().arg(opt).run().stdout_is(expected_result(opt)); + new_ucmd!() + .arg(opt) + .succeeds() + .stdout_is(expected_result(&[opt])); } } -#[cfg(target_os = "linux")] -fn expected_result(arg: &str) -> String { - TestScenario::new(util_name!()) - .cmd_keepenv(util_name!()) +#[cfg(any(target_vendor = "apple", target_os = "linux"))] +fn expected_result(args: &[&str]) -> String { + #[cfg(target_os = "linux")] + let util_name = util_name!(); + #[cfg(target_vendor = "apple")] + let util_name = format!("g{}", util_name!()); + + TestScenario::new(&util_name) + .cmd_keepenv(util_name) .env("LANGUAGE", "C") - .args(&[arg]) - .run() - .stdout + .args(args) + .succeeds() + .stdout_move_str() } diff --git a/tests/by-util/test_whoami.rs b/tests/by-util/test_whoami.rs index c6ec6990f..a98541b2d 100644 --- a/tests/by-util/test_whoami.rs +++ b/tests/by-util/test_whoami.rs @@ -1,50 +1,63 @@ use crate::common::util::*; -use std::env; + +// Apparently some CI environments have configuration issues, e.g. with 'whoami' and 'id'. +// If we are running inside the CI and "needle" is in "stderr" skipping this test is +// considered okay. If we are not inside the CI this calls assert!(result.success). +// +// From the Logs: "Build (ubuntu-18.04, x86_64-unknown-linux-gnu, feat_os_unix, use-cross)" +// stderr: "whoami: failed to get username" +// Maybe: "adduser --uid 1001 username" can put things right? +fn skipping_test_is_okay(result: &CmdResult, needle: &str) -> bool { + if !result.succeeded() { + println!("result.stdout = {}", result.stdout_str()); + println!("result.stderr = {}", result.stderr_str()); + if is_ci() && result.stderr_str().contains(needle) { + println!("test skipped:"); + return true; + } else { + result.success(); + } + } + false +} #[test] fn test_normal() { let (_, mut ucmd) = at_and_ucmd!(); let result = ucmd.run(); - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - println!("env::var(CI).is_ok() = {}", env::var("CI").is_ok()); - for (key, value) in env::vars() { - println!("{}: {}", key, value); - } - if is_ci() && result.stderr.contains("failed to get username") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + // use std::env; + // println!("env::var(CI).is_ok() = {}", env::var("CI").is_ok()); + // for (key, value) in env::vars() { + // println!("{}: {}", key, value); + // } + + if skipping_test_is_okay(&result, "failed to get username") { return; } - assert!(result.success); - assert!(!result.stdout.trim().is_empty()); + result.no_stderr(); + assert!(!result.stdout_str().trim().is_empty()); } #[test] #[cfg(not(windows))] fn test_normal_compare_id() { - let (_, mut ucmd) = at_and_ucmd!(); + let scene = TestScenario::new(util_name!()); - let result = ucmd.run(); - - println!("result.stdout = {}", result.stdout); - println!("result.stderr = {}", result.stderr); - if is_ci() && result.stderr.contains("failed to get username") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + let result_ucmd = scene.ucmd().run(); + if skipping_test_is_okay(&result_ucmd, "failed to get username") { return; } - assert!(result.success); - let ts = TestScenario::new("id"); - let id = ts.cmd("id").arg("-un").run(); - if is_ci() && id.stderr.contains("cannot find name for user ID") { - // In the CI, some server are failing to return whoami. - // As seems to be a configuration issue, ignoring it + let result_cmd = scene.cmd("id").arg("-un").run(); + if skipping_test_is_okay(&result_cmd, "cannot find name for user ID") { return; } - assert_eq!(result.stdout.trim(), id.stdout.trim()); + + assert_eq!( + result_ucmd.stdout_str().trim(), + result_cmd.stdout_str().trim() + ); } diff --git a/tests/common/macros.rs b/tests/common/macros.rs index e8b9c9d5d..81878bf1b 100644 --- a/tests/common/macros.rs +++ b/tests/common/macros.rs @@ -1,40 +1,3 @@ -/// Assertion helper macro for [`CmdResult`] types -/// -/// [`CmdResult`]: crate::tests::common::util::CmdResult -#[macro_export] -macro_rules! assert_empty_stderr( - ($cond:expr) => ( - if $cond.stderr.len() > 0 { - panic!("stderr: {}", $cond.stderr_str()) - } - ); -); - -/// Assertion helper macro for [`CmdResult`] types -/// -/// [`CmdResult`]: crate::tests::common::util::CmdResult -#[macro_export] -macro_rules! assert_empty_stdout( - ($cond:expr) => ( - if $cond.stdout.len() > 0 { - panic!("stdout: {}", $cond.stdout_str()) - } - ); -); - -/// Assertion helper macro for [`CmdResult`] types -/// -/// [`CmdResult`]: crate::tests::common::util::CmdResult -#[macro_export] -macro_rules! assert_no_error( - ($cond:expr) => ( - assert!($cond.success); - if $cond.stderr.len() > 0 { - panic!("stderr: {}", $cond.stderr_str()) - } - ); -); - /// Platform-independent helper for constructing a PathBuf from individual elements #[macro_export] macro_rules! path_concat { diff --git a/tests/common/util.rs b/tests/common/util.rs index 9b6942bac..cbe33e950 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -2,11 +2,12 @@ #[cfg(not(windows))] use libc; +use pretty_assertions::assert_eq; use std::env; #[cfg(not(windows))] use std::ffi::CString; use std::ffi::OsStr; -use std::fs::{self, File, OpenOptions}; +use std::fs::{self, hard_link, File, OpenOptions}; use std::io::{Read, Result, Write}; #[cfg(unix)] use std::os::unix::fs::{symlink as symlink_dir, symlink as symlink_file}; @@ -15,10 +16,10 @@ use std::os::windows::fs::{symlink_dir, symlink_file}; use std::path::{Path, PathBuf}; use std::process::{Child, Command, Stdio}; use std::rc::Rc; -use std::str::from_utf8; use std::thread::sleep; use std::time::Duration; use tempfile::TempDir; +use uucore::{Args, InvalidEncodingHandling}; #[cfg(windows)] static PROGNAME: &str = concat!(env!("CARGO_PKG_NAME"), ".exe"); @@ -33,6 +34,8 @@ static ALREADY_RUN: &str = " you have already run this UCommand, if you want to testing();"; static MULTIPLE_STDIN_MEANINGLESS: &str = "Ucommand is designed around a typical use case of: provide args and input stream -> spawn process -> block until completion -> return output streams. For verifying that a particular section of the input stream is what causes a particular behavior, use the Command type directly."; +static NO_STDIN_MEANINGLESS: &str = "Setting this flag has no effect if there is no stdin"; + /// Test if the program is running under CI pub fn is_ci() -> bool { std::env::var("CI") @@ -40,22 +43,6 @@ pub fn is_ci() -> bool { .eq_ignore_ascii_case("true") } -/// Test if the program is running under WSL -// ref: @@ -// ToDO: test on WSL2 which likely doesn't need special handling; plan change to `is_wsl_1()` if WSL2 is less needy -pub fn is_wsl() -> bool { - #[cfg(target_os = "linux")] - { - if let Ok(b) = std::fs::read("/proc/sys/kernel/osrelease") { - if let Ok(s) = std::str::from_utf8(&b) { - let a = s.to_ascii_lowercase(); - return a.contains("microsoft") || a.contains("wsl"); - } - } - } - false -} - /// Read a test scenario fixture, returning its bytes fn read_scenario_fixture>(tmpd: &Option>, file_rel_path: S) -> Vec { let tmpdir_path = tmpd.as_ref().unwrap().as_ref().path(); @@ -64,64 +51,64 @@ fn read_scenario_fixture>(tmpd: &Option>, file_rel_p /// A command result is the outputs of a command (streams and status code) /// within a struct which has convenience assertion functions about those outputs -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct CmdResult { //tmpd is used for convenience functions for asserts against fixtures tmpd: Option>, /// exit status for command (if there is one) - pub code: Option, + code: Option, /// zero-exit from running the Command? /// see [`success`] - pub success: bool, + success: bool, /// captured standard output after running the Command - pub stdout: String, + stdout: Vec, /// captured standard error after running the Command - pub stderr: String, + stderr: Vec, } impl CmdResult { /// Returns a reference to the program's standard output as a slice of bytes pub fn stdout(&self) -> &[u8] { - &self.stdout.as_bytes() + &self.stdout } /// Returns the program's standard output as a string slice pub fn stdout_str(&self) -> &str { - &self.stdout + std::str::from_utf8(&self.stdout).unwrap() } /// Returns the program's standard output as a string /// consumes self pub fn stdout_move_str(self) -> String { - self.stdout + String::from_utf8(self.stdout).unwrap() } /// Returns the program's standard output as a vec of bytes /// consumes self pub fn stdout_move_bytes(self) -> Vec { - Vec::from(self.stdout) + self.stdout } /// Returns a reference to the program's standard error as a slice of bytes pub fn stderr(&self) -> &[u8] { - &self.stderr.as_bytes() + &self.stderr } /// Returns the program's standard error as a string slice pub fn stderr_str(&self) -> &str { - &self.stderr + std::str::from_utf8(&self.stderr).unwrap() } /// Returns the program's standard error as a string /// consumes self pub fn stderr_move_str(self) -> String { - self.stderr + String::from_utf8(self.stderr).unwrap() } /// Returns the program's standard error as a vec of bytes /// consumes self pub fn stderr_move_bytes(self) -> Vec { - Vec::from(self.stderr) + self.stderr } /// Returns the program's exit code @@ -130,6 +117,11 @@ impl CmdResult { self.code.expect("Program must be run first") } + pub fn code_is(&self, expected_code: i32) -> &CmdResult { + assert_eq!(self.code(), expected_code); + self + } + /// Returns the program's TempDir /// Panics if not present pub fn tmpd(&self) -> Rc { @@ -146,19 +138,31 @@ impl CmdResult { /// asserts that the command resulted in a success (zero) status code pub fn success(&self) -> &CmdResult { - assert!(self.success); + if !self.success { + panic!( + "Command was expected to succeed.\nstdout = {}\n stderr = {}", + self.stdout_str(), + self.stderr_str() + ); + } self } /// asserts that the command resulted in a failure (non-zero) status code pub fn failure(&self) -> &CmdResult { - assert!(!self.success); + if self.success { + panic!( + "Command was expected to fail.\nstdout = {}\n stderr = {}", + self.stdout_str(), + self.stderr_str() + ); + } self } /// asserts that the command's exit code is the same as the given one pub fn status_code(&self, code: i32) -> &CmdResult { - assert!(self.code == Some(code)); + assert_eq!(self.code, Some(code)); self } @@ -168,7 +172,12 @@ impl CmdResult { /// 1. you can not know exactly what stdout will be or /// 2. you know that stdout will also be empty pub fn no_stderr(&self) -> &CmdResult { - assert!(self.stderr.is_empty()); + if !self.stderr.is_empty() { + panic!( + "Expected stderr to be empty, but it's:\n{}", + self.stderr_str() + ); + } self } @@ -179,7 +188,12 @@ impl CmdResult { /// 1. you can not know exactly what stderr will be or /// 2. you know that stderr will also be empty pub fn no_stdout(&self) -> &CmdResult { - assert!(self.stdout.is_empty()); + if !self.stdout.is_empty() { + panic!( + "Expected stdout to be empty, but it's:\n{}", + self.stderr_str() + ); + } self } @@ -187,21 +201,28 @@ impl CmdResult { /// passed in value, trailing whitespace are kept to force strict comparison (#1235) /// stdout_only is a better choice unless stderr may or will be non-empty pub fn stdout_is>(&self, msg: T) -> &CmdResult { - assert_eq!(self.stdout, String::from(msg.as_ref())); + assert_eq!(self.stdout_str(), String::from(msg.as_ref())); + self + } + + /// Like `stdout_is` but newlines are normalized to `\n`. + pub fn normalized_newlines_stdout_is>(&self, msg: T) -> &CmdResult { + let msg = msg.as_ref().replace("\r\n", "\n"); + assert_eq!(self.stdout_str().replace("\r\n", "\n"), msg); self } /// asserts that the command resulted in stdout stream output, /// whose bytes equal those of the passed in slice pub fn stdout_is_bytes>(&self, msg: T) -> &CmdResult { - assert_eq!(self.stdout.as_bytes(), msg.as_ref()); + assert_eq!(self.stdout, msg.as_ref()); self } /// like stdout_is(...), but expects the contents of the file at the provided relative path pub fn stdout_is_fixture>(&self, file_rel_path: T) -> &CmdResult { let contents = read_scenario_fixture(&self.tmpd, file_rel_path); - self.stdout_is_bytes(contents) + self.stdout_is(String::from_utf8(contents).unwrap()) } /// like stdout_is_fixture(...), but replaces the data in fixture file based on values provided in template_vars /// command output @@ -218,7 +239,7 @@ impl CmdResult { /// stderr_only is a better choice unless stdout may or will be non-empty pub fn stderr_is>(&self, msg: T) -> &CmdResult { assert_eq!( - self.stderr.trim_end(), + self.stderr_str().trim_end(), String::from(msg.as_ref()).trim_end() ); self @@ -227,10 +248,16 @@ impl CmdResult { /// asserts that the command resulted in stderr stream output, /// whose bytes equal those of the passed in slice pub fn stderr_is_bytes>(&self, msg: T) -> &CmdResult { - assert_eq!(self.stderr.as_bytes(), msg.as_ref()); + assert_eq!(self.stderr, msg.as_ref()); self } + /// Like stdout_is_fixture, but for stderr + pub fn stderr_is_fixture>(&self, file_rel_path: T) -> &CmdResult { + let contents = read_scenario_fixture(&self.tmpd, file_rel_path); + self.stderr_is(String::from_utf8(contents).unwrap()) + } + /// asserts that /// 1. the command resulted in stdout stream output that equals the /// passed in value @@ -276,12 +303,51 @@ impl CmdResult { } pub fn stdout_contains>(&self, cmp: T) -> &CmdResult { - assert!(self.stdout_str().contains(cmp.as_ref())); + assert!( + self.stdout_str().contains(cmp.as_ref()), + "'{}' does not contain '{}'", + self.stdout_str(), + cmp.as_ref() + ); self } - pub fn stderr_contains>(&self, cmp: &T) -> &CmdResult { - assert!(self.stderr_str().contains(cmp.as_ref())); + pub fn stderr_contains>(&self, cmp: T) -> &CmdResult { + assert!( + self.stderr_str().contains(cmp.as_ref()), + "'{}' does not contain '{}'", + self.stderr_str(), + cmp.as_ref() + ); + self + } + + pub fn stdout_does_not_contain>(&self, cmp: T) -> &CmdResult { + assert!( + !self.stdout_str().contains(cmp.as_ref()), + "'{}' contains '{}' but should not", + self.stdout_str(), + cmp.as_ref(), + ); + self + } + + pub fn stderr_does_not_contain>(&self, cmp: T) -> &CmdResult { + assert!(!self.stderr_str().contains(cmp.as_ref())); + self + } + + pub fn stdout_matches(&self, regex: ®ex::Regex) -> &CmdResult { + if !regex.is_match(self.stdout_str().trim()) { + panic!("Stdout does not match regex:\n{}", self.stdout_str()) + } + self + } + + pub fn stdout_does_not_match(&self, regex: ®ex::Regex) -> &CmdResult { + if regex.is_match(self.stdout_str().trim()) { + panic!("Stdout matches regex:\n{}", self.stdout_str()) + } self } } @@ -360,6 +426,13 @@ impl AtPath { String::from(self.minus(name).to_str().unwrap()) } + pub fn set_readonly(&self, name: &str) { + let metadata = fs::metadata(self.plus(name)).unwrap(); + let mut permissions = metadata.permissions(); + permissions.set_readonly(true); + fs::set_permissions(self.plus(name), permissions).unwrap(); + } + pub fn open(&self, name: &str) -> File { log_info("open", self.plus_as_string(name)); File::open(self.plus(name)).unwrap() @@ -459,6 +532,14 @@ impl AtPath { } } + pub fn hard_link(&self, src: &str, dst: &str) { + log_info( + "hard_link", + &format!("{},{}", self.plus_as_string(src), self.plus_as_string(dst)), + ); + hard_link(&self.plus(src), &self.plus(dst)).unwrap(); + } + pub fn symlink_file(&self, src: &str, dst: &str) { log_info( "symlink", @@ -571,7 +652,7 @@ impl TestScenario { }, util_name: String::from(util_name), fixtures: AtPath::new(tmpd.as_ref().path()), - tmpd: tmpd, + tmpd, }; let mut fixture_path_builder = env::current_dir().unwrap(); fixture_path_builder.push(TESTS_DIR); @@ -615,6 +696,10 @@ impl TestScenario { cmd } + /// Returns builder for invoking any system command. Paths given are treated + /// relative to the environment's unique temporary test directory. + /// Differs from the builder returned by `cmd` in that `cmd_keepenv` does not call + /// `Command::env_clear` (Clears the entire environment map for the child process.) pub fn cmd_keepenv>(&self, bin: S) -> UCommand { UCommand::new_from_tmp(bin, self.tmpd.clone(), false) } @@ -632,7 +717,11 @@ pub struct UCommand { comm_string: String, tmpd: Option>, has_run: bool, - stdin: Option>, + ignore_stdin_write_error: bool, + stdin: Option, + stdout: Option, + stderr: Option, + bytes_into_stdin: Option>, } impl UCommand { @@ -661,7 +750,11 @@ impl UCommand { cmd }, comm_string: String::from(arg.as_ref().to_str().unwrap()), + ignore_stdin_write_error: false, + bytes_into_stdin: None, stdin: None, + stdout: None, + stderr: None, } } @@ -672,6 +765,21 @@ impl UCommand { ucmd } + pub fn set_stdin>(&mut self, stdin: T) -> &mut UCommand { + self.stdin = Some(stdin.into()); + self + } + + pub fn set_stdout>(&mut self, stdout: T) -> &mut UCommand { + self.stdout = Some(stdout.into()); + self + } + + pub fn set_stderr>(&mut self, stderr: T) -> &mut UCommand { + self.stderr = Some(stderr.into()); + self + } + /// Add a parameter to the invocation. Path arguments are treated relative /// to the test environment directory. pub fn arg>(&mut self, arg: S) -> &mut UCommand { @@ -679,7 +787,8 @@ impl UCommand { panic!("{}", ALREADY_RUN); } self.comm_string.push_str(" "); - self.comm_string.push_str(arg.as_ref().to_str().unwrap()); + self.comm_string + .push_str(arg.as_ref().to_str().unwrap_or_default()); self.raw.arg(arg.as_ref()); self } @@ -690,9 +799,15 @@ impl UCommand { if self.has_run { panic!("{}", MULTIPLE_STDIN_MEANINGLESS); } - for s in args { + let strings = args + .iter() + .map(|s| s.as_ref().to_os_string()) + .collect_str(InvalidEncodingHandling::Ignore) + .accept_any(); + + for s in strings { self.comm_string.push_str(" "); - self.comm_string.push_str(s.as_ref().to_str().unwrap()); + self.comm_string.push_str(&s); } self.raw.args(args.as_ref()); @@ -701,10 +816,10 @@ impl UCommand { /// provides stdinput to feed in to the command when spawned pub fn pipe_in>>(&mut self, input: T) -> &mut UCommand { - if self.stdin.is_some() { + if self.bytes_into_stdin.is_some() { panic!("{}", MULTIPLE_STDIN_MEANINGLESS); } - self.stdin = Some(input.into()); + self.bytes_into_stdin = Some(input.into()); self } @@ -714,6 +829,17 @@ impl UCommand { self.pipe_in(contents) } + /// Ignores error caused by feeding stdin to the command. + /// This is typically useful to test non-standard workflows + /// like feeding something to a command that does not read it + pub fn ignore_stdin_write_error(&mut self) -> &mut UCommand { + if self.bytes_into_stdin.is_none() { + panic!("{}", NO_STDIN_MEANINGLESS); + } + self.ignore_stdin_write_error = true; + self + } + pub fn env(&mut self, key: K, val: V) -> &mut UCommand where K: AsRef, @@ -734,24 +860,28 @@ impl UCommand { } self.has_run = true; log_info("run", &self.comm_string); - let mut result = self + let mut child = self .raw - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) + .stdin(self.stdin.take().unwrap_or_else(|| Stdio::piped())) + .stdout(self.stdout.take().unwrap_or_else(|| Stdio::piped())) + .stderr(self.stderr.take().unwrap_or_else(|| Stdio::piped())) .spawn() .unwrap(); - if let Some(ref input) = self.stdin { - result + if let Some(ref input) = self.bytes_into_stdin { + let write_result = child .stdin .take() .unwrap_or_else(|| panic!("Could not take child process stdin")) - .write_all(input) - .unwrap_or_else(|e| panic!("{}", e)); + .write_all(input); + if !self.ignore_stdin_write_error { + if let Err(e) = write_result { + panic!("failed to write to stdin of child: {}", e) + } + } } - result + child } /// Spawns the command, feeds the stdin if any, waits for the result @@ -764,8 +894,8 @@ impl UCommand { tmpd: self.tmpd.clone(), code: prog.status.code(), success: prog.status.success(), - stdout: from_utf8(&prog.stdout).unwrap().to_string(), - stderr: from_utf8(&prog.stderr).unwrap().to_string(), + stdout: prog.stdout, + stderr: prog.stderr, } } @@ -811,3 +941,249 @@ pub fn read_size(child: &mut Child, size: usize) -> String { .unwrap(); String::from_utf8(output).unwrap() } + +pub fn vec_of_size(n: usize) -> Vec { + let mut result = Vec::new(); + for _ in 0..n { + result.push('a' as u8); + } + assert_eq!(result.len(), n); + result +} + +/// Sanity checks for test utils +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_code_is() { + let res = CmdResult { + tmpd: None, + code: Some(32), + success: false, + stdout: "".into(), + stderr: "".into(), + }; + res.code_is(32); + } + + #[test] + #[should_panic] + fn test_code_is_fail() { + let res = CmdResult { + tmpd: None, + code: Some(32), + success: false, + stdout: "".into(), + stderr: "".into(), + }; + res.code_is(1); + } + + #[test] + fn test_failure() { + let res = CmdResult { + tmpd: None, + code: None, + success: false, + stdout: "".into(), + stderr: "".into(), + }; + res.failure(); + } + + #[test] + #[should_panic] + fn test_failure_fail() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "".into(), + stderr: "".into(), + }; + res.failure(); + } + + #[test] + fn test_success() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "".into(), + stderr: "".into(), + }; + res.success(); + } + + #[test] + #[should_panic] + fn test_success_fail() { + let res = CmdResult { + tmpd: None, + code: None, + success: false, + stdout: "".into(), + stderr: "".into(), + }; + res.success(); + } + + #[test] + fn test_no_std_errout() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "".into(), + stderr: "".into(), + }; + res.no_stderr(); + res.no_stdout(); + } + + #[test] + #[should_panic] + fn test_no_stderr_fail() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "".into(), + stderr: "asdfsadfa".into(), + }; + + res.no_stderr(); + } + + #[test] + #[should_panic] + fn test_no_stdout_fail() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "asdfsadfa".into(), + stderr: "".into(), + }; + + res.no_stdout(); + } + + #[test] + fn test_std_does_not_contain() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "This is a likely error message\n".into(), + stderr: "This is a likely error message\n".into(), + }; + res.stdout_does_not_contain("unlikely"); + res.stderr_does_not_contain("unlikely"); + } + + #[test] + #[should_panic] + fn test_stdout_does_not_contain_fail() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "This is a likely error message\n".into(), + stderr: "".into(), + }; + + res.stdout_does_not_contain("likely"); + } + + #[test] + #[should_panic] + fn test_stderr_does_not_contain_fail() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "".into(), + stderr: "This is a likely error message\n".into(), + }; + + res.stderr_does_not_contain("likely"); + } + + #[test] + fn test_stdout_matches() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "This is a likely error message\n".into(), + stderr: "This is a likely error message\n".into(), + }; + let positive = regex::Regex::new(".*likely.*").unwrap(); + let negative = regex::Regex::new(".*unlikely.*").unwrap(); + res.stdout_matches(&positive); + res.stdout_does_not_match(&negative); + } + + #[test] + #[should_panic] + fn test_stdout_matches_fail() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "This is a likely error message\n".into(), + stderr: "This is a likely error message\n".into(), + }; + let negative = regex::Regex::new(".*unlikely.*").unwrap(); + + res.stdout_matches(&negative); + } + + #[test] + #[should_panic] + fn test_stdout_not_matches_fail() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "This is a likely error message\n".into(), + stderr: "This is a likely error message\n".into(), + }; + let positive = regex::Regex::new(".*likely.*").unwrap(); + + res.stdout_does_not_match(&positive); + } + + #[test] + fn test_normalized_newlines_stdout_is() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "A\r\nB\nC".into(), + stderr: "".into(), + }; + + res.normalized_newlines_stdout_is("A\r\nB\nC"); + res.normalized_newlines_stdout_is("A\nB\nC"); + res.normalized_newlines_stdout_is("A\nB\r\nC"); + } + + #[test] + #[should_panic] + fn test_normalized_newlines_stdout_is_fail() { + let res = CmdResult { + tmpd: None, + code: None, + success: true, + stdout: "A\r\nB\nC".into(), + stderr: "".into(), + }; + + res.normalized_newlines_stdout_is("A\r\nB\nC\n"); + } +} diff --git a/tests/fixtures/base32/input-simple.txt b/tests/fixtures/base32/input-simple.txt new file mode 100644 index 000000000..8ab686eaf --- /dev/null +++ b/tests/fixtures/base32/input-simple.txt @@ -0,0 +1 @@ +Hello, World! diff --git a/tests/fixtures/base64/input-simple.txt b/tests/fixtures/base64/input-simple.txt new file mode 100644 index 000000000..8ab686eaf --- /dev/null +++ b/tests/fixtures/base64/input-simple.txt @@ -0,0 +1 @@ +Hello, World! diff --git a/tests/fixtures/cat/empty.txt b/tests/fixtures/cat/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/fixtures/cat/three_directories_and_file_and_stdin.stderr.expected b/tests/fixtures/cat/three_directories_and_file_and_stdin.stderr.expected new file mode 100644 index 000000000..1a8a33d77 --- /dev/null +++ b/tests/fixtures/cat/three_directories_and_file_and_stdin.stderr.expected @@ -0,0 +1,5 @@ +cat: test_directory3/test_directory4: Is a directory +cat: filewhichdoesnotexist.txt: No such file or directory (os error 2) +cat: test_directory3/test_directory5: Is a directory +cat: test_directory3/../test_directory3/test_directory5: Is a directory +cat: test_directory3: Is a directory diff --git a/tests/fixtures/head/emptyfile.txt b/tests/fixtures/head/emptyfile.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/fixtures/install/helloworld.rs b/tests/fixtures/install/helloworld.rs new file mode 100644 index 000000000..47ad8c634 --- /dev/null +++ b/tests/fixtures/install/helloworld.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello World!"); +} diff --git a/tests/fixtures/install/helloworld_linux b/tests/fixtures/install/helloworld_linux new file mode 100755 index 000000000..c1c6b9b37 --- /dev/null +++ b/tests/fixtures/install/helloworld_linux @@ -0,0 +1,14662 @@ +ELF>pP@2@8 @)(@@@NNPPP)) E U U0+0-PgPwPw@@DD E U Ux Ptd QtdRtd E U U**/lib64/ld-linux-x86-64.so.2GNUGNUxr?޾J/ 3 gHHem'7_ >"+iDtaZpe\1y<7R +W?[ l/u ,G"libgcc_s.so.1_ITM_deregisterTMCloneTablepthread_getspecificpthread_key_create__gmon_start__pthread_setspecific_ITM_registerTMCloneTable_Unwind_Resume_Unwind_Backtrace_Unwind_GetLanguageSpecificData_Unwind_GetIPInfo_Unwind_GetDataRelBase_Unwind_GetRegionStart_Unwind_SetIP_Unwind_GetIP_Unwind_DeleteException_Unwind_RaiseException_Unwind_SetGR_Unwind_GetTextRelBaselibrt.so.1libpthread.so.0pthread_mutex_initpthread_mutexattr_settypepthread_rwlock_unlockclosepthread_getattr_nppthread_mutexattr_destroyopen64pthread_key_deletewritepthread_rwlock_rdlockpthread_mutex_lockpthread_mutex_destroypthread_mutexattr_init__errno_locationpthread_mutex_unlocksigactionopenpthread_attr_getstackpthread_attr_destroypthread_mutex_trylocklibdl.so.2dlsymlibc.so.6posix_memaligndl_iterate_phdrsignal__cxa_thread_atexit_implreallocabortmemchrmemrchrmmapcallocstrlenmemsetwritevpollsigaltstackmemcpymprotectmallocgetenvmunmapreadlinkgetcwd__cxa_finalizesyscall__xpg_strerror_rmemmovepthread_selfbcmp__libc_start_mainsysconffree__fxstat64ld-linux-x86-64.so.2__tls_get_addrGLIBC_2.2.5GLIBC_2.3GCC_4.2.0GCC_3.0GCC_3.3GLIBC_2.14GLIBC_2.3.4GLIBC_2.18  +  ui kG ii w ui k@``' P&y S&y  +ti ui k U(UPQ0UQ8UHU0S`URhURpURxUUU0^U@U@UU0^U@UUV0^V` V(VP0V0^HVPPVXV`V0^xVWV:VVVVPV}WW0^(WV0WHW`WxWWWWWWX0^ Xpy(X0^@X@&HX0^`X &hXgXXhXX0^X0uXǖXXY(Y@YXYpY]Y]Y]Y]Y0^YXYZP ZP8ZPPZPhZPZPZPZPZPZPZ[i([i@[iX[ip[[ț[[e[`[@[P[p[`[[[˛\(\@\X\0^p\x\0^\X\e\ \\c\n\]](]8]P]h]]r]]Z][]r]`]Y]\]r]p^ Y^[^(^@^X^p^^^^^^_0^_p _\(_@_0^X_`_`\h_______ɞ`s ` (`\0`ڞ@`P```qp``````aa(a8a.Ha/Xa8ha0^a ]aVakayaaa0^a@ b b b b b0(b8bePbXb`bphb`pbxb`bШbpbޠbb.bbbcp(c0c8c0^PcXc`cexcVc0^cVc0^c`cc>cpc +c0^dd\ d0^8d`@dP\Hd`dϡpddddHdhd0dd.due0^ eW(e0^@epXHe0^`eWheqeeee£e£eJfJ(f8fʤPfʤhf!f!f!fCffۥfg(gM@gpjXg@m`g@mhgipgpjgPmgPmgigGgGgghh0hHh`hxhhhhhhi i8iPihiiiiiiij(j@jXjpjjjjjjkk0kHk`kxkkkkkkl l8lPlhllll©l©lӱlcmc(mc@mcXmcpmȴmmmmmmnn0nHnfPnhnnWnWnWnWnWnWoW(oW@oWXoWpoWoWoWoWoWoWpWpW0pWHp`pxppppppq q8qPqhqqqnqqqq:rvr(r88r8Hr׿Xr$pr&xr8rٿrٿrʔrr$r)r1r`2rڿsڿ(s$@sqHsA`s$xs2s2s3s&s&ssAsSs tStu(t8tHtXt=httttttt!u!(u!@u!Xu!pu!u!u!ufuqu8uuv0v8(vf8vHvXvhv8xvvv-v-v-v$wuw$(wPt0w$HwPsypy}yypyz`zzd z`0z i8z CXzPQ`zMhz |pzvxzPzBz3z@zz zz'zzkz`zPN{`1{p0{`8{PC@{NH{pCP{PMX{``{kh{0)p{ ({{0{y{S{J{6{PB{i{{p{@g|PZ|@(|| |l(|0|S8|@|@ZH|p.P|Sx|0B| |B|0|^|g|_|#|0Q||@}@}P}@ }K0}`8}@}'P}X}ph}/p}x}B}`}S} 4}@}B}m}L} }P~p~~Pg ~0~8~p~Pnx~~(~ ~P(~~`j~`H~)~~ ~`~p,0l; `j(`80Z@hHh(p)x0(S0vB . |`m 08եyyyz(z@zHzPzz z +z z z {{ {({x{{{{{{X|`|h|p||||||!|"}$(}%H}&`}'}(})}*}+},}-}.~/(~0@~1H~2P~3X~4`~5h~6~7~8~9~:~;<0=P>X?`@ABDHEFGy y#yCHH=-HtH5r)%t)@%r)h%j)h%b)h%J/f1I^HHPTLJ)H (H=\,DH=/H/H9tH)Ht H=y/H5r/H)HHH?HHtH].HtfD=9/u/UH=.Ht H=.-h/]{f.P1D$D$Yf.@P@|$H|$$$Yf.fH8H}H N.1AH|$HƺgH|$d-H8PHcH=H4$HH$EYH("H(H|$ HD$T$ fPHXf.H(HH|$ HL$ HHt$HHD$HT$HHL$p+HD$HD$H(fPH?gD$D$YHH?$D$ D$ HPXf.H(H|$H|$D$D$H(H|$0 HD$T$ PXf.HHH$H7HWH$Ht$HWHwHO LG(Hf.f鋉f.ˉf.ˉf.[f.kf.UAWAVAUATSHHHF0Ht;IHHF0HFHLDMIIMo2I9sHIlHEHl$8L5J+DHHDA2LHI9rHHtD0L`HHl$IkpJD)$)$)$D`Lp)$)$)$)$MJ@LHtmIHHt1H8HH9uH)IrEH8H8H8H8H8H8H8H8HuE1I($)D$p($)D$`($)D$P($($($($)\$@)T$0)L$ )D$II_MoHE(D$(L$ (T$0(\$@EMU(]8(D$PEH(D$`EX(D$pEhH[A\A]A^A_]H=?H+( f.DH8^HCl_DHIp~T6BDH~DAVSPHL7H%tLHH[A^%V#H#LHHt [A^%$[A^%m'f.UAWAVAUATSHHHLhH#HT$H$Mt;L5ILd$H-f.H\$HLLLIuH#H[A\A]A^A_]f.@HH8H@H@HAVSPHL7H$tLHH[A^%$H"LHHt [A^%F'[A^%%f.AVSPHL7He$tLHH[A^%n&H="LHHt [A^%v"[A^%$f.H?%$H?%&HHHwH%&f.H?%&AVSPHIH#tLHH[A^%F!H!LHHt [A^%"[A^%]%f.PD$sHt$D$*TYHt$=sL$$? D$SY=s- L$?ɀL$$? D$SYL$ ?ɀL$?ɀL$$? D$SYf.fPD$sHt$D$JTYHt$=sL$$? D$TY=s- L$?ɀL$$? D$SYL$ ?ɀL$?ɀL$$? D$SYf.fPD$sHt$D$Q1YHt$=s L$$? D$|Q1Y=s/ L$?ɀL$$? D$FQ1YL$ ?ɀL$?ɀL$$? D$Q1Y@HHH|$NV )T$0)L$ )D$H5H|$HT$!HHÐHHH|$NV )T$0)L$ )D$H5H|$HT$!HHÐHHH|$NV )T$0)L$ )D$H5H|$HT$^!HHÐ of.PHH$HPdXf.@ qf.PHH$HaXf.@USHHHHJHL$)$HHHEϋWHHHtHt cI~IPHt$IHHtHH4@Ht *I`IhIpIHt>H@LHH +I^H[A^H0HH f.AWAVSHH?tF{rbL{I?IGIGHpHt I?HPEH{[A^A_%,H{HtHsHt[A^A_% +[A^A_II?Iw%%H{<%L fAWAVSHt{uHI<w%<t!H;HtWHsHtN[A^A_%I>IFIFHpHt I>HPuLbH;Hu[A^A_II>Ivu$L$IHLH fDUAWAVAUATSHxIHHHH%|$ 7L\$XLD$MHL$Ht$Ll$H|$HI8HI3H9JLt$@H\$(HL$8LHL$pH)HT$hIIܐAIsEL9LHGI:H@L9sKH/H9L}AT-:(LtLLLE1JH9ref.DHf.I9HL9H9H9AT A:tH|$pL\$hJH9:L\$XH|$HOH<$HL$LDL$8HT$(fHAHtH9tq<gH9H4HFL9t@FH?AAr:L9t>DHA?D ؀r8L9t<6?61LAAsAD ,E1LD ؀sA D 1AAD E(,HH9sL\$@L|$(Lt$8M9MMGHt$HLJH9AIsHHI :Lf.I9t+H,H9ATHkH:HtHHLf.HtvHL9H9H9A\ A:tL^D4D$8HL$(Eu=ADL$8HT$()D$8HT$(1LH|$HHD$XLH|$HHx[A\A]A^A_]HH9HBHHz HHLe HHS LH LH9HBH^( f.@HHHFHȃ?IIIIO I 111ȉ 1H 1AAA1LL!1H9HCI9H)H9lMKIH@HLHL$)$HLHLHL$HL($D D1؉11ȉ 1H 1AAA1LL!1H9HCI9H)H9KRH@HLHL$)$HLHLHL$HL($D D1ȉ11ȉ 1II 1ʉ1L L!1H9HCII9s]H)H9sCK RH@HTHT$)$HTHTHL$HL($HHH MHL fDAWAVAUATSH LvLGLO0LVE1fL:($BIH9sFHIHDzH;\r7HǐI9HHPHXH;HH9@1H9H2uHAH9zH@L$IHTHT$)$JTHTBHT$JT($BHL,HQHRM}L;LH H9HGHHGHtHHD$HL$HD$ H;:HD$H|$(HL$ H|$0Ht$8H|$(t*H;HsHCHLLSL{1H@[A^A_Hu X f.@PH?D$sHt$D$YHt$=sL$$? D$Y=s- L$?ɀL$$? D$YL$ ?ɀL$?ɀL$$? D$kYfPH?D$sHt$D$'YHt$=sL$$? D$Y=s- L$?ɀL$$? D$YL$ ?ɀL$?ɀL$$? D$YfUAVSH@HsRHCH;Cu|HHHH9HGHHGHH HL$HD$HD$ D$ Lt$ s% D$ @?@̀@l$ oH;s* D$ $? D$ @?@̀@l$5 D$ $? D$ $? D$@?@̀@l$HKHCHH)H9s>HH H9HGHHGHtbHHD$HL$HD$ SH;HD$H|$(HL$3H|$0Ht$8H|$(tnH;HsHC@,HCMHD$H|$(HL$H|$0Ht$8H|$(t)H;HsHCHLHHk1H@[A^]Hu0  f.@HHHHD$NV )T$0)L$ )D$H5H|$HT$kHHf.@HHHHD$NV )T$0)L$ )D$H5H|$HT$HHf.@HHHHD$NV )T$0)L$ )D$H5H|$HT$HHf.@HHHHD$NV )T$0)L$ )D$H5H|$HT${HHf.@H?(H?AWAVSH0IIHHHKHCHH)L9s=LH H9HGHHGHtHH$HL$HD$ H;7H$H|$HH|$ Ht$(H|$t*H;HsHCHLLPL{1H0[A^A_Hu U f.AWAVSH0IIHHKHCHH)L9s=LH H9HGHHGHtHH$HL$HD$ H;7H$H|$HH|$ Ht$(H|$t*H;HsHCHLLsL{1H0[A^A_Hu x f.@HHHwH%f.AWAVATSH8IL%L;%u]MIK $L9IFHHG1HHMt1H IiԐHL$HT$HD$HnM|$OHD$H|$ HL$HHH\$(HD$0H|$ t[H0HHq= +ףp= +HH HIiԐL%;HAԺHLAL=H8[A\A^A_Hu HH HLHη f.fSHH?HGHtHwHtHuH;HtHou0[%S[ÐAVSPIHH{H{((H{ HtHs(Ht  I>HtHou8H[A^%H[A^f.HHvHt +HP%f%AWAVSIIHtQHH9Ht%HqHtHLHu!M~,Mt4LHHtIF1L M~1I^I[A^A_HHuf.UAWAVAUATSHxIHLvMIEHHIIMMu(HL<L1HIHD$ Hl$(HD$0MAA1HD$Hl$@HH\$MUH1E11f.DI<HII}IEA?u<HI @yHHI9uvDIAfAIAEBIFH9L\$8I<HLH)HAI}IEE\D؃D$ Eۈ\$ yFIFH9LI<HHAI}IEE\D؃\$  É\$ EH\$L\$8H9HH[H 6H9HGHHF1HHHDL$ +MtHLD$HHt$PHD$X HD$HH|$`HHHL$H*LD$hHt$pH|$`LD$ HHt$(MDL$ +D"L$ AfEHFCD?u<s1ŃHI y1IIL9uO,IHGLo]IAL9tFM)I11L$LIL>LN]?us"ۉ݃HH y%IrɸE1HGLHGHWLGL_ Lw(HG0WG81fDUAWAVAUATSH8MIIIAALLT$0IMl$DfDfIEHI$LsHHM4$IL$+@yHLsLXM4$M\$K̓ yMt~HKHI $ID$Cf dGf+wtH HcHH|$LxLD$ H|$ HD$(MG=M4$IGMwIH8[A\A]A^A_]øE1ׁf  H HcHIUHI<$H1E11HwI4$IT$?u  +HI @HHrP +IUHlI<$H1E11HwI4$IT$?u  +HI @HHr AIEHJ I $HQHI$ID$HHD$HD$H$HD$ HD$L$IUHI<$H1E11HwI4$IT$?u k HI @HHr; MUM M$E1H111M3IIM$IT$A3?u< HH @HHI9uIEH +I $HQHI$ID$DQD D IEHd +I $HQHI$ID$DDDa A +IEHC IEH9I $HQHI$ID$DDDHL!þIEH1I $LAHM$ID$9IEHI $LAHM$ID$9IEHa I $HQHI$ID$DDdA H|$0 IE +H A H|$0`IEHI $HQHI$ID$HHD$HD$H$HD$ HD$L$ +$ M$ID$Ht1A<8X HH9u1HMGIGuMUMM$E1H111M3IIM$IT$A3?u< +HH @K HHI9uIM< IEHtSI $LAHM$ID$9H)r:I 8I $ID$DDHL!þM$MGIEHkI $HQHI$ID$D1vIEH:I $HQHI$ID$9A 1AIEH1E1փHI H H I$HrI4$ID$?uÄtt1 AIEHI $HQHI$ID$HHD$HD$H$HD$ HD$L$IUH I<$H1E11HwI4$IT$?u 9HI @w +HHr f[B<U H HcHIEH +I $HQHI$ID$D IEHI $HQHI$ID$D 1IEHlI $HQHI$ID$DD oIEH2I $HQHI$ID$DDD /IEHI $HQHI$ID$HHD$HD$H$HD$ HD$L$DDHL!þ AYIEHI $HQHI$ID$HHD$HD$H$HD$ HD$L$8 1AbIEH%I $HQHI$ID$DDD"IEHM$IHHI $ID$DDHL!þAIEHI $HQHI$ID$HHD$HD$H$HD$ HD$L$IEHdI $HQHI$ID$HHD$HD$H$HD$ HD$L$DDHL!þfA!GDDHLH!þIUHI<$H1E11HwI4$IT$?u HI @HHrYIUHuI<$H1E11HwI4$IT$?us+HI @HHrH% IEHI $HQHI$ID$HHD$HD$H$HD$ HD$L$eIEHI $HQHI$ID$D1IEH]I $HQHI$ID$DDcIEH'I $HQHI$ID$D 15IEHI $HQHI$ID$DD 11A  H IwIGIHD$0fAG 1IEHI $HQHI$ID$DQD D IEHrQI $HQHI$ID$DDD NAG (IEHI$IGIGIEH1I$HD$'HD$HD$D$$D$fD$D$D$HD$HD$D$'D$HD$IGD$AGD$AGD$fAGD$AGM $IEHI $HQHI$ID$DDDHL!þADDHL!1IEHI $HQHI$ID$DDDHL!þA@IEHI$HD$'HD$HD$D$$D$fD$D$D$HD$HD$D$'D$HD$HL$mIEHVI $HQHI$ID$DDDHL!þ +IEHI $HQHI$ID$DDDHL!þIGIGEI $HQI$HID$DDDDDHL!þ NDDHL!þ%HH1@HDƃ@HMI DDHL!þI $HQHI$ID$HHD$HD$H$HD$ HD$L$HL!DDIEHuI $HQHI$ID$DI 8I $HH)IT$1IH9rOH>LHI)HLI$It$DDHL!þH9MMOIODDHL!þDDHL!þyDDHL!þPI 8HHHHI $IT$DDHL!þ IEHI$IOIGH>LHI)HLI$It$1IEHI $HQHI$ID$HHD$HD$H$HD$ HD$L$I $HQHI$ID$DDDHL!þ4f.@F=0!dȁH HcHHHHH +wuk=1!=2!t`=3!PH> +FHFHGH HHH%H _HcHH> + HFHGHH> +HFHGHHHHH *HcHHFH> +HFHGHHHHH HcHHFsHHHbH HcHHHHAH HcHHF^HHH H 1HcHHFHGHHHHH HcHHHHH HcHHHHH vHcHHHHH HcHHFHHHYH HcHHFH> +6HFHGHHHHH OHcHFGHHHHH HcHHFlHHHH tHcHHHHH HcHHFUH> +vHFHGHH> +\HFHGHHHH;H ]HcHHHHH HcHHF HHHH HcHHFHHHH hHcHHF!HHHH &HcHHF(HHHrH HcHHF$HHHHH HcHHFHGHHFHyFHGHËFHGHFHGHHHHH 4HcHHFH> +HFHGHHHHH HcHHFFFF HFH_HGH,F$FF HFH5H=)GH+F$FF HFHH=fGH&F$FF HFHH=GH)F$FF HFHH=GH F$FF HFH`H=TGH(F$FF HFH+H=GH"F$FF HFHH=GH$F$FF HFHH=GH*F$FF HFHH=GH#FFF HFHx[HGH'FFF HFHx5H=w-GH%F!FF HFHxH=v GH!FFF HFHxHGH-f.H8HHH7Hc HHFPHNXL9LL)1f.D<HH9uHFpHNxL9LL)t1f<xHH9uQGDTHLN`HNhH)rRII1HIH)sfHOLOHH8HF@HNHL9LL)1@<HH9uLGLO1HH8IuSHw\LL$/HD$'LL$D$ $D$$fD$D$&D$HD$'HD$D$/D$LL$HL$DH5AIHD$ HD$ H$HD$(HD$H$HFPHNXH9rHH)t1Ҁ<t"HH9uHGHGHH8HGHW1HH8f.fH8B<H HcHHFHtLHHQHHHF,HFHv(HHQHHHFHFHHHGHGHH8HFHHHD$/HD$'HD$D$ $D$$fD$D$&D$HD$'HD$D$/D$HD$HGD$GD$GD$fGD$GHH8GW HH8HHQHHHF1HHQHHHFHHD$ HD$ H$HD$(HD$H$HG1HH8ÐUAWAVAUATSHXH<$LVMIL|$L51HD$H8fDLL2Hl$H|$Il$MT$MWA\$A|$I4$HFMZI$M\$HIc LM1H11f.fH.HI<I$I|$T.?u l҉׃HH HHI9uQf.LL@Ll$H|$LL"Ht$H|$rHL : HHHL9IERI|$0IL$ IT$(H);At$HHH)%~@"H@H=lHcHH)HH)9H)+HaHHD$HD$HD$ HD$HD$(Hl$ HD$@H D$HHD$@Hl$PALt$HLH.HAE1AL HI$ID$H$HBHJHHI$ID$WH$HX[A\A]A^A_]HD$III돸HHD$PH%HHHHT$@H $HAHQHA/E1GAE1M5H1E11HHI*I$IT$DL?u +AAщ׃HI :HHI9uAE1MH1E11HHI*I$IT$DL?u +AdAщ׃HI $HHI9upAE1MLI111HHKI$IT$DL?u +AAщ׃HH HII9uHHH|$LLl$H|$tTH|$LHt$H|$<HD$IIIH|$LyLl$H|$uHD$MI]IT$H9I<$HE111HGI$IT$?u HH @&HHrHL$HD$HL$/D$D$ D$ fD$$D$D$&HD$HD$'D$D$/HT$/HD$'BIJH9I)IE111HHI$MT$?u MӉ׃HH MIrIIJH9MAfHHEA IIf.ffA!tfEK:MA111A,??u@t +@HH փ@HI9uH f: II LLfHLyLvЃyVMLyLvQ׃ y0MAf HH IIf$HDŽ$[HH@@HDՃ@HMH IIHIDAHH HDŽ$H$H$H$H$PH$H$@H$H$HH$@u,H$HH$PH$ME-$H$PX `0)$)$)$)$h@)$$PH$`h@`0X P$(H$HމL$P5H$H$H$H$H$AI Q0Y@)D$`)L$p)$)$AP)$qE1M($)$(D$`(L$p($($)$)$)$)$pHLIH$HD$XH+$0H$HHD$X($($ )$0)$ n$I$ H@H HL$P H$HfH$H$H$H$H$H$HD$HH$HD$0H$ HDŽ$(H$0L$8H\$ H$@$H($ DD$L$XJ HE($0H$PH$H`@PHDŽ$HDŽ$HDŽ$H$J HEHDŽ$H$H$)$ )$ HDŽ$p/L$PH$XH$H$`L$hHDŽ$HDŽ$HMIoH11f.DH$PH$XU?u ‰ƒHH քyHHrf.H^HDŽ$HDŽ$IHL$P`HDŽ$HDŽ$H|$ :LeIPHuH$H$Ht$`H$Ht$hHD$`|$H$txHn9IHUHH$H$HT$`H$HT$hHD$`HD$HNH;IEHD$HHLD$ IH$=H:IEHD$HHLD$ IH$ M@E16IHNH;$`HkpH] 1"IH$L$LH$H$$$@$$A$f$E$$GH$H$HH$@L$HH$H$HH$HHH$pHt~H$hD2NIAMt11J9tHHGIHtIIHuMHtHJ8f.HɩH$PHDŽ$XHDŽ$HDŽ$L$PH$0L|$XL0$p/H$yIIƄ$ = +H$H$IIH8H$H)$)$ 1@LDL)HD$ II)M)L$KH1ɀjH$H$pH$xH$HDŽ$H$H$H$HIIHl$`H\$hHD$pHT$xH$pH$H2A..HD$1HD$0H$L$PIMGHPHH$Ht$`蟿$LIIL|$pLd$xH$H$H$)$p)$H.H$H$($B$fq~eHfH$0L|$XH HcHH$pH$$pH$xH$fH$0L|$XH ߟHcHH$pH$L$pH$xH$H$H$y=2!tC=3!dH$pH$R$p AH$xH$,H$pH$$p H$xH$H$pH$H$pH$xH$H$pH$H$pHuH$xH$HL$0HDHL$0pH$pH$^H$pHD$H$xHD$ H$H$/H$pH$$puH$xH$Ld$xMttL|$pH$H0.E1A.H$H$0L|$XOII5cH$0L|$XLd$0Hl$RoH$HHLd$0Hl$H9tHT$`H+PHHP ($p)$p)$I.u1NH$PH$HH$LL$L$#$PH$`t +H$X1H$H$H.u1KH$PH$HH$HLD$ L$$PL$`t +H$X1H$L$MtEH$L$H$HHH0HP8H$H)s+HʉL$0HL$/D$0HD$=HAHLl$ H$D$HLQHBHHw9E1LH9HLT$H\$HL,IIt +A1hHL$HDŽ$LT$o$D$`$fD$d$D$fH$HD$g$D$oL|$gHL$oMIT$0HT$HHt$P$D$IzHsH|$Ht$A +Dʃf!ALPHH HHAH$H$HD$`H$HD$hH\$`AIHH9AE1L$0HL$HIAL H$H$0($)$ ($@)$H$PH$($)$H$H$(D$`)$HL$pH$H$pH$($P($`)$)$p$tf$l$p$ht*L$0HL$H$0L|$XLl$ H$H$0H$($ )$($)D$`H$HD$p($)$pH$H$($)$H$H$ H$H$p($p($)$`)$P$lf$,$h$(1H$0L|$XLl$ H$LH$H$($)$(D$`)$HL$pH$($p)$`H$H$p($)$@H$ H$PH$pH$($P($`)$)$$,f$d$($`t L$PAMAMH$@H$H,2Hl$HL$HDŽ$WH$f|$0HDŽ$pWH$xAHnHH¿1E1H,$H+$1H$<(tHH9u\H$HHD$HH)HT$H$HHHHHHD$HT$H$I9HH( H 6H9HGHHF1ɺHHHt&HHvH$PH$XHDŽ$` HDŽ$PH$HHH$PXH$H$H$H$HHHHH$KdHH $HLHlIL$HT$HL$HH$HHH$PHt$KH$`H$L$XH$PuMIH$HH$hL$pH$H$xH$ H$HD$Ht`HT$H11HzHH<$H|$HD$?us?҉փHH H$HrA E1H,$AHD$H$ 1H$AE11H$Ht%H$HtHH4@Ht 9vu.H$xHt!H$pHtHHt vMH<$HH$ D$ $ ȉ$H$ H$1H$ 1H$8H$8HH$@HAH$8.HD$PE1CL'H$PHt$$誗H$`H$H$XH$PfC<'H$HD $H$HL$(HD$hHL$(HL$PHDHL$PIL9$ pH|$P.H$ H9$@H$ HH$ H 6H9HGHHF1ɺHHHt6H$ HHRH$H$PH$XHDŽ$` HDŽ$PH$HHH$PsH$H$H$H$H$H$HHHHH$ H$H$@H@H$H$HTHT$PHHT$(HTH$8H$H91HD$PHDŽ$(WH$0f|$0w[H$9W)$`)$PHDŽ$pAII1AH$HH$PHt$ŐH$`H$XHD$(H$Pu!L|$(MIH4$3E1H$'H$hHD$(H$H$H$H$HD$H_HT$HE11HjHH,$Hl$HD$?u 5҉׃HI bH$HrAA.H$pH$($P($`)$)$pHDŽ$WH$HD$H$HD$H|H$HA1HL$(1H+$1H4$<tHH9u H$HHT$HH)Ht$ H$HHHHHHT$Ht$H{H$PHt$H$蕝H$`H$H$PL$XH$`AIQ()$)$)$H($($($)$)L$p)D$`H;l$(HD$(HZHt$(H 6H9HGHHF1ɺ@HHHt'HT$(HL$PH$XHDŽ$` HDŽ$PH$HHH$POL$H$ H$L$(HHHt$(H$0HHH $ILM<(D$`(L$p($ADAL AT0HH$8HT$HD$HH$HHAAIH|$(t-H$(Ht Hd$(tHt$(oAE1H$HD$(H$AHD$A1H$E1HnH|$(bHHUH|$(n@MH$A$D $ $ H$H$1H$1H$8H$8H$HH$8.H$E11H$ 1H$@1H$81H$1H$1H$D<$H H H H H$HH$L$IL9$.HD$(BL0H$PHt$$ ֏H$`H$L$XH$PHD$(B<0fwH$hH $HHHHH H-}Hc|HIITH=}Jc4H4$H H H H H$ IH H 4$H H Tt H H H$HTH$DH$IIH=|Jc4H4$H H H H H$@mII_H=|Jc4H4$H H H H H$8($H$ $H H$  $H H H$ 4$H H H H H$ $H$@$H H$@ $H H H$@e4$H H H H EH$@8$H$8'$H H$8  $H H H$84$H H H H H$8H$.OH$H;$H$HHH$H 6H9HGHHF1ɺ@HHHt2H$HH$H$PH$XHDŽ$` HDŽ$PH$HHH$PH$H$H$H$H$H$(HHH$H$0H$HH$H$HHDH$HH$HDH$ HDH$@HD H$8HD(H$t0HH0D6H ft4H$HD7H$D?H$8H$8L9^A.H$HD$HL$MIH$H$$p)$$)$@H$H$P$)$H$H$$()D$`H$8HD$pH$H$p($p($)$`)$P1MHH$0HD$(MnAAH$\H$XHD$0L$hII I}MIL\$01-f($LNLFIHH HHLH)lHrHHHHD$0LLL9LsHD$0LH4A)$LDLAJAHmHLM9JP]f.HHH@H4HF L9N0r%LH 1HH@HH4 +HHeH+ +HH$PH$XHDŽ$`HDŽ$@W$HHD$0HHH$PHHH$HHH$HH)H$HE1LLl$HDAH$(HII HLHLHLHHT$0LtL9t +HHH$Lf.LHLMt%LOLHHD$0L\HZLUM9MrHH)w L9} HWHH$EM)$ )$IEM($($ IHH HuH 5D1H$HH$I9H$@HHH$PHV1f.H9H9HHI9IsLH)HH HLD$XL9 HHL$HI)HL$0fHGHH)j HHHHHIHD$0LT(L9TLL|$0M4/IA)$ML/AALANAHrBM9VPsA3H$HtHtH$@Ht ]H$XHtH$PHtHt ]L$hMtQH$XIILHHI`1Ht HHfH0H9HFHPH HuH$hH$$X)$$$H$H$(H$0H^H$HH$H}H$HE1&HH1HPhHH0HhHx8H9w1HHPH9v.HP(HxXH9w1HHPHHxxH9w,fDHPH9wHHP(HxXH9vHPHHxxH9wHHHHHe^ AL$hL$HDŽ$Ld$oAE1<AA161I1$A>1L$HDŽ$Ld$o$D$`$fD$d$D$fH$HD$g$D$oLd$oLD$gAHIH$HDŽ$HL$o0AHIhH$HDŽ$Hl$o$D$`$fD$d$D$fH$HD$g$D$oLD$gLd$oLHAH H (qH$H$LaHAHH$>H$`HtH$XHtHt !ZH [A\A]A^A_]ArA1HH$LQHyHH$@ +.G$` /gH$ +@UH$HJHBH뵸H$HqHAH$HDŽ$HD$o$D$`$fD$d$D$fH$HD$g$D$oHD$oHL$gmH76HHt$H!XH6LHWH5HL XyH5LWgHf5LeZUHYDH[5V5HL5HLW HHH9H?5HV H-YH=UrH5+b[HubYHuhXH= rH@5+-[HuKXHu(XH4HLVkH$HZ LY H$Y uX2$HHH$9HH$(>H$5L\HWHRHH$@KH$PWGHH$ ,;HH$(G>H$j>H$pK+HH$K>HH$ +G@[HH$PC5BHHHH$CH$CH"HH$?HH$:H$XpFHH* fDUAWAVAUATSHH$@H$Hx/u W1HH1HDŽ$W$HDŽ$$L1LHH3H$(D)$HH$8H$pDL$XHH$HH$xH$LHHtHHxTHHu!HH!HH|$Hl$JLULt$H$L 1LHH2LHHtHHSHHu HH HHHHH|$`HT$hLHjUL|$pH$L81LHHZ2L(HHtHHhSHHu + HHD$ HH|$ Hl$(JLTLt$0H$LP@1LHH1L@HHHHRIM|I L$pH$HxH$LHLLOTLXo`HpH$p.x.H$H$f$PQfo$PH$H$$H$$)$$)$H$H$H$H$H$H$HH$HH$xHL$H$PHL$pH$D$ HL$0H$H$H$$L$ $fL$$HL$)$@L$`)$)$($($($)$)$)$($)$H$8H$LHH$H$LHH$xH$($@$H$PH$H$H$0($)$ H$H$H($$8L$PH$XL$`L$hf$pH$pH$H$H$H$($($($)$)$)$$ $fD$$f$D$X$D$$f$D$ $W$( T$$HDŽ$$DŽ$L$f֜$ H$HHHL$XHHH$H H$8L$L-`BH$MML$HH$$LHH$$tF$WA( !S$AG IG0$DŽ$#DHDŽ$Ƅ$fDŽ$L$ MAL$IXIqH$H$ A(@@:$E< PH 6_HcHD$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLf.H7MY1H11fDM(IIL$H$ A\(?u @HH @HHI9u!@D$@l$ D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$1IcTL$$HfH~HH$HDŽ$H9H.LHI)I)IH$L$ L$@H$HHI(HLNH$@L$HAD(HH Y]HcHD$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLH7Iy1H11fDI0HIH$H$ AT0?u @ډڃHH ՄHHH9u/HIy1H11f.I0HIH$H$ AT0?u ډڃHH ՄHHH9uD$ +D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$ +IcTLHIi1H11f.DI8HIH$H$ AD8?u t<BƒHH փHHH9uuH\Iy1H11f.I0HIH$H$ AT0?u `ډڃHH ՄHHH9uOD$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLHIy1H11f.DI0HIH$H$ AT0?u  ډڃHH ՄHHH9uo D$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLD$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLD$ D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$ IcTLHI@IH$L$ A@D$ fD$ +D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$ IcTLL$H$H9IH9EMAH$ MQ1H11I0HI<H$H$ AT0?u 0 ҉׃HH HHI9u f$M I(1|HI9u M I1H11f.@I,HHH$@H$HA\?u = ۉ݃HH <HHI9u $HHVHc HMI(HHH$@H$HAD("D$D$ HT$LL$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTL@_"fH~fD$HT$LL$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLHH@HDЃ@HMH D$Ht$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLD$ Hl$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$ IcTLD$Hl$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLD$Hl$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLD$Hl$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLD$ @l$ D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$ IcTLHLAIIII1L1ɐIH$L$ @?u<ЉЃHH DŽyICIrM9JIIMuD$H|$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLLIHHHL$@H$HI9HHH)HH$@H$HH$H$@PmL$H$L$H$IQ )$)$)$HC ($($($)T$@)L$0)D$ D$LD$LT$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLI +I(HHH$@H$HAD(I I(HHH$@H$HAD([I I(H HH$@H$HID(H$H$H$H$H$H$D$HD$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLfH~L?D$@l$ H\$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLf֜$I)L9KD$@l$ H\$L\$D$ L$ +o\$(D$ (L$0(T$@)D$`)L$p)$)$)$)$IcTLf֜$f֜$f֜$HDŽ$Ƅ$f֜$$$$$HHH$HDŽ$d($($($)$)$)$H$`H;$XHHH 6H9HGHHF1ɺ@HHHf$ H$PHHT$ Ht$(HD$0xƄ$$Ƅ$@H$HH t1HH$Pv1HH$H$GHD$ H|$HHHL$ KYH|$Ht$H|$H$PHH$XH$`fo$ H7($($($D7L7 T70H$`f111E11A1I(HI0H$*$H$HL <$$Hu*HH$HDŽ$Ƅ$@9H$HH tm1HjI8HA1 LHALD$HT$HL8HL0LH IM(IHD$LT$b1HH$H$1MH$8H$HL$XL$AM(I1HLT$HD$A111EIILf.ALD$H\$HL8HL0LH IH.PH$HDŽ$ MH H H AH ńH1A|$:H$HMH$H$L0MM$$HDŽ$H$WH9=HH4IH HIHHH<HMLM$$HXhH$ Dh H$L$LHH@HǹHBrL9 uHXhDh+@L;$LH K 6H9HGHHF1ɺHHMRJHRH$H$HDŽ$1HtH7f.DL$L$H$H$H$H;$HHCMH H9HGHHF1ɺ HHHMt-H$HHH$H$HDŽ$ HDŽ$L$H|$ HHH$1TH|$(Ht$0H|$ H$HH$FHDŽ$H$HHH$SH$H$H$QH$HHHH$KvL$H\lDlIL$ML$L$ LT$HD$H\$HD$AIDIIE1M(IA~I(HH$HDŽ$H$$$$f$$$H$H$$$L$L$LD$LT$LL8LL0LL H$HD$XL$II+ +ILHH\$X1LT$X3L($BH$HBHHH HHLH)HrHHHD$XL HML9sLID +H$AD +)$JAIAHfHHM9A@VfDHHH@H4HB L9B r%IMHH%6 LH 1HHv@HHtHH3HH[HHD$`H\$hHD$pHD$ WD$(HD$XHHH$pHHH$0HHH$hH H$`E1ML$8 fAH$MMI LMNLHLHHT$XL4L94 +HHH$hLf.fLHLMt$LOLHHD$XLHZLUM9MrHH)dL9jHXHH$0EM)$)$IEM($($IHH HuH z%DE1Ht$(I9H|$ fHHH$pHV1f.H9'H9HHI9IsLH)HH HL9HHH$`f.DLwHL)WHLHHL$XLHHM +L9 L\$XLILH$AD)$JAJAHrILHM9J@9fHIIAHH9tHJ L9J L +($BH$HBMHLH + f.Ht$(I9hLH K $H9HGHHF1ɺHHMtJHT$ LHH$H$HDŽ$,f.@IHt$(I9tHDŽ$H$HHH$LH$H$H$; H|$ HHt$(IN4'J\'Ld$0ILd$0I3H$H\$ HD$`H$hL$`H$LH$hH$XI)IL0H$PH$ H$pHH$HH$H$H<H4HH$xHH$8H0L$Ld$0IL$8UMD$LHH<+tbLHHtHD+H9vLII|$HHHL H,0H9vDIHH9t,f.IrI|$HHHLHD+H9rI|$HGI9 +I9 +HHH4 HHT;H,;HII)r +L$L9D +H$PH$xL$8H$HL H;H$XHD;H$H$pIIL|$XIIO$/HLH)H$ H9IIL$hLLL.MH$ HJHL$`H$0H$hH$XfIEI;D$rILfILHMEM9s HI9wLa@H$hHLLi-IH$ HI9Hl$XHHL$`H$XI $H;sIL$ Hf.Hp HLII A$AL$AOAL9HIIH9f.LH LH$hL$`uE1HHt$(I9%ABA7HtHtH|$ Ht !+H\$`Lt$pMt?I1f.H I9t$HD+HH4@HtH|+*Ht$hHtHtH*HD$`WD$hH$fwH$:.L$u$ L$I$PI$@H$@L$HH$H$ +L$H$H$H$Hl$ Ld$(HD$0HDŽ$H$H$`3GH$H$H$H|$`HHHHT$hHD$0HGD$ HD$pAL$HD$ WD$(HDŽ$H$H$`FH$H$H$H|$`HHHHT$hHD$0HGD$ L|$pIL|$pH\$hH$@H$8H$HH$xJH@H$ HD$X1H$E1HfH|$`L$HD$0H$ HDD$ HD$XHH$ H$@MK4/IMH$fw0IItKM9$PI$@H$D@I9$PnIHT$XHI$@H$:.Gf.IH$H$8H$L$xhH$H$H$bH$Hl$ HL$(HD$0I9HHL$H H9HGHHF1ɺHHHt/HT$`H4H4vH$H$HDŽ$ HDŽ$H$HHH$DH$H$H$NH|$`HHHHIHt$pHH\$hHl$`H9hH_HH4[H$ H.HH)HH)Ha( IHD$`ML|$pIIH\$hBL$ LfDHH9$ tH;HtHsHt%Mt IK4dHtMtL%MH$ H$Ht%H$HtHH4@Ht =%L$L$Mt5I1 H I9t$IDHH4@HtI|$H$HtHtL$H$L$H$H$L$H$x;u=H$H$H$H$HHKH$HC HSHs H$HH$(H$HHtGHw1HH[A\A]A^A_]HtH#H$H$L$L9vSHtNHMIt)HL'HHu(L% HtH#H$ H$Ht%H$HtHH4@Ht ?#1kHYHH$8@"H<HH8!HHL("HL"uLHH `H#OH= :H%4H=9H%H=9H% H L +$H\$pH\$hH\$pH\$hHua#HuQ +#Hu"e$ Hu2"H! HHL sHH#$ "Z"O"D"9H=9H9$H=8H$HHH9{H*HL^ "HHz# HC!H/!KIHH|$ HH|$`hHH|$|HwHH$ XHSHH|$ ^ +:H?HH|$ H|$`@&HHHHLd$pH\$hH|$`H$k H$H$HI UAWAVAUATSHMHHIIHHtNIH|$Lt$ oD$(H|$Lt$8D$@HEfv-H9CP4HD$8fD$@HEfwHt{HH9CPH4@HHs@HwIH $H.HHl$PLd$xfH~HDHIH0H_! HHt,HH$HD$HL$IH $H.uH$.IH $H.LD$LL$H|$LLIiHT$(Ht$ H|$Hl$PH|$Hl$H\$ oD$(f$H\$`Hl$XD$hLt$hLHuHT$pH|$8HHtMtHtHL Hl$PH|$HwvHL$LD$ LL$(HLLhHT$Ht$H<$u;IwIWIH|$8HHt$@HH|$+Hl$H\$ oD$(f$H\$`Hl$XD$hLt$hLHuHT$pH|$8HHtMtHtHLHD$HIGoD$8AGIHĘ[A\A]A^A_]ALLHLd$8Hl$@Hl$HLd$xHl$PHEf&HH|$X HH|$8FH f.fAWAVSH IIH|$H4oD$H|$uAFfI~MIpHMH1HHHM9<wrM9|vkH9 ItHtXML1HHM9 Hy AH= LAH$D2J HHt.1H9DIIGHHtHHŐHuLM IH8H)H$jH$H$8L$@H HIHH$HH$XHH$(11H$1H$1H$1H$1H$1H$1H$E1H$(wHtDHII1fDHLLDIEPHH|$@LE|$@ HI9uLT$ L$H$LL$LD$| +H|$xHt$HYH|$xH$HD$H$H$HDH$HH9I ,MD,IEPHH|$@L&E|$@D$`HfVH ((HcHMuH|$xHt$HYHt$xH$H|$(H$L$L$j$8HHt$8L|$0H|$( H$4fnt=  H|$xHt$HXHL$xL$L$H|$(H$H$`H|$(HD$8H$L|$0H|$xHt$H0XHD$xHHH$H$H$PvHD$HHHH H(HcHHD$PH$AHD$HHH~H 'HcHHD$PfH|$xHt$HW|$x,H$H$MH|$xHt$HMWHL$xL$L$H|$(H$H$>_|$(HD$8H$)L|$0|H|$xHt$HVHD$xH$HHH$HH$XH)FIH$H1<@H4HH)LT$ L$H$LL$aH<HH HL$(HL$(H$HL$0H$H$\H$H$H$HH$H81H$H$ $E1UH HH$H$ H$`H$(D$PH$ +D$PH$D$PH$HD$PHy1H$D$PD$PD$P HD$PHy1H$E11H$1H$1H$1H$1H$1H$1H$L$It$H$pI;t$ukHHH$H$H 6H9HGHHF1ɺ(HHHtWI$HH4HT$@Ht$HHD$P?I<$LD$H$H$yL|$HHT$PHHL8HD$@H|$xHHHL$@.H$H$H|$x HHI<$HIT$It$LD$HH$hH L|H$HLHlH$L H$L$ID$H$8HD$(H$@HD$0H$pHD$8D$HD$(H$HD$H$H$L$EJHDH$HHfH|$IBHBH +HH$`H)s}HHH8ALT$ L$H$LL$AFWsH$L$H$H$HH$H$P1f@IMHH L EHL$HHT$@H|$PHt$XD$`LD$pH|$xHt$@]H$L$H|$xtIuLH$HyLHHH$u.H$H$HHH?L$H$H$@HHLLHLL$L$8P$HATH IHHH8LT$ L$H$LL$LD$AFHIE IE L9I}HImH11HUIUI}]?u ۉ݃HH yHHrHIMHVH;Qs HkpH9Hy AH-LAD2J,HAHt.1H9tHHGHHtHIHuLMIH8L)׀juHIE H#HHII1HLLDIEPHH|$@L;|$@tHI9uD|$HD$WL$U H t$QH HT$IAFLT$ L$H$LL$LD$!IE1ɀxIHHIUHp@Hp8H)HHMu M9UHL86AAH$LT$ L$H$LL$aHL$7HD$/H$D$($D$,f$D$.$HD$/H$D$7$H$L$LD$LHH$ HHAFAFA1HHHH8HHAH HHx[A\A]A^A_]D|$HD$WL$U H t$QH HT$IAIUAHu!  H  f.fAWAVAUATSH0H9IIIHHH@L(HKH;Ku[HHH H9HGHHGºE1HAIHt$HHH IH$HL$HD$ H;IH$H|$HHL'H|$ HD$(H|$tHHHH;HHSHKHIL$L|LlHCIFH0[A\A]A^A_Hu + HW  f.AWAVAUATSH0H9IIIHHH@L(HKH;KuWHHH H9HGHHGº E1HAIHt HHH$HL$HD$ H;HI @v @[ HthIL0(@HtBL8H HH@L$ T$ HPHCHCHH|$-e .S fH3Q?͔D1f.1f.HHWHHHwH%%f.HHHwH%f.AWAVATSH8IIIHӿHtHHHtwI<$I\$ID$Iu?HD$ H|$HL$ H]H|$Ht$H|$t9I<$It$LLMt$LH8[A\A^A_þH  Hu  HLRH AWAVSH0IHwH_H9u_HH-HtIH$H\$HD$H$H|$HH|$ Ht$(H|$I>IvH9u@IIHL9IFHHGHt IH$H\$HD$IL{3H$H|$HHD$ Ht$(H|$thIIvM~IvL9v6HMtLHuL ELH0[A^A_Hu Hu k H` HLH AWAVSHI!LHHÊC CdHtxIH((@HtRHL8HHCC D$ L$ CKI~HtIvHt /HH[A^A_ÿe !S fAWAVATSHhIIH|$8HHH\$8HT$HH11Ht7H)D$@)D$PH$H\$D$H HT$HD$$[HD$HHD$D$8)$HHIHD$(HT$0HHLvMtH|$(L(<$u,HD$ID$HD$ID$A$LHh[A\A^A_ËD$AD$1HH|$(,H fUAWAVAUATSH8H|$HD$IHwHE1HhL=$@HAHIvL90AFHL)I6LHH9HBտHt 11HLf*fHnftKfȁuHl$ HD$AFE1GH HE1HT$Hl$ Ld$(AFt@t:@t$HD$(xtGHI"HH<tnHH S<Z@HH\$(H;HCHCHpHH;HPALl$Mt,HL)IFtI>ILH6I^@MI@L LH8[A\A]A^A_]Ll$!8H_HÊC CoHIHfo @HIL HIGAGD$1L$4AGAOMII8@Mu3Ll$D$/L$- H Dd$)I L|$!MIvHL)r[IFI>ILHI^Ll$HLQ H= Hi+H L  ! IILl$H;Hs] Hu H|$;L3 AWAVSH0IIHHOHHGH9vH<HCL9v~HKHH)L9LHH9HGHHGH HL$HD$ HD$(HHL$ H|$Ht$H<$H;HsHKAC{ueH{HLLHHH8C&HHHH;HLL7LsHHH H0[A^A_H=H+ Hu  %f.AWAVSH0HtM)GD$H H\$HHHt$HhHjGD$H^HHHT$HD$H5LSL=DH|$HL$AHË|$~D$H5wLHL$HAHËt$Lt$LvH5 L +HLAHH|$HHt$ HbH_LsHHHHT$ HD$Lt$H5LL=YLt$HL$LAH\$H5gL HL$LALhÉH0[A^A_HH|$}Hտ AVSHxIHtQt1WH H5HcHHBHGH8H@H@@LHx[A^wt$ H\$HIuH\$(HCHD$0HD$ HD$8H7HD$@HHD$HHD$PHD$XHD$(HD$hHD$pHt$HLsH|$HjHt$H\LH H H<H` HB  H# H |H + nH +`H +RH~ +DHd + 6HM + (H5 + +H + H HD$(HL$0HD$(HD$HHD$HHD$HHD$PHD$XHD$HD$hHD$pHt$HLÉHx[A^HH|$HZ AWAVATSH8IIHIHNHFHH)L9s>LH H9HGHHGHtHHD$HL$HD$H;:HD$H|$ HL$H|$(Ht$0H|$ t8H;HsHCHLLL{M~ILH8[A\A^A_Hu9  UAWAVAUATSHHIHIHHH4$H|$@t"HMHHHЃHpsE1HOMgIGHD$ E1HHE1HLiLiLi(Li8LiHLiXLihLixHHuHtHHf.L)HHuMgIGIOIWHT$ HH)L9sxLHH9HGHHGHtIHL$HD$HD$ HD$H|$(HL$iH|$0Ht$8H|$(I?IwMHI4$;f.H$H8HLHI,$I,$HHLI9IL3HkHD$ HHH)H9sHH H9HGHHFHtH $H HL$HD$HD$ HD$H|$(HL$H|$0Ht$8H|$(t3H$H8HpHp4HD$@LhHHH[A\A]A^A_]Hu # ff.AWAVSH0IIHHOHGHH)L9s=LH H9HGHHGHtHH$HL$HD$ H;7H$H|$HH|$ Ht$(H|$t/H;HsHCHLL3Ls1H0[A^A_Hu 3 f1UAVSHH HI@t[HH!H H1u=r:I>IFIFHpHt I>HP_LLH@H L[A^]HI>IvSLkH3 AVSHXHHL0LL4$HHD$D$KS )T$@)L$0)D$ H5uH|$HT$ -T$H3IH.IFHIHHL0(@HHHHHAAD$ T$#AQIIH8mwu=Lt$I>IFIFHpHt I>HPH|$"D$L$ H Dt$I HL$IHH H<$HLHX[A^ÿ  HI>IvcH|$y HH|$zH<$H) HfUAWAVAUATSPH/H}(IILu(HE(Le0HtLL +L;Ht6HL)HL9H}@tLLLH~<usLQHE@HtI $| +u L<uILLLB9}HHHHHLH<uII)LLLIH[A\A]A^A_]H=H LH H=H#H=H+ HLH趴 @UAWAVATSHOW )$)$)D$pHH$HDŽ$XtnfffdH%u H HHtCH+HHt4H,$H}L%]I$HAAHHtHH$HHJHHD$hHD$hHD$H(D$p($($)T$0)L$ )D$H\$HHt$H<*Hİ[A\A^A_]E1HEMHD$HD|$PH} (D$p($($)T$0)L$ )D$Ht$ I<w=<t9EtoH}PHH+HD$HtH(uH|$kfI>IFIFHpHt I>HPLEuI$HtzEqHHD$HHD$HHD$H=H KHT$HH$HH8@t$H(fD$L$HT$H$HD$HHJHD$PHHD$XH&HD$`HHD$HD$HD$ H\$0HD$8H5H|$ HH8HI>IvLH HH|$HHaHHd fUAWAVAUATSPHHIIL-L= A׋(n<Ht7L9LHBӿLAHtHt#HH)IHHuɱ HI@ HHL0(@HtoHH HH@L$T$HPHHH8 +H11HHH HH[A\A]A^A_]H HH    UAWAVAUATSPHHIIL-KL=| A׋(4m<Ht7L9LHBӿLAHtHt#HH)IHHuɱlHI,@ ;HHL0(@HtoHH HH@L$T$HPHHH8 +H11HHH HH[A\A]A^A_]HkHH m [ UAWAVAUATSH(IHHLHHHHHM1f.H9uHHH9uHL9ZI)xHHL-L%Df.DzHH HD$HD$HD$#k<IAB׿HAHtHD$HD$HLHHHHHu11HHH9wHHHH9uHHI9oI)7HH)HL=H)cL4/H/HH +I|$uL|$r=H\$H;HCHCHpHt +H;HPAԾHALLL1I)HIA@ *PHHL0(@&HHH HH@L$!T$$HPHHH8 +H11HHH HH([A\A]A^A_]H`L H=LH_#F c Q IH;HsH0L fDUAWAVAUATSH(IIIHLHHHHIO1H9uHHH9uHL9I)HILd$H-HMyLLLLHL$Hu<\$HD$<f.DH\$HILHHHHIw11@HHH9wHHHH9uHHI9HHI7I)t(H)ID7H)I 7HHHHL$\$IL6HD$@<t%|$g<f.HH\$H;HCHCHpHH;HP1I)^ H +I@ HHL0(@HHH HH@L$!T$$HPHHH8D$L$ H T$H HD$HHH HH([A\A]A^A_]HL{ H=H#yC   IH;HsHL脧 fAVSHXH|$D$NV )T$@)L$0)D$ H5~H|$HT$ T$qH%IHIFHI@HHL0(@HHHHHAAD$ T$#AQHHH8lwu=Lt$I>IFIFHpHt I>HP/H|$!D$L$ H t$H HL$HHH HHX[A^ÿ%  HI>IvH|$ HH|$H詥 AVSHXH|$D$NV )T$@)L$0)D$ H5βH|$HT$ T$H%IHIFHI`HHL0(2@6HHHH HAAD$ T$#AQHHH8lwu=Lt$I>IFIFHpHt I>HPOH|$:!D$L$ H t$H HL$HHH HHX[A^ÿE 3 HI>IvH|$ HH|$Hɣ AWAVSH0IIHHKHCHH)L9s=LH H9HGHHGHtHH$HL$HD$ H;7H$H|$HH|$ Ht$(H|$t*H;HsHCHLL#L{1H0[A^A_Hu ( f.@UAWAVAUATSPHH?IAu1xDIIIC<w<u=LkI}IEIEHpHtI}HPYH{E@kLs DcLH0CI fDcH[A\A]A^A_]II}Iu5H{L@kLH0CLH fCDcLs L UAWAVAUATSPHH?zIAu1xDIIIC<w<u=LkI}IEIEHpHtI}HPjH{V@kLs DcLH0CI fDcH[A\A]A^A_]II}IuFH{]@kLH0CLH fCDcLs L fUAWAVAUATSHHHW_tHO0HL$_GO!)L$P)D$@8H$HT$\$(D$PD$!HL$_HL$0O9(D$@D$D$8@w:L$9@t$:HffD1f.@<8/tHH9uH1HtfHH9 HH$H)HT$ue1f.@</tHH9uH1HufHt Hu$8.uHH9HH$H)HT$u1@]E1Lt$@IL%1HH ǀIDHHD$8Hw3t$~@@u1f.f1H-9HctHH|$ HCO'O4KHMMLL)E11H9t5HH</HuMM)N$)IM9MN)IAM)t^It9IuRA8.uLF1<<E1ɨ<HDIHEA8.u1Ax.H)MLHOLGL_D$L$G O0HD$(HG@H0[A\A]A^A_HHLL HHLz UAWAVAUATSHhHDn9Df:E8]ASAIHVN^8\$1@E1ҀELE1@@HTRHEH|$8A'AAL=IcLH=Hq(F u F9AA*HHcHt).u$/u{'w DAuiHHuW.uRHHH>HVH^HNHtHHHNH=H1 E8A AIcLLFMH.11f.|/tHI9uLHuAHHtAHtHu,}.ALD\$8}.uE1ɀ}.AAM)HH\$0H\$`D$L$ )L$P)D$@H\$0)L$ )D$MI)rUHH>LNI LHhHP(D$(L$ @H(HL$0 F9HHh[A\A]A^A_]HL fUAWAVAUATSHHtA?/tE1H$H$Hl$'HD$ Ht:/t1H$XH$`Ƅ$hH$H$H$iH$p$fDŽ$L$1ۀ.HD$?H$D$ L$0)$)$EEIH$HH$T$ $H$IG($($AOA$\$$A͈$H$H$HH|$PH$XD$PL$`T$p$H$^0V N$H$H$~AH$H$$AAO)D$ )L$0IGHD$?D$$$AG.D$AG*D$u1HD$?HD$o(D$ (L$0)L$`)D$PD$D$ D$D$D<u 1<tL$H$L$ $(D$P(L$`$$HL$oH$$D$$ D$ +D$ $ D$$H$HĘ[A\A]A^A_]f.DHHHwH%Ef.PO UAWAVAUATSH(HH$H+HHHHEHtOHD$D$HD$ H|$1H-H)ÿH HA +HL5Hf.H|$覤LӼA +LL5[H +DE1H AH +HmICHAL%_L=XHMtIII$IL$IT$HHHHD$HL$HD$Ht$ HCHD$H;D$ 0HHHL$L(MHXLSHsHtHSLH([A\A]A^A_]H=$H| H=H+޾ IILHH|$GLL藏 DAWAVSHPHL0HMHHپH\$HHHu1HHHW@HſHD$@L=L|$HHKH;KuaHHnH H9HGHHGºE1HAIHt*HHHT$(HL$0HD$8H=cH;CHD$(H|$HL$(HLH|$Ht$ H|$H;HHsHKHHL|HCH|$|tHtrL$,fL$L$(L$I>WG GHG0(yG8fGHD$GJD$fGN*BHP[A^A_H=Hʜ+ ͻ  Hu>  HH|$@H|$eHM HfDUAWAVAUATSH8HL$0HT$(IL7E1H-I M4$LIs#HعI $I:Hl؃؃ufffdH%IƃuHf۵H'H:HHH$D$HL$HHL$I $HH$HtH(zLbmf.LAuHKHHHHD$h(t0H(H޺E11ոD;uHD$H(u +H|$D$iH$HlH(aLT1۹L=MII/DDDfffdH%IŃu H;HHLHH$D$HL$LHL$I $t;IH$HtH(uHuD1I $I)D$Lt$t5H$HtH(u HDM4$fD$uLAu HfkHH HHD$h(t1H(HE11A׸]uHD$H(zLmLd$HD$ HD$H$HH|$(HD$0PH$HD$ H|$H8[A\A]A^A_]H=H^ H=H^ H=H79 H=H4*$ HH|$衡 HHҠH躈 AWAVSHpHHGHHL$HHL5PL|$ HHtvHXHHHtmHL$ @Ht$ F(tHD$ H(u0f.fH(1AHD$ H(uL4Hp[A^A_H=HR+ HD$HD$HHD$HD$HD$PHfHD$XHL$HL$`HD$hHHD$ HD$(HD$0HD$PHD$@HD$HH5H|$  f.AWAVAUATSHI\$ H|$|$uH|$kE1\$ Ll$D$ )$\$XLl$@($D$HH{HD$HD$HD$ L%ELd$0HD$8L|$LLLt$xHDŽ$$HD$@H$HH$HD$`D$D$HD$ HD$HD$`HD$HD$HD$ HD$HD$(HD$xHD$0L|$hHHD$pH=FHt$hȯ|$t7Ll$@MtHt$HHtLHİ[A\A]A^A_À|$ u>HHD$HD$HD$ Ld$0HD$8Ht$LuH|$@HtHt$HHt .1HH|$@H5 HHHJHL$)$HHHEϋWHHHf.fAWAVATSHIHHHG8H|$ L)|$0D$ L$0T$@\$P)$L$`)$)$)$)D$p$t H$Ht IIMu-yHt$pHT$xH|$$|$t]L|$Ld$MtNHLLǨt HCHLL蠨t HCHC8HC(HD$HD$HC0H8uLx HxͰIH|$pL'A>uHD$ E11[IVEF 1AHEuHD$ EN$E10HHtHIHD$(HL$01HD$ EN$AF(EV,H|$HT$pHL$ LARPj(HHK HD$H@H[A\A^A_HH|$H‚ SHHHt$ H8u +HKH9dw]D$D$CHK HT$HT$8HD$@HD$HD$HD$PHL$`HD$ HD$hH(HD$8HH(F|$t 1HĠ[À|$u~HC8tuHC HD$(HD$0HD$ 8uHp Hx2HHD$HHDŽ$$H|$(HT$8H$E11'HKHD$(H@HCHHC8HĠ[HH|$(ٝH聁 f.DHHGHD$)$H fHHGHD$)$H fAWAVSHI>u)H-H\$HD$ H$A u OH^L~H\$L|$H$t(HLHHL"HĀ[A^A_MHtʀ;/uHHIHLHtH|$ Hd|$ tHD$(HtHL$0HD$PHL$XHHD$`HzHD$hHD$PHD$pHkHD$xHHD$ HD$(HD$0HD$`HD$@HD$HHt$ Lg(E1HH诘H DUAWAVAUATSHhIHHH5>LFHHfHHbHD$@HT$HHHt$@ +H$HHVUL=3Hl$Ld$HL$HH$HL$D$D$( 1DL$t$HT$HD$ uH$HL$H9u4CH|$=GD$H$HL$H9HPH$D(Ex3AEtIcHtHsHt HD$0IF(D$ AM6C)$HCWC($)D$ -HtL0(D$ @HxHX[A^ÿݓ HH8{He f.@AVSHXLwHHHH$WD$HHL$HP )T$@)L$0)D$ H5jH|$HT$ s$)D$ HD$HD$0I>HtHsHt ̐HD$0IF(D$ AHwLHX[A^HH]zHd H)$Ht($HwHÿ f.HHwDAVSHIHHH$Lt$HD$H fHD$HOH5YwH|$1L f.AVSPHLwHHt+!HtHLpHvH[A^ Α @PH?t HHvYW DUAWAVAUATSH8IIIIHHfffdH%u H1gHu'H=qH jLmHT$F HHHHrAH\vHD$HD$HD$HVHD$(HD$0H|$  H-3Hl$HWiHD$Ll$Ld$ H=yt(# u'H=8Hx$ =IHfH-wHuLAV HD$HT$H|$#L%FLAV HD$HT$Ht$LUH-H=ҒdHr(HOuHD$HD$HD$Ll$(LLB H=H=H=w)# HXH|$Ht$H|$'D$HD$HD$HrHD$ HtHD$(HD$0HD$8HD$HD$HHD$PH|$( UAWAVAUATSHIIHD$P(yD$XLd$PH-ȎHL1ՃuӃ8tj D$V tH=^11tD$^ tH=<11tD$f tH=11t ڌHHΑH-ǑHIW)D$p)D$`)D$PHDŽ$Ht$PHtE1HD$ HD$(H|$PHt$ Ll$(LӋD${H\$ H|$P7D$(HH H t +H1H1HH)HHDHL)AW)$)$)$)$)$)$)D$p)D$`)D$PHDŽ$HT$P 1>H|$Pu0DŽ$H HD$PHt$P 1 HT$P1H|$Pu0DŽ$HHD$PHt$P1ÈM/HHmainHD$P(}D$XH|$PLd$PH\$XHl$`H|$PHPLAVD$TD$PHHt0D$0HD$0H$H=H `lH$1X|$Pu,L|$XH\$`LHseHtHSLOl$THcH[A\A]A^A_]H=lHsGS H=,Hss 8 F HD$HD$HHD$HD$HD$0HEcHD$8HL$HL$@HD$HHZcH$HDŽ$HDŽ$HD$0H$HDŽ$H5r}Ll$H4HD$HD$HD$0HbHD$8HL$HL$@HD$HHbH$HDŽ$HDŽ$HD$0H$HDŽ$H5;rH$m ILH IH|$P.kL[ HcHD$XHT$`D$PHHAWAVATSHxH>u +LvL~HF0H0HHDL6L~HLLH<$AtMHt$HtCHT$HH$Ht+HL$8HL$pD$L$T$()T$`)L$P)D$@IHD$pHD$0(D$@(L$P(T$`)T$ )L$)$L3L{Lc($(L$(T$ CK(S8HD$0HCHHCHx[A\A^A_@UAWAVAUATSHhEEH)$@HjB()$B8)$ HBHH$0B)$L!A)$PH$HHux u HC1H{H8HnH$HD$HD$HdHD$ HD$(H=Hx zL8H=ƣЃH ^HL$PH5aHt$XHD$`HT$hH $HD$HHD$HD$HD$PHD$ HD$(HLHHD$PHxyHD$XH,mH$HD$HHD$HD$L|$PL|$ HD$(HNHx HH$H=עقH$HL$PH mHL$XHD$`HT$hHlH$HD$HHD$HD$L|$ HD$(HH$($@)$H$0H$($($($ )T$p)L$`)D$PHHH HH($)$Hl$(D$P(L$`(T$pD$L$(T$8H$HL$HH8HH$HH$H\H$HDŽ$HH$HDŽ$H8HkH$HD$HD$HHD$ HD$(Hq($)$Hl$(D$P(L$`(T$pD$L$(T$8H$HL$HH8HH$HH$H[H$HDŽ$HDŽ$H$H$HDŽ$H$uHH8H5FtHh[A\A]A^A_]($P)$AI($)$D$Hx u~H(H=H ZHL$PH5]Ht$XHD$`HT$hH $HD$HHD$HD$HD$PHD$ HD$(HH΀,HH8HiH$HD$HD$H-Hl$ HD$(HHHxHHH0H4$HT$Ld$($D$QHH8H$HD$PL5sLt$XL=#iL<$HD$HD$Ld$PLd$ HD$(HO$u[$$HH8H$HD$PLt$XL<$HD$HD$Ld$ HD$(HHH8HhH$HD$HD$Hl$ HD$(HJf.AWAVSH HLHLt$LH$H\H1HLL<$HhHLLhH [A^A_fDSH H HcHHH%NHHH\$HH\$HNHtHŅH\$H]HGH1H\$ +yHH\$ fH-HӜH\$JHϤH\$ 7HH\$ $HH\$HyH\$ H4HH [f.UAVSHH;HHt9AHC:EuxH qHcHHS(H;U(u^Hu H{ HSH;UuJHuH{ IHS(H;U(u.Hu H{ ~uHS8H;U8uHu0H{0~tE1D[A^]ÊC:EAAWAVSL= H L1Hg}Ht+L)HH9uE11L(HHtIH̀E1L[A^A_AWAVSIHcL5LHL=L[A^A_%}fUAWAVAUATSPIIY A +yttCuC&1@ +ۿEtktLuy €y Y u"ot.y tUy t<1Ҁy Y tOuS @J1 uʀy u y uy tHIFy Y u#) Da1LD1}uHFHP4H [HÿVH> f.fUAWAVAUATSHIuoH_HL?fHLHai<$u\Hl$Dd$Dl$H=QLluIEtHLH9rQIH)u6HLH[A\A]A^A_]%lH|$Ht$Ldlt1H[A\A]A^A_]HQHHhk f.@AWAVSHPHILwHtHiH&IOLHD$H\$H\$I;OuZHH H H9HGHHGº1HHHt%IHH IHT$ HL$(HD$0I?PHD$ H|$8HL$ HH1H|$@HD$HH|$8HHI?HIWIOHIHL$HLD$IwHIwL9vIKvHHTHP[A^A_HSLg Hj Hui H}j HH|$QH.< f.fAWAVATSHXHt$HHT$P?uHG +H.iHHHHDHL$ HD$HHD$(H=m@gHIHD$0WD$8H= +QHt$0eD$0)$HD$@HD$H=mHH=mHtTLk8IL%> H8L9t;H;HtHsHtAHs HtH{HtHtƺAHlHt Hk8HtH=lHt fH=lHilf.@HtLHHpWLHlHt#H=llHtHiHt PfHD$HELF<7A~17AFH!7<7A~7Iv(H"En=u H@6F(6I96Lt$`HH|q5H=w15&_DKaH$@H$@ b($p($($($)$)$)$)$($)$$$($)$H$H$H$H$@za($($($($)$)$)$ )$ ($)$ $$/ ($)$H$H$$($($($ ($ $$$!$1($ $A$/ $PL$`HD$H$hH$H$($$pH=6euAH)eH5 eH$@*`$Ht H$HSPL$@H$HH$_H$@yH=d?LL$(M)LdIXIpHLL$(t4E1H5LHL;LIL9sH3<Lr] E1IILD$@IH81HD$LLt$(f.@H9L9pL`L9pLrH\$`LD$0I<$HD$@HP0H$H9$?LP Li K:HH$ +K :HHDŽ$0H$8WHDŽ$H$KT:XKt:@KD:HH$H$H$H$HDŽ$ HLT$8L$6K:HH$A1H$1HT$ 1ҀyIH9HL,HQ@HQ8I)IH11DL~L$H$?u 4HH @yLHrHt#H$HBH;AH\$ sLkpLH$ LQ HD$M LAE2J HHt/1I9T@HHGHHtHHÐHuLMH\$ H IM8I)Azju H$ IzfAzh.ubr]HD$HLl$XHHD$@LHHD$pHE11H$1H$1HD$H1HD$P]IHII1ILMDH$PHH$@H$a$@i HI9uH$H$H$IL9HD$J (ND(H$PHH$@H$$@ $`fUftIfuH$H$HܜH$uHD$PH$H$VH$H$H虜H$HH&HD$HH$H$H$H$HJH$H$HHH$LHT$pL)AK 1<@H4HH) H<uPHH H$H$H$@ H$H$H H$@ 1H$H|$xH9LǸH$H$H|$x1HD$P1HD$H1H$1H$HD$ H$H$H$@ H$H$H Ƅ$H$@ H$H$H$H$H$D@D1f@HH\$@HHfHBHLH$H)Ll$X1f@HHH@IH L CHH$HL$@H$PH$X$`H$pH$H$@L$H$H$HuzH$H$L*LH|$PLl$XuSH|$HuH$H$H$K,H$u!H$H$H0H$K$L$@HDŽ$HH$H9t$ HH8H 6H9HGHHF1ɺHHHHt\HHL$H$HDŽ$BH$H$HH$H$H$HDŽ$H$HHH$VsL$H$H$:7L$0H88HHHH$8HT$ HH$IL@$@$P$`$pA\0AT ALAHHT$ H$@H$H +H$H$L$IIII}JmLH$L1AE1LLt$(H$H$L$L9HT$RHIHH4IJ L4IMHLWH 6HD$E1 +HD$H\$ H$Ht%H$HtHH4@Ht 'THtbHL,1fDHHI9tGI|uID0HH4HtI|(SIt@HtI|8SH$Ht HH4HtMtLSLt$(HtHtSLt$(1HT$8H$H2HH$@L$PHL$H$HH$XL$`;u%$@$PH$`HC K H$@;HH$LT$8L$HO:K:HtyO:Mt1O:I1HM94H$w M9t,HDŽ$pL$xL$ALD$0AH\$`}H$@LLH5L$PL$HH$@D$XD$\H$`H$HDŽ$pL$xL$HAH\$`L1fH)H +HHH;H @M94wHH$HHD$L$PH$HL$PH\$ Ht$L($@FIHHHHLH)d3HrHH$L H IML9sL$I4AD)$@HFIAAHwHLM9A0gHH@HFFHKHFL9FrI4>HHH)_,L9k,HT$HLT$xL$LD$ H$ITI >H$IL>HL$XHD$PH@H$L4HRM,HvHD$pHH)H9HT$H$HL<@LLLJH$IH|$!H$H$0HL$pHLf.@IOH;Os HHILHQHPI9HHI9rdHL<@LLLCJHD$H$IH*H9!H$HT$pHHf.IUH;s IUH HqHLII~IMINAEAL9HIIH9rLHAAHtHtH$Ht |uT(HH9uHLHT$H) +H;T  +D +I +HGH ,L1I9HHp@x, HuLHD$L) +HNH9 +HHHHHH@H9h +FI9\ +L$HT$LL$0L$Lt$`HH|$@|s H=K1 1HD$81H$IHH@LH|$@L$LL$0HHHHfytIwL$Ht$Lt$`C)$Ds3H7($DpH$($8$HD$H@H$L4I9yHHfxt@$<wC)$C艄$HL$H9$uxHD$H,Ht$H 6H9HGHHF1ɺHHHtAH$Ht$H4H4vH$@H$HHDŽ$PH$gHDŽ$@H$HHH$@aPH$H$H$iH$HHHH$HL$HI($Nj$THH$HDŽ$@W$H1-H$H$P$)$@H$@Lt$`H$H$Ht +HH?@A@A)H$13($@)$H$PH$L$HL$H$HL$@H$L$H$H$HL$0H$H$H$HL$8H$$H$(11HH$H$HHT$@HH GHHDH$HL$@HDHL$@i1HH$H$H.HT$`HHH GHDH$HL$`HDHL$`1HH$H$HH$HHH GGHDHT$ H$HDH$0HH$H$HHT$0HHH FHDH$HL$0HDHL$0m0HH$H$H2HT$8HHH FHDH$HL$8HDHL$80HH$H$HH$HHH KFHDHT$xH$HDH$/HH$H$HHT$HHH EHDH$HL$HDHL$q/HH$H$H6IHHH EHDLD3/HH$H$HH$H$HL$@H$H$H$HL$`H$HL$ H$H$H$H$H$HL$0H$H$H$HL$8H$H$HHDH DHDL$H$H$H$HDŽ$H$HDŽ$ H$(HDŽ$0H$8HDŽ$@HD$xH$HH$H$PH$H$XHD$H$`Ƅ$hH$@H$$@t>H$HH$g.$H$I$8$L$;H$@H$).$8$;$$uCH$ HH$HHH4@H,H$H$@-$$$0$3$$$$$7$G$W$g$$wH$(H$JHD$PH E1HI?AIMLL6+H|HL$H)Lt$`HHt H9LW)Lt$`HIIIHt$HT$@H|HL$H)Lt$`Ht H9L)H$HT$8Lt$`ML$LH1H|$@L$LL$0Ht$ H@H9/|uT(HH9uHLHT$H)rH;T r DH$@H$+$0$@$P$`)$)$)$)$$p)$$$uxLt$`H$HD$@H$(HH@Ll$@HLL5Qf.fII9I}HtIuHtAH$@ H$@*($($($($)$p)$)$)$($)$$$$)$H$(H$H$ HtHH4@HtH|$@(H|$`Ht$*LH< IH$@ L$H HDŽ$P HDŽ$WH$Ll$xIEH$IEH$IEH$A1H$E1HD$P IH&IIL$LL$0tsHHxLHHHILI9LrMTPM9TEHtbHHH$ HHHtDHHHH9rw8HPH9r-A1H$H\$0H9H$Z1II)0 H;t$Pa LHteHHH$HHHT$xJ)$P)$@IJ($@($PIHH HuI HH;t$P IILl$xMHGII) +IHHN<+IHHJ (ITMI9TLrwfL9 saM\MTIAOAIr2LLA I0IH HH9tH9Q0rwL9I rL LYHQLQHtIHI +=HLl$xH$H\$0H9]IHH H 6H9HGHHF1ɺHHHt*HH$H$@H$HHDŽ$P HDŽ$@H$HHH$@BH$H$H$H$HH$LHHLtL$IL$IH$H$L$L$@ LT$8L$LLI)IL%HL$ HL$H$H$HH$HL$H$I<I4HHHT$H1HT$0H&LT$8L$L$ILl$x}MALHI<tRLHJt2IDH9vM$>ILH)XL;d$PbHT$ HD$L$H$ILI>H$ID>H$H$IIMIIO<.IHH)HL$H9HIILLL$LD$8MHD$HHL$IMIGIWI9UsI&IU@I;WH@u LIHIHHAL$A$M9IM9wyLLLr#HD$8IHL$H~iH9~dLd$xHHHI9Or +wHI9s IO H Hp HLII~ AAOANAL9HIIL9rLHAHHH$AHL)t;MHH9|LLPMNHH9HwHL9sXA+1ILl$xH$H\$0H9@AH$HH$t+H$t H$HtH$ H$H HtH$@ HtHt  H$0HD$H$8L$@L9v_H|$tWHH4JL f.fUAWAVAUATSHMLD$@IID$(L$ Dƃ1LHHBǃHM9HH HwHH!H$H|$xHL$hL, +E)IAIAY$Aq(Ay,HD$L$\$t$ |$$AADDȉL$Lt$ t$D HiÅBH ))݉ HAAD AuAIHD$0xEGD$(D$ EuAEuALL$0LT$X)\$ D$Hs=LL)Hw8HT$сAI  9-H%Ht$A6HH t$IHt$D$AI x 9 +HHHc?AyxԅGHHt$)ȉD$f!0H%D$$H&PD$DDA7 r< ֍MHHHc?gAy9sM9t3MFA6HH Ht$PT$rMƉD$(D|$HH |$IT$E1AtEuRHl$HHH|$HH)‰T$1!HpAD0FD$ E1E8A\$ |$ Ey0Ai4A/9sUD$HLL)HIHT$сAI| 9GH9+LT$XA!LIH$H$L!LD9HD$0L)H9IJ48H!)H$H\HD$0@Ht$H|$0LL$0AL\$PD$(LT$X\$ ESHt$A6HH t$IHt$D$ r< ֍MHHHc?Ay|#9sM9t0MFA6HH Ht$PT$r*MƉD$(SD|$<A EAI|J 9}MƉD$(\$ LAI|xO t~HHt$)ȉD$T$,A9!)GD$ E11H +HHHc?:Ay|#xHuffA"A Efu +fAt:HH$DŽ$HyHL@L$$fA A A E2 r< ׍KHHHc?Ay|#9sM9MFA~HH Ht$PT$\$ AI|x 9-A r< ׍KHHHc?Ay|#9sM9t)A~IHH Ht$PT$M\$ kMD|$<\$ D$(A ExA =L$At AI9DD$ KL9wLH)H#D$xL)L9E ADDD$(~Ld$`Dd$LL)> LL)LL$xL!ʋl$ H9HGH|$@LLIMML\$PIA )݉l$ uLd$`LL$0D$( |$ D$ L$4M9AIAQ AQgAAu*s,M9tAHH T$IL$E1AtEuGHT$HHT$L$AI AqD$ E1EuIAE=A +=HHH|$1!HH|$)‰T$l$AHHH|$1!HH|$)‰T$l$ AHl$)ƒ?HHHt$T$()$HDŽ$ T$փ HHHH!HD|$ IH A9!)Hl$T$D$ A$HD$HHD$L$T$A< AD$HIHHT$сAtI<} 9H\$ M9 AILL$0AAfA1HL H= LHtK<9H!)HLL$0Dl$ A +L\$PD$(IM9tVDЃAHT$0JD HiBH ))׃ AuAIEu +AEtALL$0LT$XAHl$Hl$T$M)ID9AGƍ)щL$I)I9_ HHHH!D$L$AA/D$ AA.HH l$IHl$D$,H|$@LLLL$xLL$0L\$PA ID$(Ld$`Ld$l$D$D$,T$ t$$LL)A HHt$pwAHII ă D%ADAADHT$t"L>ADtL>ADHT$DIH/iA)fD2IH/i)fBHH[A\A]A^A_]f.DHHfHOH9#H)H1<t HH9u11f.AWAVSIIHtQHH9Ht%HqHtHLHu!M~,Mt4LHHtIF1L M~1I^I[A^A_HHuf.AWAVATSH8IIHHt[A?/uUL;HIHLLH;HtHsHt L#LsLsPHCHtH |/H;CuAHH8HH9HGHHGHtH HL$HD$HD$H;>HD$H|$ HL$|H|$(Ht$0H|$ H;HsHC/HCHHCHKHH)L9s>LH H9HGHHGHtHHD$HL$HD$H;:HD$H|$ HL$H|$(Ht$0H|$ t*H;HsHCHLL`LsH8[A\A^A_Hu L] AVSPHL7HEtLHH[A^%HLHHt [A^%[A^%f.H?8%f.H?%mf.H?t#HwHtHHtHt %7fDHt#HwHtHHtHt %DHt#Hw HtHHtHt %DHwHtH?HtHt %f.AWAVSIIHtQHH9Ht%HqHtHLHu!M~,Mt4LHHtIF1L M~1I^I[A^A_HHuf. H +@H5Hc H Ho ú HW úH< H( ú H ú H +ú H +ú H +úH +ú +H +úHy +úH^ +HJ +úH. +úH +ú H úH ú +H úH HHWD$HG$GHL$HO(HUAWAVAUATSHHL>IOH;OsAH}HuHH}HHsHu{H{(HC HLKID2J4HHt&1L9|IGHHtHHuULMt,IH8Lc MH$HCE`)$ EP)$E@)$EMU ]0)$)$)$)$H;K)HH@H H9HGHHGºp1H@HHHHkpHT$ HL$(HD$08|HIHHHH$*fADŽ$2HCLc 1HMl$E$2JHHt'1M9|@HGHHtHHuLf.HHM8H;\HD$ H$PHL$ HHH$XH$`H$PH;HH$I$I$HHSHKHkp($ D`($DP($D@($($($($\0T LHC1ۉH[A\A]A^A_]E`)$@EP)$0E@)$ EMU ]0)$)$)$)$fA +($@)$($0)D$p($ )D$`($($($($)\$P)T$@)L$0)D$ INHCL9s5H4LH<LHHHHIHHLIl$`M|($)$ (D$p)$(D$`)$(D$ (L$0(T$@(\$P)$)$)$)$L9s!HkpHHkpHI)IkpILHkp($ D`($DP($D@($($($($\0T LDfA$2H$H@(H$HL$H$HD$H$H$8HHHHxH$*H$$fDž2Hl$ A$2LHHHl$f2KLHL$IkpA )$ A )$A )$AD `AL pA A )$)$)$)$H InH)H9ID$`H$H4LHL-8H$ALLl$I}`HkpH$HkpfE$2($($($($)$P)$`)$p)$($)$($)$($ )$H|$MD($@)$($0)D$p($ )D$`($($($($)\$P)T$@)L$0)D$ A2LEH $LqI9w4IEH4JL0H=  LLL LLLLͩ LHH LLL1H LLLHL~ LL1Hg d$0H=H LHT$0+ LH|$LLL LLH|$LL f.UAWAVAUATSHHHHH|$H1OLmM +H\$0HEHD$(D HMHEHHL$8HD$@H1fHQ1@xHf.fH9tAQH?@r;H9t;H? @r6H9t:1H?31H@s1H @s 1H ցt:HtHHH92HuHUHG 1HD$(N(HHHHD$ HD$AHHD$AAE1AA$1f.fLL)ALCIMFIMCuL9HB<s%fB<rB< HHHI9w$$L)I$HHfHaILwLL H tL1IIHD$sbD1AAHD$LHD$H =H3|$%HD$%=L9Hl$HvHGHTDTHHL9wIHD$BDHL9XD!HH tH1Ht$H +1t$HHL H tH1IHH1Hs91AH1Hr"HfHHHHH$HW>HwIH&1fDIHD$ HD$LH5X H\$0H@uJHT$@Ht+HHt$8iu.H5$HPuHHt$(L;tHH[A\A]A^A_]H5Lt$L=>rLd$0H\$ Ht!ED$LLAHHt@1HH HL f.UAWAVSPIHvMHL9vIB<uuIMHAL9wE1L9IB< wtIMHt>I +f.L9v&B Ѐ wIMHHp4Hs*1L9vIB< _uIMHLHr IHH9vHH[A^A_]ML9t=C< +2HtH9t"A< +O +HL)EM +M< +IHH1L5W1H9HkA<_HuLL)H *LL)Ht#H9tH9KL)LӀ|HHHt'HXH9tH9KL)LӀ|HHHMM)MI)HM"LHwHHGHGLHL7HOHGHwLLL LL1 LLH fUAWAVATSH HOHwAH9uHH0HFHG¾XLsH=HcHH;H9i<_bHFI1H9LA<sH~I>H9A<8_HI6HBA>HKHCH9wHHKHCH9vH<EH3<Lu(HxI>H9v><>_u8HIHKHCH9vH <KuHHCH t?1H9,>_tGj@ +r j@s©j@HI>I@HsHI>HH9LA<sH~I>H9A<8_HI6H9LA<sH~I>H9A<8_HI6H9AHD0HHsHr +< HHKHCH9H3<sHxI>H9j<>_`HIHH^H)1A>H +HT_rJЀ +rJs©JxIIgHHsV1>H9FA8_j@ +r j@s©j@HI>H@Hs1>H9A8_j@ +r j@s©j@HI>H@Hs1>H9|A8_j@ +r j@s©j@JHI>H5@Hs'IHH9HI>HHHYHHH [A\A^A_]-HI>HHH HH [A\A^A_]HIE1x1A>H9vk>_tIp1@Hs&HI>HtHtHHH<$ADH [A\A^A_]f.AWAVSH HL_HI9H8HOHK¿9L{1H5}HcHI9RLA<LDLOMM9C<_HI?fHh\L[HKI9vH<EuHI1:H4&HH [A^A_LI9A<_HGI1UH{HH [A^A_-I9iLA<G[HOII9?A<_4HI?H1I9LA<GHOII9dA<_YHI?HuIH_AM)1A>IH1AD<_|p@ +rPsPIHIH@HHs1A>M9C<_.x@ +rPsPIMHIH@Hss1A>I9bA_z@ +r r@s©r@0HII@Hs 1A>I9A_z@ +r r@s©r@HII@HsIHH9IMH*{HIHtmHtgII9v H;<EHBfDL[HKI9vH<puHHKLHH<$t HtİH [A^A_HIHtHtI9vH<UuHII9v\H<KuSHQII9v<Cu HI8HHH<$tH|$tH|$u@HxlHCH9CvH <EuHHCHH [A^A_DHAII90<L&HYII9v<_u H1A>I9_tCJЀ +rJs©JHIIHsHIH1f.AVSPHwLOAL9LC< +Bu+IIHOH9(A< +_IAHG1HBIQHW<RHr()H\H9vH<nu ILOLH9HHGLII)A1MfDLHAH HHOKIIH +rύKrǀ_HL)H9rf.H9vsA +_tEZЀ +r&Zs©fZs@HHOIp.Hs$HHOHtL9H[A^HuE1DH[A^f.UAVSHHHHH5At DH[A^]HtC H)s2HH{H5 H{H5H[A^]%HD$HwaD$HsH|$-H{H5?itHsH|$A]fUAWAVATSHPHHHHE)HHH9HHD< +HHHAG<H HcHH HHEHqHAH9L A<sHhHiH9A<)_ HHAH3HHELVLLFMM9C<_MIBHF1H HHEnHqHAH9+L A<sHhHiH9A<)_HHA15@HA-@tH{H50Ñ +H{H5H;1L=L%;WHCH9Cv H <EHtH{LAԄHHH;uHHHE!HHH9HHD< +HHHAG<rAǟAA@HAH HHEHqHAH9HL A<s:HhHiH9YA<)_NHHA1IzIE1A>1I ?HAT;_~JЀ +rJs©JiH~IWHHsFH$Hl$H|$HQH|$ EM)L$@)D$0HsH|$0tAH{$E11A>H9A)_Sz@ +r z@s©z@THHiI>@Hs01A>H9NA)_@z@ +r z@s©z@HHiI@HsH~HuE1IE1L9MBHKS LL$LD$HD$HL$ T$(@H|$8H{H5xeHsHH{H5F2tHHiHtHtH;t Ht)HH{H5HP[A\A^A_]%׍H{H54AHAM H{H5H1,H$Hl$H|$HH|$pEM)L$@)D$0AH|$8u H|$HoH{H5eA<HsH|$07 HHiHHH;H$HD$HHCH{H5D|$H{H5ohACASH{H51A>H9vYA)_t=z@ +rz@s© z@s/HHiIp@HsHHiHtHu0HH{H5ADHP[A\A^A_]H;H$4H{H5xHsH|$H|$8uH|$Ht-H{H5J9u\HsH|$0ތuIH{H5 u/HsHuH{H5:A fHHHHDtwHQH9QvPH1<LuGHHQLMLEMICIsIH9v>A<0_Iu4HIs1HGHOH9Ov<Ku HHOHI1A>fDI 1HtMAT0_t9JЀ +rJs© Js%IsIpHHs IsHuHHH5%H@UAWAVAUATSH(HHHHEK +HHH9H= +H@, +HHHE<9H5H HcHH{H5=*ASHoC@Au.H{H5 H{H{H5 H{H5&AH{@PH5H{H5uAHHHEtXHHH9HvNH< +LuEHHHH HHELHAHqIH9A<0_IHHq@RtH{H5KHH([A\A]A^A_]$H HHE]LQL1LALM9C<_LIBHA1.H;tHCH1H([A\A]A^A_]H{H5OAxH HHEGHqHAH9L A<GHhHiH9cA<)_XHHAE1H HHELQHAI9oLA<GaHxHyI9A<8_HHA1H{H5yAH;X1L5SL= LHCH9Cv H <EHtH{LAׄUHqEHH;uH5H{H5$H{H5H5H5H5H{H5H{jH5[H{UH5^~H5EuH5H{3H5H{#H5 H{H57H5.H5RH{H5H5H5H{H5H{IrHE1A>1H.HTAT6_9z@ +r z@s©z@!HqI@HHs1H)k {~E1H;1L=3L-IHCH9Cv H <EHtH{LAՄH HH;u1A>I9A8<_p@ +rPsPHHyHIH@Hs~HqHuE1IE1L9MBHKS L $LD$HD$HL$T$ H~ARD)s IHI1A>I2HAT0_z@ +r z@s©z@HqIw@HHseE1A>H9A)<_x@ +rPsPtHHiLI\I@IsKHHCHuH{H5@H{H5lHHyHtHu1HH{H5Ͽ́tAE1H{H5uE1L5L%FGIC H_uL9MtH{LAԄtHHCD)s HqHHHuWH{H5- 7HHiIt IHH{H5ҾЀtDH([A\A]A^A_]HHHEnHHH9H`H< +LSHHHH HHE;L HAHqHH9vA<1_Hu HHqE1HHE1A>H.HAD1<_x@ +rPsPHqLII@HIsH{H51L=L-aEHC HzI9ttHtH{LAՄtH{H5WR|HqIuNHH{H5!H([A\A]A^A_]%H{H5~"H{H5~HLH([A\A]A^A_]f.DUAWAVAUATSHHHHHEZHHH9HvH< +Uu!HHH@H;uy1HCH9Cwb1HCH9CvVH <KuMHHCHHHENHHH9H H< +CHHHAL5_ @E1H{H5}AMH{H5ʻ}A^HD$HL|$PHt$XLt$XL|$`HD$hL|$pHD$xH__H$fDŽ$L{H<$HT$HL$HD$HHL$HMIH)HHfL4$Mt(L|$MtH|$u@H$HH{H5HĨ[A\A]A^A_]%|$w$t Lt$HHT$PLt$HHT$PL9NƄ$L)Lt$XLLL| H$HD$@D$HL$XT$h\$x)\$0)T$ )L$)$L$L5Af|$AHl$LHt$$u L$H$H $HI)H$4|$Aub|$@t H,$Ld$H,$Ld$I9tBD$AI)Hl$H{H53Aք)H{HLAքUH{H5b2{H{H5F{AH;tj1L5L=@f.HCH9Cv H <Et4HtH{LAׄH utHH;uHHCH{H5zuFHHHEt HHH9HvH< +uu HHHE1H{H5=ztDHĨ[A\A]A^A_]HtH=Hn+| UAWAVATSH0HHHHHDHQH9QvMH1<BuDHHQH HHEqLQL1LALM9vvC<_LulIBHA1JHKH9KvB<Iu1H.HtJAT6_z@ +rz@s© z@sHqIp @HHsAH;1L5L%J>HCH9Cv H <EHtH{LAԄ$HHH;uHHqHuE1IE1L9MBHKS LL$LD$HD$HL$ T$(H|$ADH0[A\A^A_]HHCfUAWAVAUATSHHH@<5AH;L-[=IAHCH9CH <pHHCH{AtH5\AՄtH5AAH;LHH<$t}$L$)L$0)D$ HsH|$ xuwH{H5AՄu`H5uTH;2Au1CH{H5#v-H$HH{H5vADHH[A\A]A^A_]@@UAWAVATSHPIH?LHHDHHH9HvVH< +BuMHHHI $HIELQL1LALM9C<_LIBHA1It$Il$H9D1f.@H.HAT6_z@ +rz@s© z@sHqIpq@HHsbI|$H5tuAH5H2Jc HH5CGHqHuE1IE1L9MBIL$AT$ LL$LD$HD$ HL$(T$0H|$HP[A\A^A_]H9HHGL/IHL (I1f.fLH7A H(HI\$YH +r֍Yr΀_H (H9H9t<H)Ht A|H<1]<0I|$H5_I|$H5H9HHGL/HL (I1LHtkALH(HI\$YH +rٍYrр_u?H (H9H9t<H)Ht A<HHH r$I$I|$H5hfr1Hdwȉ%=tL$ I|$HD$ HD$@H->HD$HH9gHD$HD$HD$ HD$@HD$0HD$8Ht$H5 5H5m,H5H5 H5L H5ޮI|$pM HI1փJ H9ox HJ4HH9t oH?1LωփrJH9tDHA? )E1LD ՀrJH9tH? 1҃ ՉrЃ +Aj#jH=wHd$I|$H57cH=QHd+r L do f.AWAVATSPIHHHEHQHqH9HHGH9L$II)E1LLCJHHYXI +r׍Xr<_J HH9HtH9t<HtHH)LHHt C|MzIrRI~H5nuOI~LLII~H5H[A\A^A_%unH$IuIvHlH[A\A^A_O"IHH1+@Ɖ!I HHLD$u{ADL$PHT$@HHHLD$uWkD$PHT$@LD$I}IL|$`HD$pMHHLD$u,IL|$`HHLD$tL9twA<lL9uxHtL9tcA<XIIEA5_ZAHNf 1IAIAxLLZCK L +H9uHr:@x HH9tArH?@r;H9t;H? @r6H9t::H?31H‰@s1H @s ,1Hƒ f.fw4@+Ѓ IIuUA=ZNt[IsLD$A8__ZNlIAItJAxCLLXL5 IAIt AxMMK /1f.DI9tA|H@yMI}Au@1HItLHAE?H@rH9t7DEHA?H+ [HL$`Ht$`LD$IE1HD @rH9tuH?H 1 ƃE_ILD$v^A=_RA8RtaL5NIA5__AHRf A@<MhIHL5IuoA8RuiA@<MhIA@<MhIL5<w'M11f.I9tIA|H@y1H$HLhLxLHL@ L`(Lp0HH8HĘ[A\A]A^A_]Ll$L|$ HD$(H|$$1LD$E1H)1LD$HvL5?.pIL.I?HHhUHHhӀL9tBpH?HÀr9L9t;]H? ހr5L9t7UH?/1LÀs A1L ހs +1LՃ ց HDF߃r/FЃ +r'߃rF#wIr ƃdL9 ILD$LBE1A +Ѓ A1HrЃ +IH‰H„ H9HwyH9t?wH?Ճr9H9t9H? ހr4H9t;H?11HωՃs1H ހs L1҃ ։/`Hu$IփE HHtH9.HwyH9toH?H׃r1HΉ׃rH9t%H? ݀r H9t#H?1H ݀s p1҃ ՉWHL$ HT$(H9v*HD$<wH|$貿HL$ HT$(H|$HtH9t<HH)ѻLD$H1I1ɻ1KHH9HBHQW_ HQLE_ HQH3_ LRH` LH9HBHQH_ LL9UHLLEUL1B` LLS LLSLLQLL` LSH_ LLSSH@HH7aH<$uHHH@[$L$T$ \$0[0S KHH@[f.HG HW(AVSH(IHHHuHs HS(L^tP_H{u4)$HD$Lt$D$ Hlt"LQauHs0HS8L^H([A^HH?HtHpHt %^Pi_ P_ HHs1HHHHpHtHu)1HHHHp1HHHHHpHHHHHpDAWAVSIIHtQHH9Ht%HqHtHL`Hu!M~,Mt4LH\HtIF1L M~1I^I[A^A_HHuf.PH=؛HR` @UAWAVAUATSHHIHH_HH\HD$PHT$XH|$Ht$PW\L|$MtH\$ H9u'M|$H9ID$1Il$I$cLt$0HtH[HqH1H<$Hl$HD$H9spHHH9HFHHGHtH|$Hl$ HD$( HD$H|$8HL$7H|$@Ht$HH|$8H<$Ht$LH\H\$H\$MLd$hHD$HH)HsCHHHH9HGHHGHtH $HL$HD$ HD$(H<$IHD$8HD$@HD$HHD$HD$XHD$`H|$8HU f.fH(H}HD$HHHD$H|$Ht$ H|$R f.AWAVAUATSH5IIIfo-fo5fo%=fL%F9LHQII)fofofo%fIG8t6I?IGLPffo%АfofoL1 LH)$IHw:HLH)1f< +HH9uHxHH)t3H9HGHt'1D< +HH9uHNH9vMfHN1f.o8foffffftfЁu HH9vH9H9tPHILH)1Ҁ< +t HH9u/HHHHHL9A< +1LIOI?IOI95vYA<~RLHQu*A<%LFLLHLP 1[A\A]A^A_HrGQ LFLL1HZP UAWAVAUATSHhHAtDkC HHh[A\A]A^A_]MIIHHP0K uu1҄H jH5aHDHHx H@(PuHHx H@(HLPuHHx H@(H5ÒPfH3LAVu%Hx H@(H5P4HP0D$@ )D$HL$HL$ H4@p8HT$XL$\@t$`D$(L$8H|$H|$HHEHD$PHLQH5 H|$QHt$(LAVH|$HHD$PH5(PAsfS Gt=Hu1H@0Hx H@(H@uH5 H5ّЈC[UAWAVSHhH@IIHHSH0uD1HHH5|HDH)Hx H@(PH3LAVHu%Hx H@(H5BPHH0D$@ )D$PHT$HT$`P4@p8HL$@T$D@t$HD$L$ HD$PHD$0HmCHD$8Ht$LAVuH|$0HD$8H5P@kHCHHh[A^A_]f.@USPHOGHt\H@uLHu*{t$H@0uHx H@(H5OPuHHx H@(H52P@kH[]f.@UAWAVSHhH@IIH3F0K u2t"H~ HF(H5PH3LAVu%H~ HF(H5PH3F0D$F )D$PHL$HL$`N4V8ND$@L$DT$HD$L$ HD$PHD$0HAHD$8Ht$LAVuH|$0HD$8H5P@kC Hh[A^A_]fSHH[ftHHx H@(H@H5f.PD$sHt$D$MYHt$=sL$$? D$MY=s. L$?ɀL$$? D$WMYL$ ?ɀL$?ɀL$$? D$MYHHH|$NV )T$0)L$ )D$H5@H|$HT$KHHÐH?%LPH?D$sHt$D$LYHt$=sL$$? D$iLY=s. L$?ɀL$$? D$4LYL$ ?ɀL$?ɀL$$? D$KYDHHHHD$NV )T$0)L$ )D$H5?H|$HT$IHHf.@HHDH8HF Hv(OW )T$ )L$)$HHIH8f.UAWAVAUATSHXIHH HD$HD$PHD$HD$(H|$8Ht$@HZH@MeIEIUI9LGMHD$HT$H0HPQIm H0Ll$IMCD$LD$PCD$HHKHCHt Ht(HH H9LuHDH@1HL$HD$ HKHCHt Ht!HH H9LuHDH1HL$(HD$0HKHH| Ht$T IH8MuH|$8HD$@IuIUPMMe(IEIUI9LGMHD$tqHT$M} H0HPQ1Lt$Lf.ItH~uJD$HD$sL$ʁs.T$?ɀL$|H~ HN(HI Xs* T$?ʀT$?ɀL$7T$ ?ʀT$?ʀT$?ɀL$HH3Yf.@PAH~HH)t-H9HGHt!1ɐD8HH9uHBH9vyHB1EHIfHnfpDfo HofoPoff.fo$>ffofffftf́u HH9vH9wZH9u 11HHYH)H11f.@D8tHH9uHHHYøHHYøHYH'HH$1 f.HhH|$Ht$HD$HD$H#HD$ HL$HL$(HD$0H&HD$8HD$@HD$HHD$HD$XHD$`H|$8H~1 f.fHhH|$Ht$HD$HD$HA#HD$ HL$HL$(HD$0Hn&HD$8HD$@HD$HHD$HD$XHD$`H|$8H0 f.fHhH|$Ht$HD$HD$H"HD$ HL$HL$(HD$0H&HD$8HD$@HD$HHD$HD$XHD$`H|$8H~0 f.fHhH|$Ht$HD$HD$HA"HD$ HL$HL$(HD$0H%HD$8HD$@HD$HHD$HD$XHD$`H|$8H/ f.fUAWAVSH1HHHCHLFII)1L rIAHH9x[ItD)@HH9sHlH ,LtH9<xHH9aB, A@t1@tU@^HiH9;.=HiH9@,.tJuY@p@0rnHiH9D<.AA@@r$@@HYH9HiH9so.tLrEysAr+kk@ w Ey]ArUAwOuGEyBHiH9s#.u HH;HpHP1.E1E1AAAII HHLpH[A^A_]PHH=p*". UAWAVAUATSHIHMtMIu@yL9VH )yfnfpfUfEfo UffP1uqta"Y"rVH rK[f.H։)x,4L9t%HV>@yL9tRVH )y$[H8HL H#" HL H=2YH+ fAVSHHIH~ HF(H5b PH$HD$Lt$H51L=HHL$|$ D$t<u2H$@0Hx H@(H@uH5#Y H5YЈD$H[A^f.˼f.Ht<-t<+u HtHA1THuAGE1A +1fDIL9t'B A wLIpIHsE1HAH LHL$E1f.fQ0yW +@BAPIIuտL)Hs"HXHjHĈH +x f.@HL$E1f.fQ0y7 +@BAPIIuտL)Hs"HyWHHĈHC + f.@HL$E1ɉf.Q0yW +@BAPIIuտL)Hs"HVH*HĈH 8 f.@HL$E1ɉf.Q0y7 +@BAPIIuտL)Hs"H9VHHĈH  f.@HHL$E1HHQ0yW +@BAPIIHHuҿL)Hs"HUHHĈH` f.HHL$E1HHQ0y7 +@BAPIIHHuҿL)Hs"HTHGHĈHU f.HIF0H  'H'A'IKY8m4L uTHIH i')i{kd)IsAAfBDAyfBDIHHwHc~.i{kd)HS JfL4HHH 0T4HHL$E1Hf.HQ0qW +@BAPIIHHu>L$E1HfHQ0q7 +@BAPIIHHuҿL)HsxH&SL׾wHĈHHcHRPfD4HL4IA'I)HQL׾1!HĈH/ DH(Hdr-ȍ kd(H vRAfD$&$ &< w0D H LRAfD$&%L IA'I)HQH1x H(SH0IHc7IILL޸'I''IKY8m4L QLIH i'D)i{kd)HAAYf\ AL$E1Q0y7 +@BAPIIuտL)HsxHMHHĈù&< w0D HhMPfD$-%L IA'I)HLH1HĈH  + AVSH(HL7A>IH{ HC(H56$PH\$D$HD$D$Lt$ HH|$Ht$ HL$D$Ht]uQHu-|$t&HD$@0uHx H@(H5LLPuHD$Hx H@(H5-LPÈ\$H([A^H{ HC(H@H5y#H([A^HH JHcHH~ HF(H@H5TH~ HF(H@H5T H~ HF(H@H5T H~ HF(H@H5T H~ HF(H@H5GHHOHIHH?HH7HWH% f.AWAVSH HILH~ HF(H57T PH\$HD$Lt$H5TLvL5H\$HL$ HAL|$H5SLHL$ HAր|$D$t=u3HD$@0Hx H@(H@uH5OJ H5@JЈD$H [A^A_D sÃǁ!f.@P 1$ HBHBLVSAt 9HGHPAt 9HGHBAt 9HGHPAt 9HGA4 19HHHAHt ELI1HHrHA#AHHHI9tC)H=HGI1L SfH9tB49w HI9uL$YHyH HJH HcH f.IIIHtxIH?@@(LLLH@HDLL?LHH@?H1HHBHIIHI)IM9LLLBLBM)MLLM9s LLI$LL H t +L1ID1ALIE1ILLfIHttILA?@D(LLMI@LDHH?HHIIA?DIE1IMBLILIHH)HL9LILLL9sHHIIE1LLHL H t H1II +1AAHIILLUHIIvHHd$IIwL)Hd$Hf.AWIAVIAUAATL%UH-SL)HcHt1LLDAHH9uH[]A\A]A^A_f.DHQHHHello World! +CCuespemosarenegylmodnarodsetybdet..!! ""9911 ))33 //&already borrowedconnection resetentity not foundStdinLock { .. }prefix not found at NotNulTerminatedAddrNotAvailablePermissionDeniedStripPrefixErrorinvalid argumentcopy_file_rangeavx512vpclmulqdq)f&lK,F=  !O!@'N4***6+k++ ,,,$-Y-- .m...+/m/(N4/;))0&('80(z001112223))73e334'v'33333333333333333333333333333)'a-]8868888o9AAAAAA":A999AAL:AAAAAAAY<AAAAAAAAAAAT9<9:AAAA<AAAAT9T9AAAT9T9T9T9AAAAAB>>>>u;>u;9;;;;;;9!='=-=V92=V9m;;};O;_;O;<<<8<8;;;9;9%;D;5;;;; ;,;;:::;;;;9;;9::::::8::::::8=7;;;7;7}===:=:> ??1????[?B@fCCODh@D EGHHxIHxIxIxIHG5HXIDHXIXIXIXH'IpI8II8I8I8IIAABABBBAIIIII JJ+J Gt^elr +-sGXiz +&2!!!!""J""~"J"#"M$m$f$M$$$$% %$1%L%8'2)*'z''M'z''M'U'''U'' ((&(((C(^(AABBBBBBBBBBBBBBBBBBBBBBB ABBBB Ahltl}lllllllllmmm1mDmWmjmmm nmm n }}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}2}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }#}}}}&})}}},}}}/}}/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/src/collections/btree/map.rs/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/num/mod.rsattempt to divide by zeroattempt to calculate the remainder with a divisor of zero/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/str/pattern.rsalready mutably borrowedassertion failed: `(left == right)` + left: ``, + right: ``could not convert slice to arrayassertion failed: idx < CAPACITYindex out of bounds: the len is assertion failed: n <= buf.len()failed to initiate panic, error library/std/src/sys/unix/rand.rsassertion failed: page_size != 0library/std/src/sys/unix/time.rs/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/slice/mod.rsassertion failed: mid <= self.len()/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/slice/sort.rscalled `Option::unwrap()` on a `None` valuecalled `Result::unwrap()` on an `Err` valueinternal error: entered unreachable code/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/src/vec/mod.rs/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/src/slice.rs/cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/line.rsCellSomeNoneELFnameArgsKindcodekindIterfull/PATHaddrBothReadDiskDoneBodynextvarsiterpeerFilepathreadHOMENOEXmodeWidefxsrbmi2bmi1f16cavx2sse3sse2/cargo/registry/src/github.com-1ecc6299db9ec823/addr2line-0.14.0/src/lib.rsAccessErrorcannot access a Thread Local Storage value during or after destructionlibrary/std/src/thread/local.rsuse of std::thread::current() is not possible after the thread's local data has been destroyedlibrary/std/src/thread/mod.rsfailed to generate unique thread ID: bitspace exhaustedthread name may not contain interior null bytes" , line: MetadatamodifiedaccessedDirEntry and/or Boxthread 'ThreadIdCapturedDisabledInternalNulErrorFileTypeTimedOutNotFoundIncominglistenerDeviceNSVerbatimStartDirExitCodepoisonedsaw_pathsignal: FileDesctruncateZLIB.zdebug_xsaveoptavx512vlavx512dqavx512bwavx512pfavx512eravx512cdRUST_BACKTRACElibrary/std/src/env.rsfailed to get environment variable ``: library/std/src/ffi/c_str.rsdata provided contains a nul bytelibrary/std/src/io/buffered/bufwriter.rsfailed to write the buffered dataunexpected end of fileother os erroroperation interruptedwrite zerotimed outinvalid datainvalid input parameteroperation would blockentity already existsbroken pipeaddress not availableaddress in usenot connectedconnection abortedconnection refusedpermission deniedOsmessage (os error )failed to write whole bufferlibrary/std/src/io/stdio.rsfailed printing to : stdoutlibrary/std/src/io/mod.rsformatter error:.library/std/src/path.rslibrary/std/src/sync/once.rsassertion failed: state_and_queue & STATE_MASK == RUNNINGOnce instance has previously been poisonedassertion failed: queue != DONElibrary/std/src/sys_common/at_exit_imp.rsstack backtrace: +note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. +__rust_begin_short_backtrace__rust_end_short_backtrace\x library/std/src/sys_common/thread_info.rsassertion failed: c.borrow().is_none()assertion failed: key != 0fatal runtime error: + +thread '' has overflowed its stack +�memory allocation of bytes failed +Rust panics must be rethrownRust cannot catch foreign exceptionslibrary/std/src/panicking.rs' panicked at '', note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +thread panicked while processing panic. aborting. +thread panicked while panicking. aborting. +library/std/src/../../backtrace/src/symbolize/mod.rs    - cannot panic during the backtrace functionlibrary/std/src/../../backtrace/src/lib.rserrorCustomUnexpectedEofOtherInterruptedWriteZeroInvalidDataInvalidInputWouldBlockAlreadyExistsBrokenPipeAddrInUseNotConnectedConnectionAbortedConnectionResetConnectionRefusedadvancing IoSlice beyond its lengthlibrary/std/src/sys/unix/io.rslibrary/std/src/sys/unix/mutex.rsstrerror_r failurelibrary/std/src/sys/unix/os.rs/proc/self/exeno /proc/self/exe available. Is /proc mounted?/dev/nullrwlock maximum reader count exceededlibrary/std/src/sys/unix/rwlock.rsrwlock read lock would result in deadlockstack overflowfailed to allocate an alternative stacklibrary/std/src/sys/unix/stack_overflow.rsfailed to set up alternative stack guard pagelibrary/std/src/sys/unix/thread.rslibrary/std/src/sys/unix/thread_local_key.rsassertion failed: signal(libc::SIGPIPE, libc::SIG_IGN) != libc::SIG_ERRlibrary/std/src/sys/unix/mod.rsstatxlibrary/std/src/../../backtrace/src/symbolize/gimli/stash.rslibrary/std/src/../../backtrace/src/symbolize/gimli.rslibrary/std/src/../../backtrace/src/symbolize/gimli/elf.rs$2W/4>N???? LRawReadFirstByteLwZhZ=0 =UO7assertion failed: mid <= self.len()/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/slice/mod.rs  +   /cargo/registry/src/github.com-1ecc6299db9ec823/miniz_oxide-0.4.0/src/inflate/core.rs + +  + #+3;CScs !1Aa  0@`/cargo/registry/src/github.com-1ecc6299db9ec823/miniz_oxide-0.4.0/src/inflate/output_buffer.rs -:GO\iv P0C0E0C0E.debug_macro.dwoDW_UT_split_typeDW_CFA_undefinedDW_TAG_GNU_EINCLDW_TAG_GNU_BINCLDW_TAG_MIPS_loopDW_TAG_call_siteDW_TAG_type_unitDW_TAG_conditionDW_TAG_namespaceDW_TAG_try_blockDW_TAG_file_typeDW_TAG_base_typeDW_TAG_with_stmtDW_AT_SUN_vtableDW_AT_GNU_dwo_idDW_AT_GNU_macrosDW_AT_GNU_vectorDW_AT_body_beginDW_AT_src_coordsDW_AT_call_valueDW_AT_enum_classDW_AT_const_exprDW_AT_trampolineDW_AT_associatedDW_AT_virtualityDW_AT_macro_infoDW_AT_frame_baseDW_AT_discr_listDW_AT_base_typesDW_AT_artificialDW_AT_bit_strideDW_AT_prototypedDW_AT_visibilityDW_AT_bit_offsetDW_FORM_ref_sup8DW_FORM_rnglistxDW_FORM_loclistxDW_FORM_strp_supDW_FORM_ref_sup4DW_FORM_ref_sig8DW_FORM_indirectDW_FORM_ref_addrDW_LLE_start_endDW_ACCESS_publicDW_VIS_qualifiedDW_LANG_Pascal83DW_ORD_col_majorDW_ORD_row_majorDW_IDX_type_hashDW_IDX_type_unitDW_MACRO_hi_userDW_MACRO_lo_userDW_RLE_start_endDW_OP_deref_typeDW_OP_const_typeDW_OP_deref_sizeDW_EH_PE_alignedDW_EH_PE_funcrelDW_EH_PE_datarelDW_EH_PE_textrelDW_EH_PE_sleb128DW_EH_PE_uleb128AugmentationData>NNNNNNNNNNNNN>NNNNNNNN>NNNNNNNNNNNNNNNN>N>NNNNNNNNNNNANNNNNNN>NN>NN>N>N>NN>NNNNNNN>NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>CCCAA@@o@_@`EncodingRegisterDebugStrDebugLocUnknown DwAccessDW_OP_neDW_OP_ltDW_OP_leDW_OP_gtDW_OP_geDW_OP_eqDW_OP_oreh_frameIndirectop_indexLeftEdgeencodingRawRangeNotCieIdcalled `Option::unwrap()` on a `None` value/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/src/collections/btree/map/entry.rsassertion failed: edge.height == self.height - 1/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/src/collections/btree/node.rsAn unknown DW_CFA_* instructiionThe line range must not be zero.Found an unknown extended opcodeFound an unknown standard opcodeDW_TAG_SUN_fortran_vax_structureDW_TAG_GNU_formal_parameter_packDW_AT_BORLAND_Delphi_constructorassertion failed: src.len() == dst.len().debug_types.debug_str_offsets.debug_str.debug_rnglists.debug_ranges.debug_pubtypes.debug_pubnames.debug_macro.debug_macinfo.debug_loclists.debug_loc.debug_line_str.debug_line.debug_info.eh_frame_hdr.eh_frame.debug_frame.debug_aranges.debug_addr.debug_abbrevassertion failed: `(left != right)` + left: ``, + right: ``/cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/abbrev.rs@&d&+++++&+++'7(+++++++++'*,%,J,_,J,,J,J,J,J,J,J,J,J,//++/+J,J,J,J,J,J,J,J,J,J,J,J,:/:/:/:/:/:/J,:/:/:/J,:/:/:/:/:/J,J,:/:/:/:/J,:/:/:/I337777737772477777777728<<==>=>========<<<<<<>============z?@????=???=@ @@$@4@==I@R@[@p@=y@@@NPQQOQOQOQO#ON#OQON#ON#OpQQOQON#OQOQOQON#OO/SRRRuRaTRRRaTiRRQR]RRaTaT SRSRaTS#SR()/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/str/pattern.rscalled `Option::unwrap()` on a `None` valuecalled `Result::unwrap()` on an `Err` value/cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/legacy.rs__ZNu128i128charboolfor< as shimdyn mut -> true::.@*&<>()C,/cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/v0.rspunycode{-}..._!f64f32usizeu64u32u16u8isizei64i32i16i8str'?, > ::{closure:#[] + ; const unsafe extern "" fn( = : 0xfalse.llvm./cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/lib.rslibrary/alloc/src/raw_vec.rscapacity overflow� + + + + + + + + + + + + + + + +??^1 + range end index ) when slicing `CharTryFromErrorDecodeUtf16Error 0`0q , ..true <= datamantplusZeroCopyLessTypeCharFuseItemfilelineLefttailwakedropu8x2i8x2u8x4i8x4u8x8i8x8finishedhaystack (bytes NegativePositiveintegralUnpackedInfiniteMinusRawbackiterIntoIterlocationLocationLinesAnysearcherpositioncrit_posResumeTyRawWakerihi ihiiOiYici#}F|}F|i|{Y|{O8?8vn lsK҇_kkkkkkkkkkkkkkkkkkkkkkkkkkX]zNO 6=>V67VW5 )14:EFIJNOde\ + 69: 7 +;>fio_Zb'(U :?EQ͠"%>? #%&(38:HJLPSUVXZ\^`cefksx}Юyno^"{-f/.1$ +D*$$(4 7  +9c 0!@8K/ + @ ' 6: PI73 3. +&RN(*V NC +H' u ?A*; +QbH +^"E + 9 +6, 4 +_9QUje  + +( . RzH;?Q72m`; H8`xȄ؄8h0xHȅ`xXh Ȇ ؆4H`ȉ؉8,Ȋt؊80؋DXH48Lxdx؏-H-Xhxȑ ؑ .4Ȓ<.(x...hH\pXD/,@Th8|x$/(8XLh|țHX xTh|ȟ؟xȠ/\آp H x4H\Ȥp$08Xxئ`0x08x`|0(XDhx8(x4LhdxxhHh<1(\pH|148<P +18Y$28x2d8 hP +>+(?+8? ,H? ,8Ad,Ax,A,xDP=D,Ex=XG=I=,-@A,A(B@ATAhA؝|AXAAHBh$Bx8BLBȣBBh ABBAP@<%8o-BBB A(D(A BBBAL%-ABB B(B0A8Dp8A0B(B BBAAp4%-BBA DP ABBAP<&x{-BADWABBABA0H&\g-ABA BAA ,|&ؕ.BADpABApL&l/ABB B(B0A8A@8A0B(B BBAA@H&ؘN/ABB B(A0G80A(B BBAALH'*k0ABB B(B0A8D`8A0B(B BBAA`L'n30ABB B(B0A8D`8A0B(B BBAA`,'/BADpxABAp,(̦/BADpxABApLH(\ 0ABB B(B0A8A@8A0B(B BBAA@L(/ABB B(B0A8A@8A0B(B BBAA@L(K2ABB B(B0A8D`8A0B(B BBAA`48)J1BBA Dp ABBApLp)Խ1ABB B(B0A8Dp8A0B(B BBAApH) 2BBB B(A0Gt0A(B BBBAl *01BBB A(GY.h.b.a.g.\.I.~.TAIW(A BBBAC.J.0|*HA1AGAAAA8*ko1BBA Gq ABBA,*h1BAD`ABA`4+1BBA Dp ABBApLT+F1ABB B(B0A8D`8A0B(B BBAA`8+1BAD`xABA`zABA`$+3c1ADpAAp@,\{k1ABB A(D(A BBAAHL,w1BBB B(A0D?0A(B BBBA,,\[1BAD0XABA0,\;1AD0,,"/1BADpABAp,-1BADpABApPH-<]1ABB B(B0A8G8A0B(B BBAAP-H2ABB B(B0A8D8A0B(B BBAA,-3BAD@QABA@@ .35ABB A(Gv(A BBAA$d. D[5AD0fAA04.8?5BBA Dp4 ABBAp@. w5BBB A(D(A BBBA/ K4AC T.}.V.F.`.y.t.r.T.^.l.V.F.o.h. .F.B.K..X.e.U.S.^..b.p.t.A.C.O.3.B.g.~..{.d.J.[.l._......b....r.R..n.*._..A.Y A .i.i.P.m.U.m.C.e.. .r..6.../...K.D.N.D.N.J.N.D.N.D.N.J.N.D.N.p.N.m.i.v.o.P..}.T...J..P.g..h.v..W.s.N.].G.I.Y.U.f.q.n.R.S.`.K.R.h.^.K.X.U.U.Z.P.R.H.N.P.N.X.K.U.].H.U.W.X.W.R.R.H.`.T.K.^.^.Z.R.W.U.H.Z.K.^.P.M.R.U.Z.M.Z.M.j.a.M.M.`.E.O.T.M.Y.E.M.M.M.T1 XS3ABB B(B0A8G8A0B(B BBAA2[ 3[ $3P\83L\L3H\8`3T\}ABB A(A0o(A BBA(3]GBAA qABA (3]BADPzABFP30^A4<^ 48^ L044^9ABB B(B0A8G8A0B(B BBAA03Zj1BBA yBBF 4`ATL4`~ABB B(B0A8G8A0B(B BBAA 5$gAA$@5iApAPEzFPh5k#ABB B(B0A8G!8A0B(B BBAAL5(qABB B(B0A8DX8A0B(B BBA 6X 6T5,46BBA oBBA <d6BBB A(D`(A BBBA`<6SBAA ]ABF WABF AB66 7ȕ* 7+47+H7#,\78BBA oBBA 7 70D k7ܰ7=ANARA7ȳ*8/PD7P? .ABB B(B0A8GE8A0B(B BBAA07< .BADLABAD7-BBB A(DK(A BBBA80H8,<ABB B(B0A8DP8A0B(B BBAAPLD9 s ABB B(B0A8D 8A0B(B BBAAL9PABB B(B0A8GY8A0B(B BBAA89^ABB A(A0(A BBAA0h :$ABB B(A0DP0A(B BBAEPq0A(B BBAEP0A(B BBA`:hfBBA D@ ABBE@p ABBE@ ABBA@ ABBE@4:tBAA ABA PAB@(;<ABA D0j ABAA0u ABAF0\l;wABB B(A0DW0A(B BBAF-0A(B BBAA;; +ABB B(B0A8D`8A0B(B BBAE`X8A0B(B BBAE`8A0B(B BBAA`8A0B(B BBAF`K8A0B(B BBAh<DABB B(B0A8G8A0B(B BBAFp8A0B(B BBAA@<ABB B(A0D`0A(B BBAA`L@=dlABB B(B0A8DN8A0B(B BBAA\=ABB B(A0D60A(B BBAF0A(B BBAAL=BBB A(A0(A BBBF0_(A BBBA0L@>dH ABB B(B0A8Gb8A0B(B BBAA$>dSADPaAAPiA> $>BAD@AB> ? A? A0?k,D?pBBA oBBA t?A?< T>_)ABB B(B0A8G8A0B(B BBAA?@ @xAD`AA`0@@T +BADP_ABAPNABt@ + @ +@ +@ +@P eD`@ D@$ A A ,A @A Dp|XA ODPlA tDpA4 3D0<A` BBB B(A0E(B BBBA0HAABB B(B0A8D[8A0B(B BBAA BIAG8O)##W99 D@ +ndxv3BHV%#IW%# ** 7whh jj  +5 aaq5q/!(::H 44|PA/     +m%! BJ EEGh. ??Ah ??Ah __al <KZ FT^ BV^ @ KZ <KZ <Kc( +HL(PL!K3->p#$ P14 P14$N6-As#$.n#$#S44#S44D +c) +i3K#(Fnd84-*)Y7#\Z1 c#$1 c#$ # %:#_]4 f#$4 f#$D +U$FU$F AFq4 +Q4 +Q)#)*O)#++/moRRTJJLIIK)%/  +   + % + +AQ)%)#; +% 6  ggv' ggv' ggv' 224r 224r&G+7vN O + %%% + + +paa%C %%S+?!%%*  + +~W + +IO2|>_H%om{{%4E%lj{{%>6!B [",pp~?  #%%% + + * 4__ h -%%-"5>##m5= JJLV04*2)L + + + + + + , % % )  +c#zz +Lc NehK%() + + + ||~g)G((##n#l#l~~||~~~ SUg,)#<. #%4ffA)=ss + + + + + + + +-%%%(!+ ![,- ---#-( ,)l,*X,+,+4,+,+   ~#&k>   +cc n%%%-$$* m-%$^  hʖȖKٕ"?D +OOەR(SAT +^f•hpsgtϔƏ8V1͒ueHUM + +0 +  0-0-/-;/./.0/./.4//  B  = 9 = = = = U 9 9 9 9 9 = Y 9 = 9 9 9 9 9 9 q 9 9 9 = !. M*$*u     +Q 6 `<$ =! wPQQ 0SRRRZ/0^@@0^@0^`P0^P0^W:KO4!O@O@!P-} 0^VM M"$M#$M NNN0N0N'0^py0^@&0^ &gh 0^0uǖL@*J"J3JAJJJKJN]M]M]M]MX)0^XOPK3 PKHPK0PK:PKYPKZPK/&PK0)PK3PKi#ii*i#*$țe`@Pp`˛/ +()((0^0^Xe c n4 !rZ[r`Y\rp Y[#} u"g&Y Z"0^p\20^`\?1 5)0 ɞs  \ڞXq))))+)($)())"./ 80^ ]Vky$$0^@    0ep``Шpޠ.Np 0^eV0^V0^`>2p+ + 0^(\0^8`P\4v+ϡHh 0.u*d 0^W0^pX0^Wq !kA!n!oM£~ £6J"' J"/ ʤ* ʤ* !"$ !"( !"0 C, + ۥ<6B6L1M:ypj@m@mipjPmPmiGM GM U7 Ub#UUtU{U| UU UU UU U"U U"U U"U U"U U&U U&U U"U U&U U#UU+ U+4U. U.EUU U"U U"U U UUU+U*UV<U(U!U/U#UU©^ ©^* ӱ`".c[k c[o c[c[c[^ȴ- O OCO\1O4!O@O@!fOO&WS6 +WS: +WS= +WSfWSo'WSpWSrWSrHWSsWS~WS(WS!WS!WSEWSWS+WS/WS"WSOOOO8OeOj O* OOO OV5O)O,O,nPGPN:<v,88׿$&8ٿٿʔ $)1`2ڿ 2!ڿ 3$qAe$223&& ZAS" S"u += "0!!y!}!t!!j!e!!Z!f q808f &8% +%6-(K(-(W-(R>$u$Pt$PsG P y U0Uo@@ +h + yHxN= oooooPPw6PFPVPp}p`d` i CPQM |vPB3@ 'k`PN`1p`PCNpCPM`k0) (0ySJ6PBip@gPZ@(lS@Zp.S0B B0^g_#0Q@@P@K`'p/B`S 4@BmL PpPgPn( P(`j`H) `p,0l;`j`0Zh()0(S0vB . |`mեGCC: (Debian 8.3.0-6) 8.3.0,RSV V V wO VSa w.Sdd tWWSwt dWSXSk tt tSwd OS pX X X X XSSSS YYZ[??[?\???P\`\\\E +\p ] `0^@^FP^p^"@^^ ^3p_'_Z`RC``S`@b2`b"b0c* `c& c#c*cdeee e fG`f!fPg`g 1pgguh!0h"`hh h!hC i0i'`i*riPl i`l pl#l lPmFmInooo+#op!R?0p#p# { q&| Pq z`q@q!qr{s 0sPsV%s|Ptu2Pyp{S} pYЍ&" 0n@BBBBPBBB@P`@f gg11@DaOu?` d0 +"$ ssst}JN&5\_paq#@r`s$tpy3yz$zp{n{@@s*MC# |?h@ OeN8,,}*y%-4+*%/ +` W*]- ^, @ P`pWx    2 wNV  2V2 \@$ ],,ZVVV=@^nnXLw\Y\YR_\_\U @`+V ` Xa 9!x}wp`wtIp)g%9q`ee8chh t~0lq!!q8tWAjjNN + + ,0*`nШGp`#^#  ! 9I 38p6! 0@WWg <8kkPMMPPSJMDIMJJMSXSXPM=ZrP!Zp'V  ?@$ E\Yb_@'"< P `I'bU #,$jb pKJEcPM>IOJMY6KIIOJM Ja  4`0A k. hS $/k*1%r  F;@WP34^E\ H`puCCO0{iiS`W`=K"E .0&`\pP]   "OWO(Otd.djdwOOOOCOOdW7p`dOdOO.FFOOdT =/g hhhhhhh-7gXeN%P'A7 }M`\vO}HHMMYt +\Y_\Y_GeDL (+R`H+;N>>C!$!$!' !, Mk@[%k .U333 +; & i0 + \Y_\@ _ \    ))E` ddpddd.OO.vPD0wK`bRe}i i jjpjjjj}0lGl m@m Pm `m98 <`s 3^@f``0w +l H SP `d S ' B  a0 W@kb@`_u +sV#\H #xxxxe.O*#$09eh*=>&!)P6")$/\ 5El ZfKV$ Dg|T$x$;O%& : ;;\ &@&$/^x5,`&%C;C'e'( (0(W@(P((O0)t)33)p, .Ip.2/r00P1&`1&LJZ:fN-1`2?2 23B3 36 4k6`;O;|0BPB9 B B B BB= C##.PC22pC`HH#JK&ELtPMtMtPNtN]]0QPQ0Z@ZPZr^]_  =?=A]a_tud 5 2 A?-5LZ"9k" +-5<H`I?YY{( D-_:_{f} +"#@g'jPg]-]%b     h  717=717=    gh ii`jkk*m+%Pn'o%*p%1!! $$!#4,/[ qh  00 . :: PsPtt u9 5 6u0u +L~  %eUUv0vUe%44"########/#/# + +//###,b w,wc `x/=$Cmap core::ascii::EscapeDefault>try_reserve5initialize>,closure-0,!> copy_file_range_candidate|ascendcopy_file_rangeޏfrom_iter, closure-0>>reserve, alloc::alloc::Global>,alloc::alloc::Global>jst_inoeread_at>get_or_initTdrop_in_place>klength_including_self,usize>?next_surrogatelenst_atime_nsecƞresume_unwindEswapascend,binary_search_byFdrain)get_str>Qas_ptrE do_catch<&Fn<()>,i32>w"is_ende<and_thenswap_nonoverlapping_one>9data_as_array,object::elf::Sym64>t new_edgeset_lenbbytes_to_pathcurrent_memory mergeQdrop_in_place>>drop_in_place>TcpStreammdrop_in_placeTspec_from_elemkey_area_mut,alloc::collections::btree::node::marker::Leaf,usize,core::mem::maybe_uninit::MaybeUninit>԰read<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>3expect<(),core::fmt::Error>~`drop_in_place>>Z {{closure}}>,closure-0>Zdrop_in_place>, alloc::alloc::Global>>݂next˴drop_in_place>b^fetch;map<&gimli::read::unit::AttributeValue, usize>,gimli::read::unit::AttributeValue, usize>,closure-0> +try_fold>,(),closure-0,core::ops::control_flow::ControlFlow>cXcall_once_forcejatomic_sub{{closure}}]drop_in_place>>Cmap<&std::ffi::c_str::CString,&std::ffi::os_str::OsStr,closure-0>ѭwriteok, alloc::collections::btree::node::marker::LeafOrInternal>, alloc::collections::btree::node::marker::KV>,alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>#arrayMOUTPUT_CAPTUREascend,alloc::collections::btree::node::marker::Leaf>call_once core::result::Result<&str, core::str::error::Utf8Error>,(&std::ffi::c_str::CStr)>FfmtWdrop_in_place>5lstatread_to_string>get_unchecked_mut>key_area_mut,[core::mem::maybe_uninit::MaybeUninit]>grow_amortized, usize>,alloc::alloc::Global>get, usize>>__rdl_deallocrcvt_nz?Gcopy_to_nonoverlapping?newread7index_mut>add_credsQencoding,usize>dropuvarscopy_nonoverlapping, usize>>Jderef<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>k{{closure}}<&addr2line::UnitRange,&addr2line::ResUnit>,&mut closure-2>read_attribute>k8index_mut>>,core::ops::range::RangeTo>arrayAmerge_sortfind_map,&object::elf::SectionHeader64,&mut closure-0>}drop_in_place?checked_sub_durationWnnew_pairlength_uleb128_value>j{{closure}},alloc::collections::btree::node::marker::LeafOrInternal>detect}current_memory>,alloc::alloc::Global>]>is_none>>>%znotify_oneinto_iterFinto_resultst_nameFmis_ebadfonly_v6tdrop_in_place6read_atomicallyRCapturerust_backtrace_envnext_instruction>BorrowRef"new>>ĭwrite;into_itercdropiSignalTokencopy_nonoverlapping<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>get_uncheckedreplace> is_empty>>call_mut core::ascii::EscapeDefault,(u8)>read>is_emptyindexbinary_search_bydrop_in_place>&length_u16_value>Z replace_kvC!at_exit_imp)drop_in_place>into_boxed_sliceread_to_string1^get *const i8>qsync{~remove_entry,std::ffi::os_str::OsStr>Ereserveswap_bytesdrop_in_place>>>>>> fmtצgroupsn~clear>9index_mut,alloc::alloc::Global>not_equal<[u8],u8>vwith_capacityAttributeValuearray<(*mut u8, unsafe extern "C" fn(*mut u8))>ĭto_vec_initer>Fnewdrop_in_place>fromNescape_debug_ext;read_error<&object::elf::SectionHeader64>Swrite_fmt<&mut [u8]>#drop_in_place`udrop_in_placexget_unchecked_mut>>>@map &std::ffi::os_str::OsStr>as_raw_mut_slice, alloc::alloc::Global>,alloc::alloc::Global>Ninsert_head2Gcopy_to_nonoverlapping, usize>>path_name,usize>8write_fmtIterMutwBreserve_exactentries<&std::ffi::os_str::OsString,&core::option::Option,alloc::collections::btree::map::Iter>>remove_kvtry_reserve, usize>,alloc::alloc::Global>\ {{closure}}<&std::io::IoSlice,(),core::ops::control_flow::ControlFlow,closure-0> read_until>H$set_permYjdrop_in_place>, gimli::read::Error>>>core_dumped u16_value,usize>ʞcapacity_from_bytesɝborrow_with,closure-0>Pprint_toҙshrink_to_fith7__init]madvanceparse_unit_header,usize>Bprint_raw=is_noneatomic_compare_exchangeJadd, usize>> +next>, fn(u8) -> core::ascii::EscapeDefault>>?create_new3parse_withqcurrent_memory<&addr2line::InlinedFunction>,alloc::alloc::Global>Kadd<(*mut u8, unsafe extern "C" fn(*mut u8))>Kas_raw_fdunetbackward_unchecked|drop_in_place>^newforcecollapse{{closure}}<&libc::unix::linux_like::linux::Elf64_Phdr,std::backtrace_rs::symbolize::gimli::LibrarySegment,(),closure-1,closure-0> next>, alloc::alloc::Global>>Pdrop_in_place>sset_ttliemptyV<merge_tracking_child>compareLQnext_unchecked>Framedwith_capacityjmetadata<&std::path::Path>h exact_sizereservewrite>Rreserve_exact΁alloc_zeroedlen,alloc::collections::btree::node::marker::Leaf>pnlinewritershim PanicInfoopush6__cpuid_countreserve<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>encode_utf8_rawforward_uncheckedVdrop_in_place>>#read_/run_dtorsIfrom_raw_parts_insplit_file_at_dotYerrno؊with_capacity_in<*const i8,alloc::alloc::Global>cleanupsetup_ioNleave_multicast_v41register_dtor_fallbackOleave_multicast_v6Amap<(std::ffi::os_str::OsString, core::option::Option),core::option::Option,closure-0>swap_nonoverlapping>Gfind_inlined_functions>read<&addr2line::InlinedFunction>>iWaitTokenSymbolName9map<&core::ptr::non_null::NonNull>>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Internal>, alloc::collections::btree::node::marker::Edge>,closure-0>4KaddKnext>flock>܂push_Aunwrap_or_defaultparse9get_offsetX<expectherror from_error<(std::fs::File, std::fs::Metadata),std::io::error::Error> {{closure}}nextexpectset_scope_idis_emptydrop_in_place>, alloc::alloc::Global>>nextval_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit>]> fold, closure-3>, closure-4>,closure-5,usize,fn(usize, usize) -> usize>uvars_os"any5index>set_ptr<&addr2line::InlinedFunction>,alloc::alloc::Global>dropsys_commonfrom_error>,gimli::read::Error>replacewadd_to_ancillary_datammap SipHasher13set_ptr +writeȰdrop_in_placeDunwrap<&gimli::read::abbrev::Abbreviation>&handle_underfull_node_locally>drop_in_placecopy_nonoverlapping>N(readlink5?ok_or;map,gimli::read::unit::AttributeValue, usize>,fn(gimli::read::endian_slice::EndianSlice) -> gimli::read::unit::AttributeValue, usize>>Pfile_stemmap_err*sleep_msread_initial_length>̹copy_regular_filesWarray, alloc::alloc::Global>>^modifiedEclone, usize>>array>>xmaybe_uninitkey_area_mut,alloc::collections::btree::node::marker::Leaf,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit]>pop_internal_level>rdrop<(std::ffi::os_str::OsString, core::option::Option)>{{closure}}NnextFnewgwith_capacity<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>drop_in_place>dereffrom_errorWwritefMutexqcurrent_dir6read_ipv6_addrcstr˭endian_slice,{{closure}}take>find>, closure-0>,&mut closure-1>"drop_in_placeset_parent_link>{SocketAddr/read_error>>search_node>lwait_max_untilJgrow_amortized]fill_bufggetDcopy_nonoverlapping>drop_in_place:is_none_recv_fromas_mut_ptrdrop_in_placecomponentsmdrop_in_placeܢdropswap>p9open_to_and_set_permissionsnew, alloc::alloc::Global>>fromcall_mut std::path::PathBuf,(&[u8])> right_kv,alloc::collections::btree::node::marker::Internal>next,closure-0>set_ptr>,alloc::alloc::Global>nst_ctime_nsecYread_slice>index_mut<(usize, std::backtrace_rs::symbolize::gimli::Mapping),usize>nwrite_vectored +clonebox_free,alloc::alloc::Global>AunwrapZtemp_dirdrop_in_place>fmtڮread_u8_array,[u8; 2]>fExitStatusj_starts_withqvar<&str><clone,usize>cpush<*const i8,alloc::alloc::Global>Fcontinuednnext_kv>copy> <map<&alloc::string::String,&str,fn(&alloc::string::String) -> &str>iread_to_end_with_reservationM kv_mutgpush<&std::ffi::os_str::OsStr>p;ok_orIterudrop next, closure-0>,core::ascii::EscapeDefault>swap@into_result, usize>,gimli::read::Error>get>>/write_all_vectoredMinto_result>,gimli::read::Error>}from_partsςas_mut_ptrbreak_patterns=nbufferdecompress_zlib"Islice_remove>>>capacity_from_bytesnis_write_vectored{{closure}}grow_amortizednow:"rnglists:write_str_escapedEntriesCursormap_try_fold$capacity_from_bytes, alloc::alloc::Global>,alloc::alloc::Global>.drop_in_placeread_abbreviation>dcall_mut core::result::Result,(&str)>post_inc_start push<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>drop_in_place,abort_internal>wrapping_mulEinto_resultset_only_v6drop_in_place>u8_value,usize>C{{closure}}archthread_parker>has_rootd7PartialEqAfind_addresshdrop_in_place, alloc::alloc::Global>, alloc::alloc::Global>> insert_recursing>fmt>*yield_nowNoget_argsKget_end=map<&u8,core::ascii::EscapeDefault,&mut closure-0>&recv_from_flagsdrop_in_place>shrink_to_fit +next>Dparse_with״drop_in_place>yexpect,core::cell::BorrowMutError>fmtis_ipv4ĝLazyCell(drop_in_place>try_initialize>>>>,fn() -> core::cell::Cell>>>>>`try_intoUwritepqcauseis_ipv6drop9leb128!zero|drop_in_placeUwrite_strBand_then<&std::thread::Thread,&str,closure-0>9call_mut<(&std::backtrace_rs::backtrace::Frame),FnMut<(&std::backtrace_rs::backtrace::Frame)>> descend>index_mut>Cindex_mutset_ptr, alloc::alloc::Global>,alloc::alloc::Global>drop>ckey_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,usize,core::mem::maybe_uninit::MaybeUninit>get_or_try_init>,closure-0,!>box_free,alloc::alloc::Global>Freaddrop_in_place<[std::backtrace_rs::symbolize::gimli::Library]>;get_or_insert_with,closure-0>as_mut_ptrnonzerois_initialized>>as_ptrwrite<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>with_capacity_inWdowncast_ref<&str>2_push parse_glibc_versionpbacktracereplace>6full_rangewrite_strcapacity_from_bytes>,alloc::alloc::Global>-get_and_incrementarray@map<&u8,bool,closure-0>~make_ascii_uppercaseB__cpuid^drop_in_place>, alloc::alloc::Global>>"rust_panic_without_hookہvecmap_err<&[u8],(),object::read::Error,closure-0>copy_nonoverlapping<(*mut u8, unsafe extern "C" fn(*mut u8))>from_error,std::io::error::Error>next_entry>derefLwrite_bytesz next_leaf_edge>section_0>try_reserve>argsnumfmt>setenvsentries<&u8,core::slice::iter::Iter>fIoffset><map<&std::ffi::c_str::CString,&std::ffi::c_str::CStr,closure-0>Tshrink_to_fitxfmtwith_capacity_in?map<&std::path::Prefix,bool,fn(&std::path::Prefix) -> bool> descend>cmpgensure_is_ownededge_area_mut,[core::mem::maybe_uninit::MaybeUninit>>]> split_leaf_datawrite> {{closure}}<&object::elf::SectionHeader64,(),core::ops::control_flow::ControlFlow<(usize, &object::elf::SectionHeader64), ()>,closure-0>ArcPdropdrop4nextԲwrite, alloc::alloc::Global>> RangeInclusiveread_u8>Fbox_free<[(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)],alloc::alloc::Global>read_timeoutHget deref_mut,alloc::alloc::Global>and_thenarrayC_set_readonlyfcorrect_all_childrens_parent_links>Eparse_withe"RawRangeqenqueue0try_reserve1Ato_ownedkCommand1utiltry_reserve,alloc::alloc::Global>box_free<[u8],alloc::alloc::Global>@unwrapqget8index_mut>OEfmtDentries,usize>=revI7thenread_u8_array,[u8; 16]>merge next_leaf_edge>tload_section>>яinto_iter<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>̇push>,alloc::alloc::Global>reserve, usize>,alloc::alloc::Global>>ok_or insert_recursingsub_assignwriteGoffset_from<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)> Fnew<&[u8]>#write_str>1cpuidxdrop_in_place>>drop_in_place>take>>>>>>try_fold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>drop_in_place>Fderef_mut+"encoding>Snext_backfeatures{allocateldrop_in_placenrecv_from_with_flagsdwrite_allOreplace>>>F-read_separatorѳread_to_endgidaget_stack_start_alignedQinsert> ?append+min_stackαdrop_in_place>$FilePermissionsfrom_error>,gimli::read::Error>Ajdrop_in_place>>nvec_write_vectoredto_vecderefcurrent_memory, alloc::alloc::Global>,alloc::alloc::Global>map<(),std::io::error::Error,std::sys_common::net::LookupHost,closure-0>mapmap std::fs::FileType>%usockaddr_unvdrop_in_place>indexdrop_slowis_char_boundaryJ7collectionsfsyncLStdoutjAfrom_dwarf split_leaf_datadrop_in_placeoset_uidRfmt<&[u8]>RErrorKindconnect_timeout׳parse>next_back<&addr2line::InlinedFunction>,alloc::alloc::Global>%index~swap>ĵcall_once<(&str),fn(&str) -> core::result::Result>current_memory>,alloc::alloc::Global>p {{closure}}<&std::io::IoSlice,usize,core::ops::control_flow::ControlFlow, usize>,closure-3,closure-0>mtry_reserve>,alloc::alloc::Global>capacity_from_bytesjcursordrop +nextis_separatorswap>dfrom_bytes_with_nulremove_leaf_kvvtrim_leftKinto_bytes_with_nul'size_hint8Atakeshift_tail>Aborrowdrop_in_place> gdropsis_socket#allocate_inattributes,with_capacity_in partial_cmppCondvartry_register_dtor>>`zeroed>FdMeta=derefget_or_init>,closure-0>writexload<*const u8>derefmlibc_Permissions` next_leaf_edge;map,gimli::read::line::FileEntry, usize>,closure-0>@drop_in_place>right_kvzkv_mut,alloc::collections::btree::node::marker::LeafOrInternal>index_mutread_bytessection_by_nameassume_init_readeis_dangling>9unwrap<&mut alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>>9map<&core::ptr::non_null::NonNull>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>,closure-0> offset_idYreadinto_ownedWnew_v1clone<[u8; 16]>fprint_filelineResolveWhatAskipgrow_amortized, usize>,alloc::alloc::Global>lfrom_elemTSectionTable #{{closure}}"atomic_swapڲ{{closure}}>insert_head;into_boxed_slicest_value&with,closure-0,bool>rset_modepnotify_allideref_mut9atomic_loadcopy_nonoverlapping>next:u8_value>map<(std::net::tcp::TcpStream, std::net::addr::SocketAddr),std::io::error::Error,std::net::tcp::TcpStream,closure-0>zarrayZdrop_in_place>, alloc::alloc::Global>>Einto_resultRreverseLacceptread<(*mut u8, unsafe extern "C" fn(*mut u8))>parse_unit_type>remove_internal_kvHwrite, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>box_free<[alloc::string::String],alloc::alloc::Global>deref for_eachsum, closure-2>>ofrom_error<(std::sys::unix::ext::net::datagram::UnixDatagram, std::sys::unix::ext::net::datagram::UnixDatagram),std::io::error::Error>>drop_in_place>`file_type try_foldarray<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>\=map<&[u8],std::path::PathBuf,&mut fn(&[u8]) -> std::path::PathBuf>Ukey_area_mut,[core::mem::maybe_uninit::MaybeUninit]>key_area_mut,[core::mem::maybe_uninit::MaybeUninit]>setsockopt{WritenewNjfrom_innermUtf8ErrorStry_intoEfmtHsteal_rightfile_attrJenv_saw_path HStdinStdio_read_u32_bytesinto_result,gimli::read::Error>eCas_refremove<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>storeshrinkchecked_subtdrop, alloc::alloc::Global>,alloc::alloc::Global>swap_nonoverlapping_bytesindex_mut<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>fmtvswap>><try_cloneiwith_capacity_inygnew>from_errorContext*dFromVecWithNulErrorfmt<&std::net::tcp::TcpListener>~arrayreplace>cdrop_in_place>Loffset<&addr2line::InlinedFunction>>@forceOdrop_in_place*dropindex_mutIunwrap,std::sys_common::poison::PoisonError>>extend_with>pget_envsval_area_mut,alloc::collections::btree::node::marker::Leaf,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit>]>{(write_all_vectored,box_free<[addr2line::InlinedFunction>],alloc::alloc::Global>ޭto_vec_in, usize>,alloc::alloc::Global>Hread, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>tascend,alloc::collections::btree::node::marker::LeafOrInternal>zswap>pAtomicU82into_result<(std::sys::unix::process::process_common::ChildStdio, core::option::Option),std::io::error::Error>%6eq<[u8],[u8; 2]>Bunwrap_or<(std::sys_common::backtrace::RustBacktrace, isize)>;map<&addr2line::LineRow,u64,closure-0>parsenext_offset>cellstoreparse>xrust_panic_with_hookIkey_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit]>xpeekdrop_in_placeǠcapacity_from_bytes<&addr2line::InlinedFunction>,alloc::alloc::Global>drop_in_place>3length_u32_value>drop_in_placesAtomicPtrappend_elementsҬst_rdev~remove_entry>add_to_ancillary_dataopost_inc_start>writeJfuse, fn(&str) -> core::result::Result>>into_result,gimli::read::Error>map std::time::SystemTime>push, alloc::alloc::Global>,alloc::alloc::Global>reverse;capacity_from_bytes%with>,closure-1,()>passcredfwrite>mrecv_with_flagsE__default_lib_allocatortype_id<()>3index_mut>size_hint<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>into_result$lazyginner_debugkintrinsicstgMutexGuardkey_area_mut>+Hoffset<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>9as_mut, alloc::collections::btree::node::marker::Edge>>nodelaycopycall_once@push,alloc::alloc::Global>callget_access_modegetread>7replace>try_borrow> x86=arrayKoffsetlibunwindTcpListenerset_ptrparse_lines> splitas_ptr<*const i8,alloc::alloc::Global>fetch_sub<len,alloc::collections::btree::node::marker::LeafOrInternal>next_leaf_edge>`call_onceqtake>5eq.next"remove_dir_all_recursive!ranges_offset>elapsedYgetrandomcopyTwrite_char>into_iterreplaceswap>copyDset>?key_area_mut,alloc::collections::btree::node::marker::Internal,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit]>$Bytesfind_indexpop_internal_levelsearch_tree,std::ffi::os_str::OsStr>gdeallocate_and_ascend>drop_in_place>Kwrite_bytes1indexcopy_nonoverlappingfind_units>index_mut<*const i8,usize,alloc::alloc::Global>@takeObject,read_socket_addr]&rmdirvwait_with_output,{{closure}}vdrop_in_place>ͳlineget_or_init_pin>>,closure-0,closure-1>keys'#partition{write_fmtdrop_in_place>j:DebugLocListsBasedrop_in_place>c0link~remove_kv>"jsymlink_metadata<&std::path::Path>flockread_to_endهreserve>,alloc::alloc::Global>kiterNindexwrite2is_little_endian> +qQueuecopy_nonoverlapping, alloc::alloc::Global>>ireplace>>begin_panicajoinnewinto_result>,gimli::read::Error>\?read_numberis_zeroget>push__rust_foreign_exception.val_area_mut,[core::mem::maybe_uninit::MaybeUninit]>Mas_mut_ptrmapwith_capacitylang_start_internaldrop_in_place>SocketAddrV4{{closure}} SocketAddrV6?ok_ordrop_in_place>>is_initialized>>>u7ne move_to_slice>>&Dget_or_insert_with>, gimli::read::Error>,closure-0>. next>hEfmt<&str>Kis_null<()>Hgrow_amortized+segments29clone>>next};unwrap_orlocaldrop_in_place>>@Dmap,addr2line::FunctionName>,closure-0>size_hintas_ptrYentries<&u16,core::slice::iter::Iter>Ŗcurrent_memory, alloc::alloc::Global>,alloc::alloc::Global>.new>from_errorځdrop_in_placeD>copied8create<&std::path::Path>Mcurrent_memory<*const i8,alloc::alloc::Global>(collect as_mut_ptr|drop_in_place<[std::backtrace::BacktraceSymbol]>sum, closure-3>, closure-4>, closure-5>>o:default_for_encoding_and_filedreplace>parse_debug_abbrev_offset>sslicedfutexget_unchecked_mutZDmap,addr2line::FunctionName>,closure-1> next,core::char::EscapeDebug>crecursivepanon_pipenLfrom_vec_with_nulqjdrop_in_place>, gimli::read::Error>>>wfenceRtrace_fnedrop_in_place, alloc::alloc::Global>>|5eq<[u8],[u8]>reserve, usize>,alloc::alloc::Global>Abbreviations type_idF&available_concurrencyXfill_bytesWIFSIGNALEDwrite_fmt>>S5read_given_charcopy_nonoverlapping>nfmt<&std::ffi::os_str::OsString,&core::option::Option>9section_name>,gimli::read::endian_slice::EndianSlice>Iadd>>>*copy_nonoverlapping>>>>>>iaLineWriter.Ndrop_in_place>>>find_index,alloc::collections::btree::node::marker::LeafOrInternal,std::ffi::os_str::OsString>Xis_dangling>>>QDoubleEndedIteratorfrom_error<(std::sys::unix::ext::net::stream::UnixStream, std::sys::unix::ext::net::addr::SocketAddr),std::io::error::Error>^new>>next<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>GlobalPdrop_in_place<[std::ffi::c_str::CString]>Oread_sleb128>XCmap<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),std::ffi::os_str::OsString,closure-0>exec_special_opcode>|reservej%with>>>>,closure-0,core::option::Option>>>>p3Threadadjust_opcode>+clear_parent_linkforceѤinner/{derefQclonepaccumDsplit_pathspush<&std::path::Path>search_treeas_mut_ptrUopsdrop_in_place<[alloc::vec::Vec]>9_set_var|Afind_units_"realloc_fallbackUnext>,fn(u8) -> core::ascii::EscapeDefault>set_ptrswap>ѵcall_mut<(&std::backtrace_rs::symbolize::gimli::elf::ParsedSym, &std::backtrace_rs::symbolize::gimli::elf::ParsedSym),closure-0>IBis_somee`drop_in_place<(std::ffi::os_str::OsString, core::option::Option)>swap><allocate_in<*const i8,alloc::alloc::Global>adrop_in_place]drop_in_place<[addr2line::ResUnit>]>key_area_mut,alloc::collections::btree::node::marker::Internal,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit]>get, usize>,usize>Pprint_tonextas_ptr(__rust_end_short_backtrace0merge_tracking_parentcall_once<(),Fn<()>>Ijremove_file<&std::path::PathBuf>4zeroeddropydrop_in_place>rGhandle_ebadf<()> odrop_in_place, addr2line::lazy::LazyCell>, gimli::read::Error>>), alloc::alloc::Global>>get_unchecked>vparse_next_componentstrip_prefix<&&std::path::PathBuf>,call_once<(u8),fn(u8) -> core::ascii::EscapeDefault>initializev=map std::path::PathBuf>drop_in_place>post_inc_start:writetry_into<&[u8],[u8; 4]>TFinto_resultsocket_addrfrom_iter>okdindex_mut<(usize, std::backtrace_rs::symbolize::gimli::Mapping),usize,alloc::alloc::Global>XmIoSliceƌreservearrayMtracetry_fold, closure-3>,closure-4,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>box_free,alloc::alloc::Global>:find_locationdrain> uaddr{{closure}}>,closure-0,!>LOCAL_PANIC_COUNTinto0swapfrom_error<(usize, std::sys::unix::ext::net::addr::SocketAddr),std::io::error::Error>frames>map<(&u8, &[u8]),char,closure-0>uBarrierdrop_in_place>zinto_iter, alloc::alloc::Global>,alloc::alloc::Global>force>Aoutput_filenamewith>,closure-0>drop_in_place>,data>1swap/try_initialize,fn() -> core::cell::Cell>6max~repeatkfrom_error<&[u8],std::io::error::Error>cdrop_in_place, usize>, alloc::alloc::Global>>{{closure}}Vmap_err std::time::SystemTimeError>$get, usize>,usize>rerror_lenremutextry_reserve<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>Fskip>spec_extend, closure-0>,alloc::alloc::Global> +as_innerfrom_vec\read_uint>drop_in_place> map_errfmtfentries<&std::ffi::c_str::CString,core::slice::iter::Iter>@and<&std::ffi::os_str::OsStr,&std::ffi::os_str::OsStr>array<&addr2line::InlinedFunction>>xdrop_in_place>Dmap<&object::elf::SectionHeader64,core::result::Result<&[u32], object::read::Error>,closure-2>Gwrite|drop_in_placeTfmtdeallocate_and_ascendGoffset(Ninto_vec#fmt<&std::path::Path>Pdrop>grow_amortizedget_unchecked_mut>>,core::ops::range::Range>st_blksizelen<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>Uinto_result<(libc::unix::linux_like::sockaddr_un, u32),std::io::error::Error>2heapsortreplace_kv,alloc::collections::btree::node::marker::LeafOrInternal> +set_ptr, alloc::alloc::Global>,alloc::alloc::Global>Bto_ascii_lowercasefmt<&Error>eopencapacity_from_bytes, usize>,alloc::alloc::Global>(set_nodelay[escape_debugzDebugAbbrevFJaddhas_physical_rootVval_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit>]>as_mut_ptrforce>]buffer}drop>>from_raw_os_errork filter_try_foldmcall_mut<(&object::elf::SectionHeader64),closure-0>qenv_lockgwrite_char>Hsteal_right>%is_class_64>Vwrite_all_vectored>&deallocate_and_ascendԡdrop_in_place>force'reserveZgflush_bufΕcurrent_exe7drop>qcausedrop_in_place>q{{closure}}>,closure-0,closure-1>-park_timeout_ms_Bpush<&str>into_result<(usize, bool, core::result::Result),std::io::error::Error>fdrop_in_place>, alloc::alloc::Global>>%Bufdsplit_at_mutZdrop_in_place>, alloc::alloc::Global>>>from_bytes>uswap_nonoverlapping_one>>>>>>K:initial_length_sizefshstrndx>FAtomicIsizeclone_fromaflushgrow_impl9section_name>,gimli::read::endian_slice::EndianSlice>9unsigned>ARangeAttributessize_hint,closure-0>set_hook8is_ok<(),std::io::error::Error>@ slice_shr>has_childrenptype_id[mergedrop_in_place, alloc::alloc::Global>>>?getppidallocate_zeroed&from_error, usize>,gimli::read::Error>fmtHoffsetOdrop_in_place~{{closure}}>>,closure-0,closure-1>allocate_inX{{closure}}fmtlstatus2 filter_mapEshrink>,alloc::alloc::Global>y +take_mut,closure-0>FileEntryfrom_bytes>Mnew>iterBswap_nonoverlapping_one>>LineRowSyncOnceCellygrow_amortizedinflateMreserve,alloc::alloc::Global> lt({{closure}}9SplitInternalfirstfmt>=unwrap_or_else2checked_add_durationIadd>>arraydisE{{closure}}set_gid>is_empty>A{{closure}}>into_result, usize>, &gimli::read::line::LineRow)>,gimli::read::Error>removeRawVecfmt>Dfrom_errorWmap_errIdrop_in_place>=capacity_from_bytesindex>UgBufWriterreserveSectionHeaderCMSG_NXTHDRprintDparse_withtake_box5Mnew_uncheckedbreak_patternstry_reserve<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>Ċdrop_in_place>TWdrop_in_place>, gimli::read::Error>>>><map<&alloc::vec::Vec,std::backtrace_rs::symbolize::SymbolName,closure-0>get>:find_map>>,usize,closure-1>ZBdo_merge>)read>Laddgrow_amortized>,alloc::alloc::Global>index>% timeycurrent_memoryLpage_size.from_errorzsignalbox_free<[addr2line::LineSequence],alloc::alloc::Global><map<&std::ffi::c_str::CStr,&str,closure-0>=map<&alloc::vec::Vec,std::backtrace_rs::symbolize::SymbolName,closure-1>next?is_somegetqfmtgrow_amortized<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global> ,parsermdrop_in_place9is_empty>drop_in_place>new>>unsetenvcdrop_in_place, usize>, alloc::alloc::Global>>clear_parent_link>إimpl_linux,set_ipVcurrent_memory#sum, closure-0>,usize>fold,usize,closure-0>set_ptrfind<as_mut_ptr, alloc::alloc::Global>,alloc::alloc::Global>tcopy<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>lenQ>is_some>>>(get_or_init_pin>,closure-0,closure-1>+Ipv6Addrmap{{closure}}c9open_fromntohsClonepwrite_all=and_then|Fn/Bmap<&std::ffi::os_str::OsString,&std::ffi::os_str::OsStr,closure-0> +replace, alloc::collections::btree::node::marker::Edge>,(std::ffi::os_str::OsString, std::ffi::os_str::OsString),closure-0>AKwrite_bytesprocess_inner +read, alloc::collections::btree::node::marker::Edge>>>edrop_in_place>>>>#as_mut_ptrJadd<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>Lval_area_mut,alloc::collections::btree::node::marker::Internal,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit>]>adrop_in_place>Χjoin<&std::ffi::os_str::OsStr>size_hint bool>,fn(&[u8]) -> std::path::PathBuf>atry_reserve<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>{{closure}}#drop<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>"choose_pivotindex_mut>cdropNrraw_unlockremoveUaread_exactsfrom_new_internal> offset_value>+RWLocktry_borrow_mut>`rows,usize>coktry_reserveFcvt_pread64setsockoptPst_devfrom_error,std::io::error::Error> left_kv,alloc::collections::btree::node::marker::Internal> force,alloc::collections::btree::node::marker::Edge>LineProgramHeaderdrop_in_place>:Ffrom_error>into<&str,alloc::boxed::Box>Qfrom_errorm!at_exitmap std::fs::DirEntry>~grow_exact:fmtget_unchecked>into_result` +{{closure}},closure-0>{stashWset_ptrderef_mutto_string_lossydwrite_allJ__rdl_alloc4push_ bulk_steal_left>hname_attr>Zwdrop_in_place>try_reserveҳFileEntryFormatdIntoStringError~drop_in_place>>map std::net::tcp::TcpStream>Hudrop_in_placecopy_nonoverlappingInitializerst_nlinkderef_mut, alloc::alloc::Global>,alloc::alloc::Global>jadd choose_parent_kv>arrayFeature<write_fmtn<read_separator#read_error<&object::elf::FileHeader64>8Bstatx1inheritgcopy_nonoverlapping>duplicate3stat2getpidKinit>>6gekTHREAD_INFOfinish bool>Ksaturating_addBwdrop_in_placei7ne{{closure}}Tudrop_in_place>'Kaddxnew<&addr2line::InlinedFunction>>set_arg_0dnew_v1_formattedstore<()>ffrom_error<(std::sys::unix::process::process_inner::Process, std::sys::unix::process::process_common::StdioPipes),std::io::error::Error>take>=is_someٟrust_oomtok$allocate_into_vecTflowinfo:get_or_insert_with, alloc::collections::btree::node::marker::LeafOrInternal>,fn() -> alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>Dskip0read_ip_addrdrop>search_node,alloc::collections::btree::node::marker::LeafOrInternal,std::ffi::os_str::OsStr>&as_mut_ptr<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>borrow_with>, gimli::read::Error>,closure-0>readerR try_rfoldEdisplaysymbolqderef_mut<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>new_with_extensionJreserveG5read_atomically<(),closure-0>>binary_search_byWprogram_is_pathunitrunixwrite_char>get_modefinish_growpmSocketsendfile_splice8open<&str>sum, closure-0>>PathdeallocatefmtBget_or_insert_withNdrop_in_place>Praw_lock7PartialOrdfirst_leaf_edge>8sync_allJ.StaticKey9 right_kv(swapEbindwrite_fmt>MNwrite_at internal_constructor4,bulk_steal_right>;DirBuilderotimeoutfrom_error_Jaddfmtget_uncheckedGoffset܊drop_in_place>Ddropw{{closure}}>,usize,closure-0>fatomic_load<*mut *const u8>Kis_nullwrite<&addr2line::InlinedFunction>>DebugLinefrom_errorEc_strFeq<&[u8]>0udrop_in_place]bufferedh?read_atomicallyFdrop<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>write_str>bthread_start[swap_nonoverlapping_one>>wis_zero_slow_pathIadd>>8index_mut>Uncapacity"%get>>>>>=into_result,alloc::collections::TryReserveError>LineInstructionsNzeroed descend> +correct_childrens_parent_links>read_slice0drop_in_placeseek?ok_orԍdrop_in_place<[addr2line::LineSequence]> &try_with,closure-0,bool>T next<&object::elf::SectionHeader64,core::slice::iter::Iter>,closure-0>read>ZQBTreeMap{{closure}}qfind_map>, closure-1>,&addr2line::ResUnit>,&mut closure-2>|fd_to_metaone_less_than_next_power_of_two}:constantsfold,usize,closure-0>fmtfirst_leaf_edge>9try_into<(&str, u16),std::sys_common::net::LookupHost>with_capacity_in, usize>,alloc::alloc::Global>:tmodefrom_raw_fddrop_in_place>as_ptrIis_nulllis_emptylast_leaf_edgeqmemrchrfile,usize>capacity_from_bytes, alloc::alloc::Global>,alloc::alloc::Global>get_mutB=mapninner_mutHslice_shl>slice_from_bytesGset_ptrKwrite_bytesAttrsIterread_to_end_with_reservationforce_capturefromatomic_storefmtMMnew_unchecked>Amap<&rustc_demangle::Demangle,&str,closure-0>grow_amortized#VacantEntryswap>>>>>>is_reading. next>,core::ascii::EscapeDefault,fn(u8) -> core::ascii::EscapeDefault>AncillaryDatavread_to_endparse_file_v5> +Loffset, alloc::alloc::Global>>(read_u8_array,[u8; 4]>xdrop parse_type_signature>xcall_once'drop_in_place>>is_write_vectored>Mnew_unchecked panicȟcapacity_from_bytes,alloc::alloc::Global>8write_fmtT_print_fmtoffset_value,usize>ήinsert_headpush>,alloc::alloc::Global>^into_resultswap>TDebugList|setsockoptto_owned next/Yget isize><and_then<&str,rustc_demangle::Demangle,closure-0>pod9Qinto_iter>Zpopclone_into]with_capacityshrink_to_fit<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>"drop_in_place>zstringXargs_osRdrop_in_place>get_uidunwrap_oranyfmt boxed.lazy_initOclone, usize>,alloc::alloc::Global>pcall_mutpush6eqindexunwrap_or0collect,alloc::vec::Vec>-PathBufto_path_bufand_thenm9Option$initialize,fn() -> core::cell::Cell>Goffset_from!Joffset Lset_multicast_loop_v6-Iset_multicast_loop_v4%parse_dwo_id>{{closure}}H5ascii]{{closure}}#5read_numberAMnew_unchecked capacity_from_bytesdrop_in_place>>causeget_uncheckedcall_mut<(),FnMut<()>,alloc::alloc::Global>;len?readdir +descendinto_result,gimli::read::Error>merge_sortarray>>jdrop_in_place>, gimli::read::Error>>|set_ptr<*const i8,alloc::alloc::Global>‚extend_from_slice8Range$udrop_in_place Pdrop_in_place>bnwith_capacity'to_digitݖcurrent_memory1checked_muluwaitCunwrap_ordrop_in_place argtry_reservestopped_signalcopy_nonoverlappingdatagramkey_area_mut>9DebugAddrmapCowpushsend\initialize *const i8>get>capacity_from_bytes<*const i8,alloc::alloc::Global>set_portptype_idMdrop_in_placeJoffsetFptr new_with_keyssprint_raw_with_column new_with_keys@gdrop>zget_unchecked_mutwrite_strwrite>><unwrap_orset_ptrZdrop_in_place>>ƫwrite<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>zMjoin_multicast_v40Inavigate)Njoin_multicast_v6bcapacity_from_bytesEUdpSocketpropertiesWIFCONTINUEDoLoffset/grow_amortizedpush_strascend,alloc::collections::btree::node::marker::LeafOrInternal>drop,alloc::alloc::Global>Gset_broadcasttry_reserve<&addr2line::InlinedFunction>,alloc::alloc::Global>fmt[zeroedinto_boxed_slice_ends_withindex_mut>move_to_slice>\drop_in_place> clonedok<&str,core::str::error::Utf8Error>compare"set_ptr>,alloc::alloc::Global>;as_ref, usize>>4parse_with}ThreadInfoHis_nullwith_capacity_in/Qstack_overflowfKadd, alloc::alloc::Global>>enabledget_uncheckedxheader_size,usize>itervqdrop_in_place>cdrop_in_place>kfrom[as_ptrdrop_in_place>>current_memory, usize>,alloc::alloc::Global>ʮdrop_in_place<[std::backtrace::BacktraceFrame]>!_with_file_nameHslice_shl>>>Blast_edge,alloc::collections::btree::node::marker::LeafOrInternal>i>as_ref>>>>>Rnew\mapping_for_libEsort_unstable_by_keyload_section>>eLazilyResolvedCaptureas_ref]bufreader%writexdrop_in_place>>is_empty, alloc::alloc::Global>,alloc::alloc::Global>set_extension<&std::ffi::os_str::OsStr>MDmap>,&[u8],closure-0>Zdrop, usize>,alloc::alloc::Global> +into_kv,alloc::collections::btree::node::marker::LeafOrInternal> atomic_loado>set_permissionsGInext_uncheckedScapacity_from_bytesdrop_in_place> {{closure}} usize>#parsesdmemrchr_specificget_uncheckeddinto_bytesZdrop_in_place>>zeroedqget_unchecked_mut{nextKeyMwrite_fmt>`Wdrop_in_place>, gimli::read::Error>>>into_boxed_sliceNDto_ascii_uppercasemset_timeoutinner|drop_in_place>>Zprint_raw_genericdrop, alloc::alloc::Global>, alloc::alloc::Global>>6Efmtfmtypattern0pushNKis_nullsh_typekeys,alloc::collections::btree::node::marker::LeafOrInternal>BmapWswap>new>ascendeq<&[u8],object::read::Error>Jinto_stringinto_iternext_dfs>:read>sdrop_in_place>xread_address>{{closure}}<&std::io::IoSlice,usize,usize,core::ops::control_flow::ControlFlow, usize>,closure-4,closure-0>ďindexdrop_in_placeas_mut_ptr>,alloc::alloc::Global>>9sync_data<unwraptnew_leaf>Õfrom_utf8_uncheckedfrom_errorfind>>,closure-0>YpermissionsTget_and_increment*with_capacity_insearch_node,alloc::collections::btree::node::marker::LeafOrInternal,std::ffi::os_str::OsString>Bswap>>>_and_then remove_leaf_kv,closure-0><read_to_string_nextnext_backˊwith_capacityfZcreated'read_to_end_with_reservation/jremove_file<&std::path::Path>swap>BacktraceHslice_removetake>LineInstruction^setnbufferedfdrop_in_place>for_each, closure-1>,closure-0> +next_leaf_edgepush<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>drop_in_place>"entries_raw>parse_next_component_back,split_at_mutformat_symbol_nameAfind_function_or_locationbacktrace]consume<read_atomicallysearch_tree?map<&std::path::Prefix,usize,fn(&std::path::Prefix) -> usize>Ocompare_exchangeborrow_mut, next_uncheckedwritechars3new%try_with>,closure-1,()>methodsduration_since?MovableMutexoset_ptrnfmt>8raw_ranges>=swap<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>deref_mut swap>eimpbinary_search_by7 +replace, alloc::collections::btree::node::marker::LeafOrInternal>,(),closure-0>ljwith_capacity7nepush%with>,closure-0,()>Uwrite_str>)Mnew_unchecked`call_once<(&object::elf::Sym64),closure-2> {{closure}}&mapHaread_vectored/$fmt_subsliceiterDebugInfoUnitHeadersIterJwrite_bytes@set_passcredfmttDget_or_insert>, gimli::read::Error>> tinoXgetrandom_fill_bytesfrom_error, usize>,gimli::read::Error>range_from,usize>9section_name>,gimli::read::endian_slice::EndianSlice>idrop>bis_completed qbacktracew +next, closure-0>>9iterթdrop_in_place>Lread_unalignedudata_value,usize>=map,core::result::Result,closure-0>drop_in_place>2abortto_vec, usize>,alloc::alloc::Global>O=map<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),(alloc::string::String, alloc::string::String),closure-0>handle_reserve8add_base_addressV<read_separator\cleariterread<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>bLadd<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>next_backsdrop_in_place>stderr~Cachekeq6index_mutdrust_panicZwith_capacity_in<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>:index_mut>>>>as_reffd tupleindexwrapping_addfrom_error>,gimli::read::Error>cinto_c_stringUnixStream5clone, usize>,alloc::alloc::Global>rfsreplace>> Hasher +next>unwrap]read MNonNull:&available_concurrency_internaleq_by:st_mtime_nsecvadd_fds correct_parent_linkgrow_amortized^gelinuxbindex_mutgimli}jdrop_in_place<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>ˬdrop_in_place>entries<&std::ffi::os_str::OsString,core::slice::iter::Iter>Tgrow_amortized<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>Scall_mut<(&addr2line::UnitRange),closure-2>:map<&core::ptr::non_null::NonNull>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>,closure-0> force,alloc::collections::btree::node::marker::Edge>try_reservedrop_in_place>>>>>Sbox_free<[addr2line::FunctionAddress],alloc::alloc::Global>@#partition_in_blocks¯to_vec, usize>,alloc::alloc::Global>Npush_slicemove_to_slicelast_mutdropF try_rfold,(),closure-0,core::ops::control_flow::ControlFlow>TwoWaySearcherclonefmtbCStrget>>swap_nonoverlapping_one>>>4decreaseread, alloc::alloc::Global>>:}ancillarydrop_in_place>detect_and_initialize key_area_mut,alloc::collections::btree::node::marker::Leaf,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit]>C_set_extension:low_bits_of_bytewrite_char>sort_by_key[aidLadd<&addr2line::InlinedFunction>>~write, usize>>i?createreplace>&2heapsorttioipNdrop_in_placefmtdropiscorrect_childrens_parent_links,core::ops::range::Range>,}new;from_error'insert_head:as_mut, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>~get_uncheckedlast_leaf_edge>Hmut_ptr<as_refB?unwrap_orunchecked_adddrop_in_place<[gimli::read::abbrev::Abbreviation]>8park_timeoutYgetsockopt#needs_to_growos2cuMdrop_in_place?as_refget,usize>!into_boxed_slice>,alloc::alloc::Global>fmtdrop_in_place>Hslice_shlcurrent_memory,{{closure}}mbox_free5execset_parent_linkDtry_lockCas_deref>=ok<&std::path::PathBuf,&std::io::error::Error>|WIFEXITEDejdrop_in_place>, gimli::read::Error>>>>minto<[u16; 8],std::net::ip::Ipv6Addr>Iadd, usize>>Kwrite_bytesS begin_panic_fmtst_atime!unit>copy_nonoverlappingallocate_indrop_in_place>read_sliceZfunctionOprefix_verbatimis_supported>swap'zeroedAtomicUsizereverseIoffset, usize>>ّinto_iter<&addr2line::InlinedFunction>,alloc::alloc::Global>grow_amortized,alloc::alloc::Global> len, alloc::alloc::Global>, alloc::alloc::Global>> Ffrom_error next,core::slice::iter::Iter>entriesc<merge_tracking_child_edge>@pcvt_gaiVlayout next,core::ascii::EscapeDefault,closure-0>5lt4set_nonblocking*as_slice}find_indexXrandqcapacity_from_bytes;Yinitialize i32>call_once usize,(&std::path::Prefix)>*setHread, alloc::collections::btree::node::marker::Edge>> begin_panic_handler"descend<as_os_strGread_error<&[u8]>box_free<[u32],alloc::alloc::Global>array, alloc::alloc::Global>>from~generic_copyFswap<&mut [u8]>drop_in_place<(u64, gimli::read::abbrev::Abbreviation)>^copy_nonoverlapping>>>>gguard_poisonnew, usize>>|downcast_refzeroed}write_strj next>{{closure}},alloc::collections::btree::node::marker::Leaf>read_untilxHread*drop_in_place>>@and_then<(core::option::Option<&std::ffi::os_str::OsStr>, core::option::Option<&std::ffi::os_str::OsStr>),&std::ffi::os_str::OsStr,closure-0>atomic_compare_exchangebneGgwriteecvtgentry set_payloadapply_operation_advance>kdropsend_vectored_with_ancillary!ywait=^get i32>7index>from_error,gimli::read::Error>push_internal_leveliiterEas_deref ok +into_kvoverflowing_sub)allocate_inlastgrow@9op<osexit1ThreadIddrop>>>>>>slice_insert>ˆparentindexinto_result,gimli::read::Error>Γspec_extend, closure-1>,alloc::alloc::Global>>map std::net::addr::SocketAddr>~remove,std::ffi::os_str::OsStr>ӥucred;as_mut, alloc::collections::btree::node::marker::LeafOrInternal>>bitptype_idrGis_null<*const i8>>is_dangling> get,fn() -> core::cell::Cell<(u64, u64)>>Bread_null_terminated_slice>כcurrent_memoryread_u16>Ewrite>>>set_alloc_error_hookU^get i32>push_internal_level7leіcurrent_memory<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>codemis_write_vectoredT~get?unwrap_orcopy_from_sliceiterderef_mutread_to_end<set_pidq"remove_dir_all=drop_in_place><Dwarf9rcK%LocalKeydrop_in_place>saw_nulwithtBmerge_tracking_child_edgeYwrite<(*mut u8, unsafe extern "C" fn(*mut u8))>atomic_store<*mut *const u8>Jreplace<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>zsort_by՝borrow_with>, gimli::read::Error>,closure-0>Mnon_null?6eqrtZinto_result,gimli::read::Error>reis_minus_oneKpost_inc_startswapparse_tag>ch_size.7unparkfold,closure-0,(),closure-0>fmt<[u8; 4]>_accessedlen_before_body`next +reverse3Dtakespdrop_in_placeAinto_boxed_os_strNdrop_in_placeFileHeaderspec_extend,alloc::alloc::Global>(:map<&core::ptr::non_null::NonNull>>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Internal>, alloc::collections::btree::node::marker::Edge>,closure-0>: next>'post_inc_startreadget_unchecked_mut>,core::ops::range::Range>dfind_map>,(usize, *const u8),&mut closure-0>Ioffset>>2into_slice_rangeload_section>>*debug_fmt_bytestringfrom_iter>, closure-0>, closure-1>, closure-2>>Rsplit_firstrsplit_once $bulk_steal_leftderef_mut=current_memoryTleft_kv,alloc::collections::btree::node::marker::Leaf>9unwrap<&mut alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>_5Wtf8Bufwith_capacity_in-allocate_in@takestream_lendrop_in_placeȆset_len, usize>,alloc::alloc::Global>drop_in_place>Cok_or<&object::elf::SectionHeader64,object::read::Error>copy_nonoverlapping>Xhandle_underfull_node_locallydinto_vectype_iddrop_in_place>from_error^from_elemFileHslice_shl>>new_leafderef>,alloc::alloc::Global>*YWeakHoffset, alloc::alloc::Global>>0ok, alloc::collections::btree::node::marker::LeafOrInternal>, alloc::collections::btree::node::marker::KV>,alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>okfusetake>`as_mut_ptr8index>_metadataYinto_result<(std::sys::unix::process::process_common::StdioPipes, std::sys::unix::process::process_common::ChildPipes),std::io::error::Error>deref&type_id<&str>/removeCMSG_FIRSTHDR btreeKKmulticast_ttl_v4get_gid%fold,closure-0,usize,fn(usize, usize) -> usize>}lenswap_nonoverlapping_one<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>DebugStrOffsets0Wdrop_in_place, usize>>>qmemchrWwith_capacity_ininto_resultpost_inc_start, alloc::alloc::Global>>xcontainsswap_nonoverlapping_one>?Wtf8fmtMjdrop_in_place<[(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)]>ߙgrow_amortizedparse,usize>_xgetbv{set_ptr<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>?is<&str>drop_in_placeginsertBOsStrcopy_nonoverlapping>Oinitial_buffer_size"drop_in_placeԠallocate_inwriteas_sliceƗgrow_amortized<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>t_set_file_nameu6merge_tracking_parent>>choose_parent_kvxswap_nonoverlapping_one>aguardcdrop_in_place, usize>>5drop_in_place, addr2line::lazy::LazyCell>, gimli::read::Error>>), alloc::alloc::Global>>drop_in_place>sKis_nullenv_mutDebugStr;unwrap<&mut alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>dropEfmt<[u8]>drop>}drop_in_place>sis_char_device?from_error<(std::sys::unix::process::process_common::StdioPipes, std::sys::unix::process::process_common::ChildPipes),std::io::error::Error>'map_err std::env::VarError>,clone_into9neTvalue>as_ptrtake_hook׫detect_featuresnext_power_of_two map<(std::sys::unix::ext::net::stream::UnixStream, std::sys::unix::ext::net::addr::SocketAddr),std::io::error::Error,std::sys::unix::ext::net::stream::UnixStream,closure-0>expect)drop_in_placebfrom_ptrIoffset>>{{closure}}<&std::io::IoSliceMut,usize,usize,closure-0,fn(usize, usize) -> usize>copycurrent_memoryget_unchecked_mut>>>>map_err,core::alloc::AllocError,alloc::collections::TryReserveError,closure-0>Cget_or_insert_withpost_inc_start try_fold, closure-3>, closure-4>,closure-5,usize,closure-0,core::result::Result>kenv_cleariQsignal_handlerfmtfold,closure-0,usize,fn(usize, usize) -> usize>drop_in_place>>>aget_stack_start8increment_lenzbacktrace_rs +os_fsyncsinto_result<(core::option::Option<&addr2line::Function>>, core::option::Option),gimli::read::Error>Hslice_shr>>dmap_err,core::alloc::AllocError,alloc::collections::TryReserveError,closure-1>3into_result, usize>,gimli::read::Error> as_mut_ptr<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>p split_leaf_data,alloc::collections::btree::node::marker::Internal>Fcvt_pwrite64mnew_rawBufRead@os_strm ExactSizeIteratorCmap<&alloc::boxed::Box<[u32], alloc::alloc::Global>,&[u32],closure-0>expect>,core::cell::BorrowError>from_be_bytesdrop_in_place>dnul_positionۧnewR#width(connectUendian7canonicalizeUtry_reserveshrink_to_fit:5quicksort{{closure}}binary_search_by_key%take>>>>>7set_write_timeoutlast_os_errorJdrop_in_placeresolve|as_pathnamepost_inc_startޅpush, usize>,alloc::alloc::Global>allocate_inis_unchangeddefault_alloc_error_hookWsplit_at_mut_uncheckednext_match\get<&str>index_mut,usize,alloc::alloc::Global>clonei:as_ref,into<&[u8],alloc::boxed::Box<[u8], alloc::alloc::Global>>write_char>}9copyKis_dangling>gmap<&[u8; 4],core::array::TryFromSliceError,[u8; 4],closure-0>is_err<&str,core::str::error::Utf8Error>swapdropget_unchecked_muttry_borrow_mutAreserve<okread_exact+octetsZas_mut_ptrCMSG_ALIGNnindex_mut>btry_rfold,(),closure-0,core::ops::control_flow::ControlFlow>, ()>, ()>>Hwrite, alloc::collections::btree::node::marker::Edge>>Mdrop_in_place>{{closure}}, closure-1>,alloc::alloc::Global>:as_ref>>Oindex_mut>His_emptyXread, alloc::collections::btree::node::marker::Edge>>>*corepeer_credwrite_charload_section>>from_errorv try_fold,(),closure-0,core::ops::control_flow::ControlFlow<(usize, *const u8), ()>>idrop_slow>>ӗtry_reserve<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_5read_ipv4_addr }drop_in_place>Iwith_capacitychar?is_nonekHcan_merge>Islice_remove>ebinary_search_by_key>,usize,closure-0>< filtersum, closure-3>, closure-4>, closure-5>,usize>GXFileType~get_unchecked_mut,usize>Dunwrap_or<&[u8]>drop_in_place>^copy_from_slicegmpscfmtmsort_byFileAttralloc_implEimplicit_const_value(?ok_orgblocking6ne<[u8],[u8; 1]>`#insertion_sortrposition%Gcopy_to_nonoverlapping, usize>>pfmt<&std::ffi::os_str::OsString>Mdrop, usize>,alloc::alloc::Global>& destroy_value>>Hoffset!from_errorattrs,usize>_index_mut>>>O?is_someHkey_area_mut>core_archnext_row,gimli::read::line::IncompleteLineProgram, usize>,usize>%^get isize>array, usize>>qdrop_in_place>sread_exactc traitsohack7deref_mutSystemTimeErrorLGoffsetmap_errread_lineedrop>>as_refMdrop_in_place>fPclone>dropnext, fn(&str) -> core::result::Result>>>or_elsereset>udrop_in_place>~indexpdrop_in_placeInstantqreallocLerror_stringǿiter_after,core::iter::adapters::rev::Rev>R"RawRngListEntrytry_reserve, usize>,alloc::alloc::Global><remove_kv_tracking,closure-0>]drop_in_place>, alloc::alloc::Global>>call_mut bool,(&u8)>tinto_result, usize>,gimli::read::Error>find_index,alloc::collections::btree::node::marker::LeafOrInternal,std::ffi::os_str::OsStr>*bytestringindex_mut>replace_kvAttributetake>newąreserve>,alloc::alloc::Global>XHandlerg?map std::net::ip::IpAddr>push<&addr2line::InlinedFunction>,alloc::alloc::Global>߳drop_in_place>JaddW"parse>5cmp<[u16]>@map std::process::ExitStatus>5drop_in_place>Z9eq {{closure}},closure-5,closure-0>Fcall_mut<((usize, &std::backtrace_rs::symbolize::gimli::Library)),closure-0>nReadYFrameIterSnext"Bas_deref try_fold>,closure-1,(),closure-0,core::ops::control_flow::ControlFlow<&addr2line::ResUnit>, ()>>!units>pError_cvt_r7>map<&u8,u8,closure-0>\parse_single_componentnset_flowinfocatch_unwind<&Fn<()>,i32>; subsec_micros +Cand_thenGaddptokensLpon_resolver_failure=mapKnullc7KEYS index_mut~ len>Vswap_nonoverlapping_one>expect1;for_each_range֝set_ptrportval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>e_shstrndxUnixDatagram {{closure}}<&addr2line::UnitRange,(),core::ops::control_flow::ControlFlow<&addr2line::ResUnit>, ()>,closure-1,closure-0>assume_init_read>>kcvt_rdrop<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>from_utf8StaticMutexgrow_amortized<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>extend_desugared>, closure-0>, closure-1>, closure-2>>copy_nonoverlappingentries<(&std::ffi::os_str::OsString, &core::option::Option),alloc::collections::btree::map::Iter>>"choose_pivotumaybe_saw_pathdrop_in_place>>>>>S8index_mut,core::ops::range::RangeTo>potential_sendfile_source\rawinner>>map_errIoffset2handle_shrunk_node_recursively,closure-0>wcvt_rlbmin_stack_size!colnointo_resultY6eq,?read_atomicallyindex,alloc::alloc::Global>array>expectindex_mutxdrop_in_place<[std::ffi::os_str::OsString]>Ycorrect_childrens_parent_links,core::ops::range::RangeInclusive>copy_nonoverlappingfpoisonrCunwrap_or<&std::sys::unix::process::process_common::Stdio>unwrap<&str,core::str::error::Utf8Error>Rdrop_in_place>Cnext_code_point>3new<(*mut u8, unsafe extern "C" fn(*mut u8))>ӌas_mut_ptrbmergeAFunctionreservefswappop<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>~removeϋnew<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>atomic_storeBinto_os_stringtry_fromfmutexwequaldisabledDget_or_insert>, gimli::read::Error>>Jset_multicast_ttl_v4extension&resultcall_mut usize,(usize, usize)>xdrop_in_placewrite_allraw_vectnewdrop_in_place>[IncompleteLineProgramfmt<()>panickingmreserve$take>>copy_nonoverlapping>Loffsetassert_len,usize>Bas_ref>9?truncatemap_err<&object::elf::FileHeader64,(),object::read::Error,closure-0>st_uid +revgrow_amortizedshrink,atomic_storefrom_errorread_uleb128>Lfrom_error<(std::sys::unix::process::process_common::ChildStdio, core::option::Option),std::io::error::Error>¢drop8RangeListsqdrop_in_place>>>qprocessset_ptr<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>`next>h6do_merge,closure-0,alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::Internal>>Qdrop1allocate_inC +take_mut, alloc::collections::btree::node::marker::LeafOrInternal>,closure-0>key_area_mut,[core::mem::maybe_uninit::MaybeUninit]>#next call_once<write_str>'try_lock>>kwritemessages take_while*exiteddrop_in_place>>try_fold>,(),closure-0,core::ops::control_flow::ControlFlow<&object::elf::Sym64, ()>>-Jaddswap<()>Zfrom_stringset_len;as_ref>=as_mutѭto_vec_in, usize>,alloc::alloc::Global>drop4#partition_in_blocks Dok_or%<is_none>getadjust_ip8index>m +replace,(),closure-0>Oset_cloexeclast_edge,alloc::collections::btree::node::marker::LeafOrInternal>call_once &str,(&alloc::string::String)>write_char>into_boxed_sliceMdrop_in_place>is_emptyassume_init_read>>fmt>>shift_headrecv_vectored_with_ancillaryread<&mut [u8]>՟set_ptr,alloc::alloc::Global>Kfdrop_in_place>, alloc::alloc::Global>>7Hadd<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>Vindex_mut> sum, closure-0>,usize>Yshnum>as_reffrom_beinto_result,gimli::read::Error>1binary_search_byminiz_oxideOfull_range>__rdl_reallocJexpect>,core::cell::BorrowMutError>MmkdirbOncecapacity_from_bytes>,alloc::alloc::Global>'Parkerzinto<&std::ffi::os_str::OsStr,alloc::boxed::Box>send_to Kas_mut_bufQ{{closure}}<(usize, &std::io::IoSlice),usize,closure-1>read<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>\drop_in_place>SystemTimemHbroadcastparse_attributes>9with_capacitycopyread_to_end<&std::sys::unix::fd::FileDesc>3 slice_shrleading_zerosϰprocess_commonfromempty_boxAOsString/ from_millisXbinary_search_by>,closure-0>index_mut>z hashDReentrantMutexsplit_atget>,fn() -> core::cell::RefCell>>ccreate_dir_all`grow_amortized>,alloc::alloc::Global>panic_count$Component̜capacity_from_bytes<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>to_socket_addrsjdrop_in_place>next_backcloneޤinnerindex>index_mut>d5as_mut_slice;cloned, usize>>CMSG_DATAcname_bytesF into_kvJreversenBunwrap<&mut std::sys_common::thread_info::ThreadInfo>aFinto_resultlenNunwrap_or_else,std::io::error::Error,closure-0>%try_with>>>>,closure-0,core::option::Option<()>>zanew Gaddfmtinit>pdrop9as_mut, alloc::collections::btree::node::marker::Edge>>@as_mut_ptrKoffset<(*mut u8, unsafe extern "C" fn(*mut u8))>0derefpush>1YMetadataascend,alloc::collections::btree::node::marker::LeafOrInternal>getӔdrop_in_placeXCommandEnvsockaddr_to_addr0do_merge> get,fn() -> core::cell::Cell>is_empty<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>jforce2report_overflowYread_unalignedAbbreviation!attr_ranges_offset> +right_kv,alloc::collections::btree::node::marker::LeafOrInternal>replace>consume>as_reftry_from_cmsghdrcmpcapacity_from_bytes<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>$LazyKeyInnerget, usize>>new~from_error, usize>,gimli::read::Error>gdrop>,alloc::alloc::Global>Kaddkwrite_bytesrbinary_search_by_keyިas_path Oget_cloexec forcearray, usize>>{{closure}}, closure-0>,alloc::alloc::Global>Նwith_capacity_in, usize>,alloc::alloc::Global>fmt>spec_from_iter[utf8_acc_cont_byteget_unchecked_mut,core::ops::range::Range>%sub_time<as_reftruncatecopy_nonoverlapping>>atomic_swap?decode_surrogate9kernel_copy~remove_entryzeroedPfmt>>is_nonePdrop,symlinkdhandle_shrunk_node_recursivelynew9g{{closure}}lget_or_init_pin& insert_fitarray_into_boxed_sliceT +{{closure}}, alloc::collections::btree::node::marker::LeafOrInternal>,closure-0>.copy_nonoverlapping>drop_in_placeDebugMapcurrent_memoryͯread>>>>WIFSTOPPEDreadcall_once core::cell::Cell<(u64, u64)>,()>get_unchecked_muttry_borrow_mut>LIaddKget5=mapEinto_result8_drop_in_place>Eneset_file_name<&std::ffi::os_str::OsStr>reserve8open<&std::path::Path>zbox_free<[addr2line::LineRow],alloc::alloc::Global>from_error<(usize, bool, std::sys::unix::ext::net::addr::SocketAddr),std::io::error::Error> descendas_ptrindex>rKinto_boxed_c_str9take_alloc_error_hookinto_iterqarray<*const i8>fmtpdrop_in_place{{closure}}>parse_type_offset>Loffsetknew bfile_name st_mtimenext?map std::net::ip::IpAddr>mdrop>fmt9section_name>,gimli::read::endian_slice::EndianSlice>Bmap{{closure}}<&std::io::IoSlice,usize,usize,closure-2,fn(usize, usize) -> usize>fd_to_metaUBis_none`kreport:new>Dmap<&object::elf::Sym64,std::backtrace_rs::symbolize::gimli::elf::ParsedSym,&mut closure-2>?ok_orfirst_leaf_edgew{{closure}},alloc::collections::btree::node::marker::LeafOrInternal>deref_mut<*const i8,alloc::alloc::Global>drop_in_place>ǚshrink_to_fit/for_eachAand_thenload<()>slice_contains:is_some=posix_spawn callXhashmap_random_keysPatternegetcwdIfull_range>drop_in_place4merge<is_some>Edestroycollect, closure-1>,alloc::vec::Vec>9section_name>,gimli::read::endian_slice::EndianSlice>fwdrop_in_place%try_with>,closure-0,()>f verifyparent_idۮmerge_sort'Ioffset}section_name>next,core::str::iter::Split,fn(&str) -> core::result::Result>replace>[.keyderef`into_iterͮread_uleb128_u16>}map std::fs::ReadDir>D@is_somemove_to_slice>>>"_remove_varVjremove_dir<&std::path::Path><as_ref>drop<*const i8,alloc::alloc::Global>atomic_addwrite_str>ndrop_in_place, gimli::read::line::IncompleteLineProgram, usize>, usize>>write_str>>1nget_refllocal_addrread, alloc::collections::btree::node::marker::LeafOrInternal>>lfind,closure-1>/_var_osSJoffset{write_str>Jaddܓspec_from_iter_nestedget_creation_modeAdrop_in_placeEcwd<atomic_swap<*mut ()> into_result!copy_nonoverlappingfrom_error<(std::sys_common::net::TcpStream, std::net::addr::SocketAddr),std::io::error::Error>Aas_refatomic_compare_exchangesplit_atIfull_range>program>Pinto_iterb<read_atomically>map>>,(),closure-0>0set_ptr:parse_lines~map,closure-0>sum, closure-2>,usize>set>>>> zip/push<try_reservenew_internal>I;unwrap<&mut alloc::collections::btree::node::NodeRef>ŬnewE.thread_local_keyAattr_string>pair3Parser,Qsize_hint>Ѩprefix_remaining0array<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>Bas_ref<&[u8]>^nextMfirst_leaf_edgedrop_in_place>_strip_prefix]fmt> ddrop_in_place, usize>>r9map<&str,core::result::Result,&mut fn(&str) -> core::result::Result>call_once<(&u8),closure-0> foldZ+read_unlockfrom_errorcopy_nonoverlapping>>fwritedgetsockoptcapacityi@or<&std::ffi::os_str::OsStr>RArguments3copy_nonoverlapping, alloc::collections::btree::node::marker::LeafOrInternal>>iter_afterdrop>>>Lbcall_innerdrop_in_place>{symbolize$overflowing_mulfrom_u8-set_ptrstdingstdioPinto_iterpushGFclone>?"RawRngListIterslice_from_bytes> read_to_end_with_reservationload_section>>Kread_ats6ne<[u8],[u8; 2]>try_reserve^{{closure}}<(usize, &std::backtrace_rs::symbolize::gimli::Library),(usize, *const u8),&mut closure-0>from_error>,gimli::read::Error>set_len_on_dropgrow_amortizedzeroedcopy_nonoverlapping>>>>send_vectored_with_ancillary_toconvertas_mut_ptrval_area_mut,alloc::collections::btree::node::marker::Internal,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit>]> +fARGV_INIT_ARRAYpreserve<*const i8,alloc::alloc::Global>:ok_orcopy>>AtomicBool(deref, usize>,alloc::alloc::Global>Gswap_nonoverlapping_one>pread2.drop_in_place>!}drop_in_place~reserveCunwrap_or>spec_extend8sectionsdrop_in_place>}aindexto_vec_inObuilders$Wdrop_in_place, usize>>fmt<&[u16]>3ascendfrom_error@length_u8_value>load_section>>Fset_ptrvar_os<&str>/unwrapM slice_shr>>>޵call_once<(&[u8]),fn(&[u8]) -> std::path::PathBuf>grow_amortized, alloc::alloc::Global>,alloc::alloc::Global>šcapacity_from_bytesnew>>=get_unchecked_muttry_reserveEBtry_statx=Loffset>tis_block_device{{closure}}<&std::io::IoSlice,usize,usize,closure-0,fn(usize, usize) -> usize>hdropindex>,usize>write>>3parse_with&write_allstore<*const u8>;get_or_insert>‹as_ptr>,alloc::alloc::Global> iteratorVdrop_in_place>>>call_onceextend_desugared>Dinitaright_kv,alloc::collections::btree::node::marker::LeafOrInternal>Ldouble_endedxBarrierWaitResultunwrap_or>binary_search_by_key os_str_byteswith_capacity_inentries<&std::backtrace::BacktraceSymbol,&alloc::vec::Vec>+dfutex_wait}read_slice>Tcapacity_from_bytesfmt^read\{Mmappis_ok<(),core::fmt::Error>]set_output_capture0Lwrite_bytes8cmpTimespec%len,alloc::collections::btree::node::marker::Internal>drop_in_place>Icurrent_memory,alloc::alloc::Global>-udata_value>>ok_orDebuggingInformationEntryload_section>>write>>2UnitHeaderset_lenޭswap_nonoverlapping_onederef_mut6min=get_unchecked;abbrevdrop_in_place&drop>,alloc::alloc::Global>into>setinto<&std::path::Path,alloc::borrow::Cow>*sleep1Cas_refUget_pidas_mut_ptr>,alloc::alloc::Global>{write_str<&mut [u8]>okget_path>unwrap<&mut std::io::stdio::StdoutRaw>duration=dfutex_wakePfmt>with_capacity_inpipedcorrect_childrens_parent_links>Reader]%try_with>>>>,closure-0,core::option::Option>>>>|drop_in_place>Symbolread_i8>index_mut<*const i8>qcopy_to)write_strZinitialize isize>drop_in_place>>MFFileDescKwrite_byteswrite_strnextas_ptrval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>";get_or_insert_with,fn() -> alloc::collections::btree::node::NodeRef><7parkpswap_nonoverlapping_one>Nwdrop_in_place>0append_to_stringbBufGuardEfmtsymbol_addressIfrom_rawmarray<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>reservemkYIaddDraw_os_errorinto_inner{LadddNulErrornflush_if_completed_lineis_prefix_ofOdrop_in_place> current_memoryecall_once_force swap_nonoverlapping_one>3drop<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>Kdrop>copy_nonoverlapping}pathread_word>checked_add^entries_raw,usize>߫drop_in_placeFnOncedrop_in_place>Șset_ptr, usize>,alloc::alloc::Global>Zunwrap|addressborrow>SocketCredmfold,closure-1,(),closure-0>ne<[u8],alloc::alloc::Global> remove>SliceRshrink_to_fit>,alloc::alloc::Global>yQentry>zdrop_in_place>i=or_elsefrom_iter, closure-1>>isaturating_duration_sinceaflush_bufBOpenOptionse_shoff drop_slowίto_veci5cnamekv_mut +next\initialize usize>swap_nonoverlapping_oneAas_mutIslice_remove>> setis_initialized>>EAunwrap~deref force,alloc::collections::btree::node::marker::KV>drop_in_place>Joffset, usize>>qfrom_error<[u8; 8],gimli::read::Error>parseswapcall_once<(std::net::addr::SocketAddr),closure-0>native_librarieszninner3 kv_mut,alloc::collections::btree::node::marker::Internal>lQensure_is_owned>pushaset_nameU?{{closure}},closure-0>st_gid8P{{closure}}esection>#fmtdrop_in_place>#partition_equal1next}pushsortdrop>{{closure}}kreplace>>>>jdrop_in_place>], alloc::alloc::Global>>Tswap_nonoverlapping_one>Cmaybe_fifotry_initialize,fn() -> core::cell::Cell<(u64, u64)>>?ok_or“spec_extend>, closure-0>, closure-1>, closure-2>,alloc::alloc::Global> force,alloc::collections::btree::node::marker::Edge>Њdrop_in_place9unwrap<&mut alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>>as_ref>,gimli::read::Error>fmtfrom_error,gimli::read::Error>=and_then<&Error,&Error,fn(&Error) -> core::option::Option<&Error>>=reserveassume_init_read>>>*sort_unstable_by_keyget_unchecked_mutW-{{closure}}unwrap<(),std::io::error::Error>fill,_drop_in_place>.write'index_mutVget_stackStringtry_reserve>,alloc::alloc::Global>/atomic_store<*mut ()>(capture_envindex_mut>snew,gimli::read::line::IncompleteLineProgram, usize>,usize>=map<&std::backtrace::BytesOrWide,std::backtrace_rs::types::BytesOrWideString,closure-2>Ugrow_amortized<*const i8,alloc::alloc::Global>default +nodeJnexte_shnum3set_len sipsize_hint bool>Bfetch_addborrow_mut>Mdrop_in_place, alloc::alloc::Global>, alloc::alloc::Global>>I^get usize>htonscopy_nonoverlapping>Iwrite_fmtKCmap,std::sys::unix::process::process_common::CStringArray,closure-0>sh_sizetry_reserve, alloc::alloc::Global>,alloc::alloc::Global>Vatomic_swap.Bfrom_dwarf>resolve_frame_unsynchronizedbval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>z<read_atomicallyfthread_infoas_reflen_utf8directory,usize>Ȁbox_free,alloc::alloc::Global>Vmake_handlerDunlock/{{closure}}gArgsydrop_in_placereplacerIadd>,Functions̒next, alloc::alloc::Global>,alloc::alloc::Global>77minmap std::fs::Metadata> +next_uncheckedtakedivtry_initialize>,fn() -> core::cell::RefCell>>Gget_and_incrementAor_else<&str,closure-1>drop_in_place>try_register_dtor>>>>>@Ioffset&gderef_mut>loadfmt%from_error,std::io::error::Error>lfrom_raw_parts_incall_once &std::ffi::os_str::OsStr,(std::path::Component)>)last_edgeswap>>>>drop_in_placebto_bytes"get_unchecked_mut>>qas_str swap_nonoverlapping_one<&mut [u8]> :signed>write_fmt>VLoffset<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>Imulticast_loop_v4Lmulticast_loop_v6Goffset<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>Wpost_inc_startreservenext bool>write_char>>wrapping'bulk_steal_right Nswap_nonoverlapping_one search_node^dropJnsend_msgDDirEntry9Qdrop_handlerg new_edge,alloc::collections::btree::node::marker::LeafOrInternal> drop_in_placeՐindexswap_nonoverlapping>>>ݬinto_raw<%get>3gderef_mut>current_memory, usize>,alloc::alloc::Global>FNdrop_in_place<&mut std::io::Write::write_fmt::Adaptor>>newread>~new1as_u64 +newHWdrop_in_place>, gimli::read::Error>>><;as_mut>write<*const i8>index>write_fmt>drop_in_place{drop_in_place>>eOnceStateDok_or>,core::option::NoneError>copy_nonoverlapping՘capacity_from_bytes, usize>,alloc::alloc::Global> swapfppipefmtхnew, usize>>8with_capacity?ok_or2drop_in_place$ next,u8>@call_onceacurrent_memoryInext_kv_unchecked_dealloc(Builder>map std::net::addr::SocketAddr>end_sequence]BufReaderfallback/force,alloc::collections::btree::node::marker::KV>capacity_from_bytesflock>write>>>?:word_sizeV;map<&core::ptr::non_null::NonNull>>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Internal>, alloc::collections::btree::node::marker::Edge>,closure-0>Zlen,alloc::collections::btree::node::marker::LeafOrInternal>next +os_datasync:default>ănexthnewfrom_error |is_unnamedok>,gimli::read::Error>hdrop_in_place, alloc::alloc::Global>, alloc::alloc::Global>>Xdrop<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>len9u16>index,alloc::alloc::Global>@take{{closure}}Iadd>>>>H next<&addr2line::ResUnit>,core::iter::adapters::take_while::TakeWhile>, closure-1>,closure-2>copy_nonoverlapping>(zdrop_in_place>A{{impl}}L6eqxsaveallocate_in, usize>,alloc::alloc::Global>KStdinLockwadd_assignneeds_to_growto_string_lossy{Bunwrap_or<&str>post_inc_start"is_base_address~OccupiedEntry+Ipv4AddrFread>Jstdoutp9section_name>,gimli::read::endian_slice::EndianSlice>Y`drop_in_place>>left_kvdrop_in_placeypopnext_backfmt<[u16]>next_leaf_edgecontains<&str>O +take_mutcall_once alloc::collections::btree::node::NodeRef,()>,try_reserveas_refdrop_in_place, alloc::alloc::Global>>is_contained_in<&str>hmapfold,closure-2,usize,fn(usize, usize) -> usize>from_errorbtry_reserve<*const i8,alloc::alloc::Global>drop_in_placelistenerfGhandle_ebadf$DebugLineStr6max_by core::cmp::Ordering>]Qsiginfo_si_addrstdstream + try_fold,(),closure-0,core::ops::control_flow::ControlFlow>, ()>, ()>> flattenHfmtis_ascii_lowercaseinto_result, usize>,gimli::read::Error>pushsize_hintistrwritemfmtq`read, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>>subchdirVset_read_timeoutWindexrindex> array fold,(),closure-0>post_inc_start^loutputCMSG_SPACEindex>,usize,alloc::alloc::Global>1dumb_printreserve<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>"push, alloc::alloc::Global>,alloc::alloc::Global>#LaddV7then_withLwrite, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>pspawnFoffset>as_mutcapture PanicPayload%qbacktrace[last_edgetrim_rightqvar_os<&std::ffi::os_str::OsStr>cswap_nonoverlapping_one>Eeq<len[?is_nonetest&drop_in_place<[alloc::string::String]>Oread_link<&str>gas_mut_ptr,alloc::alloc::Global>^ next>, closure-0>,closure-1> enumerateUInlinedFunctionR try_fold>,closure-0,(),closure-0,core::ops::control_flow::ControlFlow<&object::elf::Sym64, ()>>*>unwrap<&std::io::stdio::StdoutRaw>dtry_reserve_exactfmtwith_capacity<*const i8>t7__getitGfind_mapQcall_oncepartial_insertion_sortatomic_loadUfmtyAexpect@increaseedge_area_mut,[core::mem::maybe_uninit::MaybeUninit>>]>>Cmap<&std::ffi::c_str::CStr,core::result::Result<&str, core::str::error::Utf8Error>,fn(&std::ffi::c_str::CStr) -> core::result::Result<&str, core::str::error::Utf8Error>>M{{closure}}>3drop_in_place>>>Ȑcloneropen_cfmt<&core::option::Option>kpAnonPipe try_fold>,(),closure-0,core::ops::control_flow::ControlFlow<(usize, &object::elf::SectionHeader64), ()>>unboundc;map<&core::ptr::non_null::NonNull>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>,closure-0>acurrentcopy_nonoverlapping>+BacktraceFmtinto_result>>,gimli::read::Error>~entry|grow_amortizedLread, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>?section_headers>$initialize>,fn() -> core::cell::RefCell>>sys next_kv>]drop>>:sub_timespecexpect>>>,std::thread::local::AccessError>gBmerge_tracking_childas_ptrAsdequeueZcopy>>>atomic_load<*mut core::ffi::c_void>EMStderrget_str_offset>wlinux_like܋new2{{closure}}shutdownnext_backfmt>Cell9drop>>>>$initialize>>>>,fn() -> core::cell::Cell>>>>>_starts_withCMSG_LENF_newOunwrap_or_0callbackwith_capacityBas_ref>clonenewuunwrap_or_else<(),std::io::error::Error,closure-0>fmt<&std::sys::unix::ext::net::listener::UnixListener>next bool>,fn(&[u8]) -> std::path::PathBuf>Spush?unwrap_or_elseGshrinkto_str7with_capacityfrom_error,gimli::read::Error>Cunwrap_or Iterator~qkillgdrop>t cloneread>DebugInfocopy_nonoverlappingX:DebugStrOffsetsBasexRawFrameread_vectoredcall_once alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>,()>Ioffset>>>>write>D7Ordering}drop_in_place&as_mut_ptr<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>construct_envpregister_dtorAcurrent_memorynextF try_fold,closure-3,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>aLfrom_vec_with_nul_unchecked,read_numbergnew glibc_version_cstrc_createto_bewith_capacity_zeroed_in{Stash׬drop_in_place>& slice_insert>>compressionfmtB+write_unlockSreplace<&mut [u8]>Bto_os_stringqprivateQ[initialize isize>Kwrite_bytespush<&alloc::string::String>~with_globalK<as_ref>>aallocate_inkindIatomic_load<*mut ()>8 do_call<&Fn<()>,i32>fmt<[std::ffi::os_str::OsString]>indexa~new>mderefChildStdiowrite_all_vectoredis_empty>find_frames>box_free8ranges>drop_in_place>>swap_nonoverlapping_one>7abbreviations,usize>\checked_duration_sinceassume_init_read> search_symtabedge_area_mut,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit>>>]>* Durationhome_dir#:commonJoffsetMparse_attribute>Ĩprefix_lenindex_mut>as_raw_mut_slice<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>*rwlockdutf8_errorCok_ornext*@and_then is_empty%nget_mutZindexP{{closure}},alloc::collections::btree::node::marker::LeafOrInternal>?lock>capture_if_changed|into_resultcall_once<(char),closure-0>Hwrite_timeoutBderef, usize>,alloc::alloc::Global>=with_capacity_incopy_nonoverlapping<&addr2line::InlinedFunction>>dinto_result<[u8; 8],gimli::read::Error>AarithRefCellFfrom_errorlshrink_to_fitto_stringkey_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit]>split_at_mut_uncheckedVget_stackpg]initialize isize>ƅSocketAncillary right_kv,alloc::collections::btree::node::marker::LeafOrInternal>} correct_parent_link>Loffsetreserve<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>yshrink<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>split_at_unchecked@is_some9as_mut, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>"next>setsockoptobjectLoffset2into_iter, core::ascii::EscapeDefault, closure-0>>makedev[Layoutpush<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>Bfor_each_range,closure-0>gwrite_fmt>4is_asciiscope_idfrom_error,std::io::error::Error>sh_link*7min_by core::cmp::Ordering>drop_in_place>read_offset>replacefrom_new_internalProcess for_each, closure-0>,closure-0>std_detectdrop_in_placeexpect<(),std::thread::local::AccessError>Hsteal_left begin_panic<&str>{{closure}}<&str>gDget_or_insert_with>, gimli::read::Error>,closure-0>ԚshrinkJwrite_bytesdinto_cstringparse_has_children>_gdrop_in_placeBmap<(&std::ffi::os_str::OsString, &core::option::Option),(&std::ffi::os_str::OsStr, core::option::Option<&std::ffi::os_str::OsStr>),closure-0>< next<(usize, *const u8),core::iter::adapters::enumerate::Enumerate>,closure-0>qread_bytes_atcurrent_threadȲread_line>Fconst_ptrcopy_nonoverlapping>map<as_derefst_blocksI split_leaf_data,alloc::collections::btree::node::marker::Leaf>as_mut_ptr, alloc::alloc::Global>,alloc::alloc::Global>read_to_end>GaddIntoIterfastread_u64>merge_sorttake>>>Mdrop_in_placesplit_last_mut 9get_address>index>>*qwait_timeoutdrop_in_placetcpdzdrop_in_place<[(usize, std::backtrace_rs::symbolize::gimli::Mapping)]>remove_kv_trackingcapacity_from_bytesdrop_in_placeBpush<&std::ffi::os_str::OsString>Jgrow_amortized8sourceAfind_inlined_functions6avma_to_svmakHread, alloc::collections::btree::node::marker::Edge>>Jfrom_error,alloc::collections::TryReserveError>Cas_ref>ovec_writefilename_rawland_then<(),std::io::error::Error,(),closure-0>Z{{closure}}qdrop_in_placespec_extendadapterscall_once core::option::Option<&Error>,(&Error)>index_mut<*const i8,usize>drop_in_place>peek_fromNdrop_in_place|Flagگswap_nonoverlapping_one>>>>uis_empty0read_scope_iddrop_in_place>sh_offsettainto_idq_varfrom_bytes>get>>>>,fn() -> core::cell::Cell>>>>>"map std::process::ExitStatus>[Hread_to_endDok_orbfrom_errordrop_in_place>catomic_store<*mut core::ffi::c_void>Eas_bytes_with_nul\derefappend_to_stringindex_mutgrow_amortizedKwrapping_divoset_ptrE#widthjdrop_in_place>>decode_error_kindread>h+threadN9try_fromatomicslice_from_bytes>LI{{closure}}JarrayMapping{{closure}} bool>from_error<(usize, std::net::addr::SocketAddr),std::io::error::Error>$Pdrop_in_place>&with,closure-0,usize>copy_nonoverlapping, usize>>Munwrap_or_elsewith_capacityset_ptrcapacity_from_bytes<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global> +borrow_mut>Vecwrite<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>-set_ptr<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>m descend`sort_by_keyřshrinkHremove_kvexpect<(),std::io::error::Error>get_unchecked_mut>>>,core::ops::range::Range>Wtry_reservefrom_error,std::io::error::Error>is_dirFfrom_vec_unchecked +replace, alloc::collections::btree::node::marker::Edge>,(u64, gimli::read::abbrev::Abbreviation),closure-0>Btake<&str>zas_ptr2key_area_mut,alloc::collections::btree::node::marker::Internal,usize,core::mem::maybe_uninit::MaybeUninit>drop>>>binary_search_byp5push_code_point_uncheckedfromis_ok<&str,core::str::error::Utf8Error>SlicePartialEqDzwriteindex_mut>:is_somevderef_mut?index_mutwith_capacityI<do_merge,closure-0,alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>+with_capacity_in$take_box<&str>truncatecurrent_memory<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>ҕdrop_in_place>slice_insert! next>, fn(u8) -> core::ascii::EscapeDefault>,core::ascii::EscapeDefault> take>"vtry_waitrsanitize_standard_fdsInextdarrayyrecv_vectored_with_ancillary_fromgcvtreplace>>validationsfilenFdefaultHcan_mergereplace> +fill%Yweak@expectYcurrent_memory<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>[drop_in_place>, alloc::alloc::Global>>from_sections>call_once gimli::read::Error,(&gimli::read::Error)>:addr2lineCStringArrayfrom_error, usize>,gimli::read::Error>have_changed_path8get_offset>sort_by_keyHinto_boxzmap_fold force,alloc::collections::btree::node::marker::KV>::Format|drop_in_place>Aunwraprange7fmtparse_directory_v5>Bunwrap<&core::panic::Location> size_hintecall_oncefinit_wrappertry_reserveabbreviations>find grow_amortizedMsocknameldrop_in_place +stack_guardpedge_area_mut,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit>>>]>getenvallocZ5wtf8from_error<(core::option::Option<&addr2line::Function>>, core::option::Option),gimli::read::Error>ٜset_ptr<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>drop_in_place>index_mut,usize>Gcopy_to_nonoverlapping +elf\@map<&std::ffi::os_str::OsStr,(core::option::Option<&std::ffi::os_str::OsStr>, core::option::Option<&std::ffi::os_str::OsStr>),fn(&std::ffi::os_str::OsStr) -> (core::option::Option<&std::ffi::os_str::OsStr>, core::option::Option<&std::ffi::os_str::OsStr>)>drop<&addr2line::InlinedFunction>,alloc::alloc::Global>?drop_in_placeFoffset_from, alloc::alloc::Global>>Qdrop_in_place<[(std::ffi::os_str::OsString, std::ffi::os_str::OsString)]>map_err>,(),object::read::Error,closure-0>as_mut_ptr<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>,read_charread_u8_array,[u8; 8]>load_section>>address_or_ipbox_free, alloc::alloc::Global>,alloc::alloc::Global>Fsplit_first_FnMutcopyQ{{closure}}9section_name>,gimli::read::endian_slice::EndianSlice>Qtake_errorGu16_value>map<(std::sys::unix::process::process_inner::Process, std::sys::unix::process::process_common::StdioPipes),std::io::error::Error,std::process::Child,fn((std::sys::unix::process::process_inner::Process, std::sys::unix::process::process_common::StdioPipes)) -> std::process::Child> +W_eprintjdrop_in_place>, gimli::read::Error>>Lindex_mut>nget_programwrite_all_vectored>deref_readonlyget_groupscheck*from_error{{closure}}<(usize, &object::elf::SectionHeader64),closure-0>}drop_slow sh_namefrom_error<(std::sys::unix::ext::net::stream::UnixStream, std::sys::unix::ext::net::stream::UnixStream),std::io::error::Error>`box_freeleft_kv cmp&copy>>>>Amap std::time::SystemTime>allocate_inas_ref<&std::path::PathBuf,std::path::Path>aBas_mutSparse_children>Nadd_file,usize>]discard_bufferЭEndianSlice]is_empty|capacity_from_bytesnew<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>envreserve<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>index,alloc::alloc::Global>Fdata_as_array,u32>ZEndianwrapping_sub5Inext_kv_unchecked_dealloc%is_emptyYinitialize i32>;copy_nonoverlapping>LaddeGguaranteed_eqereally_init"destroy_value>>>>>X8DefaultHashermap_foldas_ptr}MaybeUninit7from_errorpeer_addr#9index>grow_amortized<&addr2line::InlinedFunction>,alloc::alloc::Global>ginto_result,gimli::read::Error>hread>>>>>>collect>, closure-0>, closure-1>, closure-2>,alloc::vec::Vec>replace>dget_program_cstrddefault_hooksum, closure-0>>ecurrent_memory<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global> RangeBoundsfind_location>take>2drop_in_place> parse6drop_in_place>>Z BalancingContexttry_reserve6min_by core::cmp::Ordering>xis_leader_8index_mut>>>,core::ops::range::RangeTo>drop9box_free<[addr2line::InlinedFunctionAddress],alloc::alloc::Global>E{{closure}}ksuccess&&try_with>,closure-0,core::option::Option>>_shrinkCis_none<&[u32]>a{maptrypget_current_dirXGaddbdonȇderef_mutfmtsearch_tree,std::ffi::os_str::OsString>write, alloc::alloc::Global>>pcondvar5jdrop_in_place, addr2line::lazy::LazyCell>, gimli::read::Error>>)], alloc::alloc::Global>>aP_printhdrop_in_place, alloc::alloc::Global>>,index_mut,alloc::alloc::Global>EcloneBas_refdrop_in_place>Inext_kv_unchecked_dealloc>qok,gimli::read::Error>allocate_in, usize>,alloc::alloc::Global>ӫdrop_in_place9namearray+to_ipv4into_searcherdrop_in_placesort_by_keynext_back&parse_functions>BorrowRefMutqwrite>>%try_with,closure-0,usize>unchecked_subread_length>"ttl +7max_by core::cmp::Ordering>xnext>Azeroedindex,alloc::alloc::Global>force>מgrow_amortized, alloc::alloc::Global>,alloc::alloc::Global>Qreplacedrop<(u64, gimli::read::abbrev::Abbreviation)>Kfind_address>sink[0read_portkey_area_mut,[core::mem::maybe_uninit::MaybeUninit]>shrink<read_socket_addr_v4try_reserve, alloc::alloc::Global>,alloc::alloc::Global>t?read_socket_addr_v6push, usize>,alloc::alloc::Global>2from_str slice_insert>>>~Gis_null'swap_nonoverlapping_one>index>ӳdrop_in_place<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>?slice_error_fail=nrecv_msgallocate_in<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>RAunwraptry_reserveis_valid_offset,usize> implstrace_unsynchronizedset_len<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>fromwith_capacity +force=fmt-Ffrom_errornLineRowsrdrop_in_place<(usize, bool, core::result::Result)>}9section_name>,gimli::read::endian_slice::EndianSlice>@drop*call_once<(),alloc::boxed::Box, alloc::alloc::Global>,alloc::alloc::Global>abufwriterbyteset_containssmemWqcausexHsteal_left>/trace_unsynchronizedKascenddrop_in_place>>eis_ascii_uppercase5read_u32>{fmtto_child_stdio%current_memoryunLineWriterShimclone_from_slice,mflush*{{closure}};unwrap, usize>>Kdrop_in_place>Lsections>Ysymbols>index$initialize,fn() -> core::cell::Cell<(u64, u64)>>k9Section0starts_with<&str>box_free,alloc::alloc::Global>droparraysdrop_in_placeˊparsecopyԉas_mut_ptr#Yis_symlinkxsize_hint, alloc::alloc::Global>,alloc::alloc::Global>ResUnito^cvtdefault_read_exact>c split>:unwrap<&core::fmt::Arguments>insert_headrreset_sigpipe3lock>>iread_sized_offset>*index_mutpkeyshdrop_in_place, alloc::alloc::Global>, alloc::alloc::Global>> forcesplice7@map{post_inc_startread>:set_len9section_name>,gimli::read::endian_slice::EndianSlice>call_once@ replace_kv,alloc::collections::btree::node::marker::Internal>fmt>rextcache@copy_nonoverlappingrender_file>ECStringMread_slice_at>!forcebox_free,alloc::alloc::Global>ڱdrop_in_place, alloc::alloc::Global>>Vas_mut_ptr<*const i8,alloc::alloc::Global>drop_in_place>okey_area_mut,[core::mem::maybe_uninit::MaybeUninit]>entries<&std::ffi::os_str::OsStr,std::path::Iter>>is_some encode_utf8push_internal_level>"RngListIter insert_fit>into_vecUcurrent_memoryЈreserveIoffset>>>current_memoryGread>ܘreadwith~set_ptrMnew<&str>Qdrop_in_place<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>drop_in_place>load_section>>nfmtAis_grapheme_extended+is_unspecifiedMdrop_in_place>map_err<&addr2line::Functions>,&gimli::read::Error,gimli::read::Error,fn(&gimli::read::Error) -> gimli::read::Error>insert<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>Aparse_functionsget_uncheckedadefault_read_exact/das_bytes3IsubÈpushϢdropdropremove_entryt?or_elseP@is_some>gwrite_vectoredڦdo_initializeFtry_into<&str,std::sys_common::net::LookupHost> forcepre_execinto_iterPrefixԪread_to_stringc-{{closure}}dswap_nonoverlapping_one>is_empty nexttry>bwith_capacityfmt>>tas_mut_ptrgindex>7arrayuloadwrite_fmt>extendset_ptrinto_raw_parse_form>ssection_strings>as_ptrXdrop_in_place>#new_internalget_refFposition<(usize, std::backtrace_rs::symbolize::gimli::Mapping),closure-0>forcePrecv%get>>write, alloc::collections::btree::node::marker::LeafOrInternal>>cdrop_in_place, usize>, alloc::alloc::Global>>Sinto_vecSymbolTable+Result "UnitHfrom_error<(usize, bool, core::result::Result),std::io::error::Error>lqChildhzeroedJComponents_joinchecked_sub_instant$drop_in_place, alloc::alloc::Global>>mapA9{{closure}}^get isize>S force<typesright_kvread_u8_array,[u8; 1]>cnewMnew_uncheckedcurrent_memory=map,closure-0>r<mapaallocate_innext_match_backval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>bremainingIfull_rangeMlock collect, closure-0>,alloc::vec::Vec>replace> set_ptr, usize>,alloc::alloc::Global>bdrop_in_place>Kis_absoluteto_be_bytesQ{{closure}},std::ffi::os_str::OsStr>Inwrite_to_bufWfrom_error,gimli::read::Error>@AttributeSpecification#with_globalgrow_amortizedInext<read_numberwtis_fifofis_poisonedVprint_toCis_some<&[u32]>ias_inner_mut`stack_buffer_copy eq {{closure}}<&std::backtrace_rs::symbolize::gimli::Library,(),core::ops::control_flow::ControlFlow<(usize, *const u8), ()>,closure-0>get>>>EntriesRaw drop_in_place>Kwrite_bytesGUnixListener\swap>>Eis_err<(),std::io::error::Error>uoffset_fromxtake>>>>Atake__rdl_alloc_zeroedpre_dec_endhas_children,usize>/reserve, alloc::alloc::Global>,alloc::alloc::Global>:get_and_incrementthread_local_dtor3SetLenOnDrop׷read_to_end_with_reservation,closure-0>first_leaf_edge>4drop_in_place>>lU32Bytes| {{closure}}<&object::elf::Sym64,(),core::ops::control_flow::ControlFlow<&object::elf::Sym64, ()>,closure-0,closure-0>:capacity_from_bytes<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>box_freelen,alloc::collections::btree::node::marker::LeafOrInternal>Xmake_ascii_lowercase(=as_refindex6maxinclude_cur_dircorrect_all_childrens_parent_linksswap>/%get>fmt/5read_atomically;5read_separatorval_area_mut,alloc::collections::btree::node::marker::Leaf,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit>]>-read_groups9as_ref>>>drop_in_place>-linenofirst_leaf_edgedget_unchecked_mutؒnext<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>anext>, closure-0>, closure-1>,closure-2>=BacktraceFrameFmtqdealloc@map<&std::ffi::c_str::CString,&std::path::Path,closure-0>call_once<(),FnOnce<()>,alloc::alloc::Global>indexcdropyresolve_socket_addrbox_freeawrite_all_vectoredRdrop_in_place>cwrite_fmtNas_mut_ptrxdrop_in_placexmerge_sortbox_free, alloc::alloc::Global>, alloc::alloc::Global>,alloc::alloc::Global>3find_function_or_location>exchange_mallocis_filefmt֮drop_in_place>map_err,&gimli::read::Error,gimli::read::Error,fn(&gimli::read::Error) -> gimli::read::Error>EudpHwrite, alloc::collections::btree::node::marker::Edge>>capacityqsaturating_cast_to_time_t:Joffset5read_at>current_memory{Finto_result>>copy_nonoverlappingxinto_result`drop_in_place, alloc::alloc::Global>>kpositionQoncedalinewriter6OrdAtomicI32~is_empty>map_err<&addr2line::Function>,&gimli::read::Error,gimli::read::Error,fn(&gimli::read::Error) -> gimli::read::Error>mulwrite>>Hremove_internal_kv,closure-0> +replace, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>,(std::ffi::os_str::OsString, core::option::Option),closure-0>7dwarfTswap_nonoverlapping_onedo_exec fold,(),closure-0>qsection_by_name>Tst_ctimeswap_nonoverlapping_one>unlink7splitnext<&[u8],core::slice::iter::RSplit>1current_memoryxcopy_nonoverlapping<&mut [u8]>execute,gimli::read::line::IncompleteLineProgram, usize>>current_memorymap<(std::sys_common::net::TcpStream, std::net::addr::SocketAddr),std::io::error::Error,(std::net::tcp::TcpStream, std::net::addr::SocketAddr),closure-0>next_kv+ +replace, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>,(&std::ffi::os_str::OsString, &core::option::Option),closure-0>replace>>>>>>fmt>saturating_mul_Qiter>\drop_in_place>> rename>>Uwith_capacity_in,section_headerreserve<&addr2line::InlinedFunction>,alloc::alloc::Global>new>drop_in_placePdefault>l#recursenewMdrop_in_place@fficopy_nonoverlappingcall_once (core::option::Option<&std::ffi::os_str::OsStr>, core::option::Option<&std::ffi::os_str::OsStr>),(&std::ffi::os_str::OsStr)>new:next<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>NodeReffill_bufhdrop_in_place<[alloc::boxed::Box, alloc::alloc::Global>]>as_mut_ptr, usize>,alloc::alloc::Global>Z__rust_drop_panic +Handle\truncatedcdrop_in_place, usize>, alloc::alloc::Global>>resizehfull_rangeis_sep_byteh9optionswap>val_area_mut,[core::mem::maybe_uninit::MaybeUninit]>{uiddescription@unwraptake>xubarrier>scustom_flags+P{{closure}}0xdrop_in_place> +right_kvatomic_sub[get_unchecked_mutis_empty +next, alloc::alloc::Global>>)stack_sizeKoffsetILadd>datasyncAexpectinto_iter<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>Mcopy_nonoverlapping>>>P%try_with>,closure-0,std::thread::Thread>yallocate_indrop_in_place>expect>,core::cell::BorrowMutError>΁drop_in_place{{closure}}{{closure}}>,closure-0>?_opencurrent_memory9as_ref>>write, usize>>:capacity_from_bytesfmt@ok, alloc::collections::btree::node::marker::KV>,alloc::collections::btree::node::NodeRef>file_range>*unwrap_or_defaultraligned_malloc glibc_versionAread_to_end_with_reservation<&std::sys::unix::fd::FileDesc,closure-0>"Ndrop_in_place>>drop>Ifull_rangeswap_nonoverlapping_onea SameMutexCheck copy_nonoverlapping>>overflowing_addWinnerjdrop_in_place>mcurrent_memoryinto_boxed_slice<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>lcalloc_implallocatezreaddrop_in_place\find_eh_actionpanicdrop_in_place>read_encoded_pointerops}drop_in_place>box_free*panic_unwindreadbox_freeuDwarfReaderzcleanuphinterpret_cs_action2call_oncecall_oncerust_eh_personalitydwarf__rust_panic_cleanup{{impl}}>__rust_start_panicrust_eh_personality_impl7drop_in_placefunctioncoreF{{closure}}deallocatefadd~boxeddeallocxptrsguaranteed_eqnewreadread/real_impRallocround_upehZoffsetread^Globalreadexception_cleanupFnOncepexchange_mallocPconst_ptris_nullread_uleb128read_sleb1288͠try_fold,(),closure-0,core::ops::control_flow::ControlFlow<(), ()>> and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,rustc_demangle::v0::Parser,closure-0>!get_uncheckedmut_ptr# unchecked_add}print_dyn_traitbcheckindex>next_code_point> +Result5bytes5skip_generic_argEprint_const_char +try_from/ {{closure}},closure-0>get(findequalk peekt{{closure}}2getis_char_boundary +result]{{impl}} +map_err<&mut rustc_demangle::v0::Parser,&mut rustc_demangle::v0::Invalid,rustc_demangle::v0::Invalid,closure-0>lenG function 5disambiguatorV is_rust_hashadd6new +unwrapFfmt<()> unwraphaystackall<is_prefix_of+print_const_intoffsetltdrop_in_place<&()>Bpost_inc_start# is_okfmt@ rustc_demanglebhprint_type checked_add {{closure}},closure-0>y rev9 +is_someL FnOnceCskip_typeconst_ptr +clonedis_ascii_punctuationL {{closure}}/{{closure}}try_demanglemin_by core::cmp::Ordering>max_by core::cmp::Ordering>next_match, +and_then%Iteris_symbol_like +unwrap<&str>str/Veatyiter copiedpattern and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,&str,closure-0>}next_matchi!try_small_punycode_decode.{{closure}}nextindex>SplitInternalindex>slice*post_inc_start5itercopiedmax|new_v1 overflowing_sub_getQhex_nibblesxeq<[u8],[u8]>into_searcher/try_small_punycode_decode>*coreBis_empty saturating_sub +from_u32 and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,rustc_demangle::v0::Ident,closure-0>.in_binder'backref_printer0 unchecked_subpnextadaptersnext_backmatchesQskip_constG +char/punycode_decodeVparser_mutDoubleEndedIterator0 map<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,bool,closure-0>Searcherget_endChars print_const_uint|/Ident next>allp +is_controlnimplsc +is_digit/Parsertry_rfold,usize,closure-0,core::ops::control_flow::ControlFlow>W and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,rustc_demangle::v0::Ident,closure-2>chars) opsL +methodsstarts_withpnextany>,closure-0>/identany and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-0>byteset_containspositionnextOrdrposition?nextindex>Ras_ptr checked_sub4integer_62wArgumentstraitsfind +as_mutnext overflowing_mulnext_match> and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-1>} +len_utf8]anyrposition>,closure-0> map<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,(),closure-2>/digit_10starts_with<&str>Q call_once core::option::Option,(u32)>8 into_slice_range copy_try_fold;hin_binderindex +convert +unwraplstarts_with(utf8_first_byteodprint_generic_argL!v0Nsplit8print_const_boolrbackward_unchecked{{closure}}unwrap_or_0 and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u8,closure-0> unwrap_or_else,closure-1> num=5skip_pathq and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,rustc_demangle::v0::Ident,closure-5>^ FnNmake_slice eqindex Optionhfind<&str>char_indices>Demangle.hin_binderUPrinter/peek&get4opt_integer_62IteratorCas_str05namespaceRprint_consteq optioncrpositionUhprint_sep_list core::result::Result<(), core::fmt::Error>> demanglevalidationstry_fold>icmpget{ call core::result::Result<(), core::fmt::Error>,(&mut rustc_demangle::v0::Printer)> and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-4>Yforward_unchecked3 RangeInclusiveiterator map<&u8,u8,closure-0>4backref and_then core::option::Option>V +to_digit checked_mulE legacyn!{{closure}}>double_endedmemchr[get_unchecked> and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-5>parseZas_slice#({{closure}}Eget> and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u8,closure-3>. rangeutf8_acc_cont_byteptrd and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,(),closure-7>Lnext get_or_insert_with,closure-0>f PeekableTwoWaySearcher= and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,core::option::Option,closure-3>index>Ubasic_type +and_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-6>Uprint_lifetime_from_indexDyprint_path_maybe_open_genericstry_rfold,u8,usize,closure-0,core::ops::control_flow::ControlFlow>offsetminY nextnext,u8> map<(usize, usize),usize,closure-0>#5digit_62= peekable overflowing_addcinto_searcher try_fold,u8,(),closure-0,core::ops::control_flow::ControlFlow<(), ()>>arrayV6extendRcopyset_ptrKwrite_charHallocatem4repeat[Omut_ptrVFnMut$DrainfUskip_while`4clone_intoRcopy_nonoverlappingfrom_utf8_lossyUclonedpUnext,closure-0>Uarith1diffFreserveRResult\Snext_code_point>TcheckUnextnKwrite_str4to_vecderefRmap_err,core::alloc::AllocError,alloc::collections::TryReserveError,closure-0>@Kwrite_fmtTtry_fold>ydrainNsplit_at_uncheckedOfromJSis_char_boundarycurrent_memoryTsum, closure-0>,usize>gRresultU1collectionsVcall_mut usize,(usize, usize)>{{impl}}Rexpect<(),core::fmt::Error>Ufunctionraw_veczfinish_grow7NlenNVclone_fromRmap_err,core::alloc::AllocError,alloc::collections::TryReserveError,closure-1>+add_assign<deallocateQaddQwrapping_subneeds_to_growgrow_implnewRfrom_error<(),alloc::collections::TryReserveError>assert_failed\fromdJfmt<()>Ttry_rfold>8{{closure}}>WRlt;Umap_fold@U{{closure}}<&&str,usize,usize,closure-0,fn(usize, usize) -> usize>clone_fromhandle_alloc_errorNis_emptyfmt"9to_lowercasefrom_utf16Qdrop_in_place>NUrevQchecked_addFOget_unchecked1vec_deque?shrink?Qcopy_to_nonoverlappingLshrink_to_fitNQread%borrowPconst_ptr#into_bytes capacity_overflowNpost_inc_startuQdrop_in_place> Rmax_by core::cmp::Ordering>Niter<&str>JfmtkVnext>>hQwrite Sinto<&[u8],alloc::boxed::Box<[u8], alloc::alloc::Global>>DNIterVswap4strqRinto_result,alloc::collections::TryReserveError> Oiterd1replace$UmapKTpatternmas_mut_ptr~Ooffset<&str>4to_vecaNpost_inc_start<&str>Nnext[Qswap_nonoverlapping_one)fmt9{{closure}}F1into_owned__alloc_error_handlerV4slice@Rmax8case_ignoreable_then_cased>INpost_inc_startSiterMnew_v1Odrop_in_place>allocate_inTgrow~Rfrom_error,alloc::collections::TryReserveError>Tsum, closure-0>>from_utf8_uncheckedaVdecode +Tindex> +into_searcherRawVec|Icore$Sis_empty*write_char`Iinto_stringtry_reserve_exactaspec_extend+deallocUadaptersNnext_backRmap_err+NnextUnext,u16>Snext_code_point_reverse>\Vchar lenTDoubleEndedIteratorRcopy_nonoverlappingMestimated_capacitygrow_amortizedyNpre_dec_endGlobalSCharstry_reserve_exact%derefJfmttry_reservealloc_impl9case_ignoreable_then_casedMRimplswith_capacityTaccumMWrite.Ufold,closure-0,usize,fn(usize, usize) -> usize>__rdl_oomTDto_uppercase0ScharsUopsPcloneyVmethods1splitpointStringyTfold,usize,closure-0>OoffsetVmem8case_ignoreable_then_casedMDebugList-ROrd1node4to_owned$defaultUnext4clone_intoset_len`shrinkPdrop_in_place>MArguments stringStraitsTrfindNclone_from_slice4hack4VecQoverflowing_mul|Unext7write_strTfindVlen_utf8]clone_fromNsplit_at9as_ptrNget_unchecked>u$boxedUrfind)VreplaceNnext<&str>ytry_reserve/vec6VtakeSconvertrealloc=pushQok_ormhandle_reserveQmap<&u16,u16,closure-0>"OiterT{{closure}}hSunwrap_or_0 RclonedSnext_backQnumIVCloneIfmt>with_capacitykspec_extendNmake_sliceMentries<&u8,core::slice::iter::Iter> +indexQOptionMbuildersz4to_vec_in=Schar_indicesinto_raw_parts insert_bytes drain>Qadd<&str>split_offtruncateSutf8_is_cont_bytetTIterator$as_strIinto_raw_partsxclonedropSappend_elementsdropQoptionJfmtVencode_utf8_rawWSvalidationsRcmpTget__rg_oomZFrepeatwswap_removeoTiterator`extend_from_sliceremoveOis_emptyZ1btree1wrap_copyQchecked_mul2grow_exactVencode_utf8Tdouble_ended2QaddmIto_ownedzwith_capacity_inpushUNnew<&str>j#into_boxed_strx#FromUtf8ErrorRintrinsicsA1CowCindexNas_sliceOdrop_in_place>JfmtUrangetSutf8_acc_cont_byte8map_uppercase_sigmaVOptr.size_hintinsert}#as_bytesOdrop_in_place<&u8>Nnew0Tindex>TfindUadd2formatalloc Qoffset#utf8_errorQexpectpush_strQoverflowing_addinto_boxed_slicejderef_mutEn1dec2flt =fmt<[u8]>Kdigits_to_exp_strmslice_end_index_overflow_fail 'white_spacernext>>xfmt_u128 rdebug_listwfmt,core::char::EscapeDebug>replacepcmp_by>>,core::iter::adapters::rev::Rev>>,closure-0>hyfmt,core::char::EscapeDebug>}into_iterOm{{impl}}Utf8Lossy}len6algorithmucountAtomicIsize{try_fold,(),closure-0,core::result::Result<(), core::fmt::Error>>add_assignto_bitsunwrapunwrap_or<&str>W&fmt>v5fmt 0fmt>> mfrom_str_radixZfmt>K fmt~allTmfmtparse_expArgumentV1Dfmt>z$nԄcontains_zero_bytestrategy[get<&str>"snext>>9align_to|post_inc_start&bitset_searchowidthdiv_assignnmax_by core::cmp::Ordering>next_matchdebug_map_newzflattenfmtzclone,core::char::EscapeDebug>strS)bsearch_case_tableziter/fmt1format_exact}next_back>Fcopy_from_slice'lookupget_unchecked_mut subtf32)to_upperindex>gpost_inc_startfmt<decodewrite_char*coreLdigits_to_dec_strsaturating_sub 1fmt>>memchr_general_case/get>olt[sync{charJlenMto_shortest_exp_str]) -> (&[u8], i16)>tfilteryvenumeratefmt_int,panic_fmtGcallerXbound_intermediate_digits/vtry_fold>fmt_intqtry_fold>udebug_tuple_newrclone>,core::iter::adapters::flatten::FlatMap>Wbignum'}next_backeatomic_loadNrtry_rfold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>2as_usizeescape_debug_exttimef64}rpositionoffsetdiy_floatand_then<(),core::fmt::Error,(),closure-0>ݐto_u166core_archUfmt>>IterMut)fmt_int|entry9fmtqadvance_by4GenericRadixWtraits}rpositionclone>>&slice_index_order_failcasedpadd1<&u8>zfull_mul_add;power_of_tenVeqmcopy_nonoverlappingbinary_search_by<(char, [char; 3]),closure-0>fpadFMfmt<[char]>index_mut>;to_u32Qmaximal_suffix@index1pbackward_uncheckedcwrap_buf6*newuunwrap_or_0padvance_byfloat_to_exponential_common_shortestindex_mut>FpfloatLestimate_max_buf_lenexpect_none_failed-fmt>gqcmp>>,core::iter::adapters::rev::Rev>>>offsetEmessageiutf8_is_cont_byteEfmt>>VpIterator}PfmtXclonerfmt>,core::iter::adapters::flatten::FlatMap>swapMto_exact_exp_str], i16) -> (&[u8], i16)>>eq'PanicInfo[pchain,&[u8]>get_uncheckeddebug_set_newencode_utf8_rawpforward_unchecked%mfrom_str_radixcall_mut usize,(usize, &u32)>from_intAdroptfmt,core::str::BytesIsNotEmpty>fmt<&core::task::wake::RawWakerVTable>mapmap<&u8,u8,closure-0>.snext>Jcall_mutxabsXdecoderget_unchecked>addclone>to_u64float_to_exponential_common_exactSkindqfmt>cerrors{{closure}} usize>yfloat_to_exponential_commonp{{closure}}>>,core::iter::adapters::rev::Rev>>>s{{closure}}<&u8,usize,core::result::Result,closure-0,closure-0>Nqcount>, closure-0>>ĺfrom_utf8;fmt +eat_digitsnewPostPadding{index>get_uncheckedfrom_bitsreplaceDurationVaddoffsetSParseIntError {try_fold,core::char::EscapeDebug,(),closure-0,core::result::Result<(), core::fmt::Error>>convertsLto_exact_fixed_str], i16) -> (&[u8], i16)>!AtomicU16rawfpz{{closure}},&mut closure-0>$fmt>>maybe_uninitpfe_emptyLdetermine_sign4}allfmt_intiHPartsarithHfull_addnext_code_point>Sv{{closure}},core::str::CharEscapeDebugContinue,closure-0>c"fmt>, core::iter::adapters::flatten::FlatMap>>is_none0rdebug_upper_hexaAtomicU322equalLto_shortest_str]) -> (&[u8], i16)>Ifmt>>3resultcall_mut usize,(usize, usize)>fmt_int0big_to_fpoindex_mut>bfmtʓdigitoPartialOrd?fmt<()>panicking4qfold,u64,closure-0>ok_orok_or}align_offsetYngefmt_int%fmtzclonefrom8offsetpfe_invalidainternal_constructorremqfold,usize,closure-0>zclone,core::char::EscapeDebug>compare_with_half_ulprrevltnew,core::slice::iter::Iter<&str>>Ffmtget_unchecked^fmtJequalfrom_str_unchecked<&[u8]> fmtZconst_ptr'|try_fold,(),closure-0,core::result::Result<(), core::fmt::Error>>get_bitdebug_list_new'skip_searchAqchain>,core::iter::adapters::flatten::FlatMap>from_error<&mut str,core::str::error::Utf8Error>write}float_to_decimal_common_shortestY|IterOfmt<&core::fmt::Arguments>{try_fold>AtomicU64`stake_while|post_inc_start<(u8, u8)> add_smallFsnext>>Yfmt&uppercaseNSfrom_str_radixAv{{closure}}<&u8,usize,usize,closure-0,fn(usize, usize) -> usize>get_bitsyDebugTupleuto_usizertry_for_each>IPfmtone_less_than_next_power_of_twoRsnext>Nvmap_try_foldfmtget1{cloneis_emptyb{cloneDmemrchrbinary_search_by~next<(u8, u8)>Tatomic_loadatomic_loadgetradapters@Jfmtfrom_errorbinary_search_by_keywzfmtkzfmt5fmt<&Any>rnext>float_to_decimal_commonBLocationxwrapCcfmt.zeroāindex_mutpaniccwrite_fmtJ{try_fold>`atomiciters{{closure}}<&u32,usize,core::result::Result,closure-0,closure-0>)Tfrom_str_radix{DebugListyfieldefmt>$leading_zeros]decode_prefix_sum pnext]nonzero#vtry_fold>downcast_ref<&str>findfrom_bytessfmtuwrite_str1hash div_remanyp{{closure}}>>,core::iter::adapters::rev::Rev>>>tatomic_loadYnth{{closure}}write_bytesfrom_str_radixrepeat_bytelfrom_str_radixafmt$pnext_back call_mut]) -> (&[u8], i16),(&core::num::flt2dec::decoder::Decoded, &mut [core::mem::maybe_uninit::MaybeUninit])>lfrom_str_radix)ok_orunicode_dataq}nextnumas_mut_ptrc|entries<&u8,core::slice::iter::Iter><Optionis_someutf8_char_widthV{clone,core::char::EscapeUnicode><encode_utf16gget*fmt>>.ascii={try_fold,core::char::EscapeDefault,(),closure-0,core::result::Result<(), core::fmt::Error>>fmt_intypadd1<&u32>,iter_mut>_v{{closure}},core::str::CharEscapeDefault,closure-0>is_printabledvalidationsufmt,core::str::IsNotEmpty>ncmpget{fileofillexpectto_digitchecked_mul5fmt_int'qnthSwrite_bytesParseFloatErrorpcmp>>,core::iter::adapters::rev::Rev>>>binary_search_by_keyz{{closure}},closure-0>`copy_nonoverlappingrtry_fold>,core::iter::adapters::flatten::FlatMap,(),closure-0,core::result::Result<(), core::fmt::Error>>%call_mut usize,(usize, &u8)>Vfmtrangeget> fmtrindex,core::ops::range::RangeTo>stry_fold>,closure-0,usize,closure-0,core::result::Result>size_hintutf8_acc_cont_byteqtry_for_each/ptrAdrop_in_place<&core::iter::adapters::copied::Copied>>IestimatorLmfrom_str_radixAtomicI8rchainindex_mut,core::ops::range::RangeTo>sindex>unwrap_or,*wake'checked_div .allocfloat_to_decimal_common_exact(sub_assign`to_u8fmt_intɲfmt_intJmcpuid=psize_hintwrapping_next_power_of_two%{clone,core::char::EscapeDefault>Qfmt~|DebugMapFnMutPfmt>from_errortclonedfmt_decimalCfmt>kv{{closure}},core::str::CharEscapeUnicode,closure-0>checkfmt_intswapz{{closure}},closure-0>%fmt6ok_or!cloneBrtry_rfold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>ufmt,core::str::LinesAnyMap>escape_unicodeIcall_mut<((), char),&mut closure-0>vtry_fold>is_char_boundaryfmt<|entriesADecodeUtf16Errordpad_integral1div_2pow103Afmt<&[u8]>iter_mutwrapping_sub~into_iterCok_orjstry_fold>,closure-0,usize,closure-0,core::result::Result>atomic_loadЈindex>,payload|get_uncheckedfloat_to_exponential_common_shortestNfmt>>ǟfmt@runpzip,core::slice::iter::Iter<&str>>full_div_remwrite_prefix>callrtry_fold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>get_unchecked-1fmtlmmin_by core::cmp::Ordering>dpartial_cmpto_u128snext>Btnext,core::slice::iter::Iter<&str>>Lto_exact_exp_str], i16) -> (&[u8], i16)>ztry_fold,core::char::EscapeDebug,(),&mut closure-0,core::result::Result<(), core::fmt::Error>>patternumap finish1*RawWakerVTablemul_pow10j}key]from_str_radixpnth6simdcnew_v1,offset5|copied܈index_mut>float_to_exponential_common_exacttnext,core::slice::iter::Iter<&str>>ParseCharError!Mto_shortest_exp_str]) -> (&[u8], i16)>fmt_u640decodeB]fmt>>>rsum, closure-0>>.fmt>>@}nextlastX}next_backunchecked_subufold,closure-0,usize,fn(usize, usize) -> usize>atomic_loadY'fmt>gtZipsafe_getccall_mut<((), char),closure-0>Ztnext,core::slice::iter::Iter>digitsnew_unchecked<(u8, u8)>tBfmt>e#fmt>>exp_u64pprecisionmfrom_str_radixfrom_strszipHnormalize_toslice_error_fail)rtry_fold>Jrotate_leftvestimate_scaling_factorfrom_error<&str,core::str::error::Utf8Error>exp_u128Lto_exact_fixed_str], i16) -> (&[u8], i16)>lossyindex,core::ops::range::RangeFrom>ztry_foldSflt2dec2implshpcount>, closure-0>>format_shortesteq<&u8>DgrisuWrite"parse_decimal)fmtDecimal!grapheme_extendcharsmethodsnextmem|is_prettyzDebugInnersfoldBimp!ccqdebug_mapZwriteؽchunksюindex>YVfmt=checked_sub5fmt>from_u64get<&str,usize>cArgumentsv|post_inc_startmapwrite_str fmtfmt_intoverflowing_mulifmt_intstr_index_overflow_fail0marker[unpackPfmt+fmtunicodepzip,core::slice::iter::Iter<&str>>Gfrom_u8](fmtOinteger_decodetests|new^udiv_1e19cPfmtparsesnext,core::slice::iter::Iter>convertAmap<&u32,u32,closure-0>as_mut_ptrSzfmtrAtomicBoolImul_innerAtomicU8fmt, core::str::LinesAnyMap>>next_backtqtry_for_each>qeq[pre_dec_end>Ŏindex>rbuilderscellDO__descriptioninto_resultfmt>f)to_lower]fmtσfloat_to_decimal_common_shortestwrapping_add#rdebug_lower_hexadd>nwrite_formatted_partsz{{closure}},closure-0>LngeNonNulljfmt<&mut core::ffi::VaListImpl>Qpiteratorunwrap_or<&u8>case_ignorables{{closure}} usize>Qfmt_intencode_utf8is_grapheme_extendedxPadAdapter8rdouble_endedcall_once div_rem_smallreplacelpad_formatted_parts4intrinsics]ok_orEfmtPok_orZfmtucount,closure-0>csign_aware_zero_padgetshort_fast_pow10LTwoWaySearcher|try_fold,(),closure-0,core::result::Result<(), core::fmt::Error>>fmt_intQdecode_lengthdx86mmincall_mut], i16) -> (&[u8], i16),(&core::num::flt2dec::decoder::Decoded, &mut [core::mem::maybe_uninit::MaybeUninit], i16)>Cfloat_to_decimal_commonmul_assignslice_end_index_len_failatomic_loadmul_pow2imul_pow5dragonxtnew,core::slice::iter::Iter<&str>>load vfmt, core::str::BytesIsNotEmpty>,core::str::UnsafeBytesToStr>earrayfrom_error$lowercaseIFormattedݎget_uncheckedmut_ptr6fmt>rnext,core::slice::iter::Iter>8hexifymapfrom_utf8_mutunchecked_add9copy_nonoverlapping[ok_orcFormatterdDformat_shortest_optescape_defaultv{DebugSet fmt<&mut &core::ffi::c_void>wok_or8Result4read_volatiletnext_back,u8>lineoalignfmt>(fmt>Eformat_exact_optEDmax_pow10_no_more_than+pre_dec_end fmt<&core::panic::Location> +snext>4atomic_load,fmt>functionatomic_loadAtomicUsizeʃslice_start_index_len_failKlen_mismatch_failadd7newparse_u64_intofrom_errorLto_shortest_str]) -> (&[u8], i16)>T>fmt, core::str::BytesIsNotEmpty>, core::str::UnsafeBytesToStr>>Onew>vfmt,core::char::EscapeUnicode> is_zero.layoutmltcalternatefrom_usize|post_inc_startStrSearcherGround_upL}next>expect_failedvsfold>,closure-0,usize,fn(usize, &u32) -> usize>=checked_addFnOnceclonedPcfmt<&str>{clone>Lfmt, core::str::IsNotEmpty>>index>.clonediv_rem_upto_16Crdebug_struct_newqtry_fold>Fpsign_minus91fmtadde}nextindex>run_utf8_validation\rcollectindexoflagsO|slicenmaxpiterofmt>>}fmtsok0overflowing_subHFpossibly_roundTslice_start_index_overflow_failOget_unchecked2neq<[u8],[u8]>_write_fmttry_fold<(),closure-0,core::result::Result<(), core::fmt::Error>>?mfrom_str_radix qsum, closure-0>,usize>2mfrom_str_radixjok_or~sfinish_non_exhaustiveUSIZE_MARKER+index,core::ops::range::RangeTo>float_to_exponential_commonialphabetic}xfmt,core::char::EscapeDefault>{try_fold,(),closure-0,core::result::Result<(), core::fmt::Error>>NbitYmfrom_str_radix=rDoubleEndedIteratorfloat_to_decimal_common_exact?OTryFromIntErrorfrextend_oneOrDebugStructAtomicI16Cpre_dec_end byteset_createnew +dpadding$8fmt2fmtZqcmp_by>>,core::iter::adapters::rev::Rev>>,closure-0>copy_from_sliceeshlraccumUnpackedp fmtn{try_fold,core::char::EscapeUnicode,(),closure-0,core::result::Result<(), core::fmt::Error>>normalizeopscloneindex_mutpanic_bounds_check{{try_fold>qtry_for_each>^locationZJfmt core::task::wake::RawWaker>ufmt_intxvalue]fmt_intq{{closure}},closure-0>SMfmt<&[char]>index_mut,core::ops::range::Range>}positionp?fmt<*const ()>ymOrdswapznon_nullAAtomicI32#1siplmulufmt}qdebug_set=fmt<[u8; 4]>Fswap_nonoverlapping_onep|entries<&char,core::slice::iter::Iter>is_emptyVDround_and_weed next8classify}positionlen_utf8u{{closure}}<&u8,closure-0>umapfrom_smallcolumnfirstMfmt[fmt>Funpaired_surrogateBig8x3{index>rtry_fold>write_charafull_mulprintableղfmt_intdiv.from_digit`swap_nonoverlapping_onefmt_inttruncate_to_char_boundaryNcloned5fmt9fmt_int|make_sliceffiFcopy_nonoverlappingtype_idfmtfmt}CaseMappingIter"char_indicesrdebug_tupleAtomicI64:stry_fold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>{fuse}into_iteroption fmt<*mut core::ffi::c_void> bit_lengthfmt>]mul_smallfmtcdebug_structget_unchecked_mut>{min_pos_norm_valueku128_mulhiis_emptyoffset>digits_to_bigis_empty>memchriter_muttnext_back,u32><decode|as_slice2extract_signX){{closure}}'*taskcsign_plusis<&str>sfold>,closure-0,usize,fn(usize, &u8) -> usize>xreverse_maximal_suffixMindex>5futureatomic_loadMgetcountEfmt_int +mul_digits\Big32x40mswap_nonoverlapping_onetnext,u8>֊escape_debugrtry_fold>A)conversions0overflowing_addTmake_ratiob qB{{impl}}u__umodti3*compiler_builtinsGleading_zeros8core`checked_rem/intEu128_by_u64_div_rem=num4specialized_div_rem9u128_div_remSwrapping_mul^udivQu64_by_u64_div_remwc qB{{impl}}*compiler_builtinsu__udivti3Gleading_zeros8core`checked_div/intEu128_by_u64_div_rem=num4specialized_div_rem9u128_div_remSwrapping_mul^udivQu64_by_u64_div_rem9P5 += + +/J(ewbeJi Ȋ he[j  t x D͚ i* ?FM Z  ͚ 6 ?Вt X   g u2W h  -uf hf h u (0i3 5uT +uTuT`i# wi  + + v ?  v W! 5 vTO +)vTQ!)vTi +~v +~v  +~v  F~vXa F~v +5j(0j @ +v k v E k`jCj) vV*jV3 vIv]@ OjV3  kV8 vIv]@ OPkV8 [kV9wV>!O wV>[OwV?% +sw1. sw11@ k +w# ww  w (l3 5xT +xTxT + +@x ? @x W! 5@xTO +ExTQ!ExTI 3q   z Պ  T`V(<wVV(< + mSma  bM b g g R t-j. b|V} tV} tŇK t. kV} tV} tն[ tU bd bYd b b8H H b֝ \ tK L*3 P) Pņ PP P P Pi P t P!| WYW YB C 0 ^` c >C  Sp  |5= w   \0P" %3, % 7&k _ +* S  K@J +4 +  F  F + +F +  F  F +r9p c +ĵ  +d   .:jI<q>115k66k6 H7781<3=QQoRQ SS?ΤΤ U%J////40c @11M4C@vYIyY$+6BIeB[1 2!6/7DEuDvZvDv:vwIwxc G@mB4w%IԥVI:Tc c ~%-&@8&&?5555 n667)88-&i9-&9q:t; <^s6677 +:6@:;W;;<;4tttuu An*(w:^ *rIAI~  b % % I% [&  4 4 4 4 4i5 5 @!6 6 v % w x { <| G n ^  . U ) F Q@ 8 FJ T u +2_2 uV99 u== uc u u 2]2 n oXX qτ qc 8 ) t  i 8!! 77 B!C iCD i,ErE aEb ibc cc d 4  X 88 Q"9x9 99 ^8_ hBi _sќ z${ B  q ~ FC  "T" $% ^)) z<< n ` Q d  A ѱ H i;% H l q iZ 8 4 i    7 48 iB ,C q` o` $ Ox x 8 + Y Y+S8 ()\ )Qy%f;DKD)D},|؀Wpp"tt1MʶC؀$}}NȕBJʶȩSXӭM/X{؀JX<XlX:s5tU{9|A̜X8L8<p{؀X׀.~U׀.1œXݓ]XVpX)] /X=R>v>>w??|URRևPr/k9U  ? I@ M YN  6    qrUuvUx8yU.UOXX"]XX4UsIsXXwxffUfXX SU!!XXPXX5UU `XXO bO Uz U<<8yU?TTUoCPC1PC7PyWZ C, +^yCA ^yU mCJ nC; PnC;0nCQ E`o ) o o p *C!CNp{SW  C~`pC 5{T pC pC? 5 qT R{CI {{C /}C7 5} ) &^%} +C;2/}C= /PqC@ 5q ) &c}CE/qC 5q ) &rC +E5|8 ) 5| G| Z| @rC =|Cd: +| X F| F| + /|Cd 5| ) &^| Ch2|Cj  +prClrW! 5rTO / sCm 5Ps ) &|Cr R|Cv || C |C | +|N |< VCYCNCoCw}C(CCpCEC C} Wl C"sC&"sC  #sC"0tCx /`tCp 5t ) &"tCy /tCp 5 u ) &"PuCz /uCp 5u ) &"uC  #vC"@vCx /pvCp 5v ) &"vCy /wCp 50w ) &"`wCz /wCp 5w ) &"wC  # xC"`xCx /xCp 5x ) &"xCy / yCp 5Py ) &"yCz /yCp 5y ) & + #2TC +"2)Cx /zCp 5@z ) & +"[!Cy /pzCp 5z ) & +"| +Cz +/Cp 5 ) & +J^C +E0     +/NC 5N ) & +#\C +\2C +E\2 ) \ n } +dC +W  +LI ND @I%b ^C3 +/C  5 ) & +/C 5 ) & +qC + | LI @I%b +E6C    +RTC' TTC zC{ +o N +o < LIo + @Io %b'#0{Cp{C +E8 )    +d. C +W.  +LI. ND @I. %b ^7C7 +/C 5 ) & +/̓C 5̓ ) &{C'{   LI + @I %b +4#C +LIC @I%b @IKC0 OC IdC IhC E#C R#Cc R##Cc5 +6)Cc +6) 6) @I=Cu% ^ACu @I]Cv* @IeCv4 iCv|Cx 50|T ICy @ICz. @ICz7 Cz IąC{ @I˅C|. @IԅC|8 ؅C|`|C3 5T +TT|CM 5KT @}T p}T/}CA+ 5~ ) & I`~CA @I~CB/~C]* 5P ) & IC] @IhC[ IC @IC @IC6 +E=C   ' IdC @IkC +Eo8C o   @IC +Rψ C ψ ߈C C +E4 )   ) +6< +C +6< + 6< + dPC +W^  +LI^ ND @I^%b +`#܉C C 5T + T TC RCv C =$Cd +$ X F$ F$ + /,Cd 5, ) &^?Ch2MCj  + ClPW! 5TO /Cm 5 ) &pCr@ICpYW  C +CW! 5TO +TQ!T +@CpW! 5TO +jTQ!jT2ЂC ѵՋC' +/Ջ  5Ջ ) & ѵC' +/  5 ) &  1C +E 1 )   ' C +E{4 ) {   2@C ѵC' +/  5 ) & ѵC' +/  5 ) & !1C +E!1 ) ! 1 ? _ _ Cwk;;5>>$Y6<(? g? YY~Y? jbb<Y$Y)dfYYZY݊N<Ϗ@<Y z<Pii<m<Z@@hhZOw.|Zzp[epFFM=(.:ZnZ,Y.Yw||}Xhh + + wW w E +8> +s Pl$l IPm]@787jTSdQ\ y"N#&& 76W8)8:q:KzG +eHd-IJ + + +2 (+,(H--;S;;.<JJ(LLLX)YYYT(T:5:5:5LЍ&Wa "WBMI5  CD-iii(Qjj|vvؗi(wkD*kOO50nonww^~#!# $*1c111(\\dee[eeejj(j1k +qFqqrKځ +LEx=5 n 5y.k/0   5U**@A/AlAA2B?B|BCD5E)F5GG5$McMrMMMMQOOO+P/PPJQQ5QQ5NSS5TU5^V^6yoyI~~~ K4A[|Lώ ySȗ͘Rҫ ZfƱ1k(b/kZf 65_::5(/wrZ?"6rZ+gg3p/3d(4;m;<=_>>>>!?Z?BBDEEEECII(II{WW[3cc2fnfggOhhllfssZyy&&d/ F 0''~00001X==Ci~LZZe A 9dr r u 1v -  a +V +>2? +s"w + +44 +45 +A +ʆ +U +9 +9J +9@BA +9 +.V +} +(~ +% +% +V +s);  +e +s8rr +rr +߳ +M +Pu + +Z +* +%j +:^ + + B +6 =7 +g7 7 +%K"#**s..@4@5XIIsqMMefsUq]qq%Luu%xa %$}%%$ \%vĜ%w%V%] %]&'%Y''%]*5+%++%]c'd%d9e%]Ѵ%͵%] ^%E%G%]%Z%]Y%ͻ%]{%@%]c%%] %@%]%V%]R%z%]%$%#q%]% ; %^  %]@@%΄r%r%]߳%n%%];k;%]T__%q%$ Z%%]%$QQ%RSR%]A^^%$1~%̀%%ɠ%0%n%^%m%$ST%\l\%[^^%]j\j%sms%ss%].%P%]%^%]Z= B %= = %]{ =7 %V{ 7 %] H %] %L %Ҫ %]sajr-}Ȫ-s-g-&q-N N -W}ݱ):}`ݱf2H<}8ݱ?y,TzMX0^W # @^Wq /@^ +(C^B jC^? wJ^B  yNFW N  M M0 ء`   <& +<r NN N  N r u+7Vy*W O Oc Í> +P: NN N !P!N r + P  A<& +<r P1$P!! M<& +<rEcW   Ѝc  > +Q\ Q5 M M MM!ء" @"<& +<r M M MMp"ء" "<& + +<r + Q0 0 Y<& +<rP^WR P^W^C p^"W߳ p^! ep^<& +^ <r^ p@We` M M MM#ء0# `#<& + <r  T M M M M ء <& + <r ^W N^ ^ +*^A  +^A\ +>^A +1^5; + N^5 ^ W:NFZ^ W 0,E% M`,G,F + +F  +? E& ? +D> D 7\ ``SW$W 0W,Vk +h`W v ݍ, ` >] - ]P-$W- 0W- +Mjfg }jp=qj=ej=Yj> jf9 jf9 jf,0>`>N rf jf9>>N rg + og. g. іg<& +(g<r(gPgWncdDdd`gWO p`g p`gE`g Wm z  3K0 f9gghhiW q vq D Q[D Q5 M M MM>ء ? P?<& +<r M M MM?ء? ?<& + +<r + q/D F/ Q+D^ + Y<& +<rkqkklWm s s < +(B j? wB  1llWa ts@<@@ +(B j? wB  lm[mmm/nWnnoTo}oo)pzp1WJ u 0u $u pE  CE% MCGDF +h +F h +?  iE&  i? +Dh> Dh 7\  iW.0i'W l9i M9iM@DءpD D<& +Ki <rKi }}F~~~EmHӂ,iބW R  |  @ > +| |D|E M M  ء  <& +<r|0E|`E | }EE <& +<r MMEء F PF<& + +<r + }. . <& +<r;f`i*W΁ fi#FF ji<& +~i <r~i rW| | M M ء <& + <r |F |F |# }G@G <& + <r  MMpGءG G<& + <r u=ӊ*YX*Δ^;aiW  iz iR Mi > +iK ځH΁0H i$`HH i<& +i +<ri + i! ¢i! i<& +j<rjHPIP@IhIII [Iw`J JL  Kx @PK +K} K +@L~ LM 0M5P`M +M"&M*3N 9@Ny pN rNN O5ځPO΁O l l l +)l +<r)l +rW} R V +(B j? wB  Pl WyEPl iWȰ Xa 9QaM I M I %' LM& 3IM 'I%LM?`l WuM `l Dcl7) ۜUɠ* W;    &pl#WOϢP tl<& +l <rl l Wl1lWb lI Zl > +&lB ll MlM0Pء`P P<& +l +<rl + 2 m0 ܢ m0 % m<& +"m<r"mq:ĩPmFW MTm MTm MTmMPءP  Q<& +em <rem  vpm$PQQ 1tm<& +m <rm 5Px dز@&HSmIW p Q m+ m"QϢR m<& +m <rm  Њm0 Ċm0܊@RpR =m<& +m <rm  n#{n n n n nJ gn > +(n< MInMRءR S<& +Zn +<rZn + $rn0 rn0 Irn<& +n<rn˸$M$nWI +nN tn > +ԍoG 0S0x`SzSSN r@o + Qo' Qo' UQo<& +ao<raoW pEoWx xo  vo  Io  +(oB jo? woB  oW#{oo+WЊ Ċo*܊T@T =o<& +o <ro W   8I  > +xB M M MMpTءT T<& + +<r + 0 0 a<& +<rt#Wf U*0U m<& + <r oW o o oI go > +pB M)pM`UءU U<& +:p +<r:p + $Kp0 Kp0 IKp<& +bp<rbp5p!W  p lp Mp Mp ءp p<& +p <rp RW 4 \U VPVN r p?W)ӔV pEӔV pEӔV pEWӔ pE0W ҕ  $u pE ҕ  $u pE ҕ  $u pEzp#W׬W7@W yp<& +p <rp p#W NpNp NppWWN rq Wu 0u $u pEW  +N rWO Oo ÍJ  > +PC NN NWXN r + P  A<& +<r P1$P0X`X M<& +<r WT M M M M ء <& + <r {Wv XBwX NwbfwXZw Y`PYYN r m +N rW%   +N r q&WccY@Y $q<& +:q <r:q |WaZBw@Z NwbfwpZZwZ`Z[N r m +N r Wҕ $u pEPq WӳzW b Bwb Nwbfw0[Zw`[`[[N r m +N r`qWx[v \IP\ +(dqB jdq? woqB  @WQ M M MM\ء\ \<& + <r  M M MM]ء@] p]<& + <r <?qW eq qq  /q  +(qB jq? wqB  lN!W f   + D7b   +N rc/qW (  q ԡqh&] lq MqM]ء^ 0^<& +q +<rq +`^^N rr  $rlԍ^^0x _zP__N r`r +_`N r|rYr{Wr 0` rb Bwrb Nwrbfw``Zw````N rr mr +rN rrs WM Ms Ms Ms Ms Ms Ms ءs s<& +$s <r$s  l0sW m5sx avPaIa +(9sB j9s? wDsB  yPsVWaaaQ b@$ 3lsD tsQ6 hts tsS ZtsvsSz' FysSz' Fys +|s S|3sS~%WsW) @bBwpbNwbfwbZwc`0c`cN rs ms + +s +N rs + Mt Mt Mt MtMcءc c<& +t<rtW u  N dPdN r |WydBwd NwbfwdZwe`@epeN r m +N rEPtW H թece :XtQ fQ PfBwfNwffwfZwg`@gpgN rt mt +tN rtMgMgءh Ph<& +t<rth.wt?s`llgtts Cͼs-sZ( U  !>""5###%K&2''(a)~::sΤs4[sswNusu yseXssw*%#&s)&*r*+,,-H./?@RRs4Y[YsW\~\saashUhi j%j[jjk'mmTnnooppqq|}}}ȄBϋ۸%GŹgԽ)(zsss?*s+95_555BCIJZV[GmmJJ$";u1 z +,s4]]Uߦ*-gδŶL?,Rݱs8r}ݱ>esZ$XMF_FFGJHHO0PTTTUabtttuwwxKx{{{6|-΅'lv J>~9%ss / si  ? + +L//LEFvF5GJK%UUWW_s`h(hstCts|1}.~~ nT`NڃFĄ ąWr5[ls9]UO~w > }  e + + N  ' L( * :* b* * + J, , g- 2 2 sU V sx x wy Wz  L Җ  " sR y s  GW &_ȩ-r 901A  jP\5k^l ? ; Q HR d  rW G Fu|P\W P\/`\WW /ڶk\b\W \/W /N@Qp +5: +6) + + + +5 + +5; +hM +5 +[M p p B:6)6)W, +, 8D7 , V0, {, +uM ,  D 7) /\Wh /\/EW / TA hXA +O: +6?( + + + +5 + +5; +M +5 +M } } \:p6?( +q6?( 9W* +o9[ ;W 2m +Wy mK\pW K) \(i:\ +8:/ M\ M\ M\ M\ M\ M\ M\ ء\ \<& +\ <r\ {/W/ /luX +v: +6?( +$ + + +5 + + +5; +M +5 +M   :06?(`6?(992];5 =]P 5>)< <-  I f;5 !9 ] W 4@ + ];,!p9 b9 + ]6r  ]? +'A] ;3!DA] :f naV];4&;4 +n]Ah +n]A +*x] A +x] A\ +>x] A +1x] 5; + Nx] 5 x]  J]#Ah +"N];4P N] ] +*]A  +]A\ +>]A +1]5; + N]5 ] +.N];5 ]]D]: K`W K  , = ,/:NW@ T,{1|2Q2JFFstO$$iҐ"] R5S^b^^R-R%+sdIes?sk'&'2''cxEEcRbbc kd)?*,-k44cB55c]H^f5gR^:AA__al^QӬ6 ]U]j6k<5b5:ڲ5<55:ڲ5r<55:ڲ555:55%%5\''55$J5 + 5A j 5:w55:Gm5s""5&&5))50V5x5:5hh5h i5:kk5-lVl5:rBr5vrr5:A~g~5~~5:m5,U5:[5ύ5e5+Q5^5y6:65n665:665AA5y55:5$J5Z5:(`_5yC5հ5 +35:k5=5s5:յ545j5:̷5%K55:#5<55:9ڲ55w5:K<5q5:ڲ555:5&O5:`nn5Musu5uu5:uu5xx5xx5:y9y5|||5||5:5y5y^5yɡ5yӬ5yf65yGG5]U]5y`a5hk6k5y^  5  5P y 5:6gV WW  Wݮ # V W/ u V W گ fffg,gg7Hjjjj kj7 +Wn:g +W 0  >wW8  De>OW  ٰ=>W f  +Qi> i9 W + + > + +\+ C(Wc +@ > +@ +@ + +*u  p" C( @ l:m Wɱ   >VSWH g VI>W ز  +M > +M" E"6aW >  +> @ +#Wb oopLpW˳   +[> +[> +Y@ 2 +$ H]@r + W g  n> Wq \rrW޴ &  >rrwW0 x  +e> Db>W  +a> +f> > +$ H]@.W1 y  (>W  &e>SW o I>KwsWO  +c> +@ > +@ +@ + +*u  p" C( @ www1xW  +E[> +8[> +s@  $ I]@dW S  = +S>yyWu D + > +}> @) \zzdW   S> W" j  >tW ͹  +LPN> +fPS YP"0 + sP@ $LQp   + + L sI z 0 O     +   +   @ . p  +O#  M    ) 9y +(:y j 0N0L L : #WE  +7> E +8> +sj 0$p I]@W  3e>WW o + +!Wb> +!W  !WC( +8(W[ +s:W@ $ eWIeW]@՛WWI A W >SW ٻ  I>wW *  De>WK  @e>tW  Db> W& n dW ߽  I +S>WSW w WI>XSWP z XI>kW 0>=, W I  +U +> +( + +) +@) +@o +@ + +*u  p" C( +}( @) sWj  +^> +C J`$ M]) WԿ  tW Db>tWA  Eb> W  W d P>_Q +I0 `w `L x  } ` ~  + sP$LQ :# + % ++ +%L L  sI  M @  &) 9y +(:y j 0pN0z O    +   +z ` .  +O#L tW (  Eb>SWJ  I>wW  Ne>WdW [  b +S> W OW 1  =>Wi  ~>SW   I>b W" j  +> >pX W  W :  W[  W  X W j  W g W  XW5 r W oX W wYWpY;0nW Yt +$;Zu +1>WX +:`F:` +WL   Ѓ 1* p13W   +1* 13{  kPK‚[ t ZP P  +YI> I%b  W P  1* @13@WT Y  Ј 1* p13W   P1* 13W \  { @7 p1@ ܂8  @ +YI> I%b “ W~ |  `1* 13BW 1 BW, y 1 BW 1 BW ^ ! 1 PBW. -\1 BW f +91 BW +E1 @W0 PW & `Ws {@ kpK‚[ Аt ZP0 p  +YI> I%b  @W" x p u ‚В7 t 0ZP`   +YIޖ> Iޖ%b W W( ~ W  fWk l< pm +!Po +!v +! +! +!M +!X +!XSWSWSWSWppp*q$tt$;xwx$$}`}$̡$%a$ww$$өܩ$l YW P1* 13W 01* 13W 1* `13YW 1* @13ZW 1* 13W `1* 13[?W9?W[?W-\?W!?W?W \&YI|Hy- ^   5 +f + + +PZ9ŲFrCF nn +#.wU[U#~UA U3{UFDUWTyUU#Ux^^U2!vlvUp|v]UzU]Us;; ,<w<d<:>>H???$>U!Ua U!U U!BBUFKUK#U5LDUW~LyUi[U[#U[?\UN\\U^U2D-y_lv]UD^x~DUWyUbL!UaLLUNE_ _ UvW BU+vFv"} v6=y++%+*E*+L+++LU+B+`  +L) +L00+071+Le4 +LzXz++8x+=rH+K+׵+L@+L)+LG +L+ +=+2d+20m+d+2))+LA+B+^CC+CD+0HoH+HH+,IBI+LM+LV0W+XX+],^+~__+`W`+BI+1p+Щ+,!BI+MBI+^+ K+G++ +WW+^^+ +Lkk+oZo+ٛ+K++I++ƣ+%+ý+ ++L+ +c+L4+3r+  +n00+BYB+YKK+ LIL+OOO+mAm+qq++T+ݘ+ ++q+=+++f33+245+ +IPI+J+%a+G+LK+L +Lo+LQ +L/ 0 +}0 0 +Lq q + +L +L·  +LŔ  +  +f+:,,+&:>;+&?K@+A B+&DdE+&H I+&IJ+2JJ+&VW+&b]]+&}W +R ++5kk+n4o+op+&Gpp+G+Vŏ+&XȐ+\̑++ ++ӬC+|+.+`+&+&+`""+=f>+]AA+BB+&K6L+lSS+&egf+&kDD+&rEE+&KOO+& QzQ+&SFT+&IVV+&X+%+&+R+&Aaa+&fg+&i?j+}jj+&lm+&nn+&p'q+&f+&+&e++&u+&+&қA+&ŭ4+&-++&ֹE+&+^ͼ+&#++&+&+&<+&z+&n+&d+&w+&a+&J+& {+&k11+j22+&55+&?6@+@3A+&\++   +& +Y a .3w6 .3R .3 .31 .3q++.W1+.!023g>*!!>+I,>1%2>45yʉ,}   +] +P0..,JJ>)1Ʈ12`1}1?' +(1L7ww1(1Z-11ٰ"23"23"23$23V23C22 K23j!!23'(2>,l,2<E<23 @I@23UV23e(f2zkk232323x2Ȼ232R2323 :22y23'23%c2323|232gg23qXq235}s}23 23R24423h@@2$2324r23#<a<23^_2]232323r"23723X23"23K23N23TQT23vWv23\ww23#{a{23~~2̀2W2ɠ2«223(^26\l\2&j\j2F232 23& & 23y @y 2LN?, ams?_?_????u? ?[ i?f ++b? s~?ts?w4?m?tt?, ?[ )3_?u?us?X?j ,b?; K? [?, s??:?, V`?*m??^]]?]8^?^,_???K ֿ?j ?j O?  ? ~?, P?; ]H]? ]]?; ^^?, omm?; a? s?*? A QAUAg]AaAgCCA:DCAwGGA +HGAgA;pA[ƌA4A[8i iAqiiA[-AXA2A[MAA^OAA[{RAERAUC_C ADDA W YY?5MVn +a Da839aRaȩaa)`aaw  aQan''aOOaVVa _D_aQaaaaa+anaa.eaVaeeaqqaa; L; a=[ t[ a U aB +111eIew_B +e^KTcJcbO Y 4 Z6F ;? k9:%VwdrnrrQNzz`n +Yeko0V0NN@}mmn*o  ssps  ڽ PQ!t"$$|%& ()1:345O?=@1BCCDwFlGVPQRS\]7_ ``a;c0d C:3K͋ӧ"W#Ɠe;! ##!N$%;L-[.4/0E!VI[.V KLT[x\h^%u:2։iN;4iVBfhuF1 S> /  P`A1W + +` `! D +HWF +rI fI%b + +Fh H + +rI  fI %b  +I=G +I  I %b +! +F!h H! + +I  I %b   `` ! ++ 9y +:%y w & + !  + + &  W0 kH`# < g %`3& kH`, <%xH`'H`0 `?! 9y +V;y  2`@&`k+ @`{ + 9y +:y w & + !  + + &  W0 kH`~ < kH` <%% +`aM`g A +   1Wp + +` `! ;D +HWF +rI fI%b + +Fh H + +rI  fI %b  +H=G +rI  fI %b +! +F!h H! + +rI  fI %b  >` ! +|+ :y +/;%y  & + !  + + &  W0 H`# } t %`3& H`, }%H`'H`0 K`?! :y +c;y  d `@XP`k+>`{ +| :y +/;y  & + !  + + &  W0 H`~ } H` }% +`aZ`g T%*&&2(` +()`H+,<- ../2374'5 56` +7`H/b/ "!" "#I; +Jr)##|^):*33I899\:rAA|GHQTRIVWWHXr2^^|dzeHI,|2r'{ w!{Ñ"5]EP]5)]L|b((./I2I3::{> ?:AABCrBHHIL4MNNOPWXXZXYa0ZZ\]9_h`XaaghZppLqZuu*vjzzz{}}~~]Eq]5ր]7Ђ|AьWIW0hΖ5rfI"oעgZګa4x9ڰjDԲ$Zֿj#IiUm1I  } ;,3|Ur`xLQ`_  +*r`x`_}xyjy z]EzJ{]5{|]~O|]l  !]E!"]5\*7+x7T889 +::B7$%%S&&h'B` g { +>>{[#\{i{FG{՚Z{){c{ r rj8VR&&na**n;;@@T6Ub2cn0n_a*j W  9 < ?! IM +3 M +rI fI%b  VN +@  N +I I%b  +c [ +~  + | rI  fI %b +@ p] 3    +  + +5; +5 H @ + +3  +35; +x35 H  ` a d6 d pgM g +I I%b &@ +j  po[T 0T} `]  l `m <W{ 9 } ?! M +3 M +rI fI%b  N +3  N +rI fI%b  + [ +~  + | rI  fI %b +Z p] M    +  + +5; +5 H @ + +3  +35; +35 H @ ` a !d6 ! d gHPg +I I%b Z + j M  +o[@T pT ]  l @m <W( x } | +Z p M    +  + +5; +5 H @ + +3  +35; +35 H @ +  +~  + | rI  fI %b +   +H +rI fI%b   +H  +rI fI%b  !6 !`  +  M +H +I I%b Z + + + ] + l  + m < +[ T PT ]  l m <W > x < | +@ p 3    +  + +5; +5 H @ + +3  +35; +x35 H  +c  +~  + | rI  fI %b +  I +H +rI fI%b  V +H  +I I%b  6 @ p +  +H +I I%b & + +} ] + l  + m <p[T 0T} `]  l `m <8W  0  }  }  +HS +rI fI%b + +Fh H + +rI fI%b  +  +~  + | rI  fI %b   + + + | rI+ fI%b +  +H? +rI  fI %b + +Fh H + +rI fI%b  "   + + + | rI+ fI%b +   I` +I  I %b +I+ I%b Z + + [ 5нT  ]  0l m P< + + +x | I+ I%b   +  M + +[ 5T   ]  Pl m p<dWU h6 <  <  +HS +rI fI%b + +Fh H + +rI fI%b  +c  +~  + | rI  fI %b  I + + + | rI+ fI%b +  +I? +I  I %b + +Fh H + +I I%b  " V  + + +" | I+ I%b +    "I +I  I %b +I+ I%b & + @[ 5T } ]  l @m < + + + | I+ I%b p  +  +`[ 5T } ]  l `m <$bgW$  < <V<I< +HZ +rI fI%b + +Fh H + +rI fI%b  +c  +~  + | rI  fI %b  I  + + + | rI+ fI%b +  +IB +I  I %b +! +F!h H! + +I I%b  % V  + + +" | I+ I%b +  "I +I I%b +I+ I%b & + 0[ 5pT } ]  l 0m < +  +  + | I + I %b p  +  +P[ 5T } ]  l Pm < g  'gW k  } }gBpZB +HZ +rI fI%b + +Fh H + +rI fI%b  +  +~  + | rI  fI %b    + + + | rI+ fI%b +  +HB +rI  fI %b +! +F!h H! + +rI fI%b  %   + + + | rI+ fI%b +  I +I I%b +I+ I%b Z + +  [ 5`T  ]  l m < +  +  +x | I + I %b   +  M + +@[ 5T  ]  l @m < t  Z# $C 0[  g $ 0PW/ d=F/6j8UV΀j8L<66/jTT/lel  lblSW? Ϭ  9S  9 + + kH T LI05I` +4 &8/ +\T r\T +3vT 9yTy +9|Ty C~T +T ( xHTj + +U + +U @U + +U U +MUv @  +`. HU W ~ 9  9 + +  H YIPI +4 Zg8/ + r +t 9y +9y P + ( H H +  +   +   +w @ . H W   9  9,  +@ H fIpI9 4  0 8/ + r + :y +:y ] F  ( H H +`  +S   +m   +w ` m  . H {{{Y|A|Y|/-~~{zSj?$?OP ;m<\M((\"@@1 j+Zc:31:o *%:W !6 +yQq:lQ@:Д +F F tF F \ +<  I +A ]" ]:]K . ]LJ_+ @5]M +@ +@ + +*u  p" C( +@- +-  -* 6< +6 6 5 +  ]$) 0  ]&+ +MG M M M ء <& +<r +~>;) +>^ +>5; +x>5 H&  (`= ^" * +/ P@@ +rI t fI %b +rIt+ fI%b t +rIv fI%b v AA +It I%b +It+ I%b t v < V +F6 \ +<  II 8  + +~ + | rI fI%b + +Fh H + +  +F h H +S80 +`  !  P | rI+ fI%b  +" + +" | I+ I%b +!  +/ _ = @@ +rIt fI%b +rIt+ fI%b t +rIv fI%b v AA +It I%b +It+ I%b t v 0 9py :y w +V Й% % c 0 %W +"Y \ +<  Ip Z %  +2  +~  + | rI  fI %b + +Fh H + +  +F h H +S8 +   P! +? +  |  +L" + +" | I+ I%b +!  _8^G :  .P! \  +s5b f5 +Y5c [ 5T %T +} ] + l  + +m < + * %x {{ +rIt fI%b +rIt+ fI%b t +rIv fI%b v | +Q| +It I%b +It+ I%b t v  0} +It I%b +It+ I%b &t v + `[ 5T } Н]  l `m < +  {{ +rIt fI%b +rIt+ fI%b t +rI v fI %b v |П| +It I%b +It+ I%b t v  } +It I%b +It+ I%b & t v + 0[ 5pT } ]  Рl 0m < ;^" ;P^" +^# C + 7 +   3 T +   / " \ +<  I s  f  +Y c +}  ] + m +<  ^# +2 r +~  + | rI  fI %b r s t +}  u + m <uxxy:We i6 +gq:g@"; +F F F .F \ +<  I +A ]" ]:]K . ]LJ_+ @5]M +@ +@ + +*u  p" C( +@- +-  -* 6< +6 6 5 +   ]$) !P  ]&+ +MG M M M ء <& +<r +~:;) +:^ +:5; +:5 H" @ 5= У^  * + P`@ +rI t fI %b +rIt+ fI%b t +rIv fI%b v .AA +rIt fI%b +rIt+ fI%b t v  ФV +.F6 \ +<  I 8 ; +H +~ + | rI fI%b + +Fh H + +  +F h H +S8P +  ! U@p | rI+ fI%b  +b" + + | rI+ fI%b +!  + _ ;= o@@ +rIt fI%b +rIt+ fI%b t +rIv fI%b v .A A +rIt fI%b +rIt+ fI%b t v |P :y /;y  + %   P W +:Y \ +<  I Z   +  +~  + | rI  fI %b + +Fh H + +  +F h H +S8 + @ p! + +  |  +" + + | rI+ fI%b +!  k8^l _@ Sp!  \ M +5b 5 +5c [ 5T %T + ] + l  + +m < +& * x {{ +rIt fI%b +rIt+ fI%b t +rIv fI%b v | +Q| +rIt fI%b +rIt+ fI%b t v & P} +It I%b +It+ I%b Zt v + + [ 5T  ]   l m @< +&  {{ +rIt fI%b +rIt+ fI%b t +rI v fI %b v || +rIt fI%b +rIt+ fI%b t v &  } +It I%b +It+ I%b Z t v + + P[ 5T  ]  l Pm < <;^" I;p^" +^# y + m +   g ` +   #/ : \ +<  I     + c +  ] + m +<  /^# + r +~  + | rI  fI %b r s t +  u + m <wNxTmr9W { " kr$wW   !^ i^#>$^$$^S1^r^Si#u#!^zi^j8^DV^n +Gz +gse*V+Y  +non +U#Z**I  IBI$QI67ITXXIY +ZIMZzZI.\[\I%tRtIwttIuuII*WII I:`WL +y +I`N rpWm +N rW +N r[+ +yRIPQI:cgcIIhaaI(o +q;HiiH=0qll ]I]leOea||lPllllyl>~lG1U:@s3slq/olj@DW +I + N @ ӗr#fl)Zl5 6oxO3sl,*)=r** +-,=P--pCCKKHYccEede(flrffZooIqpTzy=zz{$|CHԐHҝAUHH3g{~T:*m =Q : u H" " %# Y# y1 1 T3 3 : : %U T =kU U OV V [ lZ [ [ l] ] ^ I^ u t =Uu u | &} } }  S  E o  =  #  T  ɨ li jBY IA  p { 3^^ |G} ӈ8 + . 3 Z W +  C( +8^ +sC $ I]@I]BaB+Q uBeQgBWQ|B + +IcIFBZ'Bcȼ- S$:%% &p (7  }GG3h8Ir}\ĨBRR*4ITI>dQ7&8A99QRIuMvv wI}}  ʆ2B%BBgUĻIBJ]B<cI . B# # Ib> > K BJ ^ ^ I ˙ dRn+DD}C=D.hpD+DDZ==Ds??D%fpDtDz(DDztD<DvDzHSSDz G D>'>|>DTpeeDTC""D7GWRNN@RFSn ShcoZN +\ ZcZ* Z*NZW OX Z > Z.I BJ 7 ˙ .#z#XK BJ #x ˙ #mmTn%tnn= +*j[j +Vz @  t  W +# +#\+ #C(W| + +\+ C(' qZ~" +gk͚ )zm%6 7 6@&&K: lFCF'FTFhp s08?<<4<a<<N<<a + +<t< V<M++<.!/<33<77<E<{<[<F< <]<r22<2L3<]77<788]99<91:< W<ן<p<ا<nw<I<zŶ<VU<"r<|<H<-}<F<7z<<:<<B<e<<=< <P< p<<&v<Z<<#Q#<##$8%<l%%<()<7)(P>Q<QR<4UU<UVWgW<#XsX<XX<^ZZ<Z+[[$\<p]]<^J^m__<``<aUa<<<Zw<G<:<6<<<tD<:<<D<A<< <G  <{  + . <n  <1&& O<<3~<><<<k<<\Z<R<z<<,t<O<`<K< +<[<)d)<))<,`,<,,<c!d<oddfg<^gg<]mm<o#p<rppq=r<rr< +yRy<yy<L<<P<;<4v<m; ; <|< < <S 'T <}T T <|Y Y < Z hZ D\ \ <\ )] <s 5t <yt t <}~ ~ <? &}  Z < <<A<3<p<E<5 +<?<<+L,</#0<w44<g88<F=<`^<vyy<H<G}<<u8<T<ť<<Į0<x<K<Z<bο<b<F--<H-<}<_<*+ + <c<W + +< W< +<   d< J <L-BxjjBpqByۘB0jBx!qB^%B(ۘB BIB"JJBBBU&!^!BU$%BU-(e(BUaW + +B  +߫'B ӫ +n + + M M M MM ءP <& + <r  +%B +%5 c% +ѤB* >BV +(B j? wB +BrOW +> +B  +$B $ NN NN r  +B +5 p +ޤB* KBV +(ĘB jĘ? w̘B +̘Br̘uW\ + +B  +;B  + +D7b   +N r ' MMء@ p<& + <r  +(%B +3(%5 }(% +(B* X(BV +(.B j.? w6B +6Br6?W +  +B ?BxvI0 +(B j? wB  +B +K5  +B* eBV +(B j? wB +Br BI]BIBI$Z\iJJ\kyy\I\ʀ\Ё\;22\32\ ڝ;\\\C\F\\g\*\v\vv\>w\q\d\8#9\. SS\1bb\XbN  bNG$u$bN''bNtft[>Jt`-t` zt`6t XtLtIt[;M;tp;;t;4<t&((t88t/3::t=$>ttnt[$ $ t3j) r) ) t7 +t|at|.t| ' ' t|itDtktat.thy ' tt\tD tq| | t+Ut$ytMt>t{:(tytMtt:(t((tjttOtDFpt =t%VtDFpt1$ a$ t( ( tDz z t5 +&&yn5u5y55z?>4?zK???zgggghh +s +«E++ W Wu +Ր/NP/ B/ +m C(b/ /"w0\/ @0 wp0< + W4 Ր0N0 B1 +m C( W4 01m`1 C(g1 Z1 +E +s6 G, G +>2 H]@ W( J<;W J +> H]@C@2 Rp2M252"j +3 _03 Ww    W  p     W 3  + W +f? >`3$ H]@OWٰߧGcl«a +% +{b@ /r_W$   +<  I  +<  I b@ @"w +@\ +ί@t @t +t +5+> )+< <-  I ?Gt  +> S +t It I  P; a~ Wm    0 +" VJ,` 6 * +" J, N N N N r W i P " VJ,  c  pP o b| `& (D  T2+ M! M! M! M ء  <& +<r qvq P QTD Q5 M M MMء <& +<r M M MMء@ p<& + +<r + q-D F-QD^ Y<& + <r sP LQ@ :# + +L L sI @M p  $) 9y +(:y j 0N0z O   P  +   +|    . + + O#L eA0 +"p +LȐ +  +S C( +S ί0 t p t  t5 >) < <-  I ?G t +>eA@ "*p LȐ   + S C( S ί t 0 t ` t5 >) < <-  I ?Gt  +> T&"4 M M M M ء  <& + +<r +~ $~P\ <;xy ]"]:@@]M +@ +@ + +*u  p"  C( +@  +@  + +* u  p" C( +@& +&  &* 6< +6 6 5 + ]K . ]LJ_+ >]$) !>  ]&+p{^T ^ ` !@` `O `O ! . `OP`U6 } |$) :y +/;y  @`U6 `V   +D  + +$5; +$5 H @ + +b  +@5; +@5 H  @  `W + ! +   + !  . P <;^ I;^^ +  rXC\ +Q +M\- M M M ء <& + <r  T$! M  M  M  M  ء  + <r KC   +@ Kˊ 9 0>$@< ~< +`a + + a$ U<- Iʞ<:؊@ H><< q< +`a + +a$ U <-  I< +c<  PL6@Ip )w  L x m @} m ~ `wBN  R@ ^ q  +d<] + B !P Np! ‚! "t `"ZP" # p# +YI> I%b   +@ +@o +@ + +*u  p" C(MP$SF$" q$"bd$ I I%' %XN@%Mp%M%ء% &<& +<r0&T  'A P' ' +" VJ,c'B p( o( +b)5< <-  I ?Gt  +> +{j*: +F* \ +<  I ?* +R?*$ \ +<  I6/p O Ot ÍS +PK NN N@6p6N r + P  A <& +<r P.$P66 M<& + <r Y./!f/!=7/# O?/$ O?/% +J/&  W7/&)M7 E7"6b8 @8"/ +p8 _8 +x4 +4  4 %, 8%  /' C/( + /1f6 &=^9/M }4 ?w}J r09/m r`9/q /t r/u /{ r/| / r/ +M /7 E "6 r/ +e / 5e r/ +/  +/   +e/ 5e r/ r/ +q / + &D 7 +d/ M + E"6 / r9/ +uM/ D7) +uM/ D7) +/  +/  f /#p9/'e: 5e   Y*" * F0:WCJG F`:;WCJG q /2 + &D 7 e:/3 5e   Y*" * uM /4  D 7) u/R +$u5 pEp:/WRF:+ o^ ;JX AeP;   Y*" * 7;JX/d/d /Z+ +  + . + X +6 F, F + /9/[ +! w /`4 +N9? g A9+ e/a +pR/ S;e; 5e<  Y*"/b $u@</pp< E<)=/pӔp= pEӔ= pEӔ> pEf /'f/3 uM /4  D 7) $u/p pE -/p ҕ  $u pE ҕ  $u pE ҕ  $u pE +/p pE c/k +pP/ S0>e`> 5e>  Y*" S/f +p@/ S>e> 5e ?  Y*"WC/g1C/#6 u/9 +$u5 pE1C/:9D/;!C/;! /)-< <-  I +" +q ZP F-" q ."bdP. I I%' +N- M M ء <& +<r ZG, DW}  ^p.r( e 5eF.W1JG F.;W1JG +jFk+ +e J5e Gz T{ b|% L}DEax +/::R/d<R/Z W W V/ +/LL/M/N/YVR/WWP! / OW /߯(//Ĭ/n/ĭi[ /Ϯ//g/i/^ +h +dYc +CW& ^[XGqXXG'5`K9=GLZPKTXYg:YaWI& FMY)W_ S(b @Pj 26:)WS pPj 26:K6}GW% iW% <& 6 O 7PO[ _OSOb Oj 26:H P-  U.v +&J& &J&& +&.Wϛ&=Wyy&G`&$&-Kh&KheT&eT&&&*&4&KN`&_&L&A&B&W'V&|s&@[W  &sb&bp&"/ + _ 0& sK& @y. +@t' +@t +ί@t @t +t +5+> )+< <-  I ?Gt  +>Õ yW  & F`& F" + +"! C(q"bd I I%' & & Y*" * N & NPNN r%W L&LkW+ o & K& +B@) +$@s @  +@t +ί@t @t +t +5+> )+< <-  I ?Gt  +>  ) W} \ +& W  +&x&&.W & &$1^@& }4 ?w}J b &>Cp&$db"_0"/ +` _ + & JG&KyNy +(Z +(N +( +(R(KJ(yKK( LK(sLL(MM(7{N(6O(zW MJ +(yWU + +( + +) +@) +@o +@ + +*u  p" C( +}( @) WU J( +h (- + 5} +K   %@(A +BB ? + (% Y*" * tp( s<(0B j`? wB  c( (! b(b( "/ +` _ +s6(0 + 9A +  w< + +6( +9A +  w< + Wn +8?( + (e((Wt +( ^F(((B)$s@ pt ίt зt t50>)`< <-  I ?Gt  +> ) ( Е EN 3 +( +) +ݔ +ۧ)o + +XA) + +\+ C( +l($ MMء  P<& + <r  +( + +) +@) +@o +@ + +*u  p" C( c( M( MMM@Mpء к<& +<r +M( M M MMء0 `<& + <r  -(&u=(W* +(dWI +dW= +dWb +y?{(;?(@(FKK(=LL(RMM(.O +O(mqP(yQQ(?cRR +(LR2(PSFS(aV=H +(W 8( 0( (!( e@ 5ep  Y*" Q&(ylT(TR +(TU($UM(bU (UU(ß3(@((&(UK(|WW(WW(0XiX(N\\(|YYY(_[[E\([A\(^^_@(C_Y(<`a(~a +(W C( + +(  + +) +@) +@o +@ + +*u  p" C(c( . (! b (b(@"/ +p _ Χв(  ) +J) +B?)B +$?s ?  +?t +ί?t ?t +t +5+> )+< <-  I ?Gt  +>  )B ) aM(W4 n (( Fд(F" + +"! C(q0"bd` I I%' e( 5e  Y*" * +N(N NN r +N(N N PN rW ((Bл)B$sP t ίмt t Pt5>)н< <-  I ?Gt  +> )B (  F@(Fp" + +"! C(q"bdо I I%' ( +M( M M M M ء <& +K( I%' (0BL +<  IN`( NN0N r + ( Y*" * W 6 (p(  F(F" + +"! C(q"bd0 I I%' e`(5e  Y*" * +N(N NN r +N(N N N r+W= l (P( F(F" + +"! C(q"bd I I%' (@( Fp(F" + +"! C(q"bd I I%' (N0(  N`NN re (5e  Y*" * +N( N NPN r +N( N N  +N r +N( N NN r( RWs ( (   F@(Fp" + +"! C(q"bd I I%' -(  :$0e` 5e  Y*" +N(N NN r +N(N N PN rW  ((  F(F" + +"! C(q"bd@ I I%' ep(5e  Y*" * +N(N NN r +N(N N0N r`HW  (`( F(F" +| +"! |C(q"bd  I I%' (P( 5>)< <-  Io^( AeP   Y*" * (.  @)< <-  I ?Gt  +> + (y Y*" * ((NW (c9() +8( >~P (8P(~ +G() ++G5} +JG QG%e( 5e  Y*" * ~ ^( YX ~ P~ ( (*nj b@:sp y.t' t ί0t `t t5>)< <-  I ?G t +> +{j*: +F* \ +<  I A* +RA*$ \ +<  I +( +O ( p  p E p9 ( +jt( d > ( (8p(~ +K() ++K5} +JK QK%e( 5e  Y*" * ~ ^(YX@~ p~ ( o>( $~F g0(z +`e 5e  Y*" +( +O( p pE ( D()~(0q0@`pK !Aړ~d RF(< o^@JX   Y *"ږږ#9pڙ$  _ D( +O( p pE +O ( p  p E  +O +( p + p +E +iii}|pW) i(] u(u ?8BP({U^P} }4 ?w}JeQ({ 5e0Q   Y *"E +( ( ? j($ +j5} +0Lj j%8B`Q(U^Q} }4 ?w}JeQ( 5eQ  Y*" ( ?  R( PR(ͼ"(3>z3C3MLs3Ӽ%i3xYz3|'(3rW s3i r`3k 3k r3m 3m r@3o p3o y3pEWDW 3R3 WEa_cRJ&JeJx0JWEdW) +J{ {JWJ JLN +OJ QQJ^,RR +JR2J;vVJ JFWFW1JG \WRF 6JYB +6 6 o^JXAe   Y*" * 7JXYWwF 6 Jc +6  6  o^ J_Ae   Y*" * 7PJ_Wd + JnJp NK AKcEKRF`J o^JX Y*" * 6 +JYB +6 + 6 + K K K|P +5A +155; + N55 5 %Ah = mCxDvEI0E +(GB jG? wRB  h  Nh  h  +*pA  +pA\ +>pA +1p5; + Np5 p  +`E +tAh +tA +*}A +}A\ +>}A +1}5; + N}5 } 'Ah aB nBE  GF $  N  +*A  +A\ +>A +15; + N5  C Mc]QMdW3 8Mj ]^M^Q^M0 + W-" t" M 0 + M 0 + ?z C +M +C +5} +LC + C +%VEMVEM Lk + ML + M3L + M #L +M 'I +%b_RMiWX 9QaM I M I %' LM& 3IM 'I%LM?aa M 's,sks|/ u]u|1rugu|Uxxx}|yx|JxOxx}/ hW +? +}S b^3-}T d3}` +q3" bd3 IA IA%' 5u}V ,u?hW + +}S b^-}T d}` +q" bd I I%' 5 v}V ,Pv?hWi + +}S b^-}T d}` +q" bd I I%' 5v}V ,v?hW +K +}S b^-}T d}` +q" bd I I%' 5v}V ,w?hW + +}S b^-}T d}` +q" bd I I%' 5@w}V ,pw?hWP + +}S b^-}T d}` +q" bd I I%' 5w}V ,w?hW + + +}S b^-}T d}` +q" bd I I%' 5x}V ,0x?&c}/b}/X}/LDD}/^^}/2B\WgRF F 6JYB +6 6 o^PFJXAe   Y*" * 7FJXYW!hwFF 6 Jc +6  6  o^FJ_Ae   Y*" * 7GJ__W hF@G& 6JA +6 6 o^pGJAe   Y*" * 7GJ\WhFG* 6 J +6  6  o^HJAe   Y*" * 70HJ@ _W-hF`H? 6N JA +6N  6N  o^HJAef  z   Yz *"  * 7HJ \W9hFHC 6  J +6   6   o^ IJAe     Y *"  * 7PIJ W" +X +G W" OKZjjP8 {qp`U /U-V75VvVVU|\)]a&bknbbCdddeeeu.fey:giiop*pdpqqq$.g{>_ZR +(QMWmeF5e   Y*" * FkWG c`Ya"eHO 5e   Y*" * W7HP H @g  U %a"U]ii=&mi1K5ŞR +7g2;.*5L5[lN55 1K}1Kx.FX@ls,: gW + +PqZ rZ e +C +ZC` W1U Ğ n +n +4z +)M_ +.$` +%ZAAA `R +H%afaza oyzztIPZP V V ){< <-  I ?G t +> +{j+: +F+ \ +<  I +, +- 0{'`{*nj{ b{:s{  |y.P|t' |t ί|t |t }t5@}>)p}< <-  I ?Gt  +> +{j": +F" \ +<  IW + +CW8D E +  FXa F +. }E! }3 + +!  +!C +U! $  c &  I]@ $C c +,   = W2F W8H NW + +|6@ _p k$_Ѐ  F, F +W(,W5%W#,|XW= + +Р|~С' 6  _ k@~$ _p~ eW + +|~.~6 _@ kp$_ pp̺ddd_ %WV + + N; / +y;5} +K; o;% ["% +5} +K |%=n8o^0 Ae   Y*" * }`>yЁ*nj b0:s` y.t' t ί t Pt t5>)< <-  I ?G)t ) +> +{j*: +F* \ +<  I E* +RE*$ \ +<  IH8PWUkL(7L( N/LE +y/5} +K/ o/% ["N% +"5} +K" |"% Jn6f o^?Ae   Y*" * 7?W + W +d +Wl + +W + + +W +] + We + +W + +ȯb'W +J( +݂#) L    +E +6 F, F +KAW +J9 +ă": Y    +E +6 F, F +W" +JӜ@Ӱ w + K{ + | + +5$ +} H0 Ӳ :FӵW' +@W<( +YhAW + W +\ WG +p 7W + + p _Є W +? +)WI + +JwL  +@q0 pU| ~4 Uӈ   & +     ӝ Cӡ w + K{ + | +ӵ-  H0 W + +^Ѕ`  +q0 @U| ~4 Upӈ   & +     ӝ Cӡ w + K{ + | +ӵ-  H0  W +1 +ӔQjBj9D}WK + +JfO ІBwNw0fw`Zw`N r m +N rf R PBwNwfwZw`@pN r m +N r- W{ +pW +Xw2pxF0W1JG RMW + + +ՃmՄeЉF5e   Y*" * bՄW +՚Wn0՛epi5e   Y*" * Fj W1JG FЊj?W1JG o ՛W[ +}  N&i/ +y&5} +K& o&%=ke0k 5e  Y*"  * }`l yЋ*nj b0:s` y.t' t ί t Pt t5>)< <-  I ?G-t - +> +{j*: +F* \ +<  I X* +R?*$ \ +<  I |o   W +dp1W + +x u}( }( ~`We + +ձ +ն(\W +vcn@ Fp) 6JA +6 6 o^JAe   Y*" * 7ЎJW- +qivW + +-f`2 BwNwfw ZwP`N r m +N rOWR J8 9W <dW( +.W il N&m7 +y&5} +K& o&% noZp%p@^F #ep 5e  Y*"}Бpy@*njp b:sВ y.0t' `t ίt t t5 >)P< <-  I ?G)t ) +> +{j*: +F* \ +<  I 9* +R9*$ \ +<  Ip 2 r p E |@po}We +CfH BwNwfw@Zwp`ЕN r m +N rfK 0Bw`NwfwZw` PN r m +N rר`:׺אSMWi >Ϙ? m@T mp o^Ae   Y*" * 7С"QWYW QBC n0X wF` 6 Jc +6  6  o^J_Ae   Y*" * 7J_zW }Wn~ei5e   Y*" * Fj W1JG F j?W1JG  ~HW ק }Pר N&i/ +y&5} +K& o&%kek 5e   Y*" * }l y *njP b:s y.t' @t ίpt t Кt5>)0< <-  I ?G-t - +> +{j*: +F* \ +<  I 9* +R9*$ \ +<  Ik HWe `׹,}`׺ N&i/ +y&5} +K& o&%kek 5e   Y*" * }l y0*nj` b:s y. t' Pt ίt t t5>)@< <-  I ?G-t - +> +{j*: +F* \ +<  I 9* +R9*$ \ +<  Ik W  ݥ ˜9  C Y*" * MW | +pn?} +? eH@ 5e  Y*" * WG ׈}np׉ d%eHO 5e   Y*" * W1HP %W +  7rYfPBwNwfw ZwP`N r m +N rW L 3 +8 [N% +5} +K |% Jn6f o^?Ae   Y*" * 7?-Wݥ˜9  C Y*" * W") + gWM a +ُSٔ W  +٘_ٝ W- b@١k٦  IP\=<] 1< d< +`a + + a$ U<- I \ ~)   +N r tW  ٲw@ٳ /u p/v*njФ b:s0 `y.t' t ίt  t Pt5>)< <-  I ?Gt  +> +{j*: +F* \ +<  I C* +RC*$ \ +<  I / O On ÍP +PK NN NN r + P  A <& +<r P($P@p M<& + <r / O Om ÍO +PJ NN NЧN r  P  A <& +<r P,$P0` M <& + <r  q/! +&D7 1C/7 uM /  D 7) -/ ҕ  $u pE ҕ  $u pE ҕ  $u pEW  D / W  Q / W   ^ /  +W i k  / W W XFW1JG W + Z + : ?;1K91K>W@  _ wt a'  # >W  h YX n + ~  ( t o   CW R w ^{' +YX~ +~ ( dWl  |0u`?qυF(W4JG 8  ~ +;() ++;5} +J; Q;%eP( 5e  Y*" ~ BwNw@fwpZw`N r m +N rW  "|0#u`?qυF(W4JG 8  ~ +;() ++;5} +J; Q;%eP( 5e  Y*" ~ BwNw@fwpZw`N r m +N r + u#,^F !WU  ( + u)/^F $W  . + u//^F !W5  P ˜R)$W  W ˜Y)!WS  x +y' ^F 'W  ۉ0ۊ8` ~ +5() ++55} +J5 Q5%e( 5e   Y *" ~  PBwNwfwZw`@pN r m +N r WE  ۏ W  ە}|W;  +u ?^} }4 ?w}Jo^ Ae0   Y *" + ? +6 , +6  6  `0^} }4 ?w}Jo^0 Ae@ Yp*" * + ? W4O}|W b +u ?z77~6 *7 +gۅ%^0} }4 ?w}J o^ۄ# +r" ?z o^ ۂ W7ە W7ۚM1KpNNAOlOV Wn% % 1K+g.K [.Lƒ = ‘ = ? r0Lƒ sK`L  IL%' g.L$"[.Lƒ M‘ PM?rl  ƒ  M%M nN aPNA +H R  yA eMWT +د +|0 `i >A H R  yA YWj + <6 @ W + + f IWj +( +2( + (U"lA +7 rB e A OWm +!j " +' +2' + 'U"lA 7 rB e A JW + ?   Y"A +H R  A+ Ce*MW +د +1@ 2 + ?   Y"A H R  A+ WQ f9  W + rJW + +y W8z OW + +XXG2 W (es 5e   Y*" * Ls PW + <6 @ MW\ +(- <#6 ,>W9 +} +@\ A P- <6 _AA W +Ȯ +X Y 0(eps 5e   Y*" * s jY  + <6 @ y`)]hW MeP s 5e   Y*" * Ls 6W % V )GZ W8 +Ȯ +    Me +s 5e   Y*" * Ls + % V KW2@ +  p +U"lA 7 rB e A + IW? +  Y"A H R  AP  y ] W{ +jjjWj>k lX {9*: m WR + + DW6 | +   C(  | +OWN‚@ pt ZP  ` +YI> I%b -d ]1 |l L + &W + + *c ! * 4    +   +   F Xa F  + `  3  +  +C =@ k c C) V* I]@  V3 I]@O V3  V8 I]@OV8 [0V9 . V>! 3I3]@O;V>[V?%A` c +N +*N [N ) +NN1 A 1. A  jIj]@d< W ' $WR + + 2 * 3  p" C(  3  ' W +W 8B + -& :: 7>$> *:  +#  /WT W += + kW$ @  +@t +ί@t @t +t +5+> )+< <-  I ?Gt  +>W +? + , t1 @t8 + x  5T  y +Ft8 ςJ,‚pt9 t ZP`   +YI> I%b t5  .  XP6 F, F +W: + + ͼ((7R7'R7a W +D7b 7[3x7K8 7EW + 7?`7@Ŭ\ \ +<  ID7A r 37 P37 r39 39 r3; 03; y3<EW\{h(889 4Wi:7 +8:/8M`0W +8J ~8LA08M$`8M? A4[ A4[ 'A4[ +42 4^ N8Z O Z @O t{4 (= F  F+!O {4 - O {P4 ` +8Z;` +AW& +8C 8D 8J A8b0AZ BY68b  +8bM +p8g 84 + W3 + +8-T 8. c87 Wv88<048= 78B  + /N8CNB Mg"8s Mg" Mq Mq Mq Mq Mv ءv v<& +{<r{ 8kW18l M8s M M M M M M ء <& + <r W +д +8W +д +8 kWF + +88+ } 8 e8 }e {8 +E{) + +{J  ' K 8( +> )^ + ) + ) ): 8# +)  + + +)w + + +) +@) +@o +@ + +*u  p" C( 8" +E) +T/  W*68g)c< <-  I ?Gt  +> +{j&: +F& \ +<  IcH d*njPd bd:sd dy.et' @et ίpet et et5f>)0f< <-  I ?Gt  +> +{j': +F' \ +<  I/W ++HM`fHFf" +"! C(qf"bdf I I%' HH AH/ +l5} +K b%@p gH Lp/ +  f6& " Y*" * b &bpg&g"/ +g _h 0h& sH& 4y. +4t' +4t +ί4t 4t  t +5 > ) < <-  I ?Gt  +>ÕyW;* +`h( h*njh bi:s0i `iy.it' it ίit  jt t +5> )< <-  I ?Gt  +> +{j': +F' \ +<  I ;* +R;*$ \ +<  I l, MMPjءj j<& + <r  l, M M ء <& +<r jH NHN Nk@kN r HHW + +HSV`lHVAlH' `7HZ0 +875} +AK7 7%H\ elH\ 5e   Y*" * H\ @lHX  mBwPm Nw= fw# Zw#`mmN r m +N rjmHZpnH# `7HZ0 +875} +AK7 7%H\ e@nH\ 5e   Y*" * H\ @pnH\ nBwn Nw= fw# Zw#`o0oN r m +N rWu + +HoHoH `7HZ0 +875} +AK7 7% H\ eoH\ 5e   Y*" * H\ @ pH `pBwpNwpfwqZw@q`pqqN r m +N rW + +HsHMsH `7HZ0 +875} +AK7 7%'H\ esH\ 5e   Y*" * H\ @tH PtBwtNwtfwuZw0u``uuN r m +N rUUUH``H"/b&bH*bbHccH dcHOdcHeeHeeH2ffeH6ogHgR +HW +H!HumpkHm4 m4 XHrkH kel 5e0l  Y*"!H!H 2 H p E {_H&\\HKP``HUXccH=ZeeH=g`HUh'h_HhiH#ldlHllhlH>mmHmmHm)]HnvVHW2 +p +Hl . Hmum`oHqm4 m4 +H{ eH@ 5e XH~ +eH 5e +eH 5e +2 H p E  . HqnpxpdpHqqHq:rHHr>rH rrH%rrH.4ssH3ssH<s*tHA@t.tHEttHJHuuHRuGvHZZvvHbvvHv2wH{W +p +H ;HumqHm4 m4 XHerH 5e   Y*" * ;H ;H +2H pEgW +R +H XHo^0rHAe   Y*" * 7`rHWZ +H XHrrH rer 5e s  Y*" hPsH ?_HtuH=uuH=TW + +HaP\Ho\*nj\ b\:s ] P]y.]t' ]t ί]t ^t @^t5p^>)^< <-  I ?G +t + +> +{j&: +F& \ +<  I 5* +R5*$ \ +<  IF`HU +`HU/HK +{ܔ-YFYQJ  + W + +( + A + A; *A .A 'A UB:IB: + ?' ? ? +*?A +?A\ +>?A +1?5; + N?5 ?  +()Ah @)A +*~A +~A\ +>~A +1~5; + N~5 ~ R%Ah  mxp)v)I) +(B j? wB   + N +  + +*A  +A\ +>A +15; + N5   +* + Ah + A +*A +A\ +>A +15; + N5  'Ah aB nB0*`*/3* *G +BB ?  N  +*A  +A\ +>A +15; + N5  Y=Z M(N)W + '%*(%0+{ +p&{ &{ +%{ K<{(m `+{+(" +A +A; A A %A UB("IB +#{ %+)%,{ +p${ ${ +%$ { K<$ {(y `,{ +,) +dAh +dA +*nA +nA\ +>nA +1n5; + Nn5 n %Ah y) mx,v-I0- +(B j? wB  )X N  +*A  +A\ +>A +15; + N5  `-{x-v-I- +(>B j>? wJB  O%{ YY#Y[$p~* >{Rg1 +QԪ`5Z1Wv + C uD ?6[ +$A= +A + w 1AEB[ $s @t ίpt t t5>)0< <-  I ?Gt  +>E 1A?E6 +B?[ +$?s ?  +?t +ί?t ?t +t +5+> )+< <-  I ?Gt  +> 'EH T M M M M ء <& + <r %W + Hu`I ?6[ +$A= +A + w ~K {~\ ;xy ]" ]:]K . ]LJ_+ >A ]M +@ R + +* u  p" C( @#]M +#  #* 6< +6 6 5 + ;]$) ;  ]&+~@{~^T <^ /` H `  `O @ `O p   . p!T `On"`U6a@" < #) 9y +:y w p"`U6 `V z  +2  + +5; +5 H @ + +L  +:5; +x:5 H  `W +/  +   +~ " ". # ;^ ;@#^p#^   rA#\ +Q +M\- M M M ء <& + <r  1ABM +BB[ +$Bs B  +Bt +ίBt Bt +t +5+> )+< <-  I ?Gt  +>M 8M: T, M M M M ء  <& +<r ,K" T, M" M" M" M" ء" +"<r" +- ::  >  +BBV*WI  P; a~ J=urW +JtsP#u LQ$ : # 0$+ +`$L L sI$ $M $  $) 9y +(:y j 0 %N0z P%O % % +   +x & P&. & +O#L B&u +[$ @ +u. +@ +o +@ + + +* +u  + p" C( "Bu< B +/B  +E  +@  +@  + +* u  p" C(Wx +w,Qx W +p ~ W +3  W + + +dWX + +l O xΓ .Wf \ O ?{*X   W +R=q>;  ; '6>spyn +W_"q@ ) r% 6^ 6 sKp * I %' 6+ +6 6 , q - _` KyhW +> +"j @~B /jp #Y +~( ( SWM + + +YI> I%b W + +Ă d5ă F1 ςJ,Wp +MJ +Ğ4W + +ħ?4IJ6 + I +  F Xa F +4K I]@4I5 + E + 6 F , F + O @5R + R% I]@ + _ ?T+kp5Ĵ+ _5 W1Ķ +ĹI  +E +6 F, F + +[Ī^WM +Ĩ +Ī +  +  FXa F + 5Ī 63  +06  +p6C I6 k6 c C07) p7V*  I]@ V3  I]@O V3 V8  I]@OV8 [7V9 V>!  I]@OV>[V?%B7 c +I +:I +[IĪ- +NI1 A1. A W + +Ŀ?8 + I +  F Xa F +@8K I]@p8I8 + E + 6 F , F + O 8R + R% I]@ + _k93 _09 +@  +E +6 F, F +'X,XnXH}XXW +] + W4EW@e`9 +b 6 +6r ?~; ~Gk}@ +Kk͚ tk;l +l +C/nrYY +'==ň EDFMFM&ZZ#n5QhFM/~ +B +IU O VW/@ +r@ +WB'X _' !݈ ( p( ()*< <-  I ?Gt  +> +R5t  +*6 I]@X0+7 r`+! e+ @  @WA +$><,F0, `,t,t ί,t ,t  -t5P->)-< <-  I ?Gt  +> +^5t  +-% I]@~-&  . p. @  I* # .5 +mmn"{J"xȝ ""xwWF +"! C(qP"bd I I%' Wt4 +4 +"R" q  d@<] ą)< ߄<- ߄ I"q ZP@ p + E)0< <-  I`"q ZP   +E)`< L<- L LI ?Ght h +> +{j&: +F& \ +<  I 8* +R8*$ \ +<  I +N" MMء <& + <r $WX54 "W: + +"% X&"& W6"( W%; + +"3 W5"9 W1"6 W.< + "Q W< + "UW= + +"]ZW= +FM"b "  "/ +! _0! b`!"!"/ +! _! +" w WV> +Y"b "" P""/ +" _" b""#"/ +@# _p# +6" 6* 6 +< +6 + 6 + 5 VWS +,?" +^? ++\ 5+<] )+< <-  I \ W> +? +" +" +5 +5; +T5 +G D D +  +",#" t1 +t8 + x  5T  y +t5 +  + . + X 6‚#t9 0$t $ZP$ % + I%b _%"݈% & @&  "W= +c';' i _Qa@ +Ip w  L x  @}  ~ `<Wr +«'G' < @  PM@"j + _ x~'W +('' @/ /@*njp b:s y.0t' `t ίt t t5 >)P< <-  I ?G t +> +{j*: +F* \ +<  I =* +R=*$ \ +<  I +e/ 5e  Y*" * h/ W/ +=I'Wqq +@ +'  + + + +5 +z +5; +V +5  +m '  +u 5 0u $u pE'! p/ Se 5e@  Y*" "p'! W\ +'G +'H +e/   Y*" * 'H @'H P W +ˣ +'l +@ +'m + + + +5 +z +5; +V +5  +m 'm +u 5 0u $u pE@'p 05`5;c5  +@'p$ + +5 +5; p5 p'{ F%Q e J 5e F'R e J 5e^FU^FW p([ e  Y*"5ep p1]#DpEp p5a#DpE p F'^ e J 5e F#b eJ 5e p zE  pzE0'wK  PKcFkKp ' RF`+ o^JX Y*" * 6 +JYB +6 + 6 + K KK|@ + @J ) $W +E) + +J  ' W + +) + W + ) + ) +) + /)v +7W + +)pW + +)[WW8 + +)EFM)FM)`W +FM)[): \) +Y6): +A= + w dW + +)OW@ + +)/)n +.)/)^ +6;e)a +b)yee)) }).a)YR +)WK +> )^ + ) + ) ): g):W$ +F) + ) ): g): +=) ІWX +F) + ) ): g):*@0)  WL +) + ;) + )  ): g9): +[W)' +[ ) [): gb): +) ]`)E)9 jл'   )> 6ռ )+ +7@) W + +)/ +;)0 +) ): g): +Q)0' + ) ): g): +w)0 ])E)9 j-   )> 6 )+ D@)0 W• + +)J +A)K +) ): g): +*)K- + ) ): g): =y)K- +ǿ)K  +0)]pWE)9 j0   )> + ) +)" 6 )+ P@)K  W +p)b +X\)c +F) + ) ): g): +*@) \@)c Կ@ +%6)? +8= + w p)HоXXW +2X  +4% +6 X+0X! ` F)J +v@ )c +)  i@ )cLW/ + +)z +X\){ +F) + ) ): g): +*@) \@){ Կ +%6)? +8= + w  )HPXXW +2X  +4% +6 X+X!  F)J@@){ <p @){LÙ)AW +M) +B?)B +$?s ?  +?t +ί?t ?t +t +5+> )+< <-  I ?Gt  +> )B ) W_ + +) +M) +B?)B +$?s ?  +?t +ί?t ?t +t +5+> )+< <-  I ?Gt  +> )B ) W +ݖ +) +M) +B?)B +$?s ?  +?t +ί?t ?t +t +5+> )+< <-  I ?Gt  +> )B ) ?W + ) ): g):W +iX) +j ) ~ ) > +!`BwNwfwZw@`pN r m +N r +) +O+ +^) $ +YX~ +~ ( W +W) +j ) ~ ) > +!`BwNwfwZw@`pN r m +N r +) +b+ +^) $ +LX~ +~ (  + +)^ # ) 8)>i)})aa)8W- +\ +)4)w=W<*_)yyy)izIz)`zz)zz)z6c)*}h})ux}})}})}9~)~~)dG)oP!WP +) +]P) +Eh#)9 jp   )>v ) iP) \) +O) ?)j kМ)#{ 0)A `%)Н E@6Fp, F + О) ) ) P)! +7а2)v а 7)wП)w;  ) +Ĩ')" ?')e +?+)e +]N ]N) @ p) ܲIܲ]@ +ٲ) +ٲ  FٲXa Fٲ + )  )(ѨР)x Ĩ )p*?`)e   =z) )P _ WW +))7)v   7)w`)w; Ƴ) Ĩ)" ?)e ?)e  @p)  Ф) I]@ +) +  FXa F + ) ش)(Ѩ0)x Ĩp)p* ?~)e ?)e Х 0)#p +7E +76 F7, F7 + +;)# +;  F;Xa F; + +x?3)# 4% +i6 i)K)  +\c) +O) ?@)j ?p)j ?ʵ )j Zap ) [)%JW +)) C( )@) + g)> ?)K@) >p)^ ) е) ): g):_B0) N` ‚ t ZP  `   +kB) N ‚ +t ZP`   +YI> I%b WZ +) + +) +@) +@o +@ + +*u  p" C( +$j) +C) + ) ): g): +=) І   +)/)3a)Wɓ + +) +) + +) +@) +@o +@ + +*u  p" C( +X]) +L) + ) ): g): *@ ) +Z) +) + +) +@) +@o +@ + +*u  p" C( +$o) +F) + ) ): g): +=) І  ) g) 'W +J +) +) + +) +@) +@o +@ + +*u  p" C( +)!  +E +6 F, F + +@)"( +@ + +*u  p" C( `)$ )$ )( R)) qй  +ds<] + +YI> I%b ϙ3)5)]))x) ) Q)>)G8 (< +z +*@t|FM*YW +*KWT + +* +l,* M,Mzء{ @{<& +Ï<rÏ +׏*$ +x׏> /׏\ xWBU + +* ̐*$ W6* +l_,* M_,Mp{ء{ {<& +{<r{ W6*#}WU + *' |*)0 W@|*)0WU +YV +*/W_V + *7W/CW + +*YU zz*D|}' *[*" *R*2%NTN*aWRz*$z\ +<  IW Y*" *  W WDW>T +qT +*xWyT +T +*9WT +W* +m*, +N r!W/*T|CF* el;;4; ;+;;;?Lg;clR +; 2;wWg;dRF@ 6JYB +6 6 o^pJXAe  Y*" * fG;d Fm;EQtW!h;hwF 6 Jc +6  6  o^@J_Ae  Y*" * fGp;h Fm;EQIWX +;uǪ;v fG+;v Fm;DQWY +G;yԪ;z|K KL" KMPKN   +E +6 F, F + +KN +- ++KO B0+`KP*nj b:s  Py.t' t ίt t @t5p>)< <-  I ?G&t & +> +{j*: +F* \ +<  I 9* +R9*$ \ +<  ImЉKVz 30K0 fG`;z Fm; DQW hf; Ff& 6JA +6 6 o^ JAe` Y*" * 7JfG(; W ; +  GXa G + ; +zm . z x #K J]@0L` P Kh;F* 6 J +6  6  o^ JAe  Y*" * fGP; Fm;EQpWuY +);rG; Fm;EQ;BwNw@fwpZw`ЎN r˗ mї +їN rї)WY +;/0;`K #KLK? +dN +X< K+ J%b  KhPKF* 6J +6 6 o^J  Y*" K KK! # K +L K?  K ]m@K K *nj b:s@ py.t' Вt ίt 0t `t5>)< <-  I ?Gt  +> +{j*: +F* \ +<  I K* +R<*$ \ +<  IrG; Fm;EQ ;PBwNwfwZw`@pN r m +N rgW?Z +V;<; +EK$ 8+- +K'0*nj` b:s y. t' Pt ίt t t5>)@< <-  I ?Gt  +> +{j*: +F* \ +<  I L* +R<*$ \ +<  IpK+BwИNwfw0Zw``N r m +N rrG; Fm;EQ0;`BwNwfwZw `PN r m +N rW* -hf; Ff? 6JA +6 6 o^JAe Y *" * 7PJfG(; W5. ; +  GXa G + ; +m .  x #K J]@L P K 9hP;FC 6 J +6  6  o^JAe  Y*" * fG; Fm;EQWZ +O;WZ +);rG; Fm;EQ@;pBwNwОfwZw0``N r m +N rW[[ +;rG; Fm;EQ; BwPNwfwZw`@N r m +N rW[ +V;rGp; Fm;EQ;СBwNw0fw`Zw`N r m +N rW\ + +;w8;W\ +;~IЧ; f;R +P > D7Lyg0> `>E&MGF + F  ? E E, ?z +W; &g;  ;{Pg> E% MG@F +F ? E& ? +D > D7\ W3] +Q;Ip; f;R +P > D7LygЪ> >0E&M`GF + F  ? E E, ?z;{g P> E% MGF +F ? E& ? +D > D7\ ;W] +;I; f@;R +P > D7Lygp> >ЭE&MG0F + F  ? E E, ?z +k; &g;  ; `;{g>  E% MPGF +F ? E& ? +D > D7\ W] +G;I; f;R +P > D7Lyg> @>pE&MGаF + F  ? E E, ?z;{0g`> E% MG F +F ? E& ? +D > D7\ WR^ +^ +;IP; f;R +P > D7Lyg> >E&M@GpF + F  ? E E, ?z;{гg0> `E% MGF +F ? E& ? +D > D7\ WW &g; wQ;gW_ +Q; &g; Ha; +=! +  GXa G + +#=! +m %.  x G K 'K]@`L P K ]=# =$!h ;hwFP 6 Jc +6  6  o^J_Ae  Y*" * fG;h Fm;EQ]=' =AgP;dRF 6JYB +6 6 o^JXAe Y *" * fG;d k=D _@  + F, F +9p=( x[ [  [ +  + . + X +6 F, F + 6 +[ +6 + 6 + [S[ +]=* +6=H +6 6 7='Wk &g; ; Wd_ +G; &g; ;  K KL" KMPKN   +E +6 F, F + +KN +- +RKO O +PKP*nj b:s @y.pt' t ίлt t 0t5`>)< <-  I ?G&t & +> +{j*: +F* \ +<  I 5* +R5*$ \ +<  I +mKV z 3K0 W_ +^ +; &g; Ua; ]= k0= +_  F, F +н= KBwPNw m +N rfwоZw`0`N r K K пKK@ +N +< YI+ I%bpK *nj b:s0 `y.t' t ίt  t Pt5>)< <-  I ?Gt  +> +{j*: +F* \ +<  I J* +R8*$ \ +<  I + = +]= +6=H +6 6 W*` +` +; &g; ]; =Ag@;dRFp 6JYB +6 6 o^JXAe Y *" * fG;d k=D _0  F, F + k=AW` +?m; &g; +]; +6=H +6 6 W` +Xa +; &g; ; Wca +; &g; Ȳ`; K KL" ڲ KMKN    +E +6 F, F + +KN +- +_PKO \+KP*nj  bP:s y.t' t ί@t pt t5>)< <-  I ?G&t & +> +{j*: +F* \ +<  I 5* +R5*$ \ +<  I +mKV z 3K0 Wa + +;W!b + +;aR +;`Wzb +R +;h;i +ZL ; +3 ;[D :U + ; .N  ] D : 2;-2;Wb +2;kv;l +ZL ; +3 ;[D :U;  ; `Ah A +*A +A\ +>A +15; + N5  J#Ah a; +"N; N  +*A  +A\ +>A +15; + N5  + ; .N  ] D : W6c +O;r);eWc +);u;v +ZL ; +3 ;[D :U + ; .N  ] D : t;eWc +;x;y +ZL ; +3 ;[D :U + ; .N  ] D : 8WKGcW +ZL ; +3 ;[D :U + ; .N  ] D : Wv +ZL ; +3 ;[D :U ; P; Ah A +*A +A\ +>A +15; + N5  J#Ah a; +"N; N  +*A  +A\ +>A +15; + N5  + ; .N  ] D : O;WSd +O; +ZL ; +3 ;[D :U;  ; `Ah A +*A +A\ +>A +15; + N5  J%Ah a; 'g@ l Q 9gP+%nQ(>Q >Q +"N; N  +*A  +A\ +>A +15; + N5  + ; .N  ] D : hW +ZL ; +3 ;[D :U + ; .N  ] D : hW +ZL ; +3 ;[D :U + ; .N  ] D :  Wd +V; +ZL- ; +30 ;[D0 :UI; +EK$ 8+- +K'@*njp b:s y.0t' `t ίt t t5 >)P< <-  I ?Gt  +> +{j*: +F* \ +<  I K* +R<*$ \ +<  IK+BwNwfw@Zwp`N rd mo +oN ro +; .N ]D: tWe +R +;; @Ah pA +* A + A\ +> A +1 5; + N 5  J'Ah a; z@ q#C! d#0 sd#% I I%' Y0 _` n`%n! >Q >Q  ` hP;F& 6JA +6 6 o^JAe Y *" * fG ; Fm;EQ Unx, Q {@ +E 6p| _ q,} d,0 sd,% I I%' ~'0 _` n!Hn-=n& Q  C(- D>- 7>  Gg I Q) Q%nQ>Q >Q Q h@;Fp& 6JA +6 6 o^JAe  Y*" * fG; Fm;EQ‚Q t PZP  +w +YI> I%b @wp + E + 6 F, F +InQ 6Q 6 ‚Q +t ZP +YI> I%b 7 ` ky _  F, F + +"N; N  +*A  +A\ +>A +15; + N5  ~W; Ah @A +*A +A\ +>A +15; + N5  J'Ah a; +"N; N  +*A  +A\ +>A +15; + N5  Wp; Ah A +*A +A\ +>A +15; + N5  J'Ah a; 'g@@ lpQ 9g+%nQ(>Q >Q +"N; N  +*A  +A\ +>A +15; + N5  0lWne +);0; pAh A +*SA +SA\ +>SA +1S5; + NS5 S J,%Ah a; z@ q_! d_!0 sd_!%_ Iu Iu%' 0%  nn`-=n& Q  C(- D>- 7>  n%n ! >PQ >Q +"N; N  +*A  +A\ +>A +15; + N5  We +;; Ah  A +*A +A\ +>A +15; + N5  J'Ah aP; V@ K #KL@K? +dN +X< K+ J%b KK Bw@Nw m +N rfwZw` PN r K KK! # KL0K?` +d N +X < K + J %b K ]mK K *nj  bP:s y.t' t ί@t pt t5>)< <-  I ?Gt  +> +{j*: +F* \ +<  I H* +R9*$ \ +<  I +"N; N  +*A  +A\ +>A +15; + N5  W:f + +;Wf + +;&!Wf +R +;-!WIg +2;0O;QO;kqWg +O;7$;8 +M;R +? ; D :U$;R ;l +Ah A y#Ah +;m N  +*A  +A\ +>A +15; + N5  + ;S  i D : );T);nWh +);:% ;; +M ;U +? ; D :U&P;U ;o Ah A +*A +A\ +>A +15; + N5  y#Ah +;p N  +*A  +A\ +>A +15; + N5  + ;V  i D : ^;W;qWbh +;=a( ;> +M ;X +? ; D :Un(P;X ;r Ah A +*A +A\ +>A +15; + N5  y#Ah +;s N  +*A  +A\ +>A +15; + N5  + ;Y  i D : 8WXG4R +;aR +;Wh +R +;G +M ;H +? ; D :U* ;H P;b +Ah +A +*A +A\ +>A +15; + N5  y#Ah +*e;b -h@; F@? 6JA +6 6 o^JAe  Y*"fG%; +;c N  +*A  +A\ +>A +15; + N5  + ;I  i D : 2;dT2;W&i +2;J +M ;K +? ; D :U(.;K ;e +Ah +A +* A + A\ +> A +1 5; + N 5  y%Ah +5.;e ; +  GXa G + ; +m .  x #K J]@PL P K9h;FC 6 J +6  6  o^@JAe  Y*" * fGp; Fm;EQ +;f N  +*A  +A\ +>A +15; + N5  + ;L  i D : tW$ +M ;R +? ; D :U$;R ;l +Ah A y#Ah +;m N  +*A  +A\ +>A +15; + N5  + ;S  i D : W% +M ;U +? ; D :U&;U 0;o pAh A +*A +A\ +>A +15; + N5  y#Ah +;p N  +*A  +A\ +>A +15; + N5  + ;V  i D : Wa( +M ;X +? ; D :Un(;X ;r @Ah pA +*A +A\ +>A +15; + N5  y#Ah +;s N  +*A  +A\ +>A +15; + N5  + ;Y  i D : Wi +V;Z +M ;[ +? ; D :Uc;[ +EK$ 8+- +K'*nj0 b`:s y.t'  t ίPt t t5>)< <-  I ?Gt  +> +{j*: +F* \ +<  I K* +R<*$ \ +<  I@K+pBwNwfwZw0``N r m +N r +;\  iD: W*;b +#Ah +#A +*A +A\ +>A +15; + N5  y'Ah +*h;b -hC; FC? 6JA +6 6 o^JAe  Y*"fG%; +;c N  +*A  +A\ +>A +15; + N5  WW(. ;e +Ah +A +*A +A\ +>A +15; + N5  y'Ah +5.;e ; +  GXa G + ; +m .  x #PK J]@L P K9h ;FPC 6 J +6  6  o^JAe  Y*" * fG; Fm;EQ +;f N  +*A  +A\ +>A +15; + N5  AW$;l +Ah A y%Ah +;m N  +*A  +A\ +>A +15; + N5  jW&;o PAh A +*A +A\ +>A +15; + N5  y%Ah +;p N  +*A  +A\ +>A +15; + N5  jWn(;r Ah  A +*A +A\ +>A +15; + N5  y%Ah +;s N  +*A  +A\ +>A +15; + N5  Wi + +;xV;{ V;@gg;7j;%W%\ +;1 ;4P9 + 9"  9 +b 9 +6r ?ð9WIf;R +P > D7Lyg> >E&M@GpF + +F  +?E ФE, ?zɰ(;QWP\ +;pI0;q f`;R +P > D7Lyg> >E&M GPF + F  ? E E, ?z;r{g> @E% MpGF +F ? E& ? +D > D7\ W^ +^ +; &g; qWTP0;: + 9I  9 +b 9 +6r ?2b`9S +b 6: +6r ?WZL +3 ;[D :U(;ZqWV(0; + 9I  9 +b 9 +6r ??b`9S +b 6: +6r ?WM +? ; D :U(;' +{fy;W]]>P; Q> + +; ?z + ;  ? j%;]%{ +M#{ #{ +"%{ i>{( +M{ +k;% +,A +5; +گ5 +ͯ ^ ^ +{ e q / +(B j? wB  %{ H;T;T;v;;];'NWKj + +;P ; +; ?zv%P; +M&{ &{ +"%{ i>{(P{ +x +; +k +A  +, +A + +5; +گ +5 +ͯ ^ ^" v>; +PfP; +P2 +> D67Lg> > <&E& +M<&G +<&F +< F < ? E E, ?z 3g;;T BwPNwfwZw`@N r m +N rp;T@g> E% +MG +F +F ? ̝ E& ̝ ? +DF +> DJ7\ +P*; +kP A\ +,P A +P 5; +گP 5 +ͯP ^P ^S +9[A] +e[5 q` /` +(`B j`? wkB  TP;0;: +b 9I b 9 +bb 9 +b6r b?2b`9S +bz 6: +z6r z? KG<; W_,; 9g;e;NWwj +j +;V; +; ?z%; +M&{ &{ +"%{ i>{(FP{ +x +; +k +A  +, +A + +5; +گ +5 +ͯ ^ ^ >@; 8Pf; +P +> D7Lg>  > &E& +M&G +&F + F  ? E E, ?z 3g;P;TBwNwfw ZwP`N r m +N r;T@g@> E% +MG +F +F ?  E&  ? +D +> D7\ +*; +k A\ +, A + 5; +گ 5 +ͯ ^ ^ +9A] +e5 q / +(B j? wB  Vp;(; + 9I  9 +b 9 +6r ??b9S +b 6: +6r ? XG<; W,; Klf;BKU_=[pff=f=gdh=:Vii=GW1N +N += ]= X=g0X;dRF`X 6JYB +6 6 o^XJXAe  Y*" * fGX;d Fm;EQ]X= 0Y=Ag`Y;dRFY 6JYB +6 6 o^YJXAeY Y *" * fG;d k Z=D _PZ  F, F +xZ=  6[ +6 6  [ +]= +6=H +6 6 7= = w=(3>@lB@W p@@@@h@RQVWabQ @b@$ 3D Q6 h S ZSz' FSz' F + S|3S~XkakQkNQl?mQW6O + Q+WbaQ a a +E +6 F, F +WcWb%Q WO + Q~`W P + +Q W6Q W}P + +Q QE W1Q XWP +Q 9Q) RQ‚pbQ bt bZP0c `c +_t +YI> I%b  %ncQ >cQ >cQ  pQ2*xQUQOxQQn`WN +O +Qx>|Q >ZQ bZQ[Q BwP[Nw[ m +N rfw[Zw\`0\`\N rb\Q!\Q\  ] + E + 6 F , F +P]Q h];F]& 6JA +6 6 o^]JAe  Y*"7J fG^; @^Q p^QcQ 1Q a1  +Q  + @$ 3D Q6 h S Z Sz' F#Sz' F# +& S|32S~^Q ^*nj_ b@_:sp_ _y._t' `t ί0`t ``t `t5`>)`< `<- ` `I ?G| t | +> +{j,: +F, \ +<  I ȋM* +Rȋ?*$ ȋ\ +ȋ< ȋ ȋI aQaPa MQ Q@$ 3YD a!Q6 ha! a!S Za!gSz' FjSz' Fj +m S|3y S~xnnQhqqQqQ[QQQmnno^o?{{ :%^Ȁ,o p24xxʓxoxxWcQ + p  n [A zn 1n + >Q *>Q %$ +%  G%Xa G% + :-$ + +-? F -W8 V-_  d +dGn)\ PdQd_nd9 qd"bde I I%' @e n  %n +! >Q >Q pee;zfm @f.zf x #fK J]@ gLPg P Kghg;Fg* 6 J +6  6  o^hJAe@h Y*" * fG; nnph-=nh& hQ  C(- D>- 7>  gi +1n +Q >Q *>Q piQim i.0j x #pjK J]@jLk P K0k Q- Q/`kQ #k%gk‚0lQ*lt lZPPm m  n +YI> I%b  +%n +Q>Q >Q oQ@o;zpom o.zo x #pK J]@PpLp P Kphp;Fq* 6 J +6  6  o^@qJAe  Y*" * fGpq; Fm;EQqqm r.@r x #prK J]@rLr P K s7 l +lm l. ll l] F l q l\ #Psp s n+s+,ns WIntQ 6Q 6 ‚Q +t ZP +YI> I%b  + WnO P+ iKtBIdRK. Wz 3K0 WJm + +Kc +8^Kd +sC $ I]@OW- + +KW + +KlV`KW3p +p +KR(K +E,[X +S[> +F5; + 5 + x 6)[=60) 6`) +, +[> + +  +YI ND I%b +[?  )[[)*nj) b *:sP* *y.*t' *t ί+t @+t p+t5+>)+< <-  I ?Gt  +> +{j*: +F* \ +<  I J* +R?*$ \ +<  I,K0,Bw`,Nw,fw,Zw,` -P-N r m +N rGWp +0q +K&-K-;o .Ah 0.A +*A +A\ +>A +15; + N5  y%Ah +;p N  +*A  +A\ +>A +15; + N5  `.K.Bw.Nw.fw /ZwP/`//N r m +N rW{k/K‚0[ @0t p0ZP0 0 01 +YI.> I.%b 1 WVq +q +K1K2Bw@2Nwp2fw2Zw2`303N r m +N rpWq +gr +K`3K3Bw3Nw3fw 4ZwP4`44N rѭ mۭ +ۭN rۭ`Wr +s +K4K5Bw@5Nwp5fw5Zw5`606N r mʮ +ʮN rʮK٨K aK RKK Wm +m +K K-h KFP ? o^ J  Y0*" +* 6I +JA +6I + 6I + 5K <K +K!0 + +uE +u6 Fu, Fu +` +K  +*nj + b +:s  P y. t'  t ί t  t @ t5p >) < <-  I ?Gt  +> +{j*: +F* \ +<  I D* +R5*$ \ +<  IWm +$n +K  K h KFP & o^ J  YР*" ˡ* 6 +JA +6 + 6 + ՠK ܠKK!0 +E +6 F, F +`K *nj b:s  Py.t' t ίt t @t5p>)< ,<- , ,I ?GHt H +> +{j]*: +F]* ]\ +]< ] ]I D* +R5*$ \ +<  IWMn +|n +K K OK>P~y F(M o^J Y*" * 6 +JA +6 + 6 + K K@K!p +E +6 F, F +K *nj b0:s` y.t' t ί t Pt t5>)< <-  I ?Gt  +> +{j*: +F* \ +<  I D* +R5*$ \ +<  I0*Wn +n +KK #@KLpK? +dN +X< K+ J%b K9hKF0C o^`J  Y*" Ȣ* Ae 7J 6J +6 6 K KK! #_ K +Lq K?q  zK ]m K `K BwNwfwZw `PN rڣ mݣ +ݣN rݣK *nj b@:sp y.t' t ί0t `t t5>)< <-  I ?G3t 3 +> +{jH*: +FH* H\ +H< H HI rH* +Rr9*$ r\ +r< r rI`nWo +9o +K K #PKLK? +dʥN +Xʥ< Kʥ+ Jʥ%b K K Bw`Nw mߥ +ߥN rߥfwZw`@pN rX K K K! # K +LK ? +d N +X < K + J %b K ]mPK K *nj b:s@ py.t' t ί t 0 t ` t5 >) < x<- x xI ?Gt  +> +{j*: +F* \ +<  I ӧH* +Rӧ9*$ ӧ\ +ӧ< ӧ ӧIШWwo +o +K  +EK$ 8+- + K' !*njP! b!:s! !y."t' @"t ίp"t "t "t5#>)0#< '<- ' 'I ?GCt C +> +{jX*: +FX* X\ +X< X XI K* +R<*$ \ +<  I`#K+#Bw#Nw#fw $ZwP$`$$N r m +N rWo + +p +K  +EK$ 8+- +$K'%*nj@% bp%:s% %y.&t' 0&t ί`&t &t &t5&>) '< <-  I ?G#t # +> +{j8*: +F8* 8\ +8< 8 8I bK* +Rb<*$ b\ +b< b bIP'K+'Bw'Nw'fw(Zw@(`p((N r۫ m +N r <K )[h[6pp[@WV +R +[j‚|[k |t |ZP} P} } < +6> \ 6>  ~<+ = +< < ԓ +YI> I%b  wW.W +2[p +[q +  GXa G +P~[q~m  ~.~ x #K J]@`L P K[r   ` +YIg> Ig%b j pWW ++X +[zWk‚@[ pt ZPЂ  ` +YI> I%b ! `W=X +O[ںQ[R +[<)[W{{K|{K&EWEKFFKGGbGK*|KҼKԡKɢK1K.KֺKkKZKbFFKGxIIKOKOcKOKOWQ +R +I@tU tY t u `u +YI> I%b  +[ +  + . + X +6 F, F +W$R +R +WR +2ny #yk +;k X   ^l 7 lW>S +R +WS +2n z #Pzk +;k X   ^l 7 l.eFKG{KɻFKGϾKĿKvKҼKEFKGi +Wj +FS? +Wk +]k +CWhk + +NWk + +Wpl + +Wk +lWBl +kl +nKf +K,Wl +KbKcg0KRFp o^JX Y*" * 6 +JYB +6 + 6 + K K K|P + +YI +> I +%b‚0:Kp:t :ZP:  ; `; +YI> I%b +]K +6=H +6 6 +hKfֺKbKf?kKbKf.ZKbڀhJ;{ +,SG, +,n,,,8W = ,/W + +,j,#&b, +b6 +6r ? ,P [C(  W8, , -, -X +-  M!Xd},@,( pZ I, I%' 4, $  0$ )M])W{ + +, G, $  $ )M])W + +,W5, < , <, +  ,Y C( ,; +4G<4H +> 84H0dE, W., <,W3, W3, W., hW=,  W< +,G,I- M PQ R  S E8,H #0 p )+< <-  I ?Gt  +>P,#t{4 (=!, {4 -0,! {`4 +5=I,# +I +I,O +It' +It +ίIt It +t +5+> )+< <-  I ?Gt  +>È,Ј d W@ + +,#@,$ +, ?qp,qq A6 P | +   C(  | (+O ' q, qq A@6  | +   C(  | +O 0 +o, + +M A ! + |5  += w +l, +! M M ء <& + <r  +o, +M A ! + |5  += w +l , M  M  ء   <& +,   M  M  M  M  ء  + <r  +,  +  M  M  M  M ء <& +5, ,?Wv + +,5 W + +,;OW + ,A + ,C  8D 7 h,D +,G B u`,V <,Z,a  > ʮ ֮ Q <& + <r  +uM ,a  D 7) W +,feW + +,rjp,s4&b, +b6 +6r ? +,s3 [C( +0MW +0'0( mH m  o^PAe   Y*" * 7PW +R +0<0= o^HAe   Y*" * 7HPWQ +0O@0P mpH m o^ВAe   Y*" * 7SW +R +0d00e o^`HAe   Y*" * 7HW + +0IWA +J0 0WdW + +0^U<WQ +U0^}0 um}Hm4 m4 m~H m&} +e  5eX e`~ 5e  Y *" * m~ e~ 5e  Y*"  * E~ *njP b:s y.t' @t ίpt t Ѐt5>)0< <-  I ?Gt  +> +{j*: +F* \ +<  I 3* +R3*$ \ +<  I `(e s 5e   Y*" * Ps   Y *" i7 + Z   5 6 5  V76 +k . 67 5 > +1U $UK  77 +6 *7 m!d eHO 5eW1HP 1*nj@ bp:s Ѓy.t' 0t ί`t t t5>) < <-  I ?Gt  +> +{j*: +F* \ +<  I .* +R.*$ \ +<  I?P!p*nj b@:sp y.Іt' t ί0t `t t5>)< <-  I ?Gt  +> +{j&: +F& \ +<  I /* +R/*$ \ +<  I 2 H p E  0 W +`0jP0 pH# `.HZ0 +8.5} +AK. .%H\ eH\ 5e   Y*" * H\ 8Wȅ +&b0 w30 +m3H+ +eq 5e  Y*" * kW +b00 m0H ;  T +|>] eH@ 5e  Y*" * G *nj b:s@ py.t' Њt ίt 0t `t5>)< <-  I ?Gt  +> +{j&: +F& \ +<  I =* +R=*$ \ +<  IkW? +c0H0I m@H ;  T +|>] eH@ 5e  Y*" * G *nj b :sP y.t' t ίt @t pt5>)Ў< <-  I ?Gt  +> +{j&: +F& \ +<  I =* +R=*$ \ +<  IW +c0a  +0b W +c0z  +0{ PW +e00 m0H m` o^Ae   Y*" * 7MW, +e0 +?0 +m?H3 +?v eH@ 5e  Y*" * Wg +e00 m H7 dPzeHO 5e   Y*" * W1HP zhWh +00 H `.HZ0 +8.5} +AK. .% H\ e H\ 5e   Y*" * H\ W +i0P0 +`=H9 +8=5} +AK= =% nHZp %pe  5eP  Y*" H +H +2 +H p +E + H 0 JW݉ +dl0" +<0# +<H eH@ 5e  Y*" * W +hl0405 dHe HO 5e   Y*" * W1HP HMWK +m0> +?0? +?H eH@ 5e  Y*" * W +m0HP0I dHeHO 5e   Y*" * W1HP HWŠ +)]0[0\ m H dPeHO 5e   Y*" * W1HP 1 DW +vV0 +?0 +m?H +e 5e  Y*" * h 'MC&.S` g !W +k D UhW W W + H U( Wt +  + D UhWt +0>N r m +N r +EK$ 8+- +`>K'>*nj> b>:s ? P?y.?t' ?t ί?t @t 't +5'> )'< <-  I ?Gt  +> +{j&: +F& \ +<  I@@* Rp@*$ \ +<  Iw8@_A@ A _0A %Q +2Q+ +A H U( W6Q `A[ Ww + +gWZx + +n +:q : + +:q': +  = +R + H U( +S +!K+  Bw Nw fwZw 3 +> + H U(SAAK+  Bw Nw fw Zw  B r t5 +tJ + H U( W>t8`BAB B _B s+ +s6 + H U( WHsWx + +Wy +B +W}y +B +Wy +FM9WBz +FM +8  w Wz +YIW{ +Y + 5 C +. U( + U( +2 ( +A H U( +2 +9 +A H U( 5( I7 Wn{ +Y +a ++ + U( + U( + U( + U( + U( + U( + U( + U( ++ + U( + U( + U( + U( + U( + U( + U( + U( +8! +5!z +!e !* PC 5T +TT 5C + +( + H U( + +9 + H U( 5( I7 W+viW +r  W +z vvyvqvW{ +v +7" + +k D Uh +% +%z C"C +Dr + +  D Uh3W@D +  D Uh + +r 8W + +k D Uh +) +)z W| +v + +,  +3  (,BC + +<  I +! +  D Uh +% +w,%  +3 5,BC >C + +<  I + +k D Uh 9 x + 6W| +v + +\+ C(Wv} +v +  +,  +40 B,HB 4@H0'> >pH +,12 >, HC >C F  x + H +<  I +` +'K K%b!W} +v +9 3  W[~ +v + +\+ C(VW. + +pWJ| + +0pDSD .D E$ 10E >pE c EkE  ' _gljF"@F pF>F< <-  I%F% GZ ԉ %+  +1b#>PG c + k GɝG + )'< <-  I ?Gt  +> +{j&: +F& \ +<  IL* RM*$ \ +<  I80MxA`M M _M W6m Mt W + + +(%% W + +M +:P : + +:P': +S N NK+NBwNNw OfwPOZwO`OON r m +N r +EK$ 8+- +PK'@P*njpP bP:sP Qy.0Qt' `Qt ίQt Qt 't +5'> )'< <-  I ?Gt  +> +{j(: +F( \ +<  IQ* R R*$ \ +<  I8PRAR R _R ++Q + U( + U( + U( + U( +  U( + U( + U( + U( ++U ++SY( +3 W \ W^ +/$ F@S2 W6 2pS( W$8S&S T /$@T F 2 W32pT( H]@ W$ +/$ W3 F2 WT U W3 + +W +MJ + W +=K4 uW + +~~#$D$D$S$$/4 @$$ :@@k0ONo>^%??^0#0y62F2Q33]@i@AW! +]@j @n _n_+V<nJ<o^ W-@o5S5o`G5oQ -p5940pR R`pH >H ,-b ?6 ? +n<p b<p^ c-*5 S5` G5Q -5 94R R H >H ,-b >6 > + ) +U U( ) +U U(UCiCBELE@GTG2I@IK#LyBNSPW +@D{ O,{BD{'g? t? | +0$2?? ?P|C @W, +3( (,B C ? C WWw, +32 5, +BC >C WWq +@ +D2  \, +BC ?C gW +@' +EE( i, +BC ?C W,4|0 B,|B 4|0'> >} +,,2 >' @}C >p}C W + +S W + [OW; + +MDK>.h>ZH>a''0((0))GW<!4PUn ,U5-4Ur%,W5 '`Xr;94Yr; RZH >[H ,\ +-p]s-^tS^& `_? [,,0,(0t--0- .i*/-0i//Z220362P0W +.4` 9-@`5;5p`/5`^ K-a5,-ab #5`b65cn ,c5 50dr%,d594er; RfH >fH ,f '@gr; p-gs|-gt`0h& h? S5h`G5@iQ -i594iR R0jH >pjH ,j?3~30W +36j -0k5 mf ++f ++fw +B Uh +C Uh +D Uh +E Uh +F Uh +G Uh +H Uh +I Uh S5, G5,Q -5 94R RH >H , S5) G5)Q -#5 94#R RpkH >kH ,k8l60l `l l! 8l m @m  4K+ H%b8m7m m n ^  mf ++f ++fw +B Uh +C Uh +D Uh +E Uh +F Uh +G Uh +H Uh +I Uh>'0>?Z?,0?,@ZBC0D'0 +EBEEEiWl +UCz<q N0@q5 E ? <pq<q `0q5S5r G5@rQ -5 94R RH > H , <pr !4rn ,r5-4 sr%,ps594sr; RsH > +H , +'r; +-s - t S& ? ?t6 ?0t + E (? `t +  D UhFG0H(0H2IJ(0DJJiK(0W +@G,?t r0t5S5t G5 uQ -5 94R RH > H ,  E  5?  D?Pu8?u 0u5S5v G5@vQ -5 94R RH > H , \?pv P?vn ,v5h?wr%,0w594`wr; RwH > H , ' +r; 0s  U 0t  +U [?6 O? +B?S5w G5wQ - x594PxR RxH > H , <x<x `0y5S5@y G5pyQ -5 94R RyH >yH ,z<0z !4`zn ,z5-4zr%,{5940{r; R`{H > H , 'r; +- +s - t S& ? ?6 ? + E (?  +k D UhNBNN&O>RS>sTT>mqnpW +dpu uv +#nH +n +`:< +8:5} +AK: :%o^Ae   Y*" *  + W +q  +0nH +n% +`:< +8:5} +AK: :%o^Ae   Y*" *  + MW" +:r +? +?H eH@ 5e  Y*" * W_ +>r  dPH!eHO 5e   Y*" * W1HP H!JW +r +< +<H& eH@ 5e  Y*" * W܌ +r dH/&e0HO 5e   Y*" * W1HP H/&JW +s +< +<H4 eH@ 5e  Y*" * Wa +s` dH=&eЙHO 5e   Y*" * W1HP H=&MW +*t +? +?HB eH@ 5e  Y*" * W +.t d0HFepHO 5e   Y*" * W1HP HFSW' +t1 +L2 +<HO eH@ 5e  Y*" * XWh +u; +M< +?HW eH@ 5e  Y*" * SW +GvC +LD +<H_ eH@ 5e  Y*" * XW +vK +ML +?Hg eH@ 5e  Y*" * PW- +v+ o^КHAe   Y*" * 7HMW` +2w80 m`H| m o^Ae   Y*" * 7W + + WW + +*LOJT6pKW +6 A6) ++A6) +0 +#5 +5; +5  6!6) g/ e/ D7 X  ?   ? uM   D 7) EQ[ M ? ȰþTMA XþT 9QþTM IþM Iþ%' LM& 3IM 'I%LM?H!0 J#9 +J#N rJ# m'( %m +T 5}T +D7 J, +=5; +5 +԰   uM -  D 7) zѿ +5 +fKѿ + ZKѿ +%b ̒-5HD! D  p7 +/\3N r< WQ +5: +6) + + + +5 + +5; +hM +5 +[M p p B:6)6)W0, +, 8D7 , V`, {, +uM ,  D 7) IY6?!6?JW` +6? +8A +6?( +q + +d +5 +W +5; + +5 +   EA6?(~6?(9Tm!0;<T!`z @D7 `!A ! + +<  +  +I&%"D /0  +p )< $<- $ $I EN39W* +9[ K;?EWhX +O: +6?( + + + +5 + +5; +M +5 +M } } \:06?( +q6?( 9W* +o9[ ;WuX +v: +6?( +$ + + +5 + + +5; +M +5 +M   :`6?(6?(992] ;5P=] 5>)< <-  I f;5 !9W + +6cWT +R6 +\6 "?H6 eG +( + +6 + +A  + +A +~ +5; +G +5 +:   RA6 +6 ? .7@6DpGJ  Y  ?=d4Z x6 vI(0B j`? wTB  W16 W7 + +6w6mؤ6 65 65W + +6 ++6# +?@6' p?O6+ ?{e6+p6$G P% p@{ p{%{ K<{( X<GO6 0?{"`6xxxx vPI(B j? wB  <7@6 +Gu G P%  pP{ {%{ K<{( X< G,Gu @- p? d2 4 ?{x0Gu&v`I(B j? w B  P6 ?z"6xx0x`xvI( B jP? wB  .6 65\ؤ6/6DW + +6*W +l60 +61 +A\ +A +5; +T5  ͼ">>T>@{>>$>z{>s>^>> +Wm + +>@K>.> {>h>ѿ}VWp+@* +4G 4  P%4 +p'{ '{ +%{ K<{( X<GpBL +<  I ) +BB ?@IW +&  +'  +?" .7- D0GJ Y ?=dZ 'W +B`C ?z }F R V +(B j? wB  <7D +Gu +6G 6  P%6 +p){ ){ +%{ K<{( X<G +,<Gu - ?d2  +4  +?{ +xGu& v I +(B j? wB  bW= + +IJ  ?z }!R R! V! +(B j? wB   PK(es 5e   Y*" * @s ^%L !l +_! S!b !j 26: u7j&7 +jpO" +' <6 @ -O +G +:G :  P%: +p){ ){ +%{ K<{( X<G +8OG A ? d?E e<% 0d% H ? +xG1 v I +(B j? wB  }R R V +(B j? wB  LW +Υ +p0*+`* +7G 7  P%7 +p&{ &{ +%{ K<{( X<GBL +<  I ) +BB ? +  R V +(B j? wB  +NK I%' UW֥ + + +NK I%' +NK I%' +A + + + + +5 + +5; + +5 +   A W + +  Wv + #Wݦ + +W? + #W + 2,W0 + +;$W + F.W + +%FW + +.FWk + +A8W + +>bWͩ + +xAjWb + SfUW +}fP~ +P > D7Lg> >E&MG@F + +F  +?pE E, ?z I~!y0 p f + \ O   ?{\,p, g  E, ?z I0\` g> 0E% M`GF +F ? E& ? +D +> D7\ X" -y +   p !9Wxx(^cXW5 + } ~ \ P\ +<  IqW10 W12 W14 W16  Wj + +   q W-y +   p!W + +&W +O .OW + +X4zRP%W- PW#{P :0n +&.Vw\wW, l@T^TT')T< <&  ΁+@ U M`U U UX< <-  I +# txsX Y  ` +Y ; M  M  M M@YءpY Y<& +<r v""YZ 1&<& +: +<r: + D, ^D, K <& +e <re 0Z#`Z p >dzZ ӳ߳Z Z e<& + <r Eo `?ȢU\eT(~   f `bRW. o[ ,bY\ qbY pB   Ш_Y ` 0`_R }E"GN  @  bO bE" |5b+6 +b= wb ,P]' dx +qd  Ad d g +d  Sd + 0c"v +c"  +_c"i +|5c  +c= wc 5y( @ +Ac k Ac E Tcz"T z"@= `p %m &Ы  }~G0N `@  cO _c) +|5c  +c= wc c6 c +cE +c6 Fc, Fc + |5c5 +c= wc ,' cx +qc  Ac c g +c  Sc + d dz% +d  Sd+ $ P  S+ q^d$ +_^dn ^dm +^dU ^dU( udQ dg `  S+ $el( AeTn le eTSQ Fo }x Ǒ ޴ UKV@- ] [^!0P[ C(< [ d[= v [? W\_Y @\ K5M]) \^\_RF]9 ;0]  "`] M] X"! .% WAM]) +=  C(c6_T]e JV3F^3 :^% aW^B _ P_ +C( + +)_ + +@) +@o +@ + +*u  p" C(_C ` 8*p >~P t`p`+`BwaNw@afwpaZwa`abN r1 m7 +7N r780bqpb~ +S() ++S5} +JS QS%eb( 5e  Y*" p~ bqc+PcBwcNwcfwdZw0d``ddN r m +N r TFq C a{%r O s p  p E d ~C@eDe< ,E* +5,Q ), , , +,  S,+ +#0Q0@ +6;T +Z96a 6 w6 %Cc' 2NdL@f,?f qYf ~ +]<$) +en< An< n<g +n<  Sn<+ +/q< q<@ < +M A g +  S+ Y   + 0  Usf +f!  + +) +/ @  +    +; CF , g +Pg' u wP +x +qP AP Pg +P  SP+ Yg-g] g4' h ~@h_Y `<  phc<_T <_R <  9<G< +,< +<' <x +q<  A< < g +<  S< + +}< < +<0 <U=@' e = @  =5  =  ; =5 C =F ,hAh' 9= u E +x +qE AE Eg +E  SE+ l3FBFihFI?`XF % DuF*F +uF* FuF*L +,uF! +uF +' uF +x +qF AF F g +F  SF + +F  F  F0 9Fp Y0i1`i] i4' i ~j_Y `Pj jcF_T F_R F  9FG< +,F +F' Fx +qF  AF F g +F  SF + +}G G +G0 GUG@' eG @ G5 G  ;G5 CGF ,jAj' BG u P +x +qP AP Pg +P  SP+ lQCFkPQI?`Ԡl< G<- G GIH“m% 0mZ +a>H># ^ >H# c >H#7 +R >H# >H#\ +x>H oJHMMJH]) | NH DaH c +`aH +ЊaH aH GmHIƌ`mm mf 9M Z+D-MZng 9BM Z+DNZ n^NH^{Fo^ D@o ЊXOCl ĊXOC܊poo =`O <& +O<rOFoD Dp  0pL`pp Rs gR  > +R^ M]RMpءp  q<& +oR +<roR + $!S" !S" I!S<& +3S<r3S MS L#{MS  +R; T t%W CY +aF7/C D + *F +7H +H + +  +6F$ӳ@ dPqL1q q +q" J,qj!rqk +~q$ C(sq$0s  7: z +q3 +   + q3 c  H `sqkqs=  s?  + s] b tW8 SPt tAOktP+S u9 Apu  uqHu ‹XC( v Pv 3vql&wqN՝0xq Axu1@yq ϋq ܋q +" +q +^l Qh+,yq]zh+ @zd !zq*-!zl$:80{l Q nD{n +"d " +"E +"6 F", F" + ?:{n, D" n +"d " +"E +"6 F", F" +{n 0|g p|g |gX +" g! խ" +d3 +"d4 " y q4g! d|gX +54# g +(4# gJ +4# g! խ4# +d3 +>#d4 ># y ~@#n +9@#+K@#n' ++""l Q"lx }q!x0}h3 k`}h K:}h K}h3  +u%h3 .%d +S)q# +SVhD  +9SVg }fM ~g.P~g! խ~d3 `d` ` +`E +`6 F`, F` + +td4 t y :fR&~hI  1k $U T~k ; +e P]" }P]:p]K :  ]Lo _+5  ]M M ]$) M "[ ]&+ +l hM :l k : q   q! {~q!  q=! { q=!Pq> Q!hV * +! q Q!hV * :b#"q& +B#q4 +!#tq" ++"# +l  Q# +lx 8l  8n Dn +V$d V$ +V$E +V$6 FV$, FV$ + 29`$n Q`$o Z$q%q:p   a < +< +`+a + ++ a$ + U +G<- +G +Ib,< FO,"t' +,t/ 5,t`! +D-t0( 5D-t`!OPt3 C +f-ht3 +f-<  - - - +.t5) 5.t`!OtA C 'ptA +.tH 5.t`! Y.t[2 .th tj 5ІT tk 50t`! .tn +M.tr . .t~S`tE m bЇ Uq)qO q)q + KPqUqX A) ~ A* y *qR _: qNq[A`u: q]"q}^ l Ph* +(;<h +x(;0h +k8;h K:8;h KG;h WM; h 5X; h Q;h +D;h +;d ; +;E +;6 F;, F; +qhD 9 g `fMg.g! խPd3 ;d` ; +;E ;6 +<d4 < y :/<fR& +=hI  1=k $=U T~=k ;= +=X =H]" }=H]:p=]K : =]Lo=_+5= +]M  >]$)  >">]&+ +#>hM :#>k 5> +q {q +%<p>q <p> + +> q Q>hV * +%<k?q <k? + q?q( 1@q( ^n@q% k@q% +̑@q N@ J,mq At7  t" s` Nt +:Atr :A :At~ +AtH #;At7! A +t[2 Ath tj 5T Atn +Atk #;At7! + +IAt IAW! 5QATO +]A TQ!]A T@t! 9>-< DP < +`DP a + +GPa$ GPU@<-p fPIdS< FSt't/ #;Йt7!t0( #;@t7!StE m b  +U:VWtP[tMt aWt +LY t$ LY %b +L!Yt0 L!Y%b < Ǡ|E< @)<  f<-  f  fI ?G(ft (f +> HSf B[f * +qAf+i Bf .0+k`BwNwfwZw `PN rf mf +fN rf F  +@$ b*g/0! +U*g/ +*g/> y*g/< p<- 3gIΓд5 Z*m0  ` x K{ L0]@`L ж P@ :Z+LgZ,o |p  !7P>F- +i5G G +<G <  +< +E +M E"6<>G 1>b>G@?"/ +@? _p? ?F K8 9?+8B?8@ L6Z8 +KAZ= +?6Z +$AZ= +AZ +Z wZ MP@8 M@M@MAءPA A<& +4 <r4  L6 8 +KA = +?6  +$A = +A  +  w  B?8 XX 8 X ? |F +p8 d F ++ C({BF]AF +d; d?z +n; n? j% B;]%pB{ MB{ B{ +"%~ { i>~ {( +M +{ +k +;% +, +A + +5; +گ +5 +ͯ ^ ^ '{ fCF +P +> D7Lg@C> pC> E& +MG +F + +F  +? E E, ?zxCF x v I +(B j? wB  3g&FCFE@gD0D> E% +MG +F +F ?  E&  ? +DD +> DH7\ ]`DF +N ; N ? j%D;]%D{ +MZ{ Z{ +"%Z { i>Z {( +M~{ +k~;% +,~A +~5; +گ~5 +ͯ~ ^~ ^ +{ e q / +(B j? wB  %{ eF( q / +(B j? wB  qF / +(B j? wB   W +; Fc4JFi +( F j ?&JF %,{ +#{ #{ +/%{ B{( +P{ +F +A\ +A +5; +T5  ##{ Fu%XF`=W> +u +F q$FKW +rFr ss Fs1tF W +F q2F Y F'1t6tF"W +m +F KF&B0KF  +K ЕF E1F + l" M" M& ء& &<& ++ <r+  +KF +K5 +K5; +K5 K !S ѬKFK\ +k< k kI ݬF Wv + F LF B@LF  +L ЕF E1F +H lP MP MT ءT T<& +Y <rY EW +m +FLFL\ +<  I ݬF  Wn + F.W + +FPw0&W. + +F`\W + +F +B`F +` +`5 +`5; + `5 +`  .`  .k MF@M\ +w< w wI ݬF  W + +F#W + +F1 +@eF6 B F  ? %YF %pM{ +#{ #{ +/%{ B{( +U +{ \F +\A\ +\A +\5; +T\5 \ .'{ We*F> "FCN+MFD ZrM B 4  ?Nr - -FN QFR +Z+fFV frfD (fv jf?Nrvw W(F^ W +4}Fg +@_Fh B F  ? %SF %N{ +#{ #{ +/%{ B{( +{ F +A\ +A +5; +T5  '{ 4}W1 +m +Fm +Fn + 5; +'5 + ; ; W + Fq!pW( +F} W6F#F+Gfpy3W  + +{Wk + +{fPf=g{yW + +{{4 +^y{ +QyA\ +5yA +(y5; +ޭy5 y +$z{ +OzK{E +Bz35; +z35 +z3 +z3 z z  +Kz+{E= 6`z *`z `z m`zx vPI +(ezB jez? wqzB  z$W +' +{ +$z{ +iz{E +\z5; +Bz5 z Wo + +{${{0h7X@ +Xp| X|] |6 ?z |<)  +N +< YI+ I%b YJ|< +YJ|(/Yз} }4 ?w}JY|> |G ? W/|L 8'|d >~P |ds0|e apK !AK~d RF0(< o^pJX Y*"  +* 6 +JYB +6 + 6 + K K K K@ +N +< YI+ I%bpK *nj b:s@ py.t' лt ίt 0t 't +5'> )'< <-  I ?Gt  +> +{j&: +F& \ +<  I`* R*$ \ +<  I O |f p  p E  |e +*{E +v*5; +[*5 * R{zW  +Y +{{4 +^{{ +Q{A\ +5{A +({5; +ޭ{5 { +${N{ +{{E +{5; +u{5 +h{ *{ *!{  {E=Peq/ +(C{B jC{? wO{B  {{fdd{{p{nWk + +{ +$t{ { +1<t{ {^ +t{  +Ot{ 5 +Bt{ 5; +t{ 5 +t{  +t{  t{ {{ +^{{ +Q{A\ +5{A +({5; +ޭ{5 { +{${ +{$5 6{ *{ { m{x@vpI +({B j{? w{B  {@W  +H +{ +%{{ +><{{^ +{ +{5 +{5; +u{5 +h{ *{ *{ +^{{ +Q{A\ +5{A +({5; +ޭ{5 { +|{ +|5 | | e| q +| / +| +( +|B j +|? w|B  *ll +{-r+ +{-Ht +{-] +{-+{\^{\Z{#O{#dId{#K{#`{ +d{ +{i{ +{ +LM{ +oMM{NN{HNN{ +Cee{ +ee{ne{ +oe{oe{ +oe{pp{ +qp{XcX{ +ZQ@W +$:&о%T0*nj` b:s y. t' Pt ίt t t5>)@< <-  I ?G4t 4 +> +{j*: +F* \ +<  I 5* +R5*$ \ +<  I  S Y*" * aW% + GsWT + +G7 +G8 l M M ء <& + <r *W +_GNMW+ +1G 1  P%1 +p&{ &{ +%{ K<{( X<GW +AG ^GזіGCW + +G / pG *G^G 77 +6 *7 Y W1#W*^ G 77 + +6 + *7 + Y W1ܗGW<7+PGu +9G 9  P%9 +p/{ /{ +%{ K<{( X<G +,HGu - ?d2  +4  +?{ +xGu& v I +(B j? wB  ˙GW +Q +G-G+G +4G 4  P%4 +p&{ &{ +%{ K<{( X<G8G A ? d6E e< 0d H ?x G1vPI(B j? wB  W-+G +0G 0  P%0 +p&{ &{ +%{ K<{( X<G +8TG A ? dBE e<( 0d( H ? +xG1 v I +(B j? wB  Wa + +GX G |G# +cGW + +G 7G/!7GI +i5G <@G <p +< +E +M E"6 G <G 1bG@0"/ +` _ JB +GW + + +GOWa + +G |W + G!r<@G# 1pFG# +(N:|" :|"~F" +V| +"! V|C(q"bd0 Ik| Ik|%' s}@G#1`G%6 +|GD|7 <G +uM| G | D| 7) G%BL +|< | |IW7G?W!7 +i5G <0G <` +< +E +M E"6 G <G 1bG@ "/ +P _ Wi5<G < +<  +E +M E"6 G G=IG\t +GGIGrYF  sss{(Wv + +{ [{ +<%{ B{(,W +O * +8(+ +   W/ + +G OW + +  ,W8 +     Kyyyy~O2@_@~BDz~O +$Z~F +gG(z  +: ^F(z(e: 5e;  Y*"v~Eyyz~ WF + ~WF +~ G~ WG +R +~ T~ W7G +U~ a~  WjG +M~3 n~4 WG + ~E {~F WG +U~f ~g @W +H +<~y F<(M 6JA +6 6 o^=JAe   Y*" * 7@=JYWC +2~|Kp=~} F=(Q 6 J +6  6  o^=JAe   Y*" * 7>JWD +O~RWPD +FS~X0>~ ^F(i&g`>(iMe   Y*" * D>(i_WD +~>~ RF>(< 6JYB +6 6 o^ ?JXAe   Y*" * 7P?JX\WD +Q~1?~ wF?(@ 6 Jc +6  6  o^?J_Ae   Y*" * 7@J__WLE +R +~>@@~ Fp@(M 6JA +6 6 o^@JAe   Y*" * 7@J\WE +2~KA~ F0A(Q 6 J +6  6  o^`AJAe   Y*" * 7AJWE +O~UWRF +FS~XA~ ^F(i&gA(iMe   Y*" * D B(iWBH +H +~WtI + +~| ^~~" +^~ +LX~ +~ ( +^~ +YX~ +~ ( +^~! ~3 +_~! ~V yPI~IBwINwIfwJZw@J`pJJN r m +N ryJ~KBw0KNw`KfwKZwK`K LN r m +N ryPL~LBwLNwLfwMZw@M`pMMN r m +N rWI +MJ +~WVJ +=~Jg]~CWO +=z~C +M; 0~C#WK + +~ c ~* +M~ M M MMRءR R<& + <r W9L +MJ +~WM +H +~R +~x J~BOW& + +~xOWy + +~OW + +~OW' + +~W{ + +~Kt~ WRA +A +~8.~.~ +5() ++55} +J5 Q5%e /( 5e  Y*" ~ P/~a/+!/Bw0NwP0fw0Zw0`01N r m +N r~^WA + +~ 8~ >~P ~ O~ +O +5(> )(< <-  I~ ~ M!~M@1ءp1 1<& + <r GWA + +~ +8~ >~P ~ +E~ +( +( +5(> )(< <-  I1~ #2K KM +KN + C( +KN +- +02KO 5`2+2KP2*nj2 b 3:sP3 3y.3t' 3t ί4t @4t p4t54>)4< <-  I ?G!t ! +> +{j*: +F* \ +<  I >* +R>*$ \ +<  I +m KV z  3 K0 ~ +l!~ M!M5ء05 `5<& + <r R +WA + +~4 +8$~5 >~f +O ~6 p  p E |WWW~qXiX~WLX + +~  +( WYX + +~  +( W#Y + +~(  +( f \~''XW^ +LX ~ + ~  ( W^ +YX ~ + ~  ( WH +p ~WI +~W^ ~3 W_ ~V WDI +Y~uD~v @D(hpD*njD bD:sE 0Ey.`Et' Et ίEt Et  Ft5PF>)F< <-  I ?G)t ) +> +{j*: +F* \ +<  I 8* +R8*$ \ +<  IF(p F*njG b@G:spG Gy.Gt' Ht ί0Ht `Ht Ht5H>)H< <-  I ?G+t + +> +{j*: +F* \ +<  I /* +R/*$ \ +<  I I~v YY~ZW~1ZiX~aZZ~2ZZ~U[WJ +E\~ )~ WK +A\~ 6~ ^WcWPK +_@~ +I~ +e (5e ( +5(") ++55} +J5 Q5% +e(# 5e ~ WK +Y~VM~ +(E + +) +@) +@o +@ + +*u  p" C( N(EM@N(E;MpNMNMNMOء0O `O<& +<r O~ WK + +~pO~ cO( (! b(b P(PP"/ +P _P BP( $Qs@Q pQt ίQt Qt Rt50R>)`R< <-  I ?Gt  +>ZaC~eaWL + ~NWL + +~aW"M + ~}WUM +M +~5 S~ PS= S)# + S) S): g): + )# + +< , b  += Y =  + T~ @T~ +G~ BwG Nw= fw% Zw%`pTTN r m +N r +B~ 8 Bw8 Nw8 fw% Zw%`TUN r m +N r +$~ +M) + +) g): +=#) І +G~ BwG Nw= fw% Zw%`0U`UN r m +N rU~U*njU b V:sPV Vy.Vt' Vt ίWt @Wt pWt5W>)W< <-  I ?Gt  +> +{j*: +F* \ +<  I T* +RA*$ \ +<  I ~  ~A H ~  ~,~J~(< + 9  pW?( + p +p\+ pC(WZ) + + +| + +\+ C(Wm* + +  + + + +\+ C(WWMl{j !2F  @ \ +<  I## W~+ + N +b@O +s@ @y. +@t' +@t +ί@t @t +t +5+> )+< <-  I ?Gt  +>Mlp O {j !2F  \ +<  IxW, + wMl0x {j`!2F \ +<  I W, +  W;- + W- + W. +  W}. + W. +  WX/ +  W/ + W+0 +  W0 +  W1 +  W_1 +  W1 +  W*2 + W2 + !2W 3 +J += dWC + +U  W % +<% +m Wg% +% +m@ W% +% +mW& +O& +~PW|& +& +~W& +' +~W:' +h' +W' +' +`W' +( +=.W + +D.DI/Kh**N}W +ƫ.e/@&p 5>)< }<- } }IJ& I0%' b`&b&"/ + _  3L~&݈P& )`< <-  I ?Gt  +> &&' +E +6 F, F +&'Pt ίt t t5@>)p< <-  I ?Gt  +>&  P) < s<- s sI ?Gt  +> +uM &'  D 7) +N&(N NPN rN"+5WD,/Wx +A B F`&+ F" + +"! C(q"bd I I%'  F &, FP" + +"! C(q"bd I I%' +N&&2N N!N r +q &/ + &D 7 +e&0 5e  Y *" * h&0 +uM &1  D 7) +N&2N N  +N r +N&2N N  +N r [@BW +B W1C  W +#k +l Fp&5F" + +"! C(q"bd I I%' +q &8 + &D 7 +e&9 5e  Y*" * h&9 +uM &:  D 7) +N&;N N  +N r u0l#W +m W1muWZ! +./ &L i=&L 20&L;`&d >< <-  I +&e( +5} +J 7% b&pb &pP"/ + _ &pt ί@t pt t5>)< <-  I ?Gt  +>"0&u(z` ݖ<& +<r v=&L W! +U V &B v=&B=P&B&F B)$s@ pt ίt t t50>)`< <-  I ?Gt  +>  +) WW! +% O&X &Y &Y@&YBp*nj b:s 0y.`t' t ίt t  t5P>)< Z<- Z ZI ?Gv t v +> +{j&: +F& \ +<  I 5* +R5*$ \ +<  I*W! +KW! +&" +fee D7 K + 9 +? @ ޏ " 0$ / ' h 5T 80!+`  +>< =< +`a + + a$ UP<- I <5 E0Z& =p 0 &t +5&> )&< <-  Ib b+ "/ +P _   P. Z+JZ, 80 Z. +;O   & x f?uM`   D 7)  +J J%bVwW + +4dn +Wn + +0 +1 /? W + +: +; <? +K<I%' \W + +F +? W6@! W_ +G +H I? +KJ I%' 5_"HWh +` +q:e r)% 61^ 61 "`Wt +j q`m"pW +q +qv{ _"Q2 q)) r) 6^ 6 6+ +6 6 , q - "uW +ŀ +qfŅ q7,  r7, 6?^ 6? kl".W,+ +Ń. P]W3 +g +r0N" rgU Yy r`N` aN% L0 B +5;C ,;?aNP +B/ B?a O1 +'U. +RU5} +KU HU% W@$ W@( QQ& 4SMy% +_S5} +KS US%POM O? M c? sO,'Oy.Pt' @Pt ίpPt Pt Pt5Q>)0Q< <-  I ?G!t ! +>`Q3Q +8 `FW `F{( E | FW@Q5 eQb R6 PR6r R?R6 4R+!\ S PSN r W +O % + +tWȒ +ȊWp + +ȡ ˫Ȣ B3 6W BH6W BM56W BY6W B^06Wܫ l ܫPTo ܫTp ܫTq ܫTr ܫUs ܫt ܫ u ܫ@Uv ܫpUw ܫUx ܫUy g ܫVz ܫ0V{ ܫ`V| ܫV} ܫV~ ܫVʀ ܫ Wʁ ܫ m ܫn ܫʲ6ʻ&ܫʼ ܫPWʽ ܫWʾ ܫW ܫW ܫXܫ@X g ܫpX ܫX ܫX ܫY ܫ0Y ܫ`Y ܫY ܫY ܫY ܫ Z ܫ g ܫPZܫ +ܫ ܫZ 8Z Z w[ 8-  w ܫ@[ ܫp[ Ȣ ڦȋ ͦȓ 5 +v , +? ͦȔ 5v ,?щщfO BNu W +؉̂ W"/ # BKyWM + +LW + +OW' + +UW + +XW +k +[Wr + +^W +I +dWR + +gW +6 +jW? + +mW +# +pW, + +sW + +vW + +yz, --m-d[2BBd<GttdC-m-d2;0<dBBd +z ZDDd=F>GdGuHd^TTdXOYd\RYdttdΙVd4>5d-N2 #.c.g..g-45g56gj<<g=B=g;==g >^>g>>gP??gWs@@gAKAgI,CyCg~%FdFgdGGgwMNgWx +2#g +2#g. +2#g! +խ2d3 >d` > +>E +>6 F>, F> + +Md4 M y +U$g +ڮU$g< +U$g! +խUd3 bd` b +bE +b6 Fb, Fb + +qd4 q y 5g(@gJpg! խd3 =d` = +=E +=6 F=, F= + +Ld4 L y ggX0g! խ`d3 Sd` S +SE +S6 FS, FS + +bd4 b y qg! dgXI\\gnddgg0ig4ggZ< dW +lZccg.0g! +խ4!d3 Ed` E +EE +E6 FE, FE + +Ud4 U y v`ci >< @<-p iIc 9g @fMg.g! խ`d3 d`  +E 6 d]& +d4  y : fR&ͮc*9g U,f` +U,g. +U,g! +խU,d3 gd` g +gE g6fa: +fa$ ff +g. +g! +խd3 d`  +E 6fg:fg 1fl +1g. +1g! +խ"d3 d`  +E 6 + d4   y  c p 9 +, +9isg fMg. g! խ`d3 d`  +E 6 ԩd]& +d4  y :fR& c> +Oc? +9Og fMg.g! խ0d3 d`  +E +6 F, F + +d4  y :,fR& S c?w66cg5@@cQS]cEucc56c!c&]cJcJcJc)'cYoc!sc=c/c}ac c'cc3ccccpuc%K*KhKhKKhXLLhIMMh"W +o +hͮ`h$9g f` g.`g! խd3 d`  +E +6 F, F +fa:fa$  ff + g. + g! +խ d3 d`  +E +6 F, F +#fg:'fg 8fl +8g. +8g! +խ8d3 =d` = +=E +=6 F=, F= + +Nd4 N y h h h$ + bh| +9 bg fMg.0g! խ`d3 (d` ( +(E +(6 F(, F( + +5d4 5 y :IfR& +nbhh +9nbg fMg.g! խ d3 d`  +E +6 F, F + +d4  y :fR&PhZg +ڬGg +ڬ+gX +ڬ&g! +խڬ#d3 d`  +E +6 F, F + +d4  y dgX +5&g +(&gJ +&g! +խ#d3 d`  +E +6 F, F + +îd4 î y +!bh3! +9!bg fMg.g! խ@d3 =d` = +=E +=6 F=, F= + +Jd4 J y :^fR&ph +th +9tg fMg.g! խ0d3 d`  +E 6 +d4  y :έfR& +7"h +խ"d  d`   + E  6 +\1ht +1gy +խ#d3  d`   + E + 6 F , F  + +d4  y +5A&hx +(A&gJ +A&g! +խA#d3 Sd` S +SE +S6 FS, FS + +dd4 d y `hNg +g +gX +g! խd3 +5V&g +(V&gJ +V&g! +խV#d3 hd` h +hE +h6 Fh, Fh + +yd4 y y +&+h ++h +ڮ+g< ++g! +խ#d3 d`  +E +6 F, F + +d4  y +3*h +5*h +(*gJ +*g! +խ#d3 ,d` , +,E +,6 F,, F, + +=d4 = y +D'h +ڮD'g< +D'g! +խD#d3 Vd` V +VE +V6 FV, FV + +gd4 g y -:~h +h" +g +5g +(gJ +g! խd3 -:h +ЯLh" +ЯLg +ЯLg +Я+gX +Я&g! +խЯ#d3 d`  +E +6 F, F + +d4  y dgXBhR +$g +$d  b%d= % *,70gխ`d d`  +E 6Dg +d  +E 6 F hRh +Soh +9Sog fM@g.pg! խd3 td` t +tE t6 +d4  y :fR&7hխd  d`   + E  6 +@Ұ!h +Ұ!h +Ұ!g. +Ұ!g! +խҰd3 ߰d` ߰ +߰E +߰6 F߰, F߰ + +d4  y +;1h +;1g. +;1g! +խ;"d3 Ld` L +LE +L6 FL, FL + +]d4 ] y +l"h +l"g. +l"g! +խl"d3 }d` } +}E +}6 F}, F} +O0h :`g f}g.g! խ d3 رd` ر +رE +ر6 Fر, Fر + +d4  y :f&PhVg + Gg + +gX + &g! +խ #d3 d`  +E +6 F, F + +/d4 / y d7gX +5˹&g +(˹&gJ +˹&g! +խ˹#d3 ݹd` ݹ +ݹE +ݹ6 Fݹ, Fݹ + +d4  y +Sbh + +9Sbg fMg.g! խ@d3 od` o +oE +o6 Fo, Fo + +|d4 | y :fR&iph; +ݲ+g +ݲ+g. +ݲ+g! +խݲ"d3 d`  +E +6 F, F + + d4  y gڮg< g! խPd3 td` t +tE +t6 Ft, Ft + +d4  y +,g +,gX +,g! խ,d3 +1h#! +1g. +1g! +խ"d3 d`  +E +6 F, F + +*d4 * y +9'h'! +ڮ9'g< +9'g! +խ9#d3 Kd` K +KE +K6 FK, FK + +\d4 \ y +5s&h+! +(s&gJ +s&g! +խs#d3 d`  +E +6 F, F + +d4  y +Bh/! ++gX +&g! +խ#d3 dzd` dz +dzE +dz6 Fdz, Fdz + +سd4 س y dgXhg +*Gg +*+gX +*&g! +խ*#d3 <d` < +<E +<6 F<, F< + +Md4 M y dUgX +5&g +(&gJ +&g! +խ#d3 d`  +E +6 F, F + +d4  y +5&hF +(&gJ +&g! +խ#d3 d`  +E +6 F, F + +d4  y +7´#h +խ´#d Դd` Դ +ԴE +Դ6 FԴ, FԴ +h^g +Gg ++gX +&g! +խ#d3 /d` / +/E +/6 F/, F/ + +@d4 @ y dHgX +5Һ&g +(Һ&gJ +Һ&g! +խҺ#d3 d`  +E +6 F, F + +d4  y +dBhB! +d+gX +d&g! +խd#d3 vd` v +vE +v6 Fv, Fv + +d4  y dgX +Eϵhb :ϵk p;Եhb +_h +9_g @fMpg.g! խd3 "d` " +"E +"6 F", F" + +/d4 / y :CfR& +eYh +9eYg fM0g.`g! խd3 d`  +E +6 F, F + +d4  y :fR& +жhJ +жgX +жg! խжd3 +1hl +1g. +1g! +խ"d3 (d` ( +(E +(6 F(, F( + +9d4 9 y +H'hp +ڮH'g< +H'g! +խH#d3 Zd` Z +ZE +Z6 FZ, FZ + +kd4 k y +.h +.g. +.g! +խ"d3 d`  +E +6 F, F + + d4  y +'h +ڮ'g< +'g! +խ#d3 d`  +E +6 F, F + +зd4 з y +\1h +1gy +խ#d3 #d` # +#E +#6 F#, F# + +4d4 4 y +5X"h +(X"gJ +X"g! +խXd3 fd` f +fE +f6 Ff, Ff + +wd4 w y +5h +(gJ +g! խd3h gX g! խPd3  d`   + E + 6 F , F  + +d4  y d$gX +h= +g +$g +$gX +$g! խ$d3 !hbOO+PhV/QQh0}RRhlSSh&PPPhQ)Rh'SMhTLhWK +Lh hz Oh +-ihD ih  h} h :h?h @h phI h GhS h h' +-,h ,h :0h`h h +-wh wh +-h h +-h h +-h h :hh  h:Phh h h _h +-yh  yh +-h( h +-h+ h :hO@h ph hw h  h 9h +-ShP Sh :h]0h `h:h{h h: hPh h-h h :h@h ph +-Fh% Fh :h:h h 0h h -`h h W +Jh Qh +J9Dh QDp_"  Uh + Qh3 ``ehWapa"XheKeh<eehPffhfgh |ggh hGhhMiXiih6\rrhhdh$HuHhH,IhddhMeehssZsh ssh +Xuruuhvh {hVPZ"XhhC GhU %GoGh2 h* NNNVOkGmlZkmmk~n khhhk3 jjlZkv kVjcjlZkjjkkIlkllkkуk5 +TUJUm4UUUmzgWtWJUmYW$W + +l Fl4Qm5 D + m6 +d  +E +6 F, F + B2m7 +2g +2d  b2d= % *0 H@l7QHm5 DP m6 +Yd Y +YE +Y6 FY, FY + B\,m7 +\,g +\,d  b\,d= % *p lQmD`m +d  +E +6 F, F + ?:m,Dm +*d * +*E +*6 F*, F* + 0m +0g g  gXPg! խ2d3 +d4  y q8g! dgX +5g +(gJ +g! խ +d3 +d4  y l );l8Qm D m +d  +E +6 F, F + B'm +'g +'d  b'd= % * &lQm5 Dm6 +d  +E +6 F, F + Bm7 +g +d  bd= % *aelHbbl~cdlcdll4aalVlԗlwWWW"XnxYYYnP(Z1ZlZn.ZZnZC[n'WS[[n W' +"XnD"n#]Pn d W"n nu +nc@ +g. +g! +խd3 d`  +E +6 F, F + +(d4 ( y Pnf*9g fMg.g! խ@d3 `d` ` +`E `6 +ud4 u y :fR& +j"LnW n/ n0 w"nX "pnZ +mni+ +9mg fMg.g! խ0d3 d`  +E 6 +d4  y :fR& +Mjnm+ +9Mjg `fMg.g! խd3 dd` d +dE d6 +yd4 y y :fR& +gnq +9gg  fMPg.g! խd3 d`  +E 6 +d4  y :fR& Cnx `ny n|n}9 g @ fM g. g! խ +d3 d`  +E +6 F, F +  d]& +d4  y :fR& +i`nj) +9i`g @ +fMp +g. +g! խ +d3 d`  +E +6 F, F + +d4  y :fR& +`nn +9`g  fM0 g.` g! խ d3 d`  +E +6 F, F + +d4  y :fR& +)\nr +9)\g  fM g. g! խP d3 Gd` G +GE +G6 FG, FG + +Td4 T y :hfR& in iEn" n) 9 n Q8 +o"D o# +Qd Q +QE +Q6 FQ, FQ +DX o$ x@ o' +g +g. +g! խ d3 +d4  y +g +ڮg< +g! խ +d3 +d4  y +5g +(gJ +g! խ +d3 +d4  y  g gX + g! խ +d3 +d4  y qg! d gX 4n# n) +8n nE nF in"n! 9Pn Q +o"Do# +"d " +"E +"6 F", F" +D)o$ xo' +Ug +Ug. +Ug! խU d3 +^ d4 ^ y +g +ڮg< +g! խd3 + d4  y 5g(@gJpg! խ +d3 +d4  y ggXg! խ +d3 +d4  y q +g! d0gX"`n! 9n Ql +o"Do# +d  +E +6 F, F +Do$ x@o' +g +g. +g! խd3 + d4  y +g +ڮg< +g! խ +d3 +) d4 ) y +52g +(2gJ +2g! խ2 +d3 +<d4 < y ggXg! խD +d3 +d4  y dgX"n 9@n D o$ xpo' +g +g. +g! խ d3 +d4  y +8g +ڮ8g< +8g! խ8 +d3 +Bd4 B y +5Jg +(JgJ +Jg! խJ +d3 +Td4 T y +[0g +[gX +[ g! խ[ +d3 +ed4 e y dmgX+Z#^g^nCbb+cnFnnxn&.[\[o.6_o0^6_p^1B +x` ` a x8'c `c x8d e x8f f x8Uh h x8j Lj x8k l x8m m x8Yo o x8f5 M44fH5+6f_E4fve55f4 hLFMic<RVViGHi pqqmqqqroxNNFMj=^FMj=_FMj=}FMj=qqUCcCq#GDq4eTkTq4\q) q}Yq#W +Y +q ;@qpq5 I < gX0>g! խ`>d3 & d` &  +& E +& 6 F&, F& + +Ed4 E y qg! d>gX5>g (>gJ ?g! խP?d3 q d` q  +q E +q 6 Fq, Fq + +d4  y &c# Dc& c' +1c)* +1g. +1g! +խ(d3 d`  +E +6 F , F + + d4  y +5c0D +5g. +5g! +խ+d3 d`  +E +6 F , F + +0 +d4 0 + y ?c5?g.?g! խ@d3 d`  +E +6 F, F +@@c6@g5@g! խ0Ad3 d`  +E +6 F, F +Ac7Ag.Bg! խ@Bd3 !d` ! +!E +!6 F!, F! + +3 +d4 3 + y +L*cC +L*g. +L*g! +խL"d3 Td` T +TE +T6 FT, FT + +nd4 n y cH% +7VcI' +խVd d`  +E +6 F, F + хcL'BBcP!BgBd  bCd= PC% *PCd= C  FCXa F D +7PDgխDd hd` h +hE h6DDg +d  +E 6 +]cQd ޅDcTE @E +#@[<  < +` a + +a$ U[<-[  I;< F t'[tA P\ +t/ 5t`! + t0( 5 t`!\t3 \ +(dt3 +@>  @ X g S ]tE ` m] b] U^g< z&< +`&a + +& a$ & Uh<-0h $'ISI'< GW't W' +>h' t5`hc& (u' SѭhS ht it Piti>i< '< +`'a + +' a$ ' Uj<-@j 'I՘' +< %G' t ' +>Ȇ' tpjc) ( SĭjS jt y kt i`ktk>k< z(< +`(a + +( a$ ( U l<-Pl 4(ISa(< Go(t o( +>( tOlc. B( SޭlS ¯0mt mt ՆmtPn>n< (< +`(a + +( a$ ( Uo<-@o (I_*< 2G(t ( +> Q)c1 E )c4 +E4)c7 +AZ);  v)c3`poq soc pq,pc -cpc +]v-cg v-d `rck +-#c +-#g. +-#g! +խ- d3 -d` - +-E +-6 F-, F- + +-d4 - y @tc9tg tfMug.`ug! խud3 `.d` `. +`.E `.6 @ d]& +|.d4 |. y :.fR& +7]/.c" +խ]/.d f/ d` f/  +f/ E f/ 6 +/*c +/*g. +/*g! +խ/%d3 / d` /  +/ E / 6 +/d4 / y +@0{c +9@0{g vfM@vg.vg! խvd3 `0d` `0 +`0E `06 +|0d4 |0 y :0fR& +0c" +90g wfM@wg.wg! խwd3 0d` 0 +0E 06 +0d4 0 y :1fR&Oxc% :0xg `xf}xg.xg! խ yd3 1d` 1 +1E 16 +1d4 1 y :1f& +2c +92g `yfMyg.yg! խ zd3 @2d` @2 +@2E @26 +\2d4 \2 y :s2fR& +2c# +92g `zfMzg.zg! խ {d3  3d`  3 + 3E  36 +<3d4 <3 y :S3fR& +4'c# +ڮ4'g< +4'g! +խ4"d3 4d` 4 +4E +46 F4, F4 + +4d4 4 y Q5c. +D'5 c +05d 05 +05E +056 F05, F05 + +35c$ +35g. +35g! խ35 d3 +<5d4 <5 y +S5xc' +9S5xg `{fM{g.{g! խ |d3 p5d` p5 +p5E p56 +5d4 5 y :5fR&B`|c) +5/g +5/d  b5/d= |% *5 +7;!g +խ;!d ;d` ; +;E ;6 +D4;'g +=;d =; +=;E =;6|c)9|g  }fMp}g.}g! խ~d3 06d` 06 +06E 066 Ad]& +L6d4 L6 y :c6fR&x`~c# +60g +60g. +60g! +խ6%d3 6 d` 6  +6 E 6 6 +6 d4 6 y +5J<0g +(J<0gJ +J<0g! +խJ<&d3 T< d` T<  +T< E T< 6 +p< +d4 p< + y +z<.g +ڮz<.g< +z<.g! +խz<&d3 < d` <  +< E < 6 +<d4 < y ~g~gX +<+g! +խ<&d3 < d` <  +< E < 6 +<d4 < y qFg! dgX@c!9g fMg.`g! խd3 +c:d4 c: y :w:fR& +:c& 5:T +:T:T p;Cc% +u=c'=d =c A +c) Ac) iB cncc9 +;/ c>;/ v +D/c c K v >cW >cY.PcY +>c>>vc KvNc~@c  Є EAv +IAc Pc Kv +Ac>Av +Ac q t, +_J, SJ,%b , J@  p +Da< pH < +`pH a + +rHa$ rHU H<- H HI:H< FHt' +bIt/ 5bIt`! +It0( 5It`!nt3 b  + +Iet3 +0I>  I J J SPtE `fJ +m b U0 +ԍQD `0xzN rPQ  bQ bQ UbQ <& +mQ<rmQ q{Qq! +Q;q ;Qc +Qc Q  Qq.@q#~p  +2Re& lnV MnVMЙء 0<& +V <rV  2V% ܢV% %V<& +V<rV nVq +zV2q `D V<& +V <rV  +IVkq +VJ tV > +ԍW: 0xz `N r0W  EW EW UEW <& +PW<rPW +ZXSq +ZXS +_XN Ԛ )\8< \<- \ ]I ?GK_t K_ +>ÕZ_yqp" ch +$~\c ~\  +;\c ;\1 +$\c \  +;\c ;\1 Ec ;c Е\qm ] +qs ]qs +]qs ]z +^ qw l ^ M ^ M ^ ء ^  ^ +<& +^<r^ 1^q}- V^ +q| +lv^,q Mv^,Mء @<& +^<r^ ^q| +^q| ^z +^ q + l^ M^ M^ ء^ ^ +<& +_<r__W + +q _q _q1pq# :,` ~ :` y>q2:П ~ 5q4% 7 a zK0q< `   <q< +`  ݕ`  +`  +` \+ `C(rq^qHaJI JqpaWS + +qq!xh3 k`h K:h Wh Kh3  +uoh3 .od 0q# +achD  +9acg `fMg.g! խ d3  bd`  b + bE + b6 F b, F b + +,bd4 ,b y :@bfR&`hI  1}bk $}bU T~4ck ;4c + +Pc_ PcO]" }PcO]:pPc]K : lc]Lolc_+5qc +]M c]$) c"c]&+hM :k Fq @q {pq +bq QbhV *q#hD 9 g PfMg.Хg! խd3 md` m +mE +m6 Fm, Fm + p d]& +md4 m y :nfR& +.nhI  1.nk $.nU T~Dnk ;Dn + +Xn` XnP]" }XnP]:pXn]K : un]Loun_+5zn +]M n]$) n"n]&+ +nhM :nk n +q {Pq +nq  QohV *Zq c +qL {qL! qZ0!l$:8Чl QdnD0n + hd  h + hE + h6 F h, F h + ?:`n, D7h&n +Zhd Zh +ZhE +Zh6 FZh, FZh +n Шg g @gX +eh g! խeh +d3 +ohd4 oh y qog! dpgX +5h g +(h gJ +h g! խh +d3 +hd4 h y ~hn +9h+Khn' ++"h l Qh lx +VeqM QZehV * +%<eqg<e + e +qh$-qq% Щh -qt' 0h +%<[gqb<[g + qgqc$ :i(qĠ`q} ه   "\ +lsw VӪf> +? 2  ! ! B B @ u y  ̒ + ! B! +QB B + R ȢlX̢עPC^Цl[p*lU4v,q/ ow:v  I  ( 8 D EԈ _ `ntD L @ @    ^ W! H" 4n ȃ = I, z #7  ,gC C oeT D 7d? D H0A D KP ,Q DS S ? K 0n??gE? ˆ ?   k  Y mב   FMne/ P/ / / / 5Z0 4@m WFPm W95 ; K46 Vw4Vw mW0; x; @6 7 (7 / +`m9W; wm  # +\07 n7 sn( n > f!n" Z!n nF fn" Zn nI `- fn" Zn nL fn" Zn n-M" - fn" Zn o6V - fo" Zo hoaY2 2 2 j}W: :  j zj fj" Zj k2  - f4k" Z4k Pk ^k  gkE 0 < ftk" Ztk k k8 / 6Y8 8 2 2 ;3  3 ,4  54 |4 (4 4  4 5  5 `5 7m5 5  5 5  0lGW; c zp d KlSKlN KllW; k ln  5 p  l< cl RlI  u0 B0 i W8 B0  i  9i 0 0 i W 9 0  &i  Fi - +1 1 1 jjWg9 9    }0  `  + N *j 3j3jN 3jpjW3: 0P G3 a 3 g7 }7 %n +n +2 IseGz +g?2 l2 IjWjN jjW + N jn +U#Z:i6 6 ɠr; Pu +:g +W 0 9>PZ9-WD UqqB a ` U`  GI a I ͚ ; ? c 0@ D Z Z x< G< D sE Y M Z D[ Y= +Sp= DKD)DV? ,^> > ؀O P w_ e ~U B 8yUoM Xb` ` Uœ  J W Y= 6 <(? g? y]  p|]  ^  ]  [] w .@^   +@ +5 + <WeE   x` = + RW \0 r7" x(, % & +P +  E* i Ȋ hE Ȋ /I wDN N pN N P P |&Q Q R S We ل twbeJ P P [' TA  (<w  G H J(Q JX J.e e  +  B  =؃ +/d j CFqgD F cF I  KJ J M 7N ?O |O b z g 3b  ߉   x D͚ iA *? ͚ C ?Вt XJ ͚ K L ?7L L ͚ FMa eb ? t +A "  }  e [ Ni  itF G tG G VB +Γ H H .T H  H  H (S G lS G d d  f Γ f / Nj G  G  @  Ύ 6gΓ  / /3 @  Ύ  G ( G Qt^tb c W W )c %d a , 1w , 1g $g g V f X eX X e^ ^ $Y Y Y h !  + + C EC J J T T  Y iY Z KZ ځ +\ \ +a da a 0h   s і  )' +(LRC C /V }V L?YU +U U 56E EE  +pk k 9l zl Ll ,m m )n .o po =p p 0q oq r r t \t $u fu tv v  w bw ox x y ]y 'z iz ${ fu { | | ]y } ]y o , n  n  ,m  + L Z L ) L  S^- uU U rls s F~ s F s F  ] j] #DWTyi[[#~DWyj lvp#k ].w[uF F F F eF (H  f +;R  S  `s W + j ? m  +? o +)  *  3   3 +0 8 *C C]@` 8 9 T >! Y >  ?% + p +@ k E   o c + oV + +P r +@   _&  r + r + s + @ `kE _& + t + @ +  +  +J  wA t f <t  /t 0 lt i xt t = t + f + @ kE  f  ?P +) + * +* ]@ ( 2 +P 3 * ]@ 3 + 8 * ]@ 8 9 +@ >! * ]@p > ; ?% P) [ P' c +P' f2V +P'  } / li x   =   + ~ +@ kE H "  <" /"0 l"i x+ + = + + ( +0@ 9k9 +E +?` ( +) + + 3 *1 1]@ 5 3 + 8 *Z Z]@0 8` 9 o >! x >  ?% + ! +@ kE H  +  < + / +0 l +i x  =  + E + @ kE H \ E EI0   +P  +@ 8   %! % 3  + + +@ F)kFE e +H e\e + @  +x  =  +@ <p /0 li x0 = ` + / +@ 0k E _& pH I\I ( ) c V qH . y 6 a}  +p 0K` +? +) + * * ]@  3 * ]@  3 +  8 * ]@P  8  9 +  >! *" "]@  > f ?%! r @!X +p! " +!@   +!  +"@ P"kE H \ + "  +x" " = # + @#  +xp# # = # + $  +x0$ `$ = $ + $  +x$  % = P% + %  +x% % = & + @&  +xp& & = & +  x+ + = + M 5 yM 6M MaM Y 5 Y ?Y Y) Y * *i i]@ +' 3 * ]@0' 3 +`' 8 * ]@' 8' 9 +' >! * ]@ ( >  ?% ~  m5 ) Q y) +y) +y)6 p + ) 4 ! 4@ 4 +k4E  {F 1{F   CV 3Wo/T[ n[ [ \ +\ _ W + +/P( +/(\ +k (} + ) L P) +W)+ +)   * $*  $  +?) +0*) +* * *G  G ]@ +* 3 *y y]@+ 3 +0+ 8 * ]@`+ 8+ 9 ++ >! * ]@+ >  ?% B yB6B n! ^ 2 !   \      Y  W'  + ,* * ]@ *    +    ,  ,  D D + P, ,n!, k     L   W +    * *    !|!o + , B ]@ + - !`-Gf Mf m m L}n Lp Lt Lu Lv Lw Lx Lo o a Sr [y y Lz z Lf{ LN| K n L LW < /V.=! V +[  +U  +U 0 $[ ' /[# / _ &  +  1 /V3> V[  +U 0 /[ ') /)[# / _O & P  +PP P1 /VEE? VE +[  +EU  +KU 0 O;[ 'U5 /U5[# /U _Y &Y  +]  ]1 NPU%pPV(P GJ [4 !   +QV( @QB#(rBCBC5 p{W! {B [F !  4J [4 !  Hhop` # pQ/VQ'0 Q[ 'R/0R[# / _ &  +  1 o  /V,c V +[  +U  +U 0 "[ '  / [# / _  &   +   1 ?} I} {L8~ L$ 4 L  L  L  Lk | L +<V V V Y-W oW xD` e` a a -^W^ Gf r /"s / _ &  +  1 / +t / ._- &-  +. P.1 />,v />. _P &P  +S +  S +1 jw j rx r /{} /{  _{ &{  +~  ~1  . +.@ 8    ! +  5 y 6 a c7 7 7 7g .  - -'-  / +P/@ 78 72 _Q&Q / +/@ 0k00E _& Bh JNh i Ah h fh i Oi `i Vni i i i 6j Cj Z@W ҙ  4@1 /@) _W &W  +`0 01 4041h /!B /  _ &  +  1 /@1G /  _  &   +(  (1 #5<)H eI e u +J u + L   5p141W /P / _ &  +  1 41S / B /  _ &  +  1 /G / _ &  +  1 #50H I  J /2/P2 _2 &2  +3 P31 53 /C /C 43 /SB /S _S &S  +V  V1 /4G / _ &  +    1 #50H I   +J  + L   /t/t  5@444W /P / _ &  +  1 44S /- B /-  _- &-  +0  01 /5G / _ &  +  1 #50H 2I 2 ?J ? L   5054p5W /MP /M _M &M  +P  P1 45S /k B /k  _k &k  +n  n1 /5G /P _P &P  +S  S1 #5g0H I  J  L   05  4[ / _ &  + 6 P61  5646W /%P / _ &  +  1 46S /B /  _ &  +  1 /eG /e  _e &e  +h   h 1 #5s,H I  J fWܙ   4 / _ &  +7 @71 U  /@ /@ _@ &@  +C  C1 4p7 /^ B /^  _^ &^  +a  a1 /7G / _ &  +    1 #50,H \I \ oJ o g L  g  / / _ &  +  1 474 8h /"B /  _ &  +  1 /`8G / _ &  +  1 #5(H I   +J  + JL  J48 /P / _ &  +  1 48S /1#B /1  _1 &1  +4  41 /9G / _ &  +  1 #50H I  J  zL  z4@9 /TP /T _T &T  +W  W1 49S /rB /r  _r &r  +u  u1 /9G / _ &  +  1 #50H .I . ;J ; L  /9"/ : _ + & +  +   1 /P: /  _ &  +  1 / / _ &  +  1 / /  _ &  +"  "1 /4! /4 _4 &4  +7  71 Bb +5 / / _ &  +  1 / /  _ &  +  1 4| /B / _ &  +  1 /:G / _ &  +    1 #5-H (I ( 4J 4 EL  Ej j !`W" `  /`* /`  _o &o  +r  r1 4: 4:h /#B /  _ &  +  1 /;G /  _ &  + +   +1 #56H I  J  ,L  , 4 /  +  1 /) /  _ &  +  1 Q/ 47$ /+_@; &p;  +&   & 1 hS* hS@ hA p  ~%Mj j hk `Wk j  o k .l Tn o _q q 5s Z0wWӚ m  V? + +?U  +EU +I# ('O 4OL2 /O _S &S  +; ;1 V + +U  +U  +<5'@< 5<L24<W /'P / _ &  +  1 4=S /!B /  _ &  +  1 /@=G / _ &  +  1 #51H 1I 1 > +J > + [L  [Vp= V +a +U  +U  =a'=40>a44p>h/>B /> _ &  +  1 / ?G / _ &  +  1 #51*H [I [ kJ k L   V) + +)U  +/U  P?B'? 5?L24@W /9'P /9 _A &A  +D  D1 4P@S /`#B /`  _` &`  +c  c1 /@G /P _P &P  +S  S1 #5g1H I  J  L   S  "V@ # @/V A'0 PA[ 'A/A[# / _ &  +  1 c ( VG + +GU  +MU = Q: O'W4 05W4L2 4W[ /W _[ &[  +A B1 V + +U  +U J @B\'pB 5BL24BW /'P / _ &  +  1 4CS /#B /  _ &  +  1 /0CG /I  _I &I  +L +  L +1 #5X-H I  J  L   S  W `Ci' Vf +fU d j +v'lq C'#BVB^7 V +U V +U BB!7W y  /V* V [ +CU +CU 0 [ ' /[# / _ &  +  1 V + +U  +U ~ D'PD4DL2/DB /D _ &  +  1 / EG /P _P &P  +X   X 1 #5e&H I  J  L   /V 0 [ ' /[# / + _ &  +!  !1 | | } } ~ q  q  +WX z  + V +  +U  +U #  ' 4L2 / _ &  +PE E1 U   /V' V +[  +U  +U 0 [ ' /[# / _ &  +"  "1 V5 + +5U  +;U  E'E40FL2/pFB /F _S &S  +V  V1 /FG /r _r &r  +z  z1 #5-H I   +J  + =L  =VG} V +a +U  +U  PGa'G4Ga44Hh/PHB /H _ &  +  1 /HG / _ &  +  1 #5-H I  J  L   V +U '.hHn V4 + +4U  +:U  I.I4JL2 /D'P /D _L &L  +O  O1 4@JS /k$B /k  _k &k  +n  n1 /JG / _ &  +    1 #5-H #I # 6J 6 }L  } S  'JUhJo # K/V@K'0 pK[ 'K/K[# /V _Z &Z  +^  ^1 {  L  ;hL< V + +U  +U  pL/L4LL2 /'P / _ &  +  1 40MS /#B /  _ &  +  1 /pMG / _ &  +    1 #5-H I  J  L   S   L   HhM6 # M/VN'0 0N[ '`N/N[# /$ _( &(  +,  ,1 o W /V3s V +[  +U  +U 0 )[ '# /#[# / _ &  +  1 V +v +U  +U  Nv(N4 OL2/POB /O _ &  +  1 /OG /; _; &;  +C  C1 #5W)H I   +J  + 7L  7W G  /V. V [ +`RU +RU 0 ![ ' /[# / _ &  +  1 VR V +a +U  +U  Sa'@S4Sa44Sh/TB /@T _ &  +  1 /pTG /p _p &p  +x   x 1 #5)H I  J  9L  9 /V 0 [ ' /[# / + _ &  +  1 "VT # T/VU'0 0U[ '`U/U[# / _ &  +  1 c  lWf $ /VUVU[ + VU 0 PV[ '# /#[# / _ &  +  1 V: +:U  V/D B   W  /V. V [ +VU +VU 0 ,![ '2 /2[# /2 _6 &6  +:  :1 VW VM a +MU  +TU  PWa'W4Wa44Xh/PXB /X _l &l  +o  o1 /XG / _ &  +  1 #5)H I  J  4L  4   (/  4 L2 / _ &  + +   +1 +78 /V 0 [ ' /[# / _ &  +  1 U +8X  ;/ QL2 47$ /* _ &  +    1 2* 2@ 2    E Y `YN/YQYL2 4s ($ /s  _s  &s   +   1 Y* + Z@ +PZ      !   ?Z +Z) [ * +0[ 3 *  ]@`[ 3 +[ 8 *  ]@[ 8   9 +[ >! *&  & ]@ \ > @  ?% +# + +# +6|X +6 V +P\  +\ +  W k  V  + + U  + U  \a/\Q]L24@]$/] _  &   +&    &  1 ]* +^@ +@^ j p^ !   ?^ +^)  _ * +P_ 3 * ]@_ 3 +_ 8 * ]@_ 8` 9 +@` >! * ]@p` > ' ?% V +`  +` {F {F  ({F J  H Ք Ք g   ^ H W/ {F A +ha F a  b` (?`b3  Y  #  _b# &b  ? e !!  O r Q! 0  b P yP 6P PaPPc +c@ fkfE ?c +c)  * +d 3 * ]@@d 3 +pd 8 * ]@d 8d 9  >!  >  ?% } +=1. +=1@ e _#&  (?Pe3  Y  #    ? e !!  O r Q! 0   +e G +f@ fk fE zH z\z +-!0g S +g 5/h lPhi x& & = & Q 6 + Q@ QkQ E k 7 /k lki xq  q = q  | ; /| l|i x  =   = + @  kE +h : + +h@  kE 5 C y 6 a }% C P% % C%7  #  g>! +?i I +0i) & * */ /]@ F 3 *L L]@ S 3 +`i 8 *s s]@i 8  9 +i >! * ]@i >  ?% O + a' ZO +s& NO + c + L V +  V + P  Q  , + Q ? U )  * * ]@ + j 3 *  ]@Pj 3 +j 8 *& &]@j 8j 9 +k >! *? ?]@@k >  ?% +?pk Z k  ? [ )  * * ]@ +k 3 * ]@l 3 +0l 8 *  ]@`l 8l 9 +l >! *% %]@l > M ?% +6 m H)Pm ?m +m) +m * * ]@ +n 3 * ]@@n 3 +pn 8 * ]@n 8n 9 +o >! * ]@0o >  ?% @!֊@! +`o N +o@   +o X  / li x   =   +0p<`p /p0 lpi xp q = Pq / // l/i x/ / = / +q +q@ I kIE +q +r@ z kzE +@r +pr@  kE "( "  " "7  /  tÊ _q4#&q +r8 +r@ *kE H \Bs c i d <i  /i 0 li i xi i = i u d' u  yu 6u uau      ?0s +ps) +s * +*s t]@ ( 2 +Pt 3 * ]@t 3 +t 8 * ]@t 8u 9 +@u >! * ]@pu > 3 ?% Y1 Y1 p %SW` 9 + 5 P W CF > + `W۝ + bm o/* /dW6 + uV Pn +q; iH U : ss slr = 0 7  Oe  QE6 &o  t ' < 1 jBU  + &p R :% dQl ` I xW  M1  xW'  M1  xWq  DM1E  xW  M1  2 eW  +O@ + 4p z4' 4г' 4' z0' `> H-  + I ?Q 'R > +'c : N@R z 2n 2h08 . QCv U>- {w #    P  0\ &a} ~'  ts c W@  +R T   + R@~R @Ws n + Gz + g s  e  *V+ Y  +.Ww + 0  Wd l aW M1  0 W  #Z  **  n + U [+ + y= +V +z @   +t  +Wv + +W + +sW9 B + +P + S9C(z4@S 4p' 4' zЫ' >0 H-  + I ?Q'R>W +]` + b f9C(NfNN .FO X:OP#6 Q#, QNi Ux WR$ NV y ji mJ,`j kt S0PFp  ?  D Q| E QQ Q @R 2R \ R  @R  2R \ R  P+qR + m? m> qO>eObR gk͚ +W w +J + +K  ++9C(UT +K Wt + `I +  "VW +# j# +$  +<0 L ?t`   ! <  ++ R mt W +* F1P ++ mIA#4".4'' z4 ' 4P' 4' z' > H-  + I ?Q'R> +"#W +l \W + + $ + ' S + N (s& +N  HW R +  + D Q + 5   uQ 2   +92z' Q2z' Q qO2{'eOb +R 2| +2~#WV  + S + +7N(7W4 + +<OW + +Sm 7  +6FTF + ^) +@&& +`_W > + +*  +zP  > H-  + I ++ ` +7 k@t SpPF Н # u?# D ( pE @R.  2R.  \ R.   @R5   2R5  \ R5   B #+qRy  +   m# ? R  O  +,  +- `0 +7 k`t SPF  @?   +D Q |pE Q Q  Q  @R  2R  \ R   @R   2R  \ R   +qR3! +I!  m# ? m!>RR! +3`  +7 k`t SPm!>R!F  "? " +D Q"| "|E Q"Q" Q" @R" 2R" \ R"  @R" 2R" \ R"  @+qR# +# mi# ? p +1 ` +7 kСt SPF0 p ? ! D Q!|E Q!Q! Q! @R! 2R! \ R!  @R" 2R" \ R"  +qRQ" +g"  m\# ? m," +> qOp">eOp"bRs" O" +2uWN +NP +Q +z  > H-  + I "O +R N 2Qa&QkV@ +R U.T +N/& N +O]@ R/& Q 1 Up.^ R/& Q 1 +N/& N +O]@ CP +Z OO_Ф& <  ++ W + + W  + + 0F  D Q| E QQ QR @R 2R \ R  @R  2R \ R  `+qR +R + W! ` + + %p  f Q| 2xf2 QQ QR+qR +R + W% +6V +7~V 0@ P +8F  ? E QQ Q @R 2R \ R  @R  2R \ R  P+qR + mhQ V +9-VЧ0*~V03` +9k@t SpPF Ш ?  D Q|PE QQ Q @R 2R \ R  @R  2R \ R  +qR + m> qO>eObR hp +sWr +F +  `?  D Q|E QQ Q @R 2R \ R  @R  2R \ R  Ъ+qR +  m?   +9 + Q + Q qO +3eObR + qO +'eObR +  + 7 s +; W  +Q C +R + 9C(W ^) +h W6 #< + +  CF +  W$ S + N (s& +N  W O  2WW+ B +  S?" $? + +] + H-  + IR n5 4?KW % $S $Sz `{ +7 k`{t S{PF| P| |?}D Q0}|`}E QQ Q @R 2R \ R  @R  2R \ R  }+qR + m ? m> qO>eObR  P CP O O _ < ++ }~ +z@~  p~>~ H-  + I~` +7 k0t S`PF  r?D mE @R 2R \ R  @R  2R \ R  !+qR + + m ? R  P# CP OO_ P& <  ++ W % $S %$S +z   >P H-  + I P CP O O _ < ++ ` +7 kt SPF@ p r?D mE @R 2R \ R  @R  2R \ R  !+qR + + m ? R  P# CP OO_Ђ& <  ++ 0 `p +7 kt SPF0  Є?  D Q|E QQ Q @R 2R \ R  @R  2R \ R  @+qR + m ? m> qO>eObR %$ P3 CP+ O+O_& < ++ u5O 5?Yek W R@kW A *  WL bW +SW +0 +W 9 ?M@ NV$ UN QaP TV$ Tm .U . yTx N@K aN +~O]@@ULVPU!NX Qc Q  CA ( + z( (> ( H-  + IM4BRB] 8'/X ' M;' ;' 4<'& 4 (' ('5 +W ? +" 6V" )V& V&; [Q& NQ R +"`4" '1 N'5NN .FO@X:Op#6 Q#, Q N'8 Ux WR$ NVy `'9 kt S PF`  ?  D Q| sE QQ Q @R 2R \ R  @R  2R \ R  !+qR + + m? qO>eObR CP" OO_ & <  ++   N "} "  ~ " 4 " e "W& "bP"c +z  >@ H- + IS"dS (\S`() N)*IN +eO]@N )3 IN +eO]@hSP)3 N)8 IN +eO]@hS)8tS)9N)>! IN +eO]@hS@)> +tS)?% =S "d 0S . O mN  8p"k +T"<S*@ S* +JS* 0S"< O mN Qa Q 8"! pU" XU,; T-G T+\ S+ S(S N )NyN`d + Qn) N )V yNd + Qn) +hS)V +S)X N )Y yNd + Qn) +hS)Y +S)[ N)\! yNd + Qn)hSЏ)\ +tS)^ +tS)` +tS)b + U+ U+X +8,00T"0#T0*@ T(*kJS*E ! IN +eO]@hS)> +tS)?% T U  +9,0" `P +7 kt SВPF P ?  +D Q|E QQ Q @R 2R \ R  @R  2R \ R  +qR + m ? m>RP" ` +7 kt SPF P ?  +D Q|E QQ Q @R 2R \ R  @R  2R \ R  +qR + m ? m>R Wm "P" +z  >@ H- + IS"\S() N@)* IN +eO]@Np)3 IN +eO]@hS)3 NИ)8 IN +eO]@hS)8tS0)9N`)>! IN +eO]@hS)> +tS)?% 0S " O mN  W "m4". Q'Q Q' 'z`  >К H-  + I' 6' k0q S`PF  y?D oE @R 2R \ R  @R  2R \ R  #+qR + + m? R qO'"eObR '  qO'7eObR'5'; "h " &&" + w W> o + )b>  9C( I[ M@ N0w IN +eO]@:g + W 0 WJ> W   W7 :  SW wMI>W r W` \  +* BW + +M1 W x 7x x +u `x +7 k yt SPyPFy y z?  D Q|PzE QQ Q @R 2R \ R  @R  2R \ R  z+qR + m? m> qO>eObR pp| wx  +l +PZ9 R U   * b ~U p p P w 8yU # X ݰ $ U X ;  f  X rU G  J W ^  9 q 8QL x9 9 ]2n ,  Xq f ͚  ϴ /#c /#4-Uq a f ]  d qW M  P  X  WCP OOpw_ww& <  ++  \'WP CP OOx_0x`x& <  ++   @  e ǫ   a `  4 q k; BA9ղ t u ?s 0  W  3{ FD WTy  #  + +¥ I 5 Z 5 M 0Y  p|%  N  [(? 6 f ,&F &  E*L% +L Lٰ K3 Wv3$ CYe 35 + g 3M 7N  gT )( <w) ) 8 )I п ) J(( Q J( m (R 6 (6d j CF(q   *͚ * s *?x *D͚ *i **?Вt *Xw1b it5 u E' f h g   z Γ O H  } ٮ -Qt^t G + +Py Γ  H +W / t* I Ph  -C  > ,*JΓ H ,/ H ,/ H ,*i r /% "$ % +d  !k5 su&[ u&: u&B +1 ַ 1%)g[   .Q00?`0}Ʈ02Anr =:P- ;  $Wht t  0 a  a a i D b  * , a+ _  ` & Uq* a   d& & ]* * + a+ ]~2 ]E o U` P a a n  aj0 { Ly   +P ]  +V |_ +r +2 W 2W* z ׽4 4  5+* +p5+33BW U{  31 { + 36WO 3- > `;OW| Ý   b PCWW] +  W + 2W/   2W   pCW +  C + PL LELE) |LB*j| M C]@|PMB3j|C C]@uMB3 |MB8j|D D]@uMB8NB9|@NB>!j|9D 9D]@upNB> DB?%D D+ D +. юNŎN @ NEO  ZE  yE ݎE pE  dE  cE E EiUEi5b ER5 : .F5eG' eG'+@ {GAnGA @ aO k G E G HpG \ dG  cG H# `HWH#W@ +% H& Hz'Hz+ H+. UI ( mI'UmI5b I5 : .I5 J!* JW +0J1 J +J1! J + 0O4 `O+* +O+3  +K2 s ǘ ;WС ǘ n > Oo cC  F   + PL90PA, AO     b AP AQ( AQ AQ"sAN}! [d n) ?nAS`PAeP sP  +W" + c[W +r +uR c2.r +uR c2.r +uR c2.WQ +\r\uR c2. W { j  W ^  >qhWz w G@> #rqA 0rqAYA A drA. 9rA drA. 9rA sA+S2r;AE4r9A,4r AO4r  4r  4r b ?rAO ErAP HrAQ [rAQ"s_rAN}_r! [_rd _rn) mgrAS_mr>AQmr>A,mr AOmr  mr  mr b xr AO rAP ;rAQ rAQ"srAN}r! [rd rn) mrAS W G  ( W + R  >E   W  ]>W :  5>r0uR c2.r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c2Wo u>cCH Cr3 c2fTrCCH =32ju18`r2 c2 c2H c 2' ǘ  W c  > W . :g +W 0  2>W b {>cT Cr3 c2fTrGT =42ju28`r2 c2 c2H c 2'W u + u>cCH Cr3 c2fTrCCH =32ju18`r2 c2 c2H c 2'W& n  l >W  A>r0uR c2.r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c2W W  @> #rA 0rALA A 9 +A 9 A dA. 9 A dA. 9 A +A+#<AE:A, AO     b AO AP AQ AQ"sAN}! [d n) mAS/<AQ<A, AO     b AO AP ;AQ AQ"sAN}! [d n) mASW_  M>r0uR c2.r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c20W : ->r +uR c2.r +uR c2.0Wb !->r3uR c2.r3uR c2. W  .W6   > #rA 0rA`A A 9 +A 9 A dA. 9 A dA. 9 A +A+OALA, AO     b AP +AQ( AQ AQ"sAN}! [d n) nAS7?A?A, AO     b AP +AQ( ;AQ AQ"sAN}! [d n) nAS YW& Ytv Y;W~  x л> k u 0X cC  F   + `L9A, AO     b AP AQ( AQ AQ"sAN}! [d n) ?nASAe s  W * r>cCr3 c2fTrH=52ju38`r 2 c2 c2H c 2'W( p  YP>r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c2r0uR c2.W ( e>r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c2r0uR c2. W:WL`4>0@ c@BWUg Sz>cS& Cr3 c2fTrCS& =32ju18`r2 c2 c2H c 2'Wq>cCr3 c2fTrG=42ju28`r2 c2 c2H c 2':W^l4>C0@ c@BWg-1>cU< +Cr3 c2fTrHU< +=52ju38`r 2 c2 c2H c 2'W2ߝ>r.E(u.R c2.zkE(qS2|vuQ8 y 2}< c2 c2~ c2WN?|>cVCr3 c2fTrGV=42ju28`r2 c2 c2H c 2'W J>c5Cr3 c2fTrG5=42ju28`r2 c2 c2H c 2'W%m ~>r0uR c2.r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c2W! _z>cS Cr3 c2fTrCS =32ju18`r2 c2 c2H c 2'W2',>cM  Cr3 c2fTrCM  =32ju18`r2 c2 c2H c 2'WO{>cT Cr3 c2fTrGT =42ju28`r2 c2 c2H c 2'W6{>cT Cr3 c2fTrGT =42ju28`r2 c2 c2H c 2'Wo > #rA 0rAs A PA 9 +A 9 A dA. 9 A dA. 9 A A+@A]=A, AO     b AP AQ( AQ AQ"sAN}! [d n) snAS>Ai>A, AO     b AP AQ( ;AQ AQ"sAN}! [d n) snAS WH' o Wq5> >W kz>cS& Cr3 c2fTrCS& =32ju18`r2 c2 c2H c 2'PsW >rks.0uks.R cks2.zsk0qsS2|vusQ8 ys 2}< cs2 cs2~ ct2r(t!0u(t!R c(t!2.W  > #rA 0rAA A 9 A 9A dA. 9 A dA. 9 A A+KAuIA, AO     b AP ׌AQ( AQ AQ"sAN}! [d n) nAS>A>A, AO     b AP ׌AQ( ;AQ AQ"sAN}! [d n) nASPtW6 ~ SSt>rft)^ +uftR cft2.rt)^ +utR ct2.rt)^ +utR ct2.rt)^ +utR ct2.rt)^ +utR ct2. wT 1xW  ؉> = <> r i c2Pc|e |P2j|п]@ +I|2 V|# 2 u8 c2(W 2 + v>cCH Cr3 c2fTrCCH =32ju18`r2 c2 c2H c 2'R 0 ; 0 nW +9  c?`> V?o cC  F   + L9A, AO     b AP AQ( AQ AQ"sAN}! [d n) ?nAS AeP s WH   =><> r i c2Pc|? |2j| ]@ I|2 V|(  2 u8 c2(W j ~>r-M u-R c2.| M& |  zeM qN2|vuL8 y2}< c2 c2~ c2W  >c0Cr3 c2fTrG0=42ju28`r2 c2 c2H c 2'W h wz>cS& Cr3 c2fTrCS& =32ju18`r2 c2 c2H c 2'W]tW - W8  {>cT Cr3 c2fTrGT =42ju28`r2 c2 c2H c 2'W g > #rA 0rA0A `A 9 +A 9 A dA. 9 A dA. 9 A +A+ˌ<Au:A, AO     b AP ׌AQ( AQ AQ"sAN}! [d n) nAS?A?A, AO     b AP ׌AQ( ;AQ AQ"sAN}! [d n) nAS WDW > V? cC  F   + L9 A, AO     b AP AQ( AQ AQ"sAN}! [d n) ?nASPAe s W1yu>c7 Cr3 c2fTrC7 =32ju18`r2 c2 c2H c 2'uWz . 8  W3 FM>9M> r i c2Pp|? 2| 8]@ I|2 V|(  2 u8 c2(W{  >r0uR c2.r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c2 +?  9WZ!! O">O"> "  W WZ W W4WP91>cU< +Cr3 c2fTrHU< +=52ju38`r 2 c2 c2H c 2'Wٻ  CP> #rA 0rAA A 9 A 9A dA. 9 A dA. 9 A A+ONAKA, AO     b AP +AQ( AQ AQ"sAN}! [d n) nAS[>A>A, AO     b AP +AQ( ;AQ AQ"sAN}! [d n) nASWc >r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c2r0uR c2.5Wg />/   W!iV>r5uR c2.r5uR c2.r5uR c2.r5uR c2.r5uR c2.r5uR c2. W =<> r i c2Pc|B | 2j| ]@ I|2 V|(  2 u8 c2(WX b>r.5[u.R c2.zk5[qS2|vuQ8 y 2}< c2 c2~ c2 WW>>c=eCr3 c2fTrH=e=52ju38`r 2 c2 c2H c 2'W `>r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c2r0uR c2.W} >r0uR c2.r.0u.R c2.zk0qS2|vuQ8 y 2}< c2 c2~ c2W8 k> #rA 0rAfA 0A 9 +A 9 A dA. 9 A dA. 9 A +A+w@A]=A, AO     b AP AQ( AQ AQ"sAN}! [d n) snAS;Ai;A, AO     b AP AQ( ;AQ AQ"sAN}! [d n) snASWE1>cU# +Cr3 c2fTrGU# +=42ju28`r2 c2 c2H c 2'6W  *> uWCc u >" rW=& Cc>  >PZ9LO VO VT U OU 2l] ] g 4g  ߋ  3 f e6WC >  +c6 +c7 z07u`7E2  q77R r7m u7D.q 8Cx |P8Kj|8 8]@ Av8Lu9CP97Oi9E2$P:CP}: c 9 +dP;$ p0:u m0:  9 90;`90 `9 9 !9 0;m9 0 m9 +d; +$ p:u m:  :% p: + m:  ;'  p ; m ;  ;|WН / 8 ;: ; +";C#;.z;^|; p;a d;  'q<C#q;m pP<= +m<  <> }<E=E@=E) up=B>|=B>!j|< <]@ < B?%|B< B*j|K< K<]@|V< B3j|[< [<]@ u_< B3 |=B8j|< <]@u>B8 0>n }<Ep>E>E) |<B*|>B3j|< <]@u ?B3 |P?B8j|A A]@u?B8 |AB>! uBB> BB?%/<H<Q < < g< = H z?Vu?E2  q@7R r@@m up@D.q@Cx |@Kj|> >]@ Av0ALuACPB7OipBE2$BCP}PC zC[9uDE2  q0D7R r`Dm uDD.qDCx |DKj|@ @]@ AvPELuECP0F7OiFE2$FCP}pG +d@d[$ p Au m A  bA#] ppA mpA  W ?  3M#! c JGq} H%v| ,]@H`H%  +dH$ pu m   p m  WS   +q}H} | +HH 0I-`I @    IԂI ǂI + J! sPJX}J! C0Kd`Kn) K 7K K + Lb 0BWcPB9WcW $p Wƞ 1t-W ' QW- s W^ WcW ԟ B Wc WcB W#rB W0r BWcCrB3 cB 2f B=WruB&R cB2. B2/6 C#W r$Ci c$C2P#Wߟ   c2.W S % c2` h Q O   pT U 2b\ \ Q\ 2\ ] 2p,WΔ f 2J $2zx,g8`rP$2 +c$2 c, 2 c,2 c-2 c7-2x$2"c$2 xe- c- 2 c-2 c-2W .h 2W2x8`r2 c2 c2 c2x2"c2 x c2 c 2`r2 c2 c2 c 2 .IWTr=1.32ju3.18`r3.2 c6.2 cH.2H cV. 2'Q\ ] 2i 2|fk 2+l 2An 2)Wf 2" 2#{ !23nP! @ a! kA* HpA* \ dA*  , E !2( ! "= +C@" p"="}}*2>, +|"% *">/}*>= S* qm +>@~m + lm + }+>A +|#%  +Ԅ]+ >P ]+>M0#>Z@`# }+&>Z +|#% DŽ+2n+=>+= 2+? #22!# @ +  + f f 2=i 2Lg g 2.h Dh 2 j 2B} l 2XVPm 2Hg Sg g 2h h ] 2p.2WY f 2Kd.2Lx.8 y%2M c.2 c. 2X c.2O x@%2S"cp%2 x/ cp/2U /rWzq/N2|vu/L8 y/2}< c/2 c/2~ c/2 Q\ 2zvj j ] 200W 2~D02xP08 z%2 +c%2 ca02 c02 x&2"c0&2 x0 c12k P1Wѕ 2&W + Q\ 2* `&2+ u8 c2+(p `1&WV| &2 ui18 cl12( ޤ 2 2m= Q\ 2 + wx2 B 2өYl B} 2W+m ] 2WD 2 |&2 &2Xx8|2[ c2 xI2]"cI2 x + c2_LW} VP2  '2x$8|2 c2 c2* c 2- c2!xG2%"cG2 x + c +2' W| P'2Xx8| 2[ c2 xK2]"cK2 x + c2_JW Q\ 2 '2 u?8 c2 n 2* 2O ; 2I 2 ZW 4 @L'@0%$O(!? ,/!A / +L'% L% @(%Gp( L(%* % M%E5@ 3E'6p, d :WW @L(@<%$J"!? ~8 )!AP) +L)% L% )%G* L@*%* % M%E5@ 3E'6p, d W @!L*@-0%$O(!? ,/!A / +L*% +%GP+ L+%& ++% M%E5@ 3E'6p, d W/ x @!L,@-<%$J%!? ~80,!A`, +L,% ,%G - LP-%& +-% M%E5@ 3E'6p, d fW @TL-@`0%$O(!? ,/!A / +L.% L% `.%9. +~.! .%G /NW Y @TMP/@`<%$J$!? ~8/!A/ +L/% L% @0%9p0 +~0! 0%G1W ͙ @oM01@{<%0$J"!? ~8`1!A1 +L1%1 2%GGP2W D @o!M2@{0%0$O(!? ,/!A / +L2%1 3%GG@32 r @9 7WlC0@ c@B1W +@C*@ c@B7W# +@y0@ c@=W +@y6@ c@ 7W`0@ c@B1W +@*@ c@B7WH +@0@ c@=W +@6@ c@/ +@ +@ @ 4 @9Q @ Wn A d A& 9 +A 9 A 9 +A 9 +A dA & 9 +A  9 +A! dA*& 9 A* dA4& 9 A4 W +A;-W +ABG +A J A*P V A_ +A +AU +A V A +A +A +A +A +A J A* +Av +A +AS +Apm +A +A J A* +AX +A +Ab +AM +A +A J A* +APo +A +A{ +A +A +A +AW iAW\ AW J AW R AWY AW  A  W s A!WW iAW AW J AWN AW  A  W s A!WH iAW AW J AW? R AW AW  A  W8 s A!W iAW AW1 J AW R AW AW)  A  W| s A!W iAW" AWw J AW R AW AWr  A W s A!W R A+Wm A,WW s A.W A,WWe s A.WW s A.W s A. We c1A Wʓ c1A W c1A W; c1A V AWa +ApA, AO     b AO AP eAQ AQ"sAN}! [d n) mASAeЫ s  V AW +A0A, AO     b AO AP ʓAQ AQ"sAN}! [d n) mAS`Ae s gW#EA,g AOg  g  g b gAO hAP hAQ hAQ"shAN}h! [hd hn) m'hAS AeP s hW/QA,h AOh  h  h b hAO hAP ;hAQ hAQ"shAN}h! [hd hn) mhASAe s@ W +AɲpA, AO     b AP AQ( eAQ AQ"sAN}! [d n) snASAeЮ s Wx +Aղ0A, AO     b AP AQ( ʓAQ AQ"sAN}! [d n) snAS`Ae s Ww]A, AO     b AP AQ( AQ AQ"sAN}! [d n) snAS AeP s WiA, AO     b AP AQ( ;AQ AQ"sAN}! [d n) snASAe s@ W +ApA, AO     b AP ׌AQ( eAQ AQ"sAN}! [d n) nASAeб s W3 +A0A, AO     b AP ׌AQ( ʓAQ AQ"sAN}! [d n) nAS`Ae s iWˌuA,)i AO)i  )i  )i b 4iAP ׌CiAQ( FiAQ YiAQ"s]iAN}]i! []id ]in) ngiAS AeP s iWA,i AOi  i  i b iAP ׌iAQ( ;iAQ iAQ"siAN}i! [id in) njASAe s@ W +ApA, AO     b AP +AQ( eAQ AQ"sAN}! [d n) nASAeд s W +A0A, AO     b AP +AQ( ʓAQ AQ"sAN}! [d n) nAS`Ae s `jWA,jj AOjj  jj  jj b ujAP +jAQ( jAQ jAQ"sjAN}j! [jd jn) njAS AeP s kW7A, +k AO +k   +k   +k b kAP +$kAQ( ;'kAQ :kAQ"s>kAN}>k! [>kd >kn) nIkASAe s@ ! J A*WK +ApA"sAN }! AP ݧAQ( eAQ AQ nAS0Ae0 s0 E6,  W +AqA"sAN }! AP ݧAQ( ʓAQ AQ nAS0Ae0 s0 E6,  W +A)A"sAN }! AP ݧAQ( AQ AQ nAS0Ae0 s0 E6,  Wi +A5A"sAN }! AP ݧAQ( ;AQ AQ nAS0Ae0 s0 E6,  j +AkW +A #rkA 0rkApA A 9l A 9*lA dalA. 9hl A dcmA. 9jm A wmA+lNA9lKA,l AOl  l  l b lAP lAQ( lAQ lAQ"slAN}l! [ld ln) ?nlAS-l>Al>A,l AOl  l  l b l AP lAQ( ;lAQ  +mAQ"smAN}m! [md mn) ?nmAS  A-%  A-x  A-  A-,Wv +A s A.W +A۰A/W8 +AW +A۰Az Iz ASz z AWr AR^AW kKA Aa S A` +^p3Ah As" S As A~ י   AC AC 0 AC ACF AC ACU AC ACn AC7 r AC AC{ AC> y AC AC 6 ACZ AC AC R ACu AC  ACA | AC AC/  +A +A# +A +A2 +A +AK +A +Ap +A +A *WL зA 9 +A 9 A dA. 9 A dA. 9 A A+ mWYmAm}A dmA. 9mA d nA. 9nA nA+ +Wf A 9 +A 9 A dA. 9 A dA. 9 A A+ %WsA A 9 +A 9 A dA. 9 A dA. 9 A A+ Pn'WjnA 9n +A 9n A doA. 9o A d5oA. 9 \ +a"@Wp + b em m8 m= Mn@ 3E'6p, d  m v|@ ,MA/@ 3E'6p, d  +A#W +0 B`I( \ +a"W0 +` b em m8 m= Mn@ 3E'6p, d  m v| ,(W" + W +c +Cr3 c2fTrH +=52ju38`r 2 c2 c2H c 2'DW +%r.% +u.R c2.zk% +qS2|vuQ8 y 2}< c2 c2~ c2r% +uR c2.r% +uR c2.r% +uR c2.  Wv % >WJ ~ h &Ww yw J% ~!Ww w )Ww Nx W_x  ~ Wx   PWO  h 6Wy yw O5 "Wwy w )Wy Nx W  i> # > #* +? D WS? y ? y*!FK K# ? #*5LD W~Ly P@ y*!@  @ # 8A #*A D WA y B y*!zB  B #  +C #*gC y*!C D WD y TD D #D #*>E DE yE y*!(F lvqF ]F ]*G ZG #G #*G DAH yH y*!H lv(I ]lI ]*I J #WJ #*J ]*K lv[K ]K y*!K DHL yL L #M #*xM DM yN y*!bN lvN ]N ]*3{ Fi[ [# F #* y*!Q  # #*; y*!D-yQ ]*_lv]W' n ?W} n ?W n ?W n ?WU n ? +W n @ ~  ^ 2"W 8 <  =  = WS n @N ~  ^ 2#W 8 <  =  = @gW n @ ~ F ^ 2W7 8 <  =  = W n @ ~ x^^ 2'W 8 < o = | = W' n @ ~ ? ^ 2jWp 8 < I = = W +*r*&uR c2.r*&uR c2.r*&uR c2.r*&uR c2.r*&uR c2.W @*%m*  *2 *? |*J *Kv*Oi* \*S*"  *? |*Z *[v*_i* \*c* W @* 2m@*  *2 *? | *J *K`*OS* F*Sz*" m *? |*Z *[`*_S* F*c* W @* ?m*  *2 *? |*J *K*O* (*S*"  *? |*Z *[*_* O*cB* 5WT @*Lm*  *2 *? |*J  *K*O *  #*S=*" 0 *? |*Z *[*_ *  J *cd* WW @*W% @* ]P*  *2 *? *? |*J  *Ke*OX* K *S*" r W @* l*  *2 *? *? |*J *K *O * *S*"  W @* l*  *2 *? *? |*J *K*O +*  >*S1*" $ PgW\ @* mPg*  Pg*2 _g*? rg*? |g*J g *Kg*Og* g  0*Sg*" g W @*m*  *2 *? *? |*J *K*O*   `*S*"  ? _ v!vlv p|v] l m    K + % +w + + | + C + " +~  + e +$ % +nz' f +?WmW -W{m +@m pm +݁m 5Wa LWm +{n +0n `n +݁n 4}# + @}%  Wn +{n + o Po +݁o hpF +vsF jsFl rC] BrC8 |os4 OsP+iyp } o + p +݁@p  +app + Wn +m\ n op +сp āq +0q! s`q +sq$- r +"ZW Wn +m\ n o`r +сr ār +r! s s +s`s$- s +" "Wyot +с0t ā`t +t! |t + ]@} +#  0u +"W < + ru + $pv! +m0v O p`v + +mv  p    rv +$pv! +m w O WE  +( pPw +: +mw  pw x  y@x +4} +#  o + +с + ā +  +! |px + ]@x +" yPy +=o + +с + ā +  +! |y + ]@} +#  y +"W +Ez +{z +z { +݁@{ p{ +c v{ +K$@}{P+ v| +Q(@}0|P+  +R* `| +e v| +Q(@}|P+ v } +K$@}}P+| ]@  +R* 9W o} +uс~ ā@~ +p~! +s~ +u'}!  +u  b +` +v"Wų A +  + +{0 +`  +݁ 4}, + @} %   + +{ + + +  + ݁ + hp: +vs: js:l r7] Br78 | s( OsP+iyp } P +  +݁  + a +r +$p ! m O 1p Q!   a# +" Ln + o[ @ p +-n +m\ n { + + +  + ݁ + p + pЂ r + t +! |&N N&N A1 p  m #r t! |&N  +s0 +sp$-  +"p +8C   ++ B + +  +0 Y +W Y +& ' +Hf(  + WWWcWo5W{ W  +0W +8WN +@2W ' +H WWW AW  +G +@W FM +V + J? kWn +m\ n {  +P  +݁ p + p r  t ! |&N N&N A1 p   m  #r t! |&N "WW_ + + cP +.s + + | +! cD +  +0 +8 +@, ' +H@ F  +W % +wW " +~ -WЈ@ +p  +Ѕ 5WͶ | + <W  +Ј0 +`  + ~ + |% % K + W  +Ј  +P  + Nq' +s' s'l :s'] Nr'8 }s 7OsP+%ip }  + @ +p  + +W<  +n +m\ n ܈Ј +Ԃ ǂ0 +`! Zt +Nt$- W0 +"HWu + W n +m\ n ܈ +Ԃ ǂ + ! ZtP +Nt$- WЋ +" W]܈0 +Ԃ` ǂ +! e} +g ]@~ +# 7 c` +"W < + r + $p ! +mP O 1p Q!   p + +mЎ  r  +$pP! +m O  +`W  +( p +: +m  p@ p  ] +4~ +# 7 ܈ + +Ԃ + ǂ +  +! e}А +g ]@c0 +"] +=܈ + +Ԃ + ǂ +  +! e} +g ]@~ +# 7 c0 +"IW0 +E +Ј + @ +p I +c vГ +K$|P+ v0 +Q(|P+ +oД +R* I  +e vP +Q(|P+ v +K$|pP+j| ]@ +oЖ +R*Wq % +n ܈  +uԂP ǂ +! s +uX}0! Cd n) +u7  b +{ +v" f + C + e +?W A + И + +Ј0 +`  + ~ + | % %  +0 +Ј` +  + NqB +sB sBl :sB] NrB8 } s. 7OsP+%ip } P +  +Л  + r +$p@! +mp O 1p Q!    +" Yn + oМ[ d W0 +-n +m\ n Ј` +  + gq- +Zq- Fs  t ! }&N &N 1 p  fn #   +ZtP +Nt$- WО +"f  +C   +  +G Y +d Y +W FM +> + 2? YWd W@ +-n +m\ n Јp + П + gq +Zq Fs + t +! }&N &N 1 p   fn  # YWWn +m\ n Ј0 +`  + gq +Zq Fs + t +! }&N &N 1 p   fn  #WX B + +{W + + cP +Rs + + } +! cC +    )\WTW WH c1N i, , J- +W + c Cr3 c2fTrH =52ju38`r 2 c2 c2H c 2's {  W| 5} !1 WH} 5} !7_Wy +! c! Cr3 c2fTrH! =52ju38`r 2 c2 c2H c 2':W +!r!uR c2.r!uR c2.r!uR c2.r.!u.R c2.zk!qS2|vuQ8 y 2}< c2 c2~ c2n n !>r r !> 5Wv " +  "t } W} } ##y#& o + +с + ā +  +! | + ]@} +#  ` +"y#) o + +с + ā +  +! | + ]@} +#  P +"/ y #HW~ Cu #e#x  #y  v8# " + # # # mj# %##n +m\ n o + +с + ā +  +! s +s0$-  +"#n +m\ n { + + +  + ݁ + p + p@ r  t ! |&N N&N A1 p   m  #r t! |&N op# n m& +my0# op +с ā +! |0 + ]@ +"y# o + +с + ā +  +! |  + ]@p +"y# o + +с + ā +  +! | + ]@` +" 1# *# *##oP#P   +- n + m@\ +np { +  +݁0 p` + p r  t ! |&N N&N A1 p  m #r t! |&N #Q s +s@$-  +"o#T @  +-n +m\ n { + @ +݁p p + p r  t ! |&N N&N A1 p  m #r t! |&N #U s0 +s$-  +"o0#X p  +-n +m\ n { + + +  + ݁ + p + p  r  t ! |&N N&N A1 p  m #r t! |&N P#Y s +s$-   +"o#\   +-n + +m +\ n + { + + +  + ݁ + p@ + pp r  t ! |&N N&N A1 p  m #r t! |&N #] s +s $- p +"y# o + +с + ā +  +! | + ]@P +"#n +m\ n { + + +  + ݁ + pC +pC r  t ! |&N N&N A1 p  m #r t! |&N ##n +m\ n o + +с + ā +  +! s  +sp$-  +" #n +m\ n { + + +  + ݁ + pP + p r  t ! |&N N&N A1 p   m  #r  t ! | &N o# n m0& +mpy# o + +с + ā +  +! | + ]@@ +"y # o + +с + ā +  +! | + ]@@ +"o#nm& mo#  @ +-n +m\ n { + + +  + ݁ + pp + p r  t ! |&N N&N A1 p  m #r t! |&N r#3e  +Yp #T +~ ! GP# } % }4% G6 p% m   p % m  $ $ #=EWP~ ,q ##   #  v6# " + +# mj# 6#' 1#' 0#@ op +uс ā +0! +sp +u'}! +d n) +u    b +0 +v"#Co +uс ā ! +s +u'}!  +u    b +P +v" #' n +m\ n o +с ā@ +p! s +s$- @ +" o#'   +-n +m\ n {` +  +݁ p  + pP r  t ! |&N N&N A1 p  m #r t! |&N y#+ o + +с + ā +  +! | + ]@ +" .#@ *#B *#D p#H +{ + + +  + ݁ + 4}( + @}%  o#S   +-n +m\ n { + + +  + ݁ + p0 + p` r  t ! |&N N&N A1 p  m #r t! |&N #Ts +s$- ` +" o#W  @ +-n +m\ n { + + +  + ݁ + p + p r  t ! |&N N&N A1 p  m #r t! |&N #Xs +s`$-  +" o#[ P  +-n +m\ n { + + +  + ݁ + p + p r  t ! |&N N&N A1 p  m #r t! |&N 0#\s` +s$-  +" o`#_   +-n +m\ n { + + +  + ݁ + p  + pP r  t ! |&N N&N A1 p  m #r t! |&N #`s +s$- P +" y#f o + +с + ā +  +! | + ]@@ +" p #G m  y#mo + +с + ā +  +! | + ]@p +" #K~@ + b L} #KK#mn +m\ n { + + +  + ݁ + p5 +p5 r  t ! |&N N&N A1 p  m # #vT +~! Gu#v }% }4% G6 p% m   p% m  r#3e@ +Yp c, lW9DWED, , 'x7- - '- - . 'i W~ - ''  '   'H' H&' 9D'T'T@'T' ED'& 'B +~ ! +VDP' 'JB +~! +VD'HZWGW~ . ' ' ' +9D@' TY' ED'&. W.  '| rp'Ge +Y 'K0 +~`! G}' }% +}4% G6 p% m   p% m  r'Ge  +YP fWGp ,q 't Cu '|# 2 %2 =$ % WG }% }4% G6 p% m   p% m  . KWH. p %W R +%H%Ԃ%ǂ + ! % 9 sP%X}! Cd@n)%7  bԂp%#ǂ +! e}%4 WJq}%H0%W R +% % 9  +q}`% + % '  +N +<+ b%  [  p % VWL % M%E5@ 3E'6p, d W @ %h %oM%z5@ 3E'6p, d  +%2  +P WL$WLn o %Jp p %p p %gJr r %r s %@t zt %Zv v %w Ow %{w x %{x x %Xy y % B +%_WK +%r.%&u.R c2.r.%&u.R c2.r.%&u.R c2.{W +%r%&uR c2.r%&uR c2.r%&uR c2.r%&uR c2.(< +1:  WR  )W +) ) gW: +) @S) >) W +)r.) +u.R c2.zk) +qS2|vuQ8 y 2}< c2 c2~ c2fWe +)Ecf)E +Crf3 cf2fTrfG)E +=f42juf28`rf2 cf2 c g2H cg 2' WSr)^ +uR c2.r)^ +uR c2.r)^ +uR c2.r)^ +uR c2.r)^ +uR c2. +)^A: W }' )DW@SO:  )|W ρ *( *2 *? *? *O * +  + *K +|`*J *S -*" +   c1*,TW  *( *2 *? +|@*J +*K T*O G* +: a@*S {*" +n *? +|*Z +0*[ T`*_ G* +: *c @* +p c1*, Wl *2 *? *? +*K +|*J  *O @ * +p   *S *" + +  c1*, $xWl /$*2 >$*? X$*? +0 +*K +|p +*J  +*O + +* +   >0 *S 1` *" +$   cC%1*, W] *2 *? *? + *K +| *J e0 *O X` * +K   *S  *" +r   c1*, Wm *2  +*? +P *K +| *J *O * +0  `*S *" +  *? c1*, $W?m *2 *? +|*J +P*K *O * + (*S @*" +p *? +|*Z +*[ *_ 0* +` O*c B* +5 c1*, W%m *2 *? +| *J +`*K v*O i* +\ *S P*" + *? +|*Z +*[ v*_ i@* +\p *c * + c1*, WYm *2 *? +|0*Z +p*[ *_ * + 0*c `* + *? +|*J +*K 0*O `* + *S 9*" +,  c1*, ;W2m *2 *? +|P*J +*K `*O S* +F @*S zp*" +m *? +|*Z +*[ `0*_ S`* +F *c * +  c1*,1 b *(nWǼ @Q]dQ *2 *? *? |*J *Ke*OX* K *S*" r W6 @QlQ *2 *? *? |*J *K *O * *S*"   QW @Ql Q *2 *? *? |*J *K*O +*  >*S1*" $  QW @Q mmQ *2 *? *? |*J *K *O *  P*S*"   Q )QW @QmQ *2 *? *? |*J *K*O*   *S*"   Q 6QW @Q%mQ *2 *? |*J *Kv*Oi* \*S*"  *? |*Z *[v*_i* \*c*  CQWf @Q2mQ *2 *? |*J *K`*OS* F*Sz*" m *? |*Z *[`*_S* F*c*  PQWֿ @Q?m@Q *2 *? |*J *K*O* (*S*"  *? |*Z *[*_* O*cB* 5 ]QWF @QLmQ *2 *? |*J *K*O *  #*S=*" 0 *? |*Z *[*_ *  J*cd* W Q jQ}W @QYmQ *2 *? | *J  +*K$*O$* $*S9*" , *? |*Z  +*[$*_$* $!*c*  Q w Q +Qu *(; l *( 2 *(9 j *( *( *(F w *( = *(. _ *(Y w.|   (?  FM( <Y Y* YW, FMW Y/ze 6< FML  ZK  Zl Y FM FM FMt FMs Y p [ Y%]W- +=r="uR c2.r="uR c2.r="uR c2.FFM=| +     S "  E [ Ni Q R  it 3 . o %L   H J   d   Y    %  V W l6W }W <O} } 2 H 2 @ E + h ŏ <5 t l > E _  # L  d  , , / "/ 0 HM 0 [ 0 1 1 4 R4 6 ?7 : Y: F (G G Y: >N N U U IV Y: \ \ Qt^t6  E &+W8 9f}J D-\ b L < # #$ A* * ah 2  6   % >&  1 Y2  G ȝ   {  ȸ M 2   /   C/ bΓ   N Y N.= +  i n iϹ f C x b8  $ +  $, | | $} u~ $~ u~ $, r $ ) $| ) $,a $1 $,}  +} | $Ă r $in + &M| &% Y &MsWi ݏ 7c7 Cr3 c2fTrC7 =32ju18`r2 c2 c2H c 2'} + 7L%7 @ 7O!  7r Ct/  CG \ CGF  CG: <; CkG XH CkV W Ck* e CP> > CWK FL CWXZ Z CW { P*# P*, WF ScSCr3 c2fTrHS=52ju38`r 2 c2 c2H c 2' W6  ScSCr3 c2fTrHS=52ju38`r 2 c2 c2H c 2' W . ScSCr3 c2fTrHS=52ju38`r 2 c2 c2H c 2' W  ScSCr3 c2fTrHS=52ju38`r 2 c2 c2H c 2'  S%f  Sx  S%@  S%l& & S;' & SJ- - SD. . SY2 2 S$3 2 S,5 6 S/&@ @ S/N O S/P] ^ S/7 68 S$8 9 S<AA A S7B B SC D S$=E E S<P P SP tQ SR KS S$S T S<(  T   T  W T   u + T % % T 4 R4 TS5 R4 T[; _< T< _< T[H wI TJ wI T[W 6X TX 6X T[W  j V  X{ 8yU U' b X ڰ U u U[  J W  ` UY   f  ' U e "" ׀.# ~U+% ' U' ,( ?( f ) b* F1 ~U3 &4 4 ` ؀b ؀c M  P wǔ R   U ׀.͡ L .W֤ > ccd Cr3 c2fTrCd =32ju18`r2 c2 c2H c 2' m  h " wL <+ u U2 p "' i' f2 b3  f +  K fO 8yU  7 qP ) Xq " y  . i. q0 Bi  +3 U3 N` Gh Qk %  W Y    PNtWc ɥ  cN6 M Q Y ^ _ i:_ _ ` 9a Qc`b b if b h b ik b qn b  +q b gc c _e _ ie _ g _ ih _ _j _ ij _ gm _ im _ p _ iTp _ #r wr i͚ <   k N  q  c H c  & / /4R + c @ + 1 I y I   a! ! a!  &" " ) ) + ', . ws/ w 0 0 4 wI\5 x5 Dvv6 Dv:7 |8 8 |8 O9 9 S _ π C  + w I @ ٨ /~  J  4a` ` b ^c LtW 7 ! cM6"PMtWR ( cM6)MtW / cN60W P 6Wp =DKD>)DOa >,:b yb >2yb  c >A7d >Zhc c >T ># K&W}K>= SK qmK>@~mK lmK }K>A +|P% K K>GԄ)L>P )L>M Q>Z@PQ }Q>Z +|Q% DŽL} >sd >EW >^9&>n, S MQ>s@R 3E'6p, d z>s^| pa d }+>s +}@R4% +6 >zԄ> >pR>R +R }> }4% 76Yd +?Sd ? ' ?S6 ? +  W fT v 0 ԟ { M ڿ 0 W5 +Kr.K +u.R c2.zkK +qS2|vuQ8 y 2}< c2 c2~ c2 w5 +g 3g` J M 7N Z PWë z^| pa d  -  W (  ) z ^|  p a d  f+ fE) | B*j| ]@|fB3j| ]@u gB3 |PgB8j| ]@ugB8gB9|gB>!j| ]@uhB> B?% @h+ ȊMM-   +. Aq#+ W\ O T U z^| pa d W ? x y z^| pa d = "W^ > > WeJ "W^fK > WeUY "W^Y > We x D͚ i * ?Вt X ͚ e  ?7L L ͚  eb ? t 0QWĨ  Re=W H =!c=" Cr3 c2fTrC=" =32ju18`r2 c2 c2H c 2' . =A =eLW! +=r%=&u%R c%2.r=&uR c2.r=&uR c2.~Wq! +=Xc=XCr3 c2fTrH=X=52ju38`r 2 c2 c2H c 2'W! +=r.=u.R c2.zk=qS2|vuQ8 y 2}< c2 c2~ c2 W<" +=c=Cr3 c2fTrH==52ju38`r 2 c2 c2H c 2' W" +=r.=u.R c2.r.=u.R c2.%W# +=c=Cr3 c2fTrH==52ju38`r 2 c2 c2H c 2'Wf# +=\c=\Cr3 c2fTrH=\=52ju38`r 2 c2 c2H c 2'[x  = =n =Ʀ  = PQW = ^@U=3 QU=,wR= gwR QQq=.Q= gQ U= U +V 7@V="pV 'SpS, dS > S= 2 S? n%S=m%S\ n%S kV= 4qV= |WKj|V V]@ +`WL x^S= xT=nT=mT\ nT W=0W + X kPX= 4qX= |XKj|CY CY]@ +0YL7 %E0% E2Q JEJE(W +EG cFEH  rEI i c2P<|EI `S2SE) |SB*j| ]@|SB3j| ]@u TB3 |PTB8j| ]@uTB8TB9|TB>!j| ]@uUB> B?% I|2 V|+EI 2 u8 c2( cAEJ Wt . E"cE# Cr3 c2fTrCE# =32ju18`r2 c2 c2H c 2'Wާ H E"cE# Cr3 c2fTrCE# =32ju18`r2 c2 c2H c 2'We +E +E(W +E~cE~Cr3 c2fTrHE~=52ju38`r 2 c2 c2H c 2'Wz +Er.Eu.R c2.zkEqS2|vuQ8 y 2}< c2 c2~ c2WH Er-Eu-R c2.zeEqN2|vuL8 y2}< c2 c2~ c2W5. Er-Eu-R c2.zeEqN2|vuL8 y2}< c2 c2~ c2 Wߝr.E(u.R c2.zkE(qS2|vuQ8 y 2}< c2 c2~ c2W +EOr.EOu.R c2.zkEOqS2|vuQ8 y 2}< c2 c2~ c2W +ExcExCr3 c2fTrGEx=42ju28`r2 c2 c2H c 2'W` +EcECr3 c2fTrGE=42ju28`r2 c2 c2H c 2'W +EIcEICr3 c2fTrGEI=42ju28`r2 c2 c2H c 2'W' +EScESCr3 c2fTrGES=42ju28`r2 c2 c2H c 2'W +EZcEZCr3 c2fTrGEZ=42ju28`r2 c2 c2H c 2'$ B +EI+ _, Es +/ EdL Ed4[ Ed +W +Ec 2pEd rEK0 z` zS{ST `  3  o   =`5\15S o0  =`5\15S o  =@5\15  z0 zSS o@  =5\15S o`  =5\15 I5 tq Ed ? rEvzhz@S qS8I<  q  Q Ed/  U@5b 5 : .5 {S<{Ta qT z q@S1I<  q  Q Ed/  U5b 5 : . 5 q0S@I<  q  Q Ed/ p U5b 5 : .5{ l {SB qS8<q  Q Ed/   U`5b 5 : .5 {S<{Ta v0T q`Cq E) |B*j|0 ]@|`B3j| ]@uB3 |B8j| ]@uB8 B9|PB>!j| ]@uB> B?%SvICWWi "+. $+zCW qS1< q   Q   Ed/  U05b p5 : .5 qS@<q  Q Ed/  U5b 5 : .5 +C B +EScF _, EsWJ  +Ec 0Ed 1{EU%{S! S =p 15!S =P 15 I5 qEd P J{Ev={PSB |S<|Ta #vT qCq E) |B*j| ]@|0B3j| ]@u`B3 |B8j| ]@uB8B9| B>!j| ]@uPB> B?%_v'2CW&Wi $+ . $+zCW rS1V q   ^   Ed/ U 5 : .5 r0S8V q   ^   Ed/ Up 5 : .5 rS@Vq  ^ Ed/ U5 : .5Q B +EZ"U _, EsW  +Ec @Ed b{pE\V{S.S.S r0Ed  {{Evn{ SB '|S<|Ta /vT rCq E) |pB*j| ]@|B3j| ]@uB3 |0B8j| ]@u`B8B9|B>!j| ]@uB> B?%kvJCW>Wi $+ziCW )r S1c q   k   Ed/F .5 )rPS8c q   k   Ed/G .5)rS@  .5cq  k Ed/T п B<wB B(BĢ  Bs B B + N]Wۥ 'GUSGV ;OB' Q GV]W H Gz0SG{ B'  G{(< +WV +Hh c>Hj c>Hp W +H H 0uWZ +H,cCuH,&CrCu3 cCu2fTruHH,&=u52juu38`ru 2 cu2 cu2H cu 2'W +HxcHx +Cr3 c2fTrGHx +=42ju28`r2 c2 c2H c 2'H  0ZW̩ I@ZW L IJ I8PZrWS JI2 aZI3 ZIGZIo&ZI9 gZ ZI9ZI_&ZI9 gZ [I9;[IY;[I9 g;[ J[I9[Ix[I9 g[ [I9[I|[I9 g[ [I9E\IiE\I9 gE\ V\I9|YIB" YXp0Z +dZ 7ZI[ 70[I`[ M\I@\ 3\E'\6p\, d\ 7[IZ[ 7[IZ \ 7P\It!\ 7 ]It!  ] 7\Ie!\ 7]Ie!@] 7p]Ij] 7]Ij^ 70^Iy`^ 7^Iy^ 7^I} _ 7P_I}_ ^WҪ +I ^I cT_I f_I k_I _ I _I _I]W2 +I I _I`EP`E) |`B*j|` ]@|aB3j| ]@u@aB3 |paB8j| ]@uaB8aB9|bB>!j| ]@u0bB> B?%`bI b+  +.юcI&Ŏ`c @ c     ݎ p  d  cI  InI"Un5b X5 : .5)I$ )+@ {dIn@d @ apd k Hp \ d   E cI |I cSI I W# +I%cI%Cr3 c2fTrHI%=52ju38`r 2 c2 c2H c 2'_ W ] +S `HU dB(` g(` ca6_ ca6[ aidl b gb epPeE) |eB*|eB3j|b b]@ufB3 |0fB8j|b b]@u`fB8 bB9 |bB>! ubB> bB?% b pc'q/ c'+@ cc6r +\ r7 7 W +r7uR c2.   X u   + u +  +  _ X  G E w X 0 g & W  !! ! ! " N# a% % ' ( ( ( ( ( 0Z) ) oC C .R R  + 9 Q  07 M7 54Q mQ `S mQ K  Mk W ʨ  EC U r kZ 7' `  = a 0 5 5 5: u 5 ; 5 5 5 5/ j 5 d Ed f Ed Ei Ed k Ed n Ed q Ed 'eW   c4'6 'W 2  c'6ٰ0 K(3O (3z (. l (3 ̎ (3)' +(+L`+}-+++Z+?~? ? +J O ++Ʈ+2Y\U $W+kU  3/W) +3 +#3  3 W +3  3  W +3c3Cr3 c2fTrG3=42ju28`r2 c2 c2H c 2' -W!r3uR c2.r3uR c2.W +3r.3u.R c2.zk3qS2|vuQ8 y 2}< c2 c2~ c2o +3U U 3Cg[ U W J 4}^W] +4 cD4 Wd +4c4 +Cr3 c2fTrG4 +=42ju28`r2 c2 c2H c 2' xW .5WeV J5WƊ +5  5 J5 .5 WU 05 : .55W$ 5 p5.7pjm p= +m@  +p> n .5W X 5,W X 52 542WEX B +5X B +5X B +5u@Y J5W +5L=J5M1J5 I 5 U5M P5 : .5 5N `&W U5b  5 : .&5Y p 5=0Z 5%Wk 5dR$5e E5W +5qZ J5CW= J5 + 5 [ 5W 5 5 CW[ +5W[ +5 D 5 5 5 5  5( J5aW +5uc5uCr3 c2fTrH5u=52ju38`r 2 c2 c2H c 2' WVr5uR c2.r5uR c2.r5uR c2.r5uR c2.r5uR c2.r5uR c2. WJc5Cr3 c2fTrG5=42ju28`r2 c2 c2H c 2']W' +5r5uR c2.r5uR c2.r5uR c2.r.5u.R c2. Wbr.5[u.R c2.zk5[qS2|vuQ8 y 2}< c2 c2~ c2W +5}r.5} +u.R c2.zk5} +qS2|vuQ8 y 2}< c2 c2~ c2W +5r.5 +u.R c2.zk5 +qS2|vuQ8 y 2}< c2 c2~ c2%W< +5r.5 +u.R c2.r.5 +u.R c2.r.5 +u.R c2.r'5 +u'R c'2. +5 +5 +5[4( B +5[[ ;W$ 5YW B +,6g& W .WX +.] f.] g..^ g.7^ FM.W +.c.7Cr3 c2fTrG.7=42ju28`r2 c2 c2H c 2' +.wO O O /iWg O /[ 8 /d 8/d-JP /u:W J/t p/u m  p    0;F0 F hP/u + W /w =p/x 0R / R /;W X /z/{ $p/ m O 1p Q!  u/ + ;W$p/ m O 1p Q!  u@/ +p\W +//37  'p, d  c/ WZ +/kSP 0yP O0:ƌ 0 0:  0? h 0:'&' ?F &W +1Mc &1N Cr &3 c &2fW +1T 1U @&Wm +1ac@&1b Cr@&3 c@&2fWʈ +1h 1i GkW +68W R6~bW +6c6 +Cr3 c2fTrH6 +=52ju38`r 2 c2 c2H c 2'W +6c6 +Cr3 c2fTrH6 +=52ju38`r 2 c2 c2H c 2'6X\ \ 8]f \ 8g \ 8h \ 8i \ 84j \ 8$k \ 8k \ 8l \ 8hm \ 8m \ 8 8& / 8& m 8& 8&  8&t 8&Vwdr(WE z:z (Wz :0(W ZC:nrr:Q^ +:mWW +: c: :' .8 . %. z: cF:n P(W c(D:n W +:Bc:B +Cr3 c2fTrH:B +=52ju38`r 2 c2 c2H c 2' WI +:c:Cr3 c2fTrH:=52ju38`r 2 c2 c2H c 2'=_ @(WH { :W r:WĒ lX::W :PW& +:f(OWY Vw;' c(1;20)tW ;@ cc)6;E)3Wԓ { +;M w)';YLF_ t<, stsAQ>A, AO     b AO AP ;AQ AQ"sAN}! [d n) mAShW_ +AE>A, AO     b AO AP AQ AQ"sAN}! [d n) mAS_>AQ>A, AO     b AO AP ;AQ AQ"sAN}! [d n) mASW +Ai>A, AO     b AP AQ( ;AQ AQ"sAN}! [d n) snAS W +Ai>A, AO     b AP AQ( ;AQ AQ"sAN}! [d n) snASW~ +A>A, AO     b +AP ׌AQ( ;AQ AQ"sAN}! [d n) nASW +A>A, AO     b AP ׌AQ( ;AQ AQ"sAN}! [d n) nASW> +A>A, AO     b AP +AQ( ;AQ AQ"sAN}! [d n) nAS W +A>A, AO     b AP +AQ( AQ AQ"sAN}! [d n) nAS[>A>A, AO     b AP +AQ( ;AQ AQ"sAN}! [d n) nASW +A>A, AO     b AP AQ( ;AQ AQ"sAN}! [d n) ?nASW` +W &t$X  &X + X' g JX)o ^ X9r %WQ&t$X 'X 3XF3 y"X  y8#eXFP XW# oz +~8#eXFP XW# m#XL&  QXM =XR 0 0XR D` ]XR, pXV +m  r r s X5s vs X64W&&X' F)X(  X6 +oPz X)~ +n@X6,4W&3'X. F)pX/ X6 +oz X)~ +nX6,} ; WL MW +McM Cr3 c2fTrCM =32ju18`r2 c2 c2H c 2' W',cM  Cr3 c2fTrCM  =32ju18`r2 c2 c2H c 2'% +MW' +M cM Cr3 c2fTrHM =52ju38`r 2 c2 c2H c 2'"W' +M:cM:"Cr3 c2fTrHM:"=52ju38`r 2 c2 c2H c 2'n +W +N cN WU( +NcNCr3 c2fTrHN=52ju38`r 2 c2 c2H c 2'W( +NcN Cr3 c2fTrGN =42ju28`r2 c2 c2H c 2'WH +O& cO' W) +O rO &uR c2. W +R +rR + +uR c2.F ;  U<  U<A" +U#W +UcU +Cr3 c2fTrGU +=42ju28`r2 c2 c2H c 2' WE1cU# +Cr3 c2fTrGU# +=42ju28`r2 c2 c2H c 2'W +U9r.U9 +u.R c2.zkU9 +qS2|vuQ8 y 2}< c2 c2~ c2WC +UGcUG +Cr3 c2fTrHUG +=52ju38`r 2 c2 c2H c 2'W +UbrUb +uR c2.W +UsrUs +uR c2.s W<' +Z*r.Z* +u.R c2.zkZ* +qS2|vuQ8 y 2}< c2 c2~ c2s Wp) +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W) +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2#W,* +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W* +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2#W* +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2WG+ +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W+ +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2#W, +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2Wc, +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W, +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W!- +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2#W- +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W- +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W=. +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W. +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W. +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2WZ/ +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W/ +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2#W0 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2Ww0 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W0 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W51 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2#W1 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W1 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2#WR2 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W2 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W3 +[)r.[)u.R c2.zk[)qS2|vuQ8 y 2}< c2 c2~ c2Wo3 +[)r.[)u.R c2.zk[)qS2|vuQ8 y 2}< c2 c2~ c2#W3 +[)r.[)u.R c2.zk[)qS2|vuQ8 y 2}< c2 c2~ c2W-4 +[)r.[)u.R c2.zk[)qS2|vuQ8 y 2}< c2 c2~ c2/W4 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W4 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2WK5 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2#W5 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2/W 6 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2Wh6 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W6 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2#W'7 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W7 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2 +W7 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2 +WD8 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2/W8 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2/W9 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2Wc9 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W9 +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W#: +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W: +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W: +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2WA; +[r.[u.R c2.zk[qS2|vuQ8 y 2}< c2 c2~ c2W; +\r.\u.R c2.zk\qS2|vuQ8 y 2}< c2 c2~ c2#W< +\r.\u.R c2.zk\qS2|vuQ8 y 2}< c2 c2~ c2W_< +\r.\u.R c2.zk\qS2|vuQ8 y 2}< c2 c2~ c2#W< +\r.\u.R c2.zk\qS2|vuQ8 y 2}< c2 c2~ c2W= +\r.\u.R c2.zk\qS2|vuQ8 y 2}< c2 c2~ c2#W~= +\r.\u.R c2.zk\qS2|vuQ8 y 2}< c2 c2~ c2W= +\r.\u.R c2.zk\qS2|vuQ8 y 2}< c2 c2~ c2W>> +\r.\u.R c2.zk\qS2|vuQ8 y 2}< c2 c2~ c2W> +\r.\u.R c2.zk\qS2|vuQ8 y 2}< c2 c2~ c2W> +^ +c^ +Cr3 c2fTrH^ +=52ju38`r 2 c2 c2H c 2'mh?S Pw?w ??4@@@AAnA@F@@@wW@ c%9%D Gw 3Ew6 Sw >!Ex "/ Q&x&,`&xpEDx(  _ v +@] +BAADm5 h?EP`x?w ??4@@@AAnA@A!Ex"/ Qx#&,`x#oEy (  _ v +@] +FBu %BU9.n: ; .n: ; .@n: ;1UX YW 1X Y W 1UX Y W 1X YW +1X YW 1UX YW 1X Y W 1UX Y W .@n: ; .@n: ;.@1.@n: ; .@1.n: ;? .@n: ;?.@n: ;?.@n: ; ?.n: ; ? .@n: ; ?.@n: ;.@n: ; .@n: ; 1X Y .@n: ;?.@n: ;?.@: ; ? .@n: ;!.@: ;?".@: ;?%BU9.n: ; .@1.n: ; .@n: ; .@: ;?1X YW 1UX Y W +1UX YW 1X Y W 1X Y W 1X YW .@n: ; .@: ; ?.@1%BU9.n: ; .@n: ;1X YW .@n: ; .n: ; 1UX YW 1UX YW +1UX Y W 1X Y W 1X YW 1X Y W 1UX Y W .@n: ; ?.@1.n: ; ? .@n: ; ?%BU9.n: ; .@n: ;?1X YW .@n: ;?1UX YW 1UX Y W 1X Y W +1X Y W .n: ; .@n: ; 1X YW 1UX YW .@n: ;?.@n: ; ?.@: ;?.@: ;?.@n: ;?.n: ;? .@11UX Y W .@n: ; ?.@n: ;.@n: ; .@n: ; %BU9.n: ; .@n: ; .n: ; .n: ;? .@n: ; 1UX Y W 1UX YW +1UX YW 1X Y W .@1 1X YW .@n: ;.@1.@n: ;?.@n: ;?1X YW 1X Y W 1UX Y W .@n: ;1X Y .@n: ; ?.n: ; ? .@n: ; ?1X Y 1UX Y .@n: ;?.@n: ; ?.@n: ; ?.@n: ;?%B9.n: ; .n: ;? .@: ;?1UX YW 1UX Y W 1X Y W 1X Y W +.n: ; %B9.n: ; .n: ;? .@: ;?1UX YW 1UX Y W 1X Y W 1X Y W +.n: ; 0" /rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/iter/adapters/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/str/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/slice/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/slice/iter/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/ptr/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/array/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/ops/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/src/collections/btree/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/src/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/mem/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/fmt/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0//rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/src/vec/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/num/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/convert/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/char/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/sync/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/iter/traits/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/iter/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/../../stdarch/crates/core_arch/src/x86/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/src/collections/btree/map/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/alloc/cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/cargo/registry/src/github.com-1ecc6299db9ec823/addr2line-0.14.0/src/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/hash/cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.85/src/unix/linux_like/cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.85/src/cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.85/src/unix/linux_like/linux/cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/read/elf/cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/read/cargo/registry/src/github.com-1ecc6299db9ec823/miniz_oxide-0.4.0/src/inflatefuse.rsiter.rspattern.rsindex.rsmemchr.rsmacros.rscmp.rsoption.rstraits.rsconst_ptr.rsmod.rsmap.rsmod.rscmp.rsmod.rsfunction.rsmap.rs mod.rsnode.rs navigate.rs alloc.rs +maybe_uninit.rs mem.rs any.rsmod.rs library/std/src/sys/unix/process/process_common.rs library/std/src/sys/unix/time.rs library/std/src/time.rs mod.rsstring.rs +library/std/src/ffi/os_str.rs library/std/src/sys_common/os_str_bytes.rs num.rs library/std/src/ffi/c_str.rs nonzero.rsbuilders.rs mut_ptr.rslibrary/std/src/sys/unix/os.rs library/std/src/process.rs library/std/src/sys/unix/fs.rs library/std/src/path.rs library/std/src/io/error.rs result.rslibrary/std/src/backtrace.rs non_null.rsnum.rslibrary/std/src/sys/unix/process/process_unix.rs library/std/src/net/tcp.rs methods.rsintrinsics.rslibrary/std/src/sys/unix/mutex.rs library/std/src/../../backtrace/src/symbolize/mod.rs mod.rs library/std/src/sync/once.rs library/std/src/sys_common/mutex.rs library/std/src/sys_common/backtrace.rs library/std/src/lazy.rs library/std/src/sys_common/remutex.rs library/std/src/io/stdio.rs raw_vec.rs +library/std/src/io/buffered/bufreader.rs library/std/src/sync/mutex.rs atomic.rslibrary/std/src/io/buffered/linewriter.rs cell.rssync.rs +sort.rsinto_iter.rslibrary/std/src/sys_common/poison.rs library/std/src/panicking.rs library/std/src/thread/mod.rs library/std/src/sys_common/net.rs exact_size.rslibrary/std/src/sys/unix/fd.rs library/std/src/io/mod.rs library/std/src/../../backtrace/src/lib.rs library/std/src/sys/unix/stack_overflow.rs set_len_on_drop.rslibrary/std/src/../../backtrace/src/print.rs library/std/src/../../backtrace/src/symbolize/gimli/mmap_unix.rs library/std/src/io/buffered/bufwriter.rs range.rsdrain.rsrange.rsuint_macros.rsvalidations.rsrev.rsiter.rsxsave.rsspec_extend.rslibrary/std/src/io/impls.rs boxed.rs +search.rs entry.rsenumerate.rsremove.rs layout.rsrc.rs +line.rsendian_slice.rsclone.rsleb128.rsreader.rsunit.rscommon.rsconstants.rsabbrev.rsdwarf.rsstr.rsrnglists.rsaddr.rsop.rslib.rsloclists.rsarith.rsslice.rs +lazy.rswrapping.rslibrary/std/src/lib.rs mod.rsstr.rs +borrow.rs +library/std/src/thread/local.rs library/std/src/sys/unix/rand.rs library/std/src/sys/unix/weak.rs library/std/src/fs.rs library/std/src/sys/unix/mod.rs library/std/src/error.rs mod.rslibrary/std/src/collections/hash/map.rs library/std/src/thread/available_concurrency.rs library/std/src/sys_common/thread_info.rs library/std/src/sys/unix/thread.rs time.rslibrary/std/src/sys_common/thread_parker/futex.rs library/std/src/sys/unix/futex.rs library/std/src/sys/unix/memchr.rs library/std/src/memchr.rs library/std/src/../../backtrace/src/backtrace/libunwind.rs library/std/src/../../backtrace/src/backtrace/mod.rs library/std/src/env.rs library/std/src/../../backtrace/src/symbolize/gimli.rs sip.rslibrary/std/src/sys/unix/args.rs spec_from_iter_nested.rsiterator.rsspec_from_iter.rscollect.rsflatten.rsmod.rsascii.rslibrary/std/src/sys/unix/path.rs library/std/src/sys/unix/stdio.rs library/std/src/io/buffered/linewritershim.rs double_ended.rsfilter.rstake_while.rsaccum.rslibrary/std/src/io/cursor.rs library/std/src/sys/unix/io.rs library/std/src/io/util.rs library/std/src/net/addr.rs library/std/src/net/mod.rs library/std/src/net/ip.rs library/std/src/net/parser.rs library/std/src/sys/unix/net.rs library/std/src/net/udp.rs library/std/src/panic.rs library/std/src/sys/unix/pipe.rs library/std/src/sys_common/process.rs mod.rsmacros.rslibrary/std/src/sync/mpsc/blocking.rs tuple.rslibrary/std/src/sync/mpsc/sync.rs library/std/src/sync/mpsc/mod.rs library/std/src/sync/barrier.rs library/std/src/sys_common/condvar/check.rs library/std/src/sys_common/condvar.rs library/std/src/sys/unix/condvar.rs library/std/src/sync/condvar.rs library/std/src/sys_common/at_exit_imp.rs library/std/src/sys_common/mod.rs int_macros.rslibrary/std/src/sys_common/alloc.rs library/std/src/sys/unix/alloc.rs library/std/src/sys_common/fs.rs library/std/src/sys_common/bytestring.rs library/std/src/sys_common/rwlock.rs library/std/src/sys/unix/rwlock.rs library/std/src/sys_common/thread.rs library/std/src/sys_common/thread_local_dtor.rs library/std/src/sys/unix/thread_local_key.rs library/std/src/sys_common/thread_local_key.rs library/std/src/sys_common/util.rs library/std/src/sys_common/wtf8.rs library/std/src/alloc.rs panic.rslibrary/std/src/rt.rs library/std/src/../../stdarch/crates/std_detect/src/detect/cache.rs cpuid.rslibrary/std/src/../../stdarch/crates/std_detect/src/detect/os/x86.rs library/std/src/../../stdarch/crates/std_detect/src/detect/bit.rs library/std/src/../../stdarch/crates/std_detect/src/detect/mod.rs library/std/src/os/linux/fs.rs library/std/src/sys/unix/ext/fs.rs library/std/src/sys/unix/ext/io.rs library/std/src/sys/unix/ext/net/addr.rs zip.rscloned.rslibrary/std/src/sys/unix/ext/net/ancillary.rs mod.rslibrary/std/src/sys/unix/ext/net/datagram.rs library/std/src/sys/unix/ext/net/listener.rs library/std/src/sys/unix/ext/net/stream.rs library/std/src/sys/unix/ext/ucred.rs library/std/src/sys/unix/ext/process.rs library/std/src/io/copy.rs library/std/src/sys/unix/kernel_copy.rs library/std/src/sys/unix/thread_local_dtor.rs error.rslibrary/std/src/../../backtrace/src/symbolize/gimli/stash.rs spec_from_elem.rsfile.rspod.rs section.rslibrary/std/src/../../backtrace/src/symbolize/gimli/elf.rs symbol.rsfilter_map.rsmod.rs!mod.rs"compression.rsendian.rs library/std/src/../../backtrace/src/types.rs library/std/src/../../stdarch/crates/std_detect/src/detect/macros.rs  + J{f6<CJ ~JTf|G ~&<}XJ.<f+~f<4~J<<f#KIfi.*ft~.J~f J Cff ~JTft ~J&<}XJJ J J.| JD2P<Gb<< t / }J +<  Jr2 +} e<< }X S  += JtX  <v f} t <y.  t<}  <|. <<+.7f {J XGj <f zX . t f 8zf  [ Cw    +g J [v f} t <y.  t<}  <|. <<+.7f }J<G <f zX < t f 8zf$#< < 'w    +g J [v f} t <y.  t<}  <|. <<+.7f }J<G <f zX < t f 8zf$#< < 'w  V +  + V + V +  +  +< G +t0q<8 X0uJ8 0uXT= G +t&s<&WT  G + s<#D HT  + G +<x<7< ~J G +<x<7< xJ G +><< VG +t!q<K/K  G +<" u<t G +><#p<!X~JXT!qf9KTf!qfTf G +<>t  G +>< to <$#%|X$ J|J~. <T~f G + < G +>< G +<<>t G +t<0q<8 0uXT= G + s<  }<~.$%|X$ J|<~. <T f & + +qXT# ' +r< G +t!q<K/K  G +<<x<7< xJ G +>< to <~.$%|X$ J|J~. <T~f G +(,r<,VT / G +<< xt G + <0 T~, G +* p< G + r< . 3{  J$z- 6v)<$~   X x } t <+y. < <~ <<+f7s t t~. <f z<z  t f 8+zt . <{f T f G + <%p.$J K%|$J K%|$J K- K  T~ ' +s< WG +x<7< Jo <~.$%|X$ J|J~. <T~f WG +<>t G +t!q<K/K  G +t0q<8 X0uJ8 0uXT= ' +s< G +t0q<8 0uXT= G +>< G +( r< VT / WG +t!q<K/K  XG +t!q<K/K  G +,r<~< +, ~.~XT Xp,f G +<(s<<7J xJ G + to <$&-|X$ J|J~. <T~f G +>< G +t0q<8 0uXT= G +t0q<8 0uXT= G +>< G + 8/.r< {<f t}.}t< ft} tt} tt} tt}.}t <{J..LXL J$v 'v  +"x t} t <+y. < <~. <<+f7s t t~. <f z<z < tz< f 8zf < <{f t<$ X Y  X xX} XTjp< G +t0q<8 0uXT= G +t!q<K/K  G +t" r<$ H VT  G +<>t  G +( +r< +VT / G +>< G +t/&t<&WT  G +)s<zJU*zXT ' + G +t!q<K/K  G +><0 w< pXG +>< G +>< G +>< G +>< XG +>< G +>< G +>< XG +<>t  G +>< XG +><! X +K/K !  +K/K !  +K/K !  +K/K   Y+ +=1 +fs.  X tY~.1 X`. X . <u . tY1 +."t <uX <u . tY1 . <uX <uX <u . tY + +=1 +fs.  X tY~.1 X`. X . <u . tY1 +."t <uX <u . tY1 . <uX <uX <u . tY + +=1 +fs.  X tY~.1 X`. X . <u . tY1 +."t <uX <u . tY1 . <uX <uX <u . tY Y+ +=1 +fs.  X tY~.1 X`. X . <u . tY1 +."t <uX <u . tY1 . <uX <uX <u . tY Z+ +=1 +fs.  X tY~J1 X`. X . <u . tY1 +J"t <uX <u . tY1 J <uX <uX <u . tY + +=1 +fs.  X tY~.1 X`. X . <u . tY1 +."t <uX <u . tY1 . <uX <uX <u . tY [ + g  + g [ + g \ + g  + g  + g  +<  +< P\ + `\ + X \ +  +2 << tt,7 < J13|J,? XpJ<,~.J,4}~JJ3.|, \ + X  + 2 << tt91VX"<: }f  +<  + X \8 +~ 8 ~F.< J <~.~<  +X2 << tt}<= >J e9'.%"m<~f<~~ >f  ]? +t9 n6t9~J;J3 |.;}.@ A  t2;u2 +$3r+x#;O{t<Pt  ," ++ v , +|.0~<  + X 0^ + @^B + +?<B yX?.B wuX  +f< t~.< J~X" J{< 9JGXJ  +~Q<nJ" <{< 9JGX<< t <.|XJ|.< J <~.<J|XJ|XX   +Q +<nJ'< f~.< J~X< t~.< J~X< t <.|X|X  P^C& +~0<2Jr p^< + <.|Xt|X  +J< f~.< J~X< J <~. ^2 + rJ  + ^ +X  ^ +ttX~tX~t~<%  + Jw {<f t}.}J Jt} tt} tt} t}.} J{J..  +ftX <t5zX~X<   + .t  < v <~.< <~t J zX}<<}J +tX  <w. <<|.t p_ +DLX<  J <5t|.J _ +J~X< JGXJ~J~< ` +t JGX<~J~< E +~t J>[.?<F o> X7 }<3h<F E ~f?J `` +t~< ` +Q +<nJ<Ȭ< t <.|Xt|Xf~<~<t~X @bDL +<  J <5J|.<  +<  + w {<f t}.}tJ Xt} tt} tt} tt}.}t J{J..  +ftX <t  Xt  < v <~. X zX}X<}J +tXJ  <w. <<|.t~< `b< + <.|Xt|X b +J< J <~.<J|XJ|X< J <~.<J|X|X< J <~.<J|XJ|X< J <~.<J|XJ|.  +< 0c +< J <~.<<|X|X /3 +< `c +< J <~.<<|XJ|X H" +o< /< +< c +< J <~.<<|XJ|. c +< J <~.<<|X|X cD +'~J;J +J~fD~.J  JGXJ~JDLX<  J <5JD|.<~<~fD<~ d +~[.?<F o> X7 }<3h<F E ~f?J  i + 0i +~f<< t~.< J~X  +Q +JnJ~~< J <~.X< < <~.<J|X<|.t< t~.< <~X<  <.|X|Xf + `i +f< J <~.<J|XJ|.  +J< J <~..X< J <~.<J|X<|.< t~.< J~X  i +.Q +<nJX< X <~.<X|XJ|.< t <.|XJ|X Jt t{<f t}.}t< ft} tt} tt} tt}.}t <{J..  +Xtf <t  X zX zX}J<}J +tX  <w. <<|.t~  v~XX~X<X|XJ|.< B + +?<B yX?.B wuX Pl3: +Y< % +tM~J~.<  &<%}&<M4} tb `l7 +~3<  +N ~< pl +< J <~.<<|XJ|. lO + l +Q +<nJ'< f~.< J~X< t <.|X|X  Pm +J< f~.< J~X< J <~.<J|XJ|. m +< J <~.<<|XJ|.< t <~.<t|X|XP~fQ +tnt< f~.< J~X<  <.|X|X~<, n +Q +<nJ 9XGtX GXX< t <.|XJ|.f +  +Jf o +?B yX?.B wuX oP +~ o +< J <~.<J|X|X  +Q +<nJ'< f~.< J~X< t <.|X|X   +< J <~.<<|XJ|. o +Q +<nJ'< f~.< J~X< t <.|X|X  p +<< J <~.  +t JGX<~J~<  +JXff.J<fJfJ  +J  +J.JXf<JXf<JXt p +< J <~.<<|XJ|. p +" {< 9JGX<  +Jtf  +<  +Q +<nJ"' <{< 9JGX<< t <.|XJ|.< J <~.<J|XJ|XX   +<< J <~.  +X~X JX~Jf  +~  +~< + +{X<<$ }JX+ Y<{+ X <st|f+ <c   d +s< ti +JLGd Je ! "f<~f<~ <c{d  <fLd e !fMX5<X <>\d ? tc# < d s tfLXd .T fg -d J <Lfd .Tfg2f t   <U}f {f<~f Jw<aWU.aWy<< Zf 5L xJ+ J<Rw `TOc|  ctJ4 XT zX|fd XUJd }tfXd J Lfd e !fli   + <dv+  Jxtc{ rJ< t <~Jd<f~f+  fcs< t <~.<X|XJ|Xc r+  cs< t <c Jr< "X+|c c   +rd . i +<LGd Je !tc g uJd } i +<LGd Je !tg<+ Xgv.d ~ ti 9 +d ~Je !tfM<5<X <>dB 9 Jc td r i +<LGd Je !td [ i +<LGd Je !tc Jd r i +<LGd Je !tc <d r f+  <vg.v0d }1t<~.d)=Xl~J<~.+  fd t  ti 9wLd e !tfMX5Jf <>d ? fr.d< ~ ti +<LGd Je !tc~Jd   ti +<LGd Je !td [ ti +<LGd Jc" td rJf  Jf5tX <=>d V Ji +<d ~Je !tf9g d } i +<LGd Je !tg<+ Xgv.d ~ t1 9 +td ~Je !tfM<5<X <>dB 9 Jc.g  d } i +<LGd Je !tg<+ Xgv.d ~ i +<LGd Jc tg u0d } cfd P ti +<LGd Je !t~d  1 +<LGd Je !tc Jd r 1 +<LGd Je !tc d r< cfd  i +<LGd Je !tc <r* r*df +<LGd Je !tg<+ Xgv.c Jd r* i +<LGd Je !tc <d r* 1 +<LGd Je !tc <d r* cfd +<LGd Je !tc <r f J  <c tLsTd J < ~f J}f +<LGd Je !tg<+ Xgv.d~f +<LGd Je !tc <rh<d q <Lfd Ld 6c *c  d +t t.< 9Ld e !tfMX5<X <>\d ? J fr.d<~+  sc d t .fLd e !fMf5<X <>Nd ? .~+  d t t. + d ~Je !tfMJ5<X <>Nd ? J.+ c"*h d +p2h d q ti +JLGd J.Tf= -Xd zX < +fLGd J.TfK2X <Yd tJ < +.LGd Je !fli fh+ |hEXp+  Xdv}J+  Xshnd - ti G +d ~Je !fM<5<X <>dB 9 ti G +d ~Je !fM<5<X <>dB 9g d } i +JLGd Je !g<+ Xgv.d ~ ti G +d ~Je !fM<5<X <>dB 9 tiL<d e !fMX5<X <>d ?  i +JLGd Je !h d o i +JLGd Je !h <grd }   i +JLGd Je !h <d o) i +JLGd Je !d [ i +JLGd Je !d [t i +JLGd Je !h Jin.hJpfXed p ihJpfXed p i +JLGd Je !g<+ Xgv.d }<~.d)=.Xl~J<~.+  fd t tiL<d e !fMX5<X <>d ? h.d  t1 +JLGd Je !h~<  n)d  ti +JLGd Je !d [ ti +JLGd Jh&d p.f  Jf5XX <=>d V Ji +Jd ~Je !f9g d } i +JLGd Je !g<+ Xgv.d ~ ti G +d ~Je !fM<5<X <>dB 9hg s|d . ti +JLGd Je !d [ ti +JLGd Je !d [ i +JLGd Je !h Jd o. i +JLGd Je !h <d o i +JLGd Je !g<+ Xgv.h Jgr)d } i +JLGd Je !g<+ Xgv.}d  i +JLGd Je !h <d o i +JLGd Jhgr.d } i +JLGd Je !g<+ Xgv.d ~ i +JLGd Je !g<+ Xgv.h Jj!o) Xh fd o, ti G +d ~Je !fM<5<X <>dB 9 ti G +d ~Je !fM<5<X <>dB 9 Jh.d   hfd 9 ti +JLGd Je !d [ i +JLGd Je !h Jd o ti +JLGd Je !d [ i +JLGd Je !h JnJd o i +JLGd Je !h d oX 1 +JLGd Je !h <d o hfd J hfd  i +JLGd Je !h <d oO i +JLGd Je !h <gr)d } hfd Q i +JLGd Je !h <d o) i +JLGd Je !h <+ {)hsJ tnfnRf t  <h tdo) +JLGd Je !g<+ Xgv.}h nL+d J J ~f X}f  <L.d h d o) <fh JLp{d 6h d o) hfLXd gfd } hfd6 +JLGd Je !h J)h  +u +d~J fJ  q ) ~J fJ  q{J f|J  qqqq   qqqqq}J f}J  q   qqq~J fJ ~J fJ  qqqqqqq r  r  r    q~J %f[J  q B# gg[K<ff|f# gg[K<pf|f# gg[K<ff}f# gg[K<ff}f# gg[K<ff}f# gg[K<ff~f# gg[K<ff|f# gg[K<ff|f# gg[K<ff}f# gg[K<|.# gg[K<f.}f# gg[K<f.~f .~X# gg[K<.l  +L~d  < +Pf<<~fd)=Jl~J<dt  < +Pf<<~fd)=Jl~Jld~t  <lI. +Ci ~< m d J <}.+ Xlud~X  < +Pf<<~fd)=fJl~Jl/~< +Wi ~<g<d }. J+ .vg.v0d ~ Je%fXg<+ Xgv.d}J  < +P.<<~.d)=.J4~J<l~.<~Xg  +L|d . t1 +<LGd Je !td [ 1 +<LGd Je !td [ gffd }X f+  <vg.v0},<V|<d}X +<LGd Je !td^J +<LGd Je !tg<+ Xgv.}Jn  +   }Jn<|f+  nDvX} X  }Xn7FX fd~f +JLGd Je !nt}fd  <fLd e !fMX5<X <>d ? n<+ n5xX+ n3xX o~f#ft.~ <~<J:yd|X  <n}f +fo ~<d J <g f|d f <e%fd [X Je%fd [X Je%fd [J Je%fg<+ Xgv<}Xf)nd ~t+ +tdun <|t<{X|g|X+  Jsd f <fLd e !fMf5JX <>d ?  <fLd e !fMf5JX <>d ? <fLd e !fMf5JX <>d ? n. +  nEvX+  nCvX}X| X+  nEvX}Xd } i G +d ~Je !fM<5<X <>dB 9+  vg.v1d ~ tf +d ~Je !fM<5<X <>d ? tf +d ~Je !fM<5<X <>d ? J t tf +d ~Je !fM<5<X <>Nd ?n,?X X<U <n ~<U <n ~<{<< <d }.nt|J|<dn:d|X  <n}. +fo ~<d J fg .|d f <e%fn:d|X  <n}. +fo ~<d J <}.g |d t <e%.d [ Je%.d [ Jf  J+ fvd tt Je%fd [ Je%fd [ Jnfe NXg<+ Xgv<o }Xd J <g f|d f <e%fn~e g<+ Xgv<n}Xd  Je%fd [ Je%fd [t Je%fg<+ Xgv< +  +y<7< ~J   +u7< Jo <~.$$%|X$ J|J~. <f 0 +t~X<8 0uX5= 0 +t~X<8 0uX5= 0 +t~X<8 0uX5= 0 +t~f<8 0uX5=+  +~t0J7 0sX6#0xX~tX5 h  + +5yJdx h +J   +o<   +eJ %  +[< /  +QJ 2  +NJ 5  +KJdx h +Jez h +J  +@J  +J  +J   +J  +J  +J  +J  +J  +J  +J  +J  +J  +J  +J  +J  +J  +J  +J  +J  +J  +Jdx h +J  +~<  +~<  +~<  +~<  +~<  +~<  +~J  +~J  +~<  +~<   +~<  +~<  +~J   +~Jq  +fd}<h  nh<l~f  Hd j Ji +LGd Je !g|.d . <g<d }f J +fLGd Je !gJ+ gvd ~X < +fd ~J ~ Jf +tLe JhXt{.g <d } JfLe J +Xg J+ gvh d| <f  Jhf +XLUe Jg d } Je%fgJ+ gvd ~X JfLe J +d ~J <Lfe  +h J{d . Je%f~h{d * f +fLGe JgJ+ gv Xd }. JLfe J +Jg J+ gvd ~ fLfe J +Jg J+ gv}<d  fLfe J +Jg J+ gv} h{<qJd~t t X/k}d~ X <fe<fMX5<X <>Nd ? tk}d J <e%f.ffg -Xk~+ tk"uJ(~g X~d < <fd J <Lf.~fg2X <YJkf~d J <e%fflt +f.~JfNd ? h dm  -<h gd m f +fLGe JgJ+ gv Xd } JLfe J +Jg J+ gvd ~ JLfe J +~Jd  JLfe J +~Jf<UtkxJ g~+  ;kDuJ<  <~f<|J|f +.V] }J<..X]v<' <]{<!.xJd fhl<q~Xd k| ~B{<j!>hk +n<h~ f z$h<nff0h q<< ! +pLGhJ+ zl$x{fL- JD{%- J-FJ J>J  JB@f J5G J{)xt$JJ, JBh    oXh<.0Z nnl'X:h  ff ofh -Xdof [2 J+ }l$x ,{fJ+ ~0| l . {fJ+ ~-| l . Xdut  <}. ++d ~ lf +LGe Jg|.d  <c fd v Jffg<|.d  J+ fv<g.v@+  cs  +LGd Je !c~J  +J uf +Lqe JgJ+ gvd ~ fcf+  <c`tJ*+  lx{J"|~.l , q |3d~q#d J < +d ~Je !fM<5<X <>NdB 9 JhtUvXkxJ /h o+fV] }J<..X]vJ, <]{<!fxJ j!|<h J /j!mq%Xdf~c  + Jd v. < +fd ~J T x Te%f +LGd Jc ug<d } J+ fv<g.v@k +q~<<q~fh <q$otq7fh* p<+yJq=u, #7K~9zJG <!Jl t*_<d~  <hf +~i ~< n d  < +Pfi ~<g<d }f Je%fg<+ gvqG$J~K$J~ :l~Jd J Je%f~.s-d  J+ . +uLGd e ! g<+ gv +tLGd e ! ~.d  }f  ~X <f +XLd Je !c u5 +<2fd vf <f +XLd te !c uq tx~< h yn|<&#~d  n&Ffl 7 +Qn ~d~q" J%0+ Jq6}v %f v% v  Hv  T U}. {f<~f Jw<aWU.aWy< Zt <+.~v< y+ <Rw `~%~  X  u<h~d  < +fd ~J T x Tf +fd ~J T x Tf +LGd Je !c Gd v <. +<LGd e !c uJ8 +Xg v<d L <. +Cd ~J c  f gv< +f><}fd)=JJ4~J<~tLJd < X ~f X}fLJd 6t  ~.c < f <U}f {f<~f Jw<aWU.aWy< Zt <5 x+ <Rw `~A d t +<<c& +  cB~<+ u<  <c~  +d v$ 1 U +d ~e !fM<5<X <>d w J.~<  <~.<|X|Xc +vJ<  <~.<|XJ|X4 T z<|fT c|f$~*  .c+ ~cB<j!sc  s. f|   tfU {<{f< Jw<aWU.aWy< Zt <~. x+ <Rwt| ~|% < 4~T z<|ftc  f y. <+ 'cs<<  <c&+  cB~Ju+  Xsc  +d u i U +d ~e !fM<5<X <>d w J.c  +0d u<~f +J> }fd)=JJ4~J<~tLJd < X ~f X}fLJd 6t  ~.c +<!i+ XcB~H! * XtfUX {<{f<X Jw<aWU.aWy< Zt <~.XL x+ <Rw `~%~  -d t +<<~f<  fc~.<|Xf|. f~fd<~t<  <f|J|4 JT z<|fT c|f#~*  c9Zs2~fc X+ ~cB<r  Xrh2qqJ<c..<e sfh  @qqJ< /qqJ<.r.h#.rth##I=fqf.4h#.rth##I=fqf.4h#.rth##I=fqf |   tfU {<{f< Jw<aWU.aWy< Zt <~. x+ <Rwt| ~|% < 4~T z<|fc v~?twJ g JgT |J2 T v.4T z<{fU< ~J ftfyft4t|Xy.  ~J2 4{ T zJ|f4 ft}Jy.2<4{T zJ|f4 Jt&~aWzU.aWyf<<~f t< J~t y+~t < i twf <L4tt~Xgw"XX(J4t~f y. fh< f t2 t vf z.   <}ftF))<4t~f +.w yft  yJ ftfyt4<t|yf  ~J2 4{<T zJ4.t}Jy.2 4{.T ztt|.4 Jt}X2.ty  <tfU< {f<~f Jw<aWU.aWy< Zt <+.~vt}+ <  << v+ <Rw `~ tt wwt6H2<t5zJ J%yJ/2tp  Xt'XX;0J$fX2J</J2f<fwXt,XX<X.WX +xJt~( y< f~f<~f%CtJ<2f%st <"'4Jvt2ty <6',:x2X%st <x<"4Xt}J%z.tX%ztJx<%f2 Jtx< <xf6?,:6Zx   <t<  <5J|.<|X<  <~.<|XJ|.?p<.x~".q <w<q JJq   F}tq }JJq w<q X Jw<q .I Jw<q XI Jw<q  Jw<q XI Jw<q .I Jw<<~dfh~.4,Lh~+  v<sthf+  +v<hsXEd + +fsqX<  <~.<|XJ|.q} hf~+  Jqst~+  +v<g.v@  +tJ  < " }tJ yt < g~<."< "X "X< "X "X }~t<+.|}~ Jtc  t<twfq ~c tX t< ttl{kf}X~tq$}Xq & +u| f7 <aWqU.aWy<<~f ~X<~<< J2 + {7aWqU.aWy<<~f X<~<<~ 2 + {7aWqU.aWy<<~f X<~<<~ J2 + {7aWqU.aWy<<~f <~2#dq.  +<uc vettc t}tuXc +<< wtc +JZ +jt +j v ~Y '%xX t c { z.Yt< J8 }  |c<d{f +LGd Je !c<!j|+X)}0 td z <frfLfd e !<fMf5<X <>d ? c )}0 t <U fv{c d y <Lfd c"d } <Lfd e !cX|3.X)}0 td z <frfLfd e !<fMf5<X <>d ?  <frfLd e !<fMf5<X <>d ?c7 X)}0 td z <f"fLd e !<fcX <~< <d V  t <frfLd e !<fMf5<X <>d ?c3 X)}0 td z <frfLd e !<fMf5<X <>d ? c2tX)}0 t6}X)}0 t9}X)}0 td z J +fLGd Je !cX)}0 tdy  < +Pfd ~< <e%fctd | <frfL<d e !<fMf5<X <>d ?c }f<fd)~Xl~J<d Jt <frfLd e !<fMf5<X <>d ? c;tg s|d . <Lfd e !c.)}0 tUcy)}0 tf z J <ct)}0 t})}0 t})}0 t})}0 t})}0 t})}0 td z <ffd e !fMJ5<X <>Nd ? 4 tT z<Ufd }t <ct)}0 tL{d   <LMfd 6tc%f+ JcQwC%')}0 td z JLfd e !d [ JLfd e !d [ JLfd e !gX+ gvc)}0 t }.)}0 td z <c/<g<)}0 t;u֑p4j)t  t)..yXc< <U fcyJ%  +0 U}f {f<~f Jw<aWU.aWy< Zt +f~LcJU cytcw< + J<Rw `~O- { 0tdc~ux!t#! <.xc <c<U .v{Jc U cyU cydf~t+  fwsct{+  U zjJv{Jc xf2cXf{wctd |<+ +q;wc q}f7 f p <|f<2uq'cf J   <<zf ~~+ {q#f&K K(J? qqt/</K=  U}f {f<~f Jw<aWU.aWy `t< z<m e~Xq,<  U}f {f{f<< Jw<aWU.aWy< Zt f+.~v x~+ t<Rw `~O ~+ <Rw `~ Xtc?g~cz<+ tv<g.vRc}'?twJ g JgT |J2 T v4T z<{fU< ~J ftfyf J4<t|Jy. <2 4{T zJ|f4 ft}Jy2<4{T zJ|f4 Jv<<c~t&aWzU.aWyf<<~f tX<< J~.tXwL < i twf <L4ft~Jgw$XX(J4t~f y. fh< f t2  t vf z.  X <}ftF))<4t~f +.wt< yft  yJ ftfy t4<t|Jyf 2 4{T zJ|.4 ft}Jy2<4{T zt|.4 Jt}J2ty% X <U}f {f<~f Jw<aWU.aWy< Zt <+.~Xvt}, < X << vt+ <Rw `TOX tt XwwXt6"x2<t5zJ %yJ/2tp  X!Xt'XX;0J$fX2J</J2f<fwXt,XX<X.WX +xJt~( y< f~f<~f%FtJ<2f%st <"84Jvt2ty <6'x2%st <x"4Jt}<%z.tX%z tJx<%f2 Jtx< <xf6?,:6Zx . X <t< X <5J|.<X|XQ +XnX 9XG X GXX< X <5J|. c  v. }  ~q.M.t+ XqVw|.< ~+ <Rw `TX z< |+ <Rw `TX tq%2 ~q|dc t tv.  < wf~~ }<q <+ %qHw|   <U}f {<~f Jw<aWU.aWy< Zt <+.~X x+ <Rw `T|q X <<$|f| ~+ <q{.xX~<*< f~.< J~X<  <5|tX<  <~.<|X|XQ +n 9XGX GXX<  <5J|.!X0Yx=q~X+ x}X+<q } ~Xq X t <<$|.|XJ ~t~.+ <<+X }~XX<  <~.<|X|X t +tt~  << "U c)dU y.} < X"X "X "Xq|< "X }~t<cU t yt < i<It  " "|cwtwtwt tttwq |X|Xq \ +d$}  fz q"c J  w. J q".c J  /![ wJ Jc|fqt{.  f< ytXytq| Jc{q+ q;x{d  fqz{ }Jq |< X <~tc  q x+ q>x{t< ~f< X~d X fq z{ }Jq |< X <~tq z 2fwq"c J vqq _ +A+ q5xf+ qw Y   Jofqst   Jqs   XoXtxJ  Jx. 8<qs<YL$ | Jq|f <J7Jqot{  Xx< JggNqst  Jot tx< JggNqJ Jotq.YW qs +q pa + K <xfi9 qrh(ts-~Jh~Js-J<d x ff +d ~Je !fM<5<X <>\dB 9 JhXUvJkxJ gj!th  /quKk +zqJk +zf<q~ffq*h + pJ<quyth to+fV] }<<..X]v<$ <]{<!fxJ j!|h mk +<q~fk +df<q~.!f:h* + pJ<q!uyt~.qC$ x;tq*fh + pJ<qu'Kw.q<./$+ <qV|wE<* /w3fwt5h Jq."q.qG wJq<?g$+ z/q wfR0l y}<*d  <hf +~i ~< n d J  +Pfi ~<g.d }f Je%fg<+ Xgv}q6wJ&d w Je%fs-c.h#!!Y<q.#uuiY<q.q   (w  XU}. {X<~f Jw<aWU.aWy< Zt <+.~JJq ww< + J<Rw \FO-X { ?q/}f.'Yvh n| &#~Jd   <+ +.q{(% n&xtl 7v +Qtn 8d~tq" J%+ q6}vf 6v% v  Hv<  f x +6vh  +qud x ti G +d ~Je !fMJ5<X <>NdB 9 JhtUvJkxJ J/ +fVJ] }J<..X]v<$ <]{<!fxJ j!|<h J /k +o<q~ff2eh* + pJ<quytq~D$h +)i mJ d7th(Js-~JtqtK <Vw+  5vg.vC}wYqfx%y%x&dX< "X+ q q  + <vf |<'> t U}. {f<~f Jw<aWXU<aWy<< Z <+.~<<< yX~+ <Rw| @8O-J {J  q}X +v< z"X+ q @r  + <vf x<>  t U}. {f<~f Jw<aWXU<aWy<< Z <+.~<L<< yX~+ <Rw `8O-J {J q}X +v< z"X+q `s  + <vf  P<> H>= t U}. {f<~f Jw<aWXU<aWy<< Z <+.~<LJ< yX~+ <Rw `8O-J {J fq}X +v< z"X+q t + +z   o.xt  Jxf 8<qtf"gJ*s-|tqJzh <(Ji |Js-f4h yfl|dJ +Jd ~Jqd {qfd Ld e !fMJ5<X <>d ? tfr.+  s  x< JggNqt Jot+  fh<UvXkxJ /h qm +fV] }tt<.<X]vJ <]{<!fxJ j!|<h J /k +o<q~f<h*q&rh }<q r #A& !  zfX<h*.nXqA& zzXq</z zfte  Y7JR*{ py +u'{  +={ y +tK| +. 2 +.5wzt~XB  +f?XB yXt.?XB w{vX +{ z2 + + { +u { | +|?pf| }.Jf?'}nt?}lYw| J& f<|v.KAl< J?mt~ + x&x"f*.-|tK.  }fK<|.J   f%.  fK<J.|}2{ +u*|<Y  t}t2<rJ \}X < *}X  +x%\ .*}|X |~/+<x(,fxtxt|< +{ z +tK| +. 2 +{t~X?XB yX{t.?XB w{vX +{ p{2 + +Jt5wf2.{uJ}tB  +t?XB yXt.?XB w{wX{ {2 + +JttrX?XB yXt.?XB w{wX # +.1<t~2<r4 \} < \ ~X&tf* .~Jtf&<*Z< G  +=G  +~< J <~.G  G  +=G  +} {.|.R~YfG  +{G  +{Nf f~fe w<t>~X&< .JYY vGtzX 6~1G  +{. <~f w<t>~X&< .JYY vGtyX 6~1G  +{{.|.R~YG X? X mXS.?# mB  .?XB yX?.B wXGzX{G  +{{.|.R~G X? X mXB  .?XB yXG{.xt" *?B y.?XB yX?.B wXGzX{tG  +z{.|.R~YG X? X mX.0Z 8?B y.?XB yX?.B wXG{X{G  +=G  | +{4X Xf7X oX%" h<=g!X|G+<3xG\ 3{3}X BXG{} "<+x#,xtG ];wX +G  +uG   +% y<B J wJt" .JwJ~.G <v. . x.G   + y<B J wJt" .Gtv  .G   +K/5t X y#B J wJt" .JwJ~.GI t * xf,  +~J<?6 pJJ,f&}X7J qJ <f yJ,8"LV.<~., Xg'm*~-#~.XX fg,WJ% |M,Uf% , ~<7.pJ<~.J$-|X$ J|J~J6X% X =,  +7 pJ<~.J$-|X$ J|J~., <g,  +f,5 =f7<4r+ ;4z. X4zX0+ :f4 N.,7 " f, E1 ., .) 8,KJ~.J  , 33f ! , 3. J,.,  +~< +, ~.~XX~f, ? +, otj. ef .{ g2 @}"(+{), }e ef .{ g2 @}",}J < f 6t< <~t < J 6<  <+{,}JXt.X<  <,~.?, ptMw}f|tf|t, +}X +,  +K,  +=u, 3 +} , 0~/,   +X,u<2 >X|<,t} J3J Xt<<  <.|XJ|X3\,,  + }<RwM),f  ' U}. {f<~f Jw<aWXU.aWy<< Zt <+.~JLJ< yf~+ <Rw `F-J%vJ J 'tX< .,7J}tMf,7J=X~J,J)/t< "X+| ,  +,  +K}X <?6 pJJ,.J7J,rJ}X}X6<% X,  +>}<?6 pJJ,fCXJ7J,'r*}7 J qJ f +f~,gO }(;<X~f,K  J, v<f,zJ}t< f Jf7<4rJ+ ;4z. X4zX0X+ :|X4 N,.|@M g, ~X,.|<,Xx|J }%YeMO.; ,@$|JO J~X~fO ,t| 6X%  =}, , " +u+ v , + +,  +=  Xu zt<| <.<Y~2fu <t |X-.@.m3<X<zJ <.<Y~2@v/_,"~ 8 U}. {f<~f Jw<aWXU.aWy<< Zt <+.~JJ< yf~+ <Rw| @FO-J%vJ J 1,xX<  "X+|   +k<   +k<    += }- +(f<~ <&|% & }<".xJ&~f  <} {~+ f<+&|f~fU {f<~f Jw<<  < . x$+ <<Rw&}% & }<ff~f< t&|J  X&wX< '~t.f< K&~X<  &|J  X"ExJ g< t&|J  X<yt&|J  X< zX"X&|f<+.}~ &f  +f  3 +<&  + &<|fX + <& <|4f < + J& <"fxf&~X< +tLG ~J% 9<|.<~f .<~2f ,s&- ~J < ~f.<~ +X2 <&u! # U}. {f<~f fw<aWU.aWy< Zt 5} + <Rw \%~  "t.< J|&.{X.%}3~~J< J| X~< J| X~ < J| X<f~ J|X< |X< X"X&|f<+.| tt& {t D +i  +fD J J ~'$}0 i7 s g+ x{ g+(yX#}+}t2 @}+2{( @}+w#[H & +< +JD ~X  += D +W<  +.D J J{XD V *t  +=  + ef .{ g2u @}"&+{}<~f " +&7X oX%" h<=g!& 3|&Y + ~&<{." <x ~<2 q3<"  {XGXX+{~J"<&'}( %, 8~X<.~&{tf~X +  +v"gu ,3}3  + \ " +6f7X oX%" h<|."<&'+ |"= !& "~7X oX%" h<|."<&'"  {XGX"=.!&|f3?f& }D~.&Xf* <+t3|J"  {<~X&"t X {<~X&+fy&  +w/ 1}  " +&f7X oX%" h<|."<&*"=~%!3}& }D~.&Jf* .+}t.3|"  {J~X+ |X}+X   + M%31}  X +a J.|X<~t<.~t}JJX . X2 s|t.)~tX!J~J< .X}.L<Xf|Xt  ~J   +}<X  f J2J  += & +}tt&6f  +   +} f&~ |JX<~ 2 .&tX  "Xx~<2 q< <~t |X |< <PJ  <`t~&  +} fC}<2 X)|ftJ<| ~ +& tf* t-|J&.*$J-|&. 2*~J-|X&.}.<t~2<r \}X < \ ~X&>z*}<   +f  3 +z<?X4wT z<aW~U.aWy?<nt<2X~f <~X <~.H<. Jw<aWXU.aWy<< Zt J /~tY7}.+ <Rw \@TOZ5}XXX%X /X<4 T z<|f|2J x%z4JT zX0}./X"Jx~<YZ~N 7 XN q3*X,%pZzJN  ~X<. "X+| oX7XIX X D +z  +.D J J ~ }X7 s g+|}t}t2} @}+"w%#  +z< +JD ~X  +z +JX  +zIJt D +{  +/.D ZJ J ~ }X7 s g+|~t}t2} @}+"w%#  +z +0J * D +z<  +.D J JD z t  +y +2J *  +  + @ +  + P +  +  +  + ` + p +7<qJ  +<7< ~J   +<7< ~J   +nJ~ \ ~XtX < +} <.<Y~2fr \ ~Xtnf ! +Ktf~. \ ~XtEX  +   +   +  +  +   +  +   +   +  +   +   +   +   +   +  + p|X~ .v "  +7J"qJ"  +=" 0 += ~.< X<~ HJ ..+ <Rw `K2 X }"vX<~ "X+|" <" 0 += ~.< X<~ HJ ..+ <Rw `K2 X }"vX<~ "X+|" <"  +7< oJ%" h<|."<=!.f " < + J< |Jj<U. {f< }f <+.~< x<~+ <Rw M= J <U}. {f<~f Jw<<  <+.~<< <<vf~+ <Rw `=J J"wJ J <y. ~X+ <+X|"< "X "X"|f<+.|"<"  +Q"  + "t 2+""[<{f9f1+$f+{"<{  {t|X +"  +< "tJ"  +7<"K"  +h"  +m"  +! "x. JyX ~X+ "X{X"<+~X"  +7< oJ%" <z.<? J <y. ~X+ <+X"z"zJ"  +~<t "  +|"8wJ +tf <"1 {QKgJ%.~J":X {sg #5bX."J <'f{J WK}J ,"8 {<"  + "  +z <2 X"w<<{t" < +y <.<Y~2X"x "  +y  \ X"}<zt"  +="  +="  + "  +uz"6" @ +x<t~2<r \}X < \}X <x< t~.< J~X"*w < "  + "  +u  (KwX7J  z" 6 +"  +v zX"45 z}1""  +u"  +"  + "  +K"  +="   + JLhL"   +v%"<v. < t1v  "  + +U wJ~."  +<g wX"   + wJ~."  <g vX"   +i"   +Jwt.< ~. < 6" +t. . v.f"   +~wt~." +<wt~. <w<t L<f"< v"~ +"  < +t <.<Y~2X"| "  2 +ft t <wt4 XT z<e}.~LXU f< |fH<U. {f<~f Jw<<  < . xJ~+ <Rw `Y|X%2 < }zyt ~X+ |X 9JGX<"  +uu 9J< t"X+|" "  < +t <.<Y~2X"} "   + f +v." +<~  v"  6   +! x. JyX ~X+ ~X~X<+X  +> < +z <~f<<t~2<r Y~  "~  "}X~ $~~X<<~ <.%G.t<~J f|y< < +y <~f<<t~2<r Y~  "~  "}X~ $~X<<~ f.%`.t<~J f}y<~ () +X2 (v5 {D( .+ }t~|XX~~JX JGX<~JfJ+ X~}J&~f~.~<~  +t(zf~t+  ~s<X,Y~ f.<Y~ XK"~%|X~+  u< ~.< X~X~ J~t~~t<~  +<t(zf}t+  ~s<X0Y} f.<Y~ XKt#tX7XK r+JfK}f + f{<t~2<r \} < \ ~ %~)x+  +fu< ~.< X~X~ }*}< ~ K}t}X~X}t<~  +2{f}t }JJf~ +}<~ J +}( .{D~.&X<*.-|t.( .{XD~. .(~f<~} ~ J +}( .{D~.&X<*.-|t.( .{XD~. .(~f<~} ~ + +{XJ <(< {D~.J \} <~*&<*.-|t.(. {D~. J+~i }+~#~  +().X2 (v5 {D( ft{+ ~&|f* .+f~ ~  +gJ}J D~ .&|Xf* .+ J~w. +~ J +|(. zD~.&<*.-|t.(. zD~. .(~f<~}~  +~  +K{J tRJ .+ f~x<&{Xf* .+ J~x<~  +K{.J 9RJ .+ f~x<&{Xf* .+ J~x<~  +K{J t7RJ C.+ f~x<&{Xf* .+ J~x<~  +K{.J 90RJ N.+ f~x<&{Xf* .+ J~x<~  +~ ( +JJ y(. zR( .+f~x<&{Xf* .+ J~x<~  +KzJ tRJ .+ f~x<&{Xf* .+ J~x<~  +KzXJ 9RJ .+ f~x<&{Xf* .+ J~x<~  +KzJ t7RJ C.+ f~y<&{Xf* .+ J~y<~  +KzXJ 90RJ N.+ f~y<&{Xf* .+ J~y<~  +~  +K( <J y(. zR( .+f~y<&{Xf* .+ J~y<~  +~ ( +@<~J~ ( +<~J~ ( +<~J~ ( +~<~J~ ( +~<~J~ ( +~<~J~ @" +{X7X oX%" h<|."<(1+ f"=v.!X( " & {<GXX(+ ~J/~+|J|(~  +>~ ( +{X~~ ( +{X~~  +K~  +=~  +=+{JK~t~  +=+{JK~t~ ( +y}<t~2<r) \} < \ ~<t~2<r+ \} < \ ~X(~+f(!~."u+f~<(w< t(~X ~  +!~"J I(z'~ V(z~ f U$ F+{XY~ Y+{XY~ w   yw(.tX JGXJ~JfXtX JGXJ~JfXtX JGXJ~JfX~v<~<~<~~  vX XvX XvX +~   +>~   +K~  ( +y~f~  ( +yX|~ .~  ( +yX~~  +( +yX~~  +( +xX~~  + +K yf~#+ yY|.o~t~  + +KY~  (% +y }fD(~f  .()t2 (t5 }D( .{{.+ `Y~<~  ( +y{XXX7X(t+ u}< X <+J}t< X <~.+ Y( +g~.t(;~    +w"Jx ~<2 X v~ v<`t~   +t.< t~.< X~X~ +t f~   +>~  +~  +=L~  + J.@X~   +oX)<}.4)<}. .~g5;44@"Z$ &g hf~ n. -*rJ|X <$g-|J~.n.Jp JGXJ~Jf~t*t-|X~.p. JGXJ~Jf   +.)<}.4)J}. .}A  vzJz)X~ fnX.nJ $p< JGXJ~Jft~to%<t~2<rJ \} < \}X <*)~.n f*n< ~ 5~  +>=  +}J JJ J} J~ J tR~f; =~ J <}.J R&~.f;f~f= .K< +tfL9 <w<[ J g .2 Xq=J-< Jw<= JGJ&~* f~.;"<-.~ =<* #+ J uJ[xJQ ` +& J|fQ!<J <~fQ!*.J < g X f}f +<~J t7tR~.+  .Js.&tf;-.Q c~; Q b[* J$-|XQg~*-tQ*t-|XQ.l~Q  +!<7J qJ f +.Q< .Q  +KQ ! +<Q  +Kt/ <R zJ f.Sw. +y<2 < zQwJR Q  + Q  +utQ6gQ  +5 QE}J Q1,Q   +] <Q }J < / Q }J <.U J< |fH<Uf {<<~f Jw<<+~<+ <Rw `= JQ wf~JJQ|. JQJ uzf%x<2 < }QwfK< "X+  +~f <J|f +~4X< +f8UJ ~ !% < ~< c. ~   <tf!X <J|ft~7 qJ <. w./~X <J|fX<~.X~s-RX%Js-R.<~QJ <Q}J </! Q}J <}f<f{U t< |fH<U. {<<~f Jw<<  <+.~<J< yX+ <<Rw `= J%uJ2 < }tt< .JyQt ~JJ~f<~fX~Q|Xs-R.%Js-R,.<~J 90R&~.f; fX<~~Js-R%Js-R.<~J 90R~.; &* f~.;"t~f* t+ tts-R%Js-R,.<  <~.J~X<~.+JJ.  X<U.X <Q/{JJ <w<,+J%J2 J }fuJ~<s-.X < ~J; JQXK~< "X|<+|     +DK< qfU J< |fHU. {f<~f Jw<<  <+.~JJ1J%r<4JT zJfT|< ~t~+ <Rw `K1 J%rJ4JT zJ . < w.Ny<mJJ w<J fh<~f%2 < sJU J< |fH<U. {<<~f Jw<<  <+.~JJ< yf~+ <Rw `K J%uJ +y<2 < }vJ "<J+Y |X<+  " +< JY  +~~.-(t+  1vX}<~}+  s<  + JY  +}~.-(t+  1vX}<~}+  s<* ? +*  +~ \}X <*:* & +~ f* .cJ*  +/K*  +*  +}X.)*  +|X.-*  +L|f%t}t*.*  +><$Yw*  +#ty=t8L!J:$~{%.< ~f< X~*$|J +H" +V* +U'.{*  +{$\J t*y ~'*6{.< ~f< X~*5# ~*#6{ *  +"W|$<T.< }.$. }~<{.{.{.{.{.{.t{.{.{.{.{.{.{.{.{.*  +"{X.$,*  +"{X.$,[ < +ZfJU J< |fH<U. {<<~f Jw<<  <+.~<J< yX~+ <Rw `= J%uJ2 < }[vJ< "X+[  + +~f~< |J~s-R%Js-R.<< |JJ< |JU < |fH<U. {<<~f Jw<<  <+.~< xJ~+ <Rw `=~J<[~f<yJ%x<2 < }tJ{f<~f[$<< PU << |fH<U. {<<~f Jw<<  <~.+J~< xJ+ <<Rw| J= Js[ X}[ p +[ < +E JU J< |fH<U. {<<~f Jw<<  <+.~<<< yX~+ <Rw `= J%uJ2 < }[vJ< "X+[ ` +;  +J tR~.; &t* f~.;"<-.fX <;  +JJ 9R~.; &t* f~.;"<-.fX <; K +;|* t;~X- Y~< ;  + .KwJ#7 + qJ f}f +<K +JfK}f + .K}f+X * y;~.K ; ~.~* X;~.<t~2<r& \} < \ ~X $* y;~.-t  *} < ~ Kf}t;  +fJ t7RJ C.+ X&tf* .+ J&tX;f-. @ ;  + +tt~s-R%Js-R.<~J 90R~.; &t* f~.;"<-.~ ~.t ; p +u .~X;"s.X JGX<~JfJ;.P~<;  +<K f& J2wJtK~. < <}f .K +<%vf~JJ 8&~f<*.-|tK .uK v' < f2wJK~. f < ~fK<vf J v< hf =*K|  K +<tf<t~2<rJ \} < \} <*K uX;"s JGXJ~Jff;.Tf~  *g< ~ <; K + 'sf  J+uK +<tf<t~2<rJ \} < \} <*}<~XXX JGX<~JfXK ."; uK +ft;".s.f JGX<~JfJ;<Xt*~< ~ <~X<;~XK sX +;  +~fJ t7RJ C.+ X&tf* .+ J&tX;f-. ` ;  + +>tt~s-R%Js-R.<~J 90R~.; &t* f~.;"<-.~ ~.t ;  +;  +K ~X;"s.X JGX<~JfJ;.p~<;  +K  +~X;"s.X JGX<~JfJ;.t~<; ' + ~X;"s.X JGX<~JfJ;.x~<; ? + 6 pt9J;.9 m;X ;  +!7}<3s<?fF o}X?.;p<F GX?;p<;  +b 7}<3s<?fF o}X?.; p<E }t <?.F oJ7~X3h<;fF E ~f?Jmf;f;  +=;  +Tf7}<3s<?fF o}X?.; p<>; UJE } <?.F oJ7~X3h<;fF  E ~f?Jmf;;  +Qf7}<3s<?fF o}X?.; p<E } <?.F oJ7~X3h<;fF  E ~f?Jmf;;  +F 7}<3s<?fF o}X?.; p<>K JE z <?.F oJ7~X3h<;fF E ~f?Jmf;f;  +C 7}<3s<?fF o}X?.; p<E }t <?.F oJ7~X3h<;fF E ~f?Jmf;f;  +@ 7}<3s<?fF o}X?.; p<|tE %f <?.F oJ7~X3h<;fF .E ~f?Jmf;f; > +3;Ot; > +,J; UtY; > +(< +~<t~s-R%Js-R.<=~ JJ J} J~tJ 9R~f; =~ J <}.J R&~.f;f~f=  +JK t;~X; > +. tKwJ#7 +X qJ f}f +<K +JfK 6f /+gK} JY~f<t~2<r& \} < \ ~XK+}  t;yJ *} < ~ K}t; > +<=}<J >J f=~fJ<= *f <}f   +K<g *f-|XK  f%f*$-|K.*tJ-|XK.~fX JG<~J +t2 J=t-J Jw<= J}J.;} <t~2<rJ \} < \ ~*K  $ L*~J< ~ <; > + t= ~<J}J  <}.J R&~.f;f~.= .K< +t.L9= <};<* ~+ J u.; > +=~<-J Jw<= J;J; > +MK  t;tX; > +- tKwJ# 7 qJ f}f +<K +JfK 6f /+gK} JY~f<t~2<r& \} < \ ~XK+}  t;zJ ~*} < ~ K}t;  +=; ? +J6 pt9WJ4?6 ptHJ;.{6<$ X; ;  +!3|<;;  +=;  +s3|<; 3{X;{<;  +pX3|<A  ;st2JAx@ zJ2 t3rX;+x#;f;  +!;  +f3|<; zX3f;{<;  +c3|<; zX3f;{<;  +KX $g;  +X<3|<; 3{X;z<;  +YU<3|<A  ;st2JAx@ zJ2 t3rX;+x#;f;  +N<3|<A  ;st2JAxQ |J|X+ f|fJ|.23rX;+ {%|;f;  +K<3|<; zX3f;z<;  +H<3|<; zX3f;z<;   +E<3|<; Kt'sf  J+uK +<tf<t~2<rJ \} < \} <*}.~XXX JGX<~JfXK .";x3{J;f*z< ~ <~K ;xXz.;  +A <s2 Ax  yX< j% |<cf < t< =ff|fJ7R&~.fX;"< f<f <{X< f <Lf<<~f  f< j% <|<cf-<3<J<~f7 qX <f w./Q J Q }X < / JQ }X < /ff|fJ7~fQ  <Q }X < 2 <.U X< |fH<U. {<<~f Jw<<+~J+ <Rw `Y X|t%xJ2 < }Q wX&}* f~.;"<~.J  < +fL9 fzX* X+ JsQ JY| +<~XQ/X <w<%J2 X } tX <~J2;vX+  z't< "X ~<+J ~JJ~.;;  +uA <st2tAx@ zJ2 ;vJ+x';<;  +A <;st2JAxQ |J+ X|JJ|.2t;vJ+{'|;<; 0 +A <s2Ax  yJ< 2% |<c.-<2<  J <ufX .1K7 qJ <. w./K ,JQ|f JZJ}2 ;vJ+  %w|;X;  +A <s2Ax@ zJ@X<K f J2wJtK~. < <}f .K +<%vf&   +K +<g* xh-|K t  <v < f2wJK~. f <%f  K</ v< hf =K  <t*$-|J-|K .t  JuX JGJ~Jt  JK +<tf<t~2<rJ \} < \ ~*K t .2<;vJ } } Kgt+. z'*} < ~ X~;;  +=; ? + J6 pt9WJ4?6 ptHJ;.y6<$ X; ;  +!3z<;;  +=;  + ;  + ;  +iJ3z<A  2t3r;+x#;X;  +f3z<A  ;st2JA:x; iJy2f3rX;+ x#;f;  +c3z<A  ;st2JA:x; lJy2f3rX;+ x#;f;  +KX $g;  +X<3z<A  2q J t7R~.&ff;-.~ 2 3rX;+x#;X;  +YU<3z<A  2 +st~s-Rt%Js-R.<~J G0R~.; &t* f~.;"<-.~ ~.2t3rf;+x%;X;  +KN<3z<A  2t3r;+x#;X;  +K<3z<A  ;st2JA:x; iJy2f3rX;+ x#;f;  +H<3z<A  ;st2JA:x; lJy2f3rX;+ x#;f;  +E<3z<; Kt'sf  J+uK +<tf<t~2<rJ \} < \} <*}.~XXX JGX<~JfXK .";z3zJ;f*y< ~ <~K ;zXy.;  +A <s2fq J t7R~.&ff;-.~ 2 ;xX+';  +A <s2< +st~s-R%Js-R.<~J 90R~.; &t* f~.;"<-.~ ~.2t;xX+';  +!A <2t;x+%;  +KA <;st2JA:x; iJ2f;xJ+x%;<;  +KA <;st2JA:x; lJ2f;xJ+x%;<;  +=;  +z;<? .pf;.? . o{.|.R~X2 X<;x<x.zn<?.B yX?.B wX+{Xx%{;  +? +;pf;. z.{.|.R~2 X< ut|X7J3sJ?fF o  ? 6 pt9WJ4?6 ptHJ;f }X . x?t;t<>|;OJ)xX<~JE %J <7 7.3hJ2f<r?XB yX?fB wXu JGX<~JfE . <?.F oJ  XE ~f?m6<$ X;#t ){%;,x xt<~;TxX <xt ;  +? +;pf;. z.{.|.R~2 X< ut|X7J3sJ?fF o  ? 6 pt9WJ4?6 ptHJ;f X . x?t;t<>|;OJ)xX<~JE %J <7 7.3hJ2f<r?XB yX?fB wXu JGX<~JfE . <?.F oJ  XE ~f?m6<$ X;#t ){%;,x xt<~;TxX <xt  > +=g  +=g  +=  +0  +=  +  +=K  +< JKxJK  + K&}f*.-|tK.ef J << RfU J< |fHJU. {t<~f Jw<<  <+.~< xJ+ f<Rw `=J xJ f%f2<? rJ f}f%<~<J XK</| X* K}J|  <KyJ} XK}JX| XK} < "X|f+.|KK  + K  <g< J << RfU J< |fHJU. {t<~f Jw<<  <+.~< xJ+ J<Rw `=J xJ <?f r< f}f%<K< *-|XK<*$-|tJ-|XK.~.X JGXJ~J<K J <} X|X|X  <KyJ} XK}J XK} X|< "X|f+.| ~KK  + #K&}f*.-|tK.ef J << RfU J< |fHJU. {t<~f Jw<<  <+.~< xJ+ f<Rw `=J xJ <?f r< f}f%<~ <{JJ fK</| X* K}J|  <KyJ} XK}JX| XK} < "X|f+.|KK  + to <~.$$%|X$ J|J~. <KwfK    +uK +<tf&*<*.-|tK +.  ufK +<t.J ?  f +f  fK +<t.<t~2<rJ \} < \ ~X* /K} . w*}J< K    +uK +<tf&*<*.-|tK +.  ufK +<t.J ?  f +f  fK +<t.<t~2<rJ \} < \ ~X* /K} . w*}J< K    +uK +<t.&f*.-|tK +.  ufK +<~y.{<J ?f  f +f  fK +<t.<t~2<rJ \} < \ ~X* /K} . w*}J< K 0  +u<<K f# J2wJtK~. < <}f .K +<%vf&~&f* .+ t*wf-|tK .tfJt 0RJ N.+ XK }v# < f2wJK~. f < ~fK<vf J v< Khf =K  <uX JGX<~J<t  <K +<tfX<t~2<rJ \} < \ ~*} JK| .t  *g< ~ <K `  +uf<K f J2wJtK~. < <}f .K +<%vfX   +K +<g* xh-|K t  <v < f2wJK~. f <%f  K</ v< hf =K  <t*$-|J-|K . u X JG<~Jt  JK +<tf<t~2<rJ \} < \ ~*K t .t  *g< ~ <K Ш  +t'sf  J+uK +<tf<t~2<rJ \} < \} <*}.~XXX JGX<~JfXK .*s< ~ <~K sX +K   +t'sf  J+uK +<tf<t~2<rJ \} < \} <*}.~XXX JGX<~JfXK .*s< ~ <~K sX +K   +2<[(sJ Xw<%J R +J2f[ sf[z<}f<t~2<rJ \} < \} <*#~JJ JGXJ~JfJK s% .*s< ~ <K +.K   +; z<A <;s2JA:x; iJyf2<K}Jsf.~JJ JGXJ~JfJK "+{x%<K +s%;<y +K   +< v<JU J< |fH<U. {<<~f Jw<<  <+.~<<< yX~+ <Rw `= J%uJ2 < }KR< w"X+K   +sfX~JX JGXJ~JfXK 's<K +2K p  +sf.~tJJ JGXJ~JfJK s<K ++K `  +sf.~tJJ JGXJ~JfJK s<K ++K   +r#= J}J t <}.J tR&~.f;f*.-|tK .r= .K< +tfL9 ~<%K +<r. < JR8f~J<< fJU J< |fH<}.<< y<JU J< |fH<Uf {<<~f Jw<<  <+f~<U {<<~f Jw<<  <+.~<J< y+ <<Rw| <= J%uJ< + <<Rw `= J%uJK~X=<-< Jw<= JK =rf Xp"r < st~K~J  +>YU JJ#U  J <~ 0  +>&Y1&<Y0  +L.YEX ~.T~ JGX~X3<Y %~. (2 X~J  +  +~<  +g  +g U +j J(  +K  +=  +U JJ U + JK U +< J +  +K  +  +U ~JJ U +~ JK  +=  +=  +=  +=  +=  +=  +=K  +{J  +{< J&Ye  +| J'.| Jl!Y}<JU J(J3 K/'1sf  Ju~}~f X} J}XU J+J  }' 6|X JGX<~JfXJ} g+*K +<t.<YK + +{w%2XrJ \}X < *}X\  *} +Vwt<~K sX +  +  +#| J'.| J f!+ ~<}JJU ~J=JRXKN'1sf  Js.~XXJU ~J3J>XK2'1sf  Js+  {<~J5J~XU ~JJJ }O}>+ w.~+ wX|X~f }+J~XU ~J6J }'}H|X~+ /w% .~+V,wt6  +  +u  +=  + 0z .  + { f0 d1 2z .  +  +fU wJ..<xJU XtU Jf< zJ -< J +XU x$XXXXJJJJ FJzU x$XXXXJJJJF4{XT zJ}.J.UyXJwf~f.U ~JfU ~Jf z< -f  +=K  +y< <  +q<  +=< LVtU zJ S<%U z  J f  +=U zJJ z. &.  +=U zJJ S</)  +='y  ?1 fH"}~  f< <||=f<~ JyZr1wX8X u ++ wJX n   |  +f XUvf {f fw<aWU.aWy< Zt <+.~X xJ+ J<Rw `TOH"~X f% tu< | "X+}~ 'YtnYX +  +t zX'  ~Xfx.XyX U  Xx  ''   ~XQf .{f U X}, t+f4{+ tsX <x  +7<vJ J   +zfN  Xf  zt Xf  }&Qf$. X{.xX <+,{+ t{<y X%ztxX <z   +=X yt t  +J7< wJ  +y< JYe  + hz J).z Jj!9?DXOX K@'1sf  Ju~z~f 3r>XIX  {8 6zX JGX<~JfXJz g+*K +<t.<YK + +{w%2XrJ \}X < *}X\  *} +Vwt<~K sX +  +   +t  J'.t  Jf! K~'0sJ  Ju~ t~f  XJ{ U xtttJU xtJt JU xf t Jst  ttX JGXJ~JfX Jt g +s sJ X( J[s. X u  0v  J).s ts Js Js Js s  u}t  C<y L<y L<y L<y L<y  L<yg L<<rf ~" X u +61tJ fkX( Y. uX +$7rJJ .&Jr/  u< J}f X~"  u +31tJ~f<~%<( Y. u +$7r<~."  u +31 t( XY.r X u +'7r( XY. u +'7r( XY. u +'7r( XY. u +'7r( XY. u +'7r( XY. u +'7rJ( XY.K u +'7r+tK +<t.<YK + +{w#2XrJ \}X < *}X\  * +  u}<+Vfwt<~K sX +   +  +>  +h  +K1Lt < 5. 1I  <. J~f.) K1t  f }J J~f.) K1tg}4<Lf X) =1t  . }t ;;3f;f.f3fJLf ~4<Lf f) K1tf/}< . }t /;;X3f;f.f3fJLf  VXI.<3t 3f) =1tf  f }J1.}< < } /I.<3t 3f) K1tfg };;3ff;<.3ff .) K1tf  f }tJ1.}< . } /;;3f. 7X ;<.3ff .) K1tfg };;3ff;<.3f .) K1tf  f }tJ1.}< . }t /;;X3f.;f.3f .) K1tfg };;3ff;<.3f .) K1tf  f}.}< . }t /;;X3f.;f.3f .X) K1tf/Y}< . }t /It<  1 t  +Lf <) K1tf}. E;;X3X;..f3fhJ <~t 7. f.  ) = mJf ) K1tf}. 7J;;<3<;f.X3f 1J tN  ) = mJf4XL f) K1tf}. 7J;;J3<;f.X3f 1 tN  ) = mJf   ) K1t}. 7.;;3f;f.f3tJ <~t 7f 7H. Nt J<  +~ < f8fH.J 7t 7H.  f8.H.J 7t 7H.  f8.H.   +* U <6XXJJJJJ#JxD~J l~ t) = m f)J J J mfg1<~f"X +<wfJ%a2 JsU &6XXJJJJJ#J xD~7X<~ Xw<  +<~f< Jt ~fJJ~ftXD. < .X) K m=.) ~< gtAX < .  t) K m:f  ~JJ~X5XU tJg7VU JJw~f +fr !  +~< (}<~f t) = mJf4L< <<) =1tf}. E;;3t;f.f3fhJ < tt%}<~.U ~X < a~J 7<~ 7. ~J J . ~J   +~< t) = mJfX {4 t) = mJf t) K1t}. 7.;U3wXUf3x<hJ . tIt 7tt ~ sJ. <) = m f)J J J mJf4JLf <X) K1tf}. 7;;3;f.f3fJ < tt%}<U b]~,7 . ~<Jf f I7. . ~f   +K X|J J? X |}}f   +K' ~ /<  s@}<  +'<  ~Qf$. X}   +'<  ~Qf$. X}   +'  ~Qf$. tX}X   +N< Xt  z. Xt  }XQf$. Y}f}   +=  + 0  +"XtXJ ~D~f J{ DK.~&ff* <t<t ~D f~mf IJ<t~2<rJ \} < \} <&ff* .}+~ ~Df~X&ff*<-|.mf~ ..< zfw~U .|!{U {~t~.X +H !.DH~.  g J*}JJ+0}J<t~2<r< \} < \} <~ <t~2<rJ \}X < \}X <~f& f* .+Jw%<.~X<~XH  <H~1<f~X+VJwt~XHJ~0 2 +Hp.5& fDH$. 0&f* .+ J0u  0  +! .N ~fD~.&Jf* .f0~ 0  +u (.0}ft_}.  Js}H XD~.&Jf* .H}f.0~<t~2<rJ \}X < \}X <0%*}< 0  +u *0}ft_}.  Js}H XD~.&Jf* .H}f.0~<t~2<rJ \}X < \}X <0%*}< 0  +KH.00  +KH.00  +K ~.bR .+ +f0v<&}Xf* .+ J0v<0  +!H }XD~.&Jf* .H~f0 0  +H}.u DH~.  . J&}f* .+ Js0.|H X6H~10  +K }.bR .+ +f0x<&|Xf* .+ J0x<0  +KH }.RH .+ +f0x<&|Xf* .+ J0x<0  +K }XbR .+ +f0x<&{Xf* .+ J0x<0  +KH }XRH .+ +f0x<&{Xf* .+ J0x<0  +0 2 + +Hp.5& ~fDH$. 0&zf* .+ J0y  0  +@2 .Hs=~  D~.&'<*.-|t.sf D~.H/t+  XH<v+  XJvH !+ }:+  +Jw.0zJH<0  +!H z.D~.&Jf* .H~f0 0  +Hz.u DH~.  / <&}tf* .+ JHs0.yH X6H~10  +!H zXD~.&Jf* .H~f0 0  +Hz.u DH~.  . J&}f* .+ JHs0.yH X6H~10  +Hy.u DH~.  / <*J)J&}f* .+ Jv.|J0XyH X6H~10  +!|. ~D~.&Jf* .+f0 0  ++ |u|.0 J 0  +  +2.r: #CR~.4<+  +XEu+  +X&tf* .+ Js ~&  +2.r: #CR~.4<+  +XEu+  +X&tf* .+ Js &  +!H }XD~.&Jf* .H~f   +H}.u DH~.  . J&|f* .+ JHs.|H X6H~1  +!H }.D~.&Jf* .H~f   +H}.u DH~.  . J&|f* .+ JHs.|H X6H~1  +!H |.D~.&Jf* .H~f   +H|.u DH~.  / <&|tf* .+ JHs.|H X6H~1  +!H |XD~.&Jf* .H~f   +H|.u DH~.  . J&|f* .+ JHs.{H X6H~1  +!HJ {.D~.&Jf* .H~f   +KHG. {XD~.&Jf* .H~f   +!HJ {.D~.&Jf* .H~f   +KHH. {XD~.&Jf* .H~f   +KH o.|RH .+fx<&{Xf* .+ Jx<  +K |.bR .+ +fy<&{Xf* .+ Jy<  +  +!) 1 +)y/)  +{{ { )  + 8, )  +=(.  |t)<}.4)<}. .$s< ; =z)Xg) P + t)ve1) +J +p< +oJ z) <z<4~J<)~. XzX } < +f)<  {J)< Sz<4~J<)~. XzX + |< < +f)<  {J)< Sz.. Jzf" 0)8}t0X) }f .i  + |fJ|.)BX(%<JX1.<J  <~f<~).{J {. X{ X~ fz. .fz Xf{X(%<J <f < g{)~f X*i{)fX|X1.<J fzt +t%CJ)~t<<)~&u | ~JX)}t )}t)  + J .z< )  +"}<0)8}0X) }f <i  +i J }ft)}.~t" .{.J(%<JJ1.<J t <~f<~.)."}J .u. }t)}f~ +%CJ)~t<<)~tJ(%<JJ1.<J #t |J <)}f +<JJ!+f<U.)}J!JW<  . )f fzXX| <~tt<) z +X <* |)}t )  + &k )  +=(.  zt)<}.4)<}. .!$r-z )  })|t$g) p + y)O '<y <)|. ~< JyfJ(%<JJ1.<J~t"t zJ(%<J~tJ1.<J)<~f)(J(%<JJ1.<J  f +.)<!w|X)y)  )yJXy.)#<~.{t<)~fXJ)~tyX$/z)J +ztLG)J u&w {J <).LzJ)J K {}X) <!  yJ) <#~fz<X4~J<)~. <zXzXf + <  { f +.)<zt)J g' Ou {)}t )  +/ xt {.)|. z<~.J(%<JJ1.<J~"X:!Y{t)tq1YX#1~{J<)~.tJ)~Jx.)J2J K&x2JzJ).xJ )" 0J)8}0X) }f <i  +zf .)}.~t"}ttJ(%<JJ1.<J t <~f<~f)."}X < }.) . fx( X"'.Jzf)fzJ)Ja z~  fxt < #x +t%CJ)~t<<)~  fzJ(%<JJ1.<J t f {.)  7 +  qJ <.w<   }f)<}J .  }f)<}.)  Jv. < yfHJU. {f<~f Jw< <  <+.~<<< yX~+ <Rw `= J2J }J)s< JU J< |fH<U. {<<~f Jw<<  <+.~<<< yX~+ <Rw `= J%uJ2 < })}Jv)   +~7<  pJ)<}.4)<}. .}5 g vXzfJzf)<d z<v.. J3)Jv . )   +~J7<  pJ)<}.4)<}. .}> uf7<  pJ)<}.4)<}. .}8 g vXzfJzf)Xd z<~) J )  + +~.7<)yJ g +wX<<U ~J< <3wt  <) <g< xJU J< |fj<U. {<< }f < .}J t~+ <Rw M= J tU}. {f<~f Jw<<  < . xJ~+ <Rw `=-J {J< {J  JUz< |fH<U. {<<~f Jw<<  <+.~<J< yX~+ <Rw `= J%uJ2 < })~Ju< )|X<+ )  < +t <.<Y~2X)| )   +|<7< xJ )   +r)<}.)fq .)   +qt)<}.4)<}. .}8 g vtzfJzf)Xj)   +qt)<}.4)<}. .}8 ufz).u)  +XpXXp.)    +p)<}.B)<}. < o)<}.4)<}. .nI  +)v~'e<) +f}`".}}f< f)+w ^u)X}. 1|JJ) zh)   +p)<}.B)<}. < o)<}.4)<}. .nC  +&u)fe1-) +<}@"3}}.< .)+wP ;)u<}<)t)   +p)<}.B)<}. < o)<}.B)<}. <Wjy  +")ve10) +<W{"))W{X )#}}.< .)+wP C)u<}<)t)   +pt)<}.4)<}. .}8 uf) +pX  J 6)u.!+Z<}.<)<JoJ) n t}.<~.)o J ;) + q)   +ot)<}.4)<}. .}8 uf) +pX  J 6)u.!+Z<}.<)<JoJ) n t}.<~. . ;) Jo.o   ;) J q) < +n <.<Y~2X)| }n <) < +n <.<Y~2X)| ~n <) < +n <.<Y~2X)| ~n <)   +ot)<}.4)<}. .%) ~ +x.+ wf}f)~tX JGX<~Jf.( + ) .l<) ~ +x.+ wf}f)~tX JGX<~Jf.( + ) .l<)  +t) @G +{< xt )  +K lt>)  +=)  + '  +>'  +< v z'  +UtJfJfJ'f '  + I" H G"'  +J}J t7RJ C.+ f'u<&~Xf* .+ J'u<'  +J}.J 90RJ N.+ f'u<&~Xf* .+ J'u<'  +'  +'  +>'  +='  +='  +='  +|~JJ'" ~'  +/+ }u|f.'. +'  ++ }g'+}'  '  +Y+ |uX~.}JX/f|X ~D~.&<*.-|t./. ~D/,.+.u}JJXJf' z +J}' " + +} J}J" +.'< z.'  +7J +qJJ<'J'  +rJ {<f Xt}.}tJ Xt} tt} tt} tt}.}t J{J..LfL J pt'xf< '  +z  J Jt" +.J}J" +.'<x.. z.'  +'  +>'  +>'  +J7<'wJ ** +J7J'w 0  IX'   +'   +'   +'   +L'   +='  + +v' '   +[./y'<'  / +xt ./yX . x/f  ~/!<  ~/}t' 8wX'   +uJ/ J}f<t~2<r \} < \}X <' +%/%w. ~D~.&Jf* .+}f.'*t< '   +/'   +w2 +<rtJX/fw) ~D~.&<*.-|t./).J ~tD/,. J+.g'< u +J'  / +wf[. }~&.f* .+ J/0w J|X' ts < '   +v2 +<rtJX' +fv<2 +J'~s JsfKJX SDJ$f SD~f/J yRJ xt +J&q(<*.-|t.f D . !* ~< Ct  !* ~<~' 6sfK&}f*.-|tK.ef X << RfU X< |fHJUf {t<~f Jw<<  <+.~X xJ+ <Rw `YX xX <?f r< f}f%X~<J XK.<g|&}f*.-|tK.ef X << RfU X< |fHJUf {t<~f Jw<<  <+.~X xJ+ <Rw `YX xX <?f r< f}f%X~<J XK<g JxX XJxX'}.J SD~fJ SD~.fFJJ~JJ+ .w2/utf[)t ~D~.&"<*.-|t./f ~D/,. J|'  < <2 tJ+  +u.< ~.< X~X< ~.< X~XK XK}t XK}tX|X* J+~X* z*J+~XKw' XK}  XK} < "XK|< "X|f+$w'VwtwtwtK'  XsJK'  XsXX' &'   +=Y ' `  +!' & +v'  +  + {.|.R~Y~ BX?XB wXv.XB  xJ % +!?!X m /? n< <W.GPJ ;Juf ? +p< }.B  .?XB yX?.B wXtXf?Xp< }. .{.|.R~XYG} <? X mXS.?# mB  .?XB yX?fB wv} ? +.p< }.B  .?XB yt?fB wXsJ?XpJ }.. ~Df.<v ~Jf<+  {.|.R~XG} <? X mX.0J V?B yX?XB yX?fB w ]?XB yX?.B wXsX.&vf* .+Jz'}+Vwt  +~{.|.R~~ B}X<?XB wXy.}J?B yX?.B w w=  J%ZJ&<|Jt~B  xJ  +!% L<4<2 J%H<9< /2 +< ttX|...   +=   +    +>sJ    + ;$   +   +>/Y*   + \ = += > + e~  d  7 +O3s<?fF o}?.pX+ . xfW Y X <61X~f7 X?!< m 7X=><?XmJ?X+ .xf6f~.E %ftUzJX X> E|<[t><E|< <?.F o<7~X3hJfF  ?pX+ .gF z'E ~f?Jmf+w%~X +  +Aj. J,  +/ \ +w  \} <~ PJ1X N3X L5X }  0X6}1Pf2X6}1Nf46}1Lf66}1J   +| <  +| <  +=  +>  +=6 p) + <2 < t<3}f?3n?% ptM~</  &%}&<M4}t t~8)0R #T4fT{3{2ft3qt lP5<%~D < <   +fD J2 Xq<K\  Jvf JX~J6< ~|\3 t Y6 ) +2 << tt,7 < J13|J,? XpJ<,~.J,4}~JJ3.6<|,6 ( +2 << tt3}\Xt: } <}bt  J U}. {f<~f Jw<aWXU<aWy<< Z <+.~<L3~J< yX~+ <Rw `8O-J {J 7tX3Xf<@ X91 "<: }36<X<~ <  "X+| tXX6 ( + 2 << tt91VX"<: }f6 ( +X2 << tt}<= >J e9'.%"m<6<f<~~ >f6 ? +6 p<|?6mJ<?#f6ps $ X  ~.{X|.R~X6q?#6p|f<?B yX?fB wu{|..R~XG} <? X mXS.?# mB  .?XB yX?.B w?pJ6 .}f?B yX?fB ws6$   ~f{X|.R~X6q?#6p|.<?B yX?.B w?# 6p?pJ6 t}.?B yX?.B w?pJ6 . ~.{|.R~XG} <? X mXS.?# mB  .?XB yX?fB w6,v#&I9=J~6f6_||t|X +6  +=6  +'<?J6q<  +6 J|f +  6 </2 +J< tt6X?X6qJ?X n <B  .?XB yXGt ;JB  <?XB yX?.B w6w~|6 X~6616  +=6 2 + +6ut  +X ~D.&~ff* .+Jw%V  +t+tX  + ++X|tJ<   +vt+|tJ+X@  + ~D.dX ]+XtX&}ff* .+Jw%.}+V  +J>zx / f .'v< -Di.f.  +J>zj = f .'v< -Di .u_.  +J>z x .D2<.'vJ -Di<V.  +! <>zf }< . .'vJ -Di <uO.  +$+XtFX  +#D H +  +X ~D.&}ff* .+Jw%V  +~+X{X   +~ ~D. J*X ~J+X{X&|f* .+Jw%V  +f>zx = f .'v<.< < | Di.   += <>z t |< . .'vJ.<(< | Di<(  +J>zx / f .'v< -Di.~.  +J>zj = f .'v< -Di .u~.  +J>z x .D2<.'vJ -Di<~.  +! <>zf |< . .'vJ -Di <u~.  +~#D H +  +g  +   +}t8g9  +O?6 ptHJ9.|X6X$! X9  +m % }t wt J% J|< .w<2J qV0.8 ,& +/  + f|tX8}+f8}  X8~8&O v8 4OZX8(.(>8 X.< X <~.8 +/.Ok.8X .8~1 +J< X <~.88  8 +u 8 ~8 ` +=gONJ8 2<f$X  |>|.4 fyX8f4(t+ $f|t8YfKfK tg-  NtYeMUO X&jzJ |J-. .@xm3<XKz  X@xX/QzO 8CO f8 +~;8  +OV<8 *<,. 2Y;Y458 f X.. x X/ t/0  FXYeMO.; 8O f8~+J8~fM8  +N8  +N8   +) +XOs#8."pJ)  +XOs8. ~.>8r  )<}f8<t7<) HJ8q~X  X+ 8~X~.X~XX .86~ 7 +. ?!< mtx, < +< ~ + .+ w.|Je.+ ~( w|X~ .?t ~ ++ suw|X+|~  + y~#+ yoX | +^( t}~ +.}7 o]4#]< <~.~  +}7~{t+%[< f~.B  ?B yX?fB w ] ?JB yX?.B w<sX~p |.Y_< t~.< f~.B  f?B yX?.B w ]?JB yX?.B w<tXWt'YX'<7 >\ +twX \}X <73w+ .3x.Y+ .wf3;X+ .wf3X7f +fy*+fy'+fw%VwtwX3f 1 +J7< oJ> 7 +=  +=  +{ g2u @}++. |<f < + JU J< |fH<U. {<<~f Jw<<  <+.~<<< yX~+ <Rw `= J%uJ2 < } tJ< "X+  ++ f| X~X.  +Kg < +~ <.<Y~2f  r  +<J <34tT z<.e x<yfL.< <U J< |fH<U. {<<~f Jw<<  <+.~<J< yX~+ <Rw `= J%uJ +y<2 < } uJ< "X+  +E  +E  +=  +t|Y  +   /<t <f<2 u<{ <.<Y~2X1r < X <~.^<  + X eof J f*tyfX] y_<0JV] }.<]~.<7J wXw< gJ.<vX z.z]{!x] !^)t ` {<qfX z< t f:{  f.{ t{ t{ t{ t{ t{ t{ t{ z  nJ J<f <.<Y~2fu5|t < X <~f`q6 t J`$z'*t t <+y.  <<+.7s t t+yJ`*.5  }J2 <5w ~<2 5w  | <f zX  t f 8zf` + ^  Y X ~.t~f f f |tKt|t |X|X<  <~.g"  ~ ~^~  + < J x } t <+y. < <~ <<+f7 t ~. <f zX J t f 8zfX}t+  < <{f t7X qX.7<of.}  += Jv  +K I +  +<Z ? + mtY ef <{ g2 @}"+ |J <zfX   n< f <~. |JJ+{ |J<tX?Jmtn !  A +t }<A~J <vf<2 Xq<R0FfXA  .s2JrtB  +f?JB yXt.?JB wsXA .>2JA }<2X stJ}.?JB wX2.qJ+'{'B +}Jx%Yit <f & +<{X|.R~XA }<A~J <xf~X{f X{|.|XR<C~1<A  X2AxtzJB  +f?JB yXt.?JB wtX2.qJ+x%+%x#?.B yX{t.?XB w+{Xx%X)Wt{}t*VX + &% +|<Xf % X|< h% ~D $ <2 .qJ2XDq<+JDVt< X <5J|.? ntX? nt P ,  [  +  +~JL<$M~JL < .,g?!. nt~. <ef<~ 8  + @ +v$~J +J JGX<~Jf.v<  +K }6Y P +X{.|.R~ ~B X wJ" .JwJ~f t }f }6?XB yX?.B wXsX f}  +?<pJ  +1 +f .`. f . <g Ja" <gX .g J< .gX .gX .g J< uJU J< |fH<U. {<<~f Jw<<  <+.~<J< yX~+ <Rw `= J%uJ2 < }uJ< "X+  +h  + f"f +|< +fX{<<<%fJ .{.J<|.<|X<<%.J</.|f~X f L fF 0 +{X|.R~X}F.J~fJ F~ZF h~~ X{gR~F~?t8 nt f | D8<~f<  <FDF $~XX7<FpJ~X X{|ftFB X wJ" .JwJ~f tF~f?#pf;.? . o{|.F{R~X2 <Fst XX7~X3sJ?fF o  X G~X.~?fFo<>F ~JE ~ <7 7f3hJ?f o{|.R~X2 <F s<TX?XB yX?.B wXsX.?B yX?.B wXFuXB  +?XB yX?.B wXFuX?F o<  E ~f?m .8f~.< t <~. |J?Jm<  <J ~+<'? +'B yX?.B wX+{Xx%{<}t}XFX~tE~XX~X~ X~X +F C +/I<NJJ ,F1hJ~JJ JGXJ~JfF .~+?.pfF~. fF8_~J JGX<~Jf3W 8dX 8}1Of3f~XX JGX<~JfFf~<~X<~X<F~<8%[X +F ? +  o{.|.R~XFjX2 tFs<+X%F ? +  o{.|.R~XFsX2 tFs<+X%F  + {.|.R~XYFz<+.%F ` +s {.|.R~XF$Xu+.%F * +y? o{.|.R~X2 XFtJ+x#FF `; + }F$F  +2u>F  +<JK|X|X<F't=M JRJ?0O J|.SF  +F| <~t F~fJz.< J <~. $ ~<2 F$u| \ ~XF +}t~} F fF  +otJxF< <~t fz.< J <~. F +| |  fF $ +K|t }X\ J<F +}t~XF  + +>F  +E F 05 +K#<AX JF `2 + +JtFut|X \ ~XtF +}t~F  +"{f +<F ? + o{.|.R~X+XFz'2 tFu<J }.F}* fA"  !4)tXf?<F q" |tFv"u |tF?fnFfJ }.F(| F ? + f o{.|.R~X+X2'FvJ{ {t{X +F 2 + tF +v F  + +uF  +1 }F6 P+ +f)&PX1.<.wXUwXUwXX <&f? tot <}f2<*r }J!u  2 M qS f/?mtM X f/?Mnt?Xnt<2 "qfXg < Ft?6 ptJ2% + ytX X~J 6J>  <~  X 6 j@ 6 n@}t.~7IXF F? 6 ptJ   + WX(X[ W &< .ut'6 V* 4  +A\ |J |J)t&gzt  4t 4  +#t ; X4|J Y@/f4|< K} <g O . +;?f q!~X <fO 5+f< /O8~<,. J O ?Af 0O}BG=f5<.f fOB; <O}5.4<-f f}'O.%t~J.,6 <!t < >/O B89 +fOU51f  <2 &OZ3*f}tu  "O ^'/f fOa.3cf O  +L  +! <1 , $ +  +g.C. X=@:< z.5t %"f i."J tf֐Ȟ. X<<. !fD$f*` RJ^f<t~2<r- \} < \ ~&OXf* .+ Js<X].*~<  2 +q&@. fD$f*` RJ^f<t~2<r- \} < \ ~&OXf* .+ Js<X].*~<   +~ ! {!FXJ&'f* .~J. +  +!H }XD~.&Jf* .H~f   +H}.u DH~.  . J&}f* .+ Jv|H X6H~1  ++ XwX{t+  Xu~X JGX<~Jf .{f<{<  +|2/ pKY <[&YJ XZX R .&~f* .+ Jx<   +J }.bR .+ +fx<&|Xf* .+ Jx<  +J{.J 9RJ .+ fx<&|Xf* .+ Jx<  +(<_  +"<e aW +.U.aWy<<~f X<2 Xr< J~X k~ <<Yt / +A /taf<t~2<rJ \} < \} <x'QnX"/ <{< 9JGX<< X <5J|.< X <~.<X|XJ|X/  .3/!/Z f/"~~3f~QJnX"/ <{< 9JGX<< X <5J|.< X t~.<X|XJ|X/,JJJXfJJXfJJXf*~t< ~ /~~t~X +  +.w.  +./y.}.  +./y}<  +w  +0 J +~X}J X6J~1 & + , + ! {!FXJ&'f* .~J3 +J  +X.X X6J~1J  +LJ tRJ .+ fJt<&lXf* .+ JJt<J  +M.J 9RJ .+ fJt<&aXf* .+ JJt<J K +KJ}K<&}f*.-|tK.ef J << RfU J< |fHJU. {t<~f Jw<<  <+.~< xJ+ f<Rw `=J xJ <?f r< f}f%<~<J K</| X* K}J|  <JwJK XK}JX| XK} < "X|f+.|KJ  +J~Jt R+.gJ}<&Xf* .+JJ}<J  +L~J t7RJ C.+ fJt<&Xf* .+ JJt<J  +M~.J 90RJ N.+ fJt<&Xf* .+ JJt<J  +J~Jt R+.gJ}<&Xf* .+JJ}<J & +K. DJu.+  +tJu.&Xf* .+ JJuJ , +L . `DJ. ./ ]D~.J.J  +"Kt SD~.&Jf* .JFfJ  +~fJ DJ ?.&~Xf* .+ JJu. +J & +.(  +>(  +?<7J xJ(  += J/t|J2(At?<B wfuf(!Y |KO&|Jf* .(JB .?B yX(tf?B w s("XxX ~(X s.t|~(fB t?B yX ~wJ~t( f( ) +<(  +t7J  rJ"JxJ(~. f.<Y~2X)| }(z }~t)<(  +UfK-/'-1z.'tdv .'t. . /J='fJ/z.X&fJz../J=/-z.' ./%fJ4.Jz.J/J=/-z.+A$f {D~.&<<*.-|t.($. {D~.( f {f+  +(sJz( " +|.f7X oX%" h<|."<(1u"=|!( zD" . {XGXX&Jf* ." t {XGXX(.( J +y(.K &#x<2 )|J wp$ 4+ 7X) xxf< ~.< X~X7X( v+{|tX|X.< X <+J~ < X <~.(X !y#< ~.< X~X(/!hJ xX.=XJ KxD Xg<y+ x%4( < +xf <.<Y~2f)|"w<7X oX%" h<|."<(1+ f<s <(~t"={ !X(|f f% {(<xf!<x. B( x" < {XGXX<(&xf* .( Jx." < {Xt} (( " +{Xf7X oX%" h<|."<(1 "={!(  yD" . {XGXX&Jf* ." t {XGXX(.( " +{f7X oX%" h<|."<+  X(1zX"={!("{7X oX%" h<|."<+  X(1zX"} X {<~"=!(|ff yD" . {XGXX" X {<~X(<&x$f* ." t {XGXX"< X {<~(( " +{f7X oX%" h<|."<(1 "={!(  yD~.&<*.-|t.(. yD" . {JGXX(. y"f {JGXX( " +{Xf7X oX%" h<|."<(1 "={!(  yD" . {XGXX&Jf* ." t {XGXX(.( `" +zXf7X oX%" h<|."<(1+ "=vf!(x<~ <( yR~f( X fwfU<zJ fw<<  < . x+ <<Rw|(X yR~.(  <wf<J(vX X  {~X+ f<+X J(vX&f* .+ J< uX <~..X< K(X" }* {JGXX(< z J(vX< X"X+}~ (f( " +zf7X oX%" h<|."<+  X(1zX"=z!("z7X oX%" h<|."<+  X(1zX"} X {<~"=!(|ff yD" . {XGXX" X {<~X(<&x$f* ." t {XGXX"< X {<~(( " +zf7X oX%" h<|."<+  X(1zX"=z!("z7X oX%" h<|."<+  X(1zX"} X {<~"=.!(|ff  yD" . {XGXX" X {<~X(<&w$f* ." t {XGXX"< X {<~(( " +zXf7X oX%" h<|."<(1+ "=vf!( %2(xA xD(.w)w&w f* .+ J(sX.( " +zXf7X oX%" h<|."<(1+ "=vf!( % 2(yA xD(.w)w&w f* .+ J(sX.( " +zXf7X oX%" h<|."<+  X(6|X+ "=v<!(% z(<wf" <x~<2 ( zw.&w f* .(Jw. <`t~((  ~ +y0t("fvt+  (s)X2 (vG {D( f}X. |<~(v+   w|X( <w.<t~2<r \} < \} <(%&wf* .+ fJv+  (}vJ)J2 (vK {fD( f}J+ zJ|X( .v.J zD~.&.*.-|t.~f(J zfD~.( + J  hJ w&~ff*<-|=.J~t<t f~C< g&tf* .+ fsJJ+  fJv($wt(fv XvXJ +  +f*s.<    ~f+ 8 +>  +*. ( X}  +Jf. ( X}.2.X5(  }  +$( X'}.9.'X2 . .  +J ~f()<t2 (v; {D( ft+ ~|Xf JGX<~Jf+t&| }J XNJ~4<<  +<J ~t()<t2 (v; {D( ft+ ~|XX JGX<~Jf+t&|J <}J XNJ~4<< J +~<. / +=J ~<.  +<}. ) +> <}. J +}<. () +X2 (v5 {D( ft|+ ~|Xf JGX<~Jf+t&| |<  +=  += ? +< qf{?}nt?}lY }~X[ ,R&~f??fmt <{f&X{f?}nt?}lY  R}~JX %R~.X X{< X<? mt&f* .t&|J{.{{XiJ=(X1fX{JX }64{    +? pf.{f {*{f?}nt?}lY<~%<.zX X<? pf!.{. <{.*{f|z< X<{JJzJz@zf<zX }67kzJz%hzXX }67z    +N H%|=   + <m.< H% |<c.-< Z.&.3  ++ .3x.Y+ .w.3X+ .wf3Xdf+fy*+fy'+fw%VwtwX3Xt+VwX +3  +3  +3 : +< 64 +f" D~.&Yf* .+ Jt. + H +} !DH~.  g f2~fU x<~f &}f* .+ Jv. z}<<}H X6H~7<& @ +4 9 f" XxfJ~f& + <w <.<Y~2fw&{ z+t'& " +tf7X oX%" h<|."<+  X&'uX "=!&~ .f* .&}t" < {X~X&~" < {X&  +D& < +~ <.<Y~2f)|&u&  +g&  +!& ? + }nt?& p&Y"X z~XJ~f"  +<& z wvz & yG  +/J}{J&  |  +I< ~G } f.<Y~2fr ~| < xJ~  +tf~tf xJ=t"}J <{< 9JGX< <u.~!  +tu?JpJ~f xJ  +J U}. {f<~f Jw<aWXU<aWy<< Z <+.~JL<< yf~+ <Rw `FO-J {J  z U}. {f<~f Jw<aWXU<aWy<< Z <+.~JL<< yf~+ <Rw `FO-J {J uX < "X "X|f+ # +t;" {< 9JGXJ   +  U}. {f<~f Jw<aWXU<aWy<< Z <+.~JL<< yf~+ <Rw `FO-J {t v< "X+|   + J4f Lf  + J0f Pf  + J,f Tf  +K  + +~< EfJ JrJ t{<f t}.}t< ft} tt} tt} tt}.}t <{J.. oXEf| f~D $  <fD  . fz(9)|tctJ<  <~fL< Js|<D~X< f~.< J~X< t~.< J~XDL<   <5D|.o f  < x } t <+y. < <{.X <<+f7s t ~. <. zX  t f 8zf .y7<<o <~.<<<~2 +rt7<<o <.<2  +rYt< X <~f. *ffyX] !t_<0JV] }.<]~.<7J wXw< gJ.<vX zz]{! x] !+_ < <^)N ` {<qfX z< t f0{  f.{ t{ t{ t{ t{ t{ t{ t{ z < `$z9't t <+y.. <<+.7s t t`yJ+qC`*.5 t }J2 5w ~2 5w "|t <f zX  t f 8zf` + 0^ c  |. f~f  f |tY|t ||X< t <~.  f  xX z0?aWU<aWy0~<<t~f t<Uw< JJ " tw t{<f t}.}t< ft} tt} tt} tt}.}t <{J..LX<<~  w _ +?h< JU X< |fj<U. {<< }f <+.~X x+ J<Rw MYvXHU. {f<~f Jw<<  <+.~X< yt+  <Rw `Y2 X< sJ  X|7U v< |fH<U. {f<~f Jw<<  <+.~X+ X< uf+  <Rw `Y%~X2 < }sX%" h<|."< <<  <"=<!t|Xf,~tf yX   <tfU< {f<~f Jw<aWU.aWy<at.+ t<Rw `TJ  z< U}. {f<~f Jw<aWU.aWy< Zt <+.~XvJ< yt+ t<Rw `TOX v~<  <~t< .~f< ~fX~"} << f+Y|<<""|< |<"|< |<"|.<f~< X"X|< "X| ~<z~f.~<}^| v}.}t}t} bt}t(<X}XX}X +  +)Ȑ<(J u( < uJ z<(J+  .BvX}t+  Xst(J* tJ *+  FvX}t+  uJXJf~* sJ *+  FvX}t+  u<JXfJ}*J 8}}} " +f7X oX%" h<|f"<+ {~J<"~2< q.%" h<=/!.|ff< X <~."=!X< ~ +<Jw#Vwt  + }. D(~.J +IUJ +&vJ D~f -( }X( J"XLy4}t+  v}X|J X6J~1<X6J~1<Q<  +  + +~~"fJ xJ J"#. ef  /  4/ +~f zJ4(7  qJ <f +yJ J}<.%~X J J ($|f +~~t   +} @J%.~J" +<J}J" +.~<|.. ~.  +}<  +}  +}  +  }t<~.$%|X$ J|<~. <g/  +' /~9f<t~2<rJ \} < \ ~/~&f/~X+  X/At.+  X/sJ / f/ }f ~J/J" .JwJ" f{<J.<~f+,.J4~J<t/J  +f/ uf/ }f$X}4w/f ?t}nt?./m}~/C.}../~/S.}../  $X/^t~/. f/et~/. ./lt~/.0|" /~|J./E.|. ~fD~f/~f/Y.|f}f+  f}t/X} D(~fJ +IUJ +3x/t fD/~f3</tJ/~J  R~.&X<* .+ t*wf-|X/ .J ufRJ .+ X/t +./!~X /*6f/X/ ~D~.&<*.-|X./f ~D/~.* </~JJf&f* .+ J/s&f* .+ J3t<JfJft/tfJJfJ/~fJJJXfJJXfJJX}f<Qn"/ <{< 9JGX<<  <5J|.<  <~.<|XJ|X/XJJ/~f!h J+f// ~D~.&<*.-|X./f ~D/.y/ ~D~.&<*.-|X./f ~D~./ f/~Cjt ~D~./~f/\.|f~/U.3}f /}<" #</z~f/.|..3~f/  3}/J +}fu'*~< / J XHJ~CXHJ~CJ/1~f /$~f* }U </!~./gJ 7R&~. f/~J /~ -/~H U/~Ct< |tXXXttX +/  + /~J D~.&X.*<-|./Tf tD/`. |J/J D~.&f.*<-|.~f/J tD/c. |J/J D~.&..*<-|.~f/J tD . )t./}<X/}J  fD/nfu  fD/qf~z/^/ D/c n/f wfD~f/X hfD~./X gD/. J~.<?/ qtt<\& +f /t<%</L~tttJJf/~f}tX! X/ yJ~t" </ yJ&~ff<X~t<~tJ/Jt~tJJ~// / +</ < +</ 3 +</  +0M % +tM~J~.<  &<%}&<M4} t~M  +.{.|.R~A }JA~J <xf~XR0FfXA  .s2JrB  +f?JB yXt.?JB wsXA L2JA }J2 sJ| +J2 tM } )J < zG J XM ~8+t{'+'x%Yit Xf M 0 +? +XpfM ~.2fM qJ&M |r  J~.&<M| &J%}M S<uN~. W  +pJ tRJ .+ fs<&6Xf* .+ Js<  +lJJ 9RJ .+ fs<&2Xf* .+ Js< $ +[J t7RJ C.+ ft<&!Xf* .+ Jt< ( +WJJ 90RJ N.+ ft<&Xf* .+ Jt< @ = +BJ t7RJ C.+ ft<&`f* .+ Jt<   +JJ 90RJ N.+ ft<&\f* .+ Jt<   +   +  +; }#<+u2p/ a?X}nt? n|X Xw<# KK&{4<" J JGXJ~Jf* . ~J0 XBf<}j< ~}  X6}1a6X6}1J&X 6}1Z.X 6}1Rt M +M 7\  Xvf JX~J% .M~</  &%}&<M4}t t +~\3 < t  +A  +Z .0* f<J   ~1~   +=  +@ 1 +<  +2 t*s' !Y ! + "XX-f q<f | X 3 1| X 3 1 3 1|t    + +? nt% f|<?f nt   U}. {f<~f Jw<aWXU<aWy<< Z <+f~<L ~fx% f|<6f } <? ntX ~? nt< J~+ <Rw `8O-J {J tX< "X~}  +  + .<v0 x< . jfU x<~. -L/<PJ /QJ4<  +, / .  + <.<"vRJ)  + <.<"vRJ1  + +h  +0~<~ .~ .~ J~ .~ .~ .~ .~ .~ .~ .~ .~ . ` +!  + +G +G + +G   +K +F +H( +G +F%   + + +U/   +5OtJT-yX tX'J   + + +yX/( p? +( nf?J}nt?}lY }~X[ "D&~f?f2}t?j}nt?}l~X< D&~.f(f?t(mt}5X~X< D.(8ktt = <= z<(:ktt = <= (k<j XkJ JlJ Xm< Xp XqJ JrJ XsJ  XuJ  JvJ  +XwJ  JxJ `yJ QF @2(  +?KKuU-TSzXyXxX +vX #uX'(  + V%/( , +,V1/(  + + +V/&  + +X# & +&W+/ & +&W+  + +g  + +u  + +g  + +u  + +X#  +YYRwtM)f  f  P +]  ~f<4  +;i ZJ<;&f[ j#J }J4<1. K< < +.4 <<}JJ^f}Jf 4  +9i J<9f j#J }J4<1. K< < +.4 <<}JJf}Jf   +<fJ <x.<2  +tf Xt<   JU}. {f<~f Jw<aWXU.aWy<< Zt <+.~<J< yX~+ <Rw| @8O-J%vJ J .uX x<J?JoX<  "X+|  0 +{JYeM4f% J4}<JXy<~ <j  }.Qnt< f~.< J~X< J <~.<J|XJ|.<& ~t <5t|.t|Xxt%X< t <~.<t|Xt|X x, X<|~ < .x6 7 + pt<~f<yt 7JoJ-JJJ<~.-<U t{<J}<~.Js3{J_&@<<~t7Xpt<~.t<'}Jl~J +$. J7J~ r$+ {f~ւ JGX<~Jf+t()2  (vS {D( f ~ 2 {% ~J)zX+ ~|X~ JGX<~Jf t{P   JkfJ< } + J|f t ftXfsJ} .~J}fk|f X <fU Xv }|.+ J f< }. <{f X t X}f&f   w{  . +u {%{+X~\t7J  ,Jo< up< /~ X<q!Z<q_f~JfqJ!Jqf<}.+7 +pqyJu}tq. l!fdzXqX  z1qlyfi *s-i <h(Js-}Jd x +d ~Je !fM<5<X <>\dB 9 Jht\UvkxJ /h o+fVJ] }<<..X]vJ$ <]{!fxJ j!|<h X /qmj!>Jqfk +{.~<~ftk +.q~f<<q~fh <q6sfh*  p<qsJzt~tqFzt~fq6Xh*  p<qsJ'%SY0JyC)KyEO +J-Jl {}<*d  <hf +~Ji ~J n d J < +Pfi ~<g.d }. Je%fg<+ gvl}d  Je%fs-c.<q  v"*X(vh n&~#~&~Jd f n&Ffl 9H +SJn 8d~tq" J%0+ Jq6}vf "% %v  H|(l  XU}f {f<~f Jw<aWU.aWy< Zt <5}h  nq<yfdh< o+ <Rw `~A|%X J Dh  nq<f?twJ g Jwf<T |J{(x<qX 4t <$|f| ~~+ {<  <~.<|X|XX X GXXX JG.X<  <5|t ~X!$-Yz%q~+ tq{ J  |q<4   oXo.quJ   +qs+ qv<+ Xq?x{~}<  x< JggNquJ  +Jq.utoy2T v4T z<{fU< ~J ftfyf J4<t|Jy. 2 4{T zJ|f4 ft}Jyf2<4{T zJ|f4 Jqvt&aWzfU<aWy<<~f tX<1 <~t"w@ X<wf < Jwf XL4<t~JgwXXX(J4t~f y. fh f t2 Jf vf zJt)<4t~f +.wJw yft  yJ tfy J4<t|Jy. 2 4{T zJ|.4 t}Jy.2<4{T zt|.4 Jt}J2.tywt   <U}. {f{f<< Jw<aWUtaWy<< Zt <+.~v< y+ <Rw `~O tt wwt6,:<2<t5z&  %yJ/2tpf !Jt'XX;0J$fJ2J</J2f<fwJt,XX<X.WJ +xJt~( y< fh<~f%?tfxf2%s#t< fxJ"J4Jt}Jx.2JqXJt y<,% [<2%s(t< <x"4Jt}<%z.tJ%zXtJx<%f2 Jtx <xf6?,:x< X <5J|.<|X<  <~.<|X|Xq 5t <<$|f| ~~+ < v<g.vR J~Xq k t2D r<  +/fD ZJ2 q {JAE u" +J:"Ju +- wJ q|f <J7J y2q{<) "yq#XDLw<   <~JDLX<   <5tD|.q % yj|q +)ut  +f .y|X & 4{q  < {zX7t  ,oX.xJ  J1.UwJ'xJ /#= - L+#X <~. Xt JfzX & ,0<z   x< JggNqt Xot fx< JggNqJ Jxpt+  +qv~-DL<   <mtD|fq{XY{u{<o.q-h ~J(i |Xs-f4h y|d +Xd ~Jqd y,ffLd e !<fMX5<X <>d ? fr.q<  f|f X+ < oX|qf<s3f  JpJIJ < t. }~fU zJ }< <{f '  X}fh+UvkxJ X/~ f+fV] }t<..X]v< <]{<!fxJ j!|<h J /k +oq~<<q~f<q zq<xftq*fh  p<qtJI%.J$8xq<Cg(J+ {0q!txf2(J+ 8qZzt!7xt qfxA +<?twJ g wfX zJ2 T v4T z<{fU< ~ <tfyf yXq< X0 ~t2 4{T zJ|f24{.T zJqf J0x<<  <~.<|XJ|.<  <~.<|X|Xq"Xx fxX+ |&| x}X+  +<sqf+ q;x{ :q&w!w t Jq8|LyJ +?~t  o< x< J/gNqwtX0w.J wt.qwXwfX& J)  <tfU {f{f<X Jw<aWU.aWy< Zt 5 x+ <Rw `~O|2%~( X }~.%t. t?|Jt . }~ E<  Jf~.<s3f  JpJIJ < t. }~fU zJ }< <{f   X}f"qN<~f-< JpJ Xp. pX  ]}J<~ yt1<~f-<J Xp.  tJ] n.UX {<{f<X Jw<aWU.aWy< Zt <+.~< y+ <Rw `~|X + wJy}wU C zt<x t{. x '{. x '{. x *{. x '{. x '{. x *{. x '{. <x J{.q q~  ~X+ .|>   w'|X<  <~f<|| |'et&XaWzU<aWyf<<~f t  }~<{f % }~."tf t?|Jt . }~X tE<S    wk{XXQ +nB< t~.< J~X |k%<  <5|.P'Y<< J~tw> << i <w. <Lq. Xt.qXtq XtxJ(qt <0tx.qJxt  J <tf  fhX f f2 f vf z.tJwtX yft  yJ ftfy yXq< 0 ~t2 4{T zJ|.24{.T ztq. J02tywt  J <tfU< {f<~f Jw<aWU.aWy< Zt <5 x+ <Rw `~O tt w wt6,:<2<t5z  J%yJ/2ftpf Jt'XX;0J$fJ2J</J2f<fwJt,XX<X.WJ +xJ~Xt~( y< fhX~f%@tJ<xf2<%st <q k%zJt"JqgJ Jx.t"XqiJx2fty  <2<%s<t <xt"qI J0tx.q<%zXtJ%zXtJx<%f2 Jtx  <xf6?,:xw)<q< <xft)<qJfx.<x   <tt << yf 5|.<|X.<  <~.<|XJ|.q  B <<$|.| ~~X+ t{X .~Xq  At <<$|.|XJ ~t~.+ <q{X ~XxX; ~X ~fq-' +z& +z.< f" }"tt yt < g<J" +}t JL<+ ~<~ q~<+|< ~.q&)K< {<" }L +ftqf!{<+< ~<f" " }h p ~<U~ t  yt < /<+J }<Iq~t6w<qw ttwfqxfAXX~ {tqy<<~< {X +P ( +?<KP $" +,<J  `b +g)J<~.+ |t .|J+ f|. p. f}f <  .pf   p..~J  J4  f}f$XJ<~.+ |ft f|J+    +X qf  p. <LrJ +M ~J  f}f }t~Xf# .~f f ?.$DJ <<U -Jt&'~X'f~  }t~ X *~Jf J f ~J J'~X'f  e +m + J o<Y|." <x ~<~2X v{f Xvf }.XX+ f|X t |.?J JGX<~Jf+JX7zGtZG ~<<~.t<Y~t<Z $%q J%ztJ v t v  v %q tzt<~.w< ' U}. {f<~f Jw<aWXU.aWy<< Zt <+.~JL<wf<<  ~+ <Rw `Fy-X%vX J ' +wf< <"X }<+t}~ tt<~ +  +pt +JS # +UptX   +<..t...t.t.......t.......t..t.t....t.................t...',- /rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/ops/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0//rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/ptr/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/alloc/srcfunction.rslibrary/panic_unwind/src/gcc.rsmod.rsalloc.rslibrary/panic_unwind/src/dwarf/eh.rslibrary/panic_unwind/src/dwarf/mod.rsconst_ptr.rslibrary/panic_unwind/src/lib.rsboxed.rs i +8<< i +8<< j +< JGXJ~Jf<J< pj + j +~ j +> JX~Jf j +%r< << ~J g~#!#_X.J~JX t<  <=K#qf<_X#!f<#f_f=<J~JX e< <==AJ t  <#]<_X#!f<_J t~~ JS<Y~<J  0l +j< 3 ig l! +uM. }X   0  m?% +%Ot Y @m8 +f Pm8 +f `m +Nf~& YzX D}<j.. ~JX /C X~.~#!tX. ~J%XtJ ~J r<#W <#qJ<. ~J^t.<~JX t<  X=K "X <fXZXY#!<_X.<~JX t<  X=K)X <.<< <g !X~f  i f~f~X +0'<}<Ox /rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/fmt/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/ptr/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/str/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/slice/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/slice/iter/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/array/cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/iter/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/char/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/iter/traits/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/ops/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/num/rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/iter/adaptersmod.rsmod.rspattern.rsindex.rsmod.rsmemchr.rsmacros.rscmp.rscmp.rsmod.rs/cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/legacy.rsrange.rs validations.rsmod.rstraits.rsmut_ptr.rsoption.rsmethods.rs +result.rsiterator.rs const_ptr.rsrange.rs iter.rsconvert.rs +iter.rsfunction.rs /cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/v0.rsuint_macros.rs peekable.rscopied.rsdouble_ended.rs /cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/lib.rsrev.rs  +<  +  6 +1CJ ~tTf|f<|G|t <&<}XJ.<f+~<4~J<Jf#KIfi.*ft~.J~. < Cf. ~JTf!J|t|$X ~ ` +"uf J~ 4 X  zX}f< ~f + eY.U <l f}f  *JY.UfX< .b5X<.< .< ~Jt< )X <.< .bf )X <E.?Sf -XJ| f ~fU /<h 2X~fX vw ~XXU /<hJ X ~J < f fX e. Xpf Jlt < ~J./`tJ< .J ~Jb<5<<.< .< ~Jt< )X <.< .< ~JbX5<K. )X <E.?Sf -X.pf/} .<o.<  f. ~J.  XY"X pf t r. Xf  ~J  " q Jp. l J  }fY.Uf <g*.~ 4 Jf }J  Jpf J4 XfJ J0 { 9}f~f X J&f }4 [<~f< 2h [Xf h XfJ }f  < qf /Jh~J.<~f<  ~J=<f<. ~JJ.< .J ~Jtt )f J.< .< ~Jb5JK. )f JE.?Sf -XJ 7&~X 7;<  h 2X~f J, X}t J,-< }<~.J. ~Jb5X<Kf<< f< ~Jt< )X <f< f > < t 6f Jf < t 7f If < t 8f Hf < t 9f Gf < t :f Ff < t ;f Ef < t zf . K <|.ti ~f 2h [Xf h [X:feJ f~ I!f< f;J!WX < e.U /<h 2X~f t~X JUX /<h X'f| X| < Jw t <f ~%f&Y&}< .t1y<eJ0y<}t t <f ~%f&Y&}< .t1y<eJ0y<}t t <f ~%f&Y&}< .t1y<eJ0y< Jt<"z< g ty<!| $ty<! ~<}  <. ~t%.&Y&}< .t1y<-J0y<}J&|<   +~!J J < ~f< ~<Q~  < ~f g t <|f X g% ~!J J < ~.x /}J!| < <|f X gK } < ~f g t <|f X g  < ~f g t <|f X g!o 3 ~t f ~%f&K&}. .<1yf}f<0LJw  <f ~t%f&K&}. .t1yf}f<J0y<}t  <f ~%f&Y&}< .t1y<eJ0y<}t  <f ~%f&Y&}< .t1y<eJ0y< JtX"z< g  yty<} < < ~.xf| !J J < ~.x /%u| ty< ~ < ~.x / t < ~.x / t <|. J /}#</ }~%!~ J J ~.x /}  t <|f J g t <|. J /}  <f ~t%.&Y&}< .t1y<e<0y< Jtt"{J{f ` +}J!J t < ~f /  <|f X g < ~J{  < ~.x / =} <!  ff ~X}<<Y} f~X< 20 [X~.<~ [f/f~  J <. ~%.&&}< .1y<-<0y< JJ"z< /}f{< ` + J o[< {< .r<{.ZJ/u,X{f 0 +~fJ!|f J J ~f< ~J zJfJ |f!J J < ~f g  <|f X gfJ}f}J <3J ~< <|f XQ< gfJ |f!J J < ~f g  <|f X g*Y-X(X|Jzf! J J ~.xf </({~|J fJ!|f J J ~f< ~XXh* ~fJ |f!J J < ~f g  <|f X g .} . f ~%f&Y&}< .J1y<e0>J0y<tz2 tfv#z  <f ~%f&Y&}< .1y<eJw  <f ~%f&Y&}< .1y<eJ0y< JtJ"z<}.X v <J#K 9t.,X.t7f,X |y< J2.zJ)("/X+Wz2 ix {f {.fg5&/f |y<f|< ~fJ Jzf }Y2X$=zJ  <. ~%.&Y&}< .1y<-J yty<.|<z. }J I$ z)"zf f {.f/4X&K/fL0X!Kt*fK0Xz  +}<<<J!~. J J ~.x /fJzf <!J 3J ~< <|. XQ< /!| J J|. J /Z |X ~J . ~%.&Y&}< .J1y<-0>J0y< JJJ}<   +}fJ!|f J J ~f< ~JQ~("g-X'p(yJm( }fJ!~. J J ~.x /fJzf <!J 3J ~< <|f XQ< ggyJ 0fJ}f}J <3J ~< <|f XQ< g J3.Ykt+ |fJ |f!J J < ~f g  <|f X gfJ |f!J J < ~f g  <|f X g({Jzf! J J ~.xf </({ |JJztyty0yyyytyyyy |} . f ~%f&Y&}< .J1y<e0LJ0y<}t. <y<Jzf! J J ~.xf </({~|J}  <f ~t%f&K&}. .1yf}f<J0y< JtJ"z<}.X v <J#K 9 ~} ~ f ~%f&Y&}< .J1y<e0LJw  <f ~t%f&K&}. .1yf}f<J0y< Jtg,X {y<.|<yJ 'XzJfK2 4J  z<f</- }f  |J}<h;K0X {y<.|<#J | fJ!~f J J ~fx gfJzf <!J 3J ~< <|. XQ< / . ~ f ~%f&K&}. .J1yf}f<0LJ |'XzXK2 4  z<.</- %X }J~<y. +%X.X  +}<fJ!~f J J ~.x / J|J!. J J|J!. J J ~.x /fJ!~f J J ~fx gy<24 }P}t ZX2YY ~X|2# z< z.f .~z . fD2PXGp<X  g}<X>! }L X~fX 2}Je<< if X.XD2PJGp<J  /}X<X0.1.X*{Jz.! J J ~.x. </({F|J ~(X |JfJ!~. J J ~.x //XOy< |  +|<<<J!~f J J ~.x /fJ}f}J <3J ~< <|. XQ< /! J J|. J /}# K$Xx#  {t}  . ~%f&Y&}< .J1y<-0LJ0y<}.Jzf! J J ~.xf </({~|J ~J"z<}.X v <J#K 9  +x<  +  +=x < J|f! J J ~fx g} Jj)(  |J2f J K&. K |J J|f Jx. J~tx<x.  +|<<<J!~f J J ~.x /tJ}f}J <3J ~< <|f XQ< g !X X <f ~Jx < <|. J /$x < x2}  f ~%f&Y&}< .J1y<-0LJ0y< J% zJ~ -J"z<}.X v <J#Y U X z ~  f ~X}<Y} J~< 2h [J~ff4 [f f KX z ~ .. ~f}<Y}X J~< 2h [J~ff4 [Xf x.&J ffw.ttK  z 6wxJ ~<Ut J "<|f ty.<  f=.U.< .J ~JbX5<K.J< .J ~Jbf )f <E.J< .< ~JbX?Sf -XJxfg({X|   +|fJ|f}J J} < ~J  f ~X}<Y}  h [Jf~X ^ [f:f J J /%KxfyJ. tgx +U J "<|f .yt<  .Y<U.f< .f ~JJK.< .X ~Jtf )X JE.< .< ~Jb<5JK. )X JE.?S -fJxfg(~  + x<xX%Mwf +<uf  +< ! +. uJ 4 t  z<!.xJut +<0su<0 +< wJ~X 4   z<fJ*!J/0Z wJ <uf +u  Zy yf h J}f<~f  *J=<UfJ< .J ~JJ.< .J ~JtJ )f J.< .b5JK. )f JE.?Sf -XA. .@gx Xfsf X fh fs +fuf  +<0r< wJ < kf !  y.| 4   z<!.xJJJu< +<00e<uX 4    z<fJ*!J/} yX@ y.. y^xX X { v   v 2h X}f< 4. h 2X~f< q <pf l X}f< }tf<f  ~J=<U.< .J ~JJ.< .< ~Jt< )X J.< .< ~JbX5JK. )X JE.?Sf -XJ  qt<   qf .p X tpf 4 X}.<} "4 X }ffJ< . fq<f  ~JY<UfXJ. ~tb5XJ.< .X ~JbJ + p f )f J.< .J ~Jb<?Sf -XA. '.KJ   qf Jp.  <rfJ .}f f Jr.J .}fJ .}f#] X . fp  xXO<  <f t <pf<5 ~J ;f ~J.afX< .J ~Jbf5<<.< .J ~Jt< )X <.< .J ~JbX5<K. )X <E.?Sf -X. pXT<  f~.<~XX~fg< @f}ff |f {><f  ~J=..< .J ~J<.< .< ~Jt< )X <.< .< ~JbX5<K. )X <E.?Sf -X 'J 4   z< |.lft 4 <  zJ}.<f  ~J=..< .J ~Jb<5<KJ5<.< .< ~Jt< )X <.< .< ~JbXX )X <E.?Sf -X 'J#Y=X X<#.XL 5XX)XX X h Jf< ~ <f.!.u  t!u$ }t  !u <}<}<<}< }t }t. }t   +< G +>< G +tq<K/K  G +<>t   +  +< f~. J ~X  +~f< t~. J ~X  +! +<nX  +Kq f  + <J  J |fH< .  {<~f  Jw<  <+.~<< yX~ Rw `= JuJ < }uJ "X+   +"  + 1 0 +&  +  +Z  ytXY~Xy   +f}< J}J <}.<|fJ  X |fH< f  {<~f  Jw<  <+.~<<  |< X~ X~ Rw `K Js + tb.H<.  fw<  < . x<~ Rw `Y X }$wX}f t~. J ~X ~J  J |fH<fx< < }wJ *"X} "X|   +~<}< J}J < ~.} <|fJ|  X~X}   |J + b.H<.  fw<  < . x<~ Rw `Y|XX }$wX}f t~. J ~X ~J |J}J   |fH< .  {<~f  Jw<  <+.~<< yX~ Rw `K JuJ < }uJ t~. J ~X "X|f. "X| |t<  + @ +xy.  yfy 5y  +=  +K  +2JR zW  $ +~tt~-RJ-R.< `X0}   xXXY~ + t~<  f|Jx%.}.<  +{X<$  }JX Y{ X st|f < @ +!"  +f  + wX <3#Ly 4f$ z<%}.   X |fH< .  {f~f  Jw<  < . x<~ Rw `Y~XC < }"8uX` t~. X ~X" / "X+|""   +~tX~ +   ~fo<~f"%J(}t<~fX) ~JK<2.5<).X)~JJ.<).<)~Jb<< )X J.<).<)~Jb<5 JK. )X JE.?Sf -X(J" <}<}J}tJ}tJ ~  h* 2Xcf.<f)~J<.)~JzJ?.<.)~JzJ .<)}.J)~Jbf"<.<<.<<.+<"(,}"!x ~ h* Xf~ .q<f) ~J=<2.5<).J)~JJ.<).<)~Jt< )X J.<).<)~JbX5JK. )X JE.?Sf -XJ,pt"(,}P t"s!x| JJ  J |fHJ .  {t~f  Jw<  <~.+J~<fwX"J}tJ  <Rw| J= J"qf~ JJ  J |fHJ .  {t~f  Jw<  <~.+J~<J yX <Rw| J= Jq"J* "X*~ "X"|f~""   +}<X~ +   ~o<~f"!}<f) ~XY<U.<).f)~JJ.<).X)~Jtf )X J.<).<)~Jb<5JK. )X JE.?Sf -X"J|<]z. +~ ~"<" ' +{X  f  yf}f X~ | t~.H.  Jw<  < . xJ~ Rw `Y X'q {. J'!u{< <{.  <}. < {<'zX +"~ ~ ~ "X+|' + ` +g@,2f7Z <0x{  fX~ + b H<.  fw<  < . xJ~ Rw `K X }t + ~f  X |fHJ .  {t~f  Jw<  <+.~JJ yf~ Rw `K X }J +8xJ }X +8x  ~t  X |fH< .  {f~f  Jw<  <+.~J yf  Rw `K~X < }t + < ~f  X |fHJ f  {t~f  Jw<  <+.~J xJ  Rw `K + DJ"X "X +|f. "X "X +| +   +|XX~ + ~.<f J. |< 1f .|< ..Jf4<  +.| +J <g{XJ 9|t ~. X ~X +|~ + +  += +g +  +zJ  K |fH< f  {< .v<  Jw<  <+.~< x<~ Rw  v=|J +f  +  +z$J  WJ |fj< .  {< . u< <+.~< x<~ Rw v=|J +f  + 0 +f .  }.  {f~f  Jw<  <+f~< +At0`. f . <g J|0" <gX .g J <gX .gX .g J uJ  J |fH< .  {<~f  Jw<  <+.~<J y~ Rw `=-J {J J +|X yt~ Rw `= JuJ  } +|Jwt +  + +x + J  {J |fH< .  {f~f  Jw<  <+.~JJ +J wf~ Rw `K~X +MJwJ +Y<<r J z +X y"X+ +   +{7< +|J +   += +   + +   + J +   += +   +{7<  pJX~X + ~t +   +wJJ <3t#Ly< 4<$ z<.% x<yf .  J |fH< .  {<~f  Jw<  <+.~<J yX~ Rw `= JuJy< < } +J v"X+ +  +zJ7<1 vJ + +  +s<  +  +!t +x. J yX ~X  + X nX ++qX +  + p}f + <pJ  ~XX~X +wz< +o + # += +  +)m<J +'t  +  +]JJlX6<*J< v.2wJ4<.y<C <2,q < + J + ) +m<J +t +  +m<( +C  +   +/ x 1  + +/ x 1  + +/ w 1   +/ u  +1   +mX~X  +t { +Jm / +X%# / +Pt0<  +" vJ ( kJ%J + +  + +G +V* +U' + +  + + +W /rustc/2fd73fabe469357a12c2c974c140f67e7cdd76d0/library/core/src/ops/function.rslibrary/core/src/ptr/mod.rslibrary/core/src/fmt/mod.rslibrary/core/src/num/f32.rslibrary/core/src/num/f64.rslibrary/core/src/num/dec2flt/algorithm.rslibrary/core/src/num/int_macros.rslibrary/core/src/cmp.rslibrary/core/src/num/dec2flt/num.rslibrary/core/src/num/bignum.rslibrary/core/src/iter/range.rslibrary/core/src/num/uint_macros.rslibrary/core/src/ptr/const_ptr.rslibrary/core/src/iter/adapters/chain.rslibrary/core/src/ptr/mut_ptr.rslibrary/core/src/slice/index.rslibrary/core/src/slice/iter/macros.rslibrary/core/src/slice/iter.rslibrary/core/src/slice/mod.rslibrary/core/src/iter/traits/iterator.rslibrary/core/src/array/mod.rslibrary/core/src/iter/adapters/take_while.rslibrary/core/src/ops/arith.rslibrary/core/src/iter/traits/double_ended.rslibrary/core/src/iter/adapters/rev.rslibrary/core/src/num/dec2flt/parse.rslibrary/core/src/str/mod.rslibrary/core/src/option.rslibrary/core/src/num/dec2flt/rawfp.rslibrary/core/src/num/diy_float.rslibrary/core/src/num/dec2flt/mod.rslibrary/core/src/str/traits.rslibrary/core/src/num/flt2dec/decoder.rslibrary/core/src/num/flt2dec/estimator.rslibrary/core/src/num/flt2dec/strategy/dragon.rslibrary/core/src/iter/adapters/zip.rslibrary/core/src/num/flt2dec/mod.rslibrary/core/src/iter/adapters/cloned.rslibrary/core/src/num/flt2dec/strategy/grisu.rslibrary/core/src/intrinsics.rslibrary/core/src/num/error.rslibrary/core/src/num/mod.rslibrary/core/src/char/methods.rslibrary/core/src/convert/mod.rslibrary/core/src/ops/range.rslibrary/core/src/any.rslibrary/core/src/ascii.rslibrary/core/src/mem/mod.rslibrary/core/src/cell.rslibrary/core/src/fmt/builders.rslibrary/core/src/char/convert.rslibrary/core/src/char/decode.rslibrary/core/src/char/mod.rslibrary/core/src/ffi.rslibrary/core/src/iter/adapters/filter.rslibrary/core/src/result.rslibrary/core/src/iter/traits/collect.rslibrary/core/src/panic.rslibrary/core/src/panicking.rslibrary/core/src/sync/atomic.rslibrary/core/src/str/pattern.rslibrary/core/src/slice/memchr.rslibrary/core/src/slice/cmp.rslibrary/core/src/fmt/float.rslibrary/core/src/fmt/num.rslibrary/core/src/str/validations.rslibrary/core/src/iter/adapters/map.rslibrary/core/src/iter/traits/accum.rslibrary/core/src/str/iter.rslibrary/core/src/mem/maybe_uninit.rslibrary/core/src/str/converts.rslibrary/core/src/str/error.rslibrary/core/src/str/lossy.rslibrary/core/src/time.rslibrary/core/src/unicode/printable.rslibrary/core/src/ptr/non_null.rslibrary/core/src/task/wake.rslibrary/core/src/alloc/layout.rslibrary/core/src/alloc/mod.rslibrary/core/src/iter/adapters/enumerate.rslibrary/core/src/num/nonzero.rslibrary/core/src/marker.rslibrary/core/src/iter/adapters/flatten.rslibrary/core/src/iter/adapters/fuse.rslibrary/core/src/hash/sip.rslibrary/core/src/iter/adapters/copied.rslibrary/core/src/internal_macros.rslibrary/core/src/unicode/unicode_data.rslibrary/core/src/ops/bit.rslibrary/core/src/future/mod.rslibrary/core/src/../../stdarch/crates/core_arch/src/simd.rslibrary/core/src/../../stdarch/crates/core_arch/src/macros.rslibrary/core/src/../../stdarch/crates/core_arch/src/x86/mod.rslibrary/core/src/../../stdarch/crates/core_arch/src/x86/cpuid.rs # +y $ +  +~J{.{ .{ .  +~X{{.Wz{ .{ .  += /YJK)  + t  J-tK<~. <.w< t( < <~ < 1( <zX( <}< w<t <( <  + +=[ +Jv ~pX4   z< +}.v  J <  |Ji..d.. +. 4 + + < +<S7 ~J<~  ~JfJ~f<<~"" +"~f~<I~<"J~<~<"J~<s< +~JJ~ +"~J~JJ +./~JQ>~."teLr4 ~J +f<g ~f +" ) +f ? + + <Jf<}f +B)X-.JJ}. +<f f +5<6e+  J0J.=+-K +. f ~f . ~J  +!.4 X  z<  +}Jv  <4 t  z< |. +. f  +=/ . +<Pf" J  IXX<f <H.9J 9X H<f ZtfJ<8 & ~J" J  IX XP<fJ<~f<.J: ZtfJ<$ <"t X  It< fp< fsB  +gK <0 Y= T</~1! 0 +! 6 +"   +" XJ<<K# " + +CJf<~. }J~ +"~Xt~.It~<"J~<t~<"J~<ts< +~JJ~ +"~<ut< +./L#~< +CJf< .}J~ +"~X~.I~<"J~<~<"J~<s< +~Jt~ +"~<t< +./L#~X +)f w<JJ fk.<.J.t t0p# z<$ ~. <~0X# z<}. +<$ ~ +1"0'~.uY.0I~..$ _J +~J$  +1"0t'~.X~J<) w<JJ fkf<.J.t t0p# z<$ ~. <~0X# z< +.$ ~ +1"0'~.ug<0I~.J$ _J +~J$  +1"0t'~.X~J<#X +)J w<JJ fk.<.J.t t0p# z<$ ~. <~0X# z< +.$ ~ +1"0'~.ug<0I~.J$ _J +~J$  +1"0t'~.X~J<#X +)J w<JJ fk <.J.t t0p# z<$ ~. <~0X# z<}.$  +1"0'~.ug<0I~.J$ _J +~J$  +1"0t'~.X~J<#X N' JJJf~ +"X~f~<I~<"J~<~<"J~<s< +~JJ~ +"~J~JJ +./L4Xv +fJf<~ t <~fX<fff#<}t +"~X~.It~<"J~<t~<"J~<ts< +~Jt~ +"~<t< +./L Xw<JJ fk<.J.t f# k h*X&J<~f<T.K%#~J~f<% ~.4X  zt%}~ . Z4t  zJ%}# JKK~J<#~f +}J#~ #~f+} + uff#~ +#~f f}f +< 5f" #~t&'  +N<"#< +X XZ+'  + f / </  f x  f/ ~X.u  ~X.z f/ ~X. ~X.'  +\f gt gt f'x< f'xf~f <J gt ~f'X fh t' < '><<"#< +u0;MuK J<.<>dx)  +~t~ ~ t~ t)  +u<~ tootot *  +s zf*<  .z*Jy. *Jy. Jyt<<*f+yJ *}&R.2. J*}<yX<<*.+yJf/=}< X*< .*}&R.2. J*}<yJtyf |*1*  +s zf*<  fz*Jyf*~t<<*f+yJ*|&Rf2.J*}<y<<*f+yJf/}< X*<.*|&Rf2.J*}<yt *Jy.X*~<<*f+yJft*|&..J*|<y<<*.+yJf/Y}< .*<f*|&..J*|<yJyJ |*1*  +syf *<  .z*Jyf  *J+yf* Jy.<<*f+yX *}j J*}<yJ<*.+yX//}J f*< .*}2 J*}JyJty |*1* $ +syf f*<  .z*Jyf *Jy. <y.<*f+yX *}2 J*}.yJJ<*.+yJ/Y}< <*< .*}2 J*}<JyyX |*1*  +e zf*<  .z*Jyf f*Jyf z<*f+yX *}X2 J*}.z<*.+yXt/=}J f*. .*}X2 J*}..yfy<yfyX |*1*  +eyf <*<  fz*fyfX<*f+yXf *}yf&<2. J*}t_t z*Jyf yf<*f+yX/}< <*<y.  .*}yX&<2< J*}ty.y.yX |*1*  +eyf f*<  .z*Jy.*~.X<*f+yJ*|jJ*}<yt *Jy.<*f+yXf/!}< .*..*|JjJ*}<yt<*.+yXf*|J2J*|<zX<*.+yXf/Y}< .*.f*|J2J*|<Py |*1*  +eyf X*<  .z*Jy.t~.<*f+yXff*|.jJ*}.yJ t*Jy.f<*f+yX/}J <*<.*|.2J*}<y.~. <*f+yXf*|.2J*|.yJ<*.+yX/g}J <*<f*|.2J*|<y.tyX |*1*  +yf <*<yf Xz *Jyf~f<~f*X+yXf*|&f.*|O z*Jyf~f<~f*X+yXf*|&Rf.*}ty<~f*X+yJf/}< .*<yf <*|&R..*}y.<~f*X+yJf/Y}< .*<.*|&..*|yy.yX |*1*  +eyf *<  .z*Jyf~ff<*f+yX*|jJ*}<yt *Jyf~.X<*f+yXf*|J2J*|<z<*f+yX/Y}< X*<f*|J2J*|Jy.<*.+yX/=}< X*<.*|J2J*}JyJyf |*1  + +  + +,  +- 2 + J 8-tf- % +X J 8-tfM . & +.  +=  +/  +  n f X t    X  X  X$u  C4y yt /   +J4<  zJ .( J/#r<..#-/  + f /|/   +J4J  z< .  J/(|J..(3/   +J4J  z< .  J/(|J~..(-/ = +L t f0J t.  + v "/  +=1  & +1  + <1 @& +1  + <3  + \3  +r< X 3  +<4  +=4  +K + 64uf5  +#q 6<!<3  5~X[ +tm i e t  J5  +  <5  +~ 5p<~J !3  <}5X5  +&j=lv  +  <# 6<!J3  5~X[    J5  + f}X<1l /} 4 <  z<|.54J  zJ5 }.6 L[w~~ p.+p }<f#~ 6<!J3  5~X[~ ~ ~ ~ J5  +}XX <} <5  +%5  + +M~ .~ (5s} t}. t}fXX~!J3   .5~[w.x*~f5 `& +&j=f  ~ <#~ 6<!J3  5~X[~ ~ ~ ~ J5  +[ SJ5  +5  +$f'<K" =f" %<=5  +< k5  + + wf <5  +$f'<K "z =k"v %<= 5  +o$<'<*J  J5 t  J5p"J%<  J5pJ"v  <5p 6 7 +=6  + 7  + 2tf7 <2 .~J </8 J2 |. <2rJ  .2t .7~<9 + + ' + +/ x6  ' + + x'6 : ( +u:  ( +K: 0( +K:  + +:,u u'.t:}<. u~ M2J J=X J ' 6:u : @( +>:  +=:  +u:  +=:  +=: P(2 +K J=X J ' 6:vf; (&' + J ;}1 ; 0)? +3 ;~6 ; ): + J;'<  +|<p. . .J2 )! +2~<]f 2.,  E<2~g t/+.[ =Tf ~f>~JJ.<f>+~Jl~J< >v< .w<J<~.>CtJl~J<>. J<f)\  >yJ:  2 rJ< . <~f<.>*~J4~J<=J fJu? }=X|f2 2J  j0  2X2 ~.,J  X(f}27f  _2 p, +=8 J2 {.JL~   <2r<  <2 s<~.J~ <  +J2+uK  +<2)uK  +<2)uf<~.  +.2/uf3<2!w<X2 vJ =K xt-2'u  +2'uf~X't  +2t2  +8 J2 |f <2rJ <~.  +.2t.  +.2/uf3N!;X2 vJ  2tf  f2t f <2rJ   +.2t JJ 2  . +!~J <~.<8 J2 |. <2rJ  .2t .A2 p. +8 Jzf2 f|<  J2 tf}.  2+v<}<  .2.vf3<2!y<X2 vJ =K xt2y2't  J2t .JZ2 / +=}J < <}.f8 .2}.(fJ  +. +<2uJ .2,wfL <2 w Q/2 00 +8 Jzf2 f +<2r<  <2 u.|.. .2-wf<|. .2-wf3<2!y<X2 vJ == xt2y1't J2t .JK 2 P1 +KZ2  +8 J2~.(; <2 `1 +8 J2n.(; <2  +8 ~J2 .JJ J f<2 xX4ytMt2 vJ == xt2}.'t 2t u2  +8 J2 .Je Iyf f<2rJ <y.. .2-zfL<"tK <2t. .2-zf3;2 vJ L= xt2}+%t 2t fi2  +8 ~J2 .JLo J f<2 xf4yMJ2 vJ =K xt2}/' 2t u2  +!8 ~J2.F J0 <2 {@  +"{X!t~ft{! |fX! J  .<%J +}9|' +< }<|f <hK r} +t }f|' J ,J JJ tzfX' T %Ng <zf X%<}f X<f< f}<  < hY % <Y <Fg8< z + }<|  < +fKzX@d 'J%g <zff<0K| / Y'X f J4Y < </}yX b|} @  +f"{J!X~< t!{X! |XX! f .<%J +}9|% +< }.|tf <hK r} +t }X|' J ,J JJ tzfX' T %Ng <zf X%<}f X<f< f}<  < hY % <Y <Fg8< z + }.|  < +fKzX@d 'J%g <zff<0K| / Y'X f J4Y < </}yX b|} @   +"{X!t~ft{! |fX! J  .<% +9|% +< <|t <hK rGt +3t Mf|' J|' J %2J |X%<}f J<}ff< f}<  < hY % <Y <Fg8< |f< < +r G<|tt < +fK|J'%1 |X%< / Y'X f J4Y < </} t{J@5f%} @   +X"{X!f~< !{X-! |XX! f .<% +9|% +< <|t <hK rGt +3t Mf|' J|' J %2J |X%<}f J<}ff< f}<  < hY % <Y <Fg8< |f< < +r G<|tt < +fK|J'%1 |X%< / Y'X f J4Y < </} t{J@5f%} @ % +<zf"{X!t~ft{! |fX! J  .<%X +~$|' +< ~< Jh8J8< q~ +t ~f|' JZ ,J JJzX<|Jt~f' < % z J +r ~<f J8 f<Kz@ ' %& W %|@ % +<zff"{J!X~J t!{X! |XX! f X<%X +~%|% +< ~.t Jh8J8< q~ +t ~X|' JZ ,J JJzX<|Jt~f' < % z J +r ~.f J8 f<Kz@ ' %& W %|@  +."{J!X~< t!{X! |XX! f .<% +~$| +< ~.~ +t X|' <{X'   % { + ~.| -X GP{@~' % @  +"{X!t~ft{! |fX! J  .<% +~$| +< ~<~ +t f|' <{X'   % { + ~<| -X GP{@~' % A  +t|f  <|f ")==g h }t( ARu( +<ARu( +<ARu( +<ARu " t . f f J n J g{?h;K K{ 5 f hh=5 9 }( tARu( +<Aq . Jg =50 ; }( tA u J5l ; }( tAuA  += t A  + A  +?<.t +/ Xz / zBr> itztAȄ}AXX( JA +u XT,OJ R"|XAAX@X( +JAu< |XA ?Y 1+ +=+ +fs.  X tg~.+ X`. X . <u . tg+ +."t <uX <u . tg+ . <uX <uX <u . tg `2 + g 2 +  2 +=+^<+ +fs.  X t#f~.+ X`. X . <u . t#f+ +."t <uX <u . t#f+ . <uX <uX <u . t#f 3 +Kq f 3 +8z 3 +R z  4 +  &0M aw<$ J ~f)Xt0<w0J.<K<K<N  y 1X}<   y 1X}< - xJJX@`$ x J f)0f!v6J jw<$ J ~.)t0<w!fJ;$ xJ J~.J)0fwf <<wJX< /!  (<wJf 6  +J|J f| t{Jv.<<~   J{v.  .1<vftXBo76-J7kJ-JJBo 76-J7kJ-J fBo76<-JBo76J-J.J~f<q<B~J-.<< .fv# +XJ |Ju.1 +X< Ks ^u +1<u( +u( +{X1<u +< Ks ^u+ +(8fut  +<4~  zJ .! J+<uJ +J1<(J$ ~4  zJ f&+8fut  +<4~X  zJ .! J+<iJ(.$K 4   zJ .&vf +JuJ +< `;  +$L,Xv + . ; + +>u<J Ju. +Jut  +Jk wJ4f  z<|fBXXB~J!tSf -E<&fg<4<  zJ}.<fB ~J=..<.B~J.KJ5f..<B.JB~J f .EJ ;X ..<~f<<B .=. .U /<0  2f~.<BfJB~Jf.K .~  Jvf<~1 +JutRBo<76-J7kJ-JJBo<76-J7kJ-J XBo76<-JBo76J-J.J~f<q<B~J-.<<1 .JvX~f,ZBo<76-J7kJ-JJBo<76-J7kJ-J fBo76<-JBo76J-J.J~f<q<B~J-.<1 X< g; Bu+ +8fut  +<4~  zJ .! J+<uJ +XcJ&<$K ~4  zJ .&vf +u B5X.f<B.<B~J < .Et ; .Ef.<B.b?.Sf -XE.  + +=X%vJv +} < J }Xt.<<  +tg)  zft%vt.<% *f ?J<<~.<% TJsKf~.XJ0Jz~X f<t.  +.u  t  JK+Sf8fut  +<4~  zJ .! J+<i"7tJ .$w }4t  zJ .&vJ   +  uJ +< /  </tuJ<~f %.!$vJ!Y% ugYf~fXJhJ% <MJ3JHJN<g v.4  2X~f <tJf<fJX;vXf%=-%Xv Jw<}J! . ft<<%5~XJJ} f v X 0B  + PB  +K    +=   +=   +   +u   +   +=   +u B  +   + B + B + B +}J2t < B +}u2<     C +}J2xf +<  +|J2wf <  +|J2yf  PC +  +<  +  +D< .J  +=< .J pC +oX<~fB ~JK<2.5.<B.XB~JJ.<B.JB~JbJ< )f J.<B.JB~JbJ5.JK. )f JE.?Sf -XEf~+|,|f |M|  @ ~fX  [Jf ~fX  [J :f  +X,o. t$o5 X}.Jfn'~>!X3   .5~[wx>0~-+ ts. X t0 to<t< 4f ~.X  J(.} t <  <#L  r# `H +  H +O+ r| X|M| Vo5 X <~!J3  .5~~<w.**~f ! J +q  Jq. Xo.).+{f .`. f . <u <s .+|" <uX <u < <uX <uX <u <  +NK  <}.J /q / #hq<-A#|<F .~JA~J4tAw<.  A~.=!< q  +z> K1 + J>v< .w<J<~.>C<Jl~J<>. Jt\f), *)\  J>y:  2 rJ< . <~.<~.>tX>*~tJ4~J<~.>fXXX X>  +J < f f <>g f fJJ-X<U.>@~!<W<>~.) ~( <<"2J)j  J>y .<~.f<T.>+~J~X<}.>t t L  +/ }6  PM' +/ }6  M. +/ }6  5 +K < +K  + 2tf <G. J2 ~J </8 J2 |. <2rJ  .2t .< PN +/ j 6 G NB +$ <f1 J<f K .~.J  .B{XrJ<4 .Yt5&J/IXtY# #s  S .~<0JXi "pJ)~J  .~JGBX8  +Gt=G B + <f1 J<f K .~.J  .B{XrJ<4 .Yt5&J/IXtY# #s  S .~<0JXi "pJ)~J  .~JGBX8  +Gt=H  +Kf  "Hs6f V Hs6fH  +<E  + < 8Etf  2xfE {< t<~f2 _J|<fB ~J=..<B.JB~Jb<5<KJ5<.<B.JB~Jt< )X <.<B.JB~JbXX )X <E.?Sf -X2J 8 2(m. XE6tfM.  1E  +2tfE <. H? G,x F  E2 }f~J </8 J2 |. <2rJ  .2t .E< +E  +2tfE <. H? G,x F  E2 }f~J </8 J2 |. <2rJ  .2t .E< +E  + += 0Q +K=  +2tf= <$. H2 {~J </8 J2 |. <2rJ  .2t .=<= PQ +=xX<xf  {x+ "tf& . ut= +<0JJ30tt  t &tf& . ut= +<0J!30tt  t% "<x<=1f xf~f< tf? ~J= ,&. ~fw<J~= * tf  <if t/ff<<t JYJ30tt  <sf  tf  <if t/ff<<t J30tt  < |fw<J<~ff~Q=&y.\=&y<ujX=&yA=&yw)~f<tq<=&JwJ<=.v7N=&y.\=&y<ujf=&yA=&yw)~#q<=&JwJ<=~. < ;x  @L=~ I 0Z +iI @Z +hI PZ1 + ?JIA<MfJJ=f <!k YL .B.I~Xf J f |<I 9J7<$  J f |<I 9J'<$ J f |<I 9J <fi$p X< $J  |<I 9J?<fi  J  |<I 9J<fe+ < 3J  |<I 9J0<fiH ! t Ju +  +%J-K- +  +?; +  +<<gKG<3u +  +!<J~. +<K . +  +Lv~<J./- +  +sJ<Jk..< +/ .>X~f +.~.. . +  +m <Jf<}f +B)X-.JJ}. +<f . +5<6e~..c. ff + ' +N2< <w<JJ~f$ < <~ +f>$ z. +"'~Ju<0I~JJ$ O +~J$  +"'~Jt~J<gL> 2. +I< +  +>~." eLr4J</?"w. + # +N.< <w<JJ$ If <~ +1"0J'~.u<1I0J~.J$ _J +~J$  +1"0J'~.t~J . +n< +  +MCJf< . +|J<~ +t>. +"f~Xt~.It~<"J~<t~<"J~JtsJ +~JJ~ +"~<ut< +<gL> ) +< +  +At}ft4<  z< +-}.-J4J  zJ4.  z<|. +X  4J  z<|. +<=J.h$J}<</L}J4 J  z< +7}7X6<s}f4   z< +}.}<>}.7i +  + JJ4.  z<| +~ .9<HJE.Jf<~"  +"~X~.I~<"J~<~<"J~<sJ +~JJ~ +" ~JtJ +<g~  | +~# 6 +   X +~A4<  zJ +}.mJf< .}J~ +f<~. +".~Xt~.It~<"J~<t~<"J~<ts< +~JJ~ +"~<ut< +.gL<}.( +  +< G<J +f J<}f t~ +$~f +~f<K=}. +<+"~J +$~<<. +J$s=.<xf f +<} +  +#.}f<<Jf<f +~. +}4f}<J +"f}<v";}<v}<J +.}X.}X. +"f}<>@}XJ@vX  +  +~X<J~fff< +/ f>f +f68=~t<Jf<}f +BX-.JJ}. +<f f +5X~f +.~.. . +  +m <Jf<}. +BJ-.Jt}J +Jf . +5<6efXN~..c. ff + ' +N2< <w<JJ$ If <~ +>$ z. +"'~Xu<0I~XJ$ O +~J$ J +"'~Jt~J<gL> 2. +I< +  +L~.XH~.XH4</?"w. + # +N.< <w<JJ$ If <~t +1"0X'~.u<1I0X~.J$ _J +~J$ J +1"0J'~.t~J . +n< +  +iCJf< . +|JJ~< +"~<Y<"-~JY<";~JY<";~JXs< +~J< +f.~X +"X~JY<< +</L> o +< +  +AJ}f4<  z< < +-~JJ-X4J  z<4.  z< +~.4J  zJ +~.4J  zJ +~.4J  zJ|f +<=J.h$J}<</L}J4 J  z< +7}7X6Xs}f4   z< +}.}<>}t7+i }  +  + fJ4.  z<| +~<.9<HJE.Jf<~. +"~<Y<"-~JX~<"<~JY<";~JXs< +~J< +f.~X +"X~JY<< +.g~  |$ +~ " + "  X +~4f  zJ +}.mJf< .}J~< +"~<Y<"-~JY<";~JY<";~JXs< +~J< +f.~X +"X~JY<< +</L<}t( +  + <J + f<}f t~ +$f~< +fKI=~. +<"<=}<}JJ +<f}".f~f +X=~t<Jf<}. +B$J-.JJ +f +f.}J~<..4J  z< . +J~v.#)< Jw<JJ~f<.f.X $ i. < +1"f0X'~.YY.$ ]J J +~1<0f~.<1W0f/~X$ < +1".0X~.<~X<<g|4 <  z< +~| < +yf <f + ? +} +f +  +R)< <w<JJ~.<.X.J t +k|.. ~. +  +L)< <w<JJ~.<.X.J t +k|.. ~. +  +/< +  + K$|f B +6wfJ +f, 6 +7wX|f$  + +p< +p   +2L  J2tf +< +U- +T +zX2 ~X J/8 J2 |. X2rJ  .2t .~J $ + +[. '<  J2vf }f +V2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w Q}.  tt  tt  tt   +  J2tf<V*U2 ~X J/8 J2 |. X2rJ  .2t .~J +  + +2tf +< +U2 ~X J/8 J2 |. J2rJ  .2t .J  + +~< +  +.   +  J2tf<T*zX2 ~X J/8 J2 |. X2rJ  .2t .~J +!   +ALLN  2tf!<U-SyX wX #sX2 ~X J/8 J2 |. X2rJ  .2t .!~J!  +  %XX!t<<b  <2vf! }fwX2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w Q!}.% & + +  +J2vf% +f&yX +  +J2vf% +f&U  +J2vf% f&S~t~f+k% & + .)  + 2vf)}f +W2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w Q)}.) f + 2tf) +]< +U2 ~X J/8 J2 |. J2rJ  .2t .)~J)  + +  .Q  +*<  .z*Jy. *Jy.<*.+yJf .*}<2 J*}.y.Q2Q  +*<  .z*Jy.Q~  X*Jy.<<*.+yXf .*}2 J*}<Qz.~<X  Q|Q  +*<  .z*Jy.Q~  X*Jy.<<*.+yXf .*}2 J*}.Qz.~JX  wQ|Q  +*<  .z*Jy. *Jy.f<*.+yXf .*}y.&<2. J*}<yJ8 <Qu  Q|fQ  +r*<y. <z*Jy. *Jy.<*.+yJf .*}y.&<2. J*}tyJ8  <sJQX Q  +*<  .z*Jy.<*.+yJf.*|2J*}.yJQX EJ*Jy.QX~J.<*.+yXf.*|2J*|.Qz.*J }Q|<Q  +*<  .z*Jy.<*.+yXf.*|J2J*}<yJQX E *Jy.QX~ <*.+yXf.*|J2J*|<Qz.  Q|Q  +*<  .z*Jy.<*.+yXf.*|<2J*}.yJQX E *Jy.QX~ <*.+yXf.*|<2J*|.Qz.  wQ|Q  +*<  .z*Jy.<*.+yJf.*|t&R.2.J*}<yJ X*Jy.8 <Qu~ <*.+yXf.*|t&..J*|< }JQ|fQ  +*tyf fz*Jyff<*f+yX.*|$&R.<*}ty J*Jy.8  tsJQJ~  <*.+yX.*|$&.<*|y J  > + > + > + > + > +K +Y ? +! +u   +z + ? +   +z. + @g? +   +z + ? +   +zJ + ? +K +Y   +zI +* & + .*  +{X*<  .z*Jy.X<*.+yJf.*|<2J*}.y. *Jy.<<*.+yJf.*|<2J*|.y.t*  +{*<  .z*Jy.<*f+yXf.*|J2J*}<yJ<fy  f*J+.fy ffy <*.+yXf.*|J2J*|<y.ff *  +{f*<  .z*Jyf<*.+yXf.*|<2J*}.yJXfy  .*Jy.<*.+yXf.*|<2J*|.4f .y f*  +{*<  .z*Jyf<*.+yX.*|t&R.2.J*}<yJ *Jy.<<*.+yXf.*|t&..J*|<yJ*  +K*  +{*<  .z*Jy.yJ X*Jy.<*.+yX .*}X2 J*}..yJXyJ.yJX*  +{*<  .z*Jy. *Jy.<*.+yXf .*}2 J*}<.fyJXfJ*  +{f*<  .z*Jy. *Jy.fyJ<*.+yXf .*}2 J*}..fJ yJf* Pg +{*<  .z*Jy. *Jy.<*.+yX .*}&R.2. J*}<yJt*  +{t*<y. <z*JtJ z*Jy.<*.+yJf .*}y.&<2. J*}ty. y< " +  R  +.  +2tf.7<7U2 ~~X J/8 J2 |. J2rJ  .2t ..<J  + 2vf~f +W2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w Q}.3  + +2tf3<V2 2~X J/8 J2 |. J2rJ  .2t .3MJ3  +~<  +.3  + 2vf3XfW2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w Q3.4  + 2tf4 +< +V2 ~X J/8 J2 |. J2rJ  .2t .4~J5  +K  +J2tf5 <G(F wJ2 ~X J/8 J2 |. X2rJ  .2t .5~J 5  +  +.5  + 2tf5<U2  ~X J/8 J2 |. J2rJ  .2t .5vJ5  +   5vf +  J5vX  J5t<   J2vf5 JfS~t~fo5  + 2vf5-fW2  f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w Q5X.5  +2vf5f +W2 d}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w Q5z.5  +2vf5f +W2 cf}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w Q5.5  + +. "JJ J2vf5 f +H +r +r| fJ J2vf5 f +G +q| .J2vf5 f +F|Jp '6  + +}< +fAu<  + +t {.Asf  .As<~.<<h g<( tsJ-XA#}<F .~JA~J4JAw.J-.XA#}<F .~JA~J4JAw..< ++uAX.0 ^( tsAA' >}< +fAu<  + + {<AsX  fAs.~fJMt~fL==( JAs.J/= g<( tAs~J<Jhsf-A#|.F ~JA~J4JAw<J- A#|.F ~JA~J4JAw<.< ++uA<J h( tAs&JPAA' >}< +fAu<  + + {<Asf  fAs<~ft~ftL==( JAs.J/= g<( tAs~J<Jhsf-A#|<F .~JA~J4JAw<J-A#|<F .~JA~J4JAw<.< ++uA<J h( tAsbJAA' >}< +fAu<  + + {.Asf  fAs.~f<Mt~fL==( JAs.J/= g<( tAs~J<Jhsf-A#|tJF .~JA~J4fAw.J-A#|JF .~JA~J4fAw..< ++uA<J h( tAsbJAA' >}< +fAu<  + + {.AsX  fAs.~fXf~f>==( JAs.J/= g<( tAs~J<Jhsf-A#|f<F .~JA~J4fAw.J-A#|<F .~JA~J4fAw..< ++uA<J h( tAsbJAA' >}< +fAu<  + + {<AsX  fAs.fMt~f#L==( JAs.J/= g<( tAs~J<Jhsf-A#|JF .~JA~J4tAw<J-A#|JF .~JA~J4tAw<.< ++uA<J h( tAs&JPAA' >}< +fAu<  + + {<AsX  fAs.~fXt~f>==( JAs.J/= g<( tAs~J<Jhsf-A#|t<F .~JA~J4tAw<J-A#|<F .~JA~J4tAw<.< ++uA<J h( tAsbJAA' >}< +fAu<  + + {<AsX  fAs.fMt~f#L==( JAs.J/= g<( tAs~J<Jhsf-A#|JF .~JA~J4tAw<J-A#|JF .~JA~J4tAw<.< ++uA<J h( tAs&JPAA' >}< +fAu<  + + "x<tY@  +=  J@ +s< f K@  +=  J@ +s< ^f K @  +=  J@s< ]f;L J @  +=  J@s< ]f;L J@  +=  J@ +s< f K@  +=  J@ +s< ^f K @  +=  J@s< ]f;L J @  +=  J@s< ]f;L JA " +A 2 +.A # +0.A % +3<A % +3<A % +3JA  ' +6A " +A ' +2JA # +0.A % +3<A % +3JA  ' +6A " +A ' +2JA # +0.A % +3<A % +3.A % +3<A  ' +6A " +A ' +2JA # +0.A % +3<A % +3.A % +3<A  ' +6A " +A ' +2JA # +0.A % +3<A % +3.A % +3<A  ' +6tA *% +3<A +% +3<A ,% +3<A -' +6<A +% +3<A ,% +3<A -' +6<A ,% +3.A -' +6.A -' +6<A # + +/.)VJ 'A~1A # + /.z.VJ 'A~1A # + ~.=f~.<VX 'A~1A # + ~.=f~.<VX 'A~1A  +u.-fXA/}.F <~JA~J4JAw.. X A~.. A  +u.-fXA/}<F <~JA~J4JAw.. X A~.. A g +u.-fXA#}<F .~JA~J4JAw.. X A~.. A h +u.-fXA#}<F .~JA~J4JAw.. X A~.. A  +u<-XA#|t/<F <~JA~J4JAw<. X A~.. A  +u<-XA#|/<F <~JA~J4JAw<. X A~.. A  +u<-XA#|<F .~JA~J4JAw<. X A~.. A  +u<-XA#|<F .~JA~J4JAw<. X A~.. A  +u.-A#|/<F <~JA~J4fAw.. X A~.. A  +u.-A#|/<F <~JA~J4fAw.. X A~.. A  i +u.-A#|<F .~JA~J4fAw.. X A~.. A i +u.-A#|<F .~JA~J4fAw.. X A~.. A  +u<-A#|/<F <~JA~J4tAw<. X A~.. A  +u<-A#|/<F <~JA~J4tAw<. X A~.. A `j +u<-A#|<F .~JA~J4tAw<. X A~.. A k +u<-A#|<F .~JA~J4tAw<. X A~.. A  +u<-.A#|/<F <A}J4tAw< . t /}< .LA <.A  +u<-.A#|/<F <A}J4tAw< . t /}< .LA <.A  +X<-.A#|<F JA}X4tAw< . t /}< .LA <.A  +X<-.A#|<F JA}X4tAw< . t /}< .LA <.A k + AsX~f <As.~fXt~f>==( JAs.J/= g<( tAs~J<Jhs <-A#|<<F .~JA~J4tAw<J-A#|<F .~JA~J4tAw<.+~<J h( tAsbJAA' >}f~A & +KMt~ft>==( JAs.J/= g<( tAs~J<J0s}f<J hJ( tAs&JPAA' > A m% +~Jt0 g<( tq AX.0 ^( tsAA' >fA & +KMt~ft>==( JAs.J/= g<( tAs~J<J0s}f<J hJ( tAs&JPAA' > A % +~t~f#L==( JAs.J/= g<( tAs~J<J0e}f<J hJ( tAsbJAA' >fA Pn& +=Mt~fL==( JAs.J/= g<( tAs~J<J0s}f<J hJ( tAsbJAA' >fA o% +~t~f$L==( JAs.J/= g<( tAs~J<J0e}f<J hJ( tAsbJAA' >fA & +=Mt~f>==( JAs.J/= g<( tAs~J<J0s}f<J hJ( tAs&JPAA' > A p% +~tt~f$L==( JAs.J/= g<( tAs~J<J0e}f<J hJ( tAsbJAA' >fA  + }. }.H}. 5}tJ}.JHt}.  .4  zJ|..A~+  A~.  A~}tZKL}fX J. J}.<}( A tJ t. 4VP}J fxU}JX +<~AtJ/ ~( tAt3  +XAu<  +<Au.|< " +A * +=A % +}<< A * +=A % +}<< A * +=A % +}<. A * +=A % +}<< A * += +A % +|<<A * += +A % +|<<A * +=A % +|<.A * += +A % +|<<A  + #}tHt}tX}tJ}./HX}J }f J} 4  zJA~4  |At  J|fXA~}t<}X0}X }f( A t.J }.X J4P}J <x}J +<~ AtJ/ ~( tqAJ<  +XAu<  +<Au.|< " +YA * +=*Y*I=PA ' +}<tA * +=*Y*I=P +A ' +|<t  + +    +  G +>< G +><< qG +t ~<Asf~. .As<~.<<h g<( tA rJ.-XA#}<F .~JA~J4JAw.J-.XA#}<F .~JA~J4JAw..T+pAX.0 ^( tsAA' >}TfAp G +><  +< G +><@ G +0q<  +fTf |2vf8~f0uX2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QT . G + |<2tfC `<2 .~J </8 J2 |. <2rJ  .2t .T < G +><< G +><  +< G + |<2tfT<S2 ~X J/8 J2 |. J2rJ  .2t .T J G + |<2tfC `<2 .~J </8 J2 |. <2rJ  .2t .T < G + ><Qp<T G +0q<  +fTf |2vf8~f0uX2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QT . G + ~<Asf~f .As<~fJMt~fL==( JAs.J/= g<( tAs~J<Jhs .-XA#}<F .~JA~J4JAw.J-.JA#}<F  ~JA~J4JAw..T+pA<J h( tAs&JPAA' >}TfAp G +0q<  +fTf |2vf8~f0uX2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QT . G + +q<~< +  +. G +3q<~<  +. G +>< G + ~<Asf~f <As<fMt~fL==( JAs.J/= g<( tAs~J<Jhs <-A#|J<F .~JA~J4tAw<J-A#|JF .~JA~J4tAw<.T+pA<J h( tAs&JPAA' >}TfAp G +<d< G +<@q<  J@ +s< f K G + |<2tfS <2 .~J </8 J2 |. <2rJ  .2t .T < G + |<2tf +<V2 v~X J/8 J2 |. J2rJ  .2t .T J G +<@q<  J@ +s< f K G +Up}TfAp G +>< . +q< G + |<2tfS <2 .~J </8 J2 |. <2rJ  .2t .T < PsG +0q<8   +J2vf8~f0uX2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QT . |! G + ~<Asf~f .As<~fXf~f>==( JAs.J/= g<( tAs~J<Jhs .-A#|<<F .~JA~J4fAw.J-A#|<F .~JA~J4fAw..T+pA<J h( tAsbJAA' >}TfAp PtG +) +q<  . G + |<2xf  <p2J _J|2J _J|2J _J! _J?8 X2(m. XTf G + |<2tfC `<2 .~J </8 J2 |. <2rJ  .2t .T < G +t  tG +>t  G + |<2tfT<S2 ~X J/8 J2 |. J2rJ  .2t .T J G + ~<Asf~f .As<~f<Mt~fL==( JAs.J/= g<( tAs~J<Jhs .-A#|X<F .~JA~J4fAw.J-A#|JF .~JA~J4fAw..T+pA<J h( tAsbJAA' >}TfAp G +>< G +%{<< G +>< |t2xf  <o<2|X2 J|J2 .zJ.8 .2(m. XT G +0q<  +tTf |2vf8~f0uX2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QT . G +J><s T f G +>< G +>< G +>< G +>< G +Up==( JAs.J/= g<( tAs~J<Jhs <-A#|<<F .~JA~J4tAw<J-A#|<F .~JA~J4tAw<.T+pA<J h( tAsbJAA' >}TfAp G +0q<  +2vf8~f0uX2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QT . |Tf G +<%<< .J G +5q<  +. G + |t2xf  <o<~.2|X2 J|J2 .zJ.8 .2(m. XT G + |<2vf5-fW2  f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QT . G +>< G +=ut G +0q<  +tTf |2vf8~f0uX2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QT . G + ~<Asf~f <As<~fJMt~fL==( JAs.J/= g<( tAs~J<Jhs <-A#|<F .~JA~J4JAw<J-A#|.F ~JA~J4JAw<.T+pA<J h( tAs&JPAA' >}TfAp G + |<2tfU +< +V2 ~X J/8 J2 |. J2rJ  .2t .T J G +Js< T f uG +< t  G +<< t U  + 2tfU +< +U2 ~X J/8 J2 |. J2rJ  .2t .U~JU " + 2tfU +< +V2 ~X J/8 J2 |. J2rJ  .2t .U~JU 8 + 2vfU~f +W2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QU}.U  +DKK  J2tfU +_< +yJ+ +xJ t +wJ +t +vJ2 t~X J/8 J2 |. X2rJ  .2t .U~JU  + U  +H 0u+ +  J2tfH&D<&U*&T2 ~X J/8 J2 |. X2rJ  .2t .H+~J +H  + +2tfH +< +U2 ~X J/8 J2 |. J2rJ  .2t .HJE  +  +J2tfE<U*T2 ~X J/8 J2 |. X2rJ  .2t .EJ +E  + +2vfEfW2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QE~.E  +2vfEX2 ZX}J < <}.<8 .2}.(fJ  +. +<2uJ .2,wfL <2 w QE!.E  +2vfEX2 ZX}J < <}.<8 .2}.(fJ  +. +<2uJ .2,wfL <2 w QE!.E  +2vfEfW2 zf}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QE.E  +2vfEfV2 zf}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QE.E  +2tfE<V2 x~X J/8 J2 |. J2rJ  .2t .EJE   +2tfE<V2 x~X J/8 J2 |. J2rJ  .2t .EJE  + +2tfE <V2 w~X J/8 J2 |. J2rJ  .2t .EJE  + +2tfE <V2 w~X J/8 J2 |. J2rJ  .2t .EJE  + +2tfE <V2 w~X J/8 J2 |. J2rJ  .2t .EJE  + +Xu +#u +u5 +f~~ f~  +u +u5 +& 5w~  +u<S< uX +u5 +~ "~5 <~frf5~  +u  wp5 XE}5 E~5!J3  .5~~tSs~t< [ wp5 XS}5 S~5!3  .5~~ 8 w<p5 XE}5 E~5!d3  <}J0<S.}.B ~JK.2.5 <B.JB~J<.<B.<B~Jb<< )X <.<B.<B~Jb<5 <K. )X <E.?Sf -XJp.+ f|2_|(  }X+f|  wp5 XS}5 S~ 5!<3  .5~~E +uJ  w<pJ5 XE}5 E~5!3  <}J_ wJp5 tE}5 X~ !X3   .5~[wXp. E  +S +w. tuf +u5 +~t~S5 B~S5A~  +uSJ}X<~f<fB ~JK.2.5X<B.XB~J..<B.JB~Jb<< )X ..<B.JB~Jb<5 .K. )X .E.?Sf -XJp<+ f{"\{(  }X+f|  wp5 XS}5 S~ 5!.3  .5~~S} * wp5 XE}5 E~5!<3  .5~~E +u F wpJ5 tE}5  ~!X3 . .5~[~.X~$X~XJ E  +S +w tu +tu'  +'Sxf~f<~f<fB ~JY<2.5<B.JB~JJ.<B.<B~Jb<< )X J.<B.<B~Jb<5.JK. )X JE.?Sf -XXp+  }f+f|  Sp <p5 !3  <S}  +&SxX}f Ep .p5 t!3  <E}5I < w5 q~X!X3  .5~[wJ~E +.= & +  += u%J  +J= uXJ  +J=t<&~&~+p =  + +|.1XOJ4 J  z<X|.. - / .14 J  z<X|.<J(>m X 7 +~XE pJtYrX~<.ENYrX~<.ENYrX~<.ENYrX~<.NYrJ<.. <X oJ(@ fXJ/hXKJ . ztX>|.1XOJ4 J  z<X|.. 1 / .14 J  z<X|.<~J(>m X 7 +~ XE ptYrX~<.ENYrX~<.ENYrX~<.ENYrX~<.NYrJ<.. <X oJ(@ fXJ/hXKJ . ztX>|.1XOJ4 J  z<X|.. - / .14 J  z<X|.<~J(>m X v +~ <. ~< +X 0v7 +~ tE pJtYrX~<.ENYrX~<.ENYrX~<.ENYrX~<.NYrJ<.. <X oJ(@ fXJ/hXKJ . ztX>|.1XOJ4 J  z<X|.. / / .14 J  z<X|.<~J(>m X  +~ X~fl..|.X"gf<Y81#Jfb.X v  JX~<t|. tJt }.Bt|.#b X 7 +} tE pJtYrX~<.ENYrX~<.ENYrX~<.ENYrX~<.ENYrX~<.NYrJ<.. <X oJ(@ fXJ/hXKJ . ztX>|.1XOJ4 J  z<X|.. - / .14 J  z<X|.<}J(>m X  +} X~fl..{.X"gf<Y81#Jfb.X v  JX~<t{. tJt |.Bt|.#b X 7 +|XE ptYrX~<.NYrJ<.. <X oJ(@ fXJ/hXKJ . ztX>|.1XOJ4 J  z<X|.. 3 / .14 J  z<X|.<|J(>m X  +~<ExqJExqtJENqtJENqtJENqtJENqtJENqtJENqtJENqtJENqtJNx .XoJ XX z./X  +~<ExqJExqtJENqtJENqtJENqtJENqtJENqtJENqtJENqtJENqtJNx .XoJ XX z./Z ) + 2vfZ}f +W2 f}X J <}..8 .2}.  + +X2uJ .2,wfL X2 w QZ}.M   + +  J2tfM<xX +*vX2 ~X J/8 J2 |. X2rJ  .2t .M~J +M 9 +{{impl}}_ZN90_$LT$core..str..iter..Split$LT$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h846761d23ed172cbEadapters_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0ecd0762edc54471Enext,core::str::iter::Split,fn(&str) -> core::result::Result>fuse_ZN107_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..adapters..fuse..FuseImpl$LT$I$GT$$GT$4next17hd81b8139a9c25712Enext, fn(&str) -> core::result::Result>>pattern_ZN81_$LT$core..str..pattern..CharSearcher$u20$as$u20$core..str..pattern..Searcher$GT$10next_match17hf989bcb6c9c7f97dEnext_match_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17h7e02eb7c81de8cc2Eget_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h7f592741eb85b2d8Eget>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$6as_ptr17h8609f168188d13f0Eas_ptr_ZN73_$LT$$u5b$A$u5d$$u20$as$u20$core..slice..cmp..SlicePartialEq$LT$B$GT$$GT$5equal17h76a850667d277a04Eequal_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17hd047a27dd5065932Eeqimpls_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17h119518fa0b716254Eeq<[u8],[u8]>memchr_ZN4core5slice6memchr6memchr17he3057b1d08d6c2c3E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h9b5c1681f0d75d2eEnext_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h7937e3f887aa9137E_ZN4core5slice6memchr6memchr28_$u7b$$u7b$closure$u7d$$u7d$17h52404a4021743c8bE{{closure}}_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h589e92fba1db093bEindex_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h8056891cccd11822Eindex>array_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h85e997c9ceb77512E_ZN4core3str4iter22SplitInternal$LT$P$GT$7get_end17h984233e66fc9076cEget_endoptionOption_ZN4core6option15Option$LT$T$GT$3map17h52931b907c6fd591Emap<&str,core::result::Result,&mut fn(&str) -> core::result::Result>traits_ZN4core3str6traits108_$LT$impl$u20$core..slice..index..SliceIndex$LT$str$GT$$u20$for$u20$core..ops..range..Range$LT$usize$GT$$GT$13get_unchecked17h11b419ccec45f1d9Eget_unchecked_ZN4core3str21_$LT$impl$u20$str$GT$13get_unchecked17hec26ad08f4aa9e8bEget_unchecked>const_ptr_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h78736a27ba92294fE_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17hfafc7be9138650e3Eadd_ZN4core3str21_$LT$impl$u20$str$GT$5parse17h6114d7af19d0a034EparseopsfunctionFnMut_ZN4core3ops8function5FnMut8call_mut17h4f846370eecb5c7eEcall_mut core::result::Result,(&str)>_ZN4core3ops8function5impls80_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$9call_once17h5bb989a4c4ed8eedEcall_once<(&str),fn(&str) -> core::result::Result>_ZN4core6option15Option$LT$T$GT$6as_mut17h69b34062430bea6aEas_mut, alloc::collections::btree::node::marker::Edge>>_ZN4core6option15Option$LT$T$GT$6unwrap17h8277a4246375e63eEunwrap<&mut alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>>_ZN4core3ptr4read17hc69c59f7d4049f72Eread, alloc::collections::btree::node::marker::Edge>>collectionsbtreemem_ZN5alloc11collections5btree3mem7replace17h0b2c22b6faadd493Ereplace, alloc::collections::btree::node::marker::Edge>,(u64, gimli::read::abbrev::Abbreviation),closure-0>nodeHandle_ZN5alloc11collections5btree8navigate263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$14next_unchecked17hd7215ea66e2257d4Enext_uncheckedNodeRef_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17ha77a668059052759Elen_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8right_kv17h7a9bc30d7a620674Eright_kvnavigate_ZN5alloc11collections5btree8navigate25next_kv_unchecked_dealloc17h93be702d15e72592Enext_kv_unchecked_deallocnext_unchecked_ZN5alloc11collections5btree8navigate263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$14next_unchecked28_$u7b$$u7b$closure$u7d$$u7d$17h3d0d4f480cecdff5E{{closure}}_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$21deallocate_and_ascend17ha1cb594a8c369f7fEdeallocate_and_ascend_ZN5alloc5alloc7dealloc17hf6de874141947fb5E_ZN63_$LT$alloc..alloc..Global$u20$as$u20$core..alloc..Allocator$GT$10deallocate17h53754a90f1817b4eEdeallocate_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend17hd42ab154fc3dece4Eascend_ZN4core6option15Option$LT$T$GT$6as_ref17hae37b7f1c880da33Eas_ref>>_ZN4core6option15Option$LT$T$GT$3map17h8809e7c34897e20cEmap<&core::ptr::non_null::NonNull>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>,closure-0>ascend_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend28_$u7b$$u7b$closure$u7d$$u7d$17h35ede8058dee20f6E{{closure}}_ZN5alloc11collections5btree4node173Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Immut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$7into_kv17h9bf5544595ef9266Einto_kv_ZN4core3ptr4read17h4bf4fbbf80086810Eread_ZN5alloc11collections5btree4node91NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$5force17h2792d8bc98239c3cEforce_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17hb16cc7f9a63941ccEforce_ZN5alloc11collections5btree8navigate235_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$14next_leaf_edge17h6401fda734a4da7fEnext_leaf_edgemaybe_uninitMaybeUninit_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$16assume_init_read17h3ca283c691512e2bEassume_init_read>>_ZN5alloc11collections5btree4node180Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7descend17h31a1336b18660715Edescend_ZN5alloc11collections5btree8navigate142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$15first_leaf_edge17hf1b0e344e7cf953bEfirst_leaf_edge_ZN4core3ptr5write17h3995b480dc662de1Ewrite, alloc::collections::btree::node::marker::Edge>>_ZN4core6option15Option$LT$T$GT$6as_mut17h3f71b0064bffc340Eas_mut, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>_ZN4core6option15Option$LT$T$GT$6unwrap17hb2797aebcf518ea1Eunwrap<&mut alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>_ZN4core3ptr4read17h7bdffcf6eb2a89a7Eread, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>_ZN5alloc11collections5btree3mem7replace17h0da7078de42e795eEreplace, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>,(std::ffi::os_str::OsString, core::option::Option),closure-0>_ZN5alloc11collections5btree8navigate263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$14next_unchecked17h3c529f630a138f6cEnext_unchecked>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17h2036469206a3b7a4Elen,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8right_kv17h2123ed1a25278883Eright_kv,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree8navigate25next_kv_unchecked_dealloc17hf80e41076382e6daEnext_kv_unchecked_dealloc>_ZN5alloc11collections5btree8navigate263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$14next_unchecked28_$u7b$$u7b$closure$u7d$$u7d$17h1cbe1dcf61addf27E{{closure}}>_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$21deallocate_and_ascend17h868876787f567770Edeallocate_and_ascend>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend17hcacbb5d5c88e22f9Eascend,alloc::collections::btree::node::marker::LeafOrInternal>_ZN4core6option15Option$LT$T$GT$6as_ref17he4ed480f87ce2926Eas_ref>>>_ZN4core6option15Option$LT$T$GT$3map17h57c790eacb0cd559Emap<&core::ptr::non_null::NonNull>>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Internal>, alloc::collections::btree::node::marker::Edge>,closure-0>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend28_$u7b$$u7b$closure$u7d$$u7d$17h771652c999eb4960E{{closure}},alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree4node173Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Immut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$7into_kv17h42a13973bd3ddf8cEinto_kv,alloc::collections::btree::node::marker::LeafOrInternal>_ZN4core3ptr4read17h4d7c2720e0baaab4E_ZN4core3ptr4read17hd5618757f0a2c468E_ZN5alloc11collections5btree4node91NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$5force17hbc2629488059a94aEforce>_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17h1ca8c7be73a2ecfcEforce,alloc::collections::btree::node::marker::KV>_ZN5alloc11collections5btree8navigate235_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$14next_leaf_edge17ha77bc9b8c197ae06Enext_leaf_edge>_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$16assume_init_read17h8d8eb4c999cbb31aEassume_init_read>>>_ZN5alloc11collections5btree4node180Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7descend17h526f9636d4511d9aEdescend>_ZN5alloc11collections5btree8navigate142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$15first_leaf_edge17h6d3d924f6b11c883Efirst_leaf_edge>_ZN4core3ptr5write17h07765e9ee58183dbEwrite, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>_ZN4core6option15Option$LT$T$GT$6as_mut17hfa0abb05a3937df5Eas_mut, alloc::collections::btree::node::marker::Edge>>_ZN4core6option15Option$LT$T$GT$6unwrap17h95a2f3f60a2b6171Eunwrap<&mut alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>>_ZN4core3ptr4read17h17ed23fe7d2705c6Eread, alloc::collections::btree::node::marker::Edge>>_ZN5alloc11collections5btree3mem7replace17h627a2d5463433338Ereplace, alloc::collections::btree::node::marker::Edge>,(std::ffi::os_str::OsString, std::ffi::os_str::OsString),closure-0>_ZN5alloc11collections5btree8navigate263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$14next_unchecked17h723be944b033ea50Enext_unchecked_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17h6dce1a433a0db3f6Elen_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8right_kv17h7a745f768b6aafe2Eright_kv_ZN5alloc11collections5btree8navigate25next_kv_unchecked_dealloc17hd48b4244617fc525Enext_kv_unchecked_dealloc_ZN5alloc11collections5btree8navigate263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$14next_unchecked28_$u7b$$u7b$closure$u7d$$u7d$17h609e26f2816837bbE{{closure}}_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$21deallocate_and_ascend17h33101eac3b2ce896Edeallocate_and_ascend_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend17h6a3fc39cb2e8658cEascend_ZN4core6option15Option$LT$T$GT$6as_ref17h5fadf76375eddaedEas_ref>>_ZN4core6option15Option$LT$T$GT$3map17hea3a1dc6e1cd657cEmap<&core::ptr::non_null::NonNull>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>,closure-0>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend28_$u7b$$u7b$closure$u7d$$u7d$17h01e84b62baeb2ce5E{{closure}}_ZN5alloc11collections5btree4node173Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Immut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$7into_kv17h45be0ba8a0dcb6aeEinto_kv_ZN5alloc11collections5btree4node91NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$5force17h9bed83771c1febc6Eforce_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17hbb1830da3a961b8fEforce_ZN5alloc11collections5btree8navigate235_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$14next_leaf_edge17h76d2692e6f06fcdaEnext_leaf_edge_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$16assume_init_read17h1560211bfd2968ceEassume_init_read>>_ZN5alloc11collections5btree4node180Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7descend17h78bd402cf0add40bEdescend_ZN5alloc11collections5btree8navigate142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$15first_leaf_edge17hd83b529995ad4c63Efirst_leaf_edge_ZN4core3ptr5write17h5bb89be34b2d94bcEwrite, alloc::collections::btree::node::marker::Edge>>any_ZN45_$LT$$LP$$RP$$u20$as$u20$core..fmt..Debug$GT$3fmt17h596f925885cf75cbE_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h7c15e746fe569d7eEfmtstdsysunixprocessprocess_common_ZN86_$LT$std..sys..unix..process..process_common..ExitCode$u20$as$u20$core..fmt..Debug$GT$3fmt17h517045ca00e0943cE_ZN76_$LT$std..sys..unix..time..inner..SystemTime$u20$as$u20$core..fmt..Debug$GT$3fmt17hbeb3e89061b793b6E_ZN58_$LT$std..time..SystemTime$u20$as$u20$core..fmt..Debug$GT$3fmt17hbd56e5ad25d22582E_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17h32ca4fb5605befe4Eas_ptr_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h05485285659d3512Ederef_ZN65_$LT$alloc..string..String$u20$as$u20$core..ops..deref..Deref$GT$5deref17hdecdb17dc3993e92E_ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Debug$GT$3fmt17h6b9974d78db345f6Esys_commonos_str_bytes_ZN3std10sys_common12os_str_bytes3Buf8as_slice17h8839c7bcaea53ef3Eas_sliceffi_ZN105_$LT$std..ffi..os_str..OsString$u20$as$u20$core..ops..index..Index$LT$core..ops..range..RangeFull$GT$$GT$5index17h9efb4e0b70cd611dE_ZN70_$LT$std..ffi..os_str..OsString$u20$as$u20$core..ops..deref..Deref$GT$5deref17h409ba53d67e4392aE_ZN63_$LT$std..ffi..os_str..OsString$u20$as$u20$core..fmt..Debug$GT$3fmt17h809463678fb09164E_ZN60_$LT$std..ffi..os_str..OsStr$u20$as$u20$core..fmt..Debug$GT$3fmt17hc0b6e7dfbf0b599aE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h6a166857ededd86fEfmt_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$i32$GT$3fmt17h3bbd72793eeb8431ECString_ZN3std3ffi5c_str7CString17as_bytes_with_nul17h6a30e1acc83d7dacEas_bytes_with_nul_ZN68_$LT$std..ffi..c_str..CString$u20$as$u20$core..ops..deref..Deref$GT$5deref17ha6a98a5280c8c9c2E_ZN61_$LT$std..ffi..c_str..CString$u20$as$u20$core..fmt..Debug$GT$3fmt17hb73267ceb72f344dEnonzero_ZN67_$LT$core..num..nonzero..NonZeroU64$u20$as$u20$core..fmt..Debug$GT$3fmt17h5018e29731e6f66dE_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$u64$GT$3fmt17h1c778bf9cec9bac8E_ZN48_$LT$$u5b$T$u5d$$u20$as$u20$core..fmt..Debug$GT$3fmt17h0ba5c075a94036c1Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17he240bae7f24f11baEfmt<[u16]>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hc15480404622eb99EnextbuildersDebugList_ZN4core3fmt8builders9DebugList7entries17hd44e62f7cd43c9caEentries<&u16,core::slice::iter::Iter>mut_ptr_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h8c7443215a386f3aEoffset_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h992b405272f1cbd5Epost_inc_start_ZN41_$LT$bool$u20$as$u20$core..fmt..Debug$GT$3fmt17h2db4a89fd70e92b1E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hdc8865366e5b1300Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hb40b238a9a076e4cEfmt>_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17he9360bcacec18c5dEfmt_ZN89_$LT$std..sys..unix..process..process_common..CommandArgs$u20$as$u20$core..fmt..Debug$GT$3fmt17hc696cdd32b46151fE_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17he8563b62bee24cffEnext_ZN4core3fmt8builders9DebugList7entries17he9ea29db87d0c8d6Eentries<&std::ffi::c_str::CString,core::slice::iter::Iter>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h8b4ab245f7ee6960Eoffset_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17hb034d7a4217ee729Epost_inc_start_ZN71_$LT$std..sys..unix..os..JoinPathsError$u20$as$u20$core..fmt..Debug$GT$3fmt17hd4c28eb3dc40e456E_ZN61_$LT$std..process..ChildStdin$u20$as$u20$core..fmt..Debug$GT$3fmt17hfab96938dc531c3cE_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$u16$GT$3fmt17hc594ca93397450a8E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h21adaaaa7360c0f1E_ZN48_$LT$$u5b$T$u5d$$u20$as$u20$core..fmt..Debug$GT$3fmt17heb43354eefd22cc6Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h790007d82c3537a7Efmt<[u8]>_ZN4core3fmt8builders9DebugList7entries17hf106761f45cb16b0Eentries<&u8,core::slice::iter::Iter>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hfc5a0adfeb3c5c3eE_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h4411e8791f7ee71eEpost_inc_startfs_ZN65_$LT$std..sys..unix..fs..FileType$u20$as$u20$core..fmt..Debug$GT$3fmt17ha42586478616d88eE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha5f45f3e44e1174aEfmt_ZN52_$LT$std..path..Path$u20$as$u20$core..fmt..Debug$GT$3fmt17h068234f1c3eb7469E_ZN62_$LT$core..cell..Cell$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h3f9c7cadebdaff38Efmt_ZN58_$LT$std..io..error..Error$u20$as$u20$core..fmt..Debug$GT$3fmt17h2d93ee0d42607686E_ZN86_$LT$alloc..collections..btree..map..Iter$LT$K$C$V$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h855ef9d871a015cdEfmt>_ZN89_$LT$alloc..collections..btree..map..Range$LT$K$C$V$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hf71ce6c86568ed44Eclone>_ZN88_$LT$alloc..collections..btree..map..Iter$LT$K$C$V$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h04137a67c1e70005E_ZN4core3fmt8builders9DebugList7entries17hd08a310d5bf1cee9Eentries<(&std::ffi::os_str::OsString, &core::option::Option),alloc::collections::btree::map::Iter>>_ZN108_$LT$alloc..collections..btree..map..Iter$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hdd9b702c317034fbEnext>_ZN5alloc11collections5btree8navigate235_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$14next_leaf_edge17hc9e8eb7b2de33217Enext_leaf_edge>_ZN5alloc11collections5btree8navigate263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Immut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$14next_unchecked28_$u7b$$u7b$closure$u7d$$u7d$17he9f2e11032760e90E_ZN5alloc11collections5btree3mem7replace17hd6e824f241978605Ereplace, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>,(&std::ffi::os_str::OsString, &core::option::Option),closure-0>_ZN5alloc11collections5btree8navigate263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Immut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$14next_unchecked17hf24ba3e6eaa0c9d6E_ZN5alloc11collections5btree3map18Range$LT$K$C$V$GT$14next_unchecked17h0f4ce6a27510473aE_ZN4core3ptr5write17h57980bc27077d7d7Ewrite, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>_ZN4core6option15Option$LT$T$GT$6as_mut17h5f1c7bebaf361398Eas_mut, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>_ZN4core3ptr4read17h900665416d5b012aEread, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17h67bb6b5fe14a24eaElen,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8right_kv17h86e897fa5b8db7b7Eright_kv,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree8navigate227_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$7next_kv17hdd6be05d55214043Enext_kv>result_ZN4core6result19Result$LT$T$C$E$GT$2ok17h401a3bcfcca67da1Eok, alloc::collections::btree::node::marker::LeafOrInternal>, alloc::collections::btree::node::marker::KV>,alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>_ZN5alloc11collections5btree4node91NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$5force17h825c0b7d1c3c27c9Eforce>_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17he2249842378624e5Eforce,alloc::collections::btree::node::marker::KV>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend17h46b216bbd9605172Eascend,alloc::collections::btree::node::marker::LeafOrInternal>_ZN4core6option15Option$LT$T$GT$3map17ha8dbe4440f4094dfEmap<&core::ptr::non_null::NonNull>>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Internal>, alloc::collections::btree::node::marker::Edge>,closure-0>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend28_$u7b$$u7b$closure$u7d$$u7d$17hd92f8bb6938a1dbfE{{closure}},alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree4node180Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7descend17h23ab85f71c201f75Edescend>_ZN5alloc11collections5btree8navigate142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$15first_leaf_edge17hbc3e7aaf22e72995Efirst_leaf_edge>_ZN4core5array69_$LT$impl$u20$core..fmt..Debug$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$3fmt17hbcc538215a659c52E_ZN62_$LT$std..process..ChildStdout$u20$as$u20$core..fmt..Debug$GT$3fmt17h18c7c6d72b06267eE_ZN65_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h973744a5fd335b84Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h45efd0b6c392d23fEfmt_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17hda29d6db2478f448E_ZN62_$LT$std..process..ChildStderr$u20$as$u20$core..fmt..Debug$GT$3fmt17h34dffe9e2885653bE_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h865d1ef271301693Efmt<&std::path::Path>_ZN72_$LT$std..sys..unix..fs..FilePermissions$u20$as$u20$core..fmt..Debug$GT$3fmt17h3e9892887d3a65a6E_ZN4core3fmt3num49_$LT$impl$u20$core..fmt..Debug$u20$for$u20$u8$GT$3fmt17h2b254e41eb016d41E_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..Debug$u20$for$u20$usize$GT$3fmt17h99c8e5bf1f4ab3f3Ebacktrace_ZN64_$LT$std..backtrace..BytesOrWide$u20$as$u20$core..fmt..Debug$GT$3fmt17h7183628dcc27ad2eE_ZN4core6result19Result$LT$T$C$E$GT$2ok17h1285c8352db0e975Eok<&std::path::PathBuf,&std::io::error::Error>_ZN64_$LT$std..sys..unix..fs..ReadDir$u20$as$u20$core..fmt..Debug$GT$3fmt17h3f9442b665c99aacE_ZN98_$LT$std..ffi..os_str..OsString$u20$as$u20$core..convert..AsRef$LT$std..ffi..os_str..OsStr$GT$$GT$6as_ref17h4c42a9b8ad6cdd97Eas_refPath_ZN3std4path4Path3new17h731d6b0019f95ff3Enew_ZN62_$LT$std..path..PathBuf$u20$as$u20$core..ops..deref..Deref$GT$5deref17hfc37453e2e01cd09E_ZN48_$LT$$u5b$T$u5d$$u20$as$u20$core..fmt..Debug$GT$3fmt17he24493e99adab19bE_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h6b7312969f39ff89Enext_ZN4core3fmt8builders9DebugList7entries17h87b3e579e6a20a37Eentries<&std::ffi::os_str::OsString,core::slice::iter::Iter>non_nullNonNull_ZN4core3ptr8non_null16NonNull$LT$T$GT$13new_unchecked17h286189fc7d812d31Enew_unchecked_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h6c703dc76a2c09c2Epost_inc_start_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17haa1a6835a674692dE_ZN90_$LT$alloc..collections..btree..map..BTreeMap$LT$K$C$V$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h688f3ec8a5b2a120EBTreeMap_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$4iter17h25ad88f0a6937546E_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$9last_edge17hdd25773588738dc4Elast_edge,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree8navigate10full_range17he0bebc7a6312372eEfull_range>_ZN5alloc11collections5btree8navigate178_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Immut$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$10full_range17h264d2f3e033256f8Efull_range>_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17he0bc740eadcab781Eforce,alloc::collections::btree::node::marker::Edge>convert_ZN4core7convert3num66_$LT$impl$u20$core..convert..From$LT$u16$GT$$u20$for$u20$usize$GT$4from17h883594d9f59d5773EDebugMap_ZN4core3fmt8builders8DebugMap7entries17hb8a927fb3e5ad041Eentries<&std::ffi::os_str::OsString,&core::option::Option,alloc::collections::btree::map::Iter>>_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h163463a0b7f9ac64Efmt<&Error>_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$i64$GT$3fmt17hf1a287149cc3ee16E_ZN79_$LT$std..ffi..c_str..FromBytesWithNulErrorKind$u20$as$u20$core..fmt..Debug$GT$3fmt17hb916bf492c4b1ed0E_ZN67_$LT$std..sys..unix..fs..DirBuilder$u20$as$u20$core..fmt..Debug$GT$3fmt17hdc86af1e1ff86016Eprocess_inner_ZN87_$LT$std..sys..unix..process..process_inner..ExitStatus$u20$as$u20$core..fmt..Debug$GT$3fmt17h8db67862df60d3dcE_ZN63_$LT$std..path..PrefixComponent$u20$as$u20$core..fmt..Debug$GT$3fmt17h9d4ac798798e3edcE_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$u32$GT$3fmt17hf369148eae0a750aEnettcp_ZN63_$LT$std..net..tcp..TcpListener$u20$as$u20$core..fmt..Debug$GT$3fmt17h4fcdd0b24b22e2e6E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h68ace622b803e980Efmtmethods_ZN4core4char7methods8len_utf817ha8e303c4ed2de25cElen_utf8_ZN4core4char7methods15encode_utf8_raw17hb1b75bfd43758cd4Eencode_utf8_raw_ZN4core4char7methods22_$LT$impl$u20$char$GT$11encode_utf817h16173e2dda6d9713Eencode_utf8WriteFnFnOnce_ZN4core3ops8function6FnOnce9call_once17hb3c813ee95d4c2a7Ecall_once_ZN4core3ops8function6FnOnce9call_once17hebf897f0b9ccca73Ecall_once_ZN4core3ops8function6FnOnce9call_once17h35386c44dcaf1003Ecall_onceintrinsics_ZN4core10intrinsics19copy_nonoverlapping17h4f4d6dbf9da4e2caEcopy_nonoverlapping>_ZN4core3ptr4read17hc1cb5ecbb96f6269Eread>_ZN4core3ptr23swap_nonoverlapping_one17h9ef206dfe62b87e3Eswap_nonoverlapping_one>_ZN4core3mem4swap17h417cdb16eda472e9Eswap>_ZN4core3mem7replace17h00400202c171d4d8Ereplace>_ZN4core3mem4take17h97aa6310afb8dd87Etake>_ZN4core6option15Option$LT$T$GT$4take17hea07f4d799b2de56Etakecall_once_ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17hc390a08a63052854E{{closure}}_ZN4core3ops8function6FnOnce9call_once17hcd872121b2a36934E_ZN4core6option15Option$LT$T$GT$6unwrap17h6b3f9601145232c1Eunwrap_ZN3std9backtrace21LazilyResolvedCapture5force28_$u7b$$u7b$closure$u7d$$u7d$17hca7cbdfb2322931aE_ZN3std9backtrace7Capture7resolve17h9b94921b34863d58Eresolve_ZN3std3sys4unix5mutex5Mutex4lock17h677d04e828f5eca5EStaticMutex_ZN3std10sys_common5mutex11StaticMutex4lock17h6517db146072289aE_ZN3std10sys_common9backtrace4lock17h20f71cbd4efe1cbdE_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h9699509a75f6e451Ederef_mut_ZN94_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hde10635d852d04caEnextbacktrace_rssymbolize_ZN3std12backtrace_rs9symbolize28resolve_frame_unsynchronized17h1a2711ed2aec218aEresolve_frame_unsynchronized_ZN3std3sys4unix5mutex5Mutex6unlock17h3d77a14122603665E_ZN82_$LT$std..sys_common..mutex..StaticMutexGuard$u20$as$u20$core..ops..drop..Drop$GT$4drop17h11518f4bb69b28ceE_ZN4core3ptr61drop_in_place$LT$std..sys_common..mutex..StaticMutexGuard$GT$17h7d0ebbac33df7dcbEdrop_in_place_ZN4core3ops8function6FnOnce9call_once17h083dc8e9d6d2a79bE_ZN4core10intrinsics19copy_nonoverlapping17hc0a12683b644967fE_ZN4core3ptr4read17h9c3ebdbc1160aed2E_ZN4core3ptr23swap_nonoverlapping_one17h45bd459490d79c9aE_ZN4core3mem4swap17h907ce5577c50a14bE_ZN4core3mem7replace17h2964f3b95c8934afE_ZN4core3mem4take17hbd6f79b34797494eE_ZN4core6option15Option$LT$T$GT$4take17h3ccb9b582fb9f2b3Ecall_once_force_ZN3std4sync4once4Once15call_once_force28_$u7b$$u7b$closure$u7d$$u7d$17hbe082382a46b6f79E_ZN4core3ops8function6FnOnce9call_once17h3088da669b686f57E_ZN4core6option15Option$LT$T$GT$6unwrap17hbe66de808397520fElazyget_or_init_pin_ZN3std4lazy21SyncOnceCell$LT$T$GT$15get_or_init_pin28_$u7b$$u7b$closure$u7d$$u7d$17h875456c141c8013eE{{closure}}>,closure-0,closure-1>_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$5write17h3fb2953e5ac170daEwrite>>remutexReentrantMutex_ZN3std10sys_common7remutex23ReentrantMutex$LT$T$GT$4init17hf0d01d19dd72dd1fEinit>stderr_ZN3std2io5stdio6stderr28_$u7b$$u7b$closure$u7d$$u7d$17h780e472d670eb7dbE_ZN4core3ops8function6FnOnce9call_once17h184b1beead336030Ecall_once_ZN4core3ops8function6FnOnce9call_once17hf66926f80661c029Ecall_once_print_fmt_ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$17hb7ccc9320f187bd3E_ZN4core3ops8function6FnOnce9call_once17h3e2df7bc0f8b5fa7Ecall_once_ZN4core6option15Option$LT$T$GT$6as_ref17h92a6e047c461677cEas_ref_ZN4core3ptr67drop_in_place$LT$core..option..Option$LT$std..path..PathBuf$GT$$GT$17h462b886478cb5b7dEdrop_in_place>_ZN4core3ptr88drop_in_place$LT$std..sys_common..backtrace.._print_fmt..$u7b$$u7b$closure$u7d$$u7d$$GT$17h44f89bc8bd6e99e6Edrop_in_place_ZN4core3ptr46drop_in_place$LT$alloc..vec..Vec$LT$u8$GT$$GT$17hb2b448c4ca5b5a66Edrop_in_place>_ZN4core3ptr55drop_in_place$LT$std..sys_common..os_str_bytes..Buf$GT$17h52602b5b9326f724Edrop_in_place_ZN4core3ptr47drop_in_place$LT$std..ffi..os_str..OsString$GT$17h8775582b777e7919Edrop_in_place_ZN4core3ptr39drop_in_place$LT$std..path..PathBuf$GT$17h246d570cd9323ea9Edrop_in_placeraw_vecRawVec_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h3858ce32ffcd86d3Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h736be09e25867887Edrop_ZN4core3ptr53drop_in_place$LT$alloc..raw_vec..RawVec$LT$u8$GT$$GT$17h47d3a5488da7fd2cEdrop_in_place>_ZN4core10intrinsics19copy_nonoverlapping17h49e4c91c71a672c3E_ZN4core3ptr4read17h4f5b46a6b782685fE_ZN4core3ptr23swap_nonoverlapping_one17ha3e649fc217c8d27E_ZN4core3mem4swap17hcb79cf4e94e5840aE_ZN4core3mem7replace17hf547a3000eef7591E_ZN4core3mem4take17h0364e40cc281785bE_ZN4core6option15Option$LT$T$GT$4take17h65c77086c1705a75E_ZN3std4sync4once4Once15call_once_force28_$u7b$$u7b$closure$u7d$$u7d$17hc9b13b329d78f7a6E_ZN4core3ops8function6FnOnce9call_once17h8737e28105548ef2E_ZN4core6option15Option$LT$T$GT$6unwrap17hed27ba1484929eccE_ZN5alloc5alloc5alloc17h19a69c8929bd7f3dEGlobal_ZN5alloc5alloc6Global10alloc_impl17h8b915eaf361aea48Ealloc_impl_ZN63_$LT$alloc..alloc..Global$u20$as$u20$core..alloc..Allocator$GT$8allocate17h81e49d5e5daa574eE_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h5dd672d93588db96Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h97ee7474121bec20Ewith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h5eac6b767186abeaE_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h4b6c3ab1f44babe2Ewith_capacitybufferedbufreaderBufReader_ZN3std2io8buffered9bufreader18BufReader$LT$R$GT$13with_capacity17h693f87e561b5bfbaEwith_capacitystdin_ZN3std2io5stdio5stdin28_$u7b$$u7b$closure$u7d$$u7d$17h6cad0792c9f4cba6Eget_or_init_ZN3std4lazy21SyncOnceCell$LT$T$GT$11get_or_init28_$u7b$$u7b$closure$u7d$$u7d$17h5cd3bdb2c6dfbb68E{{closure}}>,closure-0>_ZN3std4lazy21SyncOnceCell$LT$T$GT$10initialize28_$u7b$$u7b$closure$u7d$$u7d$17h4c85d9ea67614021E{{closure}}>,closure-0,!>_ZN3std4sync5mutex14Mutex$LT$T$GT$3new17he83c5717f9580152Enew>_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$5write17h88d291fb47a76fb8Ewrite>>atomic_ZN4core4sync6atomic11atomic_load17hba261f4c97055ac7Eatomic_loadAtomicUsize_ZN4core4sync6atomic11AtomicUsize4load17hbb21dbc7a44430c4E_ZN3std4sync4once4Once12is_completed17h00b56cebb234cc49Eis_completedSyncOnceCell_ZN3std4lazy21SyncOnceCell$LT$T$GT$14is_initialized17hc9fae60d58ebf23fEis_initialized>>>_ZN3std4lazy21SyncOnceCell$LT$T$GT$3get17h8c9a7a2e5d655f64Eget>>>stdout_ZN3std2io5stdio6stdout7cleanup17h5fe2149c581ad9edE_ZN4core3ops8function6FnOnce9call_once17h97188099de37fa9aEcall_once_ZN3std3sys4unix5mutex14ReentrantMutex8try_lock17hf702310e2c50fa18Etry_lock_ZN3std10sys_common7remutex23ReentrantMutex$LT$T$GT$8try_lock17he15e673c34d73eafEtry_lock>>linewriterLineWriter_ZN3std2io8buffered10linewriter19LineWriter$LT$W$GT$13with_capacity17hc131c8a9726dd5adEwith_capacitycellBorrowRefMut_ZN4core4cell12BorrowRefMut3new17h3016c0caa48e7b91ERefCell_ZN4core4cell16RefCell$LT$T$GT$14try_borrow_mut17hd2f96bcf363cb12aEtry_borrow_mut>_ZN4core4cell16RefCell$LT$T$GT$10borrow_mut17h41246c870ea45ae7E_ZN4core10intrinsics19copy_nonoverlapping17h49166fad5620ca68Ecopy_nonoverlapping_ZN4core3ptr23swap_nonoverlapping_one17hfd89fcb089843709Eswap_nonoverlapping_one_ZN4core3mem4swap17h2b25c88f2033f52cEswap_ZN4core3mem7replace17h18738120d3399846Ereplace_ZN4core4cell13Cell$LT$T$GT$7replace17hd73b167b153663c9E_ZN4core4cell13Cell$LT$T$GT$3set17h4558b5a9544d595fEset_ZN66_$LT$core..cell..BorrowRefMut$u20$as$u20$core..ops..drop..Drop$GT$4drop17h12898b8b5afd3887E_ZN4core3ptr45drop_in_place$LT$core..cell..BorrowRefMut$GT$17h69f73eaacc0bd9ebEdrop_in_place_ZN4core3ptr121drop_in_place$LT$core..cell..RefMut$LT$std..io..buffered..linewriter..LineWriter$LT$std..io..stdio..StdoutRaw$GT$$GT$$GT$17h81c75c5dfd245924Edrop_in_place>>_ZN3std3sys4unix5mutex14ReentrantMutex6unlock17hfc8123522324262dE_ZN96_$LT$std..sys_common..remutex..ReentrantMutexGuard$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h56d65ac4b9896f6dEdrop>>_ZN4core3ptr175drop_in_place$LT$std..sys_common..remutex..ReentrantMutexGuard$LT$core..cell..RefCell$LT$std..io..buffered..linewriter..LineWriter$LT$std..io..stdio..StdoutRaw$GT$$GT$$GT$$GT$17h4406953af01b7addEdrop_in_place>>>_ZN4core6result19Result$LT$T$C$E$GT$6expect17haea4de697cc1b2a6Eexpect>,core::cell::BorrowMutError>_ZN64_$LT$std..backtrace..Backtrace$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h8c3f22304ef7addeE_ZN4core3ops8function6FnOnce9call_once17haebad90d75e5eb44E_ZN4core3ptr118drop_in_place$LT$$LT$std..backtrace..Backtrace$u20$as$u20$core..fmt..Display$GT$..fmt..$u7b$$u7b$closure$u7d$$u7d$$GT$17h0d0672cc235eaa0aE_ZN4core3ops8function6FnOnce9call_once17h6d7ef0c463804cc7E_ZN67_$LT$alloc..sync..Arc$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17ha12ce014fc9d0986Edrop>>_ZN4core4sync6atomic10atomic_sub17ha5687200033bdb67Eatomic_sub_ZN4core4sync6atomic11AtomicUsize9fetch_sub17h984c0a134b50ee82Efetch_sub_ZN4core4sync6atomic5fence17hb1449154491c2c45Efence_ZN4core3ptr46drop_in_place$LT$std..ffi..c_str..NulError$GT$17h823efb507987d9ebEdrop_in_place_ZN66_$LT$std..ffi..c_str..CString$u20$as$u20$core..ops..drop..Drop$GT$4drop17h83ca874aa491d0e9E_ZN4core3ptr45drop_in_place$LT$std..ffi..c_str..CString$GT$17heb17becc70b70274Edrop_in_place_ZN4core3ptr58drop_in_place$LT$alloc..boxed..Box$LT$$u5b$u8$u5d$$GT$$GT$17h391a266bcd794f54Edrop_in_place>_ZN5alloc5alloc8box_free17h91275f378dcd7b69Ebox_free<[u8],alloc::alloc::Global>_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hedf7bbf1db971bbeEdrop_ZN4core3ptr68drop_in_place$LT$alloc..vec..Vec$LT$std..ffi..c_str..CString$GT$$GT$17hff197aea22231149Edrop_in_place>_ZN4core3ptr74drop_in_place$LT$std..sys..unix..process..process_common..CStringArray$GT$17h8744d8758f814dd1Edrop_in_place_ZN4core3ptr55drop_in_place$LT$$u5b$std..ffi..c_str..CString$u5d$$GT$17hebcc0e57e4fc0be0Edrop_in_place<[std::ffi::c_str::CString]>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h7d779e8ebe87c5ceEcurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hb58305797b4a6fecE_ZN4core3ptr75drop_in_place$LT$alloc..raw_vec..RawVec$LT$std..ffi..c_str..CString$GT$$GT$17haccdea98a0601eccEdrop_in_place>_ZN4core3ptr60drop_in_place$LT$alloc..vec..Vec$LT$$BP$const$u20$i8$GT$$GT$17hd830a376ffa98cb3Edrop_in_place>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h3f9cabe85dbe646aEcurrent_memory<*const i8,alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h858f4254838fceffEdrop<*const i8,alloc::alloc::Global>_ZN4core3ptr67drop_in_place$LT$alloc..raw_vec..RawVec$LT$$BP$const$u20$i8$GT$$GT$17he89eb8194284e13fEdrop_in_place>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hc268e289760bc276Eas_mut_ptr<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h30abfe40aa704261Edrop<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN4core3ptr94drop_in_place$LT$$u5b$$LP$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$RP$$u5d$$GT$17hf51192d14975e815Edrop_in_place<[(std::ffi::os_str::OsString, std::ffi::os_str::OsString)]>_ZN4core3ptr84drop_in_place$LT$$LP$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$RP$$GT$17h9e1f02e8b9403982Edrop_in_place<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hf23c313e758998aaEcurrent_memory<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h0283a1c8e1300e5bE_ZN4core3ptr114drop_in_place$LT$alloc..raw_vec..RawVec$LT$$LP$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$RP$$GT$$GT$17h6ba834e6d0f1a55eEdrop_in_place>_ZN80_$LT$core..slice..sort..CopyOnDrop$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h9fce9cf69c94bd4dEdrop_ZN4core10intrinsics19copy_nonoverlapping17h5e964cbc3ce611d2Ecopy_nonoverlapping_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17ha3eeda8506bc1adfEcurrent_memory<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h34b565ee8ec61d83Edrop<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN4core3ptr75drop_in_place$LT$core..option..Option$LT$std..ffi..os_str..OsString$GT$$GT$17h1f9e0be41a064a94Edrop_in_place>_ZN4core3ptr114drop_in_place$LT$core..option..Option$LT$core..result..Result$LT$addr2line..Lines$C$gimli..read..Error$GT$$GT$$GT$17hffc5f47a0d5dfd1cEdrop_in_place>>_ZN4core3ptr144drop_in_place$LT$core..cell..UnsafeCell$LT$core..option..Option$LT$core..result..Result$LT$addr2line..Lines$C$gimli..read..Error$GT$$GT$$GT$$GT$17h89edfd56db4f9948Edrop_in_place>>>_ZN4core3ptr137drop_in_place$LT$gimli..read..dwarf..Unit$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$17h7eb29b94d3d8c842Edrop_in_place, usize>>_ZN4core3ptr181drop_in_place$LT$core..option..Option$LT$gimli..read..line..IncompleteLineProgram$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$$GT$17he6759158665d2bdfEdrop_in_place, usize>>>_ZN4core3ptr119drop_in_place$LT$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Lines$C$gimli..read..Error$GT$$GT$$GT$17hccf8402a9cfd3ffcEdrop_in_place>>_ZN4core3ptr202drop_in_place$LT$core..option..Option$LT$core..result..Result$LT$addr2line..Functions$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$GT$17hcd2cf5a5a0bb7976Edrop_in_place>, gimli::read::Error>>>_ZN4core3ptr232drop_in_place$LT$core..cell..UnsafeCell$LT$core..option..Option$LT$core..result..Result$LT$addr2line..Functions$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$GT$$GT$17h1e3a0f9f09e1c5e2Edrop_in_place>, gimli::read::Error>>>>_ZN4core3ptr207drop_in_place$LT$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Functions$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$GT$17h12768e6246cb2025Edrop_in_place>, gimli::read::Error>>>_ZN115_$LT$alloc..collections..btree..map..BTreeMap$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17h443b244d3990d022Einto_iter_ZN95_$LT$alloc..collections..btree..map..BTreeMap$LT$K$C$V$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hb112d8382d5de8cbEdrop_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$9last_edge17had1f70ace16bb7b3Elast_edge_ZN5alloc11collections5btree8navigate10full_range17h661782267f69b781Efull_range_ZN5alloc11collections5btree8navigate178_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$10full_range17h92d50f218994130cEfull_range_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17h8b4dfd4ff55d084eEforce_ZN4core3mem4drop17hc1f3bc1642593fd8Edrop>_ZN95_$LT$alloc..collections..btree..map..IntoIter$LT$K$C$V$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h6345919ea022540dE_ZN4core3mem4drop17he177d3a2fb7c8156Edrop<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>_ZN4core3ptr4read17h81d41a97eca85052Eread, alloc::collections::btree::node::marker::Edge>>>_ZN4core3ptr130drop_in_place$LT$addr2line..FrameIterState$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$17h508ff693fc5ef16cEdrop_in_place>>into_iter_ZN157_$LT$$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17ha74eb22a8321ffd4Edrop<&addr2line::InlinedFunction>,alloc::alloc::Global>_ZN4core3ptr268drop_in_place$LT$$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$$RF$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$alloc..alloc..Global$GT$$GT$17h6b9d19deec3b410bEdrop_in_place>, alloc::alloc::Global>>_ZN86_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h838ac2958e6f37a8E_ZN4core3ptr174drop_in_place$LT$alloc..vec..into_iter..IntoIter$LT$$RF$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17he47fab40c91e7debEdrop_in_place>, alloc::alloc::Global>>_ZN4core3ptr212drop_in_place$LT$core..iter..adapters..rev..Rev$LT$alloc..vec..into_iter..IntoIter$LT$$RF$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$$GT$17h68dcf0926563803dEdrop_in_place>, alloc::alloc::Global>>>_ZN4core3ptr131drop_in_place$LT$addr2line..FrameIterFrames$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$17h2f4e0ee866606b71Edrop_in_place>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h30892f5114417475Ecurrent_memory<&addr2line::InlinedFunction>,alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h787f9ba6c6eca590E_ZN4core3ptr165drop_in_place$LT$alloc..raw_vec..RawVec$LT$$RF$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17h89b572e93c0e6867Edrop_in_place>, alloc::alloc::Global>>_ZN4core3ptr91drop_in_place$LT$alloc..boxed..Box$LT$dyn$u20$core..any..Any$u2b$core..marker..Send$GT$$GT$17h7c0a5f260f2725cdEdrop_in_place>_ZN5alloc5alloc8box_free17h80d70dcf6c5f8a51Ebox_free_ZN5alloc5alloc8box_free17hc88408bd6c2fad92Ebox_free,alloc::alloc::Global>poisonFlag_ZN3std10sys_common6poison4Flag4done17hd2c01a123a21e661Edone_ZN79_$LT$std..sync..mutex..MutexGuard$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h21ee482e1cc8a6a3Edrop_ZN4core3ptr89drop_in_place$LT$std..sync..mutex..MutexGuard$LT$std..sync..barrier..BarrierState$GT$$GT$17h2e2d5bf1fcf9b6aaEdrop_in_place>panickingpanic_count_ZN3std9panicking11panic_count7is_zero17h61ecf53a52333034Eis_zero_ZN3std9panicking9panicking17h1ba24dc726ec38d8E_ZN3std6thread9panicking17hd32da2e2e891d224EMovableMutex_ZN3std10sys_common5mutex12MovableMutex10raw_unlock17h3383605f70530ef9Eraw_unlock_ZN4core4sync6atomic12atomic_store17h3978cd24bfeb2d0fEatomic_storeAtomicBool_ZN4core4sync6atomic10AtomicBool5store17h0d992061904c0185Estore_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h3aa074818d630688Eas_mut_ptr>,alloc::alloc::Global>_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h5ee57e263913def9Edrop>,alloc::alloc::Global>_ZN4core3ptr133drop_in_place$LT$$u5b$addr2line..ResUnit$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$u5d$$GT$17hdd9d79ae7fddbf80Edrop_in_place<[addr2line::ResUnit>]>_ZN4core3ptr123drop_in_place$LT$addr2line..ResUnit$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$17h2e2cfeb198ba26dcEdrop_in_place>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h078365d2367e8bb6Ecurrent_memory>,alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h7c8f09fa82c49041E_ZN4core3ptr153drop_in_place$LT$alloc..raw_vec..RawVec$LT$addr2line..ResUnit$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17h8bab7f8d6c99e939Edrop_in_place>, alloc::alloc::Global>>_ZN157_$LT$$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h787c185ee28e8da9Edrop<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN4core3ptr241drop_in_place$LT$$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$$LP$$BP$mut$u20$u8$C$unsafe$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$BP$mut$u20$u8$RP$$RP$$C$alloc..alloc..Global$GT$$GT$17h4594c5afe4479d7fEdrop_in_place>_ZN86_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h0aa2fb52c03bb38bE_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hf4121d33f63009daEcurrent_memory<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h6e7ea702a2aa475fE_ZN4core3ptr138drop_in_place$LT$alloc..raw_vec..RawVec$LT$$LP$$BP$mut$u20$u8$C$unsafe$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$BP$mut$u20$u8$RP$$RP$$GT$$GT$17h094283e2dde9c7e1Edrop_in_place>_ZN5alloc5alloc8box_free17h20e1598ccb48f60cEbox_free,alloc::alloc::Global>_ZN115_$LT$alloc..collections..btree..map..BTreeMap$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17h8c93ad3b30a7a6d3Einto_iter>_ZN95_$LT$alloc..collections..btree..map..BTreeMap$LT$K$C$V$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hb14503e106daa349Edrop>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$9last_edge17hf0540579ac7ecea5Elast_edge,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree8navigate10full_range17h2578a46e872e1ccfEfull_range>_ZN5alloc11collections5btree8navigate178_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$10full_range17he51130eb5adbf063E_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17hbf70aaddbaf47c5bEforce,alloc::collections::btree::node::marker::Edge>_ZN95_$LT$alloc..collections..btree..map..IntoIter$LT$K$C$V$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h6c9cfd926f1ff8e0E_ZN4core3ptr152drop_in_place$LT$alloc..collections..btree..map..IntoIter$LT$std..ffi..os_str..OsString$C$core..option..Option$LT$std..ffi..os_str..OsString$GT$$GT$$GT$17h4b5aaf4edca3b19aEdrop_in_place>>_ZN4core3mem4drop17h7381624913771529Edrop>>_ZN4core3ptr112drop_in_place$LT$$LP$std..ffi..os_str..OsString$C$core..option..Option$LT$std..ffi..os_str..OsString$GT$$RP$$GT$17h446ceaf5800a01fdEdrop_in_place<(std::ffi::os_str::OsString, core::option::Option)>_ZN4core3mem4drop17h40987527d9b42382Edrop<(std::ffi::os_str::OsString, core::option::Option)>_ZN4core3ptr4read17hb239c5a3d2a4b493Eread, alloc::collections::btree::node::marker::Leaf>, alloc::collections::btree::node::marker::Edge>>>_ZN4core3ptr78drop_in_place$LT$alloc..vec..Vec$LT$gimli..read..line..FileEntryFormat$GT$$GT$17h39ca1e691a933ed3Edrop_in_place>_ZN4core3ptr149drop_in_place$LT$gimli..read..line..LineProgramHeader$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$17h9c7eb42fec9aec83Edrop_in_place, usize>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h195e39640bf1c275Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hc2248ea34745acd4Edrop_ZN4core3ptr85drop_in_place$LT$alloc..raw_vec..RawVec$LT$gimli..read..line..FileEntryFormat$GT$$GT$17h314ce9bb06d16132Edrop_in_place>_ZN4core3ptr169drop_in_place$LT$alloc..vec..Vec$LT$gimli..read..unit..AttributeValue$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$$GT$17hed4ce1dacc9cbf20Edrop_in_place, usize>, alloc::alloc::Global>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h2422f73c7b0fe095Ecurrent_memory, usize>,alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h2f3d270a460acbb8Edrop, usize>,alloc::alloc::Global>_ZN4core3ptr176drop_in_place$LT$alloc..raw_vec..RawVec$LT$gimli..read..unit..AttributeValue$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$$GT$17h30fcdd414566d37dEdrop_in_place, usize>, alloc::alloc::Global>>_ZN4core3ptr164drop_in_place$LT$alloc..vec..Vec$LT$gimli..read..line..FileEntry$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$$GT$17hccc96062101254e5Edrop_in_place, usize>, alloc::alloc::Global>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h139aad2b023dc510Ecurrent_memory, usize>,alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hf8978698270ccae6Edrop, usize>,alloc::alloc::Global>_ZN4core3ptr171drop_in_place$LT$alloc..raw_vec..RawVec$LT$gimli..read..line..FileEntry$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$$GT$17hf2679124a7fdb83eEdrop_in_place, usize>, alloc::alloc::Global>>_ZN5alloc5alloc8box_free17h5d105a8126d89a19Ebox_free,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hc699de7281460321Ecurrent_memory>,alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hed182b1ae31985fbEdrop>,alloc::alloc::Global>_ZN4core3ptr161drop_in_place$LT$alloc..raw_vec..RawVec$LT$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17h5d1964af9c4bc853Edrop_in_place>, alloc::alloc::Global>>posix_spawn_ZN176_$LT$std..sys..unix..process..process_inner..$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$..posix_spawn..PosixSpawnattr$u20$as$u20$core..ops..drop..Drop$GT$4drop17h9a762a61fafb50c1E_ZN74_$LT$std..sys_common..net..LookupHost$u20$as$u20$core..ops..drop..Drop$GT$4drop17hcd092f5471c7c851E_ZN4core3ptr53drop_in_place$LT$std..sys_common..net..LookupHost$GT$17hcda48bbd81b2c6c0Edrop_in_place_ZN183_$LT$std..sys..unix..process..process_inner..$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$..posix_spawn..PosixSpawnFileActions$u20$as$u20$core..ops..drop..Drop$GT$4drop17h6d9c7d5522550aedE_ZN86_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h136571630f246ffdEdrop, alloc::alloc::Global>,alloc::alloc::Global>IntoIter_ZN5alloc3vec9into_iter21IntoIter$LT$T$C$A$GT$16as_raw_mut_slice17h5adc18a38e635259Eas_raw_mut_slice, alloc::alloc::Global>,alloc::alloc::Global>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$11offset_from17h5ebadd33b58612fbEoffset_from, alloc::alloc::Global>>_ZN103_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h7a5bfe5fd0c6a60aEsize_hint, alloc::alloc::Global>,alloc::alloc::Global>exact_sizeExactSizeIterator_ZN4core4iter6traits10exact_size17ExactSizeIterator3len17hc2c61ccb0745a152Elen, alloc::alloc::Global>, alloc::alloc::Global>>_ZN83_$LT$$RF$mut$u20$I$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17h38ec29a1323de374E_ZN4core3ptr141drop_in_place$LT$$u5b$alloc..boxed..Box$LT$dyn$u20$core..ops..function..FnOnce$LT$$LP$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$GT$$u5d$$GT$17hf6b41137627b2d75Edrop_in_place<[alloc::boxed::Box, alloc::alloc::Global>]>_ZN4core3ptr131drop_in_place$LT$alloc..boxed..Box$LT$dyn$u20$core..ops..function..FnOnce$LT$$LP$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$GT$$GT$17heb2640d2af40abcbEdrop_in_place, alloc::alloc::Global>>_ZN157_$LT$$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hb221bc7a6b39de70E_ZN4core3ptr264drop_in_place$LT$$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$alloc..boxed..Box$LT$dyn$u20$core..ops..function..FnOnce$LT$$LP$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$GT$$C$alloc..alloc..Global$GT$$GT$17h43ee806833822df1Edrop_in_place, alloc::alloc::Global>, alloc::alloc::Global>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17he7a28c50bc6b75b6Ecurrent_memory, alloc::alloc::Global>,alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h5543d17b6e577b51E_ZN4core3ptr161drop_in_place$LT$alloc..raw_vec..RawVec$LT$alloc..boxed..Box$LT$dyn$u20$core..ops..function..FnOnce$LT$$LP$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$GT$$GT$$GT$17hd83f97527ff1f3aaEdrop_in_place, alloc::alloc::Global>, alloc::alloc::Global>>_ZN4core3ptr281drop_in_place$LT$alloc..boxed..Box$LT$$u5b$$LP$gimli..read..unit..UnitOffset$C$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$RP$$u5d$$GT$$GT$17h9ee0f958beb4ab8bEdrop_in_place, addr2line::lazy::LazyCell>, gimli::read::Error>>)], alloc::alloc::Global>>_ZN4core3ptr125drop_in_place$LT$addr2line..Functions$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$17h773d134389b38ab7Edrop_in_place>>_ZN4core3ptr256drop_in_place$LT$$u5b$$LP$gimli..read..unit..UnitOffset$C$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$RP$$u5d$$GT$17h5b47b10b63febe31Edrop_in_place<[(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)]>_ZN4core3ptr201drop_in_place$LT$core..option..Option$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$GT$17hd0684a1c5732a351Edrop_in_place>, gimli::read::Error>>>_ZN4core3ptr231drop_in_place$LT$core..cell..UnsafeCell$LT$core..option..Option$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$GT$$GT$17hd2e874a0638edc43Edrop_in_place>, gimli::read::Error>>>>_ZN4core3ptr206drop_in_place$LT$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$GT$17h5356a7655230b19aEdrop_in_place>, gimli::read::Error>>>_ZN4core3ptr246drop_in_place$LT$$LP$gimli..read..unit..UnitOffset$C$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$RP$$GT$17h799d3055803f156dEdrop_in_place<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>_ZN4core3ptr166drop_in_place$LT$alloc..boxed..Box$LT$$u5b$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$u5d$$GT$$GT$17hbaa14896426716afEdrop_in_place>], alloc::alloc::Global>>_ZN4core3ptr124drop_in_place$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$17hf5a6e72144fd4275Edrop_in_place>>_ZN4core3ptr173drop_in_place$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$17he5cb17bb528db241Edrop_in_place>, gimli::read::Error>>_ZN5alloc5alloc8box_free17h21bffe149d999cbbEbox_free<[addr2line::InlinedFunction>],alloc::alloc::Global>_ZN4core3ptr89drop_in_place$LT$alloc..boxed..Box$LT$$u5b$addr2line..InlinedFunctionAddress$u5d$$GT$$GT$17h7d6e0382ec9ab8a0Edrop_in_place>_ZN5alloc5alloc8box_free17he3b9c4ead2c7edcbEbox_free<[addr2line::InlinedFunctionAddress],alloc::alloc::Global>_ZN5alloc5alloc8box_free17h16bd5a5a9a5b7c91Ebox_free<[(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)],alloc::alloc::Global>_ZN4core3ptr82drop_in_place$LT$alloc..boxed..Box$LT$$u5b$addr2line..FunctionAddress$u5d$$GT$$GT$17he46f5bfe45bf58c0Edrop_in_place>_ZN5alloc5alloc8box_free17h4ab31927e75f9ca7Ebox_free<[addr2line::FunctionAddress],alloc::alloc::Global>_ZN4core3ptr42drop_in_place$LT$alloc..string..String$GT$17h0675149754e6c17dEdrop_in_place_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hf704dfd4686d517dEas_mut_ptr<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hc369f456f206e965Edrop<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h3267dfc4ee9f7689Ecurrent_memory<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h7f55723aa111cf8cE_ZN4core3ptr276drop_in_place$LT$alloc..raw_vec..RawVec$LT$$LP$gimli..read..unit..UnitOffset$C$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$RP$$GT$$GT$17he8524b48d63403afEdrop_in_place, addr2line::lazy::LazyCell>, gimli::read::Error>>), alloc::alloc::Global>>_ZN70_$LT$std..sys..unix..fd..FileDesc$u20$as$u20$core..ops..drop..Drop$GT$4drop17h357207d1564e3792E_ZN4core3ptr49drop_in_place$LT$std..sys..unix..fd..FileDesc$GT$17h0d1cd61888b2ad31Edrop_in_place_ZN4core3ptr45drop_in_place$LT$std..sys..unix..fs..File$GT$17h67eb5ddda44dc45fEdrop_in_place_ZN56_$LT$std..io..Guard$u20$as$u20$core..ops..drop..Drop$GT$4drop17h1c463ae1d2c2e371E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7set_len17he2948816c06ea4abEset_len_ZN5alloc3vec9into_iter21IntoIter$LT$T$C$A$GT$16as_raw_mut_slice17h18dcae580ba7d1b8Eas_raw_mut_slice<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN86_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h877f3e4236060102E_ZN4core3ptr123drop_in_place$LT$alloc..vec..into_iter..IntoIter$LT$$LP$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$RP$$GT$$GT$17h8ba264aa9d841d7aEdrop_in_place>_ZN4core3ptr44drop_in_place$LT$std..sys..unix..os..Env$GT$17h24f8a5b23bf84c21Edrop_in_place_ZN157_$LT$$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17he7756a47f92a13a4E_ZN4core3ptr217drop_in_place$LT$$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$$LP$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$RP$$C$alloc..alloc..Global$GT$$GT$17hb462fa2f7e008f90Edrop_in_place>_ZN67_$LT$alloc..sync..Arc$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h5dd4367265c57a07Edrop_ZN4core3ptr77drop_in_place$LT$alloc..sync..Arc$LT$std..sys..unix..fs..InnerReadDir$GT$$GT$17h07adfa0a451a3e51Edrop_in_place>_ZN4core3ptr48drop_in_place$LT$std..sys..unix..fs..ReadDir$GT$17heca7517ffa4c489aEdrop_in_place_ZN4core3ptr49drop_in_place$LT$std..sys..unix..fs..DirEntry$GT$17hb5551fd4c683015eEdrop_in_place_ZN4core3ptr73drop_in_place$LT$core..option..Option$LT$std..process..ChildStdin$GT$$GT$17haf92be5563653913Edrop_in_place>_ZN4core3ptr51drop_in_place$LT$std..sys..unix..pipe..AnonPipe$GT$17he90be104a7aa1b07Edrop_in_place_ZN4core3ptr45drop_in_place$LT$std..process..ChildStdin$GT$17hfec9fca9fa5d4bf7Edrop_in_place_ZN4core3ptr74drop_in_place$LT$core..option..Option$LT$std..process..ChildStdout$GT$$GT$17h25ca02a8a99f3764Edrop_in_place>_ZN4core3ptr46drop_in_place$LT$std..process..ChildStdout$GT$17h485d1c707bbc78acEdrop_in_place_ZN4core3ptr74drop_in_place$LT$core..option..Option$LT$std..process..ChildStderr$GT$$GT$17h04d6cce8c9be575bEdrop_in_place>_ZN4core3ptr46drop_in_place$LT$std..process..ChildStderr$GT$17hca80f175796706a3Edrop_in_place_ZN67_$LT$alloc..sync..Arc$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h0e333804bfb70509Edrop_ZN4core3ptr63drop_in_place$LT$alloc..sync..Arc$LT$std..thread..Inner$GT$$GT$17h2addbef43050f61bEdrop_in_place>_ZN4core3ptr41drop_in_place$LT$std..io..error..Repr$GT$17h27e65ad25f2015daEdrop_in_place_ZN4core3ptr68drop_in_place$LT$alloc..boxed..Box$LT$std..io..error..Custom$GT$$GT$17h019f60eace3e5630Edrop_in_place>_ZN4core3ptr117drop_in_place$LT$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$17h7f758c3fbd9ff4c1Edrop_in_place>_ZN4core3ptr43drop_in_place$LT$std..io..error..Custom$GT$17h58e53b3cfbdf7966Edrop_in_place_ZN5alloc5alloc8box_free17hbc2f2b212c2135bfEbox_free_ZN5alloc5alloc8box_free17h7235a2c09fe33bafEbox_free_ZN4core3ptr74drop_in_place$LT$alloc..boxed..Box$LT$$u5b$addr2line..LineRow$u5d$$GT$$GT$17hc9334f38ea82efacEdrop_in_place>_ZN5alloc5alloc8box_free17h7cc463347f6572bbEbox_free<[addr2line::LineRow],alloc::alloc::Global>_ZN65_$LT$std..backtrace_rs..Bomb$u20$as$u20$core..ops..drop..Drop$GT$4drop17hc7b0f325308f17d2E_ZN4core3ptr68drop_in_place$LT$core..option..Option$LT$std..thread..Thread$GT$$GT$17h8e359a4be6769f52Edrop_in_place>_ZN4core3ptr98drop_in_place$LT$core..cell..UnsafeCell$LT$core..option..Option$LT$std..thread..Thread$GT$$GT$$GT$17h6f9a8b7e72ff9dceEdrop_in_place>>_ZN4core3ptr92drop_in_place$LT$core..cell..Cell$LT$core..option..Option$LT$std..thread..Thread$GT$$GT$$GT$17hc03367faf176717cEdrop_in_place>>_ZN4core3ptr40drop_in_place$LT$std..thread..Thread$GT$17h3b0963431274f289Edrop_in_place_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17ha5a7aab7928be8f2Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17he2dab13ad008e033Edrop_ZN4core3ptr53drop_in_place$LT$alloc..raw_vec..RawVec$LT$i8$GT$$GT$17he0a2f1191b95769eEdrop_in_place>_ZN79_$LT$std..sync..mutex..MutexGuard$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h7eded5729029f932Edrop>_ZN4core3ptr128drop_in_place$LT$std..sync..mutex..MutexGuard$LT$std..io..buffered..bufreader..BufReader$LT$std..io..stdio..StdinRaw$GT$$GT$$GT$17haeee75c27f20757dEdrop_in_place>>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hb431d94e8072117aEas_mut_ptr_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h6196c34edc7dd574Edrop_ZN4core3ptr75drop_in_place$LT$alloc..vec..Vec$LT$std..backtrace..BacktraceSymbol$GT$$GT$17hd7ca4e2361e0a431Edrop_in_place>_ZN4core3ptr62drop_in_place$LT$$u5b$std..backtrace..BacktraceSymbol$u5d$$GT$17h10604cadb813429aEdrop_in_place<[std::backtrace::BacktraceSymbol]>_ZN4core3ptr74drop_in_place$LT$core..option..Option$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h6409c0f53cd5a474Edrop_in_place>>_ZN4core3ptr52drop_in_place$LT$std..backtrace..BacktraceSymbol$GT$17hfdac04cd2f591bf3Edrop_in_place_ZN4core3ptr48drop_in_place$LT$std..backtrace..BytesOrWide$GT$17h8d2514c7f0fd97d3Edrop_in_place_ZN4core3ptr76drop_in_place$LT$core..option..Option$LT$std..backtrace..BytesOrWide$GT$$GT$17h85c1c547b7ba1da6Edrop_in_place>_ZN4core3ptr47drop_in_place$LT$alloc..vec..Vec$LT$u16$GT$$GT$17he8743a363379ae2cEdrop_in_place>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hf5650a597a3a0b14Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hcad2f5734a24fdc9Edrop_ZN4core3ptr54drop_in_place$LT$alloc..raw_vec..RawVec$LT$u16$GT$$GT$17h5c854febe66a8d1bEdrop_in_place>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hc08e00686c801048Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h6f2cc9cc54ecc06eE_ZN4core3ptr82drop_in_place$LT$alloc..raw_vec..RawVec$LT$std..backtrace..BacktraceSymbol$GT$$GT$17h1512eaa7d4b6a538Edrop_in_place>_ZN4core3ptr87drop_in_place$LT$alloc..vec..Vec$LT$gimli..read..abbrev..AttributeSpecification$GT$$GT$17hd4582065c5b6ec7fEdrop_in_place>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hbdc8c8de875d2066Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h373abeda0fc2a554Edrop_ZN4core3ptr94drop_in_place$LT$alloc..raw_vec..RawVec$LT$gimli..read..abbrev..AttributeSpecification$GT$$GT$17h9b12c819fee3f0c2Edrop_in_place>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h4681fb34cb467f58Eas_mut_ptr_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17ha69817de94a79cd9Edrop_ZN4core3ptr77drop_in_place$LT$alloc..vec..Vec$LT$gimli..read..abbrev..Abbreviation$GT$$GT$17h1e8e15d57709b2d9Edrop_in_place>_ZN4core3ptr64drop_in_place$LT$$u5b$gimli..read..abbrev..Abbreviation$u5d$$GT$17he822162354b01045Edrop_in_place<[gimli::read::abbrev::Abbreviation]>_ZN4core3ptr52drop_in_place$LT$gimli..read..abbrev..Attributes$GT$17h320625860ec3cf83Edrop_in_place_ZN4core3ptr54drop_in_place$LT$gimli..read..abbrev..Abbreviation$GT$17h7fbfef6ce24ed58dEdrop_in_place_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17he92f9fe805a6aa4eEcurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hfe04a209e9174d23E_ZN4core3ptr84drop_in_place$LT$alloc..raw_vec..RawVec$LT$gimli..read..abbrev..Abbreviation$GT$$GT$17h17c8ce08746e7380Edrop_in_place>_ZN115_$LT$alloc..collections..btree..map..BTreeMap$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17h1eef24758234e6efEinto_iter_ZN95_$LT$alloc..collections..btree..map..BTreeMap$LT$K$C$V$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h2c8302fbb0300bfeEdrop_ZN4core3ptr108drop_in_place$LT$alloc..collections..btree..map..BTreeMap$LT$u64$C$gimli..read..abbrev..Abbreviation$GT$$GT$17h15ab908683736f3fEdrop_in_place>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$9last_edge17hb59ad1f3716e5281Elast_edge_ZN5alloc11collections5btree8navigate10full_range17h16c3a2fe27f18b90Efull_range_ZN5alloc11collections5btree8navigate178_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Dying$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$10full_range17h4e30609c266de31eEfull_range_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17hb4d634756fc3f801Eforce_ZN95_$LT$alloc..collections..btree..map..IntoIter$LT$K$C$V$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h92a688fae86f1d74E_ZN4core3ptr108drop_in_place$LT$alloc..collections..btree..map..IntoIter$LT$u64$C$gimli..read..abbrev..Abbreviation$GT$$GT$17h8d529e080d347d4aEdrop_in_place>_ZN4core3mem4drop17he329240682a2f465Edrop>_ZN4core3ptr4read17h1a0c62b8c423c328Eread, alloc::collections::btree::node::marker::Edge>>>_ZN4core3ptr68drop_in_place$LT$$LP$u64$C$gimli..read..abbrev..Abbreviation$RP$$GT$17h2613876b100b88a1Edrop_in_place<(u64, gimli::read::abbrev::Abbreviation)>_ZN4core3mem4drop17h2ab0dd36c9741b66Edrop<(u64, gimli::read::abbrev::Abbreviation)>_ZN67_$LT$alloc..sync..Arc$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h669b5a971dd5f2e7Edrop_ZN4core3ptr77drop_in_place$LT$alloc..sync..Arc$LT$std..sync..mpsc..blocking..Inner$GT$$GT$17h66ff02e56e91be32Edrop_in_place>_ZN81_$LT$std..sys..unix..mutex..PthreadMutexAttr$u20$as$u20$core..ops..drop..Drop$GT$4drop17hfa1b517dc5b19b48E_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$13guaranteed_eq17h9f35349ad415fa52Eguaranteed_eq_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$7is_null17h7fab4d34b8956c6aEis_nullstack_overflow_ZN3std3sys4unix14stack_overflow3imp12drop_handler17h4fc66c016f3bff91Edrop_handler_ZN81_$LT$std..sys..unix..stack_overflow..Handler$u20$as$u20$core..ops..drop..Drop$GT$4drop17h4642f0ecb9c1c991E_ZN3std3sys4unix2os9page_size17h54d9db99b544fdbbEpage_size_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hfd5e0fef3325e1a1Eoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3sub17h97c9228701a0d79aEsub_ZN4core3ptr342drop_in_place$LT$$LT$alloc..vec..Vec$LT$std..ffi..os_str..OsString$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$std..ffi..os_str..OsString$C$core..iter..adapters..map..Map$LT$core..ops..range..Range$LT$isize$GT$$C$std..sys..unix..args..imp..clone..$u7b$$u7b$closure$u7d$$u7d$$GT$$GT$$GT$..spec_extend..$u7b$$u7b$closure$u7d$$u7d$$GT$17h1608291bceb2acefE_ZN4core3ptr462drop_in_place$LT$core..iter..traits..iterator..Iterator..for_each..call$LT$std..ffi..os_str..OsString$C$$LT$alloc..vec..Vec$LT$std..ffi..os_str..OsString$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$std..ffi..os_str..OsString$C$core..iter..adapters..map..Map$LT$core..ops..range..Range$LT$isize$GT$$C$std..sys..unix..args..imp..clone..$u7b$$u7b$closure$u7d$$u7d$$GT$$GT$$GT$..spec_extend..$u7b$$u7b$closure$u7d$$u7d$$GT$..$u7b$$u7b$closure$u7d$$u7d$$GT$17h81ec390a442e5acbEset_len_on_drop_ZN83_$LT$alloc..vec..set_len_on_drop..SetLenOnDrop$u20$as$u20$core..ops..drop..Drop$GT$4drop17h034683b2613be5c3E_ZN4core3ptr62drop_in_place$LT$alloc..vec..set_len_on_drop..SetLenOnDrop$GT$17h6c212a60dba0efc4Edrop_in_place_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hb8409fce3b73b1deEcurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hf9bac8730024a439Edrop_ZN4core3ptr71drop_in_place$LT$alloc..raw_vec..RawVec$LT$addr2line..UnitRange$GT$$GT$17h62f6b8369e5dd4e6Edrop_in_place>_ZN85_$LT$std..backtrace_rs..print..BacktraceFrameFmt$u20$as$u20$core..ops..drop..Drop$GT$4drop17h86ab1376acc9c0b5E_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hd807b826b83ea5e5Eas_mut_ptr_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h77484945f14ad40aEdrop_ZN4core3ptr52drop_in_place$LT$$u5b$alloc..string..String$u5d$$GT$17hbc7b1a4367ca6139Edrop_in_place<[alloc::string::String]>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h6abd9ffebde5c103Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hfe00a40802db83d5E_ZN4core3ptr72drop_in_place$LT$alloc..raw_vec..RawVec$LT$alloc..string..String$GT$$GT$17hd9be0332e1b389c3Edrop_in_place>_ZN4core3ptr95drop_in_place$LT$alloc..vec..Vec$LT$std..backtrace_rs..symbolize..gimli..LibrarySegment$GT$$GT$17hee629711fa7c1529Edrop_in_place>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h4e29c87bf9bfcf94Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h25848c834ccb69b8Edrop_ZN4core3ptr102drop_in_place$LT$alloc..raw_vec..RawVec$LT$std..backtrace_rs..symbolize..gimli..LibrarySegment$GT$$GT$17hd17867fc072e773eEdrop_in_place>_ZN4core3ptr64drop_in_place$LT$alloc..vec..Vec$LT$addr2line..UnitRange$GT$$GT$17hbc5e45b998ea2e0eEdrop_in_place>_ZN4core3ptr123drop_in_place$LT$addr2line..Context$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$17h2f30f62d91324fbfEdrop_in_place>>_ZN4core3ptr65drop_in_place$LT$std..backtrace_rs..symbolize..gimli..Context$GT$17haad15ffe89204522Edrop_in_place_ZN4core3ptr95drop_in_place$LT$alloc..vec..Vec$LT$std..backtrace_rs..symbolize..gimli..elf..ParsedSym$GT$$GT$17hba6390e93779c709Edrop_in_place>_ZN4core3ptr69drop_in_place$LT$std..backtrace_rs..symbolize..gimli..elf..Object$GT$17h9ed496c2cf216536Edrop_in_place_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h542097f3d29c462aEcurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hce1d8e39fe414a3eEdrop_ZN4core3ptr102drop_in_place$LT$alloc..raw_vec..RawVec$LT$std..backtrace_rs..symbolize..gimli..elf..ParsedSym$GT$$GT$17h7729aba189281c4bEdrop_in_place>gimlimmap_ZN89_$LT$std..backtrace_rs..symbolize..gimli..mmap..Mmap$u20$as$u20$core..ops..drop..Drop$GT$4drop17h8fd12e07db786580E_ZN4core3ptr68drop_in_place$LT$std..backtrace_rs..symbolize..gimli..mmap..Mmap$GT$17hfaf7d00d99eba09fEdrop_in_place_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hf588006bf347bae0Eas_mut_ptr,alloc::alloc::Global>_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h3a3b09bdbf07c8bcEdrop,alloc::alloc::Global>_ZN4core3ptr69drop_in_place$LT$alloc..vec..Vec$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h265113425f4289d2Edrop_in_place, alloc::alloc::Global>>_ZN4core3ptr99drop_in_place$LT$core..cell..UnsafeCell$LT$alloc..vec..Vec$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$$GT$17he89af1bbb3c82ca1Edrop_in_place, alloc::alloc::Global>>>_ZN4core3ptr70drop_in_place$LT$std..backtrace_rs..symbolize..gimli..stash..Stash$GT$17h48439ed87718bc64Edrop_in_place_ZN4core3ptr56drop_in_place$LT$$u5b$alloc..vec..Vec$LT$u8$GT$$u5d$$GT$17h0961f32cdcdadbe5Edrop_in_place<[alloc::vec::Vec]>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hbc36dd3b7f76aa12Ecurrent_memory,alloc::alloc::Global>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h1ffb333a00e639cdE_ZN4core3ptr76drop_in_place$LT$alloc..raw_vec..RawVec$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h3d40db69665e4cf2Edrop_in_place, alloc::alloc::Global>>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hc041b29ab34b2f08Eas_mut_ptr_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17he0d77d284a31c4e6Edrop_ZN4core3ptr54drop_in_place$LT$$u5b$addr2line..LineSequence$u5d$$GT$17h1641a038cf0ce221Edrop_in_place<[addr2line::LineSequence]>_ZN4core3ptr44drop_in_place$LT$addr2line..LineSequence$GT$17h0e0e7cb6191b9ad7Edrop_in_place_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h8d75ff9b54b5f637Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h19fbae33fc323653E_ZN4core3ptr74drop_in_place$LT$alloc..raw_vec..RawVec$LT$addr2line..LineSequence$GT$$GT$17hc2ae6748f188682cEdrop_in_place>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h03292b5207b0e931Eas_mut_ptr_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h960083fa865fc1f8Edrop_ZN4core3ptr57drop_in_place$LT$$u5b$std..ffi..os_str..OsString$u5d$$GT$17ha09cc55576ccc599Edrop_in_place<[std::ffi::os_str::OsString]>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h6828d997e600f557Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h1715db1cea11e5afE_ZN4core3ptr77drop_in_place$LT$alloc..raw_vec..RawVec$LT$std..ffi..os_str..OsString$GT$$GT$17h80e003115d2424e1Edrop_in_place>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h80a6f7c3c7d847daEcurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h58cc04cd4f0f9e32Edrop_ZN4core3ptr77drop_in_place$LT$alloc..raw_vec..RawVec$LT$std..net..addr..SocketAddr$GT$$GT$17h58ec39bef3293eaeEdrop_in_place>_ZN4core3ptr70drop_in_place$LT$core..option..Option$LT$alloc..string..String$GT$$GT$17h28931f196b1fc06eEdrop_in_place>_ZN4core3ptr72drop_in_place$LT$std..sys..unix..process..process_common..ChildStdio$GT$17h105dfd2c3d4cab32Edrop_in_place_ZN4core3ptr79drop_in_place$LT$core..option..Option$LT$std..sys..unix..pipe..AnonPipe$GT$$GT$17h01479a2be6f99893Edrop_in_place>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hdc2809be969f0e06Ecurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17ha2282568fad83005Edrop_ZN4core3ptr80drop_in_place$LT$alloc..raw_vec..RawVec$LT$alloc..slice..merge_sort..Run$GT$$GT$17h2c719c7c1b1c4008Edrop_in_place>_ZN5alloc5alloc8box_free17h6d852b3700ce0f3cEbox_free_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hb749bdc8011398b8Eas_mut_ptr_ZN4core3ptr42drop_in_place$LT$std..io..error..Error$GT$17h15987a7935718a31Edrop_in_place_ZN5alloc5alloc8box_free17hc5d3a6b67c102467Ebox_free_ZN4core3ptr129drop_in_place$LT$core..option..Option$LT$alloc..sync..Arc$LT$std..sync..mutex..Mutex$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$$GT$$GT$17hbb6b827260edcffaEdrop_in_place>>>>_ZN4core3ptr101drop_in_place$LT$alloc..sync..Arc$LT$std..sync..mutex..Mutex$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$$GT$17h3aaab528019987a8Edrop_in_place>>>_ZN78_$LT$std..sys_common..mutex..MovableMutex$u20$as$u20$core..ops..drop..Drop$GT$4drop17h0f87809c3123a58fE_ZN4core3ptr57drop_in_place$LT$std..sys_common..mutex..MovableMutex$GT$17h93508b2610825f10Edrop_in_place_ZN3std3sys4unix5mutex5Mutex7destroy17ha732725af41f9ab9Edestroy_ZN4core3ptr74drop_in_place$LT$alloc..boxed..Box$LT$std..sys..unix..mutex..Mutex$GT$$GT$17h2d7ea519b53dc74aEdrop_in_place>_ZN4core3ptr77drop_in_place$LT$alloc..boxed..Box$LT$$u5b$alloc..string..String$u5d$$GT$$GT$17h989955ed6c964202Edrop_in_place>_ZN4core3ptr37drop_in_place$LT$addr2line..Lines$GT$17h23ed408ceeebb14dEdrop_in_place_ZN5alloc5alloc8box_free17hddcc79149ab93716Ebox_free<[alloc::string::String],alloc::alloc::Global>_ZN4core3ptr79drop_in_place$LT$alloc..boxed..Box$LT$$u5b$addr2line..LineSequence$u5d$$GT$$GT$17h0caf382d8c44578bEdrop_in_place>_ZN5alloc5alloc8box_free17hc57b393286d93c01Ebox_free<[addr2line::LineSequence],alloc::alloc::Global>_ZN4core3ptr81drop_in_place$LT$core..result..Result$LT$$LP$$RP$$C$std..io..error..Error$GT$$GT$17hd6aeeaae776db9b8Edrop_in_place>_ZN4core3ptr61drop_in_place$LT$std..sys_common..thread_info..ThreadInfo$GT$17h79a1c3cacda808a4Edrop_in_placebufwriterflush_buf_ZN111_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$..flush_buf..BufGuard$u20$as$u20$core..ops..drop..Drop$GT$4drop17h5bcdd22873736b13E_ZN5alloc3vec16Vec$LT$T$C$A$GT$5drain17h3c502a02922f82efEdrain>RangeBounds_ZN4core3ops5range11RangeBounds10assert_len17h8e0f84a495b0bb0cEassert_len,usize>drain_ZN150_$LT$$LT$alloc..vec..drain..Drain$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hf8bb20c0238dab68E_ZN4core3ptr149drop_in_place$LT$$LT$alloc..vec..drain..Drain$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$u8$C$alloc..alloc..Global$GT$$GT$17hc59ac506a2007335Edrop_in_place>_ZN79_$LT$alloc..vec..drain..Drain$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h4308cdeb83be5c20E_ZN4core3ptr55drop_in_place$LT$alloc..vec..drain..Drain$LT$u8$GT$$GT$17h99836bad70bbef5cEdrop_in_place>_ZN4core10intrinsics4copy17h8e73ac4af3246c4dEcopy_ZN4core6option15Option$LT$T$GT$7is_some17h979560667e19d474Eis_some_ZN90_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hc79719707839d233Edrop_ZN4core3ptr93drop_in_place$LT$std..io..buffered..bufwriter..BufWriter$LT$std..io..stdio..StdoutRaw$GT$$GT$17hcb58a8dd1f244cafEdrop_in_place>_ZN55_$LT$$RF$str$u20$as$u20$core..str..pattern..Pattern$GT$13into_searcher17hef6a362da7da9439Einto_searcherPattern_ZN4core3str7pattern7Pattern15is_contained_in17h147602004301943aEis_contained_in<&str>_ZN80_$LT$core..str..pattern..StrSearcher$u20$as$u20$core..str..pattern..Searcher$GT$10next_match17h55f07a3d0d0663b5ETwoWaySearcher_ZN4core3str7pattern14TwoWaySearcher4next17hba5723417fdf3d6fEnext_ZN4core3str7pattern14TwoWaySearcher16byteset_contains17h4607a60b363739c2Ebyteset_contains_ZN4core3cmp5impls57_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$2lt17h3d6b8eae00df6b0eE_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17h40fede520ca56e4dEnext_ZN4core3num23_$LT$impl$u20$usize$GT$13unchecked_add17h3e5d5637a609f3aeEunchecked_add_ZN49_$LT$usize$u20$as$u20$core..iter..range..Step$GT$17forward_unchecked17h8eeb84e4142205c4Eforward_unchecked_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17ha904a30359079c4aE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17hdd17fea85c26cebeEget_ZN4core4iter5range116_$LT$impl$u20$core..iter..traits..double_ended..DoubleEndedIterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$9next_back17h85252e3fda1501f7Enext_back_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h7784e89ccc34a6b9Enext>_ZN4core3num23_$LT$impl$u20$usize$GT$13unchecked_sub17h3f334625cc1cd6afEunchecked_sub_ZN49_$LT$usize$u20$as$u20$core..iter..range..Step$GT$18backward_unchecked17hc213aa8dba6e586bEbackward_unchecked_ZN80_$LT$core..str..pattern..StrSearcher$u20$as$u20$core..str..pattern..Searcher$GT$4next17h31bd05ff039cb2a6Enext_ZN4core5slice4iter13Iter$LT$T$GT$3new17hbb5a751fc778c019Enew_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17he7351899a51a491fE_ZN4core3str21_$LT$impl$u20$str$GT$5chars17h4b1313cdffaddab1Echars_ZN4core3str21_$LT$impl$u20$str$GT$16is_char_boundary17haa9571033010a3a8Eis_char_boundary_ZN4core3str6traits112_$LT$impl$u20$core..slice..index..SliceIndex$LT$str$GT$$u20$for$u20$core..ops..range..RangeFrom$LT$usize$GT$$GT$3get17he79c012145239a55E_ZN4core3str6traits112_$LT$impl$u20$core..slice..index..SliceIndex$LT$str$GT$$u20$for$u20$core..ops..range..RangeFrom$LT$usize$GT$$GT$5index17h46aab3b096179a72E_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17h5eea12f3df50cb0dEindex>validations_ZN4core3str11validations15next_code_point17h015f5cefea36fc23Enext_code_point>_ZN81_$LT$core..str..iter..Chars$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hfd848827f3ee829eE_ZN4core3str11validations11unwrap_or_017h0716beeff08d3060Eunwrap_or_0_ZN4core3str11validations18utf8_acc_cont_byte17h7f2e515d032edf12Eutf8_acc_cont_byte_ZN4core4char7methods22_$LT$impl$u20$char$GT$8len_utf817h5082aaf3d0dc0e50E_ZN4core3num23_$LT$impl$u20$usize$GT$31one_less_than_next_power_of_two17h2f082b8ce6a3978eEone_less_than_next_power_of_two_ZN4core3num23_$LT$impl$u20$usize$GT$17next_power_of_two17h7e1926c36c0eb4c3Ebreak_patterns_ZN4core5slice4sort14break_patterns28_$u7b$$u7b$closure$u7d$$u7d$17h00f7b66e82f212b1E{{closure}}_ZN4core5slice4sort14break_patterns28_$u7b$$u7b$closure$u7d$$u7d$17hc97f03b02a98d566E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4swap17h66bdb0a9e086ae50Eswap_ZN4core3ptr4swap17hd6a5a05d388e746fE_ZN4core10intrinsics4copy17ha7d80e7d8d0e09d6Ecopy_ZN4core5slice4sort10shift_head17h0ceadfcc5e55f9bbEshift_head_ZN4core3ptr109drop_in_place$LT$core..slice..sort..CopyOnDrop$LT$std..backtrace_rs..symbolize..gimli..elf..ParsedSym$GT$$GT$17hf88589dede443004Edrop_in_place>_ZN4core3cmp5impls55_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$u64$GT$2lt17hf9ce31f2ba1e8e00Esort_unstable_by_key_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20sort_unstable_by_key28_$u7b$$u7b$closure$u7d$$u7d$17hc5ebc4f64a54feefE{{closure}}_ZN4core5slice4sort10shift_tail17ha5f8656e5e8744e6Eshift_tail_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h505a32eea04903d5Eoffset_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17hd09ece0f91629a34Eadd_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17hd962c10480161921Eget_unchecked_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$13get_unchecked17hcbfdc19b2da4aea8Eget_unchecked_ZN4core3ptr4read17h12c61ddf04ccf95fEread_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h70e26a2fb32e6ed9Eget_unchecked_mut_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17hc0ff5723c036dbe6E_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h42430571e9836ee0Eindex_mut_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hd3bc92821e2bd88cEindex_mut>_ZN4core5slice4sort12choose_pivot17h0e62fe7c9eaa0eecEchoose_pivotchoose_pivot_ZN4core5slice4sort12choose_pivot28_$u7b$$u7b$closure$u7d$$u7d$17had7a4767b35961dcE{{closure}}_ZN4core5slice4sort12choose_pivot28_$u7b$$u7b$closure$u7d$$u7d$17h665ad88c2fa1a87cE_ZN4core5slice4sort12choose_pivot28_$u7b$$u7b$closure$u7d$$u7d$17hf04e24f1e45fab9bE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$7reverse17h3a91fcd3def3f31aEreverse_ZN4core5slice4sort15partition_equal17h94568b0f5b3d6d76Epartition_equal_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h140fafdf2d91ec82E_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h96894cfa5029365eE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$22split_at_mut_unchecked17h2d8faed3e1cf7d8cEsplit_at_mut_unchecked_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$12split_at_mut17h8cee9b855c07c571Esplit_at_mut_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17hc87ce71b030ded06E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$17get_unchecked_mut17hce832bb4b1e63654Eget_unchecked_mut_ZN4core5slice4sort9partition17h72411e4c49b0a4ecEpartition_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h8d4042098823c51cE_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h329c6e364b878d50Eindex_mut>_ZN4core5slice4sort19partition_in_blocks17hef57d96ea8ed68bbEpartition_in_blockspartition_in_blocks_ZN4core5slice4sort19partition_in_blocks5width17h0298ee6693302d13Ewidth_ZN4core5slice4sort19partition_in_blocks5width17hea54ac6a15472fafEwidth_ZN4core3cmp6min_by17h9f77d028bc16a558Emin_by core::cmp::Ordering>_ZN4core3cmp3Ord3min17hb9ea1a64a04f1491Emin_ZN4core3cmp3min17h45b7adbe29814db2E_ZN4core5slice4sort14insertion_sort17h53834aaa08be7c82Eheapsort_ZN4core5slice4sort8heapsort28_$u7b$$u7b$closure$u7d$$u7d$17h948437937b3959f5E{{closure}}_ZN4core3ops8function5impls79_$LT$impl$u20$core..ops..function..FnMut$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$8call_mut17hb6f0f4e65f7ed66aEcall_mut<(&std::backtrace_rs::symbolize::gimli::elf::ParsedSym, &std::backtrace_rs::symbolize::gimli::elf::ParsedSym),closure-0>core_archx86xsave_ZN52_$LT$$BP$mut$u20$T$u20$as$u20$core..fmt..Pointer$GT$3fmt17h3ccf37f1de9c3a5cEfmt_ZN54_$LT$$BP$const$u20$T$u20$as$u20$core..fmt..Pointer$GT$3fmt17h05fa5a0b0964a979E_ZN4core6option15Option$LT$T$GT$7is_some17h757a42b78e0ba603Eis_some_ZN4core6option15Option$LT$T$GT$7is_none17hca4c9bdc9753270eEis_none_ZN4core3fmt5Write10write_char17h635672d1b28f420cEwrite_char>_ZN4core3fmt5Write10write_char17hbc9049995716c0f4Ewrite_char>>write_fmt_ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17h61f90d8dd0038339Ewrite_str>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17hc4bf01c34f3dac1fEtry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17hbe593f8268955e0dE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17hc914082ac2171f4eE_ZN5alloc3vec16Vec$LT$T$C$A$GT$15append_elements17h199f33a97ec7c0a5Eappend_elementsspec_extend_ZN132_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$$RF$T$C$core..slice..iter..Iter$LT$T$GT$$GT$$GT$11spec_extend17h8b9ef86543d199b2Espec_extend_ZN5alloc3vec16Vec$LT$T$C$A$GT$17extend_from_slice17h268a8ba950c9f29bEextend_from_slice_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$9write_all17h71b283c0429de956Ewrite_all_ZN4core3num23_$LT$impl$u20$usize$GT$12wrapping_sub17h3e5433ce2f29943bEwrapping_sub_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13needs_to_grow17h5973107b302004beEneeds_to_grow_ZN4core3num23_$LT$impl$u20$usize$GT$15overflowing_add17h66003d6a1573a1eaEoverflowing_add_ZN4core3num23_$LT$impl$u20$usize$GT$11checked_add17h94fff8a433348188E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17hb8567b7c52278e43Egrow_amortized_ZN4core6option15Option$LT$T$GT$5ok_or17he32e4c000ba928c0Eok_or_ZN4core3cmp6max_by17h49e37f28084df60fEmax_by core::cmp::Ordering>_ZN4core3cmp3Ord3max17h578d3e1d36b569fcEmax_ZN4core3cmp3max17haabedd4bf5dc948fE_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h655bba2f013da01dEas_mut_ptr_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h439ca7d6cdb0d16bEinto_result,alloc::collections::TryReserveError>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h96ed9d782b019670Eset_ptr_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h693856519e780b46E_ZN4core10intrinsics19copy_nonoverlapping17hf40c3ed38de331b0Ecopy_nonoverlapping_ZN5alloc7raw_vec14handle_reserve17hc8a9f158a5a9d9a6Ehandle_reserve_ZN4core3fmt5Write10write_char17hc709f576a2fa6ec1Ewrite_char>_ZN4core3fmt5Write10write_char17h52dcb529f0fade68Ewrite_char>_ZN4core3fmt5Write10write_char17hbb7e04b4a02d8127Ewrite_char>_ZN5alloc6string6String4push17hc5e3a74a180414adE_ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Write$GT$10write_char17h4c56faa99b57c545Ewrite_char_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h4212d2508d0a913aEpush_ZN4core3ptr5write17h385f08eee007e864Ewrite_ZN4core3fmt5Write10write_char17hb7342baf4e2b3247Ewrite_char>_ZN4core3fmt5Write9write_fmt17h4b21024cbb5262c7Ewrite_fmt>_ZN4core3fmt5Write9write_fmt17he53e280df76f4b47Ewrite_fmt>_ZN4core3fmt5Write9write_fmt17hc07425f5894a1f63Ewrite_fmt>_ZN4core3fmt5Write9write_fmt17h78fa6db8cd3791a7Ewrite_fmt>_ZN4core3fmt5Write9write_fmt17h6969d2de1d4b201bEwrite_fmt>>_ZN4core3fmt5Write9write_fmt17h11cb207f429abc05Ewrite_fmt>_ZN4core3fmt5Write9write_fmt17h352bcc5dcfbba8a5Ewrite_fmt_ZN5alloc6string6String8push_str17h0dadb942fa9c7f4dEpush_str_ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Write$GT$9write_str17ha75c81e03d400880Ewrite_str_ZN4core6option15Option$LT$T$GT$18get_or_insert_with17hc18b64d07d09de62Eget_or_insert_with, alloc::collections::btree::node::marker::LeafOrInternal>,fn() -> alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$15ensure_is_owned17h97206455f50508a2Eensure_is_owned>_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$5entry17he9b5caf83df7672eE_ZN5alloc5alloc15exchange_malloc17h2ca57a2218c539e7Eexchange_mallocboxed_ZN5alloc5boxed12Box$LT$T$GT$3new17he374080f86e436cbEnew>>_ZN5alloc11collections5btree4node117NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$8new_leaf17h2e9fb4cf31d56826Enew_leaf>_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$3new17he1d4586d571a26b5Enew>_ZN4core3ops8function6FnOnce9call_once17hbee4384836916dafEcall_once alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>,()>_ZN5alloc11collections5btree4node76NodeRef$LT$alloc..collections..btree..node..marker..Immut$C$K$C$V$C$Type$GT$4keys17h480d1030878be438Ekeys,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree6search91_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$$GT$10find_index17hd83648afdd62a30dEfind_index,alloc::collections::btree::node::marker::LeafOrInternal,std::ffi::os_str::OsString>_ZN5alloc11collections5btree6search91_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$$GT$11search_node17h0ef4f7c59979c3f3Esearch_node,alloc::collections::btree::node::marker::LeafOrInternal,std::ffi::os_str::OsString>_ZN5alloc11collections5btree6search142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$11search_tree17hdd969b5dd7e24d59Esearch_tree,std::ffi::os_str::OsString>enumerate_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h371300f0c4ae871dEnext>_ZN61_$LT$std..ffi..os_str..OsString$u20$as$u20$core..cmp..Ord$GT$3cmp17hc4de1feb516fba4aE_ZN49_$LT$u8$u20$as$u20$core..slice..cmp..SliceOrd$GT$7compare17h703c94e0608a4871Ecompare_ZN4core5slice3cmp56_$LT$impl$u20$core..cmp..Ord$u20$for$u20$$u5b$T$u5d$$GT$3cmp17h4499cc71255d9c00Ecmp_ZN58_$LT$std..ffi..os_str..OsStr$u20$as$u20$core..cmp..Ord$GT$3cmp17h66bfdfd07c7786beE_ZN4core3cmp5impls50_$LT$impl$u20$core..cmp..Ord$u20$for$u20$usize$GT$3cmp17h9595901596ee7159E_ZN5alloc11collections5btree4node91NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$5force17h12c1556614260f21Eforce>_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17h89c2cbd9e7e3913aEforce,alloc::collections::btree::node::marker::Edge>_ZN5alloc11collections5btree4node180Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7descend17h075c316cb9129e8bEdescend>_ZN4core3ptr23swap_nonoverlapping_one17he43bd6d52b30d70cEswap_nonoverlapping_one>_ZN4core3mem4swap17h0fae006fe5e7494aEswap>_ZN4core3mem7replace17hed74e47dd0b307d9Ereplace>entryOccupiedEntry_ZN5alloc11collections5btree3map5entry26OccupiedEntry$LT$K$C$V$GT$6insert17hbb1e04977de27046Einsert>_ZN4core10intrinsics19copy_nonoverlapping17h39d515ee0ebbea70Ecopy_nonoverlapping>_ZN5alloc11collections5btree4node210Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$16insert_recursing17ha01551c9c336d0a4Einsert_recursing>VacantEntry_ZN5alloc11collections5btree3map5entry24VacantEntry$LT$K$C$V$GT$6insert17hd4e3bb2b22d66c7dE_ZN5alloc11collections5btree4node210Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$6insert17hf1a7c962f8390e90E_ZN5alloc11collections5btree4node210Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$10insert_fit17h18d7d7205b4c21ccEinsert_fit>_ZN5alloc11collections5btree4node12slice_insert17h492b8b64ffdfd27eEslice_insert_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17he9c254a818d12ce6Eoffset>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h0d6d4ec93fc2bb86Eadd>_ZN4core10intrinsics4copy17hed54089c3e7f5ab7Ecopy>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h3e75ef38a388eab3Eval_area_mut,alloc::collections::btree::node::marker::Leaf,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit>]>_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$5write17hf2e777ae58f13eb0Ewrite_ZN5alloc11collections5btree4node12slice_insert17h8b27b8c11922d3b4Eslice_insert>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h00a69c6e99112461Eoffset>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17hcc233666d64b5264Eadd>>_ZN4core10intrinsics4copy17h1415439dc9cc785bEcopy>>_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$5write17hc0770c8255a0e69bEwrite>_ZN5alloc11collections5btree4node208Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..KV$GT$5split17h3417eb2152630399Esplit>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17h4f8949851b1dd8baElen,alloc::collections::btree::node::marker::Leaf>_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$15split_leaf_data17h9d5469b1ac4aa2edEsplit_leaf_data,alloc::collections::btree::node::marker::Leaf>_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h480447149527d131Eget_unchecked_mut>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$17get_unchecked_mut17h35502497726bec8dEget_unchecked_mut,usize>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h5b992f0e6a594b1aEkey_area_mut,alloc::collections::btree::node::marker::Leaf,usize,core::mem::maybe_uninit::MaybeUninit>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$4read17h6c5abd78ca8435eaE_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$16assume_init_read17h6e68847e8a705284Eassume_init_read_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$4read17hab70a5a709e80669E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$16assume_init_read17h705619d32335cee7Eassume_init_read>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h48f8a2a3b3d63dadEindex_mut>_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h7cfc0803825617a0E_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17ha4904c7f69fc78a0Eindex_mut,core::ops::range::RangeTo>_ZN4core5array88_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$9index_mut17h7f5881208dd68e90E_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h5892675f588aa1e4E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$17get_unchecked_mut17h6e0128651c6a91a9Eget_unchecked_mut,core::ops::range::Range>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17he5cf7c28696d89beEkey_area_mut,alloc::collections::btree::node::marker::Leaf,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node13move_to_slice17h9ade1761a959c2d7Emove_to_slice_ZN4core10intrinsics19copy_nonoverlapping17h530f172c9df601d3Ecopy_nonoverlapping>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17hb68adb1c3feb31cbEget_unchecked_mut>>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$17get_unchecked_mut17hcf12227031d93c16Eget_unchecked_mut>,core::ops::range::Range>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h898d4061460bc4f4Eval_area_mut,alloc::collections::btree::node::marker::Leaf,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit>]>_ZN4core10intrinsics19copy_nonoverlapping17hf34b1aa91e77934eEcopy_nonoverlapping>>_ZN5alloc11collections5btree4node13move_to_slice17h540473112f9e402bEmove_to_slice>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17hc2bba60058c7ca29Ekey_area_mut,alloc::collections::btree::node::marker::Leaf,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend17ha3197f1fe46673d2Eascend,alloc::collections::btree::node::marker::LeafOrInternal>_ZN4core6option15Option$LT$T$GT$3map17h2a9ebd5aed8d5d3cEmap<&core::ptr::non_null::NonNull>>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Internal>, alloc::collections::btree::node::marker::Edge>,closure-0>_ZN5alloc11collections5btree4node214Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$6insert17h0d28ff83b1877a6cE_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend28_$u7b$$u7b$closure$u7d$$u7d$17hb31dafadfcef6374E{{closure}},alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17he590b644303945c1Elen,alloc::collections::btree::node::marker::Internal>_ZN5alloc11collections5btree4node212Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..KV$GT$5split17h35d72b82ea5e1b2dE_ZN5alloc5boxed12Box$LT$T$GT$3new17h3c718f64debed218Enew>>_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$15split_leaf_data17he744c0f575c2ca18Esplit_leaf_data,alloc::collections::btree::node::marker::Internal>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h2207ec27ae71cfbcEkey_area_mut,alloc::collections::btree::node::marker::Internal,usize,core::mem::maybe_uninit::MaybeUninit>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h35aa3402ba408708Ekey_area_mut,alloc::collections::btree::node::marker::Internal,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h18b80fe80de4366cEval_area_mut,alloc::collections::btree::node::marker::Internal,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit>]>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17hc9e960069fc513f0Eindex_mut>>>>_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h1b79bbe9c97719bdE_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hcbe44aa515c29c34Eindex_mut>>>,core::ops::range::RangeTo>_ZN4core5array88_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$9index_mut17h4603fe6ee14024f9E_ZN5alloc11collections5btree4node13move_to_slice17h369900028808467bEmove_to_slice>>>_ZN4core10intrinsics19copy_nonoverlapping17h1fadb33e5a953c17Ecopy_nonoverlapping>>>>_ZN4core4iter5range110_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..RangeInclusive$LT$A$GT$$GT$4next17h18125bd66b30cfe7E_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$30correct_childrens_parent_links17h48a5177bfccd599aEcorrect_childrens_parent_links,core::ops::range::RangeInclusive>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$34correct_all_childrens_parent_links17h8d5503708d6c4cedEcorrect_all_childrens_parent_links>_ZN5alloc11collections5btree4node121NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$17from_new_internal17h79aaf653377a031dEfrom_new_internal>_ZN5alloc11collections5btree4node214Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$19correct_parent_link17hcca844167aa85243Ecorrect_parent_link>_ZN5alloc11collections5btree4node125NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$15set_parent_link17hb991fc5cbd64bfbeEset_parent_link>_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$5write17h03cc3592e9c5711fEwriteRangeInclusive_ZN4core3ops5range25RangeInclusive$LT$Idx$GT$8is_empty17h9bae748f14b88899Eis_empty_ZN5alloc11collections5btree4node214Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$10insert_fit17hde964190bf1aea47E_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17hbda67b587f0e3a3cEkey_area_mut,alloc::collections::btree::node::marker::Internal,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h4fa0778bb6f50258Eval_area_mut,alloc::collections::btree::node::marker::Internal,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit>]>_ZN5alloc11collections5btree4node12slice_insert17h0f0e0384cb8dd87aEslice_insert>>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h83f2fee7cf4e9190Eoffset>>>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h2e9101cb12d990c0Eadd>>>>_ZN4core10intrinsics4copy17hc4c4dcad551e359dEcopy>>>>_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$5write17h742e613baac7372cEwrite>>>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$30correct_childrens_parent_links17hb146f735e763bfffEcorrect_childrens_parent_links,core::ops::range::Range>_ZN4core6option15Option$LT$T$GT$6as_mut17h294bac118781bbc5Eas_mut, alloc::collections::btree::node::marker::LeafOrInternal>>_ZN4core6option15Option$LT$T$GT$6unwrap17h47cb91092f825243Eunwrap<&mut alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>_ZN4core10intrinsics19copy_nonoverlapping17h1a6cf775090b7df6Ecopy_nonoverlapping, alloc::collections::btree::node::marker::LeafOrInternal>>_ZN4core3ptr4read17hb936cfcd74908682Eread, alloc::collections::btree::node::marker::LeafOrInternal>>_ZN5alloc11collections5btree3mem7replace17hf912a79fcb3dde2bEreplace, alloc::collections::btree::node::marker::LeafOrInternal>,(),closure-0>_ZN5alloc11collections5btree3mem8take_mut17h580ce003ccfada0dEtake_mut, alloc::collections::btree::node::marker::LeafOrInternal>,closure-0>_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$19push_internal_level17h093679c467111800Epush_internal_level>_ZN5alloc11collections5btree4node121NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$12new_internal17h41a683ca539c2fd5Epush_internal_level_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$19push_internal_level28_$u7b$$u7b$closure$u7d$$u7d$17hae51661466f0768fEtake_mut_ZN5alloc11collections5btree3mem8take_mut28_$u7b$$u7b$closure$u7d$$u7d$17ha7c5058cea64bd71E{{closure}}, alloc::collections::btree::node::marker::LeafOrInternal>,closure-0>_ZN4core3ptr5write17haba22cd528bb48c9Ewrite, alloc::collections::btree::node::marker::LeafOrInternal>>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$4push17h1b7bff8a49219d02Epush>_ZN4core6option15Option$LT$T$GT$18get_or_insert_with17hba6bc252e60b83d1Eget_or_insert_with,fn() -> alloc::collections::btree::node::NodeRef>_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$15ensure_is_owned17h89941344970185bcEensure_is_owned_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$5entry17h5ed410db66ab5a92E_ZN5alloc5boxed12Box$LT$T$GT$3new17h9e54836c8d45bc50Enew>_ZN5alloc11collections5btree4node117NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$8new_leaf17h6bec67329a7929adEnew_leaf_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$3new17h5749316982854c6dEnew_ZN4core3ops8function6FnOnce9call_once17h449963d3918b05beEcall_once alloc::collections::btree::node::NodeRef,()>_ZN5alloc11collections5btree4node76NodeRef$LT$alloc..collections..btree..node..marker..Immut$C$K$C$V$C$Type$GT$4keys17hb6f524404265c755Ekeys_ZN5alloc11collections5btree6search91_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$$GT$10find_index17h13f6552a4e5f2d20Efind_index_ZN5alloc11collections5btree6search91_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$$GT$11search_node17h82fbbbc84400f19aEsearch_node_ZN5alloc11collections5btree6search142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$11search_tree17h5722fc9cdcb3aa8bEsearch_tree_ZN5alloc11collections5btree4node91NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$5force17hf0f2511367c81373Eforce_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17he4e5fbf1bf07ab2fEforce_ZN5alloc11collections5btree4node180Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7descend17h3a12d2d5f2bac729Edescend_ZN4core3ptr23swap_nonoverlapping_one17had5ab55b1de8c2d4Eswap_nonoverlapping_one_ZN4core3mem4swap17hdca2fd278e980a26Eswap_ZN4core3mem7replace17h20a171e14e075381Ereplace_ZN5alloc11collections5btree3map5entry26OccupiedEntry$LT$K$C$V$GT$6insert17hf8fcb57d4b863b99Einsert_ZN4core10intrinsics19copy_nonoverlapping17hfe353b4f4c66e9fbEcopy_nonoverlapping_ZN5alloc11collections5btree4node210Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$16insert_recursing17h4361a4acc5abd712Einsert_recursing_ZN5alloc11collections5btree3map5entry24VacantEntry$LT$K$C$V$GT$6insert17hde2d78cbdfa67dfeE_ZN5alloc11collections5btree4node210Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$6insert17he36e3fdb387d5a3fE_ZN5alloc11collections5btree4node210Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$10insert_fit17h7fe4adf7b3d830dbEinsert_fit_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h878c20e672fc55fdEval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node208Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..KV$GT$5split17h7663b2e1ffdffc95Esplit_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17h53b304821fb3746dElen_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$15split_leaf_data17h533bdf76de716fbaEsplit_leaf_data_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17hd53c75bcb95d1343Ekey_area_mut>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17hd9cc88b56ef1f2aeEkey_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17ha79e1ddd67e55dfdEval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h5615aa20e5f5a976Ekey_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend17h60a6bb2a5349b614Eascend_ZN4core6option15Option$LT$T$GT$3map17he33a677394c6ab3fEmap<&core::ptr::non_null::NonNull>,alloc::collections::btree::node::Handle, alloc::collections::btree::node::marker::Edge>,closure-0>_ZN5alloc11collections5btree4node214Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$6insert17h6c71e39ed12c7afdE_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend28_$u7b$$u7b$closure$u7d$$u7d$17hd2a7d55b417657c1E{{closure}}_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17h635b7a129f2b53c4Elen_ZN5alloc11collections5btree4node212Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..KV$GT$5split17h3b4dd67852f5defcE_ZN5alloc5boxed12Box$LT$T$GT$3new17h90a9c6d46f83fac4Enew>_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$15split_leaf_data17hfb98d484f62c076eEsplit_leaf_data_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h58017077c5e092e6Ekey_area_mut>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h3519bbeea4463eefEkey_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h2e0e6a459019f9b6Eval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17hd99ad911751e0f02Eindex_mut>>>_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h41013c0d68518b90E_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17he9ccfdc1e29d70caEindex_mut>>,core::ops::range::RangeTo>_ZN4core5array88_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$9index_mut17h6dc31beaf02845adE_ZN5alloc11collections5btree4node13move_to_slice17ha63a965b90075562Emove_to_slice>>_ZN4core10intrinsics19copy_nonoverlapping17he63895ebb7d3c90bEcopy_nonoverlapping>>>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$30correct_childrens_parent_links17h13d5856df31aed22Ecorrect_childrens_parent_links>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$34correct_all_childrens_parent_links17hfeeb8a13559870b0Ecorrect_all_childrens_parent_links_ZN5alloc11collections5btree4node121NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$17from_new_internal17ha6a239738f8cda4eEfrom_new_internal_ZN5alloc11collections5btree4node214Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$19correct_parent_link17hd7cb958cc8de69c5Ecorrect_parent_link_ZN5alloc11collections5btree4node125NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$15set_parent_link17h82eeb053727b3fa0Eset_parent_link_ZN5alloc11collections5btree4node214Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$10insert_fit17hcf95aa243d0be56aE_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17ha046ed6c94c52f31Ekey_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17he2332b4cb28069b8Eval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node12slice_insert17hc61c88ec6191f545Eslice_insert>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h7dfdc85edfbfe142Eoffset>>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h9bcc391027d72418Eadd>>>_ZN4core10intrinsics4copy17h8151e875d3f93ab8Ecopy>>>_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$5write17ha6c9d99092a1b6d3Ewrite>>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$30correct_childrens_parent_links17h4ed3c5accb689679Ecorrect_childrens_parent_links>_ZN4core6option15Option$LT$T$GT$6as_mut17h608cf0d484596fb6Eas_mut>_ZN4core6option15Option$LT$T$GT$6unwrap17hc99ce1695edd9b03Eunwrap<&mut alloc::collections::btree::node::NodeRef>_ZN4core10intrinsics19copy_nonoverlapping17h2f2bb6becfa6d95fEcopy_nonoverlapping>_ZN4core3ptr4read17h9bda2f629254bc8cEread>_ZN5alloc11collections5btree3mem7replace17h8d8f077386d72329Ereplace,(),closure-0>_ZN5alloc11collections5btree3mem8take_mut17h08ca8e5e7f128bdeEtake_mut,closure-0>_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$19push_internal_level17h4c9cd05d401ae238Epush_internal_level_ZN5alloc11collections5btree4node121NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$12new_internal17h2b887f8a48d10e2fE_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$19push_internal_level28_$u7b$$u7b$closure$u7d$$u7d$17he3da2dbffa8046acE_ZN5alloc11collections5btree3mem8take_mut28_$u7b$$u7b$closure$u7d$$u7d$17h9ab9b4076badbb9fE{{closure}},closure-0>_ZN4core3ptr5write17he9cae22f45b03026Ewrite>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$4push17hc9abee0eafa6f429Epush_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17h376f6365494b7152Elen,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h7dab0c33d727ece6Ekey_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node9slice_shr17h4aa40a6ab93ac432Eslice_shr_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h42723656a0f78d9cEval_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit>]>_ZN5alloc11collections5btree4node9slice_shr17h5e2991ae2dec5199Eslice_shr>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h9ec99093a0df208bEkey_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,usize,core::mem::maybe_uninit::MaybeUninit>_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$6kv_mut17h100eed2827fd9303Ekv_mut,alloc::collections::btree::node::marker::Internal>_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$10replace_kv17haf292886e9458092Ereplace_kv,alloc::collections::btree::node::marker::Internal>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$13edge_area_mut17hef44f491c3ccbd15Eedge_area_mut,core::ops::range::RangeTo,[core::mem::maybe_uninit::MaybeUninit>>>]>_ZN5alloc11collections5btree4node9slice_shr17h4bc104cbbaddbefaEslice_shr>>>BalancingContext_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$3len17h608f963599d8d4a3Elen_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h6c8a2f5a7d27275aEkey_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h7e2af465adadcf51Eval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h122b424ff0113908Ekey_area_mut>_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$6kv_mut17hccbd44762b423b4fEkv_mut_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$10replace_kv17h751cfb884f2df5e3Ereplace_kv_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$13edge_area_mut17ha476cd9ee6b3b038Eedge_area_mut,[core::mem::maybe_uninit::MaybeUninit>>]>_ZN5alloc11collections5btree4node9slice_shr17h050ecac19ed0613dEslice_shr>>_ZN5alloc11collections5btree4node9slice_shl17h0a0c6c69ddf6f90aEslice_shl_ZN5alloc11collections5btree4node9slice_shl17h48cd458ee7d967edEslice_shl>>_ZN5alloc11collections5btree4node9slice_shl17hde6d1939f1149989Eslice_shl>_ZN5alloc11collections5btree4node9slice_shl17h3b639a85c1e691d0Eslice_shl>>>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$8do_merge17hfccad72ed9df65f3Edo_merge>_ZN5alloc11collections5btree4node12slice_remove17h23fdaf808f9635f1Eslice_remove_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h6cb16e6b7f1ffdf2Ekey_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h7a690680daeb9b7aEval_area_mut,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node12slice_remove17hcb89591cb84fa093Eslice_remove>>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h7a640a3bed10667aEget_unchecked_mut>>>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$17get_unchecked_mut17hdb0e57460324c504Eget_unchecked_mut>>,core::ops::range::Range>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$13edge_area_mut17h109000d90f2d812cEedge_area_mut,[core::mem::maybe_uninit::MaybeUninit>>]>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$8do_merge17h3dfb720d3b74412cEdo_merge,closure-0,alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::Internal>>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12key_area_mut17h765d81cce61724b6Ekey_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit]>_ZN5alloc11collections5btree4node12slice_remove17hd6a7d3508366eaefEslice_remove>_ZN5alloc11collections5btree4node74NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$Type$GT$12val_area_mut17h8246d9df9730cbbeEval_area_mut,alloc::collections::btree::node::marker::LeafOrInternal,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit>]>_ZN5alloc11collections5btree4node12slice_remove17h5b312748316c3869Eslice_remove>>>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h6f955f435f7e985bEget_unchecked_mut>>>>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$17get_unchecked_mut17h03c734c23bf92a9aEget_unchecked_mut>>>,core::ops::range::Range>_ZN5alloc11collections5btree4node119NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$13edge_area_mut17hcc1fcf186948a6b7Eedge_area_mut,core::ops::range::Range,[core::mem::maybe_uninit::MaybeUninit>>>]>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$8do_merge17h04f91ac313e47ab0Edo_merge,closure-0,alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$20merge_tracking_child17h81b31ea0ac8bb131Emerge_tracking_child>_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8new_edge17h9eb26d1c592c73a8Enew_edge,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$8do_merge17h844834f2345b410fEdo_merge>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$20merge_tracking_child17ha9d8900111de7371Emerge_tracking_child_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8new_edge17h29a750f00cc7d4a5Enew_edge_ZN5alloc11collections5btree4node208Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..KV$GT$6remove17hb330a01a31a79b47Eremove>_ZN5alloc11collections5btree4node125NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$16choose_parent_kv17h8f533542dfde9445Echoose_parent_kv>_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7left_kv17h8597947f28ab72fdEleft_kv,alloc::collections::btree::node::marker::Internal>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$9can_merge17h814da98af2178531Ecan_merge>_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8right_kv17h2af21e6ebfd51d09Eright_kv,alloc::collections::btree::node::marker::Internal>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$10steal_left17h01fd9e1268cdc41aE_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$11steal_right17h21242a3c4e8a24b8E_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend17hbef6598fee9bba17Eascend,alloc::collections::btree::node::marker::Leaf>_ZN4core6option15Option$LT$T$GT$3map17h6b31e629b1ca1ad1E_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend28_$u7b$$u7b$closure$u7d$$u7d$17h4575a379ba6e2b34E{{closure}},alloc::collections::btree::node::marker::Leaf>_ZN5alloc11collections5btree6remove170_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$GT$29handle_underfull_node_locally17h6fead3add521ae9eEhandle_underfull_node_locally>_ZN5alloc11collections5btree6remove170_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$GT$30handle_shrunk_node_recursively17h1df8a005a696a6b4Ehandle_shrunk_node_recursively,closure-0>remove_kv_ZN5alloc11collections5btree3map5entry26OccupiedEntry$LT$K$C$V$GT$9remove_kv28_$u7b$$u7b$closure$u7d$$u7d$17h1182eeddc0a4a4d9EArguments_ZN4core3fmt9Arguments6new_v117hb7d5c859a9eeb48fEnew_v1_ZN5alloc11collections5btree4node208Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..KV$GT$6remove17ha3d1c43299edd04bEremove_ZN5alloc11collections5btree4node125NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$16choose_parent_kv17h680203ad05334db6Echoose_parent_kv_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7left_kv17h4266f0a456f9df6cEleft_kv_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$9can_merge17h69aa3400dac611baEcan_merge_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8right_kv17h51badf48b754f879Eright_kv_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$10steal_left17h5ba285a73288edeaE_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$11steal_right17hbb4ac574994e8a9aE_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend17hc8161436da600c9eEascend_ZN4core6option15Option$LT$T$GT$3map17hfe77189a215b5981E_ZN5alloc11collections5btree4node40NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$6ascend28_$u7b$$u7b$closure$u7d$$u7d$17hd247c245be53ab21E{{closure}}_ZN5alloc11collections5btree6remove170_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$GT$29handle_underfull_node_locally17h764bc1a94d9740f5Ehandle_underfull_node_locally_ZN5alloc11collections5btree6remove170_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$GT$30handle_shrunk_node_recursively17hc19d2a66cbed871eEhandle_shrunk_node_recursively_ZN5alloc11collections5btree3map5entry26OccupiedEntry$LT$K$C$V$GT$9remove_kv28_$u7b$$u7b$closure$u7d$$u7d$17h14a40a5d63e7a7c4E_ZN5alloc3vec16Vec$LT$T$C$A$GT$3len17h5f598b585eed9186E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h21347e2cdafb3473Egrow_amortized<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17hb96e0de302186d9dEtry_reserve<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h52bff7faa11bfa0cE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h85c19771800a71a6ElayoutLayout_ZN4core5alloc6layout6Layout6repeat17h295c178763de552aErepeat_ZN4core5alloc6layout6Layout5array17hb33bd8a0fd9c5cbaEarray<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN4core3num23_$LT$impl$u20$usize$GT$15overflowing_mul17h10a9197d2c078325Eoverflowing_mul_ZN4core3num23_$LT$impl$u20$usize$GT$11checked_mul17h9bcfa310f8b1aa67Echecked_mul_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h66187ffca997c503Eas_mut_ptr<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h9f3c2cbd69df0c37Eset_ptr<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h21aad0f1040085bdEcapacity_from_bytes<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h04eec1517ad5e13dEoffset<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN4core10intrinsics4copy17h7234e4af05bc05a7Ecopy<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN4core3ptr5write17h682850645233c981Ewrite<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN5alloc3vec16Vec$LT$T$C$A$GT$7set_len17h67dc24e1cd4883e3Eset_len<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN65_$LT$std..sys..unix..fs..Dir$u20$as$u20$core..ops..drop..Drop$GT$4drop17hd5533f2c4e72d57eE_ZN4core3ptr44drop_in_place$LT$std..sys..unix..fs..Dir$GT$17h60fd42016514415dEdrop_in_place_ZN4core3ptr53drop_in_place$LT$std..sys..unix..fs..InnerReadDir$GT$17ha4103429a1fe28e1Edrop_in_place_ZN5alloc2rc11is_dangling17h3c3920e11429c6bcEis_dangling>Weak_ZN5alloc4sync13Weak$LT$T$GT$5inner17h82407ef8d2b6f138Einner_ZN68_$LT$alloc..sync..Weak$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h3542b1ce87d18336E_ZN4core3ptr78drop_in_place$LT$alloc..sync..Weak$LT$std..sys..unix..fs..InnerReadDir$GT$$GT$17h8c092779258ed091Edrop_in_place>_ZN4core3mem4drop17ha9271acdc968edefEdrop>Arc_ZN4core3ptr73drop_in_place$LT$core..option..Option$LT$std..ffi..c_str..CString$GT$$GT$17h7f67c2d13ce7c242Edrop_in_place>_ZN4core3ptr39drop_in_place$LT$std..thread..Inner$GT$17h9de346f9467aab17Edrop_in_place_ZN5alloc2rc11is_dangling17h7fac370dc18284ecEis_dangling>_ZN5alloc4sync13Weak$LT$T$GT$5inner17hdc52e43a2a93096aEinner_ZN68_$LT$alloc..sync..Weak$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17ha7926320b47878f4E_ZN4core3ptr64drop_in_place$LT$alloc..sync..Weak$LT$std..thread..Inner$GT$$GT$17h8c5c56ab5dcd9c8cEdrop_in_place>_ZN4core3mem4drop17hcf009dacda4967ceEdrop>_ZN4core3ptr77drop_in_place$LT$std..sync..mutex..Mutex$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17hdb9d12a5168461ceEdrop_in_place>>_ZN4core3ptr76drop_in_place$LT$core..cell..UnsafeCell$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h9fd2d4da2b9d838aEdrop_in_place>>_ZN5alloc2rc11is_dangling17h526ab36e292c2d9bEis_dangling>>>_ZN5alloc4sync13Weak$LT$T$GT$5inner17h4b45c2f6d84313a3Einner>>_ZN68_$LT$alloc..sync..Weak$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h15fdfb6bbf3aee86E_ZN4core3ptr102drop_in_place$LT$alloc..sync..Weak$LT$std..sync..mutex..Mutex$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$$GT$17hdbdd312f004153c6Edrop_in_place>>>_ZN4core3mem4drop17hf067c00477a32913Edrop>>>_ZN4core3ptr53drop_in_place$LT$std..sync..mpsc..blocking..Inner$GT$17h778fbb3e150fa0f7Edrop_in_place_ZN5alloc2rc11is_dangling17hecb423caed632b47Eis_dangling>_ZN5alloc4sync13Weak$LT$T$GT$5inner17h12147f510c6c06b5Einner_ZN68_$LT$alloc..sync..Weak$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hfb06ad5f1d846a01E_ZN4core3ptr78drop_in_place$LT$alloc..sync..Weak$LT$std..sync..mpsc..blocking..Inner$GT$$GT$17h82935110bb9aeeadEdrop_in_place>_ZN4core3mem4drop17hca1b0ba4c9e1e8fcEdrop>_ZN4core6result19Result$LT$T$C$E$GT$7map_err17hcac7bbf190af7a1dEmap_err_ZN5alloc5alloc6Global9grow_impl17hf80833915f572edfEgrow_impl_ZN63_$LT$alloc..alloc..Global$u20$as$u20$core..alloc..Allocator$GT$4grow17hdea07fbff65c48c2Egrow_ZN5alloc5alloc7realloc17h88e15c0000d6becaE_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h33081519b4713f3bEmap_err,core::alloc::AllocError,alloc::collections::TryReserveError,closure-1>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h764a89032f71223eEfrom_error,alloc::collections::TryReserveError>endian_sliceEndianSlice_ZN5gimli4read12endian_slice25EndianSlice$LT$Endian$GT$10read_slice17h1879f86f51a350c7Eread_slice_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$10read_slice17h9efd979c9e982eddE_ZN5gimli4read6reader6Reader13read_u8_array17h7f2e3b08e9440702Eread_u8_array,[u8; 1]>_ZN5gimli4read6reader6Reader7read_u817h96941a82500d8da4Eread_u8>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17hb9d74b71488819b2Eget_unchecked_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h6933d7b1840a4afbE_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hf607bf5629bf0301E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h1f2d9ed510a21fb1Eindex>Clone_ZN4core5clone5Clone10clone_from17h92fa20bf3265c8c9Eclone_from_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16clone_from_slice17h4a898dab59727535Eclone_from_slice_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h0e3d2d16149b0736Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h633be1089e54948fEwith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h04e88d1836399465E_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17hb177383bcba50ec8Ewith_capacity_ZN5gimli6leb1284read8unsigned17ha348a8462fb7cdccEunsigned>_ZN5gimli4read6reader6Reader12read_uleb12817h87379fed66ac0748Eread_uleb128>_ZN5gimli6leb12816low_bits_of_byte17h066a86e9d14230c7Elow_bits_of_byte_ZN5gimli6leb1284read3u1617hc4f4ba4e27f070c7E_ZN5gimli4read6reader6Reader16read_uleb128_u1617hced856f2369859b9Eread_uleb128_u16>_ZN4core7convert3num63_$LT$impl$u20$core..convert..From$LT$u8$GT$$u20$for$u20$u16$GT$4from17hd2aaf3e1d8d9694bE_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h20cba51558ac42f6Epush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h77e6a4ce6e540c08Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17hbec41ebc8e540c60Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17habb99f49c1606a89E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h8b7998605d521e91E_ZN4core5alloc6layout6Layout5array17h2d92f8a6e9baf334Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h4b3169940e2f8a4dEset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17hc27fb25ea33e53c1Ecapacity_from_bytes_ZN4core3ptr5write17h322466e0cbe2b1f9Ewrite_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hfcaca52436bd4497Efrom_error,gimli::read::Error>_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$9offset_id17hf0383511ff30181eEoffset_idFileEntryFormat_ZN5gimli4read6reader6Reader13read_u8_array17h18adf2f2159c051aEread_u8_array,[u8; 2]>_ZN5gimli4read6reader6Reader8read_u1617hc84617f70c13ecb5Eread_u16>_ZN5gimli4read6reader6Reader9read_word17h1d1fde0b44e66dfbEread_word>_ZN5gimli4read6reader6Reader11read_offset17h610a1ba61408e5b2Eread_offset>_ZN5gimli4read6reader6Reader13read_u8_array17h383b905cf4699f75Eread_u8_array,[u8; 8]>_ZN5gimli4read6reader6Reader8read_u6417h3c3fafdf4f6450caEread_u64>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h8c20466b7c6fd49dEinto_result<[u8; 8],gimli::read::Error>_ZN5gimli4read6reader6Reader13read_u8_array17hf3167499ad520f56Eread_u8_array,[u8; 4]>_ZN5gimli4read6reader6Reader8read_u3217hdfd80e6e1da52b5fEread_u32>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h8e392a4759f66a87Efrom_error<[u8; 8],gimli::read::Error>_ZN5gimli4read12endian_slice25EndianSlice$LT$Endian$GT$4find17hf026fbf0eb96267cEfind_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$4find17h03a4d5c99a3ed3edE_ZN5gimli4read6reader6Reader26read_null_terminated_slice17hd000c9b4ede6a832Eread_null_terminated_slice>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h4007ad8ba925c518E_ZN5gimli4read12endian_slice25EndianSlice$LT$Endian$GT$4find28_$u7b$$u7b$closure$u7d$$u7d$17h39c56b0df63ca855E{{closure}}_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h1fee518adee783a4Efrom_error, usize>,gimli::read::Error>_ZN5gimli6leb1284read6signed17hc2183895aba1618cE_ZN5gimli4read6reader6Reader12read_sleb12817hde9b312d16c4e5b4Eread_sleb128>_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$5split17hec72d141fa09beb1Esplit_ZN5gimli4read6reader6Reader9read_uint17h15084b2f0e96370bEread_uint>_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$4skip17h5e9391136c6d5549Eskip_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hd6f5c9600e5ed13bEfrom_error, usize>,gimli::read::Error>FileEntry_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h6c8a880c02ec5a48Einto_result_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h0571bb5d91541ffeEfrom_error>,gimli::read::Error>unit_ZN5gimli4read4unit20length_uleb128_value17hf69b952513088a77Elength_uleb128_value>_ZN5gimli4read4unit16length_u16_value17hb718d7e84f21b4bfElength_u16_value>_ZN5gimli4read4unit16length_u32_value17h41c9ba4e946df3f0Elength_u32_value>_ZN62_$LT$gimli..common..Format$u20$as$u20$core..cmp..PartialEq$GT$2eq17hbbb7750d8cd0c5fdEeq_ZN5gimli4read4unit15length_u8_value17h629c2917d7b33f90Elength_u8_value>_ZN5gimli4read6reader6Reader17read_sized_offset17h5d31ed847703851eEread_sized_offset>constants_ZN65_$LT$gimli..constants..DwForm$u20$as$u20$core..cmp..PartialEq$GT$2eq17hf77fd98d8813dcf4EabbrevAttributeSpecification_ZN5gimli4read6abbrev22AttributeSpecification20implicit_const_value17h15e6222d03275ddbEimplicit_const_value_ZN4core6option15Option$LT$T$GT$5ok_or17hf2896dbb5258bc5fEok_orAttributeValue_ZN5gimli4read4unit32AttributeValue$LT$R$C$Offset$GT$12offset_value17h554dc89aa463cecdEoffset_value,usize>Attribute_ZN5gimli4read4unit18Attribute$LT$R$GT$12offset_value17h295d676be9d49201Eoffset_value>_ZN5gimli4read4unit32AttributeValue$LT$R$C$Offset$GT$11udata_value17h185f44acab5da84bEudata_value,usize>_ZN5gimli4read4unit18Attribute$LT$R$GT$11udata_value17h99858e32ff5b43ccEudata_value>_ZN5gimli4read4unit32AttributeValue$LT$R$C$Offset$GT$8u8_value17hb72f271fe9fc8caeEu8_value,usize>_ZN5gimli4read4unit18Attribute$LT$R$GT$8u8_value17h755e86f47e19fac9E_ZN5gimli4read4unit32AttributeValue$LT$R$C$Offset$GT$9u16_value17h5c18209190fde8edEu16_value,usize>_ZN5gimli4read4unit18Attribute$LT$R$GT$9u16_value17haeebd0720b623a5fE_ZN91_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h77f5ac481b71e8faEcloneDebugStr_ZN5gimli4read3str17DebugStr$LT$R$GT$7get_str17hc4339393c6b6dcd8Eget_str>DebugStrOffsets_ZN5gimli4read3str24DebugStrOffsets$LT$R$GT$14get_str_offset17hb3648f79f8e332d0Eget_str_offset>_ZN5gimli6common6Format9word_size17hec361bc09fe33220Eword_size_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h236763cd40ad560fEfrom_error,gimli::read::Error>DebugLineStr_ZN5gimli4read3str21DebugLineStr$LT$R$GT$7get_str17hff5e01205401a8daEDwarfrnglistsRawRngListIter_ZN5gimli4read8rnglists23RawRngListIter$LT$R$GT$4next17h58003501db67377cEnext>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17h1f0356f60296fa86Eis_empty_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$8is_empty17h216488a82d157c89Eis_emptyRawRngListEntry_ZN5gimli4read8rnglists24RawRngListEntry$LT$T$GT$5parse17h99e6116c54b31e80Eparse>RawRange_ZN5gimli4read8rnglists8RawRange5parse17h3338f383aa2b2363Eparse>_ZN5gimli4read8rnglists8RawRange6is_end17h79a5d52c2296f0b4Eis_end_ZN5gimli4read8rnglists8RawRange15is_base_address17h0991d31f6c026a0fEis_base_address_ZN5gimli4read8rnglists20RngListIter$LT$R$GT$11get_address17hb1ebc2f6f94b7c59Eget_address>DebugAddr_ZN5gimli4read4addr18DebugAddr$LT$R$GT$11get_address17h700fcc5f4cda8c5fE_ZN5gimli4read6reader6Reader12read_address17hb0eb2c6d61da61d6Eread_address>_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$5empty17h4864ffb8cfec176cE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hfc18132aed51d6e7Efrom_error,gimli::read::Error>_ZN5gimli4read8rnglists5Range16add_base_address17hfcd0ba82ebaf57d7Eadd_base_address_ZN4core3num21_$LT$impl$u20$u64$GT$12wrapping_add17h8733dd76d02144d0Ewrapping_add_ZN75_$LT$gimli..read..op..Expression$LT$R$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hb3b41127c93f7e7cEclone>_ZN4core5clone5impls53_$LT$impl$u20$core..clone..Clone$u20$for$u20$bool$GT$5clone17h8aba5cf89ea694c7E_ZN5alloc3vec12Vec$LT$T$GT$3new17h45d1527e58f944a7Enew_ZN5alloc3vec12Vec$LT$T$GT$3new17hd6be241cfa8d3a0fEnew>>DebugInfo_ZN5gimli4read4unit18DebugInfo$LT$R$GT$5units17hdf5c18c7d149c7b8E_ZN5gimli4read5dwarf14Dwarf$LT$R$GT$5units17h409536f5a0676eb3EDebugInfoUnitHeadersIter_ZN5gimli4read4unit33DebugInfoUnitHeadersIter$LT$R$GT$4next17h70e04e95111a2350E_ZN5gimli4read5dwarf13Unit$LT$R$GT$3new17he4c26ceaa630b003Enew>_ZN5gimli4read5dwarf14Dwarf$LT$R$GT$4unit17h4c3891458a3155ebEunit>RangeLists_ZN5gimli4read8rnglists19RangeLists$LT$R$GT$10get_offset17h850a1f4b097efd6cEget_offset>_ZN5gimli4read5dwarf14Dwarf$LT$R$GT$13ranges_offset17h98e17ab5cb2d2cd5E_ZN5gimli4read5dwarf14Dwarf$LT$R$GT$18attr_ranges_offset17h1284566b036157c1Eattr_ranges_offset>_ZN5gimli4read6reader6Reader19read_initial_length17h6c262943feb73400Eread_initial_length>_ZN5gimli4read4unit17parse_unit_header17hb0fca2ea821e8e83Eparse_unit_header,usize>_ZN5gimli4read4unit25parse_debug_abbrev_offset17h574fa33e706054bdEparse_debug_abbrev_offset>_ZN5gimli4read4unit15parse_unit_type17ha3da3b82c65e1cfdEparse_unit_type>_ZN5gimli4read4unit20parse_type_signature17hc763022f532292c1Eparse_type_signature>_ZN5gimli4read4unit17parse_type_offset17hf49a420dfb594246Eparse_type_offset>_ZN5gimli4read4unit12parse_dwo_id17h0ebe71842a6d79ebEparse_dwo_id>DebugAbbrev_ZN5gimli4read6abbrev20DebugAbbrev$LT$R$GT$13abbreviations17h3f5844efb7e04f92Eabbreviations>UnitHeader_ZN5gimli4read4unit28UnitHeader$LT$R$C$Offset$GT$13abbreviations17h174e9dc08c842924Eabbreviations,usize>Abbreviations_ZN5gimli4read6abbrev13Abbreviations5parse17haaa1c1e5f8a83438EAbbreviation_ZN5gimli4read6abbrev12Abbreviation5parse17h25490a0b4babd505E_ZN5gimli4read6abbrev12Abbreviation9parse_tag17h2694d814e6ba8c84Eparse_tag>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h9bca40720a8bc5d5Einto_result,gimli::read::Error>_ZN5gimli4read6abbrev12Abbreviation18parse_has_children17h6ea98c4b764f5acaEparse_has_children>_ZN5gimli4read6abbrev12Abbreviation16parse_attributes17hf7dd2be5d11d9133Eparse_attributes>_ZN5gimli4read6abbrev22AttributeSpecification5parse17h2c8660cc8bba2579E_ZN5gimli4read6abbrev22AttributeSpecification10parse_form17hec2c01eb530ba068Eparse_form>_ZN4core6option15Option$LT$T$GT$9unwrap_or17hdc55f4b6cf3a838aEunwrap_or_ZN5gimli4read6abbrev22AttributeSpecification3new17hfb0abaf2676e27f8E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h10c77b48a3108a7bEinto_result,gimli::read::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h9901297c5bf902aaEfrom_error_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17ha21fed9eee816f81Einto_resultDebugStrOffsetsBase_ZN5gimli4read3str66_$LT$impl$u20$gimli..common..DebugStrOffsetsBase$LT$Offset$GT$$GT$29default_for_encoding_and_file17h21fc63ff54ab7f7aEdefault_for_encoding_and_fileDebugLocListsBase_ZN5gimli4read8loclists64_$LT$impl$u20$gimli..common..DebugLocListsBase$LT$Offset$GT$$GT$29default_for_encoding_and_file17h56682f23007cd2f7E_ZN5gimli4read4unit28UnitHeader$LT$R$C$Offset$GT$7entries17h5be4a04a9b91a3b1Eentries,usize>EntriesCursor_ZN5gimli4read4unit22EntriesCursor$LT$R$GT$10next_entry17ha9cfb8d176ef2542Enext_entry>_ZN5gimli4read4unit22EntriesCursor$LT$R$GT$8next_dfs17h1e5b6545fef843c9Enext_dfs>_ZN5gimli4read12endian_slice25EndianSlice$LT$Endian$GT$11offset_from17hc60ed9510469f5cdEoffset_from_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$11offset_from17h1fb084f2e2ea4aefEDebuggingInformationEntry_ZN5gimli4read4unit43DebuggingInformationEntry$LT$R$C$Offset$GT$5parse17h5b5828fdae2ce386Eparse,usize>_ZN4core3num23_$LT$impl$u20$usize$GT$15overflowing_sub17h13268de339b0bf62Eoverflowing_sub_ZN4core3num23_$LT$impl$u20$usize$GT$11checked_sub17h361b95ddaf6f6be6E_ZN5gimli4read6abbrev13Abbreviations3get17heac62d99b50876ceE_ZN4core6option15Option$LT$T$GT$6as_ref17he3363b5499fb5372Eas_ref>_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$3get17ha2c779a7d774fff8Eget_ZN5alloc11collections5btree4node76NodeRef$LT$alloc..collections..btree..node..marker..Immut$C$K$C$V$C$Type$GT$4keys17he2c9cf657da76a08Ekeys_ZN5alloc11collections5btree6search91_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$$GT$10find_index17h21e9cc9b4d60e262Efind_index_ZN5alloc11collections5btree6search91_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$$GT$11search_node17h0d4ef941dbfe7f5eEsearch_node_ZN5alloc11collections5btree6search142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$11search_tree17h0e58bba2ca87643cEsearch_tree_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hf901a13cbbb74350Enext_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hb5199d27e2914ac0Enext>_ZN4core3cmp5impls48_$LT$impl$u20$core..cmp..Ord$u20$for$u20$u64$GT$3cmp17h0bc62add01ed85d7E_ZN5alloc11collections5btree4node91NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$5force17hf2e2ee5bf2f5ed26Eforce_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17h35cd92b2ee1e99d5Eforce_ZN5alloc11collections5btree4node180Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7descend17h236fe59a1ba6b6efEdescend_ZN69_$LT$gimli..constants..DwChildren$u20$as$u20$core..cmp..PartialEq$GT$2eq17hea42e92cf2d9d9cbE_ZN5gimli4read6abbrev12Abbreviation12has_children17h10528893f2245db6Ehas_children_ZN5gimli4read4unit43DebuggingInformationEntry$LT$R$C$Offset$GT$12has_children17h55a8ff1c1c526cecEhas_children,usize>_ZN5gimli4read6abbrev12Abbreviation10attributes17h3b43269518546278Eattributes_ZN5gimli4read4unit43DebuggingInformationEntry$LT$R$C$Offset$GT$5attrs17h9c7013f277e146d4Eattrs,usize>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17h18f729df85f1df95Eis_emptyAttrsIter_ZN5gimli4read4unit18AttrsIter$LT$R$GT$4next17hc8bfcaaed78c5b1dE_ZN5gimli4read4unit28UnitHeader$LT$R$C$Offset$GT$8encoding17h8211be8b185ccebfEencoding,usize>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h22b199f90dce3c06Eoffset_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17hcf1bba661431cb98Eadd_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h5f9f63ef9a541397Eget_unchecked_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h995f346c26392c74E_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h4843290d879fc89cEindex_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hf7ab4d127208f740Eindex>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h725939e958617c60Einto_result>>,gimli::read::Error>_ZN4core10intrinsics19copy_nonoverlapping17h2cff8203223db049Ecopy_nonoverlapping>_ZN4core3ptr23swap_nonoverlapping_one17hc787dc8bdd1bb6b1Eswap_nonoverlapping_one>_ZN4core3mem4swap17h844af527a34689bbEswap>_ZN4core3mem7replace17hd873b5460e597937Ereplace>_ZN4core4cell13Cell$LT$T$GT$7replace17h8525b5d7e6328003E_ZN4core4cell13Cell$LT$T$GT$3set17h951d83f4d83e145fEset>_ZN4core6result19Result$LT$T$C$E$GT$2ok17h348d3bc603ecae5fEok,gimli::read::Error>_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h5c4cc5cea7e54d7eEDebugLine_ZN5gimli4read4line18DebugLine$LT$R$GT$7program17heed9f32e1e367aefEprogram>LineProgramHeader_ZN5gimli4read4line35LineProgramHeader$LT$R$C$Offset$GT$5parse17h1903830ea1ccc318E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h19f13ae9558a3857Efrom_error, usize>,gimli::read::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17he3e7b4290b081c4aEinto_result, usize>,gimli::read::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h081ad8de96ed3e36Einto_result, usize>,gimli::read::Error>_ZN5gimli4read4unit28UnitHeader$LT$R$C$Offset$GT$11entries_raw17h58b3e56ad3302d8cEentries_raw,usize>_ZN5gimli4read5dwarf13Unit$LT$R$GT$11entries_raw17ha6ff9204cdac850aEentries_raw>EntriesRaw_ZN5gimli4read4unit19EntriesRaw$LT$R$GT$17read_abbreviation17hed38e21f4f548f7cEread_abbreviation>_ZN64_$LT$gimli..constants..DwTag$u20$as$u20$core..cmp..PartialEq$GT$2eq17h691983118974006fE_ZN5gimli4read6reader6Reader11read_length17h7463f45db1e4938aEread_length>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0a1ed7397922b8d0Enext_ZN5gimli4read4unit19EntriesRaw$LT$R$GT$14read_attribute17hf077393e8f75f557Eread_attribute>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h93f17e1ede5bf234Einto_result>,gimli::read::Error>_ZN5gimli4read5dwarf13Unit$LT$R$GT$8encoding17h333a6a6aaab8f271Eencoding>arith_ZN47_$LT$usize$u20$as$u20$core..ops..arith..Add$GT$3add17hbe6d59ae2dd9fec7Eget_offset_ZN5gimli4read8rnglists19RangeLists$LT$R$GT$10get_offset28_$u7b$$u7b$closure$u7d$$u7d$17hca5a9a5b4c906461E{{closure}}>_ZN4core6result19Result$LT$T$C$E$GT$3map17h9d43bf27e6da886eEmap,closure-0>_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$8truncate17hc96d662b1c665a74Etruncateaddr2line_ZN78_$LT$addr2line..RangeAttributes$LT$R$GT$$u20$as$u20$core..default..Default$GT$7default17h9953cde65e197d98Edefault>RangeAttributes_ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range17hec6c4adf0a11a1dbEfor_each_range,closure-0>_ZN5gimli4read5dwarf14Dwarf$LT$R$GT$6ranges17h0d5e9cb28f45fb99E_ZN5gimli4read8rnglists19RangeLists$LT$R$GT$10raw_ranges17h32d20cd031ffc1edEraw_ranges>_ZN5gimli4read8rnglists19RangeLists$LT$R$GT$6ranges17h7814882f51342cefE_ZN76_$LT$gimli..read..addr..DebugAddr$LT$R$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h75213a05b8832a31E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h3f8c71be8b0ab2ddEinto_result,gimli::read::Error>_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h0dee82195fe206edEpush>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17hb8ec7f4cb719be7bEgrow_amortized>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h14b8f71554f5ae3bEtry_reserve>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h02df78e76d752c4dE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h4e8c9b8d8fd9a14bE_ZN4core5alloc6layout6Layout5array17h47e72b4657cfab04Earray>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hf575c1460c55737dEset_ptr>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h06427e0dd0674003Ecapacity_from_bytes>,alloc::alloc::Global>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h991bd81e1c80baa0Eoffset>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17hee7cb3999df7835fEadd>>_ZN4core3ptr5write17ha8275b7ba94cb459Ewrite>>_ZN5gimli4read6reader6Reader7read_i817h8f3e5fa820547b19Eread_i8>_ZN59_$LT$usize$u20$as$u20$gimli..read..reader..ReaderOffset$GT$7from_u817h781afc815540d2e6Efrom_u8_ZN5alloc3vec12Vec$LT$T$GT$3new17h74bdba20476b3aecEnew, usize>>_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h5b5511bb63c50b5dEpush, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17ha37a06a3b359c5e6Egrow_amortized, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h1571698851b442fdEtry_reserve, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h3f41671ec3676d23E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h36d64016bd504f6bE_ZN4core5alloc6layout6Layout5array17h737c47a7ea253730Earray, usize>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h5d271b7b55939c18Eset_ptr, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h259137730e1591e1Ecapacity_from_bytes, usize>,alloc::alloc::Global>_ZN4core3ptr5write17h94cdfa49fd649774Ewrite, usize>>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17hf8e800bb26b2a4e7Einto_result,gimli::read::Error>_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17hb79aeae31b6d83a6E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h10672b80c4ef1da2Enext_ZN5gimli4read4line18parse_directory_v517h93d6cc7c9ba36c3bEparse_directory_v5>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h1ad7041246cbd87cEinto_result, usize>,gimli::read::Error>_ZN65_$LT$gimli..constants..DwLnct$u20$as$u20$core..cmp..PartialEq$GT$2eq17h166c62d16ed35d73E_ZN4core6option15Option$LT$T$GT$6unwrap17h3dc93fd456ae9c5aEunwrap, usize>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h3e7f3b2c9ac28e08Eoffset, usize>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17hbc7f17a64b2be2f9Eadd, usize>>_ZN5alloc3vec12Vec$LT$T$GT$3new17h38ca7ebf87489b08Enew, usize>>_ZN4core6option15Option$LT$T$GT$3map17h061fb04980ffe25bEmap,gimli::read::line::FileEntry, usize>,closure-0>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17hc9f6da11eeecf366Einto_result, usize>,gimli::read::Error>_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17hfaf470d3a64cd598Epush, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17hef5b52cefee08762Egrow_amortized, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h96fa7f0ad78ddf4cEtry_reserve, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17hc92b633e226642bdE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17he32b82228617f7a9E_ZN4core5alloc6layout6Layout5array17hcce0d260d8dbd10cEarray, usize>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17haecb0afdb430576aEset_ptr, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h78b6fb55f09b59ebEcapacity_from_bytes, usize>,alloc::alloc::Global>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h29958a9f2e9b556bEoffset, usize>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17ha781030dc8924ce3Eadd, usize>>_ZN4core3ptr5write17he016250acd8e8db7Ewrite, usize>>_ZN5gimli4read4line13parse_file_v517hbbb691d986cb4990Eparse_file_v5>_ZN5gimli4read6reader6Reader13read_u8_array17hc283d893f988f38dEread_u8_array,[u8; 16]>_ZN4core7convert3num63_$LT$impl$u20$core..convert..From$LT$u8$GT$$u20$for$u20$u64$GT$4from17h3f51adb2056abbbcE_ZN4core7convert3num64_$LT$impl$u20$core..convert..From$LT$u16$GT$$u20$for$u20$u64$GT$4from17h8f9459af7350ae6eE_ZN4core7convert3num64_$LT$impl$u20$core..convert..From$LT$u32$GT$$u20$for$u20$u64$GT$4from17hd3b961643acf40d1E_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hee351212ee27c096Eas_mut_ptr_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17hd9ffa4c2b25aefd6Ederef_mut_ZN5alloc5slice10merge_sort17h19d282fb10f2b53eEmerge_sort_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11sort_by_key17hde8148a8b6d1eeb3Esort_by_key_ZN4core10intrinsics19copy_nonoverlapping17h8aa1ae520b8c2e0cEcopy_nonoverlappinginsert_head_ZN91_$LT$alloc..slice..insert_head..InsertionHole$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hd927005e7068b388Edrop_ZN4core3ptr89drop_in_place$LT$alloc..slice..insert_head..InsertionHole$LT$addr2line..UnitRange$GT$$GT$17h6d8864e2f534cdcbEdrop_in_place>_ZN5alloc5slice11insert_head17h41c784d385835a73Einsert_head_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h6793dce8d26f0626Eindex_mut_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hf265a340ae3eee73Eindex_mut>sort_by_key_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11sort_by_key28_$u7b$$u7b$closure$u7d$$u7d$17he9fcf4c6d8a27366E{{closure}}_ZN4core3ptr4read17h11e142ed5b2597d6Eread_ZN4core5alloc6layout6Layout5array17hc881507417cf249eEarray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h2e89c7fe284bad75Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h2afcd568869aa44aEwith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h3c376ed5a6b25096E_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h7964e3c67edbc43eEwith_capacity_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h053de756e85e31a6Ecapacity_from_bytes_ZN5alloc3vec12Vec$LT$T$GT$3new17h75c4332e711b12feEnew_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17heaeffa116be2437aE_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hbeefa20d97d4b89fEindex_mut>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$7reverse17hdf131e5f7799a958Ereverse_ZN4core3ptr4swap17h4e654a2ccbb5fdafEswap_ZN4core10intrinsics4copy17h82dfe740e272a812Ecopy_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h7fb3fa1c66389c79Epush_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hca9693bbee24606dEas_mut_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h541b763c4a4f0b2cEgrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h78974dd5b7ab52f4Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17hb4a603f2f53fbdacE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h79233c8d10b47a7dE_ZN4core5alloc6layout6Layout5array17h9dcc9d78c9dbb305Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h0e0a7c4ec14cf29dEset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h94f1c19d7535495eEcapacity_from_bytes_ZN4core3ptr5write17h933ec4ee9c65ee14Ewritemerge_sort_ZN5alloc5slice10merge_sort8collapse17ha6209c6380837627Ecollapse_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17h4da6d2a92e669d2aEas_ptr_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17ha54f9a7bded1f587Ederefmerge_ZN81_$LT$alloc..slice..merge..MergeHole$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hba372fe314afd1edE_ZN4core3ptr79drop_in_place$LT$alloc..slice..merge..MergeHole$LT$addr2line..UnitRange$GT$$GT$17h4eee40b592bfac0bEdrop_in_place>_ZN5alloc5slice5merge17h0d35b2e7f1ba8fe5Emerge_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h0505ca07844c8283Eoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h2ddbf39fb8761aafEadd_ZN5alloc3vec16Vec$LT$T$C$A$GT$6remove17hdb06d1c0447510f0Eremove_ZN4core10intrinsics4copy17hfbcc83ccda6e26adEcopy_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h31e2b929a65c5e93Eindex_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hc53e22a0044e7e52Eindex_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17h086cef1b9d264c03Eindex_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hf6e3c21af9a62f6aEoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h2be802b6dfe2a2b9Eadd_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h0b95f84d971fee08Eget_unchecked_mut_ZN5alloc5slice5merge17get_and_increment17ha5bab36007d333ccEget_and_increment_ZN4core3ptr73drop_in_place$LT$alloc..vec..Vec$LT$alloc..slice..merge_sort..Run$GT$$GT$17hd5b9f6d26f33f086Edrop_in_place>_ZN94_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hd2ad6d2bda0a4af0Enext_ZN4core3cmp6max_by17h656b7ab733fa36a8Emax_by core::cmp::Ordering>_ZN4core3cmp3Ord3max17h81c570894d9ff81cEmax_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hd6af171ef736f5a2Efrom_error>,gimli::read::Error>LazyCell_ZN9addr2line4lazy17LazyCell$LT$T$GT$11borrow_with17h6b6f6c7b8fc72d9dEborrow_with,closure-0>_ZN5alloc3vec12Vec$LT$T$GT$3new17h3f56521404522275Enewparse_lines_ZN9addr2line16ResUnit$LT$R$GT$11parse_lines28_$u7b$$u7b$closure$u7d$$u7d$17h9a684d6ab7076e59E_ZN5alloc3vec12Vec$LT$T$GT$3new17h6b7e8530c9eb7304Enew_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17hea6e4577a91c329aEderef_ZN67_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h9d02762d73483f05Eclone_ZN93_$LT$gimli..read..line..LineProgramHeader$LT$R$C$Offset$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h6efa8aedd9a17380Eclone,usize>_ZN97_$LT$gimli..read..line..IncompleteLineProgram$LT$R$C$Offset$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hda7a34a9008e77eaEhack_ZN52_$LT$T$u20$as$u20$alloc..slice..hack..ConvertVec$GT$6to_vec17hcefb736305381546Eto_vec_ZN5alloc5slice4hack6to_vec17h7894b56a779543ddE_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$9to_vec_in17h709518bca52a5f11Eto_vec_in_ZN4core10intrinsics19copy_nonoverlapping17ha503ce9d132ea4cfEcopy_nonoverlapping_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$22copy_to_nonoverlapping17haf632b8a7117bc59Ecopy_to_nonoverlapping_ZN5alloc3vec16Vec$LT$T$C$A$GT$7set_len17hb0ddcd9a5950a4bfEset_len_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17he89a36b3c972136aEderef, usize>,alloc::alloc::Global>_ZN67_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h62456feecda973a1Eclone, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h01308baf42b82007Eallocate_in, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h1ad61cbfa380189bEwith_capacity_in, usize>,alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17hd3a95e5fd4bd5badE_ZN52_$LT$T$u20$as$u20$alloc..slice..hack..ConvertVec$GT$6to_vec17h6150a60383e35ffdEto_vec, usize>,alloc::alloc::Global>_ZN5alloc5slice4hack6to_vec17he92b0e7336fa84efE_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$9to_vec_in17h46952f7be4ecc181Eto_vec_in, usize>,alloc::alloc::Global>_ZN4core10intrinsics19copy_nonoverlapping17hb6d6b48ec2337453Ecopy_nonoverlapping, usize>>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$22copy_to_nonoverlapping17h10bc82be15586b32Ecopy_to_nonoverlapping, usize>>_ZN5alloc3vec16Vec$LT$T$C$A$GT$7set_len17hdda5230ad3b5d2a1Eset_len, usize>,alloc::alloc::Global>_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h3722fba390e29e6fEderef, usize>,alloc::alloc::Global>_ZN67_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h4d85481832995e4dEclone, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17ha717673ee11957cfEallocate_in, usize>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h3465831d8bb28cbbEwith_capacity_in, usize>,alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17hd30e0e88509d4957E_ZN52_$LT$T$u20$as$u20$alloc..slice..hack..ConvertVec$GT$6to_vec17hc6dd41663b567addEto_vec, usize>,alloc::alloc::Global>_ZN5alloc5slice4hack6to_vec17hc3cb1b496cda61d1E_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$9to_vec_in17h31b9f2a161ad6c46Eto_vec_in, usize>,alloc::alloc::Global>_ZN4core10intrinsics19copy_nonoverlapping17hdb16a81eb60ca337Ecopy_nonoverlapping, usize>>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$22copy_to_nonoverlapping17h0bd840847a9d0722Ecopy_to_nonoverlapping, usize>>_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h614b28321e0e581aEclone, usize>>_ZN85_$LT$gimli..read..line..FileEntry$LT$R$C$Offset$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h9d3998adc7920d79E_ZN4core5clone5Clone5clone17h1faef7f418ed5116Eclone<[u8; 16]>IncompleteLineProgram_ZN5gimli4read4line39IncompleteLineProgram$LT$R$C$Offset$GT$4rows17h280f0211fe9438c2Erows,usize>LineRows_ZN5gimli4read4line36LineRows$LT$R$C$Program$C$Offset$GT$3new17hf6f7b996588d609bEnew,gimli::read::line::IncompleteLineProgram, usize>,usize>_ZN5gimli4read4line36LineRows$LT$R$C$Program$C$Offset$GT$8next_row17h664e17b8fb298b70Enext_row,gimli::read::line::IncompleteLineProgram, usize>,usize>_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h4be269f542c3be1aEpush_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h32e3da2249f995daEoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17ha7c5dddc4179d75cEadd_ZN4core3ptr5write17h960f35583f081ee8EwriteLineRow_ZN5gimli4read4line7LineRow5reset17h3ddc5ce9aaf647ecEreset>_ZN5gimli4read4line7LineRow3new17h381f612d0fac25f0ELineInstructions_ZN5gimli4read4line25LineInstructions$LT$R$GT$16next_instruction17h91c12f47d900d3f5Enext_instruction>LineInstruction_ZN5gimli4read4line33LineInstruction$LT$R$C$Offset$GT$5parse17h5ab6587c4d50c426E_ZN5gimli4read4line7LineRow7execute17he2c6e2f6ac6072eeEexecute,gimli::read::line::IncompleteLineProgram, usize>>_ZN5gimli4read4line7LineRow23apply_operation_advance17h9f5de69b9a909becEapply_operation_advance>_ZN4core3num21_$LT$impl$u20$u64$GT$12wrapping_mul17h01b76fa10bf24c22Ewrapping_mulwrapping_ZN82_$LT$core..num..wrapping..Wrapping$LT$u64$GT$$u20$as$u20$core..ops..arith..Mul$GT$3mul17hc57785eb65949841E_ZN88_$LT$core..num..wrapping..Wrapping$LT$u64$GT$$u20$as$u20$core..ops..arith..AddAssign$GT$10add_assign17hbefc4a186a92590dEadd_assign_ZN4core3num21_$LT$impl$u20$u64$GT$12wrapping_div17h324dc295cd9bd157Ewrapping_div_ZN82_$LT$core..num..wrapping..Wrapping$LT$u64$GT$$u20$as$u20$core..ops..arith..Div$GT$3div17h1658e7192c5ff69cE_ZN5gimli4read4line7LineRow13adjust_opcode17h96d90b8f63c1656fEadjust_opcode>_ZN127_$LT$gimli..read..line..IncompleteLineProgram$LT$R$C$Offset$GT$$u20$as$u20$gimli..read..line..LineProgram$LT$R$C$Offset$GT$$GT$8add_file17hc99d8b5691839233Eadd_file,usize>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h30db5cfe5c5b5841Eas_mut_ptr, usize>,alloc::alloc::Global>_ZN5gimli4read4line7LineRow19exec_special_opcode17h271e8f316667b846Eexec_special_opcode>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hc27e1ec70a0920a0Efrom_error, usize>,gimli::read::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h791feea077384aa1Einto_result, usize>, &gimli::read::line::LineRow)>,gimli::read::Error>_ZN5gimli4read4line7LineRow12end_sequence17hd4d2322716dfadc5Eend_sequence_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h8c756c71444eebd5Ederef_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$5first17h39f21fb246027d02Efirst_ZN4core6option15Option$LT$T$GT$3map17hc52032a537e808d9Emap<&addr2line::LineRow,u64,closure-0>_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17hba4884e233e8b924Eas_ptr_ZN4core10intrinsics19copy_nonoverlapping17h97f8357386f259a8Ecopy_nonoverlapping>_ZN4core3ptr23swap_nonoverlapping_one17h90fcf0af7defe83eEswap_nonoverlapping_one>_ZN4core3mem4swap17h79cb09920de84bc4Eswap>_ZN4core3ptr5write17h69299dc2813c23bbEwrite>_ZN5alloc3vec16Vec$LT$T$C$A$GT$13shrink_to_fit17h00a6d03d84ca8ab9Eshrink_to_fit_ZN5alloc3vec16Vec$LT$T$C$A$GT$16into_boxed_slice17he4f7eb9699e3897fEinto_boxed_slice_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hb5742270b9dd738aEcurrent_memory_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$6shrink17h862a52f56cf2318bEshrink_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13shrink_to_fit17h55adaacca970ecc7E_ZN63_$LT$alloc..alloc..Global$u20$as$u20$core..alloc..Allocator$GT$6shrink17hd77b47ac153d5b3dEshrink_ZN4core6result19Result$LT$T$C$E$GT$7map_err17hdbee524b8e0bad23Emap_err,core::alloc::AllocError,alloc::collections::TryReserveError,closure-0>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h29ba140aff95db57Eas_mut_ptr_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17hfb95569c949d1a15Ederef_mut_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8last_mut17h82b423ee54f14198Elast_mut_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h0e729efe4f8ab5ecEpush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17ha49a46b8b1447043Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h7e921a385fe49755Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h75c37f0c4eb4c939E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h7a541ac7dfd3e429E_ZN4core5alloc6layout6Layout5array17h691ba3e603537167Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h78d26b87210ae24fEgrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17hd6cfe6998492fd52Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h3f8fb42693854b2dE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h65609aa9ab2ab139E_ZN4core5alloc6layout6Layout5array17h97049dd5555a0632Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hdf5fc90686bb1bbbEset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17hdd6db3cfcfcc6e2eEcapacity_from_bytes_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hb378e50e29e30242Eset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17hbe9701d8e376fce3Ecapacity_from_bytes_ZN4core3ptr5write17h69e0c6ecbf2160b1Ewrite_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h4cab81efd046931aEderef_mut_ZN5alloc5slice10merge_sort17hcc7d0d48c36a7899Emerge_sort_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11sort_by_key17ha15abc386801a3e9Esort_by_key_ZN4core10intrinsics19copy_nonoverlapping17hfedb229b2cd59665Ecopy_nonoverlapping_ZN91_$LT$alloc..slice..insert_head..InsertionHole$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h7ac2711e264a1db5Edrop_ZN4core3ptr92drop_in_place$LT$alloc..slice..insert_head..InsertionHole$LT$addr2line..LineSequence$GT$$GT$17hb37192c9109c655aEdrop_in_place>_ZN5alloc5slice11insert_head17h03b7a6bcd7d7577cEinsert_head_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h9dfa48ba270a6db4Eindex_mut_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h5951f2e6ed6c647bEindex_mut>_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11sort_by_key28_$u7b$$u7b$closure$u7d$$u7d$17he4b4cab968e89bfbE{{closure}}_ZN4core3ptr4read17hebbf2b42a260ac90Eread_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h788bb0f2655aafe5Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h6813a81101fbb56bEwith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h07d37b9de9b3e1e6E_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17hac684a92b9c51103Ewith_capacity_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h188ef046165ceadfE_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h55e617428ccdbb53Eindex_mut>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$7reverse17h52322eb79e27af2eEreverse_ZN4core3ptr4swap17hd9e5cc97d8cccce8Eswap_ZN4core10intrinsics4copy17ha1b2e60fa4fda2eeEcopy_ZN81_$LT$alloc..slice..merge..MergeHole$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h1bfdd2b52bac3bdfE_ZN4core3ptr82drop_in_place$LT$alloc..slice..merge..MergeHole$LT$addr2line..LineSequence$GT$$GT$17heb76d7c3d8260ae1Edrop_in_place>_ZN5alloc5slice5merge17heec6f1181b65390aEmerge_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17hb4737dfbfabdc240Eget_unchecked_mut_ZN5alloc5slice5merge17get_and_increment17hd0a7eb305024f772Eget_and_increment_ZN4core3ptr67drop_in_place$LT$alloc..vec..Vec$LT$addr2line..LineSequence$GT$$GT$17h2db6bbbaf0e5bd65Edrop_in_place>_ZN5alloc3vec12Vec$LT$T$GT$3new17h15bb76fb212b3e90Enew_ZN5gimli4read4line35LineProgramHeader$LT$R$C$Offset$GT$4file17hd289a495e4045bf8E_ZN4core6option15Option$LT$T$GT$6as_ref17h27b78d0601673ef4Eas_ref, usize>>_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17h2e0094ceab783e4fEget, usize>>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h1445b4c0831cc1a5Eget, usize>,usize>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h9208ce882fce8d22Einto_result_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h0d150541d2ea70d7Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h4fb735ad2228b304Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h3f04f22ca8bc07aaE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h913b4995d39e38baE_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17he65790a23c93905fEpush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h8179dcd1935f4ae1Eset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h982005e7a77b6544Ecapacity_from_bytes_ZN4core3ptr5write17h139be973c6b09d48Ewrite_ZN5alloc6string6String19from_utf8_unchecked17ha32fac468b7cf601Efrom_utf8_unchecked_ZN5alloc3str56_$LT$impl$u20$alloc..borrow..ToOwned$u20$for$u20$str$GT$8to_owned17h44f9ced6e6a11120Eto_owned_ZN76_$LT$alloc..string..String$u20$as$u20$core..convert..From$LT$$RF$str$GT$$GT$4from17hdb5a8990024067f8E_ZN4core5alloc6layout6Layout5array17h4c250ba9f837f9c0Earray_ZN5alloc3vec16Vec$LT$T$C$A$GT$13shrink_to_fit17h7f2e156d39a0a689Eshrink_to_fit_ZN5alloc3vec16Vec$LT$T$C$A$GT$16into_boxed_slice17hdc596ac76944e730Einto_boxed_slice_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$6shrink17h418a756f8da380a3Eshrink_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13shrink_to_fit17hccab552956f3aee3E_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h0ff20d480dd98ff1E_ZN4core3ptr65drop_in_place$LT$alloc..vec..Vec$LT$alloc..string..String$GT$$GT$17h890b198614ffe50aEdrop_in_place>_ZN4core3ptr275drop_in_place$LT$gimli..read..line..LineRows$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$gimli..read..line..IncompleteLineProgram$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$C$usize$GT$$GT$17haaf3091dd44be272Edrop_in_place, gimli::read::line::IncompleteLineProgram, usize>, usize>>_ZN4core3ptr62drop_in_place$LT$alloc..vec..Vec$LT$addr2line..LineRow$GT$$GT$17h0dcd6646d526c10fEdrop_in_place>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h3a52c112be382425Edrop_ZN4core3ptr69drop_in_place$LT$alloc..raw_vec..RawVec$LT$addr2line..LineRow$GT$$GT$17ha3cf96152b2ab1adEdrop_in_place>_ZN4core6option15Option$LT$T$GT$13get_or_insert17h53f1c668c89ccb12Eget_or_insert>_ZN4core6option15Option$LT$T$GT$18get_or_insert_with17h95c540d5298f3bbeEget_or_insert_with,closure-0>_ZN4core3ptr158drop_in_place$LT$core..option..Option$LT$core..result..Result$LT$addr2line..Lines$C$gimli..read..Error$GT$$GT$..get_or_insert..$u7b$$u7b$closure$u7d$$u7d$$GT$17hae569f5b47b22d7aE_ZN4core6result19Result$LT$T$C$E$GT$6as_ref17h8f2fb4cfcb4ece15Eas_ref_ZN4core6result19Result$LT$T$C$E$GT$7map_err17ha27b24c34e534425Emap_err,&gimli::read::Error,gimli::read::Error,fn(&gimli::read::Error) -> gimli::read::Error>_ZN57_$LT$gimli..read..Error$u20$as$u20$core..clone..Clone$GT$5clone17hc5de2b247060e819E_ZN4core3ops8function6FnOnce9call_once17h68627633b34ef4a1Ecall_once gimli::read::Error,(&gimli::read::Error)>_ZN5alloc3vec16Vec$LT$T$C$A$GT$13shrink_to_fit17h84f73de0c76e5541Eshrink_to_fit_ZN5alloc3vec16Vec$LT$T$C$A$GT$16into_boxed_slice17ha258ac160e79aed1Einto_boxed_slice_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$6shrink17h9936eccff75678f5Eshrink_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13shrink_to_fit17h680ff9d42be72be1E_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h09f6ca1b1508e8adEResUnit_ZN100_$LT$gimli..read..endian_slice..EndianSlice$LT$Endian$GT$$u20$as$u20$gimli..read..reader..Reader$GT$15to_string_lossy17hdfa09e149ed8dab0Eto_string_lossyborrowCow_ZN5alloc6borrow12Cow$LT$B$GT$10into_owned17h4b41aa473573affaEinto_owned_ZN5gimli4read4line35LineProgramHeader$LT$R$C$Offset$GT$9directory17had810645225039c1Edirectory,usize>_ZN5gimli4read4line27FileEntry$LT$R$C$Offset$GT$9directory17haa613e083b69332fE_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17haf971da14f3c0583Eget, usize>>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h569e762537ed7098Eget, usize>,usize>_ZN4core6option15Option$LT$T$GT$3map17h83238e6ad7414bd2Emap<&gimli::read::unit::AttributeValue, usize>,gimli::read::unit::AttributeValue, usize>,closure-0>_ZN4core6option19Option$LT$$RF$T$GT$6cloned17h315c5d562dce7495Ecloned, usize>>_ZN5alloc6string6String3new17hce28d6da2903f32cE_ZN52_$LT$T$u20$as$u20$alloc..slice..hack..ConvertVec$GT$6to_vec17h2eeb32c6c1d6d4b2E_ZN5alloc5slice4hack6to_vec17hf99491fcf615ee6aE_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$9to_vec_in17hab447a30a84027caEto_vec_in_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$6to_vec17h7a421bae1520c47cEto_vec_ZN5alloc5slice64_$LT$impl$u20$alloc..borrow..ToOwned$u20$for$u20$$u5b$T$u5d$$GT$8to_owned17h4cdffaf5a142972bEto_owned_ZN4core6option15Option$LT$T$GT$3map17hc4dc739fadf5e738Emap,gimli::read::unit::AttributeValue, usize>,fn(gimli::read::endian_slice::EndianSlice) -> gimli::read::unit::AttributeValue, usize>>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17hd183506dc633700bEinto_result,gimli::read::Error>_ZN71_$LT$alloc..borrow..Cow$LT$B$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h30eb13c70d9b13e0Ederef_ZN77_$LT$alloc..borrow..Cow$LT$T$GT$$u20$as$u20$core..convert..AsRef$LT$T$GT$$GT$6as_ref17hde9d556cf4c3c40aEas_ref_ZN4core3ptr50drop_in_place$LT$alloc..borrow..Cow$LT$str$GT$$GT$17h3515f40017ff1df3Edrop_in_place>_ZN5gimli4read4line27FileEntry$LT$R$C$Offset$GT$9path_name17h4a772ec4a6f16eaeEpath_name,usize>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$22copy_to_nonoverlapping17ha4857a513c7373ffEcopy_to_nonoverlapping_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h9dc2661598254a77Einto_result,gimli::read::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h57ab09f5bc79dc2bEfrom_error,gimli::read::Error>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17h4fff4646d98f3135Ebinary_search_byfind_location_ZN9addr2line16ResUnit$LT$R$GT$13find_location28_$u7b$$u7b$closure$u7d$$u7d$17hcbc81c575f73d7b5E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17hfb7d9354a3e083d2Ebinary_search_by_ZN9addr2line16ResUnit$LT$R$GT$13find_location28_$u7b$$u7b$closure$u7d$$u7d$17h5e6c1dc205a3356dE_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17h368b3a15fc55cef3Eget_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h4f693d7358750479Eget_ZN4core6option15Option$LT$T$GT$3map17h41b7da1033c5decaEmap<&alloc::string::String,&str,fn(&alloc::string::String) -> &str>_ZN5alloc6string6String6as_str17hc512f7c7780e8d25Eas_str_ZN4core3ops8function6FnOnce9call_once17h11ebc3ac12acfb18Ecall_once &str,(&alloc::string::String)>_ZN60_$LT$core..cmp..Ordering$u20$as$u20$core..cmp..PartialEq$GT$2eq17ha682d8ac372eb792E_ZN5gimli4read4unit19EntriesRaw$LT$R$GT$11next_offset17h931efea443ce6113Enext_offset>_ZN5gimli6common6Format19initial_length_size17h0cd8dce6d03b575dEinitial_length_size_ZN5gimli4read4unit28UnitHeader$LT$R$C$Offset$GT$21length_including_self17hf24f306d0c785af9Elength_including_self,usize>_ZN5gimli4read4unit28UnitHeader$LT$R$C$Offset$GT$11header_size17h29b159d7bc060de5Eheader_size,usize>_ZN47_$LT$usize$u20$as$u20$core..ops..arith..Sub$GT$3sub17h0ed811593b6c7cf0E_ZN9addr2line17Function$LT$R$GT$4skip17h0675de6d708bdc60Eskip>InlinedFunction_ZN9addr2line24InlinedFunction$LT$R$GT$5parse17h6d145d6359769173E_ZN4core6option15Option$LT$T$GT$7is_some17h3a347aa31a661cf4Eis_some>_ZN4core6option15Option$LT$T$GT$7is_none17h4db8001c2a2aacf6Eis_none>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h37202aba944587ddEinto_result>,gimli::read::Error>_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h453874a6fa90f815Epush>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h3f80396ef27333c2Egrow_amortized>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h7bb1581b885076c5Etry_reserve>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h7c7af98090a84be9E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h1cf0c5321c50fa5fE_ZN4core5alloc6layout6Layout5array17hd537c2b3ca9513bdEarray>>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hb00c60df0ec14180Eas_mut_ptr>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h32ac0a02f8cf537dEcapacity_from_bytes>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h96bbb67e50091828Eset_ptr>,alloc::alloc::Global>_ZN4core3ptr5write17h6d7afdb43c45456aEwrite>>_ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range17h596e2e13575a7782E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hc9ca8c5d37f4ccc0Efrom_error>,gimli::read::Error>parse_ZN9addr2line18Functions$LT$R$GT$5parse28_$u7b$$u7b$closure$u7d$$u7d$17h54de4511b1acac41E_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h66ca613d9109974aEpush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17he80b36d8cdcabcb1Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h846b9016e77642e4Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h0ec0b0282d14023cE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h7d494ba144674f72E_ZN4core5alloc6layout6Layout5array17h399e3ba63877d9ebEarray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17hff10ba4afb9213ffEcurrent_memory_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h947ca01bf0ef01cbEas_mut_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h1f566d972fdcfc40Ecapacity_from_bytes_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h631a600ddc7a8e43Eset_ptr_ZN4core3ptr5write17h96f0a42f750a243cEwritefor_each_rangefrom_dwarf_ZN9addr2line16Context$LT$R$GT$10from_dwarf28_$u7b$$u7b$closure$u7d$$u7d$17h7bff8f9db3136de9E_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h1b85eb5087b91ae3Epush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17hd700a6ae90ce2030Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h966b604bfe1640a6Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h95d2d24711c0afdcE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h559a309091347709E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h64cb7e6086fb4c30Eset_ptr_ZN4core3ptr5write17h12a683e7765d0735Ewrite_ZN9addr2line24InlinedFunction$LT$R$GT$5parse28_$u7b$$u7b$closure$u7d$$u7d$17ha99a8f81afa3d1baE_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17ha40a08b06da7ae46Epush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17hf9446f3d726e5ceeEgrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h6755d1662042ee5bEtry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h38bd947c03696895E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h883510a29e24bd4aE_ZN4core5alloc6layout6Layout5array17h8f6b1c6d43e3dd10Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h0070d6de73f4f122Ecurrent_memory_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h6dd0d5c93fd578a9Eas_mut_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h87548f30865947a7Eset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17hfd23083299b9fe0aEcapacity_from_bytes_ZN4core3ptr5write17h66515788a2321af8Ewrite_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17hab78d770c1f8f7a1Ebinary_search_by>,closure-0>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key17he6d32543bf35229eEbinary_search_by_key>,usize,closure-0>binary_search_by_key_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key28_$u7b$$u7b$closure$u7d$$u7d$17h3422a1078877af69E{{closure}}>,usize,closure-0>_ZN5gimli4read4unit28UnitHeader$LT$R$C$Offset$GT$15is_valid_offset17h6b87e974bdfcb707Eis_valid_offset,usize>_ZN5gimli4read4unit28UnitHeader$LT$R$C$Offset$GT$10range_from17h7d5c036e983d6f6dErange_from,usize>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h7db5cde3e9b11f03Efrom_error>,gimli::read::Error>localfast_ZN3std6thread5local4fast12Key$LT$T$GT$17try_register_dtor17h465d43561d16bab6Etry_register_dtor>>_ZN4core10intrinsics19copy_nonoverlapping17h2dd29412e94a82daEcopy_nonoverlapping_ZN4core3ptr23swap_nonoverlapping_one17h34bbb7ab3f5f5a47Eswap_nonoverlapping_one_ZN4core3mem4swap17h0b15bf1a7f61c1a4Eswap_ZN4core3mem7replace17hed314894c00423a3Ereplace_ZN4core4cell13Cell$LT$T$GT$7replace17hf47517d7086be3bbE_ZN4core4cell13Cell$LT$T$GT$3set17h8248d79d70eca2e2Eset_ZN4core3ptr25swap_nonoverlapping_bytes17hca87fb40e27d4957Eswap_nonoverlapping_bytes_ZN4core3ptr19swap_nonoverlapping17h34265b18658599f4Eswap_nonoverlapping>>>_ZN4core3ptr23swap_nonoverlapping_one17h8abfad44e96e0bbbEswap_nonoverlapping_one>>>_ZN4core3mem4swap17he2723afaaa2b2ed1Eswap>>>_ZN4core3mem7replace17hc2483bae875b91b6Ereplace>>>LazyKeyInner_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$10initialize17h9d716ecfec94bf8eE_ZN4core3ptr144drop_in_place$LT$core..option..Option$LT$core..cell..RefCell$LT$core..option..Option$LT$std..sys_common..thread_info..ThreadInfo$GT$$GT$$GT$$GT$17ha89247b509b2e95eEdrop_in_place>>>_ZN4core3ptr89drop_in_place$LT$core..option..Option$LT$std..sys_common..thread_info..ThreadInfo$GT$$GT$17h4873d45ffd583255Edrop_in_place>_ZN4core3ptr119drop_in_place$LT$core..cell..UnsafeCell$LT$core..option..Option$LT$std..sys_common..thread_info..ThreadInfo$GT$$GT$$GT$17h2735d5828db365f6Edrop_in_place>>_ZN4core3ptr116drop_in_place$LT$core..cell..RefCell$LT$core..option..Option$LT$std..sys_common..thread_info..ThreadInfo$GT$$GT$$GT$17hca9e470b59f4c9f1Edrop_in_place>>_ZN4core10intrinsics19copy_nonoverlapping17h145b4b2ef6c10265Ecopy_nonoverlapping>>_ZN4core3ptr23swap_nonoverlapping_one17h1288fa0762ae449cEswap_nonoverlapping_one>>_ZN4core3mem4swap17hf830faed2ae1270dEswap>>_ZN4core3mem7replace17h2fc844aa19e0a43eEreplace>>_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$10initialize17h2c0c3d3fc3cceee8Erand_ZN3std3sys4unix4rand19hashmap_random_keys17h236181ccaf2c6a9aEhashmap_random_keysKEYS_ZN3std11collections4hash3map11RandomState3new4KEYS6__init17h8366022530c884c5E__init_ZN4core3ops8function6FnOnce9call_once17h7aa58a9e0a6e98adEcall_once core::cell::Cell<(u64, u64)>,()>_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$10initialize17hfebb3f95a5d4d2b2E_ZN4core4sync6atomic11atomic_load17h74d87c873ed05faeEatomic_load_ZN4core4sync6atomic10AtomicBool4load17h98755e393c876abeE_ZN3std3sys4unix4rand3imp20getrandom_fill_bytes17h530b7053dee22a0dEgetrandom_fill_bytes_ZN3std3sys4unix4rand3imp10fill_bytes17h96a1709e2f775696E_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h7ab4641ca28dc212Eget_unchecked_mut_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h8db905f53b3da697E_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17hd1f8fbf095de9e5bEindex_mut_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hc518534fcfbc8c99Eindex_mut>weak_ZN3std3sys4unix4weak13Weak$LT$F$GT$3get17hd2e58277e585e9b3Eget isize>getrandom_ZN3std3sys4unix4rand3imp9getrandom9getrandom17h7ff441abf3169fadE_ZN3std3sys4unix4rand3imp9getrandom17h0ab73c9ec1d336aaE_ZN3std3sys4unix2os5errno17h8d690244d9c348afEerrnoFile_ZN3std2fs4File4open17h5201cffb428d8785Eopen<&str>OpenOptions_ZN3std2fs11OpenOptions4open17h1594e4536e8ac92bEopen<&std::path::Path>_ZN4core6result19Result$LT$T$C$E$GT$6expect17hda6be4d96e88a436Eexpect_ZN3std2io5error5Error13last_os_error17h110b148060ba1c94Elast_os_error_ZN3std3sys4unix3cvt17h04c4325f59352588EcvtFileDesc_ZN3std3sys4unix2fd8FileDesc4read17h3ddb3f850e0d0fd2E_ZN3std3sys4unix2fs4File4read17ha7a121aa34a54592E_ZN47_$LT$std..fs..File$u20$as$u20$std..io..Read$GT$4read17h15328a40933bb6e5E_ZN3std2io18default_read_exact17hfb6fea853976a6deEdefault_read_exact_ZN3std2io4Read10read_exact17h20ba70c2e84b6b42E_ZN3std2io5error5Error4kind17hefff5b2a13358e5aE_ZN66_$LT$std..io..error..ErrorKind$u20$as$u20$core..cmp..PartialEq$GT$2eq17h59f9984965c6e3b2E_ZN4core3ptr34drop_in_place$LT$std..fs..File$GT$17ha8658c0f4a71562aEdrop_in_place_ZN4core10intrinsics19copy_nonoverlapping17he67270df23bc5986Ecopy_nonoverlapping>>_ZN4core3ptr23swap_nonoverlapping_one17h392e9b74d8ca7331Eswap_nonoverlapping_one>>_ZN4core3mem4swap17h9b64fc5e75be8384Eswap>>_ZN4core3mem7replace17h08bb58bd165b3b6fEreplace>>_ZN3std5error161_$LT$impl$u20$core..convert..From$LT$$RF$str$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$4from17h3ca300a707f20ac0E_ZN50_$LT$T$u20$as$u20$core..convert..Into$LT$U$GT$$GT$4into17h13a87d9187261154Einto<&str,alloc::boxed::Box>_ZN3std2io5error5Error3new17h005755cdeec31155Enew<&str>_ZN5alloc5boxed12Box$LT$T$GT$3new17hd13f2576cd1f6d3fEnew_ZN3std5error175_$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$4from17h4a5ecb144abd209fE_ZN5alloc5boxed12Box$LT$T$GT$3new17ha015debfae229422Enew_ZN3std2io5error5Error4_new17h65d5b13b2733c1deE_ZN3std2io5error5Error17from_raw_os_error17h31b2f32460620cacEfrom_raw_os_error_ZN4core6result19Result$LT$T$C$E$GT$6expect17hb78f1fae6bec2240Eexpect<(),std::io::error::Error>_ZN3std6thread5local4fast12Key$LT$T$GT$17try_register_dtor17h3f3ef0b97b6862a3Etry_register_dtor>>>>>_ZN4core10intrinsics19copy_nonoverlapping17h3bf22ed53ebdc024Ecopy_nonoverlapping>>>>>>_ZN4core3ptr4read17h90ba9e8ffb951b88Eread>>>>>>_ZN4core3ptr23swap_nonoverlapping_one17hc9a64b3d62ec8660Eswap_nonoverlapping_one>>>>>>_ZN4core3mem4swap17hdb4b00fb3030f4f1Eswap>>>>>>_ZN4core3mem7replace17hae6b6808f6c6d13bEreplace>>>>>>_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$10initialize17hc7018f47dbc8a8ffE_ZN4core3ptr181drop_in_place$LT$core..option..Option$LT$core..cell..Cell$LT$core..option..Option$LT$alloc..sync..Arc$LT$std..sync..mutex..Mutex$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$$GT$$GT$$GT$$GT$17hc8e1fe3065f06d45Edrop_in_place>>>>>>_ZN4core3ptr159drop_in_place$LT$core..cell..UnsafeCell$LT$core..option..Option$LT$alloc..sync..Arc$LT$std..sync..mutex..Mutex$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$$GT$$GT$$GT$17h1d1c84702d8ad77fEdrop_in_place>>>>>_ZN4core3ptr153drop_in_place$LT$core..cell..Cell$LT$core..option..Option$LT$alloc..sync..Arc$LT$std..sync..mutex..Mutex$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$$GT$$GT$$GT$17h03b5066a10c1bdb9Edrop_in_place>>>>>_ZN4core3mem4take17h3bff77c316337af7Etake>>>_ZN4core6option15Option$LT$T$GT$4take17h14e645a031f1fe4cEtake>>_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$4take17h2552276b4f1bb6d8E_ZN4core3mem4drop17h48de0bce26187569Edrop>>>_ZN4core3mem4take17ha2df65d216056317Etake>>>>>>_ZN4core6option15Option$LT$T$GT$4take17h023855ae633f3d6cEtake>>>>>_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$4take17h6c6c42bcc6433e18E_ZN4core3mem4drop17hb3c37715f43dff52Edrop>>>>>>available_concurrency_ZN3std6thread21available_concurrency30available_concurrency_internal17h84c3a3b1f9cc7298Eavailable_concurrency_internal_ZN4core6option15Option$LT$T$GT$6as_ref17hdf7a98978276b616Eas_ref>>_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$3get17h62b3dde42204c2a2Eget>>_ZN3std6thread5local4fast12Key$LT$T$GT$3get17h3e8ec534b3fbf7faEget>,fn() -> core::cell::RefCell>>thread_infoTHREAD_INFO_ZN3std10sys_common11thread_info11THREAD_INFO7__getit17hdac5ff5fae2d2636E__getitLocalKey_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17he86d30e3d67286a8Etry_with>,closure-0,std::thread::Thread>ThreadInfo_ZN3std10sys_common11thread_info10ThreadInfo4with17h857ada018494cec8Ewith_ZN3std10sys_common11thread_info14current_thread17h3f5208460fe8b346Ecurrent_thread_ZN4core6option15Option$LT$T$GT$6expect17h29dc4ae5039a2dd9EexpectThread_ZN3std3sys4unix6thread6Thread9yield_now17h8fda19902d4e47b3Eyield_nowDuration_ZN4core4time8Duration11from_millis17h625596a92086ff51Efrom_millis_ZN3std3sys4unix6thread6Thread5sleep17h51ac3975724f640bEsleep_ZN3std6thread5sleep17h6d881850137657abE_ZN4core3cmp6min_by17h32d3e338143441c5Emin_by core::cmp::Ordering>_ZN4core3cmp3Ord3min17h493532e439020e2cEmin_ZN4core3cmp3min17h0c108e38751a7456E_ZN3std6thread7current17h8f3d15e092d195f0Ecurrent_ZN4core4sync6atomic10atomic_sub17h3c24406edb1f47c1Eatomic_subAtomicI32_ZN4core4sync6atomic9AtomicI329fetch_sub17h81e9688af1df564aEthread_parkerfutexParker_ZN3std10sys_common13thread_parker5futex6Parker4park17h791e3d4f5048d83eE_ZN3std3sys4unix5futex10futex_wait17h9a57344ede53feacEfutex_wait_ZN4core4sync6atomic23atomic_compare_exchange17h4c1d6fb241e17a68Eatomic_compare_exchange_ZN4core4sync6atomic9AtomicI3216compare_exchange17h279722dbc2bc382aEcompare_exchange_ZN3std6thread12park_timeout17h0259d91eca966c57Epark_timeout_ZN3std10sys_common13thread_parker5futex6Parker12park_timeout17h9e82f0c9efe6cf0fE_ZN3std3sys4unix5futex10futex_wait28_$u7b$$u7b$closure$u7d$$u7d$17hd3e21d4661933312E_ZN4core6option15Option$LT$T$GT$8and_then17hc3c843ed949ea4f3Eand_then_ZN4core4sync6atomic11atomic_swap17hf54bfd0a5eea75f8Eatomic_swap_ZN4core4sync6atomic9AtomicI324swap17h3c4dedc91d3a027bEswapThreadId_ZN4core6option15Option$LT$T$GT$3map17h4747b1693a280c34Emap_ZN50_$LT$T$u20$as$u20$core..convert..Into$LT$U$GT$$GT$4into17hdb8120a72a96d2fdEinto>_ZN64_$LT$T$u20$as$u20$std..ffi..c_str..CString..new..SpecIntoVec$GT$8into_vec17hacf893d0e536e449Einto_vec_ZN3std3ffi5c_str7CString3new17hccaed5fda0859d08E_ZN3std6thread6Thread3new28_$u7b$$u7b$closure$u7d$$u7d$17h373694e246afdf97E_ZN3std3ffi5c_str7CString4_new17h821894ffd57935dfE_ZN3std3sys4unix6memchr6memchr17ha9d66d483317bc7cE_ZN3std6memchr6memchr17hbcc2074b053268fbE_ZN3std6thread8ThreadId3new17h1f28b24051134e13E_ZN4core6option15Option$LT$T$GT$6unwrap17haf4004f43390f3b3Eunwrap_ZN5alloc4sync12Arc$LT$T$GT$3new17hcdf7c30622bc34d9Enew_ZN4core6result19Result$LT$T$C$E$GT$6expect17hcf82a6187861798bEexpect_ZN3std6thread6Thread5cname17he8ca1b2628247bd5Ecname_ZN4core6option15Option$LT$T$GT$6as_ref17h2796d55339f2892bEas_ref_ZN4core6option15Option$LT$T$GT$8as_deref17h9e7adfe0c085a0dfEas_deref_ZN69_$LT$alloc..sync..Arc$LT$T$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h7294ad29c1e2676eEderef_ZN4core6option15Option$LT$T$GT$3map17hc6fdbb299357a627Emap<&std::ffi::c_str::CString,&std::ffi::c_str::CStr,closure-0>as_deref_ZN4core6option15Option$LT$T$GT$8as_deref28_$u7b$$u7b$closure$u7d$$u7d$17hbc7c76d210ab00e0E{{closure}}CStr_ZN3std3ffi5c_str4CStr8to_bytes17h0ff3d5383f476e56E_ZN3std6thread6Thread4name28_$u7b$$u7b$closure$u7d$$u7d$17h2928fc68a5669e3cE_ZN4core6option15Option$LT$T$GT$3map17hf8b65e3355c8e5a0Emap<&std::ffi::c_str::CStr,&str,closure-0>_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hb028a762430bf646E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hd09e43387f53aaaeEindex>_ZN3std6thread6Thread2id17h641da4ffe52d2044E_ZN3std6thread6Thread4name17hdd8023a43f63262cE_ZN3std4sync4once4Once9call_once17h5f6e27884aa6431eEcall_onceLazilyResolvedCapture_ZN3std9backtrace21LazilyResolvedCapture5force17h555ac278e7a949aaE_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17he828132d15df6d78Ederef_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17h8abc3045f4a1c33cEindex,alloc::alloc::Global>_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h57031bb69e8be1c8Eindex_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h597f62277e3ff27fEindex>_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17h74953e80b7f0b817Eas_ptr_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h77c0d3174afbaca9E_ZN4core5slice4iter13Iter$LT$T$GT$3new17hab1fed8e95d6b8a8Enew_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hf5ff824c452654a2E_ZN4core5slice4iter87_$LT$impl$u20$core..iter..traits..collect..IntoIterator$u20$for$u20$$RF$$u5b$T$u5d$$GT$9into_iter17hf9adc86f7589a447Einto_iter_ZN4core3ptr8non_null16NonNull$LT$T$GT$13new_unchecked17h2e01b3d6ed85e00eEnew_uncheckedlibunwind_ZN3std12backtrace_rs9backtrace9libunwind5Frame2ip17h6a6c40f6d5dd0b59E_ZN3std12backtrace_rs9backtrace5Frame2ip17h1580b026973d8978ERawFrame_ZN3std9backtrace8RawFrame2ip17hec8945878fb8900cE_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h2f96abe37cf19208Ederef_ZN94_$LT$$RF$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17h0f98d1d28dedc4a6Einto_iter_ZN4core3fmt8builders9DebugList7entries17hb6bf9de1b340f4cbEentries<&std::backtrace::BacktraceSymbol,&alloc::vec::Vec>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0be092aa423743ecEnext_ZN4core3ptr8non_null16NonNull$LT$T$GT$13new_unchecked17hf487ed63caa86608Enew_unchecked_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h72bfce956023bbe6Epost_inc_start_ZN4core6option15Option$LT$T$GT$6as_ref17he7617e41f1fdd1cbEas_ref>_ZN4core6option15Option$LT$T$GT$3map17ha3ef561ed4fa66e9Emap<&alloc::vec::Vec,std::backtrace_rs::symbolize::SymbolName,closure-0>_ZN68_$LT$std..backtrace..BacktraceSymbol$u20$as$u20$core..fmt..Debug$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h7733271e5d42c04eESymbolName_ZN3std12backtrace_rs9symbolize10SymbolName3new17h814655ccff3c32b7E_ZN4core6result19Result$LT$T$C$E$GT$2ok17h816a46e2d776658dE_ZN4core6option15Option$LT$T$GT$8and_then17hc5f498a9fd2a821cEand_then<&str,rustc_demangle::Demangle,closure-0>_ZN3std12backtrace_rs9symbolize10SymbolName3new28_$u7b$$u7b$closure$u7d$$u7d$17h038dfc1075d31c6cE_ZN4core6result19Result$LT$T$C$E$GT$2ok17ha0911f31f6b1f8d7Eok_ZN4core3fmt9Arguments16new_v1_formatted17hea9b7cc0ecdfbe78Enew_v1_formatted_ZN4core6option15Option$LT$T$GT$6as_ref17h9ae8bb161a55f039Eas_refBacktrace_ZN3std9backtrace9Backtrace7enabled17hf4d6aa3d8cb35814Eenabled_ZN3std3env6var_os17hf63bd08b4eaf9b8fEvar_os<&std::ffi::os_str::OsStr>_ZN3std3env4_var17hf1857fa5af2391eaE_ZN3std3env3var17h98984f4536de8b93Evar<&str>_ZN3std10sys_common12os_str_bytes3Buf11into_string17h4d29975c5d1b736eEinto_stringOsString_ZN3std3ffi6os_str8OsString11into_string17hdf843dce05b577e3E_ZN5alloc6string6String9from_utf817h15f6f2b9f57f5ac4Efrom_utf8_ZN3std10sys_common12os_str_bytes3Buf11into_string28_$u7b$$u7b$closure$u7d$$u7d$17h643f830ca149833cE_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h29399ae3d57f3f09Emap_err_ZN4core6result19Result$LT$T$C$E$GT$7map_err17hf1f63b5788430599Emap_err_ZN4core6result19Result$LT$T$C$E$GT$7map_err17hc70c0bc2bbb5ba57Emap_err std::env::VarError>_ZN4core3str6traits54_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$str$GT$2eq17h611389dd1e2f7b34E_ZN4core3str6traits54_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$str$GT$2ne17hd08b3d58cd7383d7E_ZN77_$LT$alloc..string..String$u20$as$u20$core..cmp..PartialEq$LT$$RF$str$GT$$GT$2ne17hcf656d1ada1ed11eE_ZN4core3ptr39drop_in_place$LT$std..env..VarError$GT$17hf80174932cbbcb2dEdrop_in_place_ZN4core3ptr91drop_in_place$LT$core..result..Result$LT$alloc..string..String$C$std..env..VarError$GT$$GT$17h0e347e230b25bc4aEdrop_in_place>_ZN4core4sync6atomic12atomic_store17hc375d5cc3fec8e31Eatomic_store_ZN4core4sync6atomic11AtomicUsize5store17h2f6eb447d3bfbb5eE_ZN5alloc3vec12Vec$LT$T$GT$3new17h964566c74ff529cbE_ZN3std12backtrace_rs9backtrace9libunwind5trace17h5e9d00f0cdf4f57eE_ZN3std12backtrace_rs9backtrace20trace_unsynchronized17h5147748353e5f3cdEtrace_unsynchronized_ZN5alloc3vec16Vec$LT$T$C$A$GT$8is_empty17h33d719ce7df2ec88Eis_empty_ZN4core6option15Option$LT$T$GT$9unwrap_or17h3a63ebd27408cf07Eunwrap_or_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h402b2c96899ced8fEas_mut_ptr_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h3bcc93bf55a390caEdrop_ZN4core3ptr74drop_in_place$LT$alloc..vec..Vec$LT$std..backtrace..BacktraceFrame$GT$$GT$17hc6c55be5eef8b9ecEdrop_in_place>_ZN4core3ptr61drop_in_place$LT$$u5b$std..backtrace..BacktraceFrame$u5d$$GT$17h6eeb1a237b2e1d6cEdrop_in_place<[std::backtrace::BacktraceFrame]>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h435472caf17bff6fEcurrent_memory_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h9bc504593148440aE_ZN4core3ptr81drop_in_place$LT$alloc..raw_vec..RawVec$LT$std..backtrace..BacktraceFrame$GT$$GT$17h24790db624e757f7Edrop_in_place>_ZN85_$LT$std..backtrace_rs..backtrace..libunwind..Frame$u20$as$u20$core..clone..Clone$GT$5clone17hf8b55c0aad44618fE_ZN74_$LT$std..backtrace_rs..backtrace..Frame$u20$as$u20$core..clone..Clone$GT$5clone17heb635cbe1810277eE_ZN3std12backtrace_rs9backtrace9libunwind5Frame2sp17hbca4c5e9adda1c35Esp_ZN3std12backtrace_rs9backtrace9libunwind5Frame14symbol_address17h87408b3c2e84556fEsymbol_address_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h8e4e60e5988e8062Epush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h3005ce07b103d129Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h9198f1677b9aff8dEtry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17hffd818cba7a94cf3E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h5980c7e432c6999bE_ZN4core5alloc6layout6Layout5array17h27d217ac09d49c37Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hfcae6b9e952de941Eset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17he6b1f205ca421d6bEcapacity_from_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hd6aca0cd73c625d4Eoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h19d7b16c9a26d361Eadd_ZN4core3ptr5write17hbbb78f5043cc772bEwrite_ZN3std12backtrace_rs9backtrace5Frame14symbol_address17hf01013b76e70b5b1E_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17h552e8ae7bdc139b6Eindex_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17ha570246d1171a6c6E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h4818ed8b7e4d664fE_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h8b21a75c71e4c321Eget_unchecked_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h57b249ebe1f72aa7EBacktraceFmt_ZN3std12backtrace_rs5print12BacktraceFmt3new17h198f01c4c99f1e25E_ZN5alloc3vec16Vec$LT$T$C$A$GT$8is_empty17h2834860cecaec757Eis_empty_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17hc5d45e2ea047d9f8Eas_ptr_ZN4core6option15Option$LT$T$GT$3map17hf654dfe01677f4f0Emap<&alloc::vec::Vec,std::backtrace_rs::symbolize::SymbolName,closure-1>_ZN64_$LT$std..backtrace..Backtrace$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h061fcdac90601904E_ZN4core6option15Option$LT$T$GT$3map17h9fbcaf6904f338ebEmap<&std::backtrace::BytesOrWide,std::backtrace_rs::types::BytesOrWideString,closure-2>_ZN64_$LT$std..backtrace..Backtrace$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17hcda7b2137b0af1a3EBacktraceFrameFmt_ZN3std12backtrace_rs5print17BacktraceFrameFmt9print_raw17h76ab39cc44a57582Eprint_raw_ZN4core3ptr64drop_in_place$LT$std..backtrace_rs..print..BacktraceFrameFmt$GT$17hc8ebf68e942f783dEdrop_in_place_ZN4core6option15Option$LT$T$GT$3map17h141004e4200d57bfEmap,closure-0>Symbol_ZN3std12backtrace_rs9symbolize5gimli6Symbol12filename_raw17h407752b6d0a9800cEfilename_raw_ZN3std12backtrace_rs9symbolize6Symbol12filename_raw17h56b752f5085cc087E_ZN3std12backtrace_rs9symbolize5gimli6Symbol5colno17h36085b5acde8808dEcolno_ZN3std12backtrace_rs9symbolize6Symbol5colno17haf2c45f28aafc084E_ZN3std9backtrace7Capture7resolve28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h6d9ef2b4ed188b37E_ZN4core6option15Option$LT$T$GT$6as_ref17h9ce3d082784afcbbEas_ref_ZN3std12backtrace_rs9symbolize5gimli6Symbol6lineno17h9e9cc09768a2d3edElineno_ZN3std12backtrace_rs9symbolize6Symbol6lineno17h732aa9bae78c0c80E_ZN3std9backtrace7Capture7resolve28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h1c622c63b98cfa9cE_ZN4core6option15Option$LT$T$GT$3map17h6b26fc45956ad383Emap_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h06a02c73872d1532Epush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h1c2a1568cab97191Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17he493ad4473436eddEtry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h253cc46ab4a3684eE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17hfdbf38f799cde1b9E_ZN4core5alloc6layout6Layout5array17h95d7dfb59963ddf5Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17hd3888381e9adaca6Ecapacity_from_bytes_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hdbf22610c7a31f92Eset_ptr_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h6ddba37bf33e45e2Eoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17hda6e632471a4a160Eadd_ZN4core3ptr5write17hbf9b9297ef3bd1daEwritesip_ZN4core4hash3sip15Hasher$LT$S$GT$13new_with_keys17h4ebbcc65165a2e14Enew_with_keysSipHasher13_ZN4core4hash3sip11SipHasher1313new_with_keys17hddcf7e9b06ab0067Enew_with_keysDefaultHasher_ZN3std11collections4hash3map13DefaultHasher3new17h10b2f14afe8f9870E_ZN3std3sys4unix2os6getcwd17h9000a48c8dfd804fEgetcwd_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$7is_null17h2abcb8ad80b475f6Eis_null_ZN3std3ffi5c_str4CStr8from_ptr17h51ef834342db6a35Efrom_ptr_ZN5alloc3vec16Vec$LT$T$C$A$GT$13shrink_to_fit17h624ca3df08cd716fEshrink_to_fit_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$6shrink17hef8c34ce4e1de677Eshrink_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13shrink_to_fit17h932920c25d464178E_ZN4core6result19Result$LT$T$C$E$GT$7map_err17hdfb3d60e09c8647eE_ZN70_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..cmp..PartialEq$GT$2ne17h629856a04c774709Ene_ZN3std3sys4unix2os8env_lock17hc35fe250eb055643Eenv_lock_ZN3std3sys4unix2os3env17h3c724e2afd905862E_ZN5alloc3vec12Vec$LT$T$GT$3new17he36d0ae7bf61f23cEnew<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$13guaranteed_eq17hea63b31b600e8b10E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$7is_null17h51a5a2fd52caffb0Eis_null<*const i8>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$7is_null17h917779507efde208E_ZN3std3sys4unix2os3env5parse17h29c864b077b0ea76E_ZN4core6option15Option$LT$T$GT$3map17h040a987e06ad9028Emap_ZN3std3sys4unix2os3env5parse28_$u7b$$u7b$closure$u7d$$u7d$17h503579dc85333065E_ZN89_$LT$std..ffi..os_str..OsString$u20$as$u20$std..sys_common..os_str_bytes..OsStringExt$GT$8from_vec17h7e367b73342e32daEfrom_vec_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17he0b301543b3690a6Epush<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h1aa13a0d11eaf3d9Egrow_amortized<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h8ed03bc8264557b2Etry_reserve<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17hb730e7f784481fb5E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h2c9ad70f5a17f170E_ZN4core5alloc6layout6Layout5array17h699120214ff26450Earray<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h474c4256807be964Ecapacity_from_bytes<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h1650f96d353dc39bEset_ptr<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h82dcab3180123c7cEoffset<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h9c5036954980c43bEadd<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>_ZN4core3ptr5write17he11b25aa057c8f67Ewrite<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>_ZN90_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17h091fdda451dcf655Einto_iter<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN103_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h2f7923ae6359dc8fEnext<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN82_$LT$std..sys..unix..os..Env$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17he7261822492888a4E_ZN75_$LT$std..env..VarsOs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hc5fbff28182a394dE_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h94a3a04c06eea9d8E_ZN4core3ptr4read17h5c69d57146dfec55Eread<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>_ZN4core6option15Option$LT$T$GT$3map17hd43ea1c67c48a6f1Emap<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),(alloc::string::String, alloc::string::String),closure-0>_ZN73_$LT$std..env..Vars$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next28_$u7b$$u7b$closure$u7d$$u7d$17h0fc0527e2991b41fE_ZN4core6result19Result$LT$T$C$E$GT$6unwrap17hddc0b718320401a5Eunwrap_ZN82_$LT$std..sys..unix..os..Env$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h46046efee8dfe639Esize_hint_ZN75_$LT$std..env..VarsOs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h3a340a14480ddee2E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$11offset_from17h7059510f71f4762cEoffset_from<(std::ffi::os_str::OsString, std::ffi::os_str::OsString)>_ZN103_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h3e17597858f16bb3Esize_hint<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),alloc::alloc::Global>_ZN3std3ffi5c_str7CString3new17h66a0da8aa23c72a4Enew<&[u8]>_ZN3std3sys4unix2os6getenv17h0ae500d6c0142171Egetenv_ZN4core6result19Result$LT$T$C$E$GT$14unwrap_or_else17hb894e66ab568c2fbEunwrap_or_else,std::io::error::Error,closure-0>_var_os_ZN3std3env7_var_os28_$u7b$$u7b$closure$u7d$$u7d$17h4b9756c710021f4aE_ZN3std3sys4unix2os6setenv17hfecc821ab9dfad14E_ZN4core6result19Result$LT$T$C$E$GT$14unwrap_or_else17h23a413d0318a0d0dEunwrap_or_else<(),std::io::error::Error,closure-0>_ZN50_$LT$i32$u20$as$u20$std..sys..unix..IsMinusOne$GT$12is_minus_one17haafb0ab9bdecd629Eis_minus_one_ZN3std3sys4unix3cvt17hb59bd90cbd3bb0f3Ecvt_ZN4core6result19Result$LT$T$C$E$GT$3map17h271267a2f54cda8dEmap_set_var_ZN3std3sys4unix2os8unsetenv17h901e39dac58647adEunsetenv_ZN4core6result19Result$LT$T$C$E$GT$14unwrap_or_else17h26cf20b7cab07219E_remove_var_ZN96_$LT$core..slice..iter..Split$LT$T$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h4b10de8acff6628eEnext bool>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hafce60d33c521543Enext bool>,fn(&[u8]) -> std::path::PathBuf>_ZN89_$LT$std..sys..unix..os..SplitPaths$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hfddbc91f1a52c7e9E_ZN4core6option15Option$LT$T$GT$3map17hafc982434aa5e615Emap<&[u8],std::path::PathBuf,&mut fn(&[u8]) -> std::path::PathBuf>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hf4f47f18bfee52beE_ZN4core3ops8function5FnMut8call_mut17h85d7c856185d174aEcall_mut bool,(&u8)>_ZN96_$LT$core..slice..iter..Split$LT$T$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next28_$u7b$$u7b$closure$u7d$$u7d$17h500083715747b3feE{{closure}} bool>_ZN86_$LT$core..slice..iter..Split$LT$T$C$P$GT$$u20$as$u20$core..slice..iter..SplitIter$GT$6finish17h21372b976ec0c1dfEfinish bool>_ZN4core3ops8function5FnMut8call_mut17h724f3e95978d30d9Ecall_mut std::path::PathBuf,(&[u8])>_ZN4core3ops8function5impls80_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$9call_once17h2c69df62846cb560Ecall_once<(&[u8]),fn(&[u8]) -> std::path::PathBuf>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h535e782d52254011Esize_hint bool>,fn(&[u8]) -> std::path::PathBuf>_ZN89_$LT$std..sys..unix..os..SplitPaths$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h0672fb7aa083a6b1E_ZN96_$LT$core..slice..iter..Split$LT$T$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17hb762a154bd67cac5Esize_hint bool>_ZN73_$LT$std..sys..unix..os..JoinPathsError$u20$as$u20$core..fmt..Display$GT$3fmt17he902b134928c0ea2E_ZN3std3env6var_os17h4699dfa3f11efe56Evar_os<&str>_ZN3std3sys4unix2os8home_dir17h965c82b9ca093bf2Ehome_dir_ZN4core6option15Option$LT$T$GT$7or_else17h2cbef499983c2ed5Eor_else_ZN3std3sys4unix2os8home_dir8fallback17h98146e61e20da013E_ZN3std3sys4unix2os8home_dir28_$u7b$$u7b$closure$u7d$$u7d$17h1b94f77c7d015069E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h17fddefbe66df9c0Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h37f26ea3cfa21e39Ewith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h796d9f9fdceeea40E_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h087f4ae5e068e9b0Ewith_capacity_ZN4core10intrinsics11write_bytes17h9425ec7512b89e24Ewrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17h1692b4ac81c7e7c3E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17ha01231b809e6b289Ezeroed_ZN4core3mem6zeroed17hd7fcc99e16473b47E_ZN4core3ptr46drop_in_place$LT$alloc..vec..Vec$LT$i8$GT$$GT$17hccd7a2fe628fb220Edrop_in_place>_ZN4core6option15Option$LT$T$GT$3map17h21efb7dca9c23b5dEmap std::path::PathBuf>_ZN3std3sys4unix2os8temp_dir17h6a17c166a50284deEtemp_dir_ZN4core6option15Option$LT$T$GT$14unwrap_or_else17h810e2bce3a7ad7afEunwrap_or_else_ZN3std10sys_common12os_str_bytes5Slice8to_owned17h7d576718bdf58e89EOsStr_ZN3std3ffi6os_str5OsStr12to_os_string17h68aecf8fbdc8576eE_ZN71_$LT$std..path..PathBuf$u20$as$u20$core..convert..From$LT$$RF$T$GT$$GT$4from17hdef580c585dde262Efrom_ZN3std3sys4unix2os8temp_dir28_$u7b$$u7b$closure$u7d$$u7d$17h26fb2e1e7a9f40beE_ZN92_$LT$std..path..PathBuf$u20$as$u20$core..convert..From$LT$std..ffi..os_str..OsString$GT$$GT$4from17h80110b9d760bf0e7E_ZN3std2fs9read_link17h719b20dd678d8b79Eread_link<&str>_ZN3std3sys4unix2os11current_exe17h7bdb8b7e8997bec8Ecurrent_exe_ZN3std3sys4unix4args3imp5clone17h020c5da1c235f1a6E_ZN3std3sys4unix4args3imp4args17hb2d0598b3222027eE_ZN3std3sys4unix4args4args17h18019dd0ade77f0dE_ZN4core4sync6atomic11atomic_load17ha73812ba6a473d5aEatomic_loadAtomicIsize_ZN4core4sync6atomic11AtomicIsize4load17hb7d995c36ae5df17E_ZN4core3cmp5impls57_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$isize$GT$2lt17h292f38c47cbb0dd6E_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$9size_hint17hddea2d9adade197dEsize_hint_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17hb973bd906ec5e2e5Esize_hint,closure-0>spec_from_iter_nested_ZN111_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..spec_from_iter_nested..SpecFromIterNested$LT$T$C$I$GT$$GT$9from_iter17h6c48d6b0b3b432a0Efrom_iter, closure-0>>spec_from_iter_ZN98_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..spec_from_iter..SpecFromIter$LT$T$C$I$GT$$GT$9from_iter17h14c5f541a07f31e8E_ZN95_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..collect..FromIterator$LT$T$GT$$GT$9from_iter17h418f2b155691bf88Eiterator_ZN4core4iter6traits8iterator8Iterator7collect17h3d5a92fd4d277de6Ecollect, closure-0>,alloc::vec::Vec>_ZN4core5alloc6layout6Layout5array17h3d8781e187efba0eEarray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h5ba866d75395c6b7Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17haf059a557c057d4eEwith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h2a6a600aeea9150dE_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17hbba31bf693086429Ewith_capacity_ZN4core4sync6atomic11atomic_load17h4887c38e0ba4fae8Eatomic_load<*mut *const u8>AtomicPtr_ZN4core4sync6atomic18AtomicPtr$LT$T$GT$4load17hb483dbff91409032Eload<*const u8>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h62e572d1d4e6f2b4Ecapacity_from_bytes_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13needs_to_grow17h5ba3d00739aa9e26Eneeds_to_grow_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17hb46c54c7ee678cb5Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h3ae4bee47163abb6E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h86b3499e40e4b422E_ZN97_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$T$C$I$GT$$GT$11spec_extend17h1150e6a1a2a1bae8Espec_extend, closure-0>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17hd823940849f93429Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h53ba5f44a3f819b9Eset_ptr_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h864206075b891b63Eoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h63b0152ac703e07aEadd_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17h6e9c13320ae63395Efold,closure-0,(),closure-0>_ZN4core4iter6traits8iterator8Iterator8for_each17h6079dbe05e6333a8Efor_each, closure-0>,closure-0>_ZN4core4iter8adapters3map8map_fold17hd23385aa8098cc80Emap_fold_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17h0d6f272fb86a7b81Enext_ZN4core4iter6traits8iterator8Iterator4fold17h9dc1c9ccc60acae7Efold,(),closure-0>_ZN3std3sys4unix4args3imp5clone28_$u7b$$u7b$closure$u7d$$u7d$17hdd0a7538d3eff6c4Emap_fold_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17h16184db003d8efedE{{closure}}_ZN4core3ptr5write17h646272cf6a44f9b9E_ZN97_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$T$C$I$GT$$GT$11spec_extend28_$u7b$$u7b$closure$u7d$$u7d$17hdaa7c80fc4fb7736E{{closure}}, closure-0>,alloc::alloc::Global>call_ZN4core4iter6traits8iterator8Iterator8for_each4call28_$u7b$$u7b$closure$u7d$$u7d$17h025ecbff4d68969cE{{closure}}SetLenOnDrop_ZN5alloc3vec15set_len_on_drop12SetLenOnDrop13increment_len17h23f520490eecf638Eincrement_len_ZN4core3ptr646drop_in_place$LT$core..iter..adapters..map..map_fold$LT$isize$C$std..ffi..os_str..OsString$C$$LP$$RP$$C$std..sys..unix..args..imp..clone..$u7b$$u7b$closure$u7d$$u7d$$C$core..iter..traits..iterator..Iterator..for_each..call$LT$std..ffi..os_str..OsString$C$$LT$alloc..vec..Vec$LT$std..ffi..os_str..OsString$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$std..ffi..os_str..OsString$C$core..iter..adapters..map..Map$LT$core..ops..range..Range$LT$isize$GT$$C$std..sys..unix..args..imp..clone..$u7b$$u7b$closure$u7d$$u7d$$GT$$GT$$GT$..spec_extend..$u7b$$u7b$closure$u7d$$u7d$$GT$..$u7b$$u7b$closure$u7d$$u7d$$GT$..$u7b$$u7b$closure$u7d$$u7d$$GT$17hd7f0570fb33e2a07E_ZN90_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17hf8904df09da98649Einto_iter_ZN103_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17heeb47036f646391bEnext_ZN85_$LT$std..sys..unix..args..Args$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha96a1d47b62684edE_ZN75_$LT$std..env..ArgsOs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h54e27ff46518e1cbE_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h9cd2bccb289859a7E_ZN4core6option15Option$LT$T$GT$3map17h2544ef7b02dc8efbEmap_ZN73_$LT$std..env..Args$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next28_$u7b$$u7b$closure$u7d$$u7d$17h088fab1849b98369E_ZN85_$LT$std..sys..unix..args..Args$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h7b8710c2a6a3b24aE_ZN75_$LT$std..env..ArgsOs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h5795b7a4d515c3b2E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$11offset_from17h105d999007ea4325Eoffset_from_ZN103_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h56c9c59d80c27e30Esize_hint_ZN96_$LT$std..sys..unix..args..Args$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17hfcdf3330859331b8E_ZN86_$LT$std..env..ArgsOs$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17hd82defe00a1e8106E_ZN4core4iter6traits10exact_size17ExactSizeIterator3len17hb974cfd08e307173Elen>_ZN4core4iter6traits10exact_size17ExactSizeIterator8is_empty17h48217719cb6bb277Eis_empty_ZN86_$LT$std..env..ArgsOs$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$8is_empty17hbfb5e727c84f94d6Eis_empty_ZN118_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hc474de104cae1037Enext_back_ZN100_$LT$std..sys..unix..args..Args$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hcf8a4b246da852f8Enext_back_ZN90_$LT$std..env..ArgsOs$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hd071860f344eaec7E_ZN4core6option15Option$LT$T$GT$3map17h020c0f1806e689b4E_ZN88_$LT$std..env..Args$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back28_$u7b$$u7b$closure$u7d$$u7d$17h094f9554f347516eEArgs_ZN3std3sys4unix4args4Args11inner_debug17h7a2ea2351829a0dcEinner_debug_ZN5alloc3vec9into_iter21IntoIter$LT$T$C$A$GT$8as_slice17h36d884f59aebd327Eas_slice_ZN60_$LT$alloc..string..String$u20$as$u20$core..fmt..Display$GT$3fmt17hcece20dc22dd579dE_ZN3std5error129_$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$GT$$GT$4from17h1cf7a0fa9f4f656aE_ZN4core6option15Option$LT$T$GT$8and_then17hda08a3727e28c1deEand_then<&Error,&Error,fn(&Error) -> core::option::Option<&Error>>_ZN4core3ops8function6FnOnce9call_once17hbf5eb08a0bc4f60cEcall_once core::option::Option<&Error>,(&Error)>_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17hb1d449a341b031b0EindexFromVecWithNulError_ZN97_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..collect..Extend$LT$$RF$T$GT$$GT$6extend17h6ffa10ecaf25b525Eextend_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$17try_reserve_exact17hf91e0ee9be88e07aEtry_reserve_exact_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13reserve_exact17h1e31760662be8e7cE_ZN5alloc3vec16Vec$LT$T$C$A$GT$13reserve_exact17h77e5ed54490f7836E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$10grow_exact17h837a3e130ea365b8Egrow_exact_ZN5alloc3vec16Vec$LT$T$C$A$GT$16into_boxed_slice17h29e13951eaf5b252Einto_boxed_slice_ZN5alloc3vec16Vec$LT$T$C$A$GT$17from_raw_parts_in17hf9ad2952f9d98480Efrom_raw_parts_in_ZN5alloc5slice4hack8into_vec17h934fe66c8408f433Einto_vec_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8into_vec17h6b5313f71cd54c25E_ZN3std3ffi5c_str7CString10into_bytes17h7c7bfb043661a034Einto_bytes_ZN5alloc3vec16Vec$LT$T$C$A$GT$3pop17hbb9faec4e796d232Epop_ZN4core6result19Result$LT$T$C$E$GT$7map_err17hfe9295b486db4dc2Emap_err_ZN3std3ffi5c_str7CString11into_string28_$u7b$$u7b$closure$u7d$$u7d$17h8001e2f529aa3008E_ZN3std3ffi5c_str7CString27from_vec_with_nul_unchecked17ha30c7217ee188b24Efrom_vec_with_nul_uncheckedcollect_ZN63_$LT$I$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17h2ce72dbef3e8acbbEinto_iter, core::ascii::EscapeDefault, closure-0>>flatten_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hb26b2f66f9c7b07cEnext, closure-0>,core::ascii::EscapeDefault>_ZN114_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17he8717e99c873c2d6Enext,core::ascii::EscapeDefault,closure-0>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hb52aef9225f82eabEnext,closure-0>_ZN107_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..adapters..fuse..FuseImpl$LT$I$GT$$GT$4next17h548385f0b5a83489Enext, closure-0>>_ZN100_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h47f134cfcd5e3156E_ZN58_$LT$std..ffi..c_str..CStr$u20$as$u20$core..fmt..Debug$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h1b1d72201879f955E_ZN4core3ops8function5impls80_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$9call_once17h95603d90b06defa7Ecall_once<(&u8),closure-0>_ZN4core6option15Option$LT$T$GT$3map17hc314ddb234b2a387Emap<&u8,core::ascii::EscapeDefault,&mut closure-0>_ZN4core6option15Option$LT$T$GT$6as_mut17h8fd9ded3cce759ecEas_mut_ZN5alloc7raw_vec15RawVec$LT$T$GT$13with_capacity17hca09a4dfa5263debE_ZN99_$LT$alloc..boxed..Box$LT$$u5b$T$u5d$$GT$$u20$as$u20$core..convert..From$LT$$RF$$u5b$T$u5d$$GT$$GT$4from17h67fa40afe0f53aa6E_ZN50_$LT$T$u20$as$u20$core..convert..Into$LT$U$GT$$GT$4into17hd1db58f4ee0acad5Einto<&[u8],alloc::boxed::Box<[u8], alloc::alloc::Global>>_ZN64_$LT$std..ffi..c_str..CStr$u20$as$u20$alloc..borrow..ToOwned$GT$8to_owned17h6d8912beab6ec0ffE_ZN106_$LT$alloc..boxed..Box$LT$$u5b$T$u5d$$GT$$u20$as$u20$core..convert..From$LT$$u5b$T$u3b$$u20$N$u5d$$GT$$GT$4from17h91f403f8fc3324ebE_ZN76_$LT$std..ffi..c_str..FromBytesWithNulError$u20$as$u20$std..error..Error$GT$11description17h175fca1fcd545976EIntoStringError_ZN4core10intrinsics19copy_nonoverlapping17hc01834319d80ada4Ecopy_nonoverlapping>_ZN4core3ptr4read17h96f344361a16e6a0Eread>_ZN4core3ptr23swap_nonoverlapping_one17h2f0e6ac73741d5b4Eswap_nonoverlapping_one>_ZN4core3mem4swap17haf4c0f25a5f5bfd6Eswap>_ZN4core3mem7replace17h403374440ec947e5Ereplace>_ZN4core3mem4take17h9d562bc6f7662195Etake>_ZN116_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..convert..From$LT$alloc..boxed..Box$LT$$u5b$T$u5d$$C$A$GT$$GT$$GT$4from17hee824f7a3c08d9fbE_ZN5alloc3vec16Vec$LT$T$C$A$GT$8truncate17h6dd624135dc53900Etruncate_ZN5alloc5slice64_$LT$impl$u20$alloc..borrow..ToOwned$u20$for$u20$$u5b$T$u5d$$GT$10clone_into17hf09e8c4eebe7813cEclone_into_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$13get_unchecked17h443566e00bb3831dEget_unchecked>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$18split_at_unchecked17h214445945d760b0cEsplit_at_unchecked_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8split_at17h48d4c5e4ea13ec80Esplit_at_ZN3std10sys_common12os_str_bytes3Buf8into_box17h9cbcc67d5e0ec9f1Einto_box_ZN5alloc5slice30_$LT$impl$u20$$u5b$u8$u5d$$GT$18to_ascii_lowercase17h000260d16fbd883bEto_ascii_lowercase_ZN3std10sys_common12os_str_bytes5Slice18to_ascii_lowercase17h505aa0b227582b69E_ZN94_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h13cb0131cc1e08d6E_ZN4core5slice5ascii30_$LT$impl$u20$$u5b$u8$u5d$$GT$20make_ascii_lowercase17h6e2315e8008d4030Emake_ascii_lowercase_ZN4core3num20_$LT$impl$u20$u8$GT$20make_ascii_lowercase17h230dc8a4c168a3feE_ZN4core3num20_$LT$impl$u20$u8$GT$18is_ascii_uppercase17h3a8667dd7e4f2507Eis_ascii_uppercase_ZN4core3num20_$LT$impl$u20$u8$GT$18to_ascii_lowercase17hd64a88bb57e21825EIterMut_ZN4core5slice4iter16IterMut$LT$T$GT$14post_inc_start17h9962a386f4ed6c95E_ZN115_$LT$std..ffi..os_str..OsString$u20$as$u20$std..sys_common..FromInner$LT$std..sys_common..os_str_bytes..Buf$GT$$GT$10from_inner17hfc6bdc01de173a83Efrom_inner_ZN5alloc5slice30_$LT$impl$u20$$u5b$u8$u5d$$GT$18to_ascii_uppercase17h5cf664cb4b34dc45Eto_ascii_uppercase_ZN3std10sys_common12os_str_bytes5Slice18to_ascii_uppercase17h557ba65d226d83f8E_ZN4core5slice5ascii30_$LT$impl$u20$$u5b$u8$u5d$$GT$20make_ascii_uppercase17h82eb199b05715f7aEmake_ascii_uppercase_ZN4core3num20_$LT$impl$u20$u8$GT$20make_ascii_uppercase17h3ca81f865059dc9fE_ZN4core3num20_$LT$impl$u20$u8$GT$18is_ascii_lowercase17h5e2aea453114d33eEis_ascii_lowercase_ZN4core3num20_$LT$impl$u20$u8$GT$18to_ascii_uppercase17h7a446ec994cc3bbfE_ZN3std3sys4unix2fs4File9file_attr17hbde5700f52e74da9Efile_attr_ZN3std2fs4File8metadata17h0f5d08a33f7812a1Emetadata_ZN4core10intrinsics11write_bytes17h7f688ee3c77d534dEwrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17h89367eaed2705812E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17h4e811643ae6d82c8Ezeroed_ZN4core3mem6zeroed17h2d091404647a109bE_ZN4core6result19Result$LT$T$C$E$GT$3map17h21c2d078d93468c7Emap std::fs::Metadata>_ZN4core3ptr78drop_in_place$LT$core..result..Result$LT$usize$C$std..io..error..Error$GT$$GT$17h196f02ff841bd074Edrop_in_place>_ZN4core6result19Result$LT$T$C$E$GT$9unwrap_or17h238ced77dbd6efd2Eunwrap_or_ZN4core6result19Result$LT$T$C$E$GT$3map17h62ca2261a5a80356Emap_ZN3std2fs4File4open17h3c01c015cce4561fE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h0931622ca19c819cEfrom_error,std::io::error::Error>_ZN3std2io4Read11read_to_end17hafecf8b237f4bf13Eread_to_end_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h690c11475aebb16fEfrom_error_ZN5alloc6string6String13with_capacity17h55829cb0710737f1Ewith_capacity_ZN3std2io16append_to_string17h0fa2fe50ee08d11dEappend_to_string_ZN3std2io4Read14read_to_string17h5445654737c7c15eEread_to_stringread_to_string_ZN3std2io4Read14read_to_string28_$u7b$$u7b$closure$u7d$$u7d$17h1f49286062f34b3aE{{closure}}_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17h41e265b55584f884Eindex,alloc::alloc::Global>_ZN4core6result19Result$LT$T$C$E$GT$5is_ok17h084a8d877e042705Eis_ok<&str,core::str::error::Utf8Error>_ZN4core6result19Result$LT$T$C$E$GT$6is_err17ha038758746e7c903Eis_err<&str,core::str::error::Utf8Error>_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hb6b9f1fc90325306Eand_thenappend_to_string_ZN3std2io16append_to_string28_$u7b$$u7b$closure$u7d$$u7d$17hc78baff0dba68794E_ZN4core3ptr35drop_in_place$LT$std..io..Guard$GT$17h1927feda77cec244Edrop_in_place_ZN3std2fs4File6create17h600b0a1a0d6eee60Ecreate<&std::path::Path>_ZN3std3sys4unix2fd8FileDesc3raw17hab0808fedff99c34E_ZN3std3sys4unix2fs4File5fsync28_$u7b$$u7b$closure$u7d$$u7d$17h2f47a1d16acd1c48E_ZN3std3sys4unix5cvt_r17h74fbbd3cc6f0590bEcvt_r_ZN3std3sys4unix2fs4File5fsync17h17c40f0c4b33fcfeE_ZN3std3sys4unix2fs4File5fsync8os_fsync17h3c7f4c7d96b11a44Eos_fsync_ZN3std3sys4unix2fs4File8datasync28_$u7b$$u7b$closure$u7d$$u7d$17h358afbde26bbc131E_ZN3std3sys4unix5cvt_r17h4116738528d16398E_ZN3std3sys4unix2fs4File8datasync17h9993e2c9c95544d1E_ZN3std3sys4unix2fs4File8datasync11os_datasync17hcade417ce08c8c20Eos_datasync_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h939f1758b1913571Emap_err_ZN3std3sys4unix2fs4File8truncate17h987ee3b8fac25bbaEtruncate_ZN3std3sys4unix2fs4File8truncate28_$u7b$$u7b$closure$u7d$$u7d$17h721716f5489ea437E_ZN3std3sys4unix5cvt_r17haf84292874a48175Ecvt_r_ZN3std2io5error5Error3new17h5164f750380ada22Enew_ZN3std3sys4unix2fs4File8truncate28_$u7b$$u7b$closure$u7d$$u7d$17h7526958ce71bb852E_ZN3std3sys4unix2fd8FileDesc9duplicate17h3835e3daa6f19273Eduplicate_ZN3std3sys4unix2fs4File9duplicate17h600cb6ee051ee6f1E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17ha641557f508a4fa2Efrom_error_ZN3std3sys4unix2fs4File15set_permissions28_$u7b$$u7b$closure$u7d$$u7d$17h8fabe78a3fcf5c1dE_ZN3std3sys4unix5cvt_r17hdc23a4b2ada0494eE_ZN3std3sys4unix2fs4File15set_permissions17h4fedccd2b6a248e4E_ZN52_$LT$isize$u20$as$u20$std..sys..unix..IsMinusOne$GT$12is_minus_one17h5716bf546c874309E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h2ea3059ca68b1057Efrom_error_ZN3std3sys4unix2fd8FileDesc13read_vectored17h303e773094f18ae6Eread_vectored_ZN3std3sys4unix2fs4File13read_vectored17haeb6d1e2b0bda76dE_ZN3std3sys4unix2fd8FileDesc5write17h7684fcb3a9eb0e1cE_ZN3std3sys4unix2fs4File5write17h06a3fce65f990c3fE_ZN3std3sys4unix2fd8FileDesc14write_vectored17ha2f2ce894052c8abE_ZN3std3sys4unix2fs4File14write_vectored17h653d0d22e3f38d11E_ZN3std3sys4unix2fs4File4seek17h22297c56d7c0c2b7Eseek_ZN50_$LT$i64$u20$as$u20$std..sys..unix..IsMinusOne$GT$12is_minus_one17h9f38bea5d0455ff9E_ZN3std3sys4unix3cvt17h630ab7ba14edc760Ecvt_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hb163805840486f58Efrom_error_ZN3std3sys4unix2fs11OpenOptions4read17h2362d123f8eaa7ecE_ZN3std3sys4unix2fs11OpenOptions5write17h82df5a6858b65505E_ZN3std3sys4unix2fs11OpenOptions6append17h31859f52a14bdc01Eappend_ZN3std3sys4unix2fs11OpenOptions8truncate17h59117754b5b3795dE_ZN3std3sys4unix2fs11OpenOptions6create17h8d9b21316dbe9965E_ZN3std3sys4unix2fs11OpenOptions10create_new17h3d72a479d3e3c0e0Ecreate_new_ZN3std3sys4unix2fs4cstr17h5e6ab1829c8a8a45E_ZN3std3sys4unix2fs4File4open17h36fe4ed7291afc8cE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h19241cb549d8b8beEfrom_error_ZN4core6result19Result$LT$T$C$E$GT$3map17h12bca5bca748a41dEmapFileType_ZN3std3sys4unix2fs8FileType2is17h43a5228d30cc8992E_ZN3std3sys4unix2fs8FileType6is_dir17hd3d2ef5cb5024392Eis_dir_ZN3std2fs8FileType6is_dir17hda5be32cbe330f79EMetadata_ZN3std3sys4unix2fs8FileType7is_file17h9e073f3ffca5ca21Eis_file_ZN3std2fs8FileType7is_file17hb6bab18e25f77685E_ZN4core6result19Result$LT$T$C$E$GT$3map17he9cffcd1f6b9fbf9Emap std::time::SystemTime>FileAttr_ZN3std3sys4unix2fs8FileAttr7created17h856c764f5b8000bbEcreated_ZN3std2fs8Metadata9file_type17ha8fca2be94ae0472Efile_type_ZN3std2fs8Metadata6is_dir17hea600360a2dc2d9dE_ZN3std2fs8Metadata7is_file17h63b94cdc9c6e33e5E_ZN3std2fs8Metadata8modified17hca1ee1d03eb2eb3aEmodified_ZN3std2fs8Metadata8accessed17h5d2e4aea6f0fae5dEaccessed_ZN4core3ptr94drop_in_place$LT$core..result..Result$LT$std..time..SystemTime$C$std..io..error..Error$GT$$GT$17h05d6ab74740a4e5eEdrop_in_place>FilePermissions_ZN3std3sys4unix2fs15FilePermissions8readonly17hf9538f6f8d227285E_ZN3std3sys4unix2fs15FilePermissions12set_readonly17h1816a895a5f38e1eEset_readonly_ZN3std3sys4unix2fs8FileType10is_symlink17h0cf1cd514ef14d69Eis_symlink_ZN4core6option15Option$LT$T$GT$3map17h50a88dabcb3c315eEmap,core::result::Result,closure-0>_ZN75_$LT$std..fs..ReadDir$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next28_$u7b$$u7b$closure$u7d$$u7d$17hd52abd91472ca0b6E_ZN4core6result19Result$LT$T$C$E$GT$3map17h0647937caf416144Emap std::fs::DirEntry>DirEntry_ZN3std3sys4unix2fs8DirEntry8metadata17h68810e671d642224E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$6as_ptr17hd491daac7467d04bEas_ptr_ZN3std3sys4unix2fs8DirEntry9file_type17hdac55e49f2598599E_ZN4core6result19Result$LT$T$C$E$GT$3map17hdc34c1a278b67ff1Emap_ZN4core6result19Result$LT$T$C$E$GT$3map17hdb2e0cc27b02b739Emap std::fs::FileType>_ZN3std3sys4unix2fs8DirEntry10name_bytes17h9e3cf5cdd654fdd3Ename_bytes_ZN3std3sys4unix2fs8DirEntry9file_name17ha6c185f98447f98fE_ZN3std2fs8DirEntry4path17ha68069b05a3d033aEDirBuilder_ZN3std4path17has_physical_root17h99c820d6f534b07eEhas_physical_root_ZN3std4path4Path10components17h254bb4ace079a2e2Ecomponents_ZN56_$LT$std..path..Path$u20$as$u20$core..cmp..PartialEq$GT$2eq17h4c0acf9b23235213E_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17h3051fec3173c038fEeq_ZN3std3sys4unix4path11is_sep_byte17hf83277ff84bf02ecEis_sep_byte_ZN4core4iter6traits8iterator8Iterator2eq17h8a60e7e95d3054ccEeq_ZN4core4iter6traits8iterator8Iterator5eq_by17hd100c68823f369f4Eeq_by_ZN4core4iter6traits8iterator8Iterator2eq28_$u7b$$u7b$closure$u7d$$u7d$17hcdb77ab7bba88a38E{{closure}}_ZN4core6option15Option$LT$T$GT$7is_some17h75363ef6f5d6be3cEis_some_ZN4core6option15Option$LT$T$GT$7is_none17ha72af50bb347963eEis_none_ZN3std4path4Path6parent17h314d0c824fc45c1cEparent_ZN4core6option15Option$LT$T$GT$8and_then17h276a79a711815b91Eand_then_ZN3std4path4Path6parent28_$u7b$$u7b$closure$u7d$$u7d$17h38ad686701628fbcE_ZN3std2io8buffered9bufreader18BufReader$LT$R$GT$14discard_buffer17h68371d0d8a8e0d2fEdiscard_buffer_ZN62_$LT$std..sys..unix..stdio..Stdin$u20$as$u20$std..io..Read$GT$4read17h8877f2bc2543589eE_ZN58_$LT$std..io..stdio..StdinRaw$u20$as$u20$std..io..Read$GT$4read17h8b65ce1d6a337099E_ZN3std2io5stdio12handle_ebadf17he5b0491df9c666baEhandle_ebadf_ZN85_$LT$std..io..buffered..bufreader..BufReader$LT$R$GT$$u20$as$u20$std..io..BufRead$GT$8fill_buf17h1c8be104be4f2ffdEfill_buf_ZN3std2io5impls60_$LT$impl$u20$std..io..Read$u20$for$u20$$RF$$u5b$u8$u5d$$GT$4read17h52a25ec941e282acE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17h16135721a90b30ecEcopy_from_slice_ZN85_$LT$std..io..buffered..bufreader..BufReader$LT$R$GT$$u20$as$u20$std..io..BufRead$GT$7consume17hed2333ea6a5d4cf0Econsume_ZN70_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..cmp..PartialEq$GT$2eq17hffc10e96a930c85dEeq_ZN3std3sys4unix5stdio8is_ebadf17h4d0b21c5112a4f05Eis_ebadf_ZN4core6option15Option$LT$T$GT$6as_mut17h10742426a006cf56Eas_mut_ZN4core6option15Option$LT$T$GT$6unwrap17h23908f808e4475b3Eunwrap<&mut std::io::stdio::StdoutRaw>BufGuard_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$9flush_buf8BufGuard4done17he49186525be46c5fE_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$9flush_buf8BufGuard9remaining17hca9bd5c97c8c1affE_ZN64_$LT$std..sys..unix..stdio..Stdout$u20$as$u20$std..io..Write$GT$5write17hf8566822631c3802E_ZN60_$LT$std..io..stdio..StdoutRaw$u20$as$u20$std..io..Write$GT$5write17he0094c1abece03d5E_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$9flush_buf8BufGuard7consume17h9cf055a638805645Econsume_ZN4core3ptr90drop_in_place$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$..flush_buf..BufGuard$GT$17h7e78e82cd2249e00Edrop_in_placeBufWriter_ZN5alloc3vec16Vec$LT$T$C$A$GT$8capacity17h0d5a7cdf8c9ae26fEcapacity_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$7get_mut17hfcbf77844415059aEget_mutlinewritershimLineWriterShim_ZN3std2io8buffered14linewritershim23LineWriterShim$LT$W$GT$5inner17h274bf8d988484bcbEinner_ZN93_$LT$std..io..buffered..linewritershim..LineWriterShim$LT$W$GT$$u20$as$u20$std..io..Write$GT$17is_write_vectored17h59e810d443b18b3cEis_write_vectored_ZN3std2io5impls58_$LT$impl$u20$std..io..Write$u20$for$u20$$RF$mut$u20$W$GT$17is_write_vectored17he91dada92f9246f7Eis_write_vectored>_ZN4core6option15Option$LT$T$GT$6as_ref17h342affd519ac235fEas_ref_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$7get_ref17h24a1bc36b477cc3cEget_ref_ZN4core6option15Option$LT$T$GT$6unwrap17h30c4ea51533378c9Eunwrap<&std::io::stdio::StdoutRaw>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h041195835d37c297Eoffset_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h9cffb728452a2f9dEadd_ZN4core5slice4iter13Iter$LT$T$GT$3new17h5aad8169c52f9384Enew_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17h98d5a1bd7eaec50fE_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17ha3dd563d9cc27dc1Enext_backdouble_endedDoubleEndedIterator_ZN4core4iter6traits12double_ended19DoubleEndedIterator9try_rfold17h8ce21c606317b8f0Etry_rfold,(),closure-0,core::ops::control_flow::ControlFlow>_ZN125_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9try_rfold17h61254d4abaff8601E_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h08508f294bbe9c9bEtry_fold>,(),closure-0,core::ops::control_flow::ControlFlow>_ZN4core4iter6traits8iterator8Iterator8find_map17h652192d02bc8da08Efind_map>>,usize,closure-1>_ZN4core5slice4iter13Iter$LT$T$GT$11pre_dec_end17hba2dc3e67bf3ce8dEpre_dec_end_ZN93_$LT$std..io..buffered..linewritershim..LineWriterShim$LT$W$GT$$u20$as$u20$std..io..Write$GT$14write_vectored28_$u7b$$u7b$closure$u7d$$u7d$17h04bbaf1e9a9c7691E{{closure}}find_map_ZN4core4iter6traits8iterator8Iterator8find_map5check28_$u7b$$u7b$closure$u7d$$u7d$17he804335c5edb133fE{{closure}}<(usize, &std::io::IoSlice),usize,closure-1>try_rfold_ZN125_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9try_rfold9enumerate28_$u7b$$u7b$closure$u7d$$u7d$17he07d184853cfb591E{{closure}}<&std::io::IoSlice,(),core::ops::control_flow::ControlFlow,closure-0>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8split_at17h71a5aa318b9f36dcEsplit_at_ZN3std2io8buffered14linewritershim23LineWriterShim$LT$W$GT$9inner_mut17he3a6105bc9daa803Einner_mut_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h58a5219fdbde0d3aEnext_ZN4core4iter6traits8iterator8Iterator4fold17h3e43fd6eafe222a6Efold,usize,closure-0>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17hfdb7fef1f091f615Efold,closure-0,usize,fn(usize, usize) -> usize>accum_ZN56_$LT$usize$u20$as$u20$core..iter..traits..accum..Sum$GT$3sum17he48f1c557dd79c82Esum, closure-0>>_ZN4core4iter6traits8iterator8Iterator3sum17h8a9e2e0b12f22fc9Esum, closure-0>,usize>_ZN60_$LT$std..io..stdio..StdoutRaw$u20$as$u20$std..io..Write$GT$14write_vectored17h78ce67883662ce74E_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$6buffer17h1a5cb6754de85c92Ebuffer_ZN3std2io8buffered14linewritershim23LineWriterShim$LT$W$GT$8buffered17h805c8ec05a7bc232Ebuffered_ZN3std2io8buffered14linewritershim23LineWriterShim$LT$W$GT$23flush_if_completed_line17h8dd65e2d6b77ae6bEflush_if_completed_line_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4last17ha0d3e965b58ef131Elast_ZN4core6option15Option$LT$T$GT$3map17h4b14ac50cd34c157Emap<&u8,u8,closure-0>_ZN4core6option19Option$LT$$RF$T$GT$6copied17h4538578f4eb1a51cEcopied_ZN83_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$14write_vectored17h578e89558cc2a138E_ZN4core4iter6traits8iterator8Iterator4fold17h6dac87d99b769ee1E_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17h0b60d12cb051029bE_ZN56_$LT$usize$u20$as$u20$core..iter..traits..accum..Sum$GT$3sum17ha2bcfa0d4d607553E_ZN4core4iter6traits8iterator8Iterator3sum17hfcb8680a19d12253E_ZN4core3ops8function5FnMut8call_mut17h8f1a0a0f76889a80Ecall_mut usize,(usize, usize)>_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17h930196ff5221bae3E{{closure}}<&std::io::IoSlice,usize,usize,closure-0,fn(usize, usize) -> usize>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h13acee70b65a8154E_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h78d2cad047757542Epost_inc_start_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8for_each17h505d7e301cc4ba4cEfor_each_ZN83_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$14write_vectored28_$u7b$$u7b$closure$u7d$$u7d$17hfa5f40cdd0cccc16E_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17h66798b6fada88e26E_ZN64_$LT$std..sys..unix..stdio..Stdout$u20$as$u20$std..io..Write$GT$14write_vectored17h49428f27b6ca8d4eE_ZN4core4iter6traits8iterator8Iterator4fold17h82e7dce22e9f2172E_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17h1dbb2ce46da899eeEfold,closure-2,usize,fn(usize, usize) -> usize>_ZN56_$LT$usize$u20$as$u20$core..iter..traits..accum..Sum$GT$3sum17he53f169deafc7303Esum, closure-2>>_ZN4core4iter6traits8iterator8Iterator3sum17h09b54a39e063ad9eEsum, closure-2>,usize>_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17he3681b38229e62daE{{closure}}<&std::io::IoSlice,usize,usize,closure-2,fn(usize, usize) -> usize>_ZN4core4iter6traits8iterator8Iterator8try_fold17hc55a22551184fbbcEtry_fold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>filter_ZN108_$LT$core..iter..adapters..filter..Filter$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hdfdaaa23094d387aEtry_fold,closure-3,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h9bda6efe6919b1b5Etry_fold, closure-3>,closure-4,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>take_while_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hbaf398f83ca8f108Etry_fold, closure-3>, closure-4>,closure-5,usize,closure-0,core::result::Result>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17hbd84072848393cedEfold, closure-3>, closure-4>,closure-5,usize,fn(usize, usize) -> usize>_ZN56_$LT$usize$u20$as$u20$core..iter..traits..accum..Sum$GT$3sum17h66a6fe4582db2d05Esum, closure-3>, closure-4>, closure-5>>_ZN4core4iter6traits8iterator8Iterator3sum17hd6c2260b0aec0b89Esum, closure-3>, closure-4>, closure-5>,usize>filter_try_fold_ZN4core4iter8adapters6filter15filter_try_fold28_$u7b$$u7b$closure$u7d$$u7d$17h29636842f17ae901E{{closure}}<&std::io::IoSlice,usize,core::ops::control_flow::ControlFlow, usize>,closure-3,closure-0>_ZN93_$LT$std..io..buffered..linewritershim..LineWriterShim$LT$W$GT$$u20$as$u20$std..io..Write$GT$14write_vectored28_$u7b$$u7b$closure$u7d$$u7d$17hf97f7f2645b62ae5E_ZN93_$LT$std..io..buffered..linewritershim..LineWriterShim$LT$W$GT$$u20$as$u20$std..io..Write$GT$14write_vectored28_$u7b$$u7b$closure$u7d$$u7d$17hdca2bc8cc2d25e8cEmap_try_fold_ZN4core4iter8adapters3map12map_try_fold28_$u7b$$u7b$closure$u7d$$u7d$17hbd97f9eeb23cb61cE{{closure}}<&std::io::IoSlice,usize,usize,core::ops::control_flow::ControlFlow, usize>,closure-4,closure-0>_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$12write_to_buf17h3c4c160e530a521bEwrite_to_buf_ZN93_$LT$std..io..buffered..linewritershim..LineWriterShim$LT$W$GT$$u20$as$u20$std..io..Write$GT$14write_vectored28_$u7b$$u7b$closure$u7d$$u7d$17hdff7c6db976d1d79E_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold5check28_$u7b$$u7b$closure$u7d$$u7d$17he42d9957ce74aea1E{{closure}},closure-5,closure-0>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold2ok28_$u7b$$u7b$closure$u7d$$u7d$17hc78e868ba034a6cbE{{closure}} usize>_ZN5alloc3vec16Vec$LT$T$C$A$GT$11extend_with17h6fc09ee56c436548Eextend_with>_ZN5alloc3vec16Vec$LT$T$C$A$GT$6resize17h7f3017b06331cb9bEresize_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17ha31c3579224fe482E_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h2a63983bf887e931Eindex_mut>_ZN84_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..IndexMut$LT$I$GT$$GT$9index_mut17h40a06543f9947539Eindex_mut,alloc::alloc::Global>cursor_ZN3std2io6cursor18vec_write_vectored17hed7220e6d954c178Evec_write_vectored_ZN4core5slice4iter87_$LT$impl$u20$core..iter..traits..collect..IntoIterator$u20$for$u20$$RF$$u5b$T$u5d$$GT$9into_iter17h073e7218536c2c24Einto_iter_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h912c35c864097a9eEinto_result_ZN59_$LT$std..io..error..Custom$u20$as$u20$core..fmt..Debug$GT$3fmt17h7aaa8c591ed33c31E_ZN67_$LT$alloc..boxed..Box$LT$T$C$A$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17hbff8e1759a1ab104Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h52d959fb6bd01feaEfmt>_ZN69_$LT$alloc..boxed..Box$LT$T$C$A$GT$$u20$as$u20$core..fmt..Display$GT$3fmt17h642d2e5825ad3e47EfmtErrorKind_ZN3std2io5error9ErrorKind6as_str17h70d27adfb3059c16E_ZN4core4iter6traits8iterator8Iterator4fold17hea70fce4f66079bcE_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17h1d8596b906a67111E_ZN56_$LT$usize$u20$as$u20$core..iter..traits..accum..Sum$GT$3sum17h56cc421d731e0dd5E_ZN4core4iter6traits8iterator8Iterator3sum17h3e76d5abb93613cdE_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17h90fe1fd0cf9aa758E_ZN62_$LT$std..sys..unix..stdio..Stdin$u20$as$u20$std..io..Read$GT$13read_vectored17h8a0a995ac706c539E_ZN3std2io4Read11read_to_end17h41633c24fb94ce6bEread_to_end_ZN3std2io5error5Error12raw_os_error17hb4b18a21826851c1E_ZN5alloc6string6String3len17hdac32fd556566ff2E_ZN3std2io16append_to_string17h6f65838b636145d3E_ZN3std2io4Read14read_to_string17hfdc8a6bcfb98ebbbEread_to_string_ZN3std2io4Read14read_to_string28_$u7b$$u7b$closure$u7d$$u7d$17h5abe15390b84b19bE{{closure}}_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h415855c187a64a74E_ZN3std2io16append_to_string28_$u7b$$u7b$closure$u7d$$u7d$17h8aad3f8cda45f3f2E_ZN3std2io5stdio12handle_ebadf17h090b801be54f3fb9Ehandle_ebadf<()>IoSlice_ZN3std2io7IoSlice7advance17hb485999eb5598db2Eadvance_ZN3std2io5Write18write_all_vectored17ha43efad43148a01eEwrite_all_vectored_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17hc44320b82df84b84Eindex_mut_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h7e18430c51951c97Eindex_mut>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17h351ff0d594ad7504Eis_empty_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h7ba75f3249ab288cE_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h91aec59683fd7270Eget_unchecked_mut_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h824213f8323389eeE_ZN3std3sys4unix2io7IoSlice7advance17h3e5c808f171a8e32E_ZN3std2io5Write9write_fmt17h45e1d7e4dbe55f03Ewrite_fmt_ZN4core6result19Result$LT$T$C$E$GT$5is_ok17h415e3dbf2f88b322Eis_ok<(),std::io::error::Error>_ZN4core6result19Result$LT$T$C$E$GT$6is_err17hc6fd26f8fbd86c24Eis_err<(),std::io::error::Error>_ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$5write17ha61e522533589548E_ZN4core4iter6traits8iterator8Iterator4fold17h80b74db9151f405dE_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17h9562c79ec21c5515E_ZN56_$LT$usize$u20$as$u20$core..iter..traits..accum..Sum$GT$3sum17h7721bdeb50c8ceffE_ZN4core4iter6traits8iterator8Iterator3sum17h52b1ca3aa866d5c1E_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17heb91b4171f536932E_ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$14write_vectored17heaf325e560f21019E_ZN3std4lazy21SyncOnceCell$LT$T$GT$14is_initialized17hbb07a936f8fedc5aEis_initialized>>_ZN3std4lazy21SyncOnceCell$LT$T$GT$3get17h1ef8b020b3a98747Eget>>_ZN3std4lazy21SyncOnceCell$LT$T$GT$15get_or_try_init17h3fe6a2bdf3e24257Eget_or_try_init>,closure-0,!>_ZN3std4lazy21SyncOnceCell$LT$T$GT$11get_or_init17hf6be87f123494a34Eget_or_init>,closure-0>_ZN3std10sys_common5mutex12MovableMutex8raw_lock17h258ebf141249ae82Eraw_lock_ZN3std4sync5mutex14Mutex$LT$T$GT$4lock17hff20342ff5a36e43Elock>_ZN3std10sys_common6poison4Flag6borrow17h5ab52c0e7b098139EMutexGuard_ZN3std4sync5mutex19MutexGuard$LT$T$GT$3new17h796b8a4f82cb6194E_ZN3std10sys_common6poison4Flag3get17hf277343eec2966e7EStdin_ZN3std2io5stdio5Stdin4lock17h991d0a540114bd7bE_ZN4core3ptr46drop_in_place$LT$std..io..stdio..StdinLock$GT$17h449b6ca39dc35e8bEdrop_in_place_ZN84_$LT$std..sync..mutex..MutexGuard$LT$T$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h3d55fdf0d9357826Ederef_mut>_ZN59_$LT$std..io..stdio..StdinLock$u20$as$u20$std..io..Read$GT$4read17h6d57b1ee1f053bb8E_ZN59_$LT$std..io..stdio..StdinLock$u20$as$u20$std..io..Read$GT$11read_to_end17haa08e24416b117e9Eread_to_end_ZN3std2io4Read11read_to_end17h6929bd071c29e5e8Eread_to_end>StdinLock_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h4ed812266c89d7d7Eoffset_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h5ae3ac99fcfc5f0aEadd_ZN4core5slice4iter13Iter$LT$T$GT$3new17hdce1accb744e4398Enew_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17h9d1acb00a6d6c700Eiter_ZN82_$LT$std..io..buffered..bufreader..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$13read_vectored17h27dfa9ac8f2b1c27Eread_vectored_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha27c9b736bcb6bf0Enext_ZN4core4iter6traits8iterator8Iterator4fold17h9d3531a95489af7bEfold,usize,closure-0>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17h9064bbabd8c0ba38Efold,closure-0,usize,fn(usize, usize) -> usize>_ZN56_$LT$usize$u20$as$u20$core..iter..traits..accum..Sum$GT$3sum17h7fe500da535f7021Esum, closure-0>>_ZN4core4iter6traits8iterator8Iterator3sum17hedfd3eaca5614c93Esum, closure-0>,usize>_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17h7d8212a2135800e2E{{closure}}<&std::io::IoSliceMut,usize,usize,closure-0,fn(usize, usize) -> usize>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h6031156b8d86f55fE_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h2dd3528c3806134eEpost_inc_start_ZN58_$LT$std..io..stdio..StdinRaw$u20$as$u20$std..io..Read$GT$13read_vectored17h852128b6083fb034E_ZN3std2io5impls60_$LT$impl$u20$std..io..Read$u20$for$u20$$RF$$u5b$u8$u5d$$GT$13read_vectored17hc365ed7948f57210E_ZN94_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h821d0fefbc0ce9a4E_ZN3std2io16append_to_string17h8a6a20b2cde81a3cE_ZN3std2io4Read14read_to_string17hac54f3723ff5a58cEread_to_string>_ZN3std2io4Read14read_to_string28_$u7b$$u7b$closure$u7d$$u7d$17h8fd25dbcacc8eb12E{{closure}}>_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h49c5da5c00116f79E_ZN3std2io16append_to_string28_$u7b$$u7b$closure$u7d$$u7d$17h8d7b24d6763c248dE_ZN3std2io8buffered9bufreader18BufReader$LT$R$GT$6buffer17h2f5c4c81f96b8e71E_ZN82_$LT$std..io..buffered..bufreader..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$10read_exact17hf1153a192fdfa31eEread_exact_ZN3std2io18default_read_exact17hc56caa8e187c48c8Edefault_read_exact>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h3715fc577df64713Efrom_error<&[u8],std::io::error::Error>BufRead_ZN3std2io7BufRead10read_until17h19b1336d0cfa0469Eread_until>_ZN3std2io16append_to_string17hb2d65e6d58c7ba5dE_ZN3std2io7BufRead9read_line17h1ad82b0de914c016Eread_line>read_line_ZN3std2io7BufRead9read_line28_$u7b$$u7b$closure$u7d$$u7d$17hae3853afb49ee9ceE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h5925f0cac8477329E_ZN3std2io16append_to_string28_$u7b$$u7b$closure$u7d$$u7d$17h369b358361f8aefbE_ZN3std4lazy21SyncOnceCell$LT$T$GT$15get_or_init_pin17h1d85b9c73f0a8647Eget_or_init_pin>>,closure-0,closure-1>_ZN3std4sync4once4Once15call_once_force17hd40385a94ffc036eEcall_once_force_ZN3std3sys4unix5mutex14ReentrantMutex4lock17h17c6953f3516b894E_ZN3std10sys_common7remutex23ReentrantMutex$LT$T$GT$4lock17h5f3851bdbc3e9bb5EStdout_ZN3std2io5stdio6Stdout4lock17h51418c9d1837b0a3E_ZN61_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$5write17h2b55250c249fc9ebE_ZN4core3ptr47drop_in_place$LT$std..io..stdio..StdoutLock$GT$17hfb03cff5b5005231Edrop_in_place_ZN61_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$14write_vectored17h899e8aa4a042fce0E_ZN61_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$14write_vectored17hc21f51d7efa3f0fbE_ZN85_$LT$std..io..buffered..linewriter..LineWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$14write_vectored17hf73e298e83c0797fE_ZN61_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$9write_all17h0c15acfa1271e3e2E_ZN61_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$18write_all_vectored17h316328ccd3e580edEwrite_all_vectored_ZN61_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$5flush17h1de18b6a31ac9b54Eflush_ZN83_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$5flush17h1f2923e560f97c84Eflush_ZN85_$LT$std..io..buffered..linewriter..LineWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$5flush17hd21a8a900bdd062dE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h70a2fb64050166a8Eand_then<(),std::io::error::Error,(),closure-0>_ZN83_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$5flush28_$u7b$$u7b$closure$u7d$$u7d$17hd16c17742824e82bE_ZN3std2io5Write9write_fmt17heebd259fdaae56c7Ewrite_fmtmemrchr_ZN3std3sys4unix6memchr7memrchr16memrchr_specific17hbdfda07d978c94b7Ememrchr_specific_ZN3std3sys4unix6memchr7memrchr17h663cd4b59e715338E_ZN3std6memchr7memrchr17h03296db5e51cb688E_ZN93_$LT$std..io..buffered..linewritershim..LineWriterShim$LT$W$GT$$u20$as$u20$std..io..Write$GT$5write17h7017a5f945ea152aEwrite_ZN85_$LT$std..io..buffered..linewriter..LineWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$5write17he91684f115468bdcE_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$8capacity17h63aecdc21158eb24E_ZN83_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$5write17h01d7ba8a7d9c64c7E_ZN93_$LT$std..io..buffered..linewritershim..LineWriterShim$LT$W$GT$$u20$as$u20$std..io..Write$GT$9write_all17hed70a16be165666bEwrite_all_ZN85_$LT$std..io..buffered..linewriter..LineWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$9write_all17h24df81442e65111dE_ZN85_$LT$std..io..buffered..linewriter..LineWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$18write_all_vectored17h952e47735ff9d145Ewrite_all_vectored_ZN3std2io5Write18write_all_vectored17h21ad6dc132b04afaEwrite_all_vectored>_ZN3std4lazy21SyncOnceCell$LT$T$GT$14is_initialized17hc86188cd09b64aa9Eis_initialized>>_ZN3std4lazy21SyncOnceCell$LT$T$GT$3get17hfadac91cf20d42bcEget>>_ZN3std4lazy21SyncOnceCell$LT$T$GT$15get_or_init_pin17h4644ed6bd9ab5ddeEget_or_init_pin>,closure-0,closure-1>_ZN3std4sync4once4Once15call_once_force17hba302aa01e164a52E_ZN3std10sys_common7remutex23ReentrantMutex$LT$T$GT$4lock17he05dcc030394c3a2Elock>Stderr_ZN3std2io5stdio6Stderr4lock17h275b346b4ccbbd00E_ZN61_$LT$$RF$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$5flush17he2eb7363514f4380E_ZN4core4cell16RefCell$LT$T$GT$14try_borrow_mut17h185818720a2d438dEtry_borrow_mut_ZN4core4cell16RefCell$LT$T$GT$10borrow_mut17hb0c96c56b6150bb8E_ZN61_$LT$std..io..stdio..StderrLock$u20$as$u20$std..io..Write$GT$5flush17h59130fe0de75271dE_ZN4core3ptr72drop_in_place$LT$core..cell..RefMut$LT$std..io..stdio..StderrRaw$GT$$GT$17h5e402d3602275ed1Edrop_in_place>_ZN96_$LT$std..sys_common..remutex..ReentrantMutexGuard$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hef83f4f53d4883e3Edrop>_ZN4core3ptr126drop_in_place$LT$std..sys_common..remutex..ReentrantMutexGuard$LT$core..cell..RefCell$LT$std..io..stdio..StderrRaw$GT$$GT$$GT$17h8edcd149945cd1d8Edrop_in_place>>_ZN4core3ptr47drop_in_place$LT$std..io..stdio..StderrLock$GT$17h5e2505baf4fcafd3Edrop_in_place_ZN4core6result19Result$LT$T$C$E$GT$6expect17hdf71adf726e15bd4Eexpect,core::cell::BorrowMutError>_ZN61_$LT$$RF$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$9write_all17h9d223fb9154230c2E_ZN61_$LT$std..io..stdio..StderrLock$u20$as$u20$std..io..Write$GT$9write_all17h1fae7c5d660bc4c3E_ZN61_$LT$$RF$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$18write_all_vectored17hf401bcbbc34b54c7E_ZN61_$LT$std..io..stdio..StderrLock$u20$as$u20$std..io..Write$GT$18write_all_vectored17hdd5b70397da6ed9fE_ZN61_$LT$std..io..stdio..StderrLock$u20$as$u20$std..io..Write$GT$5write17h73a6a382c603e0e2E_ZN60_$LT$std..io..stdio..StderrRaw$u20$as$u20$std..io..Write$GT$5write17h9a556d48107852a7E_ZN61_$LT$std..io..stdio..StderrLock$u20$as$u20$std..io..Write$GT$14write_vectored17h901ee2994155a54cE_ZN60_$LT$std..io..stdio..StderrRaw$u20$as$u20$std..io..Write$GT$14write_vectored17hdf08e00a628bd57fE_ZN3std2io5Write9write_fmt17hd30990ca1bbe7fecEwrite_fmt_ZN4core6option15Option$LT$T$GT$7is_some17h24aa82ca8b773614Eis_some>>>_ZN4core6option15Option$LT$T$GT$7is_none17h60c241d5cba2a5c1Eis_none>>>_ZN4core6option15Option$LT$T$GT$6as_ref17he11ea4c161d4276eEas_ref>>>>>_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$3get17h26fd598e3392ed3fEget>>>>>_ZN3std6thread5local4fast12Key$LT$T$GT$3get17h69d32abbd1f28740Eget>>>>,fn() -> core::cell::Cell>>>>>OUTPUT_CAPTURE_ZN3std2io5stdio14OUTPUT_CAPTURE7__getit17h193ad67752a79410E_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17hc041d2395b66713eEtry_with>>>>,closure-0,core::option::Option>>>>_ZN3std6thread5local17LocalKey$LT$T$GT$4with17h6d27d6b53bf8fd9fE_ZN4core10intrinsics19copy_nonoverlapping17h74c913a6eb4e085eEcopy_nonoverlapping>>>>_ZN4core3ptr4read17hd173c4641c17ac90Eread>>>>_ZN4core3ptr23swap_nonoverlapping_one17hc78a20884ac61130Eswap_nonoverlapping_one>>>>_ZN4core3mem4swap17h022bbc428c32bfb0Eswap>>>>_ZN4core3mem7replace17h8ac88d6a31bf7b14Ereplace>>>>_ZN4core4cell13Cell$LT$T$GT$7replace17hf3a83c0c5dcd9ab3Eset_output_capture_ZN3std2io5stdio18set_output_capture28_$u7b$$u7b$closure$u7d$$u7d$17h4c0485201406c902E_ZN4core3ptr84drop_in_place$LT$std..io..stdio..set_output_capture..$u7b$$u7b$closure$u7d$$u7d$$GT$17h63a0f24549761583E_ZN4core6result19Result$LT$T$C$E$GT$6expect17h189bd7b20a07ab5bEexpect>>>,std::thread::local::AccessError>_ZN3std2io5stdio8print_to17he3eeefb914061c9bEprint_to_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17ha750faa89edf1d2dEtry_with>>>>,closure-0,core::option::Option<()>>_ZN4core4cell13Cell$LT$T$GT$4take17hd82ebc0390faf45dEtake>>>>print_to_ZN3std2io5stdio8print_to28_$u7b$$u7b$closure$u7d$$u7d$17h1fc53deaa13dc3bbE{{closure}}_ZN4core6option15Option$LT$T$GT$3map17h92167cea67a86ce7Emap>>,(),closure-0>_ZN3std4sync5mutex14Mutex$LT$T$GT$4lock17h9759ebe9d0973272Elock>_ZN3std2io5stdio8print_to28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h5739311538bf8a4cE_ZN3std4sync5mutex19MutexGuard$LT$T$GT$3new17h6829e6c058f691a8Enew>_ZN3std2io5stdio6stdout17h3413716d915364dcE_ZN57_$LT$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$9write_fmt17ha489d02e32ee4859E_ZN84_$LT$std..sync..mutex..MutexGuard$LT$T$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17ha3cec0961e56f36aEderef_mut>_ZN79_$LT$std..sync..mutex..MutexGuard$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h791e605d14159ebcEdrop>_ZN4core3ptr82drop_in_place$LT$std..sync..mutex..MutexGuard$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17hb98cccfd7e8b2a2dEdrop_in_place>>_ZN4core4cell13Cell$LT$T$GT$3set17h1ab31627bcc0429bEset>>>>_ZN4core3mem4drop17h82548f05595a8f76Edrop>>>>_ZN3std2io5stdio8print_to17h6177b5fb2baa4016Eprint_to_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17hf145979b7d6298ffE_ZN3std2io5stdio8print_to28_$u7b$$u7b$closure$u7d$$u7d$17h22e6e8b415ba4604E{{closure}}_ZN4core6option15Option$LT$T$GT$3map17h324208a32c4e74edE_ZN3std2io5stdio8print_to28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17haed24d427d300cb2E_ZN3std2io5stdio6stderr17hd60243981fc60410E_ZN57_$LT$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$9write_fmt17h8987ca3718593e4fEutil_ZN3std2io28read_to_end_with_reservation17he33d6ae85207d334Eread_to_end_with_reservation_ZN84_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..IndexMut$LT$I$GT$$GT$9index_mut17h86d0ac5d9c10447eEindex_mut,alloc::alloc::Global>_ZN4core10intrinsics11write_bytes17hee5da2e96283061eEwrite_bytesInitializer_ZN3std2io11Initializer10initialize17h5493af5ad7efedc6E_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h0d61bf56019bf35bEderef_mut_ZN3std2io28read_to_end_with_reservation17h558114601fb0a0d9Eread_to_end_with_reservation,closure-0>_ZN3std2io28read_to_end_with_reservation17h339e50640f4f75c5Eread_to_end_with_reservation_ZN48_$LT$std..fs..File$u20$as$u20$std..io..Write$GT$5write17h78b244b39835e2d5E_ZN4core10intrinsics19copy_nonoverlapping17h5c213f35e74b94f9Ecopy_nonoverlapping<&mut [u8]>_ZN4core3ptr4read17hedb2fd70320c315cEread<&mut [u8]>_ZN4core3ptr23swap_nonoverlapping_one17h18a9a532b50235a7Eswap_nonoverlapping_one<&mut [u8]>_ZN4core3mem4swap17h93fcc5432c82b594Eswap<&mut [u8]>_ZN4core3mem7replace17haa224ca04b6bb0b3Ereplace<&mut [u8]>_ZN3std2io5impls69_$LT$impl$u20$std..io..Write$u20$for$u20$$RF$mut$u20$$u5b$u8$u5d$$GT$5write17h0c8e2195a4aab474E_ZN3std2io5impls69_$LT$impl$u20$std..io..Write$u20$for$u20$$RF$mut$u20$$u5b$u8$u5d$$GT$9write_all17h253d106b0e9772b1E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$22split_at_mut_unchecked17h22c228f27c3ee0e3Esplit_at_mut_unchecked_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$12split_at_mut17h74b9de612aade1cbEsplit_at_mut_ZN115_$LT$core..ops..range..RangeInclusive$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h3e10b9c697f58c21E_ZN117_$LT$core..ops..range..RangeToInclusive$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h74360058612d1c62E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h7d7593fab2e46fb0Eindex>_ZN4core3ops5range27RangeInclusive$LT$usize$GT$16into_slice_range17hefec406948e0f7daEinto_slice_range_ZN4core3num21_$LT$impl$u20$u16$GT$10swap_bytes17h064c3b25cf935117Eswap_bytes_ZN4core3num21_$LT$impl$u20$u16$GT$5to_be17h5429c5c3b7d57b8cEto_be_ZN3std3net5htons17h3a8c856efeb395bdEhtonsSocketAddrV6_ZN3std3net4addr12SocketAddrV63new17hb7eda89fcbfa591eESocketAddrV4_ZN3std3net4addr12SocketAddrV43new17hd5d66109fe836861ESocketAddr_ZN3std3net4addr12SocketAddrV66set_ip17hcf943f0256bed451Eset_ip_ZN3std3net4addr10SocketAddr4port17hf31dec09020fb93aE_ZN3std3net4addr10SocketAddr3new17he9f2d8ece783926aE_ZN3std3net4addr12SocketAddrV46set_ip17h7c8b8574dfed4207E_ZN4core3num21_$LT$impl$u20$u16$GT$7from_be17h958188ab339b9d4cEfrom_be_ZN3std3net5ntohs17ha078202caa284933Entohs_ZN65_$LT$std..net..addr..SocketAddr$u20$as$u20$core..fmt..Display$GT$3fmt17h5ef1e611a0f9e595E_ZN3std3net4addr12SocketAddrV42ip17h81f449d384f2c254E_ZN3std3net4addr12SocketAddrV44port17h2e383923825e4efaE_ZN3std2io5Write9write_fmt17h598c39fb092fada2Ewrite_fmt<&mut [u8]>_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h187635ead902ac22E_ZN4core6result19Result$LT$T$C$E$GT$6unwrap17h49f708bf01b486feEunwrap<(),std::io::error::Error>_ZN3std3net4addr12SocketAddrV68scope_id17h2c0fba65bb5bb1c7E_ZN3std3net4addr12SocketAddrV62ip17hc28b32a1d15294cbE_ZN3std3net4addr12SocketAddrV64port17h28b8113f37e185f7E_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h316d1dffff9f3aa7E_ZN4core5array103_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u3b$$u20$N$u5d$$GT$$u20$for$u20$$u5b$A$u3b$$u20$N$u5d$$GT$2eq17h160f81ec014cee9bE_ZN4core3cmp5impls48_$LT$impl$u20$core..cmp..Ord$u20$for$u20$u32$GT$3cmp17h61bf76317adc7111E_ZN57_$LT$std..net..ip..Ipv4Addr$u20$as$u20$core..cmp..Ord$GT$3cmp17h3fab6cff1cc34561E_ZN4core3num21_$LT$impl$u20$u32$GT$10swap_bytes17h773c164f04cef36cE_ZN4core3num21_$LT$impl$u20$u32$GT$7from_be17h0de5c9721f7866d8E_ZN4core3cmp5impls48_$LT$impl$u20$core..cmp..Ord$u20$for$u20$u16$GT$3cmp17h008bb8d14f4f7418EOrdering_ZN4core3cmp8Ordering4then17h8ce84f67b1c5080eEthenIpv6Addr_ZN3std3net2ip8Ipv6Addr8segments17hd4affc32a2216c07Esegments_ZN57_$LT$std..net..ip..Ipv6Addr$u20$as$u20$core..cmp..Ord$GT$3cmp17hb5c97eaa73221b70E_ZN48_$LT$A$u20$as$u20$core..slice..cmp..SliceOrd$GT$7compare17hb11272d4d66af3d3Ecompare_ZN4core5slice3cmp56_$LT$impl$u20$core..cmp..Ord$u20$for$u20$$u5b$T$u5d$$GT$3cmp17hdebfd0f3319a771fEcmp_ZN4core3cmp5impls50_$LT$impl$u20$core..cmp..Ord$u20$for$u20$$RF$A$GT$3cmp17h3edf2ff58c4a9a0eEcmp<[u16]>_ZN4core5array67_$LT$impl$u20$core..cmp..Ord$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$3cmp17h9f8e4524ef4c1222E_ZN76_$LT$std..net..addr..SocketAddr$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17h92cb12f0a8b1dbdbEto_socket_addrs_ZN86_$LT$$LP$std..net..ip..Ipv6Addr$C$u16$RP$$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17hf0b8f3534041f00fE_ZN78_$LT$std..net..addr..SocketAddrV6$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17h7affb8c953762131E_ZN78_$LT$std..net..addr..SocketAddrV4$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17hb6abfa67c3441f7cE_ZN86_$LT$$LP$std..net..ip..Ipv4Addr$C$u16$RP$$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17h42f77de8fe057ea1E_ZN98_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..spec_from_iter..SpecFromIter$LT$T$C$I$GT$$GT$9from_iter17h36849621b8424786Efrom_iter>_ZN95_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..collect..FromIterator$LT$T$GT$$GT$9from_iter17hc0aaff761fa12d12E_ZN4core4iter6traits8iterator8Iterator7collect17h67fadc1aeb26a055Ecollect,alloc::vec::Vec>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hd7e9a57f246bf5c3Enext_ZN111_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..spec_from_iter_nested..SpecFromIterNested$LT$T$C$I$GT$$GT$9from_iter17hff821bea7e99d65dE_ZN4core6option15Option$LT$T$GT$3map17h849a172cfe0df4ddEmap_ZN4core3ptr158drop_in_place$LT$core..iter..adapters..map..Map$LT$std..sys_common..net..LookupHost$C$std..net..addr..resolve_socket_addr..$u7b$$u7b$closure$u7d$$u7d$$GT$$GT$17h219cac74785f674eEdrop_in_place>resolve_socket_addr_ZN3std3net4addr19resolve_socket_addr28_$u7b$$u7b$closure$u7d$$u7d$17hbcec8fde937a3e8bE_ZN4core3ops8function5impls80_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$9call_once17h05545c52f82b5d02Ecall_once<(std::net::addr::SocketAddr),closure-0>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17hac823550b4957880Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h9cf8fcec398a3e02Ewith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17hde3dc85cf26b8e1dE_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h43122ceae8c7fddcEwith_capacity_ZN3std3net4addr10SocketAddr8set_port17hafbef5b5ea3456d4Eset_port_ZN4core3ptr5write17hd967cb2b9cc6e656Ewrite_ZN97_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$T$C$I$GT$$GT$11spec_extend17hdeff5f097f24b093Espec_extend,alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h901ea47a99947047Eas_mut_ptr_ZN5alloc3vec16Vec$LT$T$C$A$GT$16extend_desugared17h704128a806ac5cebEextend_desugared>_ZN5alloc3vec16Vec$LT$T$C$A$GT$7set_len17h0186c2d5d1779d08Eset_len_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h503a14503552e908Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h9710f96cd4761ecbEtry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h59c637ceac2c1a36E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17hf77ca5f5ea762ce9E_ZN4core5alloc6layout6Layout5array17h7b56f5b2ff708d05Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hc4f506ad9e37485fEset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h6c0f083a620cfea3Ecapacity_from_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hbbdf12811aefbcb0Eoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17hf0420aaee5fbfcb2Eadd_ZN90_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17h1272eff5e3c2bcabEinto_iterparser_ZN3std3net6parser79_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..ip..Ipv4Addr$GT$8from_str17hfb1450533dd6807cEfrom_str_ZN4core3str21_$LT$impl$u20$str$GT$5parse17h83712f8ef2519a5dEparse_ZN3std3net6parser79_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..ip..Ipv4Addr$GT$8from_str28_$u7b$$u7b$closure$u7d$$u7d$17he18faf44545e2e6fEParser_ZN3std3net6parser6Parser10parse_with17ha768b38ed1c5b048Eparse_with_ZN3std3net6parser79_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..ip..Ipv6Addr$GT$8from_str17h88c38c9d25ca6f66E_ZN4core3str21_$LT$impl$u20$str$GT$5parse17h2aadadd82c7be609Eparse_ZN3std3net6parser79_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..ip..Ipv6Addr$GT$8from_str28_$u7b$$u7b$closure$u7d$$u7d$17h91250f5791985c37E_ZN3std3net6parser6Parser10parse_with17h89d0a1a7c9aa01d7Eparse_with_ZN4core6option15Option$LT$T$GT$5ok_or17h98d11b7f9149932aEok_or_ZN53_$LT$T$u20$as$u20$core..convert..TryInto$LT$U$GT$$GT$8try_into17heef6ec8ba13fd87dEtry_into<(&str, u16),std::sys_common::net::LookupHost>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h51d6dd5883ef90a7Einto_result_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17ha357e7f4ab84ef51Efrom_error,std::io::error::Error>_ZN3std3net6parser83_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..addr..SocketAddr$GT$8from_str17h1a4c33dfc5d11326E_ZN4core3str21_$LT$impl$u20$str$GT$5parse17h74b0ad6265bad83cEparse_ZN3std3net6parser6Parser16read_socket_addr17he3c72818c4eb7a0bEread_socket_addr_ZN3std3net6parser83_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..addr..SocketAddr$GT$8from_str28_$u7b$$u7b$closure$u7d$$u7d$17h4cac158ec6937e99E_ZN3std3net6parser6Parser10parse_with17h72f0697de91c5b37Eparse_with_ZN4core6option15Option$LT$T$GT$3map17hbf12875e6f037cb4Emap std::net::addr::SocketAddr>_ZN4core6option15Option$LT$T$GT$7or_else17hc9992a0dce515619Eor_else_ZN3std3net6parser6Parser16read_socket_addr28_$u7b$$u7b$closure$u7d$$u7d$17h16eb2fa0db8d3db2E_ZN4core6option15Option$LT$T$GT$3map17hf65923cf9f7b0b15Emap std::net::addr::SocketAddr>_ZN4core6option15Option$LT$T$GT$5ok_or17ha985ae33f8448a6dEok_or_ZN53_$LT$T$u20$as$u20$core..convert..TryInto$LT$U$GT$$GT$8try_into17h11fb9f6971930b1eEtry_into<&str,std::sys_common::net::LookupHost>_ZN4core5slice4iter13Iter$LT$T$GT$3new17h9d4560836bb955b3Enew_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17h1a03378f0c65754aEiter_ZN59_$LT$std..net..ip..IpAddr$u20$as$u20$core..fmt..Display$GT$3fmt17hdce7c73e1d8c14f2E_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17he6884cb732b3410aE_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h556d491c3ecd79f3E_ZN3std3net2ip8Ipv6Addr6octets17h5334aab16e6f71bdEoctets_ZN3std3net2ip8Ipv6Addr14is_unspecified17hfec92c447fd95e3aEis_unspecified_ZN3std3net2ip8Ipv6Addr7to_ipv417hcf862abd7482b7aeEto_ipv4Ipv4Addr_ZN3std3net2ip8Ipv4Addr3new17hf263b8857b9c113aE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11split_first17h36c63640dd25e379Esplit_first_ZN61_$LT$std..net..ip..Ipv6Addr$u20$as$u20$core..fmt..Display$GT$3fmt12fmt_subslice17h6645593b7375de18Efmt_subslice_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h21a74be2a618ea1eEindex_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hd101a0c07ab74a6eEindex>_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h1c1da2bf6f8ec267E_ZN3std3net6parser6Parser15read_atomically17h6145a4680292bff8Eread_atomically_ZN4core4char7methods22_$LT$impl$u20$char$GT$8to_digit17hc8c2e212d089bc51Eto_digitread_number_ZN3std3net6parser6Parser11read_number28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17hb85618332c3490c0E{{closure}}_ZN3std3net6parser6Parser15read_atomically17he69d9e7227e1780eEread_atomically_ZN3std3net6parser6Parser11read_number28_$u7b$$u7b$closure$u7d$$u7d$17h8d751a975023db76E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11split_first17h024ca2f4e7de8e81Esplit_first_ZN3std3net6parser6Parser9read_char17h86fa9ce31bc9489fEread_char_ZN3std3net6parser6Parser9read_char28_$u7b$$u7b$closure$u7d$$u7d$17h4a44f2fd3392acfbE_ZN4core6option15Option$LT$T$GT$3map17h057672cbfb8fc78dEmap<(&u8, &[u8]),char,closure-0>_ZN58_$LT$u16$u20$as$u20$std..net..parser..ReadNumberHelper$GT$11checked_mul17h6b3575cb6a1c76b6E_ZN58_$LT$u16$u20$as$u20$std..net..parser..ReadNumberHelper$GT$11checked_add17h2cda20da37e2e1f2E_ZN4core7convert3num67_$LT$impl$u20$core..convert..TryFrom$LT$u32$GT$$u20$for$u20$u16$GT$8try_from17h88bdcd2267961e4cEtry_from_ZN53_$LT$T$u20$as$u20$core..convert..TryInto$LT$U$GT$$GT$8try_into17h70634f39b325876cEtry_into_ZN3std3net6parser6Parser15read_atomically17h716d284893e5f7c5Eread_atomically_ZN3std3net6parser6Parser15read_atomically17h74d480a2c5449608E_ZN3std3net6parser6Parser11read_number28_$u7b$$u7b$closure$u7d$$u7d$17h03156a3930c817a3E{{closure}}_ZN3std3net6parser6Parser15read_atomically17h0fb58a63513322a9Eread_atomically_ZN3std3net6parser6Parser11read_number17h7bdfbe88db225116Eread_numberread_ipv4_addr_ZN3std3net6parser6Parser14read_ipv4_addr28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h7b934835ca5a1f8eEread_separator_ZN3std3net6parser6Parser14read_separator28_$u7b$$u7b$closure$u7d$$u7d$17h329bbe9728a75e1dE{{closure}}_ZN3std3net6parser6Parser15read_atomically17hc8dcb10465dc3419E_ZN3std3net6parser6Parser14read_separator17h7dad80a9056cac68Eread_separator_ZN3std3net6parser6Parser14read_ipv4_addr28_$u7b$$u7b$closure$u7d$$u7d$17h5a3904c382a0c559E_ZN3std3net6parser6Parser11read_number28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h1035489a82823381E_ZN57_$LT$u8$u20$as$u20$std..net..parser..ReadNumberHelper$GT$11checked_mul17hf453be00d2489473E_ZN57_$LT$u8$u20$as$u20$std..net..parser..ReadNumberHelper$GT$11checked_add17h620affd61ce708f7E_ZN4core7convert3num66_$LT$impl$u20$core..convert..TryFrom$LT$u32$GT$$u20$for$u20$u8$GT$8try_from17h9aa8a6451fbbf508E_ZN53_$LT$T$u20$as$u20$core..convert..TryInto$LT$U$GT$$GT$8try_into17hcfc446718ce94845Etry_intoread_given_char_ZN3std3net6parser6Parser15read_given_char28_$u7b$$u7b$closure$u7d$$u7d$17ha9dd914fdb06e788E_ZN3std3net6parser6Parser15read_atomically17hbe5d138d349f1b76Eread_atomically<(),closure-0>_ZN3std3net6parser6Parser15read_given_char17h0311b903b5aef48bE_ZN3std3net6parser6Parser15read_atomically17h9e1c5aa2b779dfc7Eread_atomicallyread_ipv6_addr_ZN3std3net6parser6Parser14read_ipv6_addr28_$u7b$$u7b$closure$u7d$$u7d$17hb4fff0c31bb667c9E_ZN3std3net2ip8Ipv6Addr3new17h4ca49d87519a09daE_ZN94_$LT$std..net..ip..Ipv6Addr$u20$as$u20$core..convert..From$LT$$u5b$u16$u3b$$u20$8$u5d$$GT$$GT$4from17h6999b5cdc5698603E_ZN50_$LT$T$u20$as$u20$core..convert..Into$LT$U$GT$$GT$4into17h06c5bb8577873486Einto<[u16; 8],std::net::ip::Ipv6Addr>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h32cc14cb4cf06231Eindex_mut_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h1e13bab562a3dbddE_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hf6018d52532a9aa0Eindex_mut>_ZN4core5array88_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$9index_mut17h47b993a8c3b14e05E_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h7792d35a12e4fc77Eindex_mut>_ZN4core5array88_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$9index_mut17hff10e5f1d0273d8fE_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hc2f12f0844294958E_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h68bfeeeace0983e3E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hbb7acb928a98ad7aEindex>_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h9a5c494ee6c238a4E_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h578aeb7bf065d730Eadd_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h60021ead8b6da587Eget_unchecked_mut_ZN4core10intrinsics19copy_nonoverlapping17hefa2e712d6febf3aEcopy_nonoverlapping_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17hc08ad9f2fec8a3cbEcopy_from_slice_ZN94_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h2bd986c449175de7E_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h1d151dbe944e2f43Enext>_ZN3std3net6parser6Parser14read_separator28_$u7b$$u7b$closure$u7d$$u7d$17h9653bd8aacf5647bE{{closure}}_ZN3std3net6parser6Parser15read_atomically17h049af5b93c9273f8E_ZN3std3net6parser6Parser14read_separator17hbe3a719c317ab30eEread_separator_ZN3std3net6parser6Parser14read_separator28_$u7b$$u7b$closure$u7d$$u7d$17h13c53df47f6b858aE{{closure}}_ZN3std3net6parser6Parser15read_atomically17h7fcddf3b522901afE_ZN3std3net6parser6Parser14read_separator17he13c7066db7a527aEread_separatorread_groups_ZN3std3net6parser6Parser14read_ipv6_addr11read_groups28_$u7b$$u7b$closure$u7d$$u7d$17h40fbd371af88451dE_ZN4core6option15Option$LT$T$GT$7is_some17h44157f85065416a8Eis_some_ZN4core6option15Option$LT$T$GT$7is_none17h4aaa2b3090371552Eis_none_ZN3std3net6parser6Parser14read_ipv6_addr11read_groups28_$u7b$$u7b$closure$u7d$$u7d$17hac21d87d99b38cb9E_ZN4core6option15Option$LT$T$GT$7is_some17he76131b771e21dfcEis_some_ZN4core6option15Option$LT$T$GT$7is_none17h16ef0c7a774d3ab6Eis_none_ZN4core3num21_$LT$impl$u20$u16$GT$13from_be_bytes17hce448a946ea5f3bbEfrom_be_bytes_ZN3std3net6parser6Parser15read_atomically17h34aa7aced962cc06Eread_atomicallyread_socket_addr_v4_ZN3std3net6parser6Parser19read_socket_addr_v428_$u7b$$u7b$closure$u7d$$u7d$17h9fd5c0cae7923d6dE_ZN4core6option15Option$LT$T$GT$5ok_or17h306004844510e615Eok_or_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17hb486923da04391a9Einto_result_ZN3std3net6parser6Parser15read_atomically17h607cb13467ecae19E_ZN3std3net6parser6Parser9read_port17h216dffedd2ca5793Eread_port_ZN3std3net6parser6Parser9read_port28_$u7b$$u7b$closure$u7d$$u7d$17h82bc5a3108167dfbE_ZN3std3net6parser6Parser11read_number17he84e4041d7b1ae71Eread_number_ZN4core6option15Option$LT$T$GT$5ok_or17h51349f4a84895d2eEok_or_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h4d74c80af523df50Einto_result_ZN3std3net6parser6Parser15read_atomically17h944f1d5335db6522Eread_atomicallyread_socket_addr_v6_ZN3std3net6parser6Parser19read_socket_addr_v628_$u7b$$u7b$closure$u7d$$u7d$17hc9a5aadd71a1b04eE_ZN4core6option15Option$LT$T$GT$5ok_or17h743d09d343723768Eok_or_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h5144bb3d8430c3d6Einto_result_ZN3std3net6parser6Parser15read_atomically17h44e221edbafe2217E_ZN3std3net6parser6Parser13read_scope_id17hf3cd499723a59a5dEread_scope_id_ZN3std3net6parser6Parser13read_scope_id28_$u7b$$u7b$closure$u7d$$u7d$17hb5662039e052d8d1E_ZN3std3net6parser6Parser11read_number28_$u7b$$u7b$closure$u7d$$u7d$17hf1783b1a307e213eE{{closure}}_ZN3std3net6parser6Parser15read_atomically17h0b0e7dff9f280030E_ZN3std3net6parser6Parser11read_number17h98781c28c2ed0e12Eread_number_ZN3std3net6parser6Parser11read_number28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17hd9682990792bf189E_ZN3std3net6parser6Parser15read_atomically17ha05473c52518c029E_ZN4core3num21_$LT$impl$u20$u32$GT$15overflowing_mul17hf337395872b33098E_ZN4core3num21_$LT$impl$u20$u32$GT$11checked_mul17h96ccaec29cbbc7ccE_ZN58_$LT$u32$u20$as$u20$std..net..parser..ReadNumberHelper$GT$11checked_mul17h1e68b3f3ab697e89E_ZN4core3num21_$LT$impl$u20$u32$GT$15overflowing_add17h5d27abb4b1d05403E_ZN4core3num21_$LT$impl$u20$u32$GT$11checked_add17ha9f87470636cef1eE_ZN58_$LT$u32$u20$as$u20$std..net..parser..ReadNumberHelper$GT$11checked_add17h8d68b57668d814e5E_ZN4core6option15Option$LT$T$GT$9unwrap_or17h6bb1edc5a989320eEunwrap_or_ZN4core6option15Option$LT$T$GT$7is_some17h322c4da67c8d7e80Eis_some_ZN4core6option15Option$LT$T$GT$7is_none17h2b907cf314e9bdd2Eis_none_ZN3std3net6parser6Parser12read_ip_addr17ha12ed7f0d6fff637Eread_ip_addr_ZN3std3net6parser77_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..ip..IpAddr$GT$8from_str28_$u7b$$u7b$closure$u7d$$u7d$17h63737907b03790f9E_ZN3std3net6parser6Parser10parse_with17h9eb0ae3db3d50a74Eparse_with_ZN4core6option15Option$LT$T$GT$3map17hbbcc3194e35b5a1bEmap std::net::ip::IpAddr>_ZN4core6option15Option$LT$T$GT$7or_else17hc83482a339672ba7Eor_else_ZN3std3net6parser6Parser12read_ip_addr28_$u7b$$u7b$closure$u7d$$u7d$17hc7f31e134caf3791E_ZN4core6option15Option$LT$T$GT$3map17h1636cd44e0ea37d5Emap std::net::ip::IpAddr>_ZN4core6option15Option$LT$T$GT$5ok_or17h39921db3d96f895dEok_or_ZN4core6option15Option$LT$T$GT$5ok_or17h88bda16c63df1c78Eok_or_ZN3std3net6parser85_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..addr..SocketAddrV4$GT$8from_str28_$u7b$$u7b$closure$u7d$$u7d$17h1d64cd4d6d958f36E_ZN3std3net6parser6Parser10parse_with17heed0e03b5595a4f8Eparse_with_ZN4core6option15Option$LT$T$GT$5ok_or17he6ae682a93f00e98Eok_or_ZN3std3net6parser85_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..addr..SocketAddrV6$GT$8from_str28_$u7b$$u7b$closure$u7d$$u7d$17h94a2ee6e7d35959eE_ZN3std3net6parser6Parser10parse_with17h58d144b5501c619dEparse_with_ZN4core6option15Option$LT$T$GT$5ok_or17h2e90978bfb306e14Eok_or_ZN3std3sys4unix3net6Socket3new17h0357dd3e4de21c3fETcpStream_ZN3std10sys_common3net9TcpStream15connect_timeout17hc8506c998335fe00Econnect_timeout_ZN3std3sys4unix3net6Socket7new_raw17hce5b569934dacec9Enew_raw_ZN3std3sys4unix3net6Socket15set_nonblocking17hb8d41f66b594ade9Eset_nonblocking_ZN3std3sys4unix3net6Socket15connect_timeout17he152a42feab9fb37E_ZN145_$LT$$RF$std..net..addr..SocketAddr$u20$as$u20$std..sys_common..IntoInner$LT$$LP$$BP$const$u20$libc..unix..linux_like..sockaddr$C$u32$RP$$GT$$GT$10into_inner17h02df212bca6aac57Einto_inner_ZN4core6result19Result$LT$T$C$E$GT$3map17ha20852ab743fdce3Emap std::net::tcp::TcpStream>_ZN3std3sys4unix4time5inner3now17hd381dca44487013fEInstant_ZN3std3sys4unix4time5inner7Instant3now17h54cb25c985168eb2E_ZN3std4time7Instant3now17haaa6b7e03db54a36E_ZN4core3cmp9PartialEq2ne17h190441a496c05da6Ene_ZN4core3cmp5impls55_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$u64$GT$11partial_cmp17he7708c8c2ad8442dEpartial_cmp_ZN62_$LT$core..time..Duration$u20$as$u20$core..cmp..PartialOrd$GT$2ge17hdf7fadbf5db71f07E_ZN4core3cmp8Ordering9then_with17h19b125c96cca97e7Ethen_with_ZN4core3cmp5impls55_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$u32$GT$11partial_cmp17h47755a3834aaf216E_ZN62_$LT$core..time..Duration$u20$as$u20$core..cmp..PartialOrd$GT$2ge28_$u7b$$u7b$closure$u7d$$u7d$17h683d60bb63ea8b63E_ZN4core3num21_$LT$impl$u20$u64$GT$15overflowing_mul17h39bbc443a351e70bE_ZN4core3num21_$LT$impl$u20$u64$GT$11checked_mul17hd4331e21e1a08f16E_ZN4core3num21_$LT$impl$u20$u64$GT$14saturating_mul17he97bf669a1da5e8cEsaturating_mul_ZN4core3num21_$LT$impl$u20$u64$GT$14saturating_add17he7f49167be6a8818Esaturating_add_ZN3std10sys_common3net10getsockopt17h58d66c29ea72961cEgetsockopt_ZN3std3sys4unix3net6Socket10take_error17h5ddb574a072ea8afEtake_error_ZN4core3ptr48drop_in_place$LT$std..sys..unix..net..Socket$GT$17h7729f7e2911ec7e3Edrop_in_place_ZN3std3sys4unix3net6Socket15connect_timeout28_$u7b$$u7b$closure$u7d$$u7d$17h230620a3881a0e4eE_ZN4core6option15Option$LT$T$GT$14unwrap_or_else17h22e414e220669e13Eunwrap_or_else_ZN4core6result19Result$LT$T$C$E$GT$6unwrap17h06188abe367f778cEunwrap_ZN4core10intrinsics11write_bytes17h7a37bb63bc19f2eeEwrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17h0b02cbb6f0865997E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17h6717fa059686b3ddEzeroed_ZN4core3mem6zeroed17h00201ead54e8b82cE_ZN3std10sys_common3net8sockname17h20d7dca7920f32a7Esockname_ZN3std10sys_common3net9TcpStream9peer_addr17haf4976cb4c437544Epeer_addr_ZN3std10sys_common3net9TcpStream9peer_addr28_$u7b$$u7b$closure$u7d$$u7d$17h74072332ccd5db9cE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17had1b2acb655484acEfrom_error_ZN3std3sys4unix3net6Socket8shutdown17hd99bf10ac74673b6Eshutdown_ZN3std10sys_common3net9TcpStream8shutdown17h990a778eaa0d1990E_ZN3std3sys4unix3net6Socket11set_timeout17h2f982956ff00d69cEset_timeout_ZN3std10sys_common3net9TcpStream16set_read_timeout17h3879ce400d02926bEset_read_timeout_ZN4core4time8Duration13subsec_micros17ha6c43f487a0f0236Esubsec_micros_ZN3std10sys_common3net10setsockopt17h695459350a7df33cEsetsockopt_ZN3std10sys_common3net9TcpStream17set_write_timeout17hfdd563c9d917d8beEset_write_timeout_ZN3std10sys_common3net9TcpStream12read_timeout17hbda0fc7f8a33b890E_ZN3std10sys_common3net9TcpStream13write_timeout17h2d6476285c8cc40bE_ZN3std3sys4unix3net6Socket15recv_with_flags17h31b27875648c28c3Erecv_with_flags_ZN3std3sys4unix3net6Socket4peek17hacd6d6860842e462Epeek_ZN3std10sys_common3net9TcpStream4peek17hd717a1d41fe4f92fE_ZN3std10sys_common3net10setsockopt17hc0e9ec4c822727b8Esetsockopt_ZN3std3sys4unix3net6Socket11set_nodelay17h4e65976b6e0cb3c6Eset_nodelay_ZN3std10sys_common3net9TcpStream11set_nodelay17h999c1561c83614b2E_ZN3std3sys4unix3net6Socket7nodelay17h4e034b311a0456f6E_ZN3std10sys_common3net9TcpStream7nodelay17h744491d0ddb20678E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h5915ce98545b3ae2Efrom_error_ZN3std3sys4unix3net6Socket4read17hde8070aadfc47bc2E_ZN3std10sys_common3net9TcpStream4read17h18efb47d5e28e055E_ZN3std10sys_common3net9TcpStream5write17hf8af42f39bd51255E_ZN3std10sys_common3net8sockname17ha0e4b7ddecc8bf0bETcpListener_ZN3std10sys_common3net11TcpListener11socket_addr17h8ba85953223fa701E_ZN3std10sys_common3net11TcpListener11socket_addr28_$u7b$$u7b$closure$u7d$$u7d$17h4b6c936108cb9cd2E_ZN3std10sys_common3net11TcpListener6accept17hc76bc365a4b9e1d4Eaccept_ZN3std3sys4unix3net6Socket6accept28_$u7b$$u7b$closure$u7d$$u7d$17h9bfd18b6248ea90aE_ZN3std3sys4unix5cvt_r17hd9d5fe411ca37bf9E_ZN3std3sys4unix3net6Socket6accept17h5415cf1ba5a71261E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h43351e7274b9aaf3Einto_result_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h07deb29a8e30365eEfrom_error<(std::sys_common::net::TcpStream, std::net::addr::SocketAddr),std::io::error::Error>_ZN4core6result19Result$LT$T$C$E$GT$3map17h92d8dae5b0a73406Emap<(std::sys_common::net::TcpStream, std::net::addr::SocketAddr),std::io::error::Error,(std::net::tcp::TcpStream, std::net::addr::SocketAddr),closure-0>_ZN3std10sys_common3net11TcpListener7set_ttl17h50d48fa66f7db328Eset_ttl_ZN3std10sys_common3net11TcpListener3ttl17h3750a5d001dff308E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17haf95ddee8a69df9aEfrom_error_ZN3std10sys_common3net11TcpListener11set_only_v617h39993dccdc38b157Eset_only_v6_ZN3std10sys_common3net11TcpListener7only_v617h9ce746a6ac7a0786E_ZN3std10sys_common3net11TcpListener10take_error17h8c3ad6990107b963E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17he8e19ed87304ee29Efrom_error,std::io::error::Error>_ZN3std10sys_common3net11TcpListener15set_nonblocking17h30f8ad4c3f1d07f1E_ZN4core6result19Result$LT$T$C$E$GT$3map17h043f8decec6b9119Emap<(std::net::tcp::TcpStream, std::net::addr::SocketAddr),std::io::error::Error,std::net::tcp::TcpStream,closure-0>_ZN3std3sys4unix3net6Socket20recv_from_with_flags17hda675d2b8c1181e3Erecv_from_with_flags_ZN3std3sys4unix3net6Socket9recv_from17h99105cb450d0221bErecv_fromUdpSocket_ZN3std10sys_common3net9UdpSocket9recv_from17hba98b64da0051f72E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h53bc2feede957b05Efrom_error<(usize, std::net::addr::SocketAddr),std::io::error::Error>udp_ZN3std3sys4unix3net6Socket9peek_from17hc9976544e1e34ecbEpeek_from_ZN3std10sys_common3net9UdpSocket9peek_from17h484e9009409fce28E_ZN3std10sys_common3net9UdpSocket13set_broadcast17h7bd67ced0aff618bEset_broadcast_ZN3std10sys_common3net9UdpSocket9broadcast17haef9b70bf2f54f8fE_ZN3std10sys_common3net9UdpSocket21set_multicast_loop_v417h235293552bf1029eEset_multicast_loop_v4_ZN3std10sys_common3net9UdpSocket17multicast_loop_v417he1620dedfe2266c2E_ZN3std10sys_common3net9UdpSocket20set_multicast_ttl_v417h672d536b214a0bf8Eset_multicast_ttl_v4_ZN3std10sys_common3net9UdpSocket16multicast_ttl_v417hff118ccea00ccb54E_ZN3std10sys_common3net9UdpSocket21set_multicast_loop_v617h8fc5b4ca95949b36Eset_multicast_loop_v6_ZN3std10sys_common3net9UdpSocket17multicast_loop_v617ha1ef15087313d5d8E_ZN3std10sys_common3net9UdpSocket17join_multicast_v417hda6ea84cea40acfcEjoin_multicast_v4_ZN3std10sys_common3net10setsockopt17hd6f455d650955bf7Esetsockopt_ZN3std10sys_common3net9UdpSocket17join_multicast_v617h79706359c43c509bEjoin_multicast_v6_ZN3std10sys_common3net10setsockopt17h6d543e7abe970025Esetsockopt_ZN3std10sys_common3net9UdpSocket18leave_multicast_v417h3684966d8dfb7dacEleave_multicast_v4_ZN3std10sys_common3net9UdpSocket18leave_multicast_v617hbeb16f3d1245974aEleave_multicast_v6_ZN3std10sys_common3net9UdpSocket4send17hae970fefb9030fd3Esend_ZN3std10sys_common3net9UdpSocket4recv17h72c00c07d0f33729Erecv_ZN4core4char7methods22_$LT$impl$u20$char$GT$8is_ascii17h2f081cd6575cbc73Eis_asciiComponent_ZN4core3fmt8builders9DebugList7entries17h4738daddaab3c331Eentries_ZN60_$LT$std..path..Components$u20$as$u20$core..clone..Clone$GT$5clone17h6942c9281a20c8e1E_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17he1d6fba952c1cec7Eclone_ZN56_$LT$std..path..Prefix$u20$as$u20$core..clone..Clone$GT$5clone17h02fecb8b8880ea70E_ZN4core6option15Option$LT$T$GT$3map17h8cfb8d691ff8c973Emap<&std::path::Prefix,bool,fn(&std::path::Prefix) -> bool>Components_ZN3std4path10Components15prefix_verbatim17hd06a35204179f5c6Eprefix_verbatim_ZN3std4path10Components22parse_single_component17h51e779e0679ce7f6Eparse_single_component_ZN3std4path10Components20parse_next_component17h32a1029b8dc44941Eparse_next_component_ZN3std4path10Components9trim_left17h7930d70714b3946bEtrim_left_ZN3std4path10Components11is_sep_byte17hc7b58c8e3b87354dE_ZN3std4path10Components20parse_next_component28_$u7b$$u7b$closure$u7d$$u7d$17h252932262a85b918E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hbe22cd983d07f15eE_ZN57_$LT$std..path..State$u20$as$u20$core..cmp..PartialEq$GT$2eq17h15e8e1116de4304cE_ZN58_$LT$std..path..State$u20$as$u20$core..cmp..PartialOrd$GT$11partial_cmp17ha1a4296436329124EPartialOrd_ZN4core3cmp10PartialOrd2le17hb8055c609333dd6aEle_ZN3std4path10Components15len_before_body17h05c9142e6cb0970bElen_before_body_ZN3std4path10Components10trim_right17he96a9cafe3fe0c6aEtrim_right_ZN3std4path10Components8has_root17h746bdadb84d0a841Ehas_root_ZN3std4path10Components15include_cur_dir17h6e47752e181816acEinclude_cur_dir_ZN4core6option15Option$LT$T$GT$6as_ref17hdfda98a72388bb0dEas_ref_ZN3std4path10Components10prefix_len17h16f8892077d91302Eprefix_len_ZN4core6option15Option$LT$T$GT$3map17h5f4163d2c28a3bd9Emap<&std::path::Prefix,usize,fn(&std::path::Prefix) -> usize>Prefix_ZN3std4path6Prefix3len17hf72eb80499fdf518E_ZN4core3ops8function6FnOnce9call_once17h3a177d2669d2ea87Ecall_once usize,(&std::path::Prefix)>_ZN3std4path10Components16prefix_remaining17hd4ad76235c57f4fbEprefix_remaining_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17ha6c0c1dcebb989b2Erposition_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h6da9df9ba2bd8d87Enext_backparse_next_component_back_ZN3std4path10Components25parse_next_component_back28_$u7b$$u7b$closure$u7d$$u7d$17h738ca0d2dfe89732E_ZN4core6option15Option$LT$T$GT$9unwrap_or17h44782bf90f3f883bEunwrap_or_ZN3std4path4Iter7as_path17hd3ee9e1fe07432bcEas_path_ZN3std4path4Path4iter17he438d5d04ae9b6e6E_ZN4core3fmt8builders9DebugList7entries17h52a2a09af2ddcaa2Eentries<&std::ffi::os_str::OsStr,std::path::Iter>_ZN3std4path9Component9as_os_str17h99ce9bde0770ae70Eas_os_str_ZN4core3ops8function6FnOnce9call_once17h58face3a9c426997Ecall_once &std::ffi::os_str::OsStr,(std::path::Component)>_ZN4core6option15Option$LT$T$GT$3map17h21c4bab57a6d1354Emap &std::ffi::os_str::OsStr>_ZN74_$LT$std..path..Iter$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h32741c8da6ed82d3E_ZN4core6option15Option$LT$T$GT$6unwrap17ha1a34080d48f0af8Eunwrap_ZN4core6option15Option$LT$T$GT$3map17h4fd97b9c0e8c5f55Emap<&u8,bool,closure-0>_push_ZN3std4path7PathBuf5_push28_$u7b$$u7b$closure$u7d$$u7d$17h200caec21f30a322E_ZN3std4path4Path8has_root17h85c0020a817364caE_ZN3std4path4Path11is_absolute17h3fbc91474b23eb30Eis_absolute_ZN3std10sys_common12os_str_bytes3Buf10push_slice17h42128b8493f6edfdEpush_slice_ZN3std3ffi6os_str8OsString4push17h632bc77a95a6603aEpush<&str>_ZN3std3ffi6os_str8OsString4push17h08985a15b01b8937Epush<&std::path::Path>PathBuf_ZN3std4path4Path9file_name17h8641b02eadd1cdeeE_ZN4core6option15Option$LT$T$GT$8and_then17hcb8ac3daf1722c48Eand_then_ZN3std4path7PathBuf3pop17hb4979859dc7e92bdEpop_ZN3std4path7PathBuf4push17h49c6403af8321413Epush<&std::ffi::os_str::OsStr>_ZN3std10sys_common12os_str_bytes5Slice8into_box17h9424152856908d91E_ZN3std3ffi6os_str133_$LT$impl$u20$core..convert..From$LT$$RF$std..ffi..os_str..OsStr$GT$$u20$for$u20$alloc..boxed..Box$LT$std..ffi..os_str..OsStr$GT$$GT$4from17h89d4cc4ce2b37254E_ZN50_$LT$T$u20$as$u20$core..convert..Into$LT$U$GT$$GT$4into17hfa3b3274ac49089fEinto<&std::ffi::os_str::OsStr,alloc::boxed::Box>_ZN3std4path4Path9file_name28_$u7b$$u7b$closure$u7d$$u7d$17h3f8232a20b851ebeE_ZN3std4path10iter_after17h03f10436458a2a74Eiter_after_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17h3a8622c7f46673c3Eeq_ZN4core6option15Option$LT$T$GT$3map17haec41f5d4a3017e8Emap_strip_prefix_ZN3std4path4Path13_strip_prefix28_$u7b$$u7b$closure$u7d$$u7d$17h317c4bee2c06c2d4E_ZN4core6option15Option$LT$T$GT$7is_some17hc5e6c67d2a20a82cEis_some_ZN4core4iter6traits8iterator8Iterator3rev17hcecbd53c507de15cErev_ZN78_$LT$core..iter..adapters..rev..Rev$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h339e08d14a273ad9Eclone_ZN3std4path10iter_after17h2837fa7519f928a4Eiter_after,core::iter::adapters::rev::Rev>_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h4431121edea9b5daEnext_ZN4core6option15Option$LT$T$GT$7is_some17h5f9aa21077d0cfd7Eis_some>_ZN4core5array92_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$A$u3b$$u20$N$u5d$$GT$$u20$for$u20$$u5b$B$u5d$$GT$2eq17h19aadbe08b294eafE_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17hab343aaeba559345Eeq<[u8],[u8; 2]>_ZN3std4path17split_file_at_dot17h25d8c29841ce2cbeEsplit_file_at_dot_ZN4core3ops8function6FnOnce9call_once17h3264fb875aa79e08Ecall_once (core::option::Option<&std::ffi::os_str::OsStr>, core::option::Option<&std::ffi::os_str::OsStr>),(&std::ffi::os_str::OsStr)>_ZN4core6option15Option$LT$T$GT$3map17h29e9335565a1d313Emap<&std::ffi::os_str::OsStr,(core::option::Option<&std::ffi::os_str::OsStr>, core::option::Option<&std::ffi::os_str::OsStr>),fn(&std::ffi::os_str::OsStr) -> (core::option::Option<&std::ffi::os_str::OsStr>, core::option::Option<&std::ffi::os_str::OsStr>)>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h19a333739cc9467eE_ZN111_$LT$core..slice..iter..Split$LT$T$C$P$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hf9fd068b1d8f1a0fEnext_back_ZN97_$LT$core..slice..iter..RSplit$LT$T$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h5eb203eaa40f2056Enext_ZN100_$LT$core..slice..iter..GenericSplitN$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha97d2d2cf495b271Enext<&[u8],core::slice::iter::RSplit>_ZN98_$LT$core..slice..iter..RSplitN$LT$T$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h3dbf755df0384396E_ZN3std4path17split_file_at_dot28_$u7b$$u7b$closure$u7d$$u7d$17h9bc5a7dbefe5cd9eE_ZN111_$LT$core..slice..iter..Split$LT$T$C$P$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back28_$u7b$$u7b$closure$u7d$$u7d$17h957501f08875ea3bE_ZN70_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..cmp..PartialEq$GT$2eq17h29a6c153fdf01f38Eeq<&[u8]>_ZN4core6option15Option$LT$T$GT$2or17h8f72824b95e6f32fEor<&std::ffi::os_str::OsStr>file_stem_ZN3std4path4Path9file_stem28_$u7b$$u7b$closure$u7d$$u7d$17haac5e2147cd355e0E_ZN4core6option15Option$LT$T$GT$8and_then17hde7a57e3300b9490Eand_then<(core::option::Option<&std::ffi::os_str::OsStr>, core::option::Option<&std::ffi::os_str::OsStr>),&std::ffi::os_str::OsStr,closure-0>_ZN4core6option15Option$LT$T$GT$3and17hcb2126cf9e32c126Eand<&std::ffi::os_str::OsStr,&std::ffi::os_str::OsStr>_ZN3std4path4Path9extension28_$u7b$$u7b$closure$u7d$$u7d$17ha4a9da36d04ab042E_ZN4core6option15Option$LT$T$GT$8and_then17h7e9fcf56c8e06f11E_ZN3std4path4Path11to_path_buf17hfcbdccabb969deafEto_path_buf_ZN3std4path7PathBuf4push17h0552798c0b1e898fE_ZN3std4path7PathBuf13set_file_name17h6ff63d03568c2b04Eset_file_name<&std::ffi::os_str::OsStr>_ZN3std4path7PathBuf13set_extension17hf758b29c256c546bEset_extension<&std::ffi::os_str::OsStr>_ZN3std2fs8metadata17h71ad4d16c5013c75E_ZN4core3ptr77drop_in_place$LT$core..result..Result$LT$bool$C$std..io..error..Error$GT$$GT$17h0f9ab7ff1cd0ae99Edrop_in_place>_ZN4core6result19Result$LT$T$C$E$GT$9unwrap_or17h19dee364c1d5dd35Eunwrap_or_ZN3std4path4Path7is_file28_$u7b$$u7b$closure$u7d$$u7d$17h430df805b40c7b61E_ZN4core6result19Result$LT$T$C$E$GT$3map17h3b96a51aa1798fcaEmap_ZN3std4path4Path6is_dir28_$u7b$$u7b$closure$u7d$$u7d$17hb8d00411de9f67f4E_ZN4core6result19Result$LT$T$C$E$GT$3map17h8bae6fed84eda768E_ZN75_$LT$std..sys_common..os_str_bytes..Slice$u20$as$u20$core..fmt..Display$GT$3fmt17hdaa72064b2c34b57E_ZN3std3ffi6os_str5OsStr7display17h053086a359bbbb14Edisplay_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17ha5bfd430edcb2acbEfmt_ZN63_$LT$$RF$std..process..ChildStdin$u20$as$u20$std..io..Write$GT$5write17h3d16578527eb6e79EAnonPipe_ZN3std3sys4unix4pipe8AnonPipe5write17h5d3b5877feb1d174E_ZN63_$LT$$RF$std..process..ChildStdin$u20$as$u20$std..io..Write$GT$14write_vectored17h7b13073ce124eeb5E_ZN3std3sys4unix4pipe8AnonPipe14write_vectored17hd8c63297485f6f2dECommand_ZN3std3sys4unix7process14process_common7Command7env_mut17hb508f80929f0175dEenv_mutCommandEnv_ZN3std10sys_common7process10CommandEnv5clear17hb3cfc892f081c6e9E_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$3new17hd21d7e22c6a86373E_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$5clear17h170c981ae7d33ee5Eclear>_ZN4core6result19Result$LT$T$C$E$GT$3map17hc1847b61a1d42195Emap<(std::sys::unix::process::process_inner::Process, std::sys::unix::process::process_common::StdioPipes),std::io::error::Error,std::process::Child,fn((std::sys::unix::process::process_inner::Process, std::sys::unix::process::process_common::StdioPipes)) -> std::process::Child>_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hc558bb4d4194ba42Eand_then_ZN3std7process7Command6output28_$u7b$$u7b$closure$u7d$$u7d$17h5362b4ef567c074bE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h75cc060b2a5da00bEand_then_ZN4core3mem4drop17h0ef21041bb3aac8dEdrop>Child_ZN3std7process5Child4wait17h6cc47180a16c553aEstatus_ZN3std7process7Command6status28_$u7b$$u7b$closure$u7d$$u7d$17ha82389de18aaa719EProcess_ZN3std3sys4unix7process13process_inner7Process4wait17h53fa232441c28e75E_ZN3std3sys4unix7process13process_inner7Process4wait28_$u7b$$u7b$closure$u7d$$u7d$17h06099384d99f1d5bE_ZN3std3sys4unix5cvt_r17h32c0d4347602ffb0E_ZN4core6result19Result$LT$T$C$E$GT$3map17h61922233c5e0d7f5Emap std::process::ExitStatus>_ZN4core3ptr40drop_in_place$LT$std..process..Child$GT$17hd6c440c3a6cd4ebfEdrop_in_place_ZN3std3ffi5c_str7CString8as_bytes17h3fa324508e085b59Eas_bytes_ZN3std3sys4unix7process14process_common7Command11get_program17h98d8c65d3a843924Eget_program_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17h17f3383645f78385Eas_ptr_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17hb3b958e2c7818ab4Ederef_ZN3std3sys4unix7process14process_common7Command8get_args17hbfd6eeb6faf0fdc7Eget_args_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17hee78ca89e56c41beE_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h9313c07479604df1Eadd_ZN4core5slice4iter13Iter$LT$T$GT$3new17h2b488298effd3c84Enew_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hb833cf76e2526fbbEiter_ZN3std10sys_common7process10CommandEnv4iter17h2655fedf40f3cf1eE_ZN3std3sys4unix7process14process_common7Command8get_envs17heef428bad455d8b9Eget_envs_ZN3std3sys4unix7process14process_common7Command15get_current_dir17h4b3a64152c847c31Eget_current_dir_ZN4core6option15Option$LT$T$GT$3map17ha87bb5c6702de982Emap<&std::ffi::c_str::CString,&std::path::Path,closure-0>_ZN3std3sys4unix7process14process_common7Command15get_current_dir28_$u7b$$u7b$closure$u7d$$u7d$17he594b51562bbbb4fEExitStatus_ZN3std3sys4unix7process13process_inner10ExitStatus7success17h858003f489c2e04dEsuccesslibclinux_like_ZN4libc4unix10linux_like9WIFEXITED17h288a7a6a444c16d1EWIFEXITED_ZN3std3sys4unix7process13process_inner10ExitStatus6exited17h37b63783a5859b7eEexited_ZN3std3sys4unix7process13process_inner10ExitStatus4code17h38042fd8ec35d594E_ZN89_$LT$std..sys..unix..process..process_inner..ExitStatus$u20$as$u20$core..fmt..Display$GT$3fmt17h3b895eb5b6a71084E_ZN4libc4unix10linux_like11WIFSIGNALED17h2c83c746e7808548EWIFSIGNALED_ZN3std3sys4unix7process13process_inner10ExitStatus6signal17h1e5918221558773bE_ZN4core6option15Option$LT$T$GT$6unwrap17hc5cf4e00926a52e9Eunwrap_ZN4core6option15Option$LT$T$GT$7is_some17h37526bb55e51b105Eis_some_ZN3std3sys4unix7process13process_inner7Process4kill17h1a581770968787b3Ekill_ZN4core3ptr23swap_nonoverlapping_one17he7e54a7c6a5af132Eswap_nonoverlapping_one>_ZN4core3mem4swap17h9c2d53a80add4018Eswap>_ZN4core3mem7replace17h2da195c6c4881255Ereplace>_ZN4core3mem4take17hb30d480636880bedEtake>_ZN4core6option15Option$LT$T$GT$4take17h11a41113194f1aadEtake_ZN4core10intrinsics19copy_nonoverlapping17hc2c27674c904c81eEcopy_nonoverlapping>_ZN3std3sys4unix7process13process_inner7Process8try_wait17h5a51a88fe90176daEtry_wait_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hf995df9c2eaedbd3Efrom_error,std::io::error::Error>_ZN4core6option15Option$LT$T$GT$3map17h701188c388a8e67dEmap std::process::ExitStatus>_ZN4core3ptr23swap_nonoverlapping_one17h06ffbfb4659db757Eswap_nonoverlapping_one>_ZN4core3mem4swap17had68a8947d7a8f8aEswap>_ZN4core3mem7replace17h13a1adb8443be73fEreplace>_ZN4core3mem4take17hb858a879962a18efEtake>_ZN4core6option15Option$LT$T$GT$4take17hbbef812780f15870Etake_ZN4core3ptr23swap_nonoverlapping_one17h00f2718616c9eec4Eswap_nonoverlapping_one>_ZN4core3mem4swap17h3ee94dc811c256ffEswap>_ZN4core3mem7replace17hc5740d5be9d06f9aEreplace>_ZN4core3mem4take17h0c1ee340996c1023Etake>_ZN4core6option15Option$LT$T$GT$4take17h42588393e6abdf55Etake_ZN4core10intrinsics19copy_nonoverlapping17h29fd2bb57ad4ad34Ecopy_nonoverlapping>_ZN3std3sys4unix4pipe5read217h9293b16379a925f1Eread2_ZN3std3sys4unix2fd8FileDesc15set_nonblocking17h68ec6bf47e7cf6bbE_ZN3std3sys4unix5cvt_r17h88f6bd2af53f9b0aE_ZN3std3sys4unix4pipe5read228_$u7b$$u7b$closure$u7d$$u7d$17hac4e11d6a271f47dE_ZN3std3sys4unix4pipe5read24read17h642043e2ecdae95dE_ZN3std2io28read_to_end_with_reservation17haed88a0cc1ed5724Eread_to_end_with_reservation_ZN3std2io11read_to_end17h5495ead827e91f37Eread_to_end_ZN3std2io4Read11read_to_end17h1ee5693929972f31E_ZN3std3sys4unix4pipe8AnonPipe4read17h3dc59e23f2a9392cE_ZN59_$LT$std..process..ChildStderr$u20$as$u20$std..io..Read$GT$4read17h8fa24529e9ee6af5E_ZN3std2io28read_to_end_with_reservation17hd851eacfdffe8599Eread_to_end_with_reservation_ZN3std2io11read_to_end17h26413c7fd6d6f987Eread_to_end_ZN3std2io4Read11read_to_end17h70ee3b2bccee314cE_ZN59_$LT$std..process..ChildStdout$u20$as$u20$std..io..Read$GT$4read17h2d7850144b80b054E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h05c912c93ab7d539Efrom_error_ZN4core6result19Result$LT$T$C$E$GT$6unwrap17hd52e43c953be8021Eunwrap_ZN3std3sys4unix2os6getpid17h02ec63c555fb9773Egetpid_ZN5alloc4sync12Arc$LT$T$GT$3new17h88bdf9b336a38c42Enew_ZN4core4sync6atomic10atomic_add17hd359d7eecf792e32Eatomic_add_ZN4core4sync6atomic11AtomicUsize9fetch_add17hd898e29a8c263c8bEfetch_add_ZN64_$LT$alloc..sync..Arc$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h42c85dba8f9094b1Eclonempsc_ZN4core4sync6atomic23atomic_compare_exchange17ha1185b9e8355de20Eatomic_compare_exchange_ZN4core4sync6atomic10AtomicBool16compare_exchange17hb91f5f9a3f427572E_ZN3std10sys_common13thread_parker5futex6Parker6unpark17hf22909c52ec0c4bcEunpark_ZN3std6thread6Thread6unpark17hd6567b9ff53d7248E_ZN3std3sys4unix5futex10futex_wake17h829a09c9930a78c0Efutex_wakeSignalToken_ZN4core3ptr57drop_in_place$LT$std..sync..mpsc..blocking..WaitToken$GT$17h4a40470bf3d627dbEdrop_in_place_ZN3std6thread4park17h56a637a50bd19232EWaitToken_ZN4core3cmp5impls48_$LT$impl$u20$core..cmp..Ord$u20$for$u20$i64$GT$3cmp17h7c9256a2d3303fc1E_ZN4core5tuple58_$LT$impl$u20$core..cmp..Ord$u20$for$u20$$LP$A$C$B$RP$$GT$3cmp17h4d654d804be897c3Ecmp_ZN65_$LT$std..sys..unix..time..Timespec$u20$as$u20$core..cmp..Ord$GT$3cmp17hca09ba811b515d24E_ZN72_$LT$std..sys..unix..time..Timespec$u20$as$u20$core..cmp..PartialOrd$GT$11partial_cmp17hcd167509b30e0db2E_ZN78_$LT$std..sys..unix..time..inner..Instant$u20$as$u20$core..cmp..PartialOrd$GT$11partial_cmp17h3bb22e088dc42454E_ZN60_$LT$std..time..Instant$u20$as$u20$core..cmp..PartialOrd$GT$2ge17hbc0958be3ac3eb96E_ZN4core3cmp9PartialEq2ne17h47424ed893d1a3b2Ene_ZN3std3sys4unix4time5inner7Instant19checked_sub_instant17hb0ed77589d32b1ceEchecked_sub_instant_ZN3std4time7Instant14duration_since17heccdcd257f213e4aE_ZN60_$LT$std..time..Instant$u20$as$u20$core..ops..arith..Sub$GT$3sub17hbd4f411fe52f006bE_ZN4core6result19Result$LT$T$C$E$GT$2ok17ha6c49c7210b52c29Eok_ZN4core6option15Option$LT$T$GT$6expect17hb35d412d62fdb8edEexpect_ZN3std4sync4mpsc8blocking6tokens17hd9d3f5d6b11e1290Etokens_ZN4core3ptr87drop_in_place$LT$core..option..Option$LT$std..sync..mpsc..blocking..SignalToken$GT$$GT$17h0ea35482cfc61860Edrop_in_place>_ZN4core3ptr59drop_in_place$LT$std..sync..mpsc..blocking..SignalToken$GT$17h3c755839c78543f2Edrop_in_place_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$7is_null17h0a125d37c4694189Eis_nullQueue_ZN4core10intrinsics19copy_nonoverlapping17h70f1f132cf5b5ffbEcopy_nonoverlapping>_ZN4core3ptr4read17h611ee821a242d429Eread>_ZN4core3ptr23swap_nonoverlapping_one17hac01dd98d8974aedEswap_nonoverlapping_one>_ZN4core3mem4swap17h9f706952909126c7Eswap>_ZN4core3mem7replace17h635036dda3739b3bEreplace>_ZN4core3mem4take17h9219d19e5ac0256dEtake>_ZN4core6option15Option$LT$T$GT$4take17h20c9dd76ae9bd7eaEtake_ZN4core6option15Option$LT$T$GT$6unwrap17h839112e02d8a1c96Eunwrapbarrier_ZN3std4sync5mutex14Mutex$LT$T$GT$3new17h9252d209ef665041EnewBarrier_ZN3std4sync5mutex14Mutex$LT$T$GT$4lock17h955d98ec9112b1eaElock_ZN3std4sync5mutex19MutexGuard$LT$T$GT$3new17hd75ecb346e4df913E_ZN4core6result19Result$LT$T$C$E$GT$6unwrap17hf75a4029734d62f9Eunwrap,std::sys_common::poison::PoisonError>>_ZN3std10sys_common5mutex12MovableMutex3raw17he9a4d25f552f9838EcondvarSameMutexCheck_ZN3std10sys_common7condvar5check14SameMutexCheck6verify17h42eadd24790831e9EverifyCondvar_ZN3std10sys_common7condvar7Condvar4wait17hb4f201a45dd2b0b4E_ZN3std4sync7condvar7Condvar4wait17h2eef6b270f5d90c6Ewait_ZN4core4sync6atomic23atomic_compare_exchange17h0bae5ba248ddde75Eatomic_compare_exchange_ZN4core4sync6atomic11AtomicUsize16compare_exchange17he7ac4db3a50574b4E_ZN3std3sys4unix7condvar7Condvar4wait17haf01b1dce2042b02E_ZN3std4sync5mutex12guard_poison17h7a46995b10f44708Eguard_poison_ZN4core3num23_$LT$impl$u20$usize$GT$12wrapping_add17h61d7faac444d3e58E_ZN3std10sys_common7condvar7Condvar10notify_all17h9ce77effe46912eeEnotify_all_ZN3std4sync7condvar7Condvar10notify_all17h6e494c9267b0ad08E_ZN3std3sys4unix7condvar7Condvar10notify_all17h427c72eb87ee31ccEBarrierWaitResult_ZN3std4sync7barrier17BarrierWaitResult9is_leader17hd516efab25f032b3Eis_leader_ZN75_$LT$alloc..boxed..Box$LT$T$GT$$u20$as$u20$core..convert..From$LT$T$GT$$GT$4from17h73f7ddd608bead5bEfrom_ZN3std10sys_common7condvar7Condvar3new17hdf8e178ca0325952E_ZN5alloc5boxed12Box$LT$T$GT$3new17h67f5c003393568e8Enew_ZN3std3sys4unix7condvar7Condvar4init17h90d949df9fd33d84E_ZN3std10sys_common7condvar7Condvar10notify_one17h6ea625a6ab4710baEnotify_one_ZN3std3sys4unix7condvar7Condvar10notify_one17hd2af102794e03b1cE_ZN4core6option15Option$LT$T$GT$6unwrap17hfc1895d030c406baE_ZN4core10intrinsics19copy_nonoverlapping17h8d93bd6db54c234cE_ZN4core3ptr23swap_nonoverlapping_one17h9c8358adedc32885E_ZN4core3mem4swap17h2482a26b587a8d39E_ZN4core3mem7replace17h2e794d3a4c9466bcE_ZN4core3mem4take17hbf9e5f9258b61224E_ZN4core6option15Option$LT$T$GT$4take17hdcdc54b685fcaea7E_ZN3std3sys4unix4args3imp7cleanup17h7dd7c56ae5f82debE_ZN3std3sys4unix4args7cleanup17h91f0b79cc9bab01aE_ZN3std10sys_common7cleanup28_$u7b$$u7b$closure$u7d$$u7d$17h0d9d62949cd90a56E_ZN4core4sync6atomic12atomic_store17h3eb77ca0365fa0c2Eatomic_store_ZN4core4sync6atomic11AtomicIsize5store17h1a2d74e718d07ea0E_ZN4core4sync6atomic12atomic_store17heb9af9de7f23fbaaEatomic_store<*mut *const u8>_ZN4core4sync6atomic18AtomicPtr$LT$T$GT$5store17h2baf3b3ae2dd0855Estore<*const u8>_ZN4core4sync6atomic11atomic_load17h91bea9878ce5d22cEatomic_load<*mut core::ffi::c_void>_ZN4core4sync6atomic18AtomicPtr$LT$T$GT$4load17h536507b6454cde71Eload_ZN3std3sys4unix14stack_overflow3imp7cleanup17hf8fa35467ecaf3cfE_ZN4core3ptr60drop_in_place$LT$std..sys..unix..stack_overflow..Handler$GT$17h4a46f3e67ac43769Edrop_in_placeat_exit_imp_ZN3std10sys_common11at_exit_imp7cleanup17h593b116fd49dd0a9E_ZN5alloc5alloc8box_free17hdff42ee8fa47f69cEbox_free, alloc::alloc::Global>, alloc::alloc::Global>,alloc::alloc::Global>_ZN4core10intrinsics19copy_nonoverlapping17h05d8afbbefaf6554Ecopy_nonoverlapping<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>_ZN4core3ptr4read17h0c6abf68dcf4e5f2Eread<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>_ZN4core3ptr23swap_nonoverlapping_one17hb1ae722844618013Eswap_nonoverlapping_one<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>_ZN4core3mem4swap17h69be603de003c393Eswap<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>_ZN4core3mem7replace17h3ea2862db66df97eEreplace<*mut alloc::vec::Vec, alloc::alloc::Global>, alloc::alloc::Global>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h9ce0d46a97442dadEoffset, alloc::alloc::Global>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h1937d6a360addf24Eadd, alloc::alloc::Global>>_ZN90_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17h2e2c511bece016d8Einto_iter, alloc::alloc::Global>,alloc::alloc::Global>_ZN103_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hfe9316b56a025a45Enext, alloc::alloc::Global>,alloc::alloc::Global>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h2b71ca3e75485b28E_ZN4core10intrinsics19copy_nonoverlapping17hc27c187d937fa755Ecopy_nonoverlapping, alloc::alloc::Global>>_ZN4core3ptr4read17h7216b43b8ed31c66Eread, alloc::alloc::Global>>_ZN90_$LT$alloc..boxed..Box$LT$F$C$A$GT$$u20$as$u20$core..ops..function..FnOnce$LT$Args$GT$$GT$9call_once17h61144a2be4ee36d8Ecall_once<(),FnOnce<()>,alloc::alloc::Global>_ZN4core10intrinsics19copy_nonoverlapping17h85226c527b401e68E_ZN4core3ptr4read17hc075baad535fb734E_ZN4core3ptr23swap_nonoverlapping_one17h668dfb8f12047c12E_ZN4core3mem4swap17hbc42c6b4f93319d3E_ZN4core3mem7replace17hd6d7c8b9cf744b0eE_ZN4core3mem4take17h2dd424f8a014275aE_ZN4core6option15Option$LT$T$GT$4take17h4f9a4a4ddce95dd4E_ZN4core6option15Option$LT$T$GT$6unwrap17h5f463ca7185df9d7E_ZN3std10sys_common11at_exit_imp4push17hded3b643a1856fbeE_ZN3std10sys_common7at_exit17h298c49ad456d883eEat_exit_ZN3std2io5stdio6stdout28_$u7b$$u7b$closure$u7d$$u7d$17h52f16632048aad90E_ZN3std4lazy21SyncOnceCell$LT$T$GT$15get_or_init_pin28_$u7b$$u7b$closure$u7d$$u7d$17ha921b4a10733f7c3E{{closure}}>>,closure-0,closure-1>_ZN3std10sys_common11at_exit_imp4init17hd544c1779f295fc7E_ZN5alloc3vec12Vec$LT$T$GT$3new17ha386c77981205babEnew, alloc::alloc::Global>>_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h479a0541fd609da9Epush, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h34aad8c4a621792cEgrow_amortized, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17hb53f704a9cc56a73Etry_reserve, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17ha2e2766b7408aacbE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17he6d64609fd63db29E_ZN4core5alloc6layout6Layout5array17hd2b6d4c2cfe590f7Earray, alloc::alloc::Global>>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17he8539e8d9475c2daEas_mut_ptr, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h7be0fcebdb756781Eset_ptr, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17hd187810bae80503fEcapacity_from_bytes, alloc::alloc::Global>,alloc::alloc::Global>_ZN4core3ptr5write17hbf6920ef046906f9Ewrite, alloc::alloc::Global>>_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$13with_capacity17hb38610ed186992f5E_ZN3std2io8buffered10linewriter19LineWriter$LT$W$GT$3new17ha3639f724220f2f8Enew_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$5write17h7fa23584cdc0418cEwrite>>>_ZN3std10sys_common7remutex23ReentrantMutex$LT$T$GT$4init17h129215de31eff42cEinit>>_ZN3std2io5stdio6stdout28_$u7b$$u7b$closure$u7d$$u7d$17h3e841c82c9df5895E_ZN3std4sync4once4wait17h31928e56f3865572E_ZN4core3ptr44drop_in_place$LT$std..sync..once..Waiter$GT$17h642afe642424a08cEdrop_in_place_ZN4core3ptr49drop_in_place$LT$std..sync..once..WaiterQueue$GT$17hf124ea37c1837856Edrop_in_place_ZN4core4sync6atomic11atomic_swap17hb189d1f4bd04a70eEatomic_swap_ZN4core4sync6atomic11AtomicUsize4swap17h6c96a6305782fb68E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$7is_null17h7ae0331eae696c59Eis_null_ZN4core10intrinsics19copy_nonoverlapping17h48af388fc086415fEcopy_nonoverlapping>_ZN4core3ptr4read17h45efc825b5442197Eread>_ZN4core3ptr23swap_nonoverlapping_one17hbd068ecb1b198b67Eswap_nonoverlapping_one>_ZN4core3mem4swap17h302d5870c4550045Eswap>_ZN4core3mem7replace17h7f257194550f940aEreplace>_ZN4core4cell13Cell$LT$T$GT$7replace17h9b1d4d1a2fbf3255E_ZN4core4cell13Cell$LT$T$GT$4take17h8067fad80c8d6adfEtake>_ZN4core6option15Option$LT$T$GT$6unwrap17h1428659598a29a43EunwrapOnceState_ZN4core10intrinsics19copy_nonoverlapping17h559cd3853baf325dEcopy_nonoverlapping_ZN4core3ptr23swap_nonoverlapping_one17h6935e5ddfe1a1074Eswap_nonoverlapping_one_ZN4core3mem4swap17h5ff77ce4660aa7b0E_ZN4core3mem7replace17hbadef7094c783e0bEreplace_ZN4core4cell13Cell$LT$T$GT$7replace17hd4a520a7aa6cad65E_ZN4core4cell13Cell$LT$T$GT$3set17hc492c87d560a0271Eset_ZN3std4time7Instant22checked_duration_since17h488217009623f66bEchecked_duration_since_ZN4core6option15Option$LT$T$GT$17unwrap_or_default17hf30a3af9583aee14Eunwrap_or_default_ZN4core6option15Option$LT$T$GT$8and_then17h441663c6b8e59fddEand_thenTimespec_ZN3std3sys4unix4time8Timespec20checked_add_duration17ha6ffa0a90d1321feEchecked_add_duration_ZN3std3sys4unix4time5inner7Instant20checked_add_duration17hd4c19abbce7a70e2E_ZN3std4time7Instant11checked_add17h578b3536bd68d5ffE_ZN4core3num21_$LT$impl$u20$i64$GT$15overflowing_add17hd5992eb861f4d4b6E_ZN4core3num21_$LT$impl$u20$i64$GT$11checked_add17h67e6bf89c69b8b6aE_ZN4core6option15Option$LT$T$GT$6expect17hc2113cdece1e2188Eexpect_ZN88_$LT$std..time..Instant$u20$as$u20$core..ops..arith..Add$LT$core..time..Duration$GT$$GT$3add17h2544bae4ccd81fdaE_ZN4core6option15Option$LT$T$GT$8and_then17hbb785fe8b245caadE_ZN3std3sys4unix4time8Timespec20checked_sub_duration17hf9fed11dc092a35eEchecked_sub_duration_ZN3std3sys4unix4time5inner7Instant20checked_sub_duration17h4aeff48fc361df84E_ZN3std4time7Instant11checked_sub17hb6dc8fabf3af0433E_ZN4core3num21_$LT$impl$u20$i64$GT$15overflowing_sub17h657787362a75e475E_ZN4core3num21_$LT$impl$u20$i64$GT$11checked_sub17hcaed08c170c0b87aE_ZN88_$LT$std..time..Instant$u20$as$u20$core..ops..arith..Sub$LT$core..time..Duration$GT$$GT$3sub17hf058202b16b7fcacE_ZN73_$LT$std..sys..unix..time..inner..Instant$u20$as$u20$core..fmt..Debug$GT$3fmt17h322ec28eb447893eESystemTime_ZN3std3sys4unix4time5inner10SystemTime3now17hb3858779ea0005b5E_ZN3std3sys4unix4time5inner10SystemTime8sub_time17hd879220f7ac7f0cdEsub_time_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h3411e0dc959038dcEmap_err std::time::SystemTimeError>_ZN3std4time10SystemTime3now17hbb019576db90f990E_ZN3std4time10SystemTime14duration_since17hf77cd787cb04a368E_ZN3std3sys4unix4time5inner10SystemTime20checked_add_duration17hdcfe6b3d79edf362E_ZN4core6option15Option$LT$T$GT$3map17h3785ea6bbd384402Emap std::time::SystemTime>_ZN3std3sys4unix4time5inner10SystemTime20checked_sub_duration17he062517ee564052cE_ZN3std4time10SystemTime11checked_add17ha87722e57888ccb4E_ZN4core6option15Option$LT$T$GT$6expect17h6497a3ecdaf6b7aaEexpect_ZN91_$LT$std..time..SystemTime$u20$as$u20$core..ops..arith..Add$LT$core..time..Duration$GT$$GT$3add17hd2685b5951e49ab2E_ZN3std4time10SystemTime11checked_sub17h5bdf5483fd748d90E_ZN91_$LT$std..time..SystemTime$u20$as$u20$core..ops..arith..Sub$LT$core..time..Duration$GT$$GT$3sub17hdb2028dacdd6b68cESystemTimeError_ZN3std4sync4once4Once15call_once_force17h2256939e9ae29e4dE_ZN3std3sys4unix5alloc81_$LT$impl$u20$core..alloc..global..GlobalAlloc$u20$for$u20$std..alloc..System$GT$5alloc17hed6e2b938ea3a37bE_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$7is_null17hee4d2e5036b8c286Eis_null_ZN3std3sys4unix5alloc14aligned_malloc17hf68abd536080a330Ealigned_malloc_ZN3std3sys4unix5alloc81_$LT$impl$u20$core..alloc..global..GlobalAlloc$u20$for$u20$std..alloc..System$GT$7dealloc17h086d6bc2aad34aa7E_ZN3std10sys_common9backtrace10_print_fmt17ha0237cd11a34e2bfE_ZN4core6result19Result$LT$T$C$E$GT$2ok17h9cf59abeac4a425eEok_ZN75_$LT$std..backtrace_rs..print..PrintFmt$u20$as$u20$core..cmp..PartialEq$GT$2eq17hb7412454e8db155bE_ZN4core3cmp9PartialEq2ne17hc35ab2d4183de1fbEne_ZN3std12backtrace_rs9backtrace20trace_unsynchronized17hd5302bd66215dab9Etrace_unsynchronized_ZN4core6option15Option$LT$T$GT$8and_then17h288eddab2a8b82abEand_then_ZN4core6option15Option$LT$T$GT$6as_ref17h1de58853b0ad4c0dEas_ref_ZN3std12backtrace_rs9symbolize10SymbolName6as_str17ha8f2ccbe76085d20E_ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17hc42b38f6d2ddb617E_ZN4core6option15Option$LT$T$GT$3map17hb5ab756a693b22aeEmap<&rustc_demangle::Demangle,&str,closure-0>_ZN3std12backtrace_rs9symbolize10SymbolName6as_str28_$u7b$$u7b$closure$u7d$$u7d$17haff09a530c54bcd2E_ZN4core6option15Option$LT$T$GT$7or_else17hbf1fe3072357116bEor_else<&str,closure-1>_ZN3std12backtrace_rs9symbolize10SymbolName6as_str28_$u7b$$u7b$closure$u7d$$u7d$17hfae524b3e4749736E_ZN3std12backtrace_rs5print17BacktraceFrameFmt6symbol17h9b9ac42c38b3a9aaEsymbol_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hf65dc5042ae1b476Efrom_error_ZN3std12backtrace_rs9symbolize28resolve_frame_unsynchronized17h7128b38d7b684708E_ZN4core6result19Result$LT$T$C$E$GT$5is_ok17h60dfa816bed5ad9dEis_ok<(),core::fmt::Error>_ZN3std4path118_$LT$impl$u20$core..convert..From$LT$$RF$std..path..Path$GT$$u20$for$u20$alloc..borrow..Cow$LT$std..path..Path$GT$$GT$4from17h5f740a2b8ad59619E_ZN50_$LT$T$u20$as$u20$core..convert..Into$LT$U$GT$$GT$4into17h4deb85559211267cEinto<&std::path::Path,alloc::borrow::Cow>_ZN57_$LT$std..path..Display$u20$as$u20$core..fmt..Display$GT$3fmt17h2e5c8d65f5b1477cE_ZN82_$LT$std..path..PathBuf$u20$as$u20$core..convert..AsRef$LT$std..path..Path$GT$$GT$6as_ref17h035576785c351d83E_ZN55_$LT$$RF$T$u20$as$u20$core..convert..AsRef$LT$U$GT$$GT$6as_ref17haf32bd80f96830d3Eas_ref_ZN55_$LT$$RF$T$u20$as$u20$core..convert..AsRef$LT$U$GT$$GT$6as_ref17h4c7b096d12f9534dEas_ref<&std::path::PathBuf,std::path::Path>_ZN3std4path4Path12strip_prefix17hbb4f1c93a667efd7Estrip_prefix<&&std::path::PathBuf>_ZN3std10sys_common12os_str_bytes5Slice6to_str17hf1c36013ac46e80aEto_str_ZN3std3ffi6os_str5OsStr6to_str17h6a61b111da71f89aE_ZN3std4path4Path6to_str17hed2db0df9a6322c8E_ZN3std3sys4unix7condvar7Condvar7destroy17h150be437d9165e92E_ZN3std2fs16symlink_metadata17hdec2ea5c72334eefEsymlink_metadata<&std::path::Path>_ZN3std2fs11remove_file17h945856916f8aae57Eremove_file<&std::path::Path>_ZN3std2fs8FileType10is_symlink17h10f9d57ddd33f6b8E_ZN3std2fs8read_dir17h0fcd69d806b981dcEread_dir<&std::path::Path>_ZN4core6result19Result$LT$T$C$E$GT$3map17h8d35b85654aa1ac1Emap std::fs::ReadDir>_ZN75_$LT$std..fs..ReadDir$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hde8c2c418fe9886fE_ZN3std2fs11remove_file17h0f12e66dc336d904Eremove_file<&std::path::PathBuf>_ZN4core3ptr38drop_in_place$LT$std..fs..DirEntry$GT$17h68d7c741d2f87998Edrop_in_place_ZN4core3ptr37drop_in_place$LT$std..fs..ReadDir$GT$17h662e35c1a6b58e49Edrop_in_place_ZN3std2fs10remove_dir17hee68d80a9f56dd39Eremove_dir<&std::path::Path>_ZN75_$LT$alloc..boxed..Box$LT$T$GT$$u20$as$u20$core..convert..From$LT$T$GT$$GT$4from17h382aa05be4c02205Efrom_ZN5alloc5boxed12Box$LT$T$GT$3new17hbb072d814d1994daEnew_ZN3std3sys4unix5mutex5Mutex4init17h0c4dd23fc17916daE_ZN3std3sys4unix6cvt_nz17h34a420ae095c8ebeEcvt_nz_ZN4core3ptr60drop_in_place$LT$std..sys..unix..mutex..PthreadMutexAttr$GT$17h29b8aee07448acebEdrop_in_place_ZN3std10sys_common10bytestring20debug_fmt_bytestring17hc2c9d1b9a23a70deEdebug_fmt_bytestring_ZN3std10sys_common10bytestring20debug_fmt_bytestring17write_str_escaped17had0129430876af27Ewrite_str_escaped_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17heec333fd4c4d0381Enext,core::char::EscapeDebug>_ZN114_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h90e26d2efb07435eEnext_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h42ae342dbe50ec9fEnext_ZN107_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..adapters..fuse..FuseImpl$LT$I$GT$$GT$4next17h33b142911fcc8c2dEnext>_ZN100_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h8ea4aad7af8e6780E_ZN4core6option15Option$LT$T$GT$3map17hac8d86ee5fabf0bfEmap_ZN4core6option15Option$LT$T$GT$6as_mut17h573729c6fba3d215Eas_mut_ZN4core4char7methods22_$LT$impl$u20$char$GT$20is_grapheme_extended17h54724469fcff8ab6Eis_grapheme_extended_ZN4core4char7methods22_$LT$impl$u20$char$GT$16escape_debug_ext17h06d3aee08151dc5bEescape_debug_ext_ZN4core4char7methods22_$LT$impl$u20$char$GT$12escape_debug17h98fa4e4ac4bbd4dbEescape_debug_ZN3std10sys_common10bytestring20debug_fmt_bytestring17write_str_escaped28_$u7b$$u7b$closure$u7d$$u7d$17hfebeba0599707195E_ZN4core3ops8function5impls80_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$9call_once17he03d7c347910217aEcall_once<(char),closure-0>_ZN96_$LT$alloc..collections..btree..map..BTreeMap$LT$K$C$V$GT$$u20$as$u20$core..default..Default$GT$7default17h89940c1efcc9b4c3Edefault>_ZN3std10sys_common7process10CommandEnv14maybe_saw_path17hc949f2bab3f68054Emaybe_saw_path_ZN64_$LT$std..ffi..os_str..OsStr$u20$as$u20$core..cmp..PartialEq$GT$2eq17h4928115f8203ccdeE_ZN75_$LT$std..ffi..os_str..OsStr$u20$as$u20$core..cmp..PartialEq$LT$str$GT$$GT$2eq17h103e4d5d157a5fa9E_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17h9fe4a31cc356a19eEeq_ZN66_$LT$std..ffi..os_str..OsStr$u20$as$u20$alloc..borrow..ToOwned$GT$8to_owned17hf07030693ae11ef7E_ZN50_$LT$T$u20$as$u20$core..convert..Into$LT$U$GT$$GT$4into17h43f8110370008d26Einto_ZN4core3ptr103drop_in_place$LT$core..option..Option$LT$core..option..Option$LT$std..ffi..os_str..OsString$GT$$GT$$GT$17h971d1b50c18b9f56Edrop_in_place>>_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$12remove_entry17hffcee3250c771c85Eremove_entry,std::ffi::os_str::OsStr>_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$6remove17he787eb9e8618ffddEremove,std::ffi::os_str::OsStr>_ZN5alloc11collections5btree6search142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$11search_tree17h955d9e07cb51c226Esearch_tree,std::ffi::os_str::OsStr>_ZN5alloc11collections5btree6search91_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$$GT$10find_index17hceee051a4f9adac0Efind_index,alloc::collections::btree::node::marker::LeafOrInternal,std::ffi::os_str::OsStr>_ZN5alloc11collections5btree6search91_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$Type$GT$$GT$11search_node17hebaed35fa2c65a24Esearch_node,alloc::collections::btree::node::marker::LeafOrInternal,std::ffi::os_str::OsStr>_ZN98_$LT$std..ffi..os_str..OsString$u20$as$u20$core..borrow..Borrow$LT$std..ffi..os_str..OsStr$GT$$GT$6borrow17h8c187643622453d7E_ZN5alloc11collections5btree3map5entry26OccupiedEntry$LT$K$C$V$GT$9remove_kv17h83da04cd00e7a246Eremove_kv>_ZN5alloc11collections5btree3map5entry26OccupiedEntry$LT$K$C$V$GT$12remove_entry17h83f1f273bf15911dEremove_entry>_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17h1eb11a560a9f10d3Eforce,alloc::collections::btree::node::marker::KV>_ZN5alloc11collections5btree6remove269_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$18remove_kv_tracking17hd6f2478699fb5a43Eremove_kv_tracking,closure-0>_ZN5alloc11collections5btree6remove263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$18remove_internal_kv17h6b85a84e9c41febeEremove_internal_kv,closure-0>_ZN5alloc11collections5btree8navigate142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$14last_leaf_edge17hba284320e9b2355eElast_leaf_edge>_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7left_kv17h5e2cf52beeb83b2bEleft_kv,alloc::collections::btree::node::marker::Leaf>_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8right_kv17h80f37945570ac7b1Eright_kv,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree8navigate227_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$7next_kv17h26ef6a8aff06b0efEnext_kv>_ZN4core6result19Result$LT$T$C$E$GT$2ok17h39e284d4ea6938e4Eok, alloc::collections::btree::node::marker::LeafOrInternal>, alloc::collections::btree::node::marker::KV>,alloc::collections::btree::node::NodeRef, alloc::collections::btree::node::marker::LeafOrInternal>>_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$6kv_mut17hb1614968f5aee495Ekv_mut,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$10replace_kv17h5365eeafe8cd63dcEreplace_kv,alloc::collections::btree::node::marker::LeafOrInternal>_ZN5alloc11collections5btree8navigate235_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$14next_leaf_edge17hea16cbbce5748f45Enext_leaf_edge>_ZN5alloc11collections5btree8navigate142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$15first_leaf_edge17hf29741f380920e01Efirst_leaf_edge>_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$18pop_internal_level17hb2f50dad63464e3fEpop_internal_level>_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$17clear_parent_link17h348b5a7fefa54e32Eclear_parent_link>_ZN4core6option15Option$LT$T$GT$3map17h52553124cd8e0eb2Emap<(std::ffi::os_str::OsString, core::option::Option),core::option::Option,closure-0>_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$6remove28_$u7b$$u7b$closure$u7d$$u7d$17h77f1dbb4c20bb762E{{closure}},std::ffi::os_str::OsStr>_ZN4core6option15Option$LT$T$GT$3map17hc967a8871ca51011Emap<(&std::ffi::os_str::OsString, &core::option::Option),(&std::ffi::os_str::OsStr, core::option::Option<&std::ffi::os_str::OsStr>),closure-0>_ZN96_$LT$std..sys_common..process..CommandEnvs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next28_$u7b$$u7b$closure$u7d$$u7d$17hbd0e776ecb2055b1E_ZN4core6option15Option$LT$T$GT$6as_ref17h9108ee437b142a6fEas_ref_ZN4core6option15Option$LT$T$GT$8as_deref17h1401fbc0bb12dbcbEas_deref_ZN4core6option15Option$LT$T$GT$3map17h0d8fc57c7fd2e69bEmap<&std::ffi::os_str::OsString,&std::ffi::os_str::OsStr,closure-0>_ZN4core6option15Option$LT$T$GT$8as_deref28_$u7b$$u7b$closure$u7d$$u7d$17hcf3ff0a302134a06E{{closure}}_ZN108_$LT$alloc..collections..btree..map..Iter$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h2c270c8db47f9600Esize_hint>_ZN4core4iter6traits10exact_size17ExactSizeIterator8is_empty17hbc5e4424144fdd3fEis_empty>>rwlockRWLock_ZN3std3sys4unix6rwlock6RWLock3new17ha0436ff56c8d97beE_ZN4core6result19Result$LT$T$C$E$GT$2ok17h794f21fee22e7b59Eok_ZN4core6option15Option$LT$T$GT$8and_then17ha9fc3409485e2e7cEand_thenmin_stack_ZN3std10sys_common6thread9min_stack28_$u7b$$u7b$closure$u7d$$u7d$17h22d36f1d4aa96c2aEBorrowRef_ZN4core4cell9BorrowRef3new17h227c1ef835de4586E_ZN4core4cell16RefCell$LT$T$GT$10try_borrow17ha4ffc922eedff87bEtry_borrow>_ZN4core4cell16RefCell$LT$T$GT$6borrow17h6ece90f00643064eE_ZN4core3num23_$LT$impl$u20$isize$GT$12wrapping_add17h98425e340554a702E_ZN4core4cell10is_reading17hf9bccd6303b47256Eis_reading_ZN4core6option15Option$LT$T$GT$7is_some17h8c197653f3598aadEis_some_ZN4core6option15Option$LT$T$GT$7is_none17h64b4f29bd5f8698dEis_none_ZN63_$LT$core..cell..BorrowRef$u20$as$u20$core..ops..drop..Drop$GT$4drop17h39dc21adf0ee4275E_ZN4core3ptr42drop_in_place$LT$core..cell..BorrowRef$GT$17h7e0fda22d3488e77Edrop_in_place_ZN4core3ptr112drop_in_place$LT$core..cell..Ref$LT$core..option..Option$LT$std..sys_common..thread_info..ThreadInfo$GT$$GT$$GT$17hd1537da207c60d8aEdrop_in_place>>_ZN4core4cell16RefCell$LT$T$GT$14try_borrow_mut17hb444c097db85ea3fEtry_borrow_mut>_ZN4core4cell16RefCell$LT$T$GT$10borrow_mut17h9e36264a302f0deeE_ZN4core3ptr115drop_in_place$LT$core..cell..RefMut$LT$core..option..Option$LT$std..sys_common..thread_info..ThreadInfo$GT$$GT$$GT$17hce640d003450666aEdrop_in_place>>_ZN4core6option15Option$LT$T$GT$6as_mut17h6edf503c80b9f6bbEas_mut_ZN4core6option15Option$LT$T$GT$6unwrap17h46b312e85c1dda05Eunwrap<&mut std::sys_common::thread_info::ThreadInfo>_ZN64_$LT$alloc..sync..Arc$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h79a1cf82f554aa54Eclone_ZN58_$LT$std..thread..Thread$u20$as$u20$core..clone..Clone$GT$5clone17h49473600e8e90fd3E_ZN3std10sys_common11thread_info14current_thread28_$u7b$$u7b$closure$u7d$$u7d$17h6276046a55b06b7bE_ZN4core6result19Result$LT$T$C$E$GT$6expect17ha0ed764b2fb7e9a9Eexpect>,core::cell::BorrowError>_ZN4core6result19Result$LT$T$C$E$GT$6expect17h69a99ccc25ea5696Eexpect>,core::cell::BorrowMutError>_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17h8088d9b00eff8b87Etry_with>,closure-0,()>_ZN3std6thread5local17LocalKey$LT$T$GT$4with17h72cc2b82c0431d20E_ZN3std10sys_common11thread_info3set28_$u7b$$u7b$closure$u7d$$u7d$17hfca49b64907de9b4E_ZN3std6thread5local17LocalKey$LT$T$GT$4with17hc986a9bdbce50600E_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17h1cf10dd4a17dca9eEtry_with>,closure-1,()>_ZN3std10sys_common11thread_info3set28_$u7b$$u7b$closure$u7d$$u7d$17h6eb43a4a0e3fff76E_ZN4core6result19Result$LT$T$C$E$GT$6expect17h61239c087b035833Eexpect<(),std::thread::local::AccessError>_ZN4core3ptr83drop_in_place$LT$std..sys_common..thread_info..set..$u7b$$u7b$closure$u7d$$u7d$$GT$17hae2667e1d213d5b1Edrop_in_placethread_local_key_ZN3std3sys4unix16thread_local_key3set17hee70139d2105a947EStaticKey_ZN3std10sys_common16thread_local_key9StaticKey3set17h3b118c5b8e126678E_ZN5alloc5alloc8box_free17h90bed6310dfac021Ebox_free,alloc::alloc::Global>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h4e51d4eecb3a6f08Eoffset<(*mut u8, unsafe extern "C" fn(*mut u8))>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17heb6979fd90a4c1f1Eadd<(*mut u8, unsafe extern "C" fn(*mut u8))>_ZN90_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17h922dc4304eaa1490Einto_iter<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN103_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hfeb7cc0ba4a7e029Enext<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN4core10intrinsics19copy_nonoverlapping17h4d0e094bf629e88fEcopy_nonoverlapping<(*mut u8, unsafe extern "C" fn(*mut u8))>_ZN4core3ptr4read17h7dbcf5bde2c79a78Eread<(*mut u8, unsafe extern "C" fn(*mut u8))>_ZN4core3ptr147drop_in_place$LT$alloc..vec..into_iter..IntoIter$LT$$LP$$BP$mut$u20$u8$C$unsafe$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$BP$mut$u20$u8$RP$$RP$$GT$$GT$17h7f48224a1c1f937fEdrop_in_place>_ZN3std10sys_common16thread_local_key9StaticKey3key17h7e5c1c139c0daafbE_ZN3std10sys_common16thread_local_key9StaticKey3get17h3a7f722e92512dbaE_ZN3std3sys4unix16thread_local_key3get17h39cae7d5d5c8676aEthread_local_dtorregister_dtor_fallback_ZN3std3sys4unix16thread_local_key6create17hace1dfb22bbafddcE_ZN3std3sys4unix16thread_local_key7destroy17h76edaf047c705ebfE_ZN4core6option15Option$LT$T$GT$9unwrap_or17he78a2d784022c554Eunwrap_or<&str>wtf8Wtf8Buf_ZN3std10sys_common4wtf87Wtf8Buf12as_mut_slice17h7beabb813949fc83Eas_mut_sliceWtf8_ZN3std10sys_common4wtf84Wtf814next_surrogate17h58c54aa4a3ffc8c7Enext_surrogate_ZN3std10sys_common4wtf816decode_surrogate17h9a5c74c59110410fEdecode_surrogate_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hdfc050ea3b351cebE_ZN114_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h580c5c65d6c4c963E_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h37e2e56de35c6f01E_ZN107_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..adapters..fuse..FuseImpl$LT$I$GT$$GT$4next17h00cf5283b05b0d90E_ZN100_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0de8ecfa522b3822E_ZN4core6option15Option$LT$T$GT$3map17h7d6d7535175ed3ebE_ZN64_$LT$std..sys_common..wtf8..Wtf8$u20$as$u20$core..fmt..Debug$GT$3fmt17write_str_escaped28_$u7b$$u7b$closure$u7d$$u7d$17hf30f2c829aa37eb1E_ZN4core3ops8function5impls80_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$9call_once17h39b4b1b6e0f29a0bE_ZN3std4sync4once4Once9call_once17hbe12a4610ab92c7eE_ZN4core4sync6atomic12atomic_store17hfeac8f49bfb11391Eatomic_store<*mut ()>_ZN4core4sync6atomic18AtomicPtr$LT$T$GT$5store17hdaa25808297e25b9Estore<()>_ZN4core4sync6atomic11atomic_swap17hf4b9e2aabb58fcadEatomic_swap<*mut ()>_ZN4core4sync6atomic18AtomicPtr$LT$T$GT$4swap17ha70675655f4a6ce4Eswap<()>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$7is_null17h1ff41cd079d840b6Eis_null<()>_ZN4core4sync6atomic11atomic_load17h0914d205ee2e7d2dEatomic_load<*mut ()>_ZN4core4sync6atomic18AtomicPtr$LT$T$GT$4load17he9ff7d52785ac2b2Eload<()>__default_lib_allocator_ZN3std3sys4unix5alloc81_$LT$impl$u20$core..alloc..global..GlobalAlloc$u20$for$u20$std..alloc..System$GT$7realloc17hdc5bc4421a17d338E_ZN3std10sys_common5alloc16realloc_fallback17ha45e894459cc4e7eErealloc_fallback_ZN3std3sys4unix5alloc81_$LT$impl$u20$core..alloc..global..GlobalAlloc$u20$for$u20$std..alloc..System$GT$12alloc_zeroed17hb9cecffa14413e5eE_ZN3std3sys4unix6rwlock6RWLock5write17h304a336a6a64e878E_ZN3std10sys_common6rwlock6RWLock5write17h9428ea7b88aba4ddE_ZN3std3sys4unix6rwlock6RWLock12write_unlock17h592dfab06e53b7f9Ewrite_unlock_ZN3std10sys_common6rwlock6RWLock12write_unlock17h367b6348683fc421E_ZN3std3sys4unix6rwlock6RWLock10raw_unlock17h96edeb76805871dbE_ZN4core3ptr202drop_in_place$LT$alloc..boxed..Box$LT$dyn$u20$core..ops..function..Fn$LT$$LP$$RF$core..panic..PanicInfo$C$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$17h43ab4b5933784619Edrop_in_place, alloc::alloc::Global>>_ZN5alloc5alloc8box_free17haf7cdf82d68bef0fEbox_free,alloc::alloc::Global>_ZN4core6option15Option$LT$T$GT$6as_ref17h161bda002d3d557eEas_ref>_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$3get17h9ea83922606f7ddcEget>_ZN3std6thread5local4fast12Key$LT$T$GT$3get17h5e6b826ab4ffa8b6Eget,fn() -> core::cell::Cell>LOCAL_PANIC_COUNT_ZN3std9panicking11panic_count17LOCAL_PANIC_COUNT7__getit17h12bbe66e631ae075E_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17hb835c4d68b1b8426Etry_with,closure-0,usize>_ZN3std6thread5local17LocalKey$LT$T$GT$4with17h29d293f08d8eaf6eE_ZN3std9panicking11panic_count3get17h7091c9a8c1d0e410E_ZN4core6option15Option$LT$T$GT$6unwrap17hf0f271ef81e8b490Eunwrap<&core::panic::Location>_ZN31_$LT$dyn$u20$core..any..Any$GT$2is17h03dea6ff741c8a9cEis<&str>_ZN31_$LT$dyn$u20$core..any..Any$GT$12downcast_ref17hbb81fd2c2b0caf15Edowncast_ref<&str>_ZN54_$LT$dyn$u20$core..any..Any$u2b$core..marker..Send$GT$12downcast_ref17h38916d6482a5bb9aE_ZN4core6option15Option$LT$T$GT$8and_then17hd678dfb015cee6fdEand_then<&std::thread::Thread,&str,closure-0>_ZN3std10sys_common9backtrace18rust_backtrace_env17hdcc2e18ca4edc29fErust_backtrace_env_ZN4core6option15Option$LT$T$GT$3map17h3cbfe4d506501a76Emap_ZN78_$LT$std..ffi..os_str..OsString$u20$as$u20$core..cmp..PartialEq$LT$str$GT$$GT$2eq17h7e07f78ec46e0546E_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17hf820c6152e9abd71Eeq_ZN3std10sys_common9backtrace18rust_backtrace_env28_$u7b$$u7b$closure$u7d$$u7d$17h453e420af9169cdaE_ZN31_$LT$dyn$u20$core..any..Any$GT$2is17h58457932783c61f1Eis_ZN31_$LT$dyn$u20$core..any..Any$GT$12downcast_ref17heff8ef550bb42f9fEdowncast_ref_ZN54_$LT$dyn$u20$core..any..Any$u2b$core..marker..Send$GT$12downcast_ref17h48700f975037538eE_ZN100_$LT$alloc..string..String$u20$as$u20$core..ops..index..Index$LT$core..ops..range..RangeFull$GT$$GT$5index17h92cfb4317c831b12Edefault_hook_ZN3std9panicking12default_hook28_$u7b$$u7b$closure$u7d$$u7d$17h2f1394b1c1cc23e7E_ZN3std2io5stdio18set_output_capture17h36a8ed69ad306c50E_ZN4core6option15Option$LT$T$GT$9unwrap_or17hb23435cb3aaafeadEunwrap_or<(std::sys_common::backtrace::RustBacktrace, isize)>_ZN4core6result19Result$LT$T$C$E$GT$6expect17h7cdbe2e73d998ed9Eexpect_ZN4core4sync6atomic11atomic_swap17hf76121baf2704e97Eatomic_swap_ZN4core4sync6atomic10AtomicBool4swap17hd771b83f59044866E_ZN3std10sys_common9backtrace5print17h57a9f95204c2fdd6E_ZN3std10sys_common9backtrace6_print17h0c0b93221682afc8E_ZN4core3mem4drop17h47d48b3f84ab4af8Edrop>_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17hc2f41e9b1b7ebf3fE_ZN3std6thread5local17LocalKey$LT$T$GT$4with17h2042a579f6e9cc2fEincrease_ZN3std9panicking11panic_count8increase28_$u7b$$u7b$closure$u7d$$u7d$17h6c6ede1b2e3a65dcE_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17h312f3cac7359e227E_ZN3std6thread5local17LocalKey$LT$T$GT$4with17hdb0432c4a1f01d38Edecrease_ZN3std9panicking11panic_count8decrease28_$u7b$$u7b$closure$u7d$$u7d$17hbb8ef90ce39239a9E_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17hd7239319218a0d4aEtry_with,closure-0,bool>_ZN3std6thread5local17LocalKey$LT$T$GT$4with17h6093241fedbd2dbbEis_zero_slow_path_ZN3std9panicking11panic_count17is_zero_slow_path28_$u7b$$u7b$closure$u7d$$u7d$17h2e2cf28b65f8a028E_ZN4core6result19Result$LT$T$C$E$GT$6expect17h25e1f5b511301318Eexpect_ZN3std9panicking11panic_count8decrease17h083bd0007bca7100EPanicInfo_ZN4core5panic9PanicInfo20internal_constructor17hdae4be701f994da1Einternal_constructor_ZN4core3fmt9Arguments6as_str17hab5a3c47cee93328Ebegin_panic_handlerPanicPayload_ZN3std9panicking19begin_panic_handler12PanicPayload3new17h6c8c7bcb264b5330E_ZN4core6option15Option$LT$T$GT$18get_or_insert_with17he285be97eb9d8152Eget_or_insert_with_ZN3std9panicking19begin_panic_handler12PanicPayload4fill17hfcae2c5973ba6c4dEfill_ZN3std9panicking19begin_panic_handler12PanicPayload4fill28_$u7b$$u7b$closure$u7d$$u7d$17hd0eadac179f93d02E_ZN4core3ptr4read17h20bf24c548a0aa36Eread_ZN4core3ptr23swap_nonoverlapping_one17ha65f166ad9116139Eswap_nonoverlapping_one_ZN4core3mem4swap17h429fe6db7a2da9b8Eswap_ZN4core3mem7replace17h14898a9d850f774eEreplace_ZN4core3mem4take17h7de14f28a22e2846Etake_ZN4core10intrinsics19copy_nonoverlapping17hdd5dc561306a996fEcopy_nonoverlapping_ZN5alloc5boxed12Box$LT$T$GT$3new17h2ab0243396334534E_ZN5alloc5boxed16Box$LT$T$C$A$GT$8into_raw17h9ce30063800e598aEinto_raw_ZN5alloc5boxed12Box$LT$T$GT$3new17hc22b76095c4000c3Ebegin_panic_ZN4core10intrinsics19copy_nonoverlapping17hbdf70614a0bd5344Ecopy_nonoverlapping>_ZN4core3ptr4read17h25950d1de2d416c3Eread>_ZN4core3ptr23swap_nonoverlapping_one17h57bfa8e8dccdaf1cEswap_nonoverlapping_one>_ZN4core3mem4swap17h703e6c55abbe26dbEswap>_ZN4core3mem7replace17h309a8242e23412a6Ereplace>_ZN4core3mem4take17hda9a8704f91607a6Etake>_ZN4core6option15Option$LT$T$GT$4take17hb9e36e801465d971Etake<&str>_ZN3std9panicking11panic_count8increase17hc9d67c97a6a4d329E_ZN3std3sys4unix6rwlock6RWLock4read17h65690ef1db4a8ff4E_ZN3std10sys_common6rwlock6RWLock4read17hbaa110ed4aa44ec3E_ZN4core5panic9PanicInfo11set_payload17haadcb6aa7c95527aEset_payload_ZN3std3sys4unix6rwlock6RWLock11read_unlock17h0130d4c8198a6374Eread_unlock_ZN3std10sys_common6rwlock6RWLock11read_unlock17h8223b8eddf115bc9E_ZN4core10intrinsics19copy_nonoverlapping17hb115eb8d2115ed83Ecopy_nonoverlapping>_ZN4core3ptr4read17h7ebfc93ebf3828e2Eread>_ZN4core3ptr23swap_nonoverlapping_one17ha9d4b4e4408b4b33Eswap_nonoverlapping_one>_ZN4core3mem4swap17h7b6689a8bcd69503Eswap>_ZN4core3mem7replace17h4971874bb97632f8Ereplace>rust_panic_without_hook_ZN3std3sys4unix4init21sanitize_standard_fds17h4a11becf82708e73Esanitize_standard_fds_ZN3std3sys4unix4init17h906c64aa75c5ddd1E_ZN3std3sys4unix4init13reset_sigpipe17hf0149ea99d35b54eEreset_sigpipe_ZN3std3sys4unix6thread5guard4init17h9111dfd4d2ed39e6E_ZN3std3sys4unix6thread5guard23get_stack_start_aligned17h9ca9bf37697274adEget_stack_start_aligned_ZN4core10intrinsics11write_bytes17h0cc2e008499c55aaEwrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17h2cd12db6ccf7f75fE_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17h82c04edf8e5eab03Ezeroed_ZN4core3mem6zeroed17h8275ac8e12748662E_ZN3std3sys4unix6thread5guard15get_stack_start17h6cb5208308630521Eget_stack_start_ZN4core10intrinsics11write_bytes17hbdd9bb99e8953182Ewrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17h046d5c066b82d525E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17he8c6a07969632f07Ezeroed_ZN4core3mem6zeroed17h5fd379d70d490784E_ZN3std3sys4unix14stack_overflow3imp4init17hf51bc9b3883e3251E_ZN4core4sync6atomic12atomic_store17h44efb15e7a569dafEatomic_store<*mut core::ffi::c_void>_ZN4core4sync6atomic18AtomicPtr$LT$T$GT$5store17h4a0ea96ad3247ce9Estore_ZN4core3ops8function5impls72_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$F$GT$9call_once17h527fb2333ede305eEcall_once<(),Fn<()>>_ZN3std9panicking3try7do_call17h309d8aee8149866cEdo_call<&Fn<()>,i32>_ZN3std9panicking3try17h75a60c31fd16bfc6Etry>_ZN3std5panic12catch_unwind17h1f9892423e99bc00Ecatch_unwind<&Fn<()>,i32>_ZN3std10sys_common7cleanup17h912bf26f5936ecd8E_ZN4core6result19Result$LT$T$C$E$GT$9unwrap_or17h8277f856a058efb6Eunwrap_or>_ZN4core3ptr125drop_in_place$LT$core..result..Result$LT$i32$C$alloc..boxed..Box$LT$dyn$u20$core..any..Any$u2b$core..marker..Send$GT$$GT$$GT$17hd7f523f85c353cf6Edrop_in_place>>_ZN3std9panicking3try8do_catch17hcfeef3ce7223ef93Edo_catch<&Fn<()>,i32>_ZN3std12backtrace_rs9symbolize5gimli6Symbol4name17hbb18620bc2c9a4edE_ZN4core6option15Option$LT$T$GT$6as_ref17hcbf5c9a35c598cfaEas_ref<&[u8]>_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17ha47716eae041f27bEfrom_error_ZN3std12backtrace_rs9symbolize5gimli6Symbol4addr17hb3f19b6229f9cb18E_ZN3std12backtrace_rs9symbolize6Symbol4addr17h4fa0f1362a83d378E_ZN3std12backtrace_rs5print17BacktraceFrameFmt17print_raw_generic17h906ec258329ac75dEprint_raw_generic_ZN3std12backtrace_rs5print17BacktraceFrameFmt14print_fileline17h05268802b5752ad2Eprint_filelinestd_detectcache_ZN4core9core_arch3x865cpuid13__cpuid_count17hcab75e8bbbc35cb6E__cpuid_count_ZN4core9core_arch3x865cpuid7__cpuid17h7bb169befd2c4ddfE__cpuid_ZN3std10std_detect6detect2os15detect_features17h2b74090eabdc2caeEdetect_features_ZN3std10std_detect6detect2os15detect_features28_$u7b$$u7b$closure$u7d$$u7d$17h0d2d116f0d166f68E_ZN3std10std_detect6detect3bit4test17h18063f282d2f89bbE_ZN4core5array103_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u3b$$u20$N$u5d$$GT$$u20$for$u20$$u5b$A$u3b$$u20$N$u5d$$GT$2eq17h5ef3fc8d75350d70ECache_ZN3std10std_detect6detect5cache5Cache10initialize17h7f31b1f62dbce6c8E_ZN3std10std_detect6detect5cache13do_initialize17h249b01ed84d09251Edo_initialize_ZN3std10std_detect6detect5cache10initialize17h8e8f1ab3a93d8499E_ZN4core6option15Option$LT$T$GT$6as_ref17h7df58cbaf27afe3aEas_ref>_ZN3std6thread5local4lazy21LazyKeyInner$LT$T$GT$3get17h96026d08c7497ce9Eget>_ZN3std6thread5local4fast12Key$LT$T$GT$3get17hcc7f45a6366367a4Eget,fn() -> core::cell::Cell<(u64, u64)>>private_ZN58_$LT$std..path..Prefix$u20$as$u20$core..cmp..PartialEq$GT$2eq17h82e1d0f1440114e2E_ZN67_$LT$std..path..PrefixComponent$u20$as$u20$core..cmp..PartialEq$GT$2eq17h179467fe1d8f203dE_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17hf252105ae9250b3dEeq_ZN4core3ptr99drop_in_place$LT$core..result..Result$LT$std..net..addr..SocketAddr$C$std..io..error..Error$GT$$GT$17h4dd1cc31a25bb20aEdrop_in_place>_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hd64f87d54c6b7e22Efrom_error_ZN88_$LT$core..str..pattern..CharSearcher$u20$as$u20$core..str..pattern..ReverseSearcher$GT$15next_match_back17hde8ae5c80fd8c3afEnext_match_back_ZN4core3str21_$LT$impl$u20$str$GT$11rsplit_once17h3e715858dd653b27Ersplit_once_ZN4core3str6traits110_$LT$impl$u20$core..slice..index..SliceIndex$LT$str$GT$$u20$for$u20$core..ops..range..RangeTo$LT$usize$GT$$GT$3get17hb823ec957df4841aE_ZN4core3str6traits110_$LT$impl$u20$core..slice..index..SliceIndex$LT$str$GT$$u20$for$u20$core..ops..range..RangeTo$LT$usize$GT$$GT$5index17haea54ec75ed9079dE_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17hf908fa17e61a8a38Eindex>_ZN4core3str6traits112_$LT$impl$u20$core..slice..index..SliceIndex$LT$str$GT$$u20$for$u20$core..ops..range..RangeFrom$LT$usize$GT$$GT$13get_unchecked17h02c6c6c6277ea277E_ZN4core3str21_$LT$impl$u20$str$GT$5parse17h689b5aaf5e66d4aeEparse_ZN3std3ffi5c_str7CString3new17hab4e2684e445882dE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h645b203a8103454bEinto_result_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hd2258fd02b207259Efrom_error_ZN4core10intrinsics11write_bytes17he26e91c4ce7db2b6Ewrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17hc6fa846dde382568E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17h339e8eb99c1652d9Ezeroed_ZN4core3mem6zeroed17h99cee06af540ab35E_ZN3std3sys4unix3net7cvt_gai17h5ec75d0e2f6a8d3dEcvt_gai_ZN3std3sys4unix3net19on_resolver_failure17h0d1c27d771157925Eon_resolver_failure_ZN4core5tuple65_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$$LP$A$C$B$RP$$GT$2lt17hfcc2332c69f79a66Elt_ZN4core3cmp5impls56_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$usize$GT$2ne17h86ddfdcb3ce0ce9eE_ZN4core6result19Result$LT$T$C$E$GT$3map17hf04bbe9ae3dea846Emap<(),std::io::error::Error,std::sys_common::net::LookupHost,closure-0>_ZN4core6result19Result$LT$T$C$E$GT$6unwrap17h927ec43814f8e353Eunwrap<&str,core::str::error::Utf8Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hf1d2f8a14b6c6ec7Efrom_errorconnect_ZN3std10sys_common3net9TcpStream7connect28_$u7b$$u7b$closure$u7d$$u7d$17h7af24a9d6ea11cf7E_ZN3std3sys4unix5cvt_r17h75fb4d0750d6bbd9E_ZN3std10sys_common3net8sockname17h9db1d948d6b39d73E_ZN3std10sys_common3net9TcpStream11socket_addr17h63dc9956bc8dd17eE_ZN3std10sys_common3net9TcpStream11socket_addr28_$u7b$$u7b$closure$u7d$$u7d$17hca96521522f06d6aE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h903d42bbe3984855Efrom_error_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h8b5032372a841a87Efrom_error_ZN3std10sys_common3net9UdpSocket7connect28_$u7b$$u7b$closure$u7d$$u7d$17h0b044d7fd5b7a992E_ZN3std3sys4unix5cvt_r17h5faafbdc238a9a27E_ZN3std10sys_common3net8sockname17h098632ef30eac3a1E_ZN3std10sys_common3net9UdpSocket11socket_addr17hfc6b5fc0794dd00fE_ZN3std10sys_common3net9UdpSocket11socket_addr28_$u7b$$u7b$closure$u7d$$u7d$17h7508608465acc8a8E_ZN3std3ffi5c_str4CStr19from_bytes_with_nul17h428d671f22c42f31Efrom_bytes_with_nul_ZN3std3sys4unix4weak5fetch17he4fb607fee57346fEfetch_ZN3std3sys4unix4args3imp11really_init17h0ea679ff554bcaf9Ereally_initARGV_INIT_ARRAY_ZN3std3sys4unix7condvar25saturating_cast_to_time_t17hd56eb9920d57cd14Esaturating_cast_to_time_t_ZN4core6option15Option$LT$T$GT$8and_then17h3f169a5043be8c05E_ZN4core6option15Option$LT$T$GT$9unwrap_or17h264692e4ffd29146Eunwrap_or_ZN3std3sys4unix2fs11OpenOptions4mode17h7af58198703d3342E_ZN3std3sys4unix2fs11OpenOptions12custom_flags17he69e0e285247e828Ecustom_flags_ZN3std3sys4unix2fs10DirBuilder8set_mode17h806f59977d1e94d1Eset_mode_ZN4core10intrinsics11write_bytes17h49da396d4b0575e8Ewrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17h05f036d4d015a1b3E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17h942f775db42bfdf7Ezeroed_ZN4core3mem6zeroed17h04d4e472af172e7eE_ZN54_$LT$u8$u20$as$u20$core..slice..cmp..SliceContains$GT$14slice_contains17heeccfd68f05df3dbEslice_contains_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8contains17h6d3a5d99ab560eacEcontainszip_ZN111_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..adapters..zip..ZipImpl$LT$A$C$B$GT$$GT$4next17hb7834edc805c9703Enext,core::slice::iter::Iter>_ZN102_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0aa984a9c6bf8fcaE_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h2de2d2b68416b932Enext>, fn(u8) -> core::ascii::EscapeDefault>,core::ascii::EscapeDefault>_ZN114_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h3009a8adb3bd26b8Enext>,core::ascii::EscapeDefault,fn(u8) -> core::ascii::EscapeDefault>cloned_ZN104_$LT$core..iter..adapters..cloned..Cloned$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hc4e969f72a334123Enext,u8>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h702e02cfeed38594Enext>,fn(u8) -> core::ascii::EscapeDefault>_ZN107_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..adapters..fuse..FuseImpl$LT$I$GT$$GT$4next17h3555992752f29f9dEnext>, fn(u8) -> core::ascii::EscapeDefault>>_ZN100_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h2fcb2b8dd9c23481E_ZN4core3ops8function5FnMut8call_mut17hb02f806ec4c53baeEcall_mut core::ascii::EscapeDefault,(u8)>_ZN4core3ops8function5impls80_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$9call_once17ha49bd74c1fd6fa4cEcall_once<(u8),fn(u8) -> core::ascii::EscapeDefault>_ZN4core6option15Option$LT$T$GT$3map17h39a97263e31cb13dEmap core::ascii::EscapeDefault>_ZN3std3sys4unix3ext3net4addr10SocketAddr7address17he07c3bdedd57c176E_ZN4core10intrinsics11write_bytes17hcac6e3b0a0bf58e9Ewrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17h3dfd44866017656eE_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17hf7b2576f5852fbd1Ezeroed_ZN4core3mem6zeroed17h2b23c1639490156bE_ZN3std3sys4unix3net6Socket8recv_msg17hc0d7ab3cc6a78a57Erecv_msg_ZN3std3sys4unix3ext3net4addr10SocketAddr10from_parts17hffd8c4a2d9fae909Efrom_parts_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h45e413ddc277cf3bEfrom_error<(usize, bool, core::result::Result),std::io::error::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h3a762b4c318a4ef4Einto_result<(libc::unix::linux_like::sockaddr_un, u32),std::io::error::Error>_ZN3std3sys4unix3net6Socket8send_msg17h6b15ee47bc59076fEsend_msgSocketCred_ZN122_$LT$std..sys..unix..ext..net..ancillary..AncillaryDataIter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha6b4f28f5f3930f1Enext_ZN4core3ptr14read_unaligned17h1da1b455444a5878Eread_unaligned_ZN122_$LT$std..sys..unix..ext..net..ancillary..AncillaryDataIter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h01324c19fbc2501dEnext_ZN4core3ptr14read_unaligned17h1451324261ea6894Eread_unaligned_ZN4libc4unix10linux_like5linux11CMSG_NXTHDR17hac73b41a11fb5d3cECMSG_NXTHDR_ZN4libc4unix10linux_like10CMSG_ALIGN17h65123bf395fc754dECMSG_ALIGN_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hc67fa4b63b07068aEoffsetAncillaryData_ZN3std3sys4unix3ext3net9ancillary13AncillaryData16try_from_cmsghdr17hd2dee102db7457d1Etry_from_cmsghdr_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h87775f89feb80008E_ZN4libc4unix10linux_like9CMSG_DATA17h06b9084176ef4651ECMSG_DATA_ZN4libc4unix10linux_like13CMSG_FIRSTHDR17hdc5095fa61382a98ECMSG_FIRSTHDR_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h15afe16838760203Efrom_error>SocketAncillary_ZN3std3sys4unix3ext3net9ancillary21add_to_ancillary_data17ha22c6e6cdd95197dEadd_to_ancillary_data_ZN4libc4unix10linux_like10CMSG_SPACE17h91eec668185f3b12ECMSG_SPACE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$14split_last_mut17heea53dd1f3993191Esplit_last_mut_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4fill17he93bc15ba159039fEfill_ZN4libc4unix10linux_like8CMSG_LEN17h3ad5bd4709d66924ECMSG_LEN_ZN3std3sys4unix3ext3net9ancillary21add_to_ancillary_data17hd658d97ee606b4cfEadd_to_ancillary_data_ZN4core3ptr115drop_in_place$LT$core..result..Result$LT$std..sys..unix..ext..net..addr..SocketAddr$C$std..io..error..Error$GT$$GT$17hd723d30e153d5759Edrop_in_place>datagram_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h4f88d3d8d9968c89Efrom_errorUnixDatagram_ZN3std3sys4unix3net6Socket8new_pair17ha8b25b39eaa4f210Enew_pair_ZN3std3sys4unix2fd8FileDesc3new17h63145968423136acE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h7a56c133f2a0bbddEfrom_error<(std::sys::unix::ext::net::datagram::UnixDatagram, std::sys::unix::ext::net::datagram::UnixDatagram),std::io::error::Error>_ZN3std3sys4unix3ext3net4addr10SocketAddr3new17h8e1865332c2b8626Enewrecv_from_flags_ZN3std3sys4unix3ext3net8datagram12UnixDatagram15recv_from_flags28_$u7b$$u7b$closure$u7d$$u7d$17h25f4ac4e0965e5dfE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h1006e2f10cff3b2eEinto_result_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17had6d7b033fea77e6Efrom_error<(usize, std::sys::unix::ext::net::addr::SocketAddr),std::io::error::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h6ab08d18353be808Einto_result<(usize, bool, core::result::Result),std::io::error::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h2bec69d8ab8cb428Efrom_error<(usize, bool, std::sys::unix::ext::net::addr::SocketAddr),std::io::error::Error>_ZN3std3sys4unix3net6Socket5write17h1a1befb516ae799aE_ZN85_$LT$std..sys..unix..net..Socket$u20$as$u20$std..sys_common..FromInner$LT$i32$GT$$GT$10from_inner17h8f54de9eae33fe1bElistener_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h4f788ec6135047b9Efrom_error<(std::sys::unix::ext::net::stream::UnixStream, std::sys::unix::ext::net::addr::SocketAddr),std::io::error::Error>UnixListener_ZN4core6result19Result$LT$T$C$E$GT$3map17h7891f4dcb8500fb1Emap<(std::sys::unix::ext::net::stream::UnixStream, std::sys::unix::ext::net::addr::SocketAddr),std::io::error::Error,std::sys::unix::ext::net::stream::UnixStream,closure-0>stream_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h661137346dfbcceeEfrom_error<(std::sys::unix::ext::net::stream::UnixStream, std::sys::unix::ext::net::stream::UnixStream),std::io::error::Error>UnixStream_ZN3std3sys4unix3ext3net4addr10SocketAddr3new17h202d0000ac6c2343Elocal_addr_ZN3std3sys4unix3ext3net6stream10UnixStream10local_addr28_$u7b$$u7b$closure$u7d$$u7d$17h42fd1a9c2802fabcE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h2cdeb186e576819cEfrom_error_ZN3std3sys4unix3ext3net4addr10SocketAddr3new17hc846431d8cd5360bE_ZN3std3sys4unix3ext3net6stream10UnixStream9peer_addr28_$u7b$$u7b$closure$u7d$$u7d$17h6d33c396440e88ecEucredimpl_linux_ZN3std3sys4unix3ext5ucred10impl_linux9peer_cred17h707bd9988882728cEpeer_cred_ZN97_$LT$std..sys..unix..ext..net..stream..UnixStream$u20$as$u20$std..sys..unix..ext..io..AsRawFd$GT$9as_raw_fd17hd6b38a353acc27a5Eas_raw_fd_ZN3std3sys4unix3net6Socket12set_passcred17h109d403ec8735740Eset_passcred_ZN3std3sys4unix3net6Socket8passcred17hf8db7f807bb2d36bE_ZN4core3ptr138drop_in_place$LT$$LP$usize$C$bool$C$core..result..Result$LT$std..sys..unix..ext..net..addr..SocketAddr$C$std..io..error..Error$GT$$RP$$GT$17hbf7e9667fb97c7d7Edrop_in_place<(usize, bool, core::result::Result)>_ZN3std3sys4unix3ext3net9ancillary31send_vectored_with_ancillary_to17h34898637df9741d3Esend_vectored_with_ancillary_to_ZN82_$LT$$RF$std..sys..unix..ext..net..stream..UnixStream$u20$as$u20$std..io..Read$GT$4read17h1c9d190fa1d8a25bE_ZN82_$LT$$RF$std..sys..unix..ext..net..stream..UnixStream$u20$as$u20$std..io..Read$GT$13read_vectored17he9c7c64b7b4fe200E_ZN3std3sys4unix3net6Socket13read_vectored17h2003ccf4a5fa3febE_ZN3std3sys4unix7process14process_common7Command3uid17h704ebce386ccd1f6E_ZN3std3sys4unix7process14process_common7Command3gid17h5309d94482ab6136E_ZN4core5alloc6layout6Layout5array17he6df60d5375ed700Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h363fb3302028b511Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h63204ff0d63a8aa0Ewith_capacity_in_ZN5alloc7raw_vec15RawVec$LT$T$GT$13with_capacity17h18922c8ef13b7b7cEwith_capacity_ZN99_$LT$alloc..boxed..Box$LT$$u5b$T$u5d$$GT$$u20$as$u20$core..convert..From$LT$$RF$$u5b$T$u5d$$GT$$GT$4from17h6bf46622cd4bddd5Efrom_ZN3std3sys4unix7process14process_common7Command6groups17h8c5263a9a6cc721fE_ZN4core10intrinsics19copy_nonoverlapping17ha4b9c37f36bdcf4dEcopy_nonoverlapping_ZN4core3ptr87drop_in_place$LT$core..option..Option$LT$alloc..boxed..Box$LT$$u5b$u32$u5d$$GT$$GT$$GT$17h783b7dfffb0b89edEdrop_in_place>>_ZN4core3ptr59drop_in_place$LT$alloc..boxed..Box$LT$$u5b$u32$u5d$$GT$$GT$17h7ba0fb93ef232412Edrop_in_place>_ZN5alloc5alloc8box_free17h76ab968f547c3892Ebox_free<[u32],alloc::alloc::Global>_ZN3std3sys4unix7process13process_inner66_$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$4exec17he8bc1f61fcca4accE_ZN3std3sys4unix7process14process_common7Command7saw_nul17h0e93da09ccb88e2cEsaw_nul_ZN4core3ptr102drop_in_place$LT$core..option..Option$LT$std..sys..unix..process..process_common..CStringArray$GT$$GT$17h8c2074806f9922aeEdrop_in_place>_ZN4core6option15Option$LT$T$GT$6as_ref17h9b92ace895e09c0dEas_ref_ZN4core3ptr72drop_in_place$LT$std..sys..unix..process..process_common..StdioPipes$GT$17h9dfc50c4fc5f92baEdrop_in_place_ZN3std3sys4unix7process13process_inner10ExitStatus11core_dumped17h2b9db581156e7242Ecore_dumped_ZN4libc4unix10linux_like10WIFSTOPPED17h2fd6af9de4470143EWIFSTOPPED_ZN3std3sys4unix7process13process_inner10ExitStatus14stopped_signal17hb60851000c179573Estopped_signal_ZN4libc4unix10linux_like12WIFCONTINUED17h645a8799a7c731b7EWIFCONTINUED_ZN3std3sys4unix7process13process_inner10ExitStatus9continued17h6b1508d4cf51e690Econtinued_ZN3std3sys4unix2os7getppid17hf1c6ce19d5a47932Egetppid_ZN3std2io28read_to_end_with_reservation17h5e4bf9f66caba916Eread_to_end_with_reservation<&std::sys::unix::fd::FileDesc,closure-0>_ZN3std2io11read_to_end17h8c3e0a2273dd03b3Eread_to_end<&std::sys::unix::fd::FileDesc>_ZN3std2io4Read11read_to_end17h79b4860b06719c50E_ZN66_$LT$$RF$std..sys..unix..fd..FileDesc$u20$as$u20$std..io..Read$GT$4read17h1ae1a0836ef6e5a4Eread_at_ZN3std3sys4unix2fd8FileDesc7read_at11cvt_pread6417h8c422c06bc2ec3c0Ecvt_pread64_ZN4core6result19Result$LT$T$C$E$GT$3map17h581413b3367c2f7eEmapwrite_at_ZN3std3sys4unix2fd8FileDesc8write_at12cvt_pwrite6417h6ca508277c4601d3Ecvt_pwrite64_ZN4core6result19Result$LT$T$C$E$GT$3map17h3a9c50766150bb80E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h3d95f7fb1a4e5e18Efrom_error_ZN4core10intrinsics11write_bytes17hd0ae1127e764e2bdEwrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17ha808d3f14dac4f23E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17h5b411abd77c8f76eEzeroed_ZN4core3mem6zeroed17h920a2ea7b76e70c2E_ZN64_$LT$alloc..sync..Arc$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h0af7286b01472872EcloneSlicePartialEq_ZN4core5slice3cmp14SlicePartialEq9not_equal17h0bc2cb8ba25d50b5Enot_equal<[u8],u8>_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2ne17h36c6fa1b30ba1304Ene_ZN4core5array92_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$A$u3b$$u20$N$u5d$$GT$$u20$for$u20$$u5b$B$u5d$$GT$2ne17h8e75ab55df78cd49E_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2ne17he0d0cbe3f9d8d87bEne<[u8],[u8; 2]>_ZN4core5array92_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$A$u3b$$u20$N$u5d$$GT$$u20$for$u20$$u5b$B$u5d$$GT$2ne17hfbf3827d0bb58ad3E_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2ne17h89e8f9221b86ec19Ene<[u8],[u8; 1]>_ZN3std4path4Path5_join17h0d44d8419c10b755E_join_ZN3std4path4Path4join17h3a1d156321b7dc49Ejoin<&std::ffi::os_str::OsStr>_ZN3std3sys4unix2fs11OpenOptions15get_access_mode17ha220dd4077075766Eget_access_mode_ZN3std3sys4unix2fs11OpenOptions17get_creation_mode17hd8a8bd7e82c15a36Eget_creation_modeopen_c_ZN3std3sys4unix2fs4File6open_c28_$u7b$$u7b$closure$u7d$$u7d$17h8ed90b755b05b2afE_ZN3std3sys4unix5cvt_r17hd6092459e9ca4967E_ZN61_$LT$std..sys..unix..fs..File$u20$as$u20$core..fmt..Debug$GT$3fmt8get_path17h3fe10b4de876a53cEget_path_ZN45_$LT$T$u20$as$u20$alloc..string..ToString$GT$9to_string17h71ffc2d96179432eEto_string_ZN4core6result19Result$LT$T$C$E$GT$6expect17he24e583ba9a2a2e7Eexpect<(),core::fmt::Error>_ZN3std3ffi6os_str103_$LT$impl$u20$core..convert..AsRef$LT$std..ffi..os_str..OsStr$GT$$u20$for$u20$alloc..string..String$GT$6as_ref17h6705425d2456f3cbE_ZN3std4path4Path3new17hfe62fd1b0ff5602eE_ZN3std4path95_$LT$impl$u20$core..convert..AsRef$LT$std..path..Path$GT$$u20$for$u20$alloc..string..String$GT$6as_ref17hdd11ed8dd210c0efE_ZN55_$LT$$RF$T$u20$as$u20$core..convert..AsRef$LT$U$GT$$GT$6as_ref17h754dca9e716a2791Eas_ref_ZN3std4path7PathBuf4push17h44f777ea42ec0a29Epush<&alloc::string::String>_ZN61_$LT$std..sys..unix..fs..File$u20$as$u20$core..fmt..Debug$GT$3fmt8get_mode17h82abf81a3e61db40Eget_mode_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hc4d66ed45db533bfEfrom_error_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$7is_null17hf66801371eebb23dEis_null_ZN5alloc4sync12Arc$LT$T$GT$3new17hcb3bca03d4c68ac9Enewset_perm_ZN3std3sys4unix2fs8set_perm28_$u7b$$u7b$closure$u7d$$u7d$17h0b5fc2c360894b8dE_ZN3std3sys4unix5cvt_r17h5197a7fcb9ca6ab6E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h2ed6056924899638Efrom_error_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h2188f7e317537422Efrom_error_ZN3std3sys4unix2fs9open_from17h061e47acda8d47f3Eopen_from_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hff48f603617e9c5eEfrom_error<(std::fs::File, std::fs::Metadata),std::io::error::Error>_ZN3std3sys4unix2fs27open_to_and_set_permissions17h129388c61a374a36Eopen_to_and_set_permissions_ZN80_$LT$std..fs..OpenOptions$u20$as$u20$std..sys..unix..ext..fs..OpenOptionsExt$GT$4mode17hdadf050711a708ecE_ZN3std2fs4File15set_permissions17ha90009a919f2f5cfE_ZN3std2io4copy17stack_buffer_copy17h61bb1c90db470761Estack_buffer_copy_ZN53_$LT$W$u20$as$u20$std..io..copy..BufferedCopySpec$GT$7copy_to17h69be02b1e8b308d1Ecopy_to_ZN3std2io4copy12generic_copy17h536a4098dadf49f1Egeneric_copy_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h8842a1cf5f7e5178E_ZN74_$LT$std..fs..FileType$u20$as$u20$std..sys..unix..ext..fs..FileTypeExt$GT$7is_fifo17h57373eed6545e329Eis_fifokernel_copyFdMeta_ZN74_$LT$std..fs..FileType$u20$as$u20$std..sys..unix..ext..fs..FileTypeExt$GT$15is_block_device17h12f715e5185a415fEis_block_device_ZN82_$LT$std..sys..unix..fs..File$u20$as$u20$std..sys_common..FromInner$LT$i32$GT$$GT$10from_inner17h4c2a708d080bc119E_ZN68_$LT$std..fs..File$u20$as$u20$std..sys..unix..ext..io..FromRawFd$GT$11from_raw_fd17h93959e82c3279c57Efrom_raw_fd_ZN3std3sys4unix11kernel_copy10fd_to_meta17hf6638f1ecbf98cb5Efd_to_meta_ZN4core3ptr90drop_in_place$LT$core..result..Result$LT$std..fs..Metadata$C$std..io..error..Error$GT$$GT$17h42468d8698468a9dEdrop_in_place>_ZN66_$LT$std..fs..File$u20$as$u20$std..sys..unix..ext..io..AsRawFd$GT$9as_raw_fd17hd0fe58dc2498fd40E_ZN3std3sys4unix3ext7process88_$LT$impl$u20$std..sys..unix..ext..io..AsRawFd$u20$for$u20$std..process..ChildStderr$GT$9as_raw_fd17hda00a0e88d11f55fE_ZN3std3sys4unix11kernel_copy10fd_to_meta17h5e234c0bf6f9d4ceEfd_to_metaAtomicU8_ZN4core4sync6atomic8AtomicU84load17h417f96af05a9bc31E_ZN3std3sys4unix4weak13Weak$LT$F$GT$3get17h74ca3fc61f03c871Eget isize>copy_regular_files_ZN3std3sys4unix11kernel_copy18copy_regular_files15copy_file_range17h90bcbce41e5c1a87Ecopy_file_range_ZN4core4sync6atomic8AtomicU85store17h1501399801e52681E_ZN3std3sys4unix4weak13Weak$LT$F$GT$3get17hc5aae59f4d90610cEget isize>sendfile_splice_ZN3std3sys4unix11kernel_copy15sendfile_splice6splice17h290437df97c608b7E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h5a49ecdc2cf4259dEfrom_error_ZN3std10sys_common3net10getsockopt17ha7621b84dc4f8e7aEgetsockopt_ZN4core4time8Duration3new17h23f3cd5c28eb8cd1E_ZN4core3num21_$LT$impl$u20$u64$GT$15overflowing_add17hef6fa0d8b9dcddb5E_ZN4core3num21_$LT$impl$u20$u64$GT$11checked_add17h70b11bbbdb2e4136E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h5817148f79578a2dEfrom_error,std::io::error::Error>_ZN71_$LT$std..path..PathBuf$u20$as$u20$core..convert..From$LT$$RF$T$GT$$GT$4from17h8891395a16c3c61aEfromsplit_paths_ZN3std3sys4unix4weak13Weak$LT$F$GT$3get17h2cafa100181c9533Eget *const i8>_ZN3std3sys4unix2os18glibc_version_cstr17hadcbd9d95f8ccd2dEglibc_version_cstr_ZN4core6option15Option$LT$T$GT$3map17h97463e180ded60e8Emap<&std::ffi::c_str::CStr,core::result::Result<&str, core::str::error::Utf8Error>,fn(&std::ffi::c_str::CStr) -> core::result::Result<&str, core::str::error::Utf8Error>>_ZN3std3ffi5c_str4CStr6to_str17hbd18dc040397ac40E_ZN4core3ops8function6FnOnce9call_once17h3ee45422f57de5c7Ecall_once core::result::Result<&str, core::str::error::Utf8Error>,(&std::ffi::c_str::CStr)>_ZN4core4iter6traits8iterator8Iterator4fuse17hae6ec3dd99d17787Efuse, fn(&str) -> core::result::Result>>_ZN3std3sys4unix2os19parse_glibc_version17h709ffb1797ce46bbEparse_glibc_version_ZN79_$LT$alloc..boxed..Box$LT$$u5b$T$u5d$$C$A$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hd09e4dd934c542e9Eclone_ZN63_$LT$std..ffi..c_str..CString$u20$as$u20$core..clone..Clone$GT$5clone17h336e0c5bba5245fcE_ZN5alloc3vec16Vec$LT$T$C$A$GT$17from_raw_parts_in17had563a7abbd92e66Efrom_raw_parts_in_ZN5alloc5slice4hack8into_vec17hb63792febe51954bEinto_vec_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8into_vec17hf2a32dfa25caebf5E_ZN79_$LT$std..sys_common..process..CommandEnv$u20$as$u20$core..default..Default$GT$7default17h7359167278923473E_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h8693c2c1ae401325Eindex_mut<*const i8>_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h576d1c162bdeddccEindex_mut<*const i8,usize>_ZN84_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..IndexMut$LT$I$GT$$GT$9index_mut17h6983fa3a541b3908Eindex_mut<*const i8,usize,alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h2c5ce5542a6f4e27Eas_mut_ptr<*const i8,alloc::alloc::Global>_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h5f0748424e3b179cEderef_mut<*const i8,alloc::alloc::Global>_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h8105af594c6228d3Eindex_mut_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h1fd5dbf85f7d57e0Eindex_mut_ZN84_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..IndexMut$LT$I$GT$$GT$9index_mut17hdeb2a57955b5bb13Eindex_mut_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h276de9372bc7ff26Ederef_mut_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h2fc762fa663e4b98Epush<*const i8,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h122b9fdd5a56234dEgrow_amortized<*const i8,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h3ed418252c44954bEtry_reserve<*const i8,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h53c95635963fc4b9E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17hd26c476c6303bd63E_ZN4core5alloc6layout6Layout5array17h60d381e0aed8489aEarray<*const i8>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hefa684cd345a9172Eset_ptr<*const i8,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17hfb1ad15a59fb3a25Ecapacity_from_bytes<*const i8,alloc::alloc::Global>_ZN4core3ptr5write17h703b1f1086b86934Ewrite<*const i8>_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h32d8438348409db2Epush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h6c0cbbe8f0b3aaafEgrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17hbecacfddccb37a11Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h7d7ad561e1eea0c4E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h4d1256fb8fe9428dE_ZN4core5alloc6layout6Layout5array17h4290c0e9947196e9Earray_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h85819325d496ad4eEset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h101318da8116e580Ecapacity_from_bytes_ZN4core3ptr5write17h125fcdbe5ff140f5Ewrite_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h7873454e929a2b9cEpush, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h61bed79f09c515d8Egrow_amortized, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17hd54b9d6fd5a46972Etry_reserve, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h0f43f14f0f630ea2E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h7bc9aa463b34ff90E_ZN4core5alloc6layout6Layout5array17h9c057cf53e72c3feEarray, alloc::alloc::Global>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h9159884ae8426896Ecurrent_memory, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h484f3d6bcc2e6e15Eas_mut_ptr, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h0de2d8b268148bf7Eset_ptr, alloc::alloc::Global>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17hffa5356b640c12dfEcapacity_from_bytes, alloc::alloc::Global>,alloc::alloc::Global>_ZN4core3ptr5write17h8962d0eaaa1769adEwrite, alloc::alloc::Global>>_ZN4core3ptr95drop_in_place$LT$core..option..Option$LT$std..sys..unix..process..process_common..Stdio$GT$$GT$17h8a25c7e543f4dadaEdrop_in_place>_ZN4core3ptr67drop_in_place$LT$std..sys..unix..process..process_common..Stdio$GT$17hbbb29f542e665cf4Edrop_in_place_ZN3std10sys_common7process10CommandEnv12is_unchanged17h42a2935c2999c8cfEis_unchanged_ZN3std10sys_common7process10CommandEnv18capture_if_changed17h253406af48b31b1fEcapture_if_changed_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$3new17hb783cc8eac6e52e3E_ZN3std10sys_common7process10CommandEnv7capture17h4f10483537854eb4E_ZN119_$LT$$RF$alloc..collections..btree..map..BTreeMap$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17hf18f43b53a05d1ceE_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$8is_empty17hbb1512f8860560b9Eis_empty>_ZN63_$LT$I$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17hcbd8bfe081255caaEinto_iter_ZN4core6option15Option$LT$T$GT$3map17hd81c19e8d59e2b90Emap,std::sys::unix::process::process_common::CStringArray,closure-0>_ZN4core3ptr37drop_in_place$LT$std..env..VarsOs$GT$17h6a12dad617c69dc1Edrop_in_place_ZN67_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hb56bbd3571f51c7dE_ZN73_$LT$std..sys_common..os_str_bytes..Buf$u20$as$u20$core..clone..Clone$GT$5clone17hb29e3450addfa098E_ZN65_$LT$std..ffi..os_str..OsString$u20$as$u20$core..clone..Clone$GT$5clone17he0171bd82c5e7a8fE_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$12remove_entry17hbfced35830b515c8Eremove_entry_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$6remove17h60ae86dd20545376Eremove_ZN5alloc11collections5btree3map5entry26OccupiedEntry$LT$K$C$V$GT$9remove_kv17h63f4bee675f4b3fdEremove_kv_ZN5alloc11collections5btree3map5entry26OccupiedEntry$LT$K$C$V$GT$12remove_entry17hb5f86e5090f6c8d0Eremove_entry_ZN5alloc11collections5btree4node151Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$HandleType$GT$5force17hee4d3e93b19534c9Eforce_ZN5alloc11collections5btree6remove269_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$18remove_kv_tracking17h52f0c503b4e054ccEremove_kv_tracking_ZN5alloc11collections5btree6remove263_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Internal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$18remove_internal_kv17h440e41f8a6d81d17Eremove_internal_kv_ZN5alloc11collections5btree8navigate142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$14last_leaf_edge17hfe3a3c1177244b51Elast_leaf_edge_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$7left_kv17h53ce331337918c25Eleft_kv_ZN5alloc11collections5btree4node139Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..Edge$GT$8right_kv17ha5f23a182a98d2ceEright_kv_ZN5alloc11collections5btree8navigate227_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..Edge$GT$$GT$7next_kv17ha3cf1b29da68b609Enext_kv_ZN4core6result19Result$LT$T$C$E$GT$2ok17hc839cd71f7c92e6cEok, alloc::collections::btree::node::marker::KV>,alloc::collections::btree::node::NodeRef>_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$6kv_mut17h09697c396bcbc8e8Ekv_mut_ZN5alloc11collections5btree4node171Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$NodeType$GT$$C$alloc..collections..btree..node..marker..KV$GT$10replace_kv17he714d2df0e978184Ereplace_kv_ZN5alloc11collections5btree8navigate235_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$14next_leaf_edge17hc6b93b317ce6f54bEnext_leaf_edge_ZN5alloc11collections5btree8navigate142_$LT$impl$u20$alloc..collections..btree..node..NodeRef$LT$BorrowType$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$$GT$15first_leaf_edge17h77beaa34c41af17fEfirst_leaf_edge_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$18pop_internal_level17h93bcda4989bf6353Epop_internal_level_ZN5alloc11collections5btree4node127NodeRef$LT$alloc..collections..btree..node..marker..Owned$C$K$C$V$C$alloc..collections..btree..node..marker..LeafOrInternal$GT$17clear_parent_link17h5ce727de98ae95e7Eclear_parent_link_ZN4core6option15Option$LT$T$GT$3map17h037c6df26cf03dcaEmap<(std::ffi::os_str::OsString, std::ffi::os_str::OsString),std::ffi::os_str::OsString,closure-0>_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$6remove28_$u7b$$u7b$closure$u7d$$u7d$17h46af8d521688606cE{{closure}}_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17hbab4054bff96d659Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h9fda8f758bb67a8dEwith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h12d25fe70426c668E_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h51b95002c5467f98Ewith_capacityCStringArray_ZN3std3sys4unix7process14process_common12CStringArray13with_capacity17hd37c2c3351a0af17E_ZN3std3sys4unix7process14process_common14construct_envp17h4456970b1ba0a80aEconstruct_envpcapture_env_ZN3std3sys4unix7process14process_common7Command11capture_env28_$u7b$$u7b$closure$u7d$$u7d$17h923a7409cc2834e6E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h47a09a248c6401d2Eallocate_in<*const i8,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h19975e8820c39e63Ewith_capacity_in<*const i8,alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h60449aeb6acadc41E_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h23287e210a848a90Ewith_capacity<*const i8>_ZN3std10sys_common12os_str_bytes3Buf13reserve_exact17hd4ae56c3b9d54767E_ZN3std3ffi6os_str8OsString13reserve_exact17ha6610bc0381b05c3E_ZN3std3ffi6os_str8OsString4push17hf3fd3209b5e76b57Epush<&std::ffi::os_str::OsString>_ZN55_$LT$$RF$T$u20$as$u20$core..convert..AsRef$LT$U$GT$$GT$6as_ref17h6b2cf30072e570d4Eas_ref_ZN3std3ffi5c_str7CString3new17h2e33f9a37b5f1b6cE_ZN4core3ptr101drop_in_place$LT$core..result..Result$LT$std..ffi..c_str..CString$C$std..ffi..c_str..NulError$GT$$GT$17h4abf7ecbd40642b5Edrop_in_place>_ZN3std3sys4unix7process14process_common12CStringArray4push17h26bfe3498e054569E_ZN4core6option15Option$LT$T$GT$6as_ref17h1406ee98d0d0e24bEas_ref_ZN4core6option15Option$LT$T$GT$9unwrap_or17hbe739c4b53410e29Eunwrap_or<&std::sys::unix::process::process_common::Stdio>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h6fbd1b5467798264Einto_result<(std::sys::unix::process::process_common::ChildStdio, core::option::Option),std::io::error::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h108b5c3c35d296deEfrom_error<(std::sys::unix::process::process_common::StdioPipes, std::sys::unix::process::process_common::ChildPipes),std::io::error::Error>_ZN4core6result19Result$LT$T$C$E$GT$14unwrap_or_else17hb59f8d96a0961195Eunwrap_or_elseos2c_ZN3std3sys4unix7process14process_common4os2c28_$u7b$$u7b$closure$u7d$$u7d$17hb6a73888d69083e3E_ZN70_$LT$$RF$str$u20$as$u20$std..ffi..c_str..CString..new..SpecIntoVec$GT$8into_vec17h262a123754c66865Einto_vec_ZN4core6result19Result$LT$T$C$E$GT$6unwrap17hc5ddc3c0cfb820b6Eunwrap_ZN3std3sys4unix4pipe9anon_pipe17h6be5725ef60b763bEanon_pipe_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h92c3ff5a84e90950Efrom_error<(std::sys::unix::process::process_common::ChildStdio, core::option::Option),std::io::error::Error>_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h9a22e19eb9847615Eindex_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17ha9cb2847231f6179Eindex_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17h4e1ba37409c80af2Eindex_ZN65_$LT$std..ffi..c_str..CString$u20$as$u20$core..cmp..PartialEq$GT$2ne17hbb136afe276bf4a7E_ZN71_$LT$alloc..boxed..Box$LT$T$C$A$GT$$u20$as$u20$core..cmp..PartialEq$GT$2ne17h8bedf3bb4c85f91aEne<[u8],alloc::alloc::Global>_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17h75250c6eabed4d6bEindex,alloc::alloc::Global>_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h343e3bb1de62bd91E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17heea23c3bb2c539baEindex>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h880f69b685619f22Eget_unchecked_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h68750274fed13324E_ZN111_$LT$std..sys..unix..process..process_common..CommandArgs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next28_$u7b$$u7b$closure$u7d$$u7d$17h16aa6489280e549aE_ZN4core6option15Option$LT$T$GT$3map17h4d856e4e273da1c4Emap<&std::ffi::c_str::CString,&std::ffi::os_str::OsStr,closure-0>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17hc200e4ff8a9242f0Esize_hint_ZN102_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17h912016b303ee135cElen_ZN102_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$8is_empty17h99ffb886a65d4746Eis_empty_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17hb9e0107295e6abd9Einto_result<(std::sys::unix::process::process_common::StdioPipes, std::sys::unix::process::process_common::ChildPipes),std::io::error::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h6793e64d20c599e3Efrom_error<(std::sys::unix::process::process_inner::Process, std::sys::unix::process::process_common::StdioPipes),std::io::error::Error>_ZN3std3sys4unix7process13process_inner66_$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$11posix_spawn17h1b9b4f91a9cfeca9E_ZN3std3sys4unix7process14process_common7Command12env_saw_path17hdda70433471b68f2Eenv_saw_path_ZN3std10sys_common7process10CommandEnv17have_changed_path17hdf05474cdce7cd21Ehave_changed_path_ZN3std3sys4unix7process14process_common7Command15program_is_path17h72787c44d2cbfe89Eprogram_is_path_ZN5alloc3vec16Vec$LT$T$C$A$GT$8is_empty17h17b62ed7331aa7b7Eis_empty, alloc::alloc::Global>,alloc::alloc::Global>_ZN4core6option15Option$LT$T$GT$7is_some17hdfebc75a183d209aEis_some<&[u32]>_ZN3std3sys4unix4weak13Weak$LT$F$GT$3get17h87d058ece5a0458aEget i32>ChildStdio_ZN3std3sys4unix7process14process_common10ChildStdio2fd17hb887966024f7db92E_ZN4core3ptr162drop_in_place$LT$std..sys..unix..process..process_inner..$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$..posix_spawn..PosixSpawnFileActions$GT$17h9f20e1def34d21b8Edrop_in_place_ZN4core3ptr155drop_in_place$LT$std..sys..unix..process..process_inner..$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$..posix_spawn..PosixSpawnattr$GT$17h3f82eea01def97a2Edrop_in_place_ZN4core3mem4drop17h2bcc350215bbd6c8Edrop_ZN4core5array96_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u3b$$u20$N$u5d$$GT$2eq17hff234c8b9145a837E_ZN4core5array98_$LT$impl$u20$core..convert..TryFrom$LT$$RF$$u5b$T$u5d$$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$8try_from28_$u7b$$u7b$closure$u7d$$u7d$17h02cb8bf8555be4caE_ZN4core6result19Result$LT$T$C$E$GT$3map17h6fd7a26861555879Emap<&[u8; 4],core::array::TryFromSliceError,[u8; 4],closure-0>_ZN4core5array98_$LT$impl$u20$core..convert..TryFrom$LT$$RF$$u5b$T$u5d$$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$8try_from17h3f397c984fee8671Etry_from_ZN53_$LT$T$u20$as$u20$core..convert..TryInto$LT$U$GT$$GT$8try_into17h198a30e37cb06e47Etry_into<&[u8],[u8; 4]>_ZN4core3ptr72drop_in_place$LT$std..sys..unix..process..process_common..ChildPipes$GT$17h77f145cd2d915832Edrop_in_place_ZN3std3sys4unix7process14process_common7Command16get_program_cstr17hd86f99b2727808a8Eget_program_cstr_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17hff9ee7f0c60a88d7Eas_ptr<*const i8,alloc::alloc::Global>_ZN4core6option15Option$LT$T$GT$9unwrap_or17ha8f9911c52b16b8cEunwrap_or_ZN4core3num21_$LT$impl$u20$u32$GT$5to_be17h48b1254d41b97b29E_ZN4core3num21_$LT$impl$u20$u32$GT$11to_be_bytes17h014d08eb5978efe2Eto_be_bytesdo_exec_ZN3std3sys4unix7process13process_inner66_$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$7do_exec28_$u7b$$u7b$closure$u7d$$u7d$17h442afc99b9522cabE_ZN3std3sys4unix5cvt_r17hcbc2197202b21541E_ZN3std3sys4unix7process13process_inner66_$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$7do_exec28_$u7b$$u7b$closure$u7d$$u7d$17h60b483898bbc9fe4E_ZN3std3sys4unix5cvt_r17haf638df073984d57E_ZN3std3sys4unix7process13process_inner66_$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$7do_exec28_$u7b$$u7b$closure$u7d$$u7d$17hce3c876c606e2c80E_ZN3std3sys4unix5cvt_r17h92f6e0efbfc69a8fEcvt_r_ZN3std3sys4unix7process14process_common7Command10get_groups17h1d78df20b2721408Eget_groups_ZN4core6option15Option$LT$T$GT$6as_ref17haacfedf3eb36301dEas_ref>_ZN4core6option15Option$LT$T$GT$8as_deref17h84895854e2f0ae24Eas_deref>_ZN4core6option15Option$LT$T$GT$3map17h8fab7ef2eea047b3Emap<&alloc::boxed::Box<[u32], alloc::alloc::Global>,&[u32],closure-0>_ZN4core6option15Option$LT$T$GT$7is_none17hafe37e3df60cee5fEis_none<&[u32]>_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h7d3e7349663ed961Ederef_mut, alloc::alloc::Global>,alloc::alloc::Global>_ZN94_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h389b1e01ddfd1036Enext, alloc::alloc::Global>>_ZN89_$LT$alloc..boxed..Box$LT$F$C$A$GT$$u20$as$u20$core..ops..function..FnMut$LT$Args$GT$$GT$8call_mut17haf078c601bff9d8cEcall_mut<(),FnMut<()>,alloc::alloc::Global>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hfac8a179a53e26edEoffset, alloc::alloc::Global>>_ZN4core5slice4iter16IterMut$LT$T$GT$14post_inc_start17hf6af40d18b753e06Epost_inc_start, alloc::alloc::Global>>_ZN3std3sys4unix7process14process_common12CStringArray6as_ptr17h38493de8ba5d71aaEas_ptr_ZN4core3ptr170drop_in_place$LT$core..option..Option$LT$std..sys..unix..process..process_inner..$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$..do_exec..Reset$GT$$GT$17h875d34e1e6f01f96Edrop_in_place>_ZN163_$LT$std..sys..unix..process..process_inner..$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$..do_exec..Reset$u20$as$u20$core..ops..drop..Drop$GT$4drop17h943674de61c851e2E_ZN4core3ptr142drop_in_place$LT$std..sys..unix..process..process_inner..$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$..do_exec..Reset$GT$17hf20ab2585ae927deEdrop_in_place_ZN3std6thread5local17LocalKey$LT$T$GT$8try_with17h6b507ca40e4d882fEtry_with>,closure-0,core::option::Option>>_ZN3std10sys_common11thread_info10ThreadInfo4with17ha4abf3bb4a07125dEwith>,closure-0>_ZN3std10sys_common11thread_info11stack_guard17hd3d7efdf37a668e9Estack_guard_ZN3std10sys_common11thread_info10ThreadInfo4with28_$u7b$$u7b$closure$u7d$$u7d$17h398a86e6b6605f63E{{closure}}>,closure-0>_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hd2c854c99a2e91a2Eclone>_ZN3std10sys_common11thread_info11stack_guard28_$u7b$$u7b$closure$u7d$$u7d$17h8a68f8ad37b49d8eE_ZN4core6option15Option$LT$T$GT$9unwrap_or17h15b11cf970038970Eunwrap_or>_ZN3std3sys4unix14stack_overflow3imp15siginfo_si_addr17h36da1f33b3964d6aEsiginfo_si_addr_ZN4core10intrinsics11write_bytes17h1bb68c8a70345f26Ewrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17hab4526de6691f7a4E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17he34d5cbb96b488f0Ezeroed_ZN4core3mem6zeroed17h9914b0ab7d4fa7aaE_ZN3std3sys4unix14stack_overflow3imp10get_stackp17hc74bed6b92ccf49eEget_stackp_ZN3std3sys4unix14stack_overflow3imp9get_stack17h0c618e51366ac974Eget_stack_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17hc69423209c2c8e7cEadd_ZN3std3sys4unix4weak13Weak$LT$F$GT$3get17hde36b04d79d4bbedEget usize>_ZN3std3sys4unix6thread14min_stack_size17h64a2ba40ff58494dEmin_stack_size_ZN4core3ptr156drop_in_place$LT$alloc..boxed..Box$LT$alloc..boxed..Box$LT$dyn$u20$core..ops..function..FnOnce$LT$$LP$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$GT$$GT$$GT$17hf4a148e714371afbEdrop_in_place, alloc::alloc::Global>, alloc::alloc::Global>>_ZN4core3mem4drop17h52361ce8f74cfdb8Edrop, alloc::alloc::Global>, alloc::alloc::Global>>_ZN5alloc5alloc8box_free17hc8768ce29d725045Ebox_free, alloc::alloc::Global>,alloc::alloc::Global>Handler_ZN3std3sys4unix14stack_overflow7Handler3new17h8f993dbddb4a24a7E_ZN90_$LT$alloc..boxed..Box$LT$F$C$A$GT$$u20$as$u20$core..ops..function..FnOnce$LT$Args$GT$$GT$9call_once17hcf5d395fdd120c17Ecall_once<(),alloc::boxed::Box, alloc::alloc::Global>,alloc::alloc::Global>_ZN3std10sys_common17thread_local_dtor22register_dtor_fallback17h1227cf79a477be5eE_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h69c5e4f0bb801ce5Epush<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h69010c06d4a1295cEgrow_amortized<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17heddbb10e2e6c2ad5Etry_reserve<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h233bf698cace99b2E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17hb49224fd1c961ccaE_ZN4core5alloc6layout6Layout5array17heb0d6db140785505Earray<(*mut u8, unsafe extern "C" fn(*mut u8))>_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h5ca4385839155de5Eas_mut_ptr<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN5alloc3vec12Vec$LT$T$GT$3new17h0533110aa02a571aEnew<(*mut u8, unsafe extern "C" fn(*mut u8))>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hd1d32460093aaf2dEset_ptr<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h166e9f38cd817760Ecapacity_from_bytes<(*mut u8, unsafe extern "C" fn(*mut u8)),alloc::alloc::Global>_ZN4core3ptr5write17h0ac02d8bd267f3c4Ewrite<(*mut u8, unsafe extern "C" fn(*mut u8))>_ZN4core3cmp10PartialOrd2ge17h91dbe17456c552dfEge_ZN4core3cmp5impls70_$LT$impl$u20$core..cmp..PartialOrd$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2ge17h850ceecea6e4987cE_ZN3std3sys4unix4weak13Weak$LT$F$GT$3get17h8e4a1d92f2cf326fEget i32>try_statx_ZN3std3sys4unix2fs9try_statx5statx17hfc131207b468f5dbE_ZN4core10intrinsics11write_bytes17h3d860a77d7e3dbddEwrite_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$11write_bytes17h255007b376dc5907E_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$6zeroed17h21eb6a616926d76fEzeroed_ZN4core3mem6zeroed17hc3b763a30ded13b8E_ZN4libc4unix10linux_like5linux7makedev17h41759d112c681fdcEmakedev_ZN4core3ops8function5impls79_$LT$impl$u20$core..ops..function..FnMut$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$8call_mut17hbc4e032fc6ee3869Ecall_mut<(&std::backtrace_rs::backtrace::Frame),FnMut<(&std::backtrace_rs::backtrace::Frame)>>_ZN3std12backtrace_rs9symbolize18format_symbol_name17h7752a363abbac0f2Eformat_symbol_name_ZN4core3str5error9Utf8Error9error_len17hf76f0ec872ee345cEerror_len_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$23with_capacity_zeroed_in17h14f6e2e009d3bd2dEwith_capacity_zeroed_inspec_from_elem_ZN63_$LT$u8$u20$as$u20$alloc..vec..spec_from_elem..SpecFromElem$GT$9from_elem17hf56ab1f93ef4e607Efrom_elem_ZN5alloc3vec9from_elem17hd44955a2cb34e76fEfrom_elem_ZN63_$LT$alloc..alloc..Global$u20$as$u20$core..alloc..Allocator$GT$15allocate_zeroed17hf6162c39594b461fEallocate_zeroed_ZN5alloc5alloc12alloc_zeroed17hfd6a52046fb39310E_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h921d707332d8d757Epush,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17hc470a9b9ecd3df5dEgrow_amortized,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h293358c8ce432ce5Etry_reserve,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17hda7195b098d6f41eE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h7eadfc693f70ef09E_ZN4core5alloc6layout6Layout5array17h616d469c4c35637bEarray>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h3d787009d1a15396Ecapacity_from_bytes,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hbec7def47cd22d7bEset_ptr,alloc::alloc::Global>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h3b1faad319824a63Eoffset>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h32e866386a2ebfcbEadd>_ZN4core3ptr5write17hce7cb04bd8c6c9eeEwrite>_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17hc17a5f3bb714dc93Eindex_mut>_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17he7114b8d4ddb3253Eindex_mut,usize>_ZN84_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..IndexMut$LT$I$GT$$GT$9index_mut17hd8d703ebbf23f040Eindex_mut,usize,alloc::alloc::Global>_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17hf7b7d7e9c6e280ecEderef_mut,alloc::alloc::Global>stashStashResolveWhat_ZN3std12backtrace_rs9symbolize11ResolveWhat13address_or_ip17h5895be5d86fa6cd2Eaddress_or_ip_ZN3std12backtrace_rs9symbolize9adjust_ip17hfbfc72dd8fb2b601Eadjust_ip_ZN4core6option15Option$LT$T$GT$18get_or_insert_with17h78850cdec0340c90Eget_or_insert_with_ZN3std12backtrace_rs9symbolize5gimli5Cache11with_global17hdfada925ef825faeEwith_global_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h2e43b0223e75b075Eallocate_in<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17he883ad97cace50cbEwith_capacity_in<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h7622f93807bfbe62E_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h28378366c6d047caEwith_capacity<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN3std12backtrace_rs9symbolize5gimli5Cache3new17ha0e2d7dc7771b85eEwith_global_ZN3std12backtrace_rs9symbolize5gimli5Cache11with_global28_$u7b$$u7b$closure$u7d$$u7d$17ha2a5b1cce31c6935E{{closure}}_ZN5alloc3vec12Vec$LT$T$GT$3new17h27369c67f2191586Enew_ZN3std12backtrace_rs9symbolize5gimli16native_libraries17hd80ddc6dbb4e1216Enative_libraries_ZN4core3ptr91drop_in_place$LT$core..option..Option$LT$std..backtrace_rs..symbolize..gimli..Cache$GT$$GT$17ha40cae8dbc93a828Edrop_in_place>_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hc21157ac4e8d660cEdrop_ZN4core3ptr88drop_in_place$LT$alloc..vec..Vec$LT$std..backtrace_rs..symbolize..gimli..Library$GT$$GT$17h6963b08c4a578dbdEdrop_in_place>_ZN4core3ptr63drop_in_place$LT$std..backtrace_rs..symbolize..gimli..Cache$GT$17h8c0eaefe294c4dedEdrop_in_place_ZN4core3ptr75drop_in_place$LT$$u5b$std..backtrace_rs..symbolize..gimli..Library$u5d$$GT$17h162e21a4d3aa03e5Edrop_in_place<[std::backtrace_rs::symbolize::gimli::Library]>_ZN4core3ptr65drop_in_place$LT$std..backtrace_rs..symbolize..gimli..Library$GT$17hf77f8232c32f26d9Edrop_in_place_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h8fc8274809d835fbE_ZN4core3ptr95drop_in_place$LT$alloc..raw_vec..RawVec$LT$std..backtrace_rs..symbolize..gimli..Library$GT$$GT$17hf4b175090e1acf87Edrop_in_place>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h19516ca387647efaEcurrent_memory_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hbbaddec096ba885eE_ZN4core3ptr104drop_in_place$LT$alloc..vec..Vec$LT$$LP$usize$C$std..backtrace_rs..symbolize..gimli..Mapping$RP$$GT$$GT$17h5689cf796d7571f5Edrop_in_place>_ZN4core3ptr91drop_in_place$LT$$u5b$$LP$usize$C$std..backtrace_rs..symbolize..gimli..Mapping$RP$$u5d$$GT$17h300932fcfb751ba3Edrop_in_place<[(usize, std::backtrace_rs::symbolize::gimli::Mapping)]>_ZN4core3ptr81drop_in_place$LT$$LP$usize$C$std..backtrace_rs..symbolize..gimli..Mapping$RP$$GT$17hcbd7f90b3f097fb1Edrop_in_place<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN4core3ptr111drop_in_place$LT$alloc..raw_vec..RawVec$LT$$LP$usize$C$std..backtrace_rs..symbolize..gimli..Mapping$RP$$GT$$GT$17h5cebf8cb03d3d2f6Edrop_in_place>_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17hbb3d577aab0bf867Ederef_ZN3std12backtrace_rs9symbolize5gimli5Cache12avma_to_svma17h7687bb3c31371a81Eavma_to_svma_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h051686e454b8bf82Enext_ZN4core4iter6traits8iterator8Iterator8try_fold17h76d2882db50ad995Etry_fold,(),closure-0,core::ops::control_flow::ControlFlow<(usize, *const u8), ()>>_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hffece9d490bafb65E_ZN4core4iter6traits8iterator8Iterator8find_map17ha7755842a50b94cfEfind_map>,(usize, *const u8),&mut closure-0>filter_map_ZN115_$LT$core..iter..adapters..filter_map..FilterMap$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h4ae7003a8d2e4657Enext<(usize, *const u8),core::iter::adapters::enumerate::Enumerate>,closure-0>_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17hd5dfd39f0d062d36Eas_ptr_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$3any17h46d15634f31dbf3cEany_ZN3std12backtrace_rs9symbolize5gimli5Cache12avma_to_svma28_$u7b$$u7b$closure$u7d$$u7d$17hc1e32406aba377a6E_ZN4core3ops8function5impls79_$LT$impl$u20$core..ops..function..FnMut$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$8call_mut17hc92b47d63b8774e0Ecall_mut<((usize, &std::backtrace_rs::symbolize::gimli::Library)),closure-0>_ZN4core4iter6traits8iterator8Iterator8find_map5check28_$u7b$$u7b$closure$u7d$$u7d$17hc73019a0b50ee89cE{{closure}}<(usize, &std::backtrace_rs::symbolize::gimli::Library),(usize, *const u8),&mut closure-0>_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold9enumerate28_$u7b$$u7b$closure$u7d$$u7d$17hb8b636059e303a3dE{{closure}}<&std::backtrace_rs::symbolize::gimli::Library,(),core::ops::control_flow::ControlFlow<(usize, *const u8), ()>,closure-0>_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17hc5a9348b407e778cEas_ptr_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17he4226dc1ba2a4fa7Ederef_ZN3std12backtrace_rs9symbolize5gimli5Cache12avma_to_svma28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h7073a88eae5ced4dE_ZN4core3ptr8non_null16NonNull$LT$T$GT$13new_unchecked17h826dd1d6f3b191a5Enew_unchecked_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17hc7c03ad62eaf5d23Epost_inc_start_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h4c3199b1c940414fEnext_ZN4core3ptr8non_null16NonNull$LT$T$GT$13new_unchecked17h5d566027739b51f4Enew_unchecked_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h76dfa2c5a4a680dbEpost_inc_start_ZN53_$LT$usize$u20$as$u20$core..ops..arith..AddAssign$GT$10add_assign17h4ab90ee6c6500757E_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h9ef319fa07caec01Ederef<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN3std12backtrace_rs9symbolize5gimli5Cache15mapping_for_lib17hbcf5f42af61254b9Emapping_for_lib_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h55bc27035a32c7ecEnext<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hd78efc5ea6febfd3Eposition<(usize, std::backtrace_rs::symbolize::gimli::Mapping),closure-0>_ZN3std12backtrace_rs9symbolize5gimli5Cache15mapping_for_lib28_$u7b$$u7b$closure$u7d$$u7d$17h5c27f3a71d671ffdE_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hd5bd7a66cfd30465Eindex_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hefc578e7918d56c8Eindex_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17h5df76d9c03645193Eindex_ZN3std4path100_$LT$impl$u20$core..convert..AsRef$LT$std..path..Path$GT$$u20$for$u20$std..ffi..os_str..OsString$GT$6as_ref17hf6b0e1c96f628f09E_ZN3std12backtrace_rs9symbolize5gimli4mmap17h4d24671358ac549aEMapping_ZN3std12backtrace_rs9symbolize5gimli3elf62_$LT$impl$u20$std..backtrace_rs..symbolize..gimli..Mapping$GT$3new17he2f22de2f41da4d3E_ZN4core6result19Result$LT$T$C$E$GT$2ok17h45661caf011dccfeEok_ZN4core3ptr86drop_in_place$LT$core..result..Result$LT$std..fs..File$C$std..io..error..Error$GT$$GT$17hd56e8da73bfd17e2Edrop_in_place>_ZN4core3ptr4read17h425b0b579c8b855dEread<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN5alloc3vec16Vec$LT$T$C$A$GT$6remove17h6f887107c6abbdbdEremove<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN4core6result19Result$LT$T$C$E$GT$2ok17h01bfc675022f1026Eok_ZN4core6option15Option$LT$T$GT$5ok_or17h7c7986650c0cb71aEok_or_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h31c2dd4c43a3638dEinto_resultMmap_ZN3std12backtrace_rs9symbolize5gimli4mmap4Mmap3map17h8610064f30ff537fE_ZN3std12backtrace_rs9symbolize5gimli5stash5Stash3new17h7b70b58cf8fcc683E_ZN3std12backtrace_rs9symbolize5gimli7Mapping2mk17hf1cd2aefc7d5cb60Emk_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17hf4b21c2ed2632342E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h8810e06979dddd4cEget>objectpod_ZN6object3pod10from_bytes17h9317063dbd75d986Efrom_bytes>_ZN6object3pod5Bytes4read17h06345c2d485d26c6Eread>_ZN6object3pod5Bytes7read_at17h56960784308be4feEread_at>elfFileHeader_ZN6object4read3elf4file10FileHeader5parse17h804864bfb3006327Eparse>Object_ZN3std12backtrace_rs9symbolize5gimli3elf6Object5parse17h0f1482158a4a4524E_ZN3std12backtrace_rs9symbolize5gimli3elf62_$LT$impl$u20$std..backtrace_rs..symbolize..gimli..Mapping$GT$3new28_$u7b$$u7b$closure$u7d$$u7d$17h777e62ad9a6987d1E_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h9dc981e39e00875aEmap_err<&object::elf::FileHeader64,(),object::read::Error,closure-0>_ZN93_$LT$core..result..Result$LT$T$C$$LP$$RP$$GT$$u20$as$u20$object..read..ReadError$LT$T$GT$$GT$10read_error17h26ba2d83a652695cEread_error<&object::elf::FileHeader64>_ZN4core5array103_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u3b$$u20$N$u5d$$GT$$u20$for$u20$$u5b$A$u3b$$u20$N$u5d$$GT$2eq17h8c6cb72f42a8b273E_ZN6object4read3elf4file10FileHeader12is_supported17h477b5f992ca9f181Eis_supported>_ZN6object4read3elf4file10FileHeader11is_class_6417h9f2c38236e637012Eis_class_64>_ZN6object4read3elf4file10FileHeader16is_little_endian17he181de94f99dbd17Eis_little_endian>_ZN95_$LT$object..elf..FileHeader64$LT$Endian$GT$$u20$as$u20$object..read..elf..file..FileHeader$GT$7e_shoff17h47d3175a625d37d2Ee_shoff_ZN6object4read3elf4file10FileHeader15section_headers17h8382657270b17123Esection_headers>_ZN6object4read3elf4file10FileHeader8sections17h106503589b391252Esections>_ZN95_$LT$object..elf..FileHeader64$LT$Endian$GT$$u20$as$u20$object..read..elf..file..FileHeader$GT$7e_shnum17hda3528b0e70d9642Ee_shnum_ZN6object4read3elf4file10FileHeader5shnum17h0fa123ddf72f0291Eshnum>_ZN6object3pod5Bytes4skip17h1548c213014bfa8eEskip_ZN6object3pod5Bytes13read_slice_at17h48ed79cf7ffde21bEread_slice_at>_ZN6object3pod16slice_from_bytes17h9d98f9349b4c0e4bEslice_from_bytes>_ZN6object3pod5Bytes10read_slice17hb215b877b51b12a4Eread_slice>_ZN95_$LT$object..elf..FileHeader64$LT$Endian$GT$$u20$as$u20$object..read..elf..file..FileHeader$GT$10e_shstrndx17h2833264b1c08b706Ee_shstrndx_ZN6object4read3elf4file10FileHeader8shstrndx17h899c2c800085cce5Eshstrndx>_ZN6object4read3elf4file10FileHeader15section_strings17h3a4c5d9752714f02Esection_strings>_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h76f0c2f81470383cEmap_err>,(),object::read::Error,closure-0>_ZN93_$LT$core..result..Result$LT$T$C$$LP$$RP$$GT$$u20$as$u20$object..read..ReadError$LT$T$GT$$GT$10read_error17h3cb15c2ae4e55bb1Eread_error>>_ZN6object4read3elf4file10FileHeader9section_017h4cbe3ea6fc81a9f8Esection_0>section_ZN104_$LT$object..elf..SectionHeader64$LT$Endian$GT$$u20$as$u20$object..read..elf..section..SectionHeader$GT$7sh_link17h5f949f5632cf6e96Esh_link_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17hba2ea8f68e6557e3Eget>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h3a453d49e0801bbfEget,usize>_ZN4core6option15Option$LT$T$GT$5ok_or17h78d1333b98232beeEok_or<&object::elf::SectionHeader64,object::read::Error>_ZN82_$LT$core..option..Option$LT$T$GT$$u20$as$u20$object..read..ReadError$LT$T$GT$$GT$10read_error17h7c7709ecb5c15184Eread_error<&object::elf::SectionHeader64>_ZN104_$LT$object..elf..SectionHeader64$LT$Endian$GT$$u20$as$u20$object..read..elf..section..SectionHeader$GT$7sh_type17hc629b84dd0f62b86Esh_typeSectionHeader_ZN6object4read3elf7section13SectionHeader10file_range17h99fcf369a2e96569Efile_range>_ZN6object4read3elf7section13SectionHeader4data17hbaa8d2a5fabc0d7dEdata>_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h577d8eceb9409dafEinto_result_ZN4core6option15Option$LT$T$GT$5ok_or17h8fd14e47be12adeaEok_or_ZN5alloc3vec16Vec$LT$T$C$A$GT$3pop17hee96fba36c303504Epop<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17he3841585a26d42c9E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h013e9341ea049157Eadd<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN4core3ptr109drop_in_place$LT$core..option..Option$LT$$LP$usize$C$std..backtrace_rs..symbolize..gimli..Mapping$RP$$GT$$GT$17hc214792d45f68baaEdrop_in_place>_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17hfb452cd915843bb5Eindex_mut<(usize, std::backtrace_rs::symbolize::gimli::Mapping)>_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h3899b4fc9453623cEindex_mut<(usize, std::backtrace_rs::symbolize::gimli::Mapping),usize>_ZN84_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..IndexMut$LT$I$GT$$GT$9index_mut17h3c45c48fe063888eEindex_mut<(usize, std::backtrace_rs::symbolize::gimli::Mapping),usize,alloc::alloc::Global>_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17hb7ea0f8d5e1b2839Ederef_mut<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17hd1775ba03ad5d0d8Eas_ptr_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h42af50c61cfa582cEderef_ZN9addr2line16Context$LT$R$GT$10find_units17hb815c61323f9d339Efind_units>_ZN9addr2line16Context$LT$R$GT$11find_frames17h8c0a5dd2e56ef14eEfind_frames>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17h5d6f0bc290cd9d72Ebinary_search_by_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key17ha1806c70e0e99d60Ebinary_search_by_key_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h76aa060ab4463884Eindex_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h56e43b8c4fc795f4E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hdf7fdf09d5169df7Eindex>_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17he6f42d8406881d16Eindex,alloc::alloc::Global>_ZN4core5slice4iter13Iter$LT$T$GT$3new17hb3038e0d2aee7436E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17h85415efa12720f83Eiter_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h24e85045e457565bEnext_back_ZN4core4iter6traits12double_ended19DoubleEndedIterator9try_rfold17hdc1dd5ff9eca2454Etry_rfold,(),closure-0,core::ops::control_flow::ControlFlow>, ()>, ()>>_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hc7dd04ab384d1b08Etry_fold,(),closure-0,core::ops::control_flow::ControlFlow>, ()>, ()>>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h1007544dcda9df11Etry_fold>,closure-1,(),closure-0,core::ops::control_flow::ControlFlow<&addr2line::ResUnit>, ()>>_ZN4core4iter6traits8iterator8Iterator8find_map17h0b3d895b7f104a77Efind_map>, closure-1>,&addr2line::ResUnit>,&mut closure-2>_ZN115_$LT$core..iter..adapters..filter_map..FilterMap$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hc9f7393a59e4c47dEnext<&addr2line::ResUnit>,core::iter::adapters::take_while::TakeWhile>, closure-1>,closure-2>find_units_ZN9addr2line16Context$LT$R$GT$10find_units28_$u7b$$u7b$closure$u7d$$u7d$17h479aff68403b4129E_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold5check28_$u7b$$u7b$closure$u7d$$u7d$17h4486170439d8eb73E{{closure}}<&addr2line::UnitRange,(),core::ops::control_flow::ControlFlow<&addr2line::ResUnit>, ()>,closure-1,closure-0>_ZN9addr2line16Context$LT$R$GT$10find_units28_$u7b$$u7b$closure$u7d$$u7d$17hd87d28f35c396c38E_ZN4core3ops8function5impls79_$LT$impl$u20$core..ops..function..FnMut$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$8call_mut17h39432c6fc1d990b9Ecall_mut<(&addr2line::UnitRange),closure-2>_ZN4core4iter6traits8iterator8Iterator8find_map5check28_$u7b$$u7b$closure$u7d$$u7d$17h1cfb6e41b3f502d4E{{closure}}<&addr2line::UnitRange,&addr2line::ResUnit>,&mut closure-2>_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h8b94b069b9b7f90bEderef>,alloc::alloc::Global>_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17hb68656d1a007e550Eindex>,usize,alloc::alloc::Global>_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hdf727e63b5432fb0Eindex>>_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h272c8f803bca457cEindex>,usize>_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17h9cd2bb8c9cd14fc1Eas_ptr>,alloc::alloc::Global>_ZN9addr2line4lazy17LazyCell$LT$T$GT$11borrow_with17h1da44d9a9f3f1ec6Eborrow_with>, gimli::read::Error>,closure-0>_ZN9addr2line16ResUnit$LT$R$GT$15parse_functions17h9a0097cbe36ba734Eparse_functions>_ZN9addr2line16ResUnit$LT$R$GT$25find_function_or_location17h4367a14dc732396fEfind_function_or_location>parse_functions_ZN9addr2line16ResUnit$LT$R$GT$15parse_functions28_$u7b$$u7b$closure$u7d$$u7d$17h73d8a0fecf766aeaE_ZN5alloc3vec12Vec$LT$T$GT$3new17h61ac1b48cadc72ebEnew<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>Functions_ZN9addr2line18Functions$LT$R$GT$5parse17h6211eed26521d25fE_ZN5alloc3vec12Vec$LT$T$GT$3new17hb154edbbfcadb3f0Enew_ZN5gimli4read4unit19EntriesRaw$LT$R$GT$8is_empty17hb4ceaa27450d9eb3Eis_empty>_ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range17h675948539b591990E_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17ha8295983d53c6169Epush<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h7abe465ec65ec96aEgrow_amortized<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h1ba46d823202b045Etry_reserve<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h549fcfdcdb485db7E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h244c05b98c848707E_ZN4core5alloc6layout6Layout5array17h5f8fc94760e5a40eEarray<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h5bc70f9cc4e326aaEset_ptr<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h63a8e6d0246b7181Ecapacity_from_bytes<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h1b67cb281129b8e9Eoffset<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h49b5345c790c769fEadd<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>_ZN4core3ptr5write17h6e99e76bc7d75fa3Ewrite<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h8bd259ea2a3bbd00Ederef_mut_ZN5alloc5slice10merge_sort17h2149a7e99e301d12Emerge_sort_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11sort_by_key17hbbff60ae2c5969e0Esort_by_key_ZN5alloc3vec16Vec$LT$T$C$A$GT$16into_boxed_slice17h1936b61f3dd40c9dEinto_boxed_slice<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$13shrink_to_fit17hcb6d3e5267e977c3Eshrink_to_fit_ZN5alloc3vec16Vec$LT$T$C$A$GT$16into_boxed_slice17hf3ff82f92f996f46Einto_boxed_slice_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$6shrink17hc7f9c69a191e3612Eshrink_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13shrink_to_fit17h1f93dc5a48f41778E_ZN4core6result19Result$LT$T$C$E$GT$7map_err17hbf7252516f3371aaE_ZN4core3ptr70drop_in_place$LT$alloc..vec..Vec$LT$addr2line..FunctionAddress$GT$$GT$17h9fd1470edfed48d9Edrop_in_place>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h33e6f788953a2947Edrop_ZN4core3ptr77drop_in_place$LT$alloc..raw_vec..RawVec$LT$addr2line..FunctionAddress$GT$$GT$17h985d1c06e60c64c0Edrop_in_place>_ZN4core3ptr269drop_in_place$LT$alloc..vec..Vec$LT$$LP$gimli..read..unit..UnitOffset$C$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$RP$$GT$$GT$17ha42b8c51b026f846Edrop_in_place, addr2line::lazy::LazyCell>, gimli::read::Error>>), alloc::alloc::Global>>_ZN4core6option15Option$LT$T$GT$13get_or_insert17h80a7c30da245896fEget_or_insert>, gimli::read::Error>>_ZN4core6option15Option$LT$T$GT$18get_or_insert_with17h7dce00450573184aEget_or_insert_with>, gimli::read::Error>,closure-0>_ZN4core3ptr246drop_in_place$LT$core..option..Option$LT$core..result..Result$LT$addr2line..Functions$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$..get_or_insert..$u7b$$u7b$closure$u7d$$u7d$$GT$17h5217722ea7726f9dE_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h70730d827c6572d1Emap_err<&addr2line::Functions>,&gimli::read::Error,gimli::read::Error,fn(&gimli::read::Error) -> gimli::read::Error>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17hb11636d86a05fabcEis_empty<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>)>_ZN9addr2line18Functions$LT$R$GT$8is_empty17h49fda4093e0124d9E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17hc65368914662cf10Ebinary_search_by_ZN9addr2line18Functions$LT$R$GT$12find_address17hca7a81603513be6eEfind_address>find_address_ZN9addr2line18Functions$LT$R$GT$12find_address28_$u7b$$u7b$closure$u7d$$u7d$17h5e66329afe861cbcE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17hc5a00f16b3dd1795Einto_result<(core::option::Option<&addr2line::Function>>, core::option::Option),gimli::read::Error>_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h96d15407c274fd24Einto_result,gimli::read::Error>_ZN4core10intrinsics19copy_nonoverlapping17h3331223dc5fd236eEcopy_nonoverlapping_ZN91_$LT$alloc..slice..insert_head..InsertionHole$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hf3c366cbdb953a45Edrop_ZN4core3ptr95drop_in_place$LT$alloc..slice..insert_head..InsertionHole$LT$addr2line..FunctionAddress$GT$$GT$17hddda5f7571930157Edrop_in_place>_ZN5alloc5slice11insert_head17h56734c1f61a0a379Einsert_head_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h7e5578bbfa4eb900Eindex_mut_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h29684cacaf48d005Eindex_mut>_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11sort_by_key28_$u7b$$u7b$closure$u7d$$u7d$17h8a9a32cfb56baa2fE{{closure}}_ZN4core3ptr4read17hd630007033492555Eread_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17hddf8546fcc884620Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h8a247d31febf3eaeEwith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17ha7810c98eaf3f387E_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h545964a46811a431Ewith_capacity_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h632c1e36bf69c311E_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hf8ebdd58d48cc0e2Eindex_mut>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$7reverse17h67c7f3e5e003d77eEreverse_ZN4core3ptr4swap17he2137d79b6ca8ed5Eswap_ZN4core10intrinsics4copy17h8160c6d046f1287bEcopy_ZN81_$LT$alloc..slice..merge..MergeHole$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17he337b84601b2b12cE_ZN4core3ptr85drop_in_place$LT$alloc..slice..merge..MergeHole$LT$addr2line..FunctionAddress$GT$$GT$17hb95277cd40c5d985Edrop_in_place>_ZN5alloc5slice5merge17hd9c0be4b03692f94Emerge_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17ha978cbd5f2d8116cEoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h3a1b0d831203c57aEadd_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h6adf21246bc9f3d4Eget_unchecked_mut_ZN5alloc5slice5merge17get_and_increment17hbf40b480efd35e7bEget_and_increment_ZN5alloc3vec16Vec$LT$T$C$A$GT$13shrink_to_fit17hd17bcf84b7c896daEshrink_to_fit<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$6shrink17hc0ee66738f1c8789Eshrink<(gimli::read::unit::UnitOffset, addr2line::lazy::LazyCell>, gimli::read::Error>>),alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13shrink_to_fit17h5f98bc3dd2f9ee9cE_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h813bcd076a719541EFrameIter_ZN9addr2line18FrameIter$LT$R$GT$4next17hb3d9a65afbad0bb8E_ZN72_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..default..Default$GT$7default17hf7f675e5c40a1680Edefault_ZN4core3mem4take17h3684118ea0c36090Etake>_ZN4core6option15Option$LT$T$GT$4take17h76f9e747565f8211Etake_ZN4core3ptr19swap_nonoverlapping17hde6a81116e6b3803Eswap_nonoverlapping>_ZN4core3ptr23swap_nonoverlapping_one17h43a26a0586fbff63Eswap_nonoverlapping_one>_ZN4core3mem4swap17hcb9d4779d3bc125cEswap>_ZN4core3mem7replace17h07421ded46cf3016Ereplace>_ZN118_$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h1e34d12d112ba465Enext_back<&addr2line::InlinedFunction>,alloc::alloc::Global>_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hf7b9e880eae869bdEnext>, alloc::alloc::Global>>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h21e1806b4bd7811bEoffset<&addr2line::InlinedFunction>>_ZN4core10intrinsics19copy_nonoverlapping17hfe3c74e68e2413e6Ecopy_nonoverlapping<&addr2line::InlinedFunction>>_ZN4core3ptr4read17h86d39c7e5c05da36Eread<&addr2line::InlinedFunction>>_ZN4core6option15Option$LT$T$GT$3map17h8a90f14480ca6bbfEmap,addr2line::FunctionName>,closure-0>_ZN9addr2line18FrameIter$LT$R$GT$4next28_$u7b$$u7b$closure$u7d$$u7d$17hdd2904f0ef4c3ce2E_ZN4core6option15Option$LT$T$GT$3map17he7af30218442676bEmap>,&[u8],closure-0>_ZN4core6option15Option$LT$T$GT$3map17h7a5775af5675353eEmap,addr2line::FunctionName>,closure-1>_ZN3std12backtrace_rs9symbolize5gimli7resolve28_$u7b$$u7b$closure$u7d$$u7d$17h5321bda725d8487fE_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17he51f71921d28e411Eas_ptr_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17hd71e4c99214ad485Ederef_ZN3std12backtrace_rs9symbolize5gimli3elf6Object13search_symtab17h5ada25c5e6ec0680Esearch_symtab_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17ha1208cfe60d43373Ebinary_search_by_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key17h289143e7a605f609Ebinary_search_by_key_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key28_$u7b$$u7b$closure$u7d$$u7d$17hd66e6b17ec9cf78aE{{closure}}_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17h2658eac429b61524Eget_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17hd1d2fdfa31e0d996Eget_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h2caf43eb2a56a54cEfrom_error<(core::option::Option<&addr2line::Function>>, core::option::Option),gimli::read::Error>_ZN4core3ptr125drop_in_place$LT$addr2line..FrameIter$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$17h7fba4a3a61d730d8Edrop_in_place>>_ZN9addr2line4lazy17LazyCell$LT$T$GT$11borrow_with17h2dc6e9b2b41a31ceEborrow_with>, gimli::read::Error>,closure-0>find_function_or_location_ZN9addr2line16ResUnit$LT$R$GT$25find_function_or_location28_$u7b$$u7b$closure$u7d$$u7d$17heace8f27d3e0e075E_ZN9addr2line17Function$LT$R$GT$5parse17hcd2b935a80a930d6E_ZN6object3pod5Bytes7read_at17h391dd2e11f70ea70Eread_at>_ZN104_$LT$object..elf..SectionHeader64$LT$Endian$GT$$u20$as$u20$object..read..elf..section..SectionHeader$GT$7sh_size17h4a4dc3aaa323e3f7Esh_size_ZN4core4iter6traits8iterator8Iterator8try_fold17h79e8fc3f07703078Etry_fold>,(),closure-0,core::ops::control_flow::ControlFlow<(usize, &object::elf::SectionHeader64), ()>>_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hf0f7393b84b1b996E_ZN4core4iter6traits8iterator8Iterator4find17h777ca2e2b375358dEfind>>,closure-0>SymbolTable_ZN6object4read3elf6symbol22SymbolTable$LT$Elf$GT$5parse17h21143ba558971a64ESectionTable_ZN6object4read3elf7section23SectionTable$LT$Elf$GT$7symbols17h879d7321bb448d83Esymbols>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h7251b1be17ddea2cEnext>_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold9enumerate28_$u7b$$u7b$closure$u7d$$u7d$17hb21eef2827e0ecc9E{{closure}}<&object::elf::SectionHeader64,(),core::ops::control_flow::ControlFlow<(usize, &object::elf::SectionHeader64), ()>,closure-0>_ZN6object4read3elf6symbol22SymbolTable$LT$Elf$GT$5parse28_$u7b$$u7b$closure$u7d$$u7d$17hccf0e16f21aa96f5E{{closure}}>_ZN4core4iter6traits8iterator8Iterator4find5check28_$u7b$$u7b$closure$u7d$$u7d$17hbf4f432dc11839eaE{{closure}}<(usize, &object::elf::SectionHeader64),closure-0>_ZN104_$LT$object..elf..SectionHeader64$LT$Endian$GT$$u20$as$u20$object..read..elf..section..SectionHeader$GT$9sh_offset17hacc54828af7df3f1Esh_offset_ZN6object4read3elf7section13SectionHeader13data_as_array17h39212ea9e47c1308Edata_as_array,object::elf::Sym64>_ZN6object3pod5Bytes13read_bytes_at17heefba56c02bbaa29Eread_bytes_at_ZN6object3pod16slice_from_bytes17h27c4fcd73d0587f6Eslice_from_bytes>_ZN6object3pod5Bytes10read_slice17h8ada637022b87643Eread_slice>_ZN6object4read3elf7section23SectionTable$LT$Elf$GT$7section17h625b5d4f9af96f4bEsection>_ZN5alloc3vec12Vec$LT$T$GT$3new17hee4d227aa3ef28f6Enew>>_ZN5alloc3vec12Vec$LT$T$GT$3new17hd13317b8bb446af3Enew_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h11f962b8dda33731Ederef_mut_ZN5alloc5slice10merge_sort17h0c9f901e4a218cafEmerge_sort_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$7sort_by17he027ef50fb3f3400Esort_by_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h93bc402a5e0a9265Eindex_mut_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hf77afa5d324ae49aEindex_mut>_ZN4core10intrinsics19copy_nonoverlapping17hdd739b04652c8e6fEcopy_nonoverlapping_ZN91_$LT$alloc..slice..insert_head..InsertionHole$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hc2ffa254c3756b52Edrop_ZN4core3ptr102drop_in_place$LT$alloc..slice..insert_head..InsertionHole$LT$addr2line..InlinedFunctionAddress$GT$$GT$17h79a7fc462734f348Edrop_in_place>_ZN5alloc5slice11insert_head17h7c282841d9efabb6Einsert_head_ZN9addr2line17Function$LT$R$GT$5parse28_$u7b$$u7b$closure$u7d$$u7d$17h427f150c09782a3aEsort_by_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$7sort_by28_$u7b$$u7b$closure$u7d$$u7d$17h4ce4a0fd3fd7ced5E{{closure}}_ZN4core3ptr4read17hc76821612915c3d2Eread_ZN4core3ptr77drop_in_place$LT$alloc..vec..Vec$LT$addr2line..InlinedFunctionAddress$GT$$GT$17h0ae77f1fbf14b1fcEdrop_in_place>_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hd2fac3493ab32ad9Edrop_ZN4core3ptr84drop_in_place$LT$alloc..raw_vec..RawVec$LT$addr2line..InlinedFunctionAddress$GT$$GT$17h151eb2b39e2de510Edrop_in_place>_ZN4core3ptr154drop_in_place$LT$alloc..vec..Vec$LT$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17hcb5b610221957ccaEdrop_in_place>, alloc::alloc::Global>>_ZN4core6option15Option$LT$T$GT$18get_or_insert_with17h55decc9b5a362a76Eget_or_insert_with>, gimli::read::Error>,closure-0>_ZN4core6option15Option$LT$T$GT$13get_or_insert17hd6954aa33521a232Eget_or_insert>, gimli::read::Error>>_ZN4core6result19Result$LT$T$C$E$GT$6as_ref17h45ff0e4624512836Eas_ref>,gimli::read::Error>_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h1c69bec294ba6c29Emap_err<&addr2line::Function>,&gimli::read::Error,gimli::read::Error,fn(&gimli::read::Error) -> gimli::read::Error>_ZN5alloc3vec12Vec$LT$T$GT$3new17h9924f841a0bc5e99Enew<&addr2line::InlinedFunction>>_ZN9addr2line17Function$LT$R$GT$22find_inlined_functions17h4a474a25fcf57d48Efind_inlined_functions>_ZN4core3ptr5write17h6d1a4a8974434d92Ewrite<&addr2line::InlinedFunction>>_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h25f786a121b273f7Epush<&addr2line::InlinedFunction>,alloc::alloc::Global>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17hd656e461f6570c01Eget_unchecked_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17he822185b94da92f4E_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hc01c13315d899288Eindex_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h6d43255604f9e999Eindex>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h6150325bf7db5e62Eoffset_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17he80a9f7d3672e230Eadd_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17h4b94f80588ab34daEbinary_search_byfind_inlined_functions_ZN9addr2line17Function$LT$R$GT$22find_inlined_functions28_$u7b$$u7b$closure$u7d$$u7d$17h52382d201ef69dd7E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17hc35776081094f4a2Egrow_amortized<&addr2line::InlinedFunction>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h0b56b432cdcb09cfEtry_reserve<&addr2line::InlinedFunction>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h108ccb8af6cad80eE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h930ff59aae32683cE_ZN4core5alloc6layout6Layout5array17h85bebb416a14185aEarray<&addr2line::InlinedFunction>>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17ha4c8a9e406c06e2bEset_ptr<&addr2line::InlinedFunction>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h9335a5e15371ccddEcapacity_from_bytes<&addr2line::InlinedFunction>,alloc::alloc::Global>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17he97d7915ac00fe77E_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h63b808fa1c222509Eadd<&addr2line::InlinedFunction>>_ZN90_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17he8d412d6605865e5Einto_iter<&addr2line::InlinedFunction>,alloc::alloc::Global>_ZN6object4read3elf6symbol22SymbolTable$LT$Elf$GT$5parse28_$u7b$$u7b$closure$u7d$$u7d$17h4c443d7ad4ca3d27E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4find17h74d6e59e2900e6e3Efind,closure-1>_ZN6object4read3elf7section13SectionHeader13data_as_array17h4c261deed08c05afEdata_as_array,u32>_ZN6object4read3elf6symbol22SymbolTable$LT$Elf$GT$5parse28_$u7b$$u7b$closure$u7d$$u7d$17h88f0e97937ed87dfE_ZN4core6option15Option$LT$T$GT$3map17h1c2d7d101bafa063Emap<&object::elf::SectionHeader64,core::result::Result<&[u32], object::read::Error>,closure-2>_ZN6object3pod16slice_from_bytes17h950acf45afb65fc6Eslice_from_bytes_ZN6object3pod5Bytes10read_slice17h174ffceb076ba7f3Eread_slice_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17h8a1ee734a2137310Eis_empty>_ZN6object4read3elf6symbol22SymbolTable$LT$Elf$GT$8is_empty17h2a823c661c3a7277Eis_empty>_ZN4core4iter6traits8iterator8Iterator8try_fold17ha755739f8d63bcc5Etry_fold>,(),closure-0,core::ops::control_flow::ControlFlow<&object::elf::Sym64, ()>>_ZN108_$LT$core..iter..adapters..filter..Filter$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hb18f7724f06d577fEtry_fold>,closure-0,(),closure-0,core::ops::control_flow::ControlFlow<&object::elf::Sym64, ()>>_ZN4core4iter6traits8iterator8Iterator4find17had4839cc14654e83Efind>, closure-0>,&mut closure-1>_ZN108_$LT$core..iter..adapters..filter..Filter$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h608e060b4bdf438bEnext>, closure-0>,closure-1>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h57166b404fc41262Enext>, closure-0>, closure-1>,closure-2>_ZN111_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..spec_from_iter_nested..SpecFromIterNested$LT$T$C$I$GT$$GT$9from_iter17hedaff0c17e1c2b18Efrom_iter>, closure-0>, closure-1>, closure-2>>_ZN98_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..spec_from_iter..SpecFromIter$LT$T$C$I$GT$$GT$9from_iter17he8e9616c178ddf91E_ZN95_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..collect..FromIterator$LT$T$GT$$GT$9from_iter17h2d06522faad0282cE_ZN4core4iter6traits8iterator8Iterator7collect17h75eb5fadc3028988Ecollect>, closure-0>, closure-1>, closure-2>,alloc::vec::Vec>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h6d235b4c78845126Enext>_ZN4core3ptr8non_null16NonNull$LT$T$GT$13new_unchecked17h2df206626f806abbEnew_unchecked>_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h8886c521da31b558Epost_inc_start>_ZN4core4iter8adapters6filter15filter_try_fold28_$u7b$$u7b$closure$u7d$$u7d$17h2a48d0c5b3a835cdE{{closure}}<&object::elf::Sym64,(),core::ops::control_flow::ControlFlow<&object::elf::Sym64, ()>,closure-0,closure-0>_ZN83_$LT$object..elf..Sym64$LT$Endian$GT$$u20$as$u20$object..read..elf..symbol..Sym$GT$8st_value17h41bd2d6facb19a33Est_value_ZN3std12backtrace_rs9symbolize5gimli3elf6Object5parse28_$u7b$$u7b$closure$u7d$$u7d$17h4046943478f4c5c3E_ZN4core3ops8function5impls80_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$9call_once17hb6d4f783c47fd2ceEcall_once<(&object::elf::Sym64),closure-2>_ZN4core6option15Option$LT$T$GT$3map17h2fde032f2cbc7577Emap<&object::elf::Sym64,std::backtrace_rs::symbolize::gimli::elf::ParsedSym,&mut closure-2>_ZN83_$LT$object..elf..Sym64$LT$Endian$GT$$u20$as$u20$object..read..elf..symbol..Sym$GT$7st_name17hd6a15ea6350a651eEst_name_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h4334e2445a6cee3dEallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17hfd1b819365b8de47Ewith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h1df27abf29bd437eE_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17hf69d63e2aab464ecEwith_capacity_ZN4core3ptr5write17h9081f4b49e6406f0Ewrite_ZN5alloc3vec16Vec$LT$T$C$A$GT$16extend_desugared17hbd98c5a88a7281d3Eextend_desugared>, closure-0>, closure-1>, closure-2>>_ZN97_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$T$C$I$GT$$GT$11spec_extend17h48b7fe3a80840186Espec_extend>, closure-0>, closure-1>, closure-2>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17had4f2594778e2440Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h0e6207c4ac661ad3Etry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h0bde0d056c6c3b4fE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17h9b315e00f3ba8f19E_ZN4core5alloc6layout6Layout5array17h9316b3974c439e18Earray_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hd5eec7bd46bb02aaEas_mut_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17hfe60725ffa60cdb2Eset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h1e525b02054dc596Ecapacity_from_bytes_ZN5alloc3vec16Vec$LT$T$C$A$GT$7set_len17hd0cafb65b13b163eEset_len_ZN5alloc3vec12Vec$LT$T$GT$3new17h2e41614b80d2d51bEnew_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h619e612daffd6317Ederef_mut_ZN4core3num23_$LT$impl$u20$usize$GT$13leading_zeros17h1f56b7d1415fe2c5Eleading_zeros_ZN4core5slice4sort9quicksort17h52b91854b73414a9Equicksort_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20sort_unstable_by_key17h3634c0507a35fdf6Esort_unstable_by_keySection_ZN5gimli4read7Section12section_name17hf9d4a8ef6f44ae8bEsection_name>,gimli::read::endian_slice::EndianSlice>_ZN3std12backtrace_rs9symbolize5gimli7Context3new12load_section17h1105eff6bf1e39e6Eload_section>>_ZN3std12backtrace_rs9symbolize5gimli7Context3new17h3f07217892a633ceE_ZN4core6option15Option$LT$T$GT$9unwrap_or17h4ca3f34d3f78adf9Eunwrap_or<&[u8]>_ZN5gimli4read7Section12section_name17h40b17974d1979e02Esection_name>,gimli::read::endian_slice::EndianSlice>_ZN3std12backtrace_rs9symbolize5gimli7Context3new12load_section17h05943933b1889cacEload_section>>_ZN5gimli4read7Section12section_name17h076979d2cc7b7be4Esection_name>,gimli::read::endian_slice::EndianSlice>_ZN3std12backtrace_rs9symbolize5gimli7Context3new12load_section17h5a2e24f7229d8232Eload_section>>_ZN5gimli4read7Section12section_name17he41cfab4df5b4775Esection_name>,gimli::read::endian_slice::EndianSlice>_ZN3std12backtrace_rs9symbolize5gimli7Context3new12load_section17h521305309c944d90Eload_section>>_ZN5gimli4read7Section12section_name17h2f4737796ed6b6f6Esection_name>,gimli::read::endian_slice::EndianSlice>_ZN3std12backtrace_rs9symbolize5gimli7Context3new12load_section17h904e652d27f55346Eload_section>>_ZN5gimli4read7Section12section_name17h1bedcdd4c5a9cc8cEsection_name>,gimli::read::endian_slice::EndianSlice>_ZN3std12backtrace_rs9symbolize5gimli7Context3new12load_section17hb4a643bf1648add9Eload_section>>_ZN5gimli4read7Section12section_name17hecdd4fa8ae19e52fEsection_name>,gimli::read::endian_slice::EndianSlice>_ZN3std12backtrace_rs9symbolize5gimli7Context3new12load_section17h75ccc865a0c4e748Eload_section>>_ZN5gimli4read7Section12section_name17hfda563fe29b20dd8Esection_name>,gimli::read::endian_slice::EndianSlice>_ZN3std12backtrace_rs9symbolize5gimli7Context3new12load_section17h5cd43da7e389c15eEload_section>>_ZN5gimli4read7Section12section_name17h43f5fab3a138db07Esection_name>,gimli::read::endian_slice::EndianSlice>_ZN3std12backtrace_rs9symbolize5gimli7Context3new12load_section17h0a6290dc5757ea33Eload_section>>_ZN9addr2line16Context$LT$R$GT$13from_sections17h59279fbd89ee3a54Efrom_sections>_ZN4core6result19Result$LT$T$C$E$GT$2ok17he51d2b12edbdceb3Eok>,gimli::read::Error>_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17hc3c08cac3e048e0cEinto_result>>_ZN4core6option15Option$LT$T$GT$5ok_or17h0e70c927052bb544Eok_or>,core::option::NoneError>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17hadcd7db4853bf5c4Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h164ebaf6d8a9f9b1Ewith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h91c9881c8efb31d3E_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h5efadebcb151103eEwith_capacity_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h76dccbed7059b7d1Einto_result_ZN4core6option15Option$LT$T$GT$5ok_or17h5c9fecad4b9b8fdfEok_or_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h7455a4a4c5d1a2b8E_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h01b9bfedf5cbcd3fEindex_mut>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$7reverse17h1fb9c08a2ae7e696Ereverse_ZN4core3ptr4swap17hcebc269d1f8582c7Eswap_ZN4core10intrinsics4copy17h9dec753b05d797feEcopy_ZN81_$LT$alloc..slice..merge..MergeHole$LT$T$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17hcd71c25980e851dcE_ZN4core3ptr92drop_in_place$LT$alloc..slice..merge..MergeHole$LT$addr2line..InlinedFunctionAddress$GT$$GT$17hb2a0adb5b117d798Edrop_in_place>_ZN5alloc5slice5merge17h937c1bd1bf646dbaEmerge_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h62ce8e7bcd484ac6E_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h9517a221453aa183E_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h383364fe1dbee4eaEget_unchecked_mut_ZN5alloc5slice5merge17get_and_increment17he8c20586af60533aEget_and_increment_ZN5alloc3vec16Vec$LT$T$C$A$GT$13shrink_to_fit17hc7c077e8d3878286Eshrink_to_fit>,alloc::alloc::Global>_ZN5alloc3vec16Vec$LT$T$C$A$GT$16into_boxed_slice17hae976d63fdc7fedfEinto_boxed_slice>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$6shrink17he546c6698d6530f2Eshrink>,alloc::alloc::Global>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13shrink_to_fit17h2ef6e3d667eae41eE_ZN4core6result19Result$LT$T$C$E$GT$7map_err17hc107cc861d782ba0E_ZN5alloc3vec16Vec$LT$T$C$A$GT$13shrink_to_fit17h84f5c020635a7b37Eshrink_to_fit_ZN5alloc3vec16Vec$LT$T$C$A$GT$16into_boxed_slice17hb8c11ad3951920abEinto_boxed_slice_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$6shrink17hdef17ec6587b1867Eshrink_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13shrink_to_fit17hb4ec350bd44ac2c8E_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h5251ec867fd9e525E_ZN4core3ptr245drop_in_place$LT$core..option..Option$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$..get_or_insert..$u7b$$u7b$closure$u7d$$u7d$$GT$17h6a3a584b0e3f2003E_ZN4core6option15Option$LT$T$GT$6unwrap17h0a01fab0eb86d2cbEunwrap<&gimli::read::abbrev::Abbreviation>_ZN6object4read3elf7section23SectionTable$LT$Elf$GT$15section_by_name17h65f13d6e7d237255Esection_by_name>_ZN3std12backtrace_rs9symbolize5gimli3elf6Object14section_header17hce2f58cac18aaeedEsection_header_ZN4core4iter6traits8iterator8Iterator8try_fold17h8bbb6997790b74f3E_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h053f9b3f1a203ce1E_ZN4core4iter6traits8iterator8Iterator4find17h9db874a2883bc646E_ZN6object4read3elf7section23SectionTable$LT$Elf$GT$12section_name17hc70f6f8d7c21044eEsection_name>section_by_name_ZN6object4read3elf7section23SectionTable$LT$Elf$GT$15section_by_name28_$u7b$$u7b$closure$u7d$$u7d$17hd64d6cabb0e306a7E_ZN4core4iter6traits8iterator8Iterator4find5check28_$u7b$$u7b$closure$u7d$$u7d$17h86a600081060cfceE_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold9enumerate28_$u7b$$u7b$closure$u7d$$u7d$17h1b28aab87c7160dcE_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h936df588956deb1bEmap_err<&[u8],(),object::read::Error,closure-0>_ZN93_$LT$core..result..Result$LT$T$C$$LP$$RP$$GT$$u20$as$u20$object..read..ReadError$LT$T$GT$$GT$10read_error17h6c38f6147c399f20Eread_error<&[u8]>_ZN104_$LT$object..elf..SectionHeader64$LT$Endian$GT$$u20$as$u20$object..read..elf..section..SectionHeader$GT$7sh_name17hd9aaac674b385d1dEsh_name_ZN74_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..cmp..PartialEq$GT$2eq17hd5336f6ee8f7919fEeq<&[u8],object::read::Error>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11starts_with17h2f826ad338ac7847Estarts_with_ZN55_$LT$$RF$str$u20$as$u20$core..str..pattern..Pattern$GT$12is_prefix_of17h1a8ef2fcac409b7cEis_prefix_of_ZN4core3str21_$LT$impl$u20$str$GT$11starts_with17had0e91273796d0a3Estarts_with<&str>_ZN6object4read3elf7section23SectionTable$LT$Elf$GT$4iter17ha375a9a1a5bb1e72Eiter>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8find_map17hd2b2e83d06b88cccEfind_map,&object::elf::SectionHeader64,&mut closure-0>_ZN115_$LT$core..iter..adapters..filter_map..FilterMap$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h45e15c05ffcea9daEnext<&object::elf::SectionHeader64,core::slice::iter::Iter>,closure-0>_ZN3std12backtrace_rs9symbolize5gimli3elf6Object7section28_$u7b$$u7b$closure$u7d$$u7d$17h508e0b7a3586f8d4E_ZN4core3ops8function5impls79_$LT$impl$u20$core..ops..function..FnMut$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$8call_mut17hbd0eb4e008381351Ecall_mut<(&object::elf::SectionHeader64),closure-0>_ZN6object3pod5Bytes10read_bytes17hf51bfca87c877fd2Eread_bytes_ZN6object3pod10from_bytes17h15e6cf9b788074d6Efrom_bytes>_ZN6object3pod5Bytes4read17h7b8111384ff443bfEread>_ZN4core3num21_$LT$impl$u20$u32$GT$13from_be_bytes17h2893cdb6bdf16cf7EendianEndian_ZN6object6endian6Endian14read_u32_bytes17hf4aa6a0089958eb9Eread_u32_bytesU32Bytes_ZN6object6endian17U32Bytes$LT$E$GT$3get17h850a51086458884bEget_ZN3std12backtrace_rs9symbolize5gimli3elf15decompress_zlib17h3d4a0d562725ebcaEdecompress_zlibminiz_oxideinflate_ZN74_$LT$miniz_oxide..inflate..TINFLStatus$u20$as$u20$core..cmp..PartialEq$GT$2eq17h27975b2d274d1349E_ZN6object3pod10from_bytes17h09c058b1ea4ac9cdEfrom_bytes>_ZN6object3pod5Bytes4read17hf2c09a0c08bdd684Eread>compression_ZN116_$LT$object..elf..CompressionHeader64$LT$Endian$GT$$u20$as$u20$object..read..elf..compression..CompressionHeader$GT$7ch_size17h81a0f708f158fd18Ech_size_ZN5alloc3vec16Vec$LT$T$C$A$GT$8is_empty17h4645010465b4faa4Eis_empty_ZN3std3ffi6os_str8OsString3new17h9bef8bea939dcaa7E_ZN4core6result19Result$LT$T$C$E$GT$3map17he2e26392a468f988Emap_ZN69_$LT$std..ffi..os_str..OsString$u20$as$u20$core..default..Default$GT$7default17h7bee467d1e257e6bE_ZN4core6result19Result$LT$T$C$E$GT$17unwrap_or_default17h20f92572fdcb157eEunwrap_or_default_ZN4core3ptr99drop_in_place$LT$core..result..Result$LT$std..ffi..os_str..OsString$C$std..io..error..Error$GT$$GT$17h4fb882930ea92856Edrop_in_place>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17h23f598a6a5dbdae5Eallocate_in_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17hac7501a688a48a03Ewith_capacity_in_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17h8a95082a90b1c24aE_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17h3eb84bfabe54b86bEwith_capacity_ZN111_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..spec_from_iter_nested..SpecFromIterNested$LT$T$C$I$GT$$GT$9from_iter17hae7eed5ec7f04d9aEfrom_iter, closure-1>>_ZN98_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..spec_from_iter..SpecFromIter$LT$T$C$I$GT$$GT$9from_iter17h6151e4c7c442e953E_ZN95_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..collect..FromIterator$LT$T$GT$$GT$9from_iter17hf816ce341e8849f9E_ZN4core4iter6traits8iterator8Iterator7collect17h01ed91f7bc31bd5bEcollect, closure-1>,alloc::vec::Vec>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h9e1d80e917990650Enext_ZN4core4iter6traits8iterator8Iterator4fold17h37755f709c3d52bdEfold,(),closure-0>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17hacf7e9edf5ca0e39Efold,closure-1,(),closure-0>_ZN4core4iter6traits8iterator8Iterator8for_each17h88b35c5d524cab07Efor_each, closure-1>,closure-0>_ZN97_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$T$C$I$GT$$GT$11spec_extend17h93891f04a1402a74Espec_extend, closure-1>,alloc::alloc::Global>_ZN97_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$T$C$I$GT$$GT$11spec_extend28_$u7b$$u7b$closure$u7d$$u7d$17h53556cca169ce3f3E{{closure}}, closure-1>,alloc::alloc::Global>_ZN4core4iter6traits8iterator8Iterator8for_each4call28_$u7b$$u7b$closure$u7d$$u7d$17he4de9334316a31aeE{{closure}}_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17hbe5c1a2512cf5b58E{{closure}}<&libc::unix::linux_like::linux::Elf64_Phdr,std::backtrace_rs::symbolize::gimli::LibrarySegment,(),closure-1,closure-0>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hfb586002d49abb57Eoffset_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17hb2e8e5e6faa226f2Epost_inc_start_ZN4core3ptr5write17h6faa7f6e124295c8Ewrite_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h9f1e4a69098e009bEoffset_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h5bb2b8c55c3bc925Epush_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17hb646a96f3fa1b570Egrow_amortized_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17h85481cfdd26fd8afEtry_reserve_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17h538f76d2a5e474d1E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17hf7bb5665006313dcE_ZN4core5alloc6layout6Layout5array17h99a5fed6c9c91bc9Earray_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17h8da98d20a8de1c96Eas_mut_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17h3cf8303dc86005b0Eset_ptr_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$19capacity_from_bytes17h661cd2b2a5429216Ecapacity_from_bytes_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h1373e5f2eb90e3f6Eoffset_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h5aa7bc6ff422d5d6Eadd_ZN4core3ptr5write17h9e9e91377a0d07dcEwritetypesFeature_ZN100_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hab3ebffc95633d73E_ZN112_$LT$alloc..collections..btree..map..IntoIter$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h356981071f711b35Enext_ZN112_$LT$alloc..collections..btree..map..IntoIter$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h793f5bb9ed55be82E_ZN112_$LT$alloc..collections..btree..map..IntoIter$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha6f053cb0d900668Enext_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h60cace8300b3f443Etype_id_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h89b4964b2bd8d03aEtype_id<()>_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17ha6a5e121cf9ec9e1Etype_id_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17hd44aec1bcefc6d1fEtype_id<&str>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h0e70aa6a030acd83Efmt<()>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1450342c9b18948dEfmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1bb8ac4a9a4cbaabEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1f84fb3e8fd24a94Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h213625844f100ba2E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h2752fc30a4b78eb3Efmt<&std::sys::unix::ext::net::listener::UnixListener>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h2fac0e303ddb54f0E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h31a6225c78bce8a6Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h350a16b63571c3c5Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h35d3ec0ffaa97ba9Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h3dff82155b88dee2Efmt<&[u16]>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h4acbe7977cc6d1d2Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h4acc8555d9f77b83Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h4f5861c6cde76ec9Efmt<&str>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h4fc77bbdf3c795afEfmt<&core::option::Option>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h5689441a71da0ce7Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h57d8d5a60f7bc549Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h5904816538df8e4dEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h5b515fa858dcc251E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h5cca8759a0e7e20cEfmt<&std::ffi::os_str::OsString>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h5f65e063d2d3a386Efmt<&[u8]>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h5fd9a02f5323481aEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h646d2b1b63259c38E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h708776e454a231d9Efmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h71e76af1e4659c62Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h731af3943ba6969dEfmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h76adcdcec941c709Efmt<[u8; 4]>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7c54b8b702100052Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7cc682e31e6bf085E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h81cecc596a7b141fE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h835c7e4563c3621eEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h8570a0db70a10fd0Efmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h87ca7578322ac537Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h87d1eb4bc8a712a4Efmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h88c9491da26ab2eeEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h96f9fdcf3e4fc633Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h98b3474166d3b5cbE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h9bbca12584e42a59E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha23f62a629a9eab8Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hab7caf422a649b43Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hadd6e4876747c084Efmt<[std::ffi::os_str::OsString]>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hb31f9f6f49e9cacfEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hb61f25c90187d1bcEfmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hbda5a78444a0baa4Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hc7842e6093831920Efmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hd2eae74781dd9de2Efmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hd3380be5273e9235Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hd9dce979fd5b081aEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hdda9cbeb2ef1f874Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17he5ee07c59eb88278Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17he7fc0b2c5255d010Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hec5c68f24bb15967Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf0827a0a89a7e6cfEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf1dd0c217b55a9efEfmt<&std::net::tcp::TcpListener>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf20527557ce5ed52Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf4f19ddcc5f80828Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hfc1f8e35ff53a9a4Efmt_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h03db5270c8ffe834Efmt_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h0b7a50a34f9e3fceEfmt_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h73991631c700df7eE_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17hb0eb1ece7744675fEfmt_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17he23951969e919595E_ZN45_$LT$$RF$T$u20$as$u20$core..fmt..LowerHex$GT$3fmt17h9a861acc2a3b3e10E_ZN45_$LT$$RF$T$u20$as$u20$core..fmt..UpperHex$GT$3fmt17h9bd28cd515e87208E_ZN4core3ops8function2Fn4call17hd59ab2db7d9b2de6Ecall_ZN4core3ops8function5FnMut8call_mut17h6423a736154b30a0Ecall_mut_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h10409f2917ce07dcE_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h218894f5a2efbe89E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h2cb25f3d2e692782E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h32e7420ee8d00448E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h393ac2da40e736f9E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h49d849757cd4b76aE_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h5ce897b3147333f4E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h5d67fdcd6c80ddbcE_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h65a991a2ae6744c9E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h84cf109a6fff8bbcE_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17ha0500ef8640e8c08E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17ha98e8b1135267825E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17hc7fa2a11e3594226E_ZN4core3ptr100drop_in_place$LT$$RF$mut$u20$std..io..Write..write_fmt..Adaptor$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h2ac35bf14045b6f1Edrop_in_place<&mut std::io::Write::write_fmt::Adaptor>>_ZN4core3ptr107drop_in_place$LT$alloc..vec..Vec$LT$$LP$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$RP$$GT$$GT$17h5bb570ea62b6c5b2Edrop_in_place>_ZN4core3ptr124drop_in_place$LT$alloc..collections..btree..map..BTreeMap$LT$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$GT$$GT$17h2097a325051cd273Edrop_in_place>_ZN4core3ptr124drop_in_place$LT$alloc..collections..btree..map..IntoIter$LT$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$GT$$GT$17hd40ffdf52ff0f63aEdrop_in_place>_ZN4core3ptr133drop_in_place$LT$std..sys_common..poison..PoisonError$LT$std..sync..mutex..MutexGuard$LT$std..sync..barrier..BarrierState$GT$$GT$$GT$17h5520e939a638bbe8Edrop_in_place>>_ZN4core3ptr146drop_in_place$LT$alloc..vec..Vec$LT$addr2line..ResUnit$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17h585c27b7605bda1cEdrop_in_place>, alloc::alloc::Global>>_ZN4core3ptr150drop_in_place$LT$alloc..boxed..Box$LT$alloc..collections..btree..node..LeafNode$LT$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$GT$$GT$$GT$17hb714b8447d51f2aeEdrop_in_place, alloc::alloc::Global>>_ZN4core3ptr152drop_in_place$LT$alloc..collections..btree..map..BTreeMap$LT$std..ffi..os_str..OsString$C$core..option..Option$LT$std..ffi..os_str..OsString$GT$$GT$$GT$17h22f8d406564ad664Edrop_in_place>>_ZN4core3ptr153drop_in_place$LT$gimli..read..line..IncompleteLineProgram$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$17heb21451e3d08d924Edrop_in_place, usize>>_ZN4core3ptr154drop_in_place$LT$alloc..boxed..Box$LT$alloc..collections..btree..node..InternalNode$LT$std..ffi..os_str..OsString$C$std..ffi..os_str..OsString$GT$$GT$$GT$17h15874c22737f8c52Edrop_in_place, alloc::alloc::Global>>_ZN4core3ptr158drop_in_place$LT$alloc..vec..Vec$LT$$RF$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17h76674abbd91fde6dEdrop_in_place>, alloc::alloc::Global>>_ZN4core3ptr170drop_in_place$LT$alloc..vec..into_iter..IntoIter$LT$alloc..boxed..Box$LT$dyn$u20$core..ops..function..FnOnce$LT$$LP$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$GT$$GT$$GT$17heaaa5d238754d7b2Edrop_in_place, alloc::alloc::Global>, alloc::alloc::Global>>_ZN4core3ptr174drop_in_place$LT$core..result..Result$LT$addr2line..Functions$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$17hb8367792f49109e9Edrop_in_place>, gimli::read::Error>>_ZN4core3ptr226drop_in_place$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$GT$17hd8740aae014a66bbEdrop_in_place_ZN4core3ptr44drop_in_place$LT$std..backtrace_rs..Bomb$GT$17h1034933388f8f855Edrop_in_place_ZN4core3ptr51drop_in_place$LT$std..backtrace..BacktraceFrame$GT$17hab7edfdb3f257ba4Edrop_in_place_ZN4core3ptr55drop_in_place$LT$gimli..read..abbrev..Abbreviations$GT$17h1977de9143c7d0c0Edrop_in_place_ZN4core3ptr65drop_in_place$LT$std..backtrace_rs..symbolize..gimli..Mapping$GT$17h082a77839a92d430Edrop_in_place_ZN4core3ptr70drop_in_place$LT$alloc..vec..Vec$LT$std..ffi..os_str..OsString$GT$$GT$17h9ec90baab2d64db4Edrop_in_place>_ZN4core3ptr70drop_in_place$LT$alloc..vec..Vec$LT$std..net..addr..SocketAddr$GT$$GT$17h275a288de43ec3f2Edrop_in_place>_ZN4core3ptr70drop_in_place$LT$std..panicking..begin_panic_handler..PanicPayload$GT$17h12bea6f0875e3cc3Edrop_in_place_ZN4core3ptr71drop_in_place$LT$std..panicking..rust_panic_without_hook..RewrapBox$GT$17h663b66281e465eabEdrop_in_place_ZN4core3ptr76drop_in_place$LT$core..result..Result$LT$i32$C$std..io..error..Error$GT$$GT$17h279b24a117999665Edrop_in_place>_ZN4core3ptr78drop_in_place$LT$alloc..boxed..Box$LT$std..sys..unix..condvar..Condvar$GT$$GT$17h871015ce9cd954eeEdrop_in_place>_ZN4core3ptr84drop_in_place$LT$std..sync..mutex..Mutex$LT$std..sync..barrier..BarrierState$GT$$GT$17h5c286567906cb2b2Edrop_in_place>_ZN4core3ptr86drop_in_place$LT$core..result..Result$LT$addr2line..Lines$C$gimli..read..Error$GT$$GT$17heb685802d05ff7e5Edrop_in_place>_ZN4core3ptr87drop_in_place$LT$std..io..Write..write_fmt..Adaptor$LT$$RF$mut$u20$$u5b$u8$u5d$$GT$$GT$17he6b36265caa5c218Edrop_in_place>_ZN4core3ptr91drop_in_place$LT$core..result..Result$LT$std..path..PathBuf$C$std..io..error..Error$GT$$GT$17hd5ad15c7dbbd72ecEdrop_in_place>_ZN4core3ptr92drop_in_place$LT$std..io..buffered..bufreader..BufReader$LT$std..io..stdio..StdinRaw$GT$$GT$17h7070c574c8a6bb84Edrop_in_place>_ZN4core3ptr95drop_in_place$LT$std..io..buffered..linewriter..LineWriter$LT$std..io..stdio..StdoutRaw$GT$$GT$17h2ebde5c2d8ba32b5Edrop_in_place>_ZN4core3str21_$LT$impl$u20$str$GT$8contains17h194016f7fbe87ddaEcontains<&str>_ZN4core5array69_$LT$impl$u20$core..fmt..Debug$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$3fmt17h73c1a41e745480e1E_ZN4core5slice4sort14break_patterns17h285610ceb4f0020fEbreak_patterns_ZN4core5slice4sort22partial_insertion_sort17h717780d88e9adc95Epartial_insertion_sort_ZN4core5slice4sort7recurse17hb3ec6010972bc252Erecurse_ZN4core5slice4sort8heapsort17h5feb6e46bc0024ddEheapsort_ZN4core6option15Option$LT$T$GT$6unwrap17h04266acc3b40b593Eunwrap<&core::fmt::Arguments>_ZN4core9core_arch3x865xsave7_xgetbv17hfda4cc99a0df1b2fE_xgetbv_ZN50_$LT$$BP$mut$u20$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hfd163c04b3039f48E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h018a2c639b0bc8f7E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h3ac99577867382ebE_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h3d9114377d150a83E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h7fb4837300b6ba06E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hbf728b0a7d6a9439E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hd5b80709d2d17820Ewrite_char_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17he85a6947ab6489b3E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h134e2464c410794aE_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h2bbb8060da2aa36cE_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h43ed52faab20304dE_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h569a64abfd8edbd3E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h6e7c15a489991d48E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h8168b035bbc76311E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17hc6c2777dbe9628e4E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h22398aaa8a7941d3Ewrite_str>_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h4308675e8cb8edc0Ewrite_str>_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h679f429275b29e92Ewrite_str>>_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17hb2b2c69936e90a07Ewrite_str_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17hc3b32ab763029d5aEwrite_str>_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17hc860688f11bc44ccEwrite_str>_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17hd9a1d9477eb5669dEwrite_str>_ZN54_$LT$$LP$T10$C$T11$RP$$u20$as$u20$core..fmt..Debug$GT$3fmt17h620e1c7ec3b4c6c8Efmt<&std::ffi::os_str::OsString,&core::option::Option>_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$6insert17h285492e784f86f3aE_ZN5alloc11collections5btree3map21BTreeMap$LT$K$C$V$GT$6insert17h8120972002ec792bE_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$15bulk_steal_left17ha0359d0d5e1aae93Ebulk_steal_left>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$15bulk_steal_left17hbd30136f5c84a7e9Ebulk_steal_left_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$16bulk_steal_right17h9885f2ce7afbfb54Ebulk_steal_right_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$16bulk_steal_right17ha5557badcd22730dEbulk_steal_right>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$21merge_tracking_parent17h676aaf2f89da2a71Emerge_tracking_parent_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$21merge_tracking_parent17h874c017f12bc0339Emerge_tracking_parent>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$25merge_tracking_child_edge17h9b38b48e8d84ed0cEmerge_tracking_child_edge>_ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$25merge_tracking_child_edge17hc6084676edc58d7dEmerge_tracking_child_edge_ZN5alloc11collections5btree6remove259_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$14remove_leaf_kv17h690267de29404de7Eremove_leaf_kv,closure-0>_ZN5alloc11collections5btree6remove259_$LT$impl$u20$alloc..collections..btree..node..Handle$LT$alloc..collections..btree..node..NodeRef$LT$alloc..collections..btree..node..marker..Mut$C$K$C$V$C$alloc..collections..btree..node..marker..Leaf$GT$$C$alloc..collections..btree..node..marker..KV$GT$$GT$14remove_leaf_kv17hbe62737dc7165b58Eremove_leaf_kv_ZN5alloc3vec16Vec$LT$T$C$A$GT$6insert17h35057afe8914dd4eEinsert<(usize, std::backtrace_rs::symbolize::gimli::Mapping),alloc::alloc::Global>_ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17h5e79365aabadaf81Edrop_slow_ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17h64925e500ce5daa9Edrop_slow_ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17h6c12dfbe6156b1d2Edrop_slow>>_ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17hcd1be214ec61009aEdrop_slow_ZN5alloc5alloc8box_free17h1506726f870520a2Ebox_free,alloc::alloc::Global>_ZN5alloc7raw_vec11finish_grow17h38202b483312bd78Efinish_grow_ZN5gimli4read4line15FileEntryFormat5parse17h8e4d07a2c88e3316E_ZN5gimli4read4line15parse_attribute17h31cb2d6c5e85d6c9Eparse_attribute>_ZN5gimli4read4line27FileEntry$LT$R$C$Offset$GT$5parse17h82de81a95975789eE_ZN5gimli4read4unit15parse_attribute17h445dcd9073146244E_ZN5gimli4read4unit18Attribute$LT$R$GT$5value17h0ebdec163f47b947E_ZN5gimli4read5dwarf14Dwarf$LT$R$GT$11attr_string17h7ade7658e5a2e063Eattr_string>_ZN5gimli4read8rnglists20RngListIter$LT$R$GT$4next17h6da86a6bd1480f21E_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h12f3825e5c74fa81E_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17ha46246d64de77b32E_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17he222d8ab0ae6e843E_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17hf5c64847942d0b84E_ZN70_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h540a9e6e3630408cEfmt_ZN90_$LT$gimli..read..unit..AttributeValue$LT$R$C$Offset$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hf312da8f8d452a06E_ZN9addr2line16Context$LT$R$GT$10from_dwarf17h75f8e4ae36b047acEfrom_dwarf>_ZN9addr2line16ResUnit$LT$R$GT$11parse_lines17haec773167e562acaEparse_lines>_ZN9addr2line16ResUnit$LT$R$GT$11render_file17h59efc7ce3f09c364Erender_file>_ZN9addr2line16ResUnit$LT$R$GT$13find_location17hcd85c40d212e1ce6Efind_location>_ZN9addr2line17Function$LT$R$GT$14parse_children17hab00b6c18ba7193fEparse_children>_ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17h7292b904e3faee8aE{{closure}},closure-0>_ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17ha4c94a5024f5e0fdE_ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17hfd1e58f62d8f6250E_ZN9addr2line9name_attr17h39ed5df4834bf613Ename_attr>_ZN68_$LT$std..thread..local..AccessError$u20$as$u20$core..fmt..Debug$GT$3fmt17h494b05107d7a144fE_ZN70_$LT$std..thread..local..AccessError$u20$as$u20$core..fmt..Display$GT$3fmt17hc6c97830eeee7b66E_ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17h496e4f93e18cced5Etry_initialize>,fn() -> core::cell::RefCell>>_ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17h98dbc29c9ae7ee05Etry_initialize,fn() -> core::cell::Cell>_ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17h9aa8506da27f6a89Etry_initialize,fn() -> core::cell::Cell<(u64, u64)>>_ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17hf311e94cb3a48ed5Etry_initialize>>>>,fn() -> core::cell::Cell>>>>>_ZN3std6thread5local4fast13destroy_value17he156ee869e2a3c42Edestroy_value>>_ZN3std6thread5local4fast13destroy_value17hfe1d117bb66f5e47Edestroy_value>>>>>_ZN3std6thread21available_concurrency21available_concurrency17ha11158094ac2e942E_ZN3std6thread7Builder3new17h9c4aaa491141802aE_ZN3std6thread7Builder4name17h154db07edb3bac3fE_ZN3std6thread7Builder10stack_size17h21681fa0754c41ecE_ZN3std6thread9yield_now17hb3d47db77661351eE_ZN3std6thread8sleep_ms17h2c0e9aa662315c8bEsleep_ms_ZN3std6thread15park_timeout_ms17h28d131bca1100078Epark_timeout_ms_ZN3std6thread8ThreadId6as_u6417h711a687e60968898Eas_u64_ZN3std6thread6Thread3new17h97218b268a75acc2E_ZN56_$LT$std..thread..Thread$u20$as$u20$core..fmt..Debug$GT$3fmt17h6b9204e6d718e262E_ZN62_$LT$std..backtrace..Backtrace$u20$as$u20$core..fmt..Debug$GT$3fmt17hbcef49c5bf3f0230E_ZN67_$LT$std..backtrace..BacktraceFrame$u20$as$u20$core..fmt..Debug$GT$3fmt17hbdc65991b5001dcaE_ZN68_$LT$std..backtrace..BacktraceSymbol$u20$as$u20$core..fmt..Debug$GT$3fmt17hc8edb7eafafe2187E_ZN3std9backtrace9Backtrace7capture17h36e3b6d98803127fE_ZN3std9backtrace9Backtrace13force_capture17h7d484a22a859c5dfEforce_capture_ZN3std9backtrace9Backtrace8disabled17h04b53e5356059164Edisabled_ZN3std9backtrace9Backtrace6create17h528c5bb898051d4eE_ZN3std9backtrace9Backtrace6create28_$u7b$$u7b$closure$u7d$$u7d$17h404b103b67503452E_ZN3std9backtrace9Backtrace6status17h30f37ad27afaebd0E_ZN3std9backtrace9Backtrace6frames17hefa5560264c90020Eframes_ZN64_$LT$std..backtrace..Backtrace$u20$as$u20$core..fmt..Display$GT$3fmt17hf4b691d2776bda76E_ZN3std9backtrace7Capture7resolve28_$u7b$$u7b$closure$u7d$$u7d$17h6b1147b4a404bdfbE_ZN85_$LT$std..collections..hash..map..DefaultHasher$u20$as$u20$core..default..Default$GT$7default17h70353decd493ad84E_ZN77_$LT$std..collections..hash..map..RandomState$u20$as$u20$core..fmt..Debug$GT$3fmt17he1935f8c01d5fed5E_ZN3std3env11current_dir17h9f7823af05474328E_ZN3std3env4vars17h226152376b581df1Evars_ZN3std3env7vars_os17h14ed2014587d02c1Evars_os_ZN73_$LT$std..env..Vars$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h546c65ecc2a297ccE_ZN73_$LT$std..env..Vars$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17hb21ae2af1bea3d66E_ZN51_$LT$std..env..Vars$u20$as$u20$core..fmt..Debug$GT$3fmt17h5960f7e58a1c3eb5E_ZN53_$LT$std..env..VarsOs$u20$as$u20$core..fmt..Debug$GT$3fmt17h9b635154eb1acd19E_ZN3std3env7_var_os17he11885e7d22e8239E_ZN57_$LT$std..env..VarError$u20$as$u20$core..fmt..Display$GT$3fmt17h90e77e647257f28bE_ZN56_$LT$std..env..VarError$u20$as$u20$std..error..Error$GT$11description17hc1dc5f0e9899ef6aE_ZN3std3env8_set_var17h4069a09d9b75f49eE_ZN3std3env8_set_var28_$u7b$$u7b$closure$u7d$$u7d$17h097533c9c1d28775E_ZN3std3env11_remove_var17h0d560e3968d30c1aE_ZN3std3env11_remove_var28_$u7b$$u7b$closure$u7d$$u7d$17h082de84040b69c6fE_ZN79_$LT$std..env..SplitPaths$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hef3d9573ab141362E_ZN79_$LT$std..env..SplitPaths$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17ha24a0296c807eb4fE_ZN57_$LT$std..env..SplitPaths$u20$as$u20$core..fmt..Debug$GT$3fmt17h5593dae13f4d9a80E_ZN63_$LT$std..env..JoinPathsError$u20$as$u20$core..fmt..Display$GT$3fmt17hed2a1c047cae3491E_ZN62_$LT$std..env..JoinPathsError$u20$as$u20$std..error..Error$GT$11description17h0a770a9a85c44621E_ZN3std3env8home_dir17h953b98e3518aa3bcE_ZN3std3env8temp_dir17hb3cee03cbe0d65f8E_ZN3std3env11current_exe17h0d2e2f1e48115b61E_ZN3std3env4args17hb6f75b6383b8dc28E_ZN3std3env7args_os17h8fb7be242f1327afEargs_os_ZN73_$LT$std..env..Args$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h67a9af805384bc3aE_ZN73_$LT$std..env..Args$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17hffa9c3af01fbb9adE_ZN84_$LT$std..env..Args$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17h20d96eb8be8d25e3E_ZN84_$LT$std..env..Args$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$8is_empty17hf65294bdafca4379E_ZN88_$LT$std..env..Args$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17ha7871bca7209cf83E_ZN51_$LT$std..env..Args$u20$as$u20$core..fmt..Debug$GT$3fmt17hdff0f9ea7ee8c239E_ZN53_$LT$std..env..ArgsOs$u20$as$u20$core..fmt..Debug$GT$3fmt17h6156b945a37a279dE_ZN3std5error5Error7type_id17h3b40dc6bae273ab9Etype_id_ZN3std5error5Error7type_id17h9b385ced4ab6d746Etype_id_ZN3std5error5Error7type_id17ha7eea03b1c7ab49eEtype_id_ZN3std5error5Error9backtrace17h4f0621130602a64fEbacktrace_ZN3std5error5Error9backtrace17hbc3c5f7a7224bbb5Ebacktrace_ZN3std5error5Error9backtrace17hc889ab244ddb8b92Ebacktrace_ZN3std5error5Error5cause17h318da2e8b31dda95Ecause_ZN3std5error5Error5cause17h3270a519d7d92d15Ecause_ZN3std5error5Error5cause17h3db827cf685e2ff0Ecause_ZN243_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$std..error..Error$GT$11description17h37c89e65a78a02d5E_ZN244_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Display$GT$3fmt17h681b64d63d194660E_ZN242_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Debug$GT$3fmt17h65c0afef8dbe4a9bE_ZN3std5error115_$LT$impl$u20$core..convert..From$LT$$RF$str$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$GT$$GT$4from17h46caba6382438a3bE_ZN3std5error137_$LT$impl$u20$core..convert..From$LT$alloc..borrow..Cow$LT$str$GT$$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$GT$$GT$4from17hd116d690f1cfda93E_ZN70_$LT$core..str..error..ParseBoolError$u20$as$u20$std..error..Error$GT$11description17hd83aff89dafd93cbE_ZN65_$LT$core..str..error..Utf8Error$u20$as$u20$std..error..Error$GT$11description17h9ba583d83bfb9f04E_ZN69_$LT$core..num..error..ParseIntError$u20$as$u20$std..error..Error$GT$11description17hd24bd3748da9da73E_ZN71_$LT$core..num..error..TryFromIntError$u20$as$u20$std..error..Error$GT$11description17ha0521a6db1d88033E_ZN68_$LT$core..array..TryFromSliceError$u20$as$u20$std..error..Error$GT$11description17hc1968dcdd1e58392E_ZN73_$LT$core..num..dec2flt..ParseFloatError$u20$as$u20$std..error..Error$GT$11description17h54452b504507f29cE_ZN66_$LT$alloc..string..FromUtf8Error$u20$as$u20$std..error..Error$GT$11description17h3725609d6bc983d1E_ZN67_$LT$alloc..string..FromUtf16Error$u20$as$u20$std..error..Error$GT$11description17he801ee711028fe5dE_ZN63_$LT$core..convert..Infallible$u20$as$u20$std..error..Error$GT$11description17h2b8a0607e0ca7086E_ZN74_$LT$core..char..decode..DecodeUtf16Error$u20$as$u20$std..error..Error$GT$11description17hfd5a3f270f1ab2c9E_ZN54_$LT$core..fmt..Error$u20$as$u20$std..error..Error$GT$11description17hfef435c1c30733b0E_ZN61_$LT$core..cell..BorrowError$u20$as$u20$std..error..Error$GT$11description17h5e57c8bea9d5abf5E_ZN64_$LT$core..cell..BorrowMutError$u20$as$u20$std..error..Error$GT$11description17h174fc6e4f1399bfcE_ZN75_$LT$core..char..convert..CharTryFromError$u20$as$u20$std..error..Error$GT$11description17haf0c3f64529fce41E_ZN73_$LT$core..char..convert..ParseCharError$u20$as$u20$std..error..Error$GT$11description17h120db9b5f07f07ecE_ZN76_$LT$std..error..Chain$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h3415ac111b62368dE_ZN3std3ffi5c_str19FromVecWithNulError8as_bytes17h602ffb5b7bc9a1ccE_ZN3std3ffi5c_str19FromVecWithNulError10into_bytes17h001150ea25b13a0fE_ZN79_$LT$$RF$$u5b$u8$u5d$$u20$as$u20$std..ffi..c_str..CString..new..SpecIntoVec$GT$8into_vec17h00ba4d7a1aaa7d49E_ZN3std3ffi5c_str7CString18from_vec_unchecked17h7ac4fa6ef273471aEfrom_vec_unchecked_ZN3std3ffi5c_str7CString8from_raw17h64064d5487531576Efrom_raw_ZN3std3ffi5c_str7CString11into_string17heb9bfb16a7945b42E_ZN3std3ffi5c_str7CString19into_bytes_with_nul17h201c174148105265Einto_bytes_with_nul_ZN3std3ffi5c_str7CString16into_boxed_c_str17h47edd4971465a6ceEinto_boxed_c_str_ZN3std3ffi5c_str7CString10into_inner17h526ab69a51777950E_ZN3std3ffi5c_str7CString17from_vec_with_nul17h334f82ce219a73d6Efrom_vec_with_nul_ZN58_$LT$std..ffi..c_str..CStr$u20$as$u20$core..fmt..Debug$GT$3fmt17h1e25783ed0e3b776E_ZN68_$LT$$RF$std..ffi..c_str..CStr$u20$as$u20$core..default..Default$GT$7default17hc0213a54dd2a5362E_ZN67_$LT$std..ffi..c_str..CString$u20$as$u20$core..default..Default$GT$7default17hed96a586862906cfE_ZN3std3ffi5c_str129_$LT$impl$u20$core..convert..From$LT$$RF$std..ffi..c_str..CStr$GT$$u20$for$u20$alloc..boxed..Box$LT$std..ffi..c_str..CStr$GT$$GT$4from17hfdb7939f5003a3f0E_ZN3std3ffi5c_str99_$LT$impl$u20$core..default..Default$u20$for$u20$alloc..boxed..Box$LT$std..ffi..c_str..CStr$GT$$GT$7default17h9925d84942eaa110E_ZN3std3ffi5c_str8NulError12nul_position17hc0c7e27b3cefe5dbEnul_position_ZN3std3ffi5c_str8NulError8into_vec17h65a33e913378752eE_ZN63_$LT$std..ffi..c_str..NulError$u20$as$u20$std..error..Error$GT$11description17he9622331b83fc458E_ZN64_$LT$std..ffi..c_str..NulError$u20$as$u20$core..fmt..Display$GT$3fmt17h79aa5b3e847a4d27E_ZN3std3ffi5c_str104_$LT$impl$u20$core..convert..From$LT$std..ffi..c_str..NulError$GT$$u20$for$u20$std..io..error..Error$GT$4from17h06d65e9b6fc0adb3E_ZN77_$LT$std..ffi..c_str..FromBytesWithNulError$u20$as$u20$core..fmt..Display$GT$3fmt17ha295fc023eb952a3E_ZN75_$LT$std..ffi..c_str..FromVecWithNulError$u20$as$u20$core..fmt..Display$GT$3fmt17hf800ee01c47794d5E_ZN3std3ffi5c_str15IntoStringError12into_cstring17h23c9c4871aa0eb2bEinto_cstring_ZN3std3ffi5c_str15IntoStringError10utf8_error17hfb7367f03b14233fEutf8_error_ZN70_$LT$std..ffi..c_str..IntoStringError$u20$as$u20$std..error..Error$GT$11description17h0b660f47b1dbec6aE_ZN70_$LT$std..ffi..c_str..IntoStringError$u20$as$u20$std..error..Error$GT$6source17h4c52e6fb24545c5aE_ZN71_$LT$std..ffi..c_str..IntoStringError$u20$as$u20$core..fmt..Display$GT$3fmt17h6046221dfa254858E_ZN3std3ffi5c_str4CStr15to_string_lossy17he9338716be4dce94Eto_string_lossy_ZN3std3ffi5c_str4CStr13into_c_string17hef9c8ba30a671750Einto_c_string_ZN62_$LT$std..ffi..c_str..CStr$u20$as$u20$core..cmp..PartialEq$GT$2eq17h3ab7149fcbcddc97E_ZN56_$LT$std..ffi..c_str..CStr$u20$as$u20$core..cmp..Ord$GT$3cmp17he7da08c8e09a0b27E_ZN64_$LT$std..ffi..c_str..CStr$u20$as$u20$alloc..borrow..ToOwned$GT$10clone_into17h659a5207beab7e49Eclone_into_ZN97_$LT$std..ffi..c_str..CString$u20$as$u20$core..convert..From$LT$$RF$std..ffi..c_str..CStr$GT$$GT$4from17hf3dd2ee2bdab424bE_ZN113_$LT$std..ffi..c_str..CStr$u20$as$u20$core..ops..index..Index$LT$core..ops..range..RangeFrom$LT$usize$GT$$GT$$GT$5index17he105876304ea1e41E_ZN3std3ffi6os_str8OsString17into_boxed_os_str17h343a9366a303a936Einto_boxed_os_str_ZN3std3ffi6os_str5OsStr14into_os_string17h23d6798adffefad7Einto_os_string_ZN3std3ffi6os_str5OsStr18to_ascii_lowercase17hae5c0898beddcf58E_ZN3std3ffi6os_str5OsStr18to_ascii_uppercase17h3bf3ddc93a861553E_ZN3std2fs19initial_buffer_size17hbcbc656ad4b8ea13Einitial_buffer_size_ZN3std2fs4read5inner17h6d9d60279c59fcc8E_ZN3std2fs14read_to_string5inner17h0d23761ea3f2addeE_ZN3std2fs5write5inner17h4661bb26445f604aE_ZN3std2fs4File8sync_all17h2fcf6839a05d8281Esync_all_ZN3std2fs4File9sync_data17h060c0a65899be4f5Esync_data_ZN3std2fs4File7set_len17h83289448607a1b54Eset_len_ZN3std2fs4File9try_clone17h29ceb003e3800f32Etry_clone_ZN50_$LT$std..fs..File$u20$as$u20$core..fmt..Debug$GT$3fmt17hb9746fb22388fbd8E_ZN47_$LT$std..fs..File$u20$as$u20$std..io..Read$GT$13read_vectored17haf645ebd4db4620fE_ZN48_$LT$std..fs..File$u20$as$u20$std..io..Write$GT$14write_vectored17h696319f01685dd00E_ZN48_$LT$std..fs..File$u20$as$u20$std..io..Write$GT$5flush17h8093dfeeb71b11daE_ZN47_$LT$std..fs..File$u20$as$u20$std..io..Seek$GT$4seek17h68e21308d60bda0aE_ZN51_$LT$$RF$std..fs..File$u20$as$u20$std..io..Read$GT$4read17h23e518803b7a81a1E_ZN51_$LT$$RF$std..fs..File$u20$as$u20$std..io..Read$GT$13read_vectored17hddbf09cdca1d1717E_ZN52_$LT$$RF$std..fs..File$u20$as$u20$std..io..Write$GT$5write17hd22a19de33d0f3d2E_ZN52_$LT$$RF$std..fs..File$u20$as$u20$std..io..Write$GT$14write_vectored17h4fbf6d37f9b22daeE_ZN52_$LT$$RF$std..fs..File$u20$as$u20$std..io..Write$GT$5flush17he225300815850843E_ZN51_$LT$$RF$std..fs..File$u20$as$u20$std..io..Seek$GT$4seek17hc2e21c889dac9dd3E_ZN3std2fs11OpenOptions3new17hbb3cf836db3935afE_ZN3std2fs11OpenOptions4read17hdff4b76d1178f7b4E_ZN3std2fs11OpenOptions5write17h5e83854b1bdc97f3E_ZN3std2fs11OpenOptions6append17h1fbbea089b4bf3d2E_ZN3std2fs11OpenOptions8truncate17h3514754c7db70e58E_ZN3std2fs11OpenOptions6create17h11978c89878f9feeE_ZN3std2fs11OpenOptions10create_new17h3421345e5d705789E_ZN3std2fs11OpenOptions5_open17h39f12ab0f763a312E_open_ZN107_$LT$std..fs..OpenOptions$u20$as$u20$std..sys_common..AsInnerMut$LT$std..sys..unix..fs..OpenOptions$GT$$GT$12as_inner_mut17h67f13a6940e1d7ddEas_inner_mut_ZN3std2fs8Metadata3len17h2d655c67c6e422d2E_ZN3std2fs8Metadata11permissions17h088daded7e7be245E_ZN3std2fs8Metadata7created17h475d540921dd4130E_ZN54_$LT$std..fs..Metadata$u20$as$u20$core..fmt..Debug$GT$3fmt17h5920c48949ce7d81E_ZN98_$LT$std..fs..Metadata$u20$as$u20$std..sys_common..AsInner$LT$std..sys..unix..fs..FileAttr$GT$$GT$8as_inner17h322d98832f0cf0eeEas_inner_ZN100_$LT$std..fs..Metadata$u20$as$u20$std..sys_common..FromInner$LT$std..sys..unix..fs..FileAttr$GT$$GT$10from_inner17heb9cfcbe27a9e5a2E_ZN3std2fs11Permissions8readonly17h2a7a5b3f0194c958E_ZN3std2fs11Permissions12set_readonly17h63fd0035f3aac7deE_ZN3std2fs8DirEntry8metadata17h01657b9ff69ae887E_ZN3std2fs8DirEntry9file_type17h51cf3c3a5357c6c2E_ZN3std2fs8DirEntry9file_name17h6197854eee9728c5E_ZN54_$LT$std..fs..DirEntry$u20$as$u20$core..fmt..Debug$GT$3fmt17h8eef82ba79db9df4E_ZN98_$LT$std..fs..DirEntry$u20$as$u20$std..sys_common..AsInner$LT$std..sys..unix..fs..DirEntry$GT$$GT$8as_inner17h07d95427ef43c2aaE_ZN3std2fs10DirBuilder3new17h6485fd12701df2b2E_ZN3std2fs10DirBuilder9recursive17h80776433f9d2a99eE_ZN3std2fs10DirBuilder7_create17h2878f502b7245852E_ZN3std2fs10DirBuilder14create_dir_all17h65f805b3d82409ccEcreate_dir_all_ZN105_$LT$std..fs..DirBuilder$u20$as$u20$std..sys_common..AsInnerMut$LT$std..sys..unix..fs..DirBuilder$GT$$GT$12as_inner_mut17h36cf27d2c6bf8c88E_ZN82_$LT$std..io..buffered..bufreader..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$4read17h72929aefb4d63162Eread_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$9flush_buf17h7a9ea302f83154f0Eflush_buf_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$9flush_buf8BufGuard3new17h59a681b46246db16E_ZN82_$LT$std..io..buffered..bufwriter..WriterPanicked$u20$as$u20$std..error..Error$GT$11description17h525009d5a0b78141E_ZN83_$LT$std..io..buffered..bufwriter..WriterPanicked$u20$as$u20$core..fmt..Display$GT$3fmt17hb7218f04ff751cdaE_ZN81_$LT$std..io..buffered..bufwriter..WriterPanicked$u20$as$u20$core..fmt..Debug$GT$3fmt17h3c15c8a784a2743cE_ZN83_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$9write_all17h2aeae84ce6a15903E_ZN93_$LT$std..io..buffered..linewritershim..LineWriterShim$LT$W$GT$$u20$as$u20$std..io..Write$GT$14write_vectored17hb5ee4da75fce3f00E_ZN3std2io6cursor9vec_write17h07394b40d683f904Evec_write_ZN103_$LT$std..io..cursor..Cursor$LT$$RF$mut$u20$alloc..vec..Vec$LT$u8$GT$$GT$$u20$as$u20$std..io..Write$GT$5write17h93999cbe4b3a9342E_ZN103_$LT$std..io..cursor..Cursor$LT$$RF$mut$u20$alloc..vec..Vec$LT$u8$GT$$GT$$u20$as$u20$std..io..Write$GT$14write_vectored17hc31c8dcdc87d4d4bE_ZN91_$LT$std..io..cursor..Cursor$LT$alloc..vec..Vec$LT$u8$GT$$GT$$u20$as$u20$std..io..Write$GT$5write17h8aa81458266a9be3E_ZN91_$LT$std..io..cursor..Cursor$LT$alloc..vec..Vec$LT$u8$GT$$GT$$u20$as$u20$std..io..Write$GT$14write_vectored17h94f7f4550bda1603E_ZN3std2io5error5Error7get_ref17h1ea6dc35ea58b7dcEget_ref_ZN3std2io5error5Error7get_mut17hb2c0191819be0f01Eget_mut_ZN3std2io5error5Error10into_inner17h74b0c7906c598435E_ZN57_$LT$std..io..error..Repr$u20$as$u20$core..fmt..Debug$GT$3fmt17hca84ffc0fc9659d6E_ZN60_$LT$std..io..error..Error$u20$as$u20$core..fmt..Display$GT$3fmt17h67041947ec7bdd97E_ZN59_$LT$std..io..error..Error$u20$as$u20$std..error..Error$GT$11description17h56053545da085d14E_ZN59_$LT$std..io..error..Error$u20$as$u20$std..error..Error$GT$5cause17hb72c14f91316423aEcause_ZN59_$LT$std..io..error..Error$u20$as$u20$std..error..Error$GT$6source17hf48d0c5488bff866E_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$5write17h6d70cce501879c18E_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$14write_vectored17hb1ed7c26a870f998E_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$17is_write_vectored17h5fa7f0aece573d92Eis_write_vectored_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$5flush17h21b755290a8d9a8eE_ZN58_$LT$std..io..stdio..StdinRaw$u20$as$u20$std..io..Read$GT$11read_to_end17h0c6fef114864fa72E_ZN58_$LT$std..io..stdio..StdinRaw$u20$as$u20$std..io..Read$GT$14read_to_string17h963bfa4ec908e6a4E_ZN60_$LT$std..io..stdio..StdoutRaw$u20$as$u20$std..io..Write$GT$9write_all17hde0ccb3dab7a1b0cE_ZN60_$LT$std..io..stdio..StdoutRaw$u20$as$u20$std..io..Write$GT$18write_all_vectored17hcf09c82f80406dd6E_ZN60_$LT$std..io..stdio..StdoutRaw$u20$as$u20$std..io..Write$GT$9write_fmt17h87591188ab8ac40bE_ZN60_$LT$std..io..stdio..StderrRaw$u20$as$u20$std..io..Write$GT$5flush17h4b9dda0679afda2aE_ZN60_$LT$std..io..stdio..StderrRaw$u20$as$u20$std..io..Write$GT$9write_all17hd73fa32553f15141E_ZN60_$LT$std..io..stdio..StderrRaw$u20$as$u20$std..io..Write$GT$18write_all_vectored17hb05593ddf20e0cedE_ZN60_$LT$std..io..stdio..StderrRaw$u20$as$u20$std..io..Write$GT$9write_fmt17h9c92512f423fc569E_ZN3std2io5stdio5stdin17h3bc9a5355edf1badE_ZN3std2io5stdio5Stdin9read_line17hafa8ebea25c307acE_ZN58_$LT$std..io..stdio..Stdin$u20$as$u20$core..fmt..Debug$GT$3fmt17hebb748000509c149E_ZN55_$LT$std..io..stdio..Stdin$u20$as$u20$std..io..Read$GT$4read17hdff58fc9a78c37d1E_ZN55_$LT$std..io..stdio..Stdin$u20$as$u20$std..io..Read$GT$13read_vectored17hcaf9edc287121f01E_ZN55_$LT$std..io..stdio..Stdin$u20$as$u20$std..io..Read$GT$11read_to_end17ha6c53a2c7e53c71fE_ZN55_$LT$std..io..stdio..Stdin$u20$as$u20$std..io..Read$GT$14read_to_string17hb6754e06f1179b2aE_ZN55_$LT$std..io..stdio..Stdin$u20$as$u20$std..io..Read$GT$10read_exact17h269c33d496040111Eread_exact_ZN3std2io5stdio9StdinLock10as_mut_buf17h2e2fd4fcb8a6c48fEas_mut_buf_ZN59_$LT$std..io..stdio..StdinLock$u20$as$u20$std..io..Read$GT$13read_vectored17hdd59916a3e1456c8E_ZN59_$LT$std..io..stdio..StdinLock$u20$as$u20$std..io..Read$GT$14read_to_string17had387f8d0167744cE_ZN59_$LT$std..io..stdio..StdinLock$u20$as$u20$std..io..Read$GT$10read_exact17hbed06a38dcf98d20E_ZN62_$LT$std..io..stdio..StdinLock$u20$as$u20$std..io..BufRead$GT$8fill_buf17h96f6d286843babc9Efill_buf_ZN62_$LT$std..io..stdio..StdinLock$u20$as$u20$std..io..BufRead$GT$7consume17h6a1aa197f38944c1E_ZN62_$LT$std..io..stdio..StdinLock$u20$as$u20$std..io..BufRead$GT$10read_until17h9b5c0267d45a856dEread_until_ZN62_$LT$std..io..stdio..StdinLock$u20$as$u20$std..io..BufRead$GT$9read_line17hbc9a443ef8686066E_ZN62_$LT$std..io..stdio..StdinLock$u20$as$u20$core..fmt..Debug$GT$3fmt17hc21538ce365a3a51E_ZN59_$LT$std..io..stdio..Stdout$u20$as$u20$core..fmt..Debug$GT$3fmt17hede93de2f421f3ceE_ZN57_$LT$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$5write17h236c849794987310E_ZN57_$LT$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$14write_vectored17h39d4cfa250ac2828E_ZN57_$LT$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$5flush17hed38657f15ad2d4fE_ZN57_$LT$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$9write_all17h7a66998d8c50cd7eE_ZN57_$LT$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$18write_all_vectored17he8ba60b7d9ee455cE_ZN61_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$5flush17hfb702ac12d97fea7E_ZN61_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$9write_fmt17h46cdbb05ad893dabE_ZN61_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$5write17he47adb7dbc4416c3E_ZN61_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$9write_all17h1823251172a52664E_ZN61_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$18write_all_vectored17h96a3f43c44e6a81cE_ZN63_$LT$std..io..stdio..StdoutLock$u20$as$u20$core..fmt..Debug$GT$3fmt17h03a4b38f844c5951E_ZN59_$LT$std..io..stdio..Stderr$u20$as$u20$core..fmt..Debug$GT$3fmt17ha3cc8f4fb74253e8E_ZN57_$LT$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$5write17hde53cec5bfc13642E_ZN57_$LT$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$14write_vectored17h498c91bda740583fE_ZN57_$LT$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$5flush17h1ea0a19e379bb060E_ZN57_$LT$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$9write_all17hbdce4c200e228a2fE_ZN57_$LT$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$18write_all_vectored17hb36b25ae70ce0a67E_ZN61_$LT$$RF$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$5write17hb52ef0bfa52e8b98E_ZN61_$LT$$RF$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$14write_vectored17h4564b83a1b7b6c4aE_ZN61_$LT$$RF$std..io..stdio..Stderr$u20$as$u20$std..io..Write$GT$9write_fmt17he00e58989d7c9533E_ZN63_$LT$std..io..stdio..StderrLock$u20$as$u20$core..fmt..Debug$GT$3fmt17ha7b0316acbf0ad72E_ZN3std2io5stdio6_print17hfdac4ecf8a146755E_ZN3std2io5stdio7_eprint17h315f42c2d3a9ee92E_eprint_ZN54_$LT$std..io..util..Empty$u20$as$u20$std..io..Seek$GT$4seek17hb4ca9c92821ecbffE_ZN54_$LT$std..io..util..Empty$u20$as$u20$std..io..Seek$GT$10stream_len17h955ed7385d57cb32Estream_len_ZN57_$LT$std..io..util..Empty$u20$as$u20$core..fmt..Debug$GT$3fmt17h3970d847bd9755f7E_ZN3std2io4util6repeat17hff6618e00d1b4229E_ZN58_$LT$std..io..util..Repeat$u20$as$u20$core..fmt..Debug$GT$3fmt17h35cf6e31fb5e9114E_ZN3std2io4util4sink17he1b92abf6e7ec126Esink_ZN56_$LT$std..io..util..Sink$u20$as$u20$core..fmt..Debug$GT$3fmt17h74d6cb840f7fa02bE_ZN3std2io11read_to_end17h863386164d150965E_ZN3std2io11read_to_end17hb0df9b2a4245cedcE_ZN3std2io11read_to_end17hde4a048e09818391E_ZN53_$LT$std..io..IoSlice$u20$as$u20$core..fmt..Debug$GT$3fmt17hbbe8b8a894e3932bE_ZN3std2io5Write9write_all17h6b1afc2ae6418884Ewrite_all_ZN3std2io5Write9write_all17hbe23447440e678b4Ewrite_all_ZN3std2io5Write9write_all17hc3d59f1f2d983257Ewrite_all_ZN3std2io5Write18write_all_vectored17h0776598a56c1f1efEwrite_all_vectored_ZN3std2io5Write18write_all_vectored17hea37cbfe2109cf12Ewrite_all_vectored>_ZN3std2io5Write9write_fmt17h61989113371c2355Ewrite_fmt>_ZN3std2io5Write9write_fmt17h6d40f996e84584d9Ewrite_fmt_ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17h3b48e300e431787cEwrite_str<&mut [u8]>_ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17h4ae3aba6a95a83ceEwrite_str_ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17h6f73f79a70570bc1Ewrite_str_ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17he2bea8ca4e6d810cEwrite_str_ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17hefe52687a9099c8bEwrite_str_ZN3std2io10read_until17h1a050ef6da614a36E_ZN3std3net4addr10SocketAddr2ip17h6f26d84a07ff512dE_ZN3std3net4addr10SocketAddr6set_ip17h1bc08903386cbfeeE_ZN3std3net4addr10SocketAddr7is_ipv417he76f646963653177Eis_ipv4_ZN3std3net4addr10SocketAddr7is_ipv617h0c36c70468cf7771Eis_ipv6_ZN3std3net4addr12SocketAddrV48set_port17h07341bbdb6d2af77E_ZN3std3net4addr12SocketAddrV68set_port17h17ef8b930f020cdaE_ZN3std3net4addr12SocketAddrV68flowinfo17he9a02b04c3985317E_ZN3std3net4addr12SocketAddrV612set_flowinfo17hf9871c51becd9c36Eset_flowinfo_ZN3std3net4addr12SocketAddrV612set_scope_id17h152b11fd1fe44ac8Eset_scope_id_ZN119_$LT$std..net..addr..SocketAddrV6$u20$as$u20$std..sys_common..FromInner$LT$libc..unix..linux_like..sockaddr_in6$GT$$GT$10from_inner17h8455ce10e5d02925E_ZN102_$LT$std..net..addr..SocketAddr$u20$as$u20$core..convert..From$LT$std..net..addr..SocketAddrV4$GT$$GT$4from17h4dc4b253d1aa72f6E_ZN102_$LT$std..net..addr..SocketAddr$u20$as$u20$core..convert..From$LT$std..net..addr..SocketAddrV6$GT$$GT$4from17h65341a9467d4b302E_ZN63_$LT$std..net..addr..SocketAddr$u20$as$u20$core..fmt..Debug$GT$3fmt17h39affcddfb0906a4E_ZN67_$LT$std..net..addr..SocketAddrV4$u20$as$u20$core..fmt..Display$GT$3fmt17hed29f7225c66011bE_ZN65_$LT$std..net..addr..SocketAddrV4$u20$as$u20$core..fmt..Debug$GT$3fmt17hbe7a71c3e99339f0E_ZN67_$LT$std..net..addr..SocketAddrV6$u20$as$u20$core..fmt..Display$GT$3fmt17h3d9eb683401b4aa3E_ZN65_$LT$std..net..addr..SocketAddrV6$u20$as$u20$core..fmt..Debug$GT$3fmt17h2f3c6c952f0afc85E_ZN67_$LT$std..net..addr..SocketAddrV4$u20$as$u20$core..clone..Clone$GT$5clone17h83f41dd9cae37c6aE_ZN67_$LT$std..net..addr..SocketAddrV6$u20$as$u20$core..clone..Clone$GT$5clone17h0f8884a2c0ba3965E_ZN69_$LT$std..net..addr..SocketAddrV4$u20$as$u20$core..cmp..PartialEq$GT$2eq17hb26a720bbcc8c63aE_ZN69_$LT$std..net..addr..SocketAddrV6$u20$as$u20$core..cmp..PartialEq$GT$2eq17hf19e8abe20efd787E_ZN70_$LT$std..net..addr..SocketAddrV6$u20$as$u20$core..cmp..PartialOrd$GT$11partial_cmp17h6acd658d803a818bE_ZN63_$LT$std..net..addr..SocketAddrV4$u20$as$u20$core..cmp..Ord$GT$3cmp17he3ee4cdf6f87d31fE_ZN63_$LT$std..net..addr..SocketAddrV6$u20$as$u20$core..cmp..Ord$GT$3cmp17he214bf2352788705E_ZN84_$LT$$LP$std..net..ip..IpAddr$C$u16$RP$$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17h0197a346f6415283E_ZN3std3net4addr19resolve_socket_addr17hac823f7b50844630E_ZN71_$LT$$LP$$RF$str$C$u16$RP$$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17h2ff747fc5aa08e1bE_ZN85_$LT$$LP$alloc..string..String$C$u16$RP$$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17h958e62c502d6cad0E_ZN53_$LT$str$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17h05caf9acd18ce57fE_ZN90_$LT$$RF$$u5b$std..net..addr..SocketAddr$u5d$$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17h390de531f94b0156E_ZN71_$LT$alloc..string..String$u20$as$u20$std..net..addr..ToSocketAddrs$GT$15to_socket_addrs17h21d945bc169a097bE_ZN57_$LT$std..net..ip..IpAddr$u20$as$u20$core..fmt..Debug$GT$3fmt17h68f09b05ebc32058E_ZN61_$LT$std..net..ip..Ipv4Addr$u20$as$u20$core..fmt..Display$GT$3fmt17hfbad096d05d7e259E_ZN59_$LT$std..net..ip..Ipv4Addr$u20$as$u20$core..fmt..Debug$GT$3fmt17h9f464bb3fcae962dE_ZN61_$LT$std..net..ip..Ipv6Addr$u20$as$u20$core..fmt..Display$GT$3fmt17hed6aa2939da7e837E_ZN59_$LT$std..net..ip..Ipv6Addr$u20$as$u20$core..fmt..Debug$GT$3fmt17h296f6df1ec16b182E_ZN102_$LT$std..net..ip..Ipv6Addr$u20$as$u20$std..sys_common..AsInner$LT$libc..unix..align..in6_addr$GT$$GT$8as_inner17haa3228513853ccd9E_ZN104_$LT$std..net..ip..Ipv6Addr$u20$as$u20$std..sys_common..FromInner$LT$libc..unix..align..in6_addr$GT$$GT$10from_inner17h2dd1a0184b9b6cb5E_ZN3std3net6parser6Parser14read_ipv4_addr17h64c41815f39880bdE_ZN3std3net6parser6Parser14read_ipv6_addr17h7d01bb91b328950bE_ZN3std3net6parser6Parser14read_ipv6_addr11read_groups17h9ca1f1634c5c2a7aE_ZN3std3net6parser6Parser19read_socket_addr_v417h3fd75d5d8731988bE_ZN3std3net6parser6Parser19read_socket_addr_v617h668ab17970ec6199E_ZN3std3net6parser77_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..ip..IpAddr$GT$8from_str17hcebda55c18b0887fE_ZN3std3net6parser85_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..addr..SocketAddrV4$GT$8from_str17h4c02030285ab58e4E_ZN3std3net6parser85_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$std..net..addr..SocketAddrV6$GT$8from_str17hd4f6de36161e7f53E_ZN71_$LT$std..net..parser..AddrParseError$u20$as$u20$core..fmt..Display$GT$3fmt17h49d342375511342aE_ZN70_$LT$std..net..parser..AddrParseError$u20$as$u20$std..error..Error$GT$11description17hc3fc171dfe562c30E_ZN3std3net3tcp9TcpStream15connect_timeout17hf573bc89597c2010E_ZN3std3net3tcp9TcpStream9peer_addr17h43123c9664845722E_ZN3std3net3tcp9TcpStream8shutdown17h623428f7272bde03E_ZN3std3net3tcp9TcpStream16set_read_timeout17h60c98d4e5d4dd34aE_ZN3std3net3tcp9TcpStream17set_write_timeout17hfe4c30559c34a7e7E_ZN3std3net3tcp9TcpStream12read_timeout17haac109d3c1c39137E_ZN3std3net3tcp9TcpStream13write_timeout17hd3ae1eef3c218d08E_ZN3std3net3tcp9TcpStream4peek17h46c02deec12b346dE_ZN3std3net3tcp9TcpStream11set_nodelay17hff2d1b072036e5c9E_ZN3std3net3tcp9TcpStream7nodelay17h61a705acd9a33666E_ZN58_$LT$std..net..tcp..TcpStream$u20$as$u20$std..io..Read$GT$4read17h91c1301ed500e5c4E_ZN59_$LT$std..net..tcp..TcpStream$u20$as$u20$std..io..Write$GT$5write17h5efadc4f7c47c67fE_ZN62_$LT$$RF$std..net..tcp..TcpStream$u20$as$u20$std..io..Read$GT$4read17h6faa2387041c932eE_ZN63_$LT$$RF$std..net..tcp..TcpStream$u20$as$u20$std..io..Write$GT$5write17h9289b24e31ddfeaeE_ZN61_$LT$std..net..tcp..TcpStream$u20$as$u20$core..fmt..Debug$GT$3fmt17h689cd7cc46825233E_ZN3std3net3tcp11TcpListener10local_addr17he97752426b9f8e04E_ZN3std3net3tcp11TcpListener6accept17hcee5eaa7f06b8d37E_ZN3std3net3tcp11TcpListener7set_ttl17hab10fc352c984620E_ZN3std3net3tcp11TcpListener3ttl17hd2be5a1459ca5c2fE_ZN3std3net3tcp11TcpListener11set_only_v617ha5d8f8ab95914964E_ZN3std3net3tcp11TcpListener7only_v617hcb07dc87e07fe23bE_ZN3std3net3tcp11TcpListener10take_error17h7638516152d223c6E_ZN3std3net3tcp11TcpListener15set_nonblocking17h0aa6117c8023d7bfE_ZN82_$LT$std..net..tcp..Incoming$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h5aa8e45511021899E_ZN3std3net3udp9UdpSocket9recv_from17hddc8d62fc4ca21b3E_ZN3std3net3udp9UdpSocket9peek_from17h36395f0f4001a6b6E_ZN3std3net3udp9UdpSocket13set_broadcast17h132a9534df2dae4bE_ZN3std3net3udp9UdpSocket9broadcast17h4d21b18f3ffb8e01E_ZN3std3net3udp9UdpSocket21set_multicast_loop_v417hcadef39dde7f254cE_ZN3std3net3udp9UdpSocket17multicast_loop_v417h4003ddbbc2757c0dE_ZN3std3net3udp9UdpSocket20set_multicast_ttl_v417h52d3a688673537d0E_ZN3std3net3udp9UdpSocket16multicast_ttl_v417hb93d265416858b47E_ZN3std3net3udp9UdpSocket21set_multicast_loop_v617h2bb58f99befa5447E_ZN3std3net3udp9UdpSocket17multicast_loop_v617h272cea07bd0bfc10E_ZN3std3net3udp9UdpSocket17join_multicast_v417h6c92cf54ba7236a8E_ZN3std3net3udp9UdpSocket17join_multicast_v617hf0a0be62a9f52143E_ZN3std3net3udp9UdpSocket18leave_multicast_v417h6c9b4f03a4a1a117E_ZN3std3net3udp9UdpSocket18leave_multicast_v617he442b42daf0e40f3E_ZN3std3net3udp9UdpSocket4send17h32da7e91d52f8c48E_ZN3std3net3udp9UdpSocket4recv17h92e4be9b31849bb0E_ZN61_$LT$std..net..udp..UdpSocket$u20$as$u20$core..fmt..Debug$GT$3fmt17h207e664a110403c8E_ZN3std5panic13resume_unwind17h6bbf7a171c157cd6Eresume_unwind_ZN3std4path12is_separator17h3e5a8a60ea0d7b50Eis_separator_ZN58_$LT$std..path..Components$u20$as$u20$core..fmt..Debug$GT$3fmt17h11ed462ca35774e2E_ZN112_$LT$$LT$std..path..Components$u20$as$u20$core..fmt..Debug$GT$..fmt..DebugHelper$u20$as$u20$core..fmt..Debug$GT$3fmt17hfbadd637b3ffa770E_ZN3std4path10Components7as_path17ha1e874e5540953baE_ZN3std4path10Components25parse_next_component_back17h44145634de3166d1E_ZN52_$LT$std..path..Iter$u20$as$u20$core..fmt..Debug$GT$3fmt17hfb82b46d2b98d3d3E_ZN106_$LT$$LT$std..path..Iter$u20$as$u20$core..fmt..Debug$GT$..fmt..DebugHelper$u20$as$u20$core..fmt..Debug$GT$3fmt17h7dbf60e80062d6d1E_ZN80_$LT$std..path..Components$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hdc733caef0652771E_ZN95_$LT$std..path..Components$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hda81826c39204925E_ZN3std4path7PathBuf5_push17h33536ffe36b4946dE_ZN3std4path7PathBuf14_set_file_name17h701c93daae711d33E_set_file_name_ZN3std4path7PathBuf14_set_extension17h904407bdcab90955E_set_extension_ZN3std4path117_$LT$impl$u20$core..convert..From$LT$$RF$std..path..Path$GT$$u20$for$u20$alloc..boxed..Box$LT$std..path..Path$GT$$GT$4from17hedcfafe69bc10538E_ZN55_$LT$std..path..PathBuf$u20$as$u20$core..fmt..Debug$GT$3fmt17h84390169bb400edeE_ZN3std4path4Path13_strip_prefix17hc8421e986cb33978E_ZN3std4path4Path12_starts_with17hdd3da8fda5734d42E_starts_with_ZN3std4path4Path10_ends_with17h795412b97a219d6fE_ends_with_ZN3std4path4Path9file_stem17h1a378f997f55a335E_ZN3std4path4Path9extension17hd645d9e92470d777E_ZN3std4path4Path15_with_file_name17hc118d854982531fdE_with_file_name_ZN3std4path4Path15_with_extension17h758502ab56d7d063E_with_extension_ZN3std4path4Path7is_file17h71008b23b9b7d87aE_ZN3std4path4Path6is_dir17ha7e03bc67811f7a6E_ZN55_$LT$std..path..Display$u20$as$u20$core..fmt..Debug$GT$3fmt17he4d67d8192391554E_ZN66_$LT$std..path..StripPrefixError$u20$as$u20$core..fmt..Display$GT$3fmt17h3cdc51f3d0acbc64E_ZN65_$LT$std..path..StripPrefixError$u20$as$u20$std..error..Error$GT$11description17h3700274c3951d07bE_ZN119_$LT$std..process..Child$u20$as$u20$std..sys_common..AsInner$LT$std..sys..unix..process..process_inner..Process$GT$$GT$8as_inner17h1f03903f9b0ad9e9E_ZN183_$LT$std..process..Child$u20$as$u20$std..sys_common..FromInner$LT$$LP$std..sys..unix..process..process_inner..Process$C$std..sys..unix..process..process_common..StdioPipes$RP$$GT$$GT$10from_inner17h914c4e502e102b1aE_ZN121_$LT$std..process..Child$u20$as$u20$std..sys_common..IntoInner$LT$std..sys..unix..process..process_inner..Process$GT$$GT$10into_inner17hbb4d437c0eef233fE_ZN56_$LT$std..process..Child$u20$as$u20$core..fmt..Debug$GT$3fmt17h78b1ed72195f0f97E_ZN59_$LT$std..process..ChildStdin$u20$as$u20$std..io..Write$GT$5write17he1cec2849ee26252E_ZN59_$LT$std..process..ChildStdin$u20$as$u20$std..io..Write$GT$14write_vectored17hc1530ca9b1881782E_ZN59_$LT$std..process..ChildStdin$u20$as$u20$std..io..Write$GT$17is_write_vectored17h49203ec84f048c2bE_ZN63_$LT$$RF$std..process..ChildStdin$u20$as$u20$std..io..Write$GT$17is_write_vectored17ha7a7c024b906e72dE_ZN107_$LT$std..process..ChildStdin$u20$as$u20$std..sys_common..AsInner$LT$std..sys..unix..pipe..AnonPipe$GT$$GT$8as_inner17had164b8c1c04db31E_ZN3std7process7Command9env_clear17h15f068dfde6b3b24Eenv_clear_ZN3std7process7Command5spawn17h971cad94c4019edaE_ZN3std7process7Command6output17h0a9f0d12d1b0c894E_ZN3std7process7Command6status17h1c36a0b4f4a5e0ebE_ZN3std7process7Command11get_program17h0eb6c5a680d42589E_ZN3std7process7Command8get_args17heff59de75640142aE_ZN3std7process7Command8get_envs17heac5bb258e2846e5E_ZN3std7process7Command15get_current_dir17hb4779ff5db31ec44E_ZN58_$LT$std..process..Command$u20$as$u20$core..fmt..Debug$GT$3fmt17h3a00e43fd5c6a7bcE_ZN122_$LT$std..process..Command$u20$as$u20$std..sys_common..AsInner$LT$std..sys..unix..process..process_common..Command$GT$$GT$8as_inner17hd44f08fd5b0000b7E_ZN125_$LT$std..process..Command$u20$as$u20$std..sys_common..AsInnerMut$LT$std..sys..unix..process..process_common..Command$GT$$GT$12as_inner_mut17hf2884692228da3b0E_ZN57_$LT$std..process..Output$u20$as$u20$core..fmt..Debug$GT$3fmt17h0b2747477a68cd20E_ZN3std7process5Stdio5piped17h19db82fa55ef85e8Epiped_ZN3std7process5Stdio7inherit17h672c1f9ecc0c3683Einherit_ZN3std7process5Stdio4null17hc52dceba20d987c0E_ZN120_$LT$std..process..Stdio$u20$as$u20$std..sys_common..FromInner$LT$std..sys..unix..process..process_common..Stdio$GT$$GT$10from_inner17hc6168a4b420f6314E_ZN56_$LT$std..process..Stdio$u20$as$u20$core..fmt..Debug$GT$3fmt17h6a762fdf9b6212d9E_ZN3std7process10ExitStatus7success17h3edcbd98c5544e7fE_ZN3std7process10ExitStatus4code17h182f2a296115256fE_ZN63_$LT$std..process..ExitStatus$u20$as$u20$core..fmt..Display$GT$3fmt17h04653992ce41551eE_ZN3std7process5Child4kill17hb7207449602e9c51E_ZN3std7process5Child2id17h06e372b19e8530aeE_ZN3std7process5Child8try_wait17hde36c47507e107feE_ZN3std7process5Child16wait_with_output17h096462b7393bc4b4Ewait_with_output_ZN3std7process4exit17h82c2004e414b4974Eexit_ZN3std7process5abort17hc961b4288a9c7d22Eabort_ZN3std7process2id17h0d2218fc71e463adE_ZN51_$LT$$u21$$u20$as$u20$std..process..Termination$GT$6report17h151dc91b49275b5bEreport_ZN3std4sync4mpsc8blocking11SignalToken6signal17he6241214a36091d0E_ZN3std4sync4mpsc8blocking9WaitToken4wait17h862b9f3d3d2039b8E_ZN3std4sync4mpsc8blocking9WaitToken14wait_max_until17hffe523d3d7134d27Ewait_max_until_ZN3std4sync4mpsc4sync5Queue7enqueue17h1ae9d4ede4dd6075Eenqueue_ZN3std4sync4mpsc4sync5Queue7dequeue17h544d823d1a52ccc6Edequeue_ZN65_$LT$std..sync..mpsc..RecvError$u20$as$u20$core..fmt..Display$GT$3fmt17hab7423351e02c960E_ZN64_$LT$std..sync..mpsc..RecvError$u20$as$u20$std..error..Error$GT$11description17h2bffb9a323c95691E_ZN68_$LT$std..sync..mpsc..TryRecvError$u20$as$u20$core..fmt..Display$GT$3fmt17h326390768dd6018dE_ZN67_$LT$std..sync..mpsc..TryRecvError$u20$as$u20$std..error..Error$GT$11description17habaffac921d58b29E_ZN103_$LT$std..sync..mpsc..TryRecvError$u20$as$u20$core..convert..From$LT$std..sync..mpsc..RecvError$GT$$GT$4from17h01fbfd5d0fc3011fE_ZN72_$LT$std..sync..mpsc..RecvTimeoutError$u20$as$u20$core..fmt..Display$GT$3fmt17hc77deaae800911ccE_ZN71_$LT$std..sync..mpsc..RecvTimeoutError$u20$as$u20$std..error..Error$GT$11description17h6a1339e489fd317cE_ZN64_$LT$std..sync..barrier..Barrier$u20$as$u20$core..fmt..Debug$GT$3fmt17h154e3838f0db2e13E_ZN3std4sync7barrier7Barrier3new17h3bb1624804814238E_ZN3std4sync7barrier7Barrier4wait17h38d19b7c78fb86c4E_ZN74_$LT$std..sync..barrier..BarrierWaitResult$u20$as$u20$core..fmt..Debug$GT$3fmt17hf6625a442a7d769fE_ZN3std4sync7condvar7Condvar3new17h6e60b42cd910279cE_ZN3std4sync7condvar7Condvar10notify_one17h8d7d87f70d3faa38E_ZN64_$LT$std..sync..condvar..Condvar$u20$as$u20$core..fmt..Debug$GT$3fmt17h7a7c2b081a283935E_ZN70_$LT$std..sync..condvar..Condvar$u20$as$u20$core..default..Default$GT$7default17h9efab7f37aa779a6E_ZN129_$LT$$LT$std..sync..mutex..Mutex$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$..fmt..LockedPlaceholder$u20$as$u20$core..fmt..Debug$GT$3fmt17h625199c0b76b89c1E_ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17h0cfcece65d026d5bE_ZN3std4sync4once4Once15call_once_force28_$u7b$$u7b$closure$u7d$$u7d$17hb2ce0af89567f983E_ZN3std4sync4once4Once10call_inner17he4820d88e5388bd4Ecall_inner_ZN58_$LT$std..sync..once..Once$u20$as$u20$core..fmt..Debug$GT$3fmt17h6501a1aa330c809dE_ZN70_$LT$std..sync..once..WaiterQueue$u20$as$u20$core..ops..drop..Drop$GT$4drop17hbca140fbed35c1f9E_ZN3std4sync4once9OnceState11is_poisoned17h6284cb243eda8928Eis_poisoned_ZN3std4sync4once9OnceState6poison17h39d232c13ab872f8E_ZN3std4time7Instant25saturating_duration_since17hf0e27407f25f03f4Esaturating_duration_since_ZN3std4time7Instant7elapsed17hfeb27c5ba22e80afEelapsed_ZN94_$LT$std..time..Instant$u20$as$u20$core..ops..arith..AddAssign$LT$core..time..Duration$GT$$GT$10add_assign17hf3589114c7eab16bE_ZN94_$LT$std..time..Instant$u20$as$u20$core..ops..arith..SubAssign$LT$core..time..Duration$GT$$GT$10sub_assign17h87e243a6328e1287Esub_assign_ZN55_$LT$std..time..Instant$u20$as$u20$core..fmt..Debug$GT$3fmt17h30f72c11d6824b50E_ZN3std4time10SystemTime7elapsed17h0e6cfa3685044a8fE_ZN97_$LT$std..time..SystemTime$u20$as$u20$core..ops..arith..AddAssign$LT$core..time..Duration$GT$$GT$10add_assign17hd79fc4e3763f5d55E_ZN97_$LT$std..time..SystemTime$u20$as$u20$core..ops..arith..SubAssign$LT$core..time..Duration$GT$$GT$10sub_assign17h36450643947cd65bE_ZN3std4time15SystemTimeError8duration17h2622ad146e0e5ef5E_ZN64_$LT$std..time..SystemTimeError$u20$as$u20$std..error..Error$GT$11description17h72d829b66cc2c2d7E_ZN65_$LT$std..time..SystemTimeError$u20$as$u20$core..fmt..Display$GT$3fmt17haeddcfb914370216E_ZN3std4lazy21SyncOnceCell$LT$T$GT$10initialize17h7cef9f1584863160Einitialize>,closure-0,!>_ZN91_$LT$std..sys_common..backtrace.._print..DisplayBacktrace$u20$as$u20$core..fmt..Display$GT$3fmt17h171d4c10df1a98eeE_ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h46a5fe47a0167f49E_ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$17h560d2c51a627b1efE_ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h4e5f4b72b04174c3E__rust_end_short_backtrace_ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h9599e90d24cd3cd7E_ZN3std10sys_common9backtrace15output_filename17hed0b49957cbc1843Eoutput_filename_ZN75_$LT$std..sys_common..condvar..Condvar$u20$as$u20$core..ops..drop..Drop$GT$4drop17hcc5fba2f1a6edef4E_ZN3std10sys_common2fs14remove_dir_all17h66b1b212fd5d7932Eremove_dir_all_ZN3std10sys_common2fs24remove_dir_all_recursive17hca3e2ef90f2b1ae2Eremove_dir_all_recursive_ZN3std10sys_common5mutex12MovableMutex3new17he3ff21538e168b7cE_ZN73_$LT$std..sys_common..os_str_bytes..Slice$u20$as$u20$core..fmt..Debug$GT$3fmt17hacf30086fb8b8e9aE_ZN73_$LT$std..sys_common..os_str_bytes..Buf$u20$as$u20$core..fmt..Display$GT$3fmt17h9f0b0220a32da1dbE_ZN114_$LT$std..sys_common..os_str_bytes..Buf$u20$as$u20$std..sys_common..IntoInner$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$10into_inner17h698f69235a1c6ba8E_ZN3std10sys_common12os_str_bytes3Buf11from_string17h616c7d34cbdbf433Efrom_string_ZN3std10sys_common12os_str_bytes5Slice15to_string_lossy17hb83ea1dfcd55258fE_ZN3std10sys_common12os_str_bytes5Slice10clone_into17h9f233b0609dc996dE_ZN3std10sys_common12os_str_bytes5Slice9empty_box17h7b7a584319dfa543Eempty_box_ZN3std10sys_common6poison4Flag3new17hda4fd67079df9aeeE_ZN82_$LT$std..sys_common..poison..PoisonError$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h74f32808b5c251edEfmt>_ZN3std10sys_common7process10CommandEnv3set17h672de12ec63dfd33E_ZN3std10sys_common7process10CommandEnv6remove17h4ad146cad749a14fE_ZN96_$LT$std..sys_common..process..CommandEnvs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17he24e765c1dccfb97E_ZN96_$LT$std..sys_common..process..CommandEnvs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h6eb932ce7c874b47E_ZN107_$LT$std..sys_common..process..CommandEnvs$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17hd7776e8f275debd8E_ZN107_$LT$std..sys_common..process..CommandEnvs$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$8is_empty17h22f3d9d5723f6f5eE_ZN3std10sys_common6rwlock6RWLock3new17ha471dfd7167fab65E_ZN3std10sys_common6thread9min_stack17h6a260ac027fd90fdE_ZN3std10sys_common11thread_info10ThreadInfo4with28_$u7b$$u7b$closure$u7d$$u7d$17h3a505e2b3e5f8505E{{closure}}_ZN3std10sys_common11thread_info3set17h89c65182c9a494cdE_ZN3std10sys_common17thread_local_dtor22register_dtor_fallback9run_dtors17h12d24c3465382169Erun_dtors_ZN3std10sys_common16thread_local_key9StaticKey3new17hdb4ee5abfa9d3f53E_ZN3std10sys_common16thread_local_key9StaticKey9lazy_init17hea50d4ae560ea5edElazy_init_ZN80_$LT$std..sys_common..thread_local_key..Key$u20$as$u20$core..ops..drop..Drop$GT$4drop17h4c9b6bcb20f53806E_ZN3std10sys_common4util10dumb_print17h8385deb8b846d6f6Edumb_print_ZN3std10sys_common4util5abort17h46332374953ab698E_ZN3std10sys_common4util15report_overflow17h885cd8470bac169dEreport_overflow_ZN77_$LT$std..sys_common..wtf8..Wtf8Buf$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17h697e0d2c542bb265Ederef_mut_ZN3std10sys_common4wtf87Wtf8Buf25push_code_point_unchecked17h8fd08fb886f60290Epush_code_point_unchecked_ZN92_$LT$std..sys_common..wtf8..Wtf8$u20$as$u20$std..sys_common..AsInner$LT$$u5b$u8$u5d$$GT$$GT$8as_inner17h7a36c64ba3c41f40E_ZN64_$LT$std..sys_common..wtf8..Wtf8$u20$as$u20$core..fmt..Debug$GT$3fmt17h93ddfc9b8849cf09E_ZN64_$LT$std..sys_common..wtf8..Wtf8$u20$as$u20$core..fmt..Debug$GT$3fmt17write_str_escaped17ha48c6c50bb89b615E_ZN66_$LT$std..sys_common..wtf8..Wtf8$u20$as$u20$core..fmt..Display$GT$3fmt17h1eb910dd63662735E_ZN3std10sys_common4wtf816slice_error_fail17hd62b2e6afebf440dEslice_error_fail_ZN3std5alloc20set_alloc_error_hook17hf17f9bc6eac86c88Eset_alloc_error_hook_ZN3std5alloc21take_alloc_error_hook17h4d47d54937fb4860Etake_alloc_error_hook_ZN3std5alloc24default_alloc_error_hook17h2224d88cddd6cf4bEdefault_alloc_error_hookrust_oom__rdl_alloc__rdl_dealloc__rdl_realloc__rdl_alloc_zeroed__rust_drop_panic__rust_foreign_exception_ZN3std9panicking8set_hook17h5af91d4659a5675eEset_hook_ZN3std9panicking9take_hook17h71cce5e6d982a430Etake_hook_ZN3std9panicking12default_hook17h7b00dcc1d0944747E_ZN3std9panicking12default_hook28_$u7b$$u7b$closure$u7d$$u7d$17h4245258b50e37e69E_ZN3std9panicking11panic_count17is_zero_slow_path17h4996d7e61404dc4dE_ZN3std9panicking3try7cleanup17hd4070df0ec7514cfE_ZN3std9panicking15begin_panic_fmt17h818c3c917eaeb432Ebegin_panic_fmtrust_begin_unwind_ZN3std9panicking19begin_panic_handler28_$u7b$$u7b$closure$u7d$$u7d$17hd549436f6bb6dbb8E_ZN90_$LT$std..panicking..begin_panic_handler..PanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h7219dd4e9a7e5e13Etake_box_ZN90_$LT$std..panicking..begin_panic_handler..PanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$3get17h443c9527dd3d3996E_ZN93_$LT$std..panicking..begin_panic_handler..StrPanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h53b2a9e2810f2069E_ZN93_$LT$std..panicking..begin_panic_handler..StrPanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$3get17haeb07e5e3cecd701E_ZN3std9panicking11begin_panic17heb23b64fde311f4fEbegin_panic<&str>_ZN3std9panicking11begin_panic28_$u7b$$u7b$closure$u7d$$u7d$17h226205cfbc146caaE{{closure}}<&str>_ZN91_$LT$std..panicking..begin_panic..PanicPayload$LT$A$GT$$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h89a91a020e8414caEtake_box<&str>_ZN91_$LT$std..panicking..begin_panic..PanicPayload$LT$A$GT$$u20$as$u20$core..panic..BoxMeUp$GT$3get17h693e27baada4cd54Eget<&str>_ZN3std9panicking20rust_panic_with_hook17h71e6a073d87de1f5Erust_panic_with_hook_ZN3std9panicking23rust_panic_without_hook17h3d77570d0b1eee88E_ZN91_$LT$std..panicking..rust_panic_without_hook..RewrapBox$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h53de9d17137489efE_ZN91_$LT$std..panicking..rust_panic_without_hook..RewrapBox$u20$as$u20$core..panic..BoxMeUp$GT$3get17h3c71ffeb1a114348Erust_panic_ZN3std2rt19lang_start_internal17hd5b67df56ca01daeElang_start_internal_ZN72_$LT$std..backtrace_rs..backtrace..Frame$u20$as$u20$core..fmt..Debug$GT$3fmt17h34958017b386b0a5E_ZN3std12backtrace_rs9symbolize6Symbol4name17hca964af29b150b5fE_ZN73_$LT$std..backtrace_rs..symbolize..Symbol$u20$as$u20$core..fmt..Debug$GT$3fmt17hc294c343e7049ed5E_ZN3std12backtrace_rs5print17BacktraceFrameFmt21print_raw_with_column17h5cb4527d1d2741c4Eprint_raw_with_column_ZN86_$LT$std..std_detect..detect..cache..Initializer$u20$as$u20$core..default..Default$GT$7default17h0310d57b9e820e7cE_ZN3std10std_detect6detect5cache21detect_and_initialize17h200d3f9c634bba1bEdetect_and_initialize_ZN3std10std_detect6detect8features17h78466a4b7b103e10E_ZN57_$LT$std..thread..Builder$u20$as$u20$core..fmt..Debug$GT$3fmt17h0868d7287be8d937E_ZN58_$LT$std..thread..ThreadId$u20$as$u20$core..fmt..Debug$GT$3fmt17h61502f8bea128b6bE_ZN68_$LT$std..backtrace..BacktraceStatus$u20$as$u20$core..fmt..Debug$GT$3fmt17h4601abd8d4b40274E_ZN61_$LT$std..backtrace..RawFrame$u20$as$u20$core..fmt..Debug$GT$3fmt17h4402b558a98f6cd7E_ZN3std11collections4hash3map11RandomState3new4KEYS7__getit17h9daaad139ec75a7cE_ZN79_$LT$std..collections..hash..map..DefaultHasher$u20$as$u20$core..fmt..Debug$GT$3fmt17he6a05bb8de30cdceE_ZN55_$LT$std..env..VarError$u20$as$u20$core..fmt..Debug$GT$3fmt17hac8cf029b4104187E_ZN61_$LT$std..env..JoinPathsError$u20$as$u20$core..fmt..Debug$GT$3fmt17hb1dd3ae09aff15caE_ZN66_$LT$std..error..private..Internal$u20$as$u20$core..fmt..Debug$GT$3fmt17h009065a776c7e564E_ZN54_$LT$std..error..Chain$u20$as$u20$core..fmt..Debug$GT$3fmt17h0b0afde632d6cbdeE_ZN62_$LT$std..ffi..c_str..NulError$u20$as$u20$core..fmt..Debug$GT$3fmt17h7c9584138c609915E_ZN75_$LT$std..ffi..c_str..FromBytesWithNulError$u20$as$u20$core..fmt..Debug$GT$3fmt17h5f97ee7596d350ffE_ZN73_$LT$std..ffi..c_str..FromVecWithNulError$u20$as$u20$core..fmt..Debug$GT$3fmt17hb7f822cfeee3580dE_ZN69_$LT$std..ffi..c_str..IntoStringError$u20$as$u20$core..fmt..Debug$GT$3fmt17hf53c2fb842c2b7b6E_ZN53_$LT$std..fs..ReadDir$u20$as$u20$core..fmt..Debug$GT$3fmt17h8687161b0b2077deE_ZN57_$LT$std..fs..OpenOptions$u20$as$u20$core..fmt..Debug$GT$3fmt17hbff09c204556d23fE_ZN57_$LT$std..fs..Permissions$u20$as$u20$core..fmt..Debug$GT$3fmt17h06aebf32b560efc8E_ZN54_$LT$std..fs..FileType$u20$as$u20$core..fmt..Debug$GT$3fmt17h450fb52cdf72e6b9E_ZN56_$LT$std..fs..DirBuilder$u20$as$u20$core..fmt..Debug$GT$3fmt17hdf9cf0f579db8e27E_ZN62_$LT$std..io..error..ErrorKind$u20$as$u20$core..fmt..Debug$GT$3fmt17h2657609440c289adE_ZN57_$LT$std..io..Initializer$u20$as$u20$core..fmt..Debug$GT$3fmt17h79b192303346bcecE_ZN54_$LT$std..io..SeekFrom$u20$as$u20$core..fmt..Debug$GT$3fmt17h618332bfcd42eed0E_ZN69_$LT$std..net..ip..Ipv6MulticastScope$u20$as$u20$core..fmt..Debug$GT$3fmt17h1478c3d1cc04824dE_ZN69_$LT$std..net..parser..AddrParseError$u20$as$u20$core..fmt..Debug$GT$3fmt17heeea70661517f892E_ZN60_$LT$std..net..tcp..Incoming$u20$as$u20$core..fmt..Debug$GT$3fmt17h9a0f0d9ca141ea56E_ZN55_$LT$std..net..Shutdown$u20$as$u20$core..fmt..Debug$GT$3fmt17h00bb112dd461d698E_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$6st_dev17hdd2381a3d9452d29Est_dev_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$6st_ino17h4ec4f6fe53ee7f2fEst_ino_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$8st_nlink17h700f46138162d9c6Est_nlink_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$6st_uid17h676ab491b56c232bEst_uid_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$6st_gid17hc3210da2075827eaEst_gid_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$7st_rdev17h5abfdf61fbddd706Est_rdev_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$8st_atime17hd97523764adb0672Est_atime_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$13st_atime_nsec17h5224e6482457d4e6Est_atime_nsec_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$8st_mtime17hc6a0f4ff23d7c52aEst_mtime_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$13st_mtime_nsec17hf913b80d09d0a0f7Est_mtime_nsec_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$8st_ctime17h67146a6a78fda1d7Est_ctime_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$13st_ctime_nsec17h0672ab3384ca8424Est_ctime_nsec_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$10st_blksize17hf2b90bbad926f9e0Est_blksize_ZN69_$LT$std..fs..Metadata$u20$as$u20$std..os..linux..fs..MetadataExt$GT$9st_blocks17hd8fcbf43f9473443Est_blocks_ZN54_$LT$std..path..Prefix$u20$as$u20$core..fmt..Debug$GT$3fmt17h25bfbe5b508df209E_ZN53_$LT$std..path..State$u20$as$u20$core..fmt..Debug$GT$3fmt17h80d6233ccaa7d906E_ZN57_$LT$std..path..Component$u20$as$u20$core..fmt..Debug$GT$3fmt17hfb185088c2076bdfE_ZN61_$LT$std..path..Component$u20$as$u20$core..cmp..PartialEq$GT$2eq17hedd2829f90c428baE_ZN57_$LT$std..path..Ancestors$u20$as$u20$core..fmt..Debug$GT$3fmt17h4c3d23dd57b72722E_ZN64_$LT$std..path..StripPrefixError$u20$as$u20$core..fmt..Debug$GT$3fmt17h7835f0f0eb2d6bdaE_ZN62_$LT$std..process..CommandArgs$u20$as$u20$core..fmt..Debug$GT$3fmt17he7a1e0823b6caa2eE_ZN61_$LT$std..process..ExitStatus$u20$as$u20$core..fmt..Debug$GT$3fmt17hf1a651c2af01b3e7E_ZN59_$LT$std..process..ExitCode$u20$as$u20$core..fmt..Debug$GT$3fmt17h1d9ba41a06cbd5d5E_ZN63_$LT$std..sync..mpsc..RecvError$u20$as$u20$core..fmt..Debug$GT$3fmt17h75df17cfaf9c3928E_ZN66_$LT$std..sync..mpsc..TryRecvError$u20$as$u20$core..fmt..Debug$GT$3fmt17hd30e44440cab947fE_ZN70_$LT$std..sync..mpsc..RecvTimeoutError$u20$as$u20$core..fmt..Debug$GT$3fmt17h3c1a2e4a1c6a6e9bE_ZN74_$LT$std..sync..condvar..WaitTimeoutResult$u20$as$u20$core..fmt..Debug$GT$3fmt17hab39a8cd56e38120E_ZN63_$LT$std..sync..once..OnceState$u20$as$u20$core..fmt..Debug$GT$3fmt17h242966576274b3e6E_ZN63_$LT$std..time..SystemTimeError$u20$as$u20$core..fmt..Debug$GT$3fmt17h7909124982deb501E_ZN73_$LT$std..sys_common..process..CommandEnv$u20$as$u20$core..fmt..Debug$GT$3fmt17h54eb2b095e487d52E_ZN74_$LT$std..sys_common..process..CommandEnvs$u20$as$u20$core..fmt..Debug$GT$3fmt17hf89345f63a79c7d6E_ZN3std10sys_common3net16sockaddr_to_addr17h1c6589fd41d38649Esockaddr_to_addr_ZN91_$LT$std..sys_common..net..LookupHost$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h1599ef504403bb5bE_ZN90_$LT$std..sys_common..net..LookupHost$u20$as$u20$core..convert..TryFrom$LT$$RF$str$GT$$GT$8try_from17hd1d27cfa52a5ba99E_ZN104_$LT$std..sys_common..net..LookupHost$u20$as$u20$core..convert..TryFrom$LT$$LP$$RF$str$C$u16$RP$$GT$$GT$8try_from17ha7dcc6ce6775430aE_ZN3std10sys_common3net9TcpStream7connect17h449d8fe7272c2fa1E_ZN68_$LT$std..sys_common..net..TcpStream$u20$as$u20$core..fmt..Debug$GT$3fmt17h8567368eb5f6e468E_ZN3std10sys_common3net11TcpListener4bind17hb2365494531d3916Ebind_ZN70_$LT$std..sys_common..net..TcpListener$u20$as$u20$core..fmt..Debug$GT$3fmt17h92293fbf81abf82eE_ZN3std10sys_common3net9UdpSocket4bind17hfb50f66e2d456c0fE_ZN3std10sys_common3net9UdpSocket7send_to17h54940d25b1379f22Esend_to_ZN3std10sys_common3net9UdpSocket7connect17hfc92c6aa60c0efc0E_ZN68_$LT$std..sys_common..net..UdpSocket$u20$as$u20$core..fmt..Debug$GT$3fmt17h1658c9b88d1b236dE_ZN3std3sys4unix4weak13Weak$LT$F$GT$10initialize17h425e23817ce727a1Einitialize i32>_ZN3std3sys4unix4weak13Weak$LT$F$GT$10initialize17h4363296ac0ea4dd8Einitialize i32>_ZN3std3sys4unix4weak13Weak$LT$F$GT$10initialize17h4461a1889a2c8731Einitialize isize>_ZN3std3sys4unix4weak13Weak$LT$F$GT$10initialize17h609ec2b27f1acf97Einitialize isize>_ZN3std3sys4unix4weak13Weak$LT$F$GT$10initialize17ha439ccc3f68a8edeEinitialize usize>_ZN3std3sys4unix4weak13Weak$LT$F$GT$10initialize17he329278da7408466Einitialize *const i8>_ZN3std3sys4unix4weak13Weak$LT$F$GT$10initialize17hf76d32890f260eb0Einitialize isize>_ZN3std3sys4unix4args3imp15ARGV_INIT_ARRAY12init_wrapper17hc08d1c0401889fa2Einit_wrapper_ZN3std3sys4unix7condvar7Condvar12wait_timeout17h37a8048107691687Ewait_timeout_ZN80_$LT$std..fs..Permissions$u20$as$u20$std..sys..unix..ext..fs..PermissionsExt$GT$8set_mode17hc4cfff57309cc5c9E_ZN80_$LT$std..fs..OpenOptions$u20$as$u20$std..sys..unix..ext..fs..OpenOptionsExt$GT$12custom_flags17h25e3812e9e3676c3E_ZN74_$LT$std..fs..FileType$u20$as$u20$std..sys..unix..ext..fs..FileTypeExt$GT$14is_char_device17hdc48ef1e4d486ec4Eis_char_device_ZN74_$LT$std..fs..FileType$u20$as$u20$std..sys..unix..ext..fs..FileTypeExt$GT$9is_socket17hb5c71cdaa7f6cef2Eis_socket_ZN74_$LT$std..fs..DirEntry$u20$as$u20$std..sys..unix..ext..fs..DirEntryExt$GT$3ino17hd5acae52d168c669E_ZN78_$LT$std..fs..DirBuilder$u20$as$u20$std..sys..unix..ext..fs..DirBuilderExt$GT$4mode17h0c77c0a11b22b538E_ZN74_$LT$std..io..stdio..Stdin$u20$as$u20$std..sys..unix..ext..io..AsRawFd$GT$9as_raw_fd17h52c811dfc03d7490E_ZN75_$LT$std..io..stdio..Stdout$u20$as$u20$std..sys..unix..ext..io..AsRawFd$GT$9as_raw_fd17hb086b6d60c1abe1aE_ZN75_$LT$std..io..stdio..Stderr$u20$as$u20$std..sys..unix..ext..io..AsRawFd$GT$9as_raw_fd17h6e79facd5c1eb2c4E_ZN78_$LT$std..io..stdio..StdinLock$u20$as$u20$std..sys..unix..ext..io..AsRawFd$GT$9as_raw_fd17h793c28ae2740e60cE_ZN3std3sys4unix3ext3net4addr11sockaddr_un17h12a51a228dda7ad6Esockaddr_un_ZN83_$LT$std..sys..unix..ext..net..addr..AsciiEscaped$u20$as$u20$core..fmt..Display$GT$3fmt17hcb3e8529d24ed239E_ZN3std3sys4unix3ext3net4addr10SocketAddr10is_unnamed17h275107900f4db784Eis_unnamed_ZN3std3sys4unix3ext3net4addr10SocketAddr11as_pathname17h4d81b977e46ee62eEas_pathname_ZN79_$LT$std..sys..unix..ext..net..addr..SocketAddr$u20$as$u20$core..fmt..Debug$GT$3fmt17he2cef70a410e1bcdE_ZN3std3sys4unix3ext3net9ancillary33recv_vectored_with_ancillary_from17h76c91d443a73c1f8Erecv_vectored_with_ancillary_from_ZN3std3sys4unix3ext3net9ancillary10SocketCred3new17hae13e97add05730cE_ZN3std3sys4unix3ext3net9ancillary10SocketCred7set_pid17hd580fedb422612d0Eset_pid_ZN3std3sys4unix3ext3net9ancillary10SocketCred7get_pid17h056fae8025565230Eget_pid_ZN3std3sys4unix3ext3net9ancillary10SocketCred7set_uid17h5bcedc92a933bdafEset_uid_ZN3std3sys4unix3ext3net9ancillary10SocketCred7get_uid17hf79a88667762d5d5Eget_uid_ZN3std3sys4unix3ext3net9ancillary10SocketCred7set_gid17h23653c4b403bed80Eset_gid_ZN3std3sys4unix3ext3net9ancillary10SocketCred7get_gid17h5386b51e6ec617a2Eget_gid_ZN105_$LT$std..sys..unix..ext..net..ancillary..ScmRights$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h1733219f7e7fa886E_ZN110_$LT$std..sys..unix..ext..net..ancillary..ScmCredentials$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hba51fb22c5c22de6E_ZN104_$LT$std..sys..unix..ext..net..ancillary..Messages$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h117ca3ede8f9d67fE_ZN3std3sys4unix3ext3net9ancillary15SocketAncillary3new17h757ca9199b73189eE_ZN3std3sys4unix3ext3net9ancillary15SocketAncillary8capacity17heb052ee1ec9b1580E_ZN3std3sys4unix3ext3net9ancillary15SocketAncillary3len17h949fbb279c2360f6E_ZN3std3sys4unix3ext3net9ancillary15SocketAncillary8messages17hffdd091e839bcb11Emessages_ZN3std3sys4unix3ext3net9ancillary15SocketAncillary9truncated17h91a245e0c664fbc5Etruncated_ZN3std3sys4unix3ext3net9ancillary15SocketAncillary7add_fds17hd3c20010d6c257ebEadd_fds_ZN3std3sys4unix3ext3net9ancillary15SocketAncillary9add_creds17hca45b12f626dabeeEadd_creds_ZN3std3sys4unix3ext3net9ancillary15SocketAncillary5clear17h83e2c0a1dbd2a93cE_ZN85_$LT$std..sys..unix..ext..net..datagram..UnixDatagram$u20$as$u20$core..fmt..Debug$GT$3fmt17hda697eae40bd4f97E_ZN3std3sys4unix3ext3net8datagram12UnixDatagram7unbound17h5339d2a64c41d0c2Eunbound_ZN3std3sys4unix3ext3net8datagram12UnixDatagram4pair17haacded190b839f16E_ZN3std3sys4unix3ext3net8datagram12UnixDatagram15recv_from_flags17h700a92fb19f41acaE_ZN3std3sys4unix3ext3net8datagram12UnixDatagram9recv_from17h963ba522f3e58cfdE_ZN3std3sys4unix3ext3net8datagram12UnixDatagram33recv_vectored_with_ancillary_from17h1673bc118c62519cE_ZN3std3sys4unix3ext3net8datagram12UnixDatagram28recv_vectored_with_ancillary17hbce9541459d2f433Erecv_vectored_with_ancillary_ZN3std3sys4unix3ext3net8datagram12UnixDatagram4send17h7c8f2a6ba474a6e4E_ZN3std3sys4unix3ext3net8datagram12UnixDatagram9peek_from17h0c85ef54b3db9f58E_ZN101_$LT$std..sys..unix..ext..net..datagram..UnixDatagram$u20$as$u20$std..sys..unix..ext..io..AsRawFd$GT$9as_raw_fd17h0f272c3ecdd6e1baE_ZN103_$LT$std..sys..unix..ext..net..datagram..UnixDatagram$u20$as$u20$std..sys..unix..ext..io..FromRawFd$GT$11from_raw_fd17h79894805cd7c1ba4E_ZN85_$LT$std..sys..unix..ext..net..listener..UnixListener$u20$as$u20$core..fmt..Debug$GT$3fmt17hd488b816956fb97dE_ZN3std3sys4unix3ext3net8listener12UnixListener6accept17hfa5a820c5bab9dc9E_ZN103_$LT$std..sys..unix..ext..net..listener..Incoming$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17heb2427a31bf45828E_ZN103_$LT$std..sys..unix..ext..net..listener..Incoming$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17hb84fd32781b1ccbdE_ZN81_$LT$std..sys..unix..ext..net..stream..UnixStream$u20$as$u20$core..fmt..Debug$GT$3fmt17h16020e6e0df62a88E_ZN3std3sys4unix3ext3net6stream10UnixStream4pair17h6a5dc0725dcd58d1E_ZN3std3sys4unix3ext3net6stream10UnixStream10local_addr17h371fcb3c2194d6aaE_ZN3std3sys4unix3ext3net6stream10UnixStream9peer_addr17h5f33c2961ef58d18E_ZN3std3sys4unix3ext3net6stream10UnixStream9peer_cred17h4cbe6a186b04f487E_ZN3std3sys4unix3ext3net6stream10UnixStream12set_passcred17hcfc1cb03015d9941E_ZN3std3sys4unix3ext3net6stream10UnixStream8passcred17h89820bd9b43ec32cE_ZN3std3sys4unix3ext3net6stream10UnixStream28recv_vectored_with_ancillary17h20032d2f5cd98b98E_ZN3std3sys4unix3ext3net6stream10UnixStream28send_vectored_with_ancillary17h56a1e034407f8e54Esend_vectored_with_ancillary_ZN78_$LT$std..sys..unix..ext..net..stream..UnixStream$u20$as$u20$std..io..Read$GT$4read17h6fa6d0ce25526337E_ZN78_$LT$std..sys..unix..ext..net..stream..UnixStream$u20$as$u20$std..io..Read$GT$13read_vectored17heba68422f5e30b2aE_ZN82_$LT$std..process..Command$u20$as$u20$std..sys..unix..ext..process..CommandExt$GT$3uid17h4c784ae5277ff69eE_ZN82_$LT$std..process..Command$u20$as$u20$std..sys..unix..ext..process..CommandExt$GT$3gid17h74344458ba64fc83E_ZN82_$LT$std..process..Command$u20$as$u20$std..sys..unix..ext..process..CommandExt$GT$6groups17h9840666d4e9de7f0E_ZN82_$LT$std..process..Command$u20$as$u20$std..sys..unix..ext..process..CommandExt$GT$4exec17h5566696a2ac92d14E_ZN88_$LT$std..process..ExitStatus$u20$as$u20$std..sys..unix..ext..process..ExitStatusExt$GT$6signal17h283efac245d7bfe8E_ZN88_$LT$std..process..ExitStatus$u20$as$u20$std..sys..unix..ext..process..ExitStatusExt$GT$11core_dumped17h3cd0f6f2103ef5f0E_ZN88_$LT$std..process..ExitStatus$u20$as$u20$std..sys..unix..ext..process..ExitStatusExt$GT$14stopped_signal17hf073083c927b5e15E_ZN88_$LT$std..process..ExitStatus$u20$as$u20$std..sys..unix..ext..process..ExitStatusExt$GT$9continued17h578cbf546c30e44bE_ZN88_$LT$std..process..ExitStatus$u20$as$u20$std..sys..unix..ext..process..ExitStatusExt$GT$8into_raw17h6d5bdb4d788ce356Einto_raw_ZN3std3sys4unix3ext7process84_$LT$impl$u20$std..sys..unix..ext..io..FromRawFd$u20$for$u20$std..process..Stdio$GT$11from_raw_fd17hcc604d765801a871E_ZN3std3sys4unix3ext7process9parent_id17h092f9edd0349fc5eEparent_id_ZN3std3sys4unix2fd8FileDesc11read_to_end17he3fcadbf77c28e1aE_ZN3std3sys4unix2fd8FileDesc7read_at17ha5a1e19a16c4dbb2E_ZN3std3sys4unix2fd8FileDesc8write_at17hff2da5137040f4e4E_ZN3std3sys4unix2fd8FileDesc11get_cloexec17hf902433dd3aa7ed5Eget_cloexec_ZN3std3sys4unix2fd8FileDesc11set_cloexec17hf0886cb70a2c9eceEset_cloexec_ZN136_$LT$std..sys..unix..fs..FileAttr$u20$as$u20$std..sys_common..AsInner$LT$libc..unix..linux_like..linux..gnu..b64..x86_64..stat64$GT$$GT$8as_inner17h75209540657edf09E_ZN86_$LT$std..sys..unix..fs..ReadDir$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hd28a0a38a7a2cb21E_ZN3std3sys4unix2fs8DirEntry4path17ha65998296bb1f7f7E_ZN3std3sys4unix2fs4File6open_c17h4172c6d00d87ac7fE_ZN3std3sys4unix2fs10DirBuilder5mkdir17he0091bb49c426e85Emkdir_ZN61_$LT$std..sys..unix..fs..File$u20$as$u20$core..fmt..Debug$GT$3fmt17h03d5da7fbb3dc398E_ZN3std3sys4unix2fs7readdir17hfc63d04b2d3cbd65Ereaddir_ZN3std3sys4unix2fs6unlink17h96897943aaed40bbEunlink_ZN3std3sys4unix2fs6rename17hddd0b7f258222f5eErename_ZN3std3sys4unix2fs8set_perm17h00da45f5af8365c8E_ZN3std3sys4unix2fs5rmdir17hc1fa21ea850afaa8Ermdir_ZN3std3sys4unix2fs8readlink17h9fa6eaf82d84d5bdEreadlink_ZN3std3sys4unix2fs7symlink17h2c7026e1d4264363E_ZN3std3sys4unix2fs4link17h08f429ac150b3fa0E_ZN3std3sys4unix2fs4stat17h99308868673b740aE_ZN3std3sys4unix2fs5lstat17h6e20383fbbe4e6a1Elstat_ZN3std3sys4unix2fs12canonicalize17h9517b6267f556a74Ecanonicalize_ZN3std3sys4unix2fs4copy17hcf750d4fbd165134E_ZN3std3sys4unix11kernel_copy6FdMeta10maybe_fifo17h718e8248d6de47c5Emaybe_fifo_ZN3std3sys4unix11kernel_copy6FdMeta25potential_sendfile_source17ha5f0ea141375ac0dEpotential_sendfile_source_ZN3std3sys4unix11kernel_copy6FdMeta25copy_file_range_candidate17hb5368d321d9ac62fEcopy_file_range_candidate_ZN71_$LT$std..fs..File$u20$as$u20$std..sys..unix..kernel_copy..CopyRead$GT$10properties17hdd6a195f741587ecEproperties_ZN75_$LT$$RF$std..fs..File$u20$as$u20$std..sys..unix..kernel_copy..CopyRead$GT$10properties17hf231fe27c8c6e4ebE_ZN72_$LT$std..fs..File$u20$as$u20$std..sys..unix..kernel_copy..CopyWrite$GT$10properties17h192aa13e02aad2dbE_ZN76_$LT$$RF$std..fs..File$u20$as$u20$std..sys..unix..kernel_copy..CopyWrite$GT$10properties17h8312553b9be4c0f6E_ZN102_$LT$std..sys..unix..ext..net..stream..UnixStream$u20$as$u20$std..sys..unix..kernel_copy..CopyRead$GT$10properties17h21b8ab8ab7f5de9eE_ZN106_$LT$$RF$std..sys..unix..ext..net..stream..UnixStream$u20$as$u20$std..sys..unix..kernel_copy..CopyRead$GT$10properties17h6b10781518b0c56dE_ZN83_$LT$std..process..ChildStderr$u20$as$u20$std..sys..unix..kernel_copy..CopyRead$GT$10properties17ha36881d214c1a5baE_ZN83_$LT$std..io..stdio..StdinLock$u20$as$u20$std..sys..unix..kernel_copy..CopyRead$GT$10properties17hc7a34d628dd59821E_ZN85_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..sys..unix..kernel_copy..CopyWrite$GT$10properties17h1dbe05ec0d32050bE_ZN85_$LT$std..io..stdio..StderrLock$u20$as$u20$std..sys..unix..kernel_copy..CopyWrite$GT$10properties17h8a1ec6cf853bf88eE_ZN3std3sys4unix11kernel_copy18copy_regular_files17he37265d73fdb3575E_ZN3std3sys4unix11kernel_copy15sendfile_splice17hfc91b5cacfeb6827E_ZN3std3sys4unix5mutex14ReentrantMutex4init17h31f4deef68c52255E_ZN3std3sys4unix5mutex14ReentrantMutex7destroy17hf5a9d1d837109461E_ZN3std3sys4unix3net6Socket7timeout17h7797bcd1b672e77bE_ZN3std3sys4unix2os12error_string17hb1a97bc32531b65aEerror_string_ZN3std3sys4unix2os5chdir17hd2ee88b3fa7a63c4Echdir_ZN3std3sys4unix2os11split_paths17h48c1b023ced99d57E_ZN3std3sys4unix2os11split_paths13bytes_to_path17he2a1c72eeb8ba0e7Ebytes_to_path_ZN3std3sys4unix2os11split_paths12is_separator17h7d6ae54287c70e23E_ZN3std3sys4unix2os4exit17h4f199386027655ebE_ZN3std3sys4unix2os13glibc_version17hbd6c67cc537b038bE_ZN3std3sys4unix7process14process_common7Command3new17h52fe0220197d9c42E_ZN3std3sys4unix7process14process_common7Command9set_arg_017hf0d22d114dc7d9ceEset_arg_0_ZN3std3sys4unix7process14process_common7Command3arg17h7653072d70730690E_ZN3std3sys4unix7process14process_common7Command3cwd17h0e3c0081513cfcd1E_ZN3std3sys4unix7process14process_common7Command8pre_exec17h18c9130c9af8a2e8Epre_exec_ZN3std3sys4unix7process14process_common7Command5stdin17h0a3b083aaf2eb970E_ZN3std3sys4unix7process14process_common7Command6stdout17h5daf53d23c625c75E_ZN3std3sys4unix7process14process_common7Command6stderr17h34da761cf1b2a6f3E_ZN3std3sys4unix7process14process_common7Command11capture_env17h68dbeec34b1dba01E_ZN3std3sys4unix7process14process_common7Command8setup_io17h29380a375f01b32bEsetup_io_ZN3std3sys4unix7process14process_common4os2c17hc5b9c59465b06beaE_ZN3std3sys4unix7process14process_common5Stdio14to_child_stdio17h19ac1c902ca75db0Eto_child_stdio_ZN118_$LT$std..sys..unix..process..process_common..Stdio$u20$as$u20$core..convert..From$LT$std..sys..unix..fs..File$GT$$GT$4from17hd8de55f0aac66df7E_ZN85_$LT$std..sys..unix..process..process_common..Command$u20$as$u20$core..fmt..Debug$GT$3fmt17h7c3db1d5bed7bc42E_ZN111_$LT$std..sys..unix..process..process_common..CommandArgs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h18d0a00269d01470E_ZN111_$LT$std..sys..unix..process..process_common..CommandArgs$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h6e0ca2ced1b9e9d1E_ZN122_$LT$std..sys..unix..process..process_common..CommandArgs$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17h5c3478ca0abd4bb2E_ZN122_$LT$std..sys..unix..process..process_common..CommandArgs$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$8is_empty17h48f1aed30ed303f4E_ZN3std3sys4unix7process13process_inner66_$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$5spawn17h3855c03734146882E_ZN3std3sys4unix7process13process_inner66_$LT$impl$u20$std..sys..unix..process..process_common..Command$GT$7do_exec17h164592affdddfb9dE_ZN101_$LT$std..sys..unix..process..process_inner..ExitStatus$u20$as$u20$core..convert..From$LT$i32$GT$$GT$4from17hefaf353c45319ad3E_ZN3std3sys4unix14stack_overflow3imp14signal_handler17h2fd4ba0bd4311fcaEsignal_handler_ZN3std3sys4unix14stack_overflow3imp12make_handler17h81f6c5590d49944eEmake_handler_ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$17is_write_vectored17h960222229191e64cE_ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$5flush17h8c3539b6c7e68ab3E_ZN3std3sys4unix6thread6Thread3new17h835706cbf5322367E_ZN3std3sys4unix6thread6Thread3new12thread_start17hb5e40d3d934ebb7aEthread_start_ZN3std3sys4unix6thread6Thread8set_name17he9d30ae9a0fc504fEset_name_ZN3std3sys4unix6thread6Thread4join17h7b1c6a1fe6591b37E_ZN3std3sys4unix6thread6Thread2id17h59454bf3be9c89cfE_ZN3std3sys4unix6thread6Thread7into_id17hfe4a57b30da2b01dEinto_id_ZN72_$LT$std..sys..unix..thread..Thread$u20$as$u20$core..ops..drop..Drop$GT$4drop17hc33f8b27f2bab902E_ZN3std3sys4unix6thread5guard7current17hd5530ea473058cd5E_ZN3std3sys4unix17thread_local_dtor13register_dtor17hb28ac350c252193cEregister_dtor_ZN3std3sys4unix4time8Timespec4zero17h93bf473d0cc48653E_ZN3std3sys4unix4time8Timespec12sub_timespec17hdd3361cecca1e503Esub_timespec_ZN71_$LT$std..sys..unix..time..Timespec$u20$as$u20$core..cmp..PartialEq$GT$2eq17he5e133bb79f36ec5E_ZN107_$LT$std..sys..unix..time..inner..SystemTime$u20$as$u20$core..convert..From$LT$libc..unix..timespec$GT$$GT$4from17h37b73b6e78c35605E_ZN3std3sys4unix17decode_error_kind17h1f1bfdd8c114513cEdecode_error_kind_ZN3std3sys4unix14abort_internal17hd9edd474837d2a63Eabort_internal_ZN88_$LT$std..sys..unix..ext..net..ancillary..AncillaryError$u20$as$u20$core..fmt..Debug$GT$3fmt17h702542dbbfe4ace7E_ZN89_$LT$std..sys..unix..ext..net..ancillary..SocketAncillary$u20$as$u20$core..fmt..Debug$GT$3fmt17hcf7ea58835461d7bE_ZN81_$LT$std..sys..unix..ext..net..listener..Incoming$u20$as$u20$core..fmt..Debug$GT$3fmt17h5171faac11d29b84E_ZN70_$LT$std..sys..unix..ext..ucred..UCred$u20$as$u20$core..fmt..Debug$GT$3fmt17hbed82f4b70475862E_ZN65_$LT$std..sys..unix..fd..FileDesc$u20$as$u20$core..fmt..Debug$GT$3fmt17h877723d0db0e5c61E_ZN3std3sys4unix2fs9try_statx17h3a2d7f9ffa2222c6E_ZN68_$LT$std..sys..unix..fs..OpenOptions$u20$as$u20$core..fmt..Debug$GT$3fmt17h808ce53cbb9b0986E_ZN49_$LT$i8$u20$as$u20$std..sys..unix..IsMinusOne$GT$12is_minus_one17hb4908cd5395b3e1eE_ZN50_$LT$i16$u20$as$u20$std..sys..unix..IsMinusOne$GT$12is_minus_one17h89e9ebb624f349dfE_ZN55_$LT$std..alloc..System$u20$as$u20$core..fmt..Debug$GT$3fmt17hb5b67f13adf4a987E_ZN3std12backtrace_rs9backtrace9libunwind5trace8trace_fn17hd82bfadf48329ac8Etrace_fn_ZN79_$LT$std..backtrace_rs..symbolize..SymbolName$u20$as$u20$core..fmt..Display$GT$3fmt17he92b327390e24179E_ZN77_$LT$std..backtrace_rs..symbolize..SymbolName$u20$as$u20$core..fmt..Debug$GT$3fmt17hcd7ca3ecae4caae6E_ZN3std12backtrace_rs9symbolize5gimli5stash5Stash8allocate17hcbdba7732b4f1eadE_ZN3std12backtrace_rs9symbolize5gimli7resolve17h57e3c4568c3a748eE_ZN3std12backtrace_rs9symbolize5gimli7resolve28_$u7b$$u7b$closure$u7d$$u7d$17hcea4609646a330dbE_ZN91_$LT$std..backtrace_rs..symbolize..gimli..mmap..Mmap$u20$as$u20$core..ops..deref..Deref$GT$5deref17h19320f4319b100ecE_ZN3std12backtrace_rs9symbolize5gimli3elf6Object7section17h2acfaec02cceb053E_ZN3std12backtrace_rs9symbolize5gimli8callback17h6dd1e9d1e70df9c6Ecallback_ZN80_$LT$std..backtrace_rs..types..BytesOrWideString$u20$as$u20$core..fmt..Debug$GT$3fmt17h743041760bf5fd8cE_ZN3std10std_detect6detect4arch7Feature6to_str17hff2b11186b46ca39Elibrary/panic_unwind/src/lib.rspanic_unwindreal_impfind_eh_action_ZN12panic_unwind8real_imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h6ac2cd7ffedcb1b3E_ZN4core3ops8function6FnOnce9call_once17hcd34c66990553d57Ecall_once_ZN12panic_unwind8real_imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h19fd542a7d81e794E_ZN4core3ops8function6FnOnce9call_once17h86a3f2411ddae624Ecall_once_ZN4core3ptr91drop_in_place$LT$alloc..boxed..Box$LT$dyn$u20$core..any..Any$u2b$core..marker..Send$GT$$GT$17h912ad256a6bc3d0eE_ZN4core3ptr54drop_in_place$LT$panic_unwind..real_imp..Exception$GT$17h8fc3cc1135522fe3Edrop_in_place_ZN5alloc5alloc8box_free17h8ed8cb57aca0a7d0E_ZN5alloc5alloc8box_free17h63b36fd526d4d83bEbox_freeeh_ZN12panic_unwind5dwarf2eh8round_up17hb90d6102289e90f9Eround_upDwarfReader_ZN12panic_unwind5dwarf11DwarfReader4read17h94ea2f6b24778594Eread_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17ha56b38ba952f2349E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h912352ef2c636e16E_ZN12panic_unwind5dwarf11DwarfReader4read17h3790a2448253aeb0Eread_ZN12panic_unwind5dwarf11DwarfReader12read_uleb12817h0feb537b5f96b6b7Eread_uleb128_ZN12panic_unwind5dwarf11DwarfReader4read17hb7b63c81b17fe2d1Eread_ZN12panic_unwind5dwarf11DwarfReader4read17hb7bb1d6d0d984f08Eread_ZN12panic_unwind5dwarf11DwarfReader12read_sleb12817h72225e67dcaec535Eread_sleb128_ZN12panic_unwind5dwarf11DwarfReader4read17h67da92ef9b011f8cEread_ZN12panic_unwind5dwarf11DwarfReader4read17h093c8c3d38268f6bEread_ZN12panic_unwind8real_imp7cleanup17ha0c3ea32d0d7f07fE_ZN12panic_unwind8real_imp5panic17hb7dbce78dfcf553fE_ZN5alloc5boxed12Box$LT$T$GT$3new17h6dca7bcd2dea67dcEnew_ZN12panic_unwind8real_imp24rust_eh_personality_impl17h29864a2d91ee7357Erust_eh_personality_impl_ZN12panic_unwind8real_imp14find_eh_action17hc984dad28fe7e750E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$13guaranteed_eq17h05a8246d4befd0ceE_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$7is_null17hf6cb7c0cbcb941b8E_ZN12panic_unwind5dwarf2eh14find_eh_action17h7b1cf854d2d4a0a5E_ZN12panic_unwind5dwarf2eh19interpret_cs_action17h2f735d61417307ccEinterpret_cs_action_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h014f2311447de4feE_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17hd02a7f735495c2a6E_ZN4core3ptr79drop_in_place$LT$alloc..boxed..Box$LT$panic_unwind..real_imp..Exception$GT$$GT$17he3bb12d446a4c56aEdrop_in_place>_ZN4core3ptr88drop_in_place$LT$panic_unwind..real_imp..find_eh_action..$u7b$$u7b$closure$u7d$$u7d$$GT$17h043e09c466faadc9E_ZN12panic_unwind5dwarf2eh20read_encoded_pointer17h9203e6d953c5c5abEread_encoded_pointer__rust_panic_cleanup__rust_start_panic_ZN12panic_unwind8real_imp5panic17exception_cleanup17h6f1f24e9c23abf8dEexception_cleanuprust_eh_personality/cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/lib.rs_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17hf83b1df6673e4796E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h1f4f3d01551af477E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$6as_ptr17h2d5eeb0d6fb010fbE_ZN73_$LT$$u5b$A$u5d$$u20$as$u20$core..slice..cmp..SlicePartialEq$LT$B$GT$$GT$5equal17h9019fbf0cd0e5289E_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17haf05c264a1f7e3d0E_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17h56bb9f22fd889178E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha07763cff945e94fE_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hd6b6185cb2bf5e4dE_ZN4core5slice6memchr6memchr28_$u7b$$u7b$closure$u7d$$u7d$17hfe6fc5cefd7ba956E_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h3f011c14cf73fb5fE_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h2423c405a1c2e1eeE_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h18d66289e60076b4E_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17hc04371c209ac1726E_ZN4core3str11validations15next_code_point17h457a7f44584ea457E_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17hc2c99e1f18b441ccE_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h19e90cbc43b3af8dE_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h2908c6a99b7c4881E_ZN4core6option15Option$LT$T$GT$6unwrap17h90ab53f1acc79584Eunwrap_ZN4core4char7methods22_$LT$impl$u20$char$GT$8is_digit17h58e9f5d9e219903bEis_digit_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17h509cba303f06dda5E_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17h7cd0e6c58373a79cE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h4036821df728e44aE_ZN4core3str21_$LT$impl$u20$str$GT$5parse17h774023e10edeb63fE_ZN4core6result19Result$LT$T$C$E$GT$6unwrap17hd729e166b55d6b7eEunwrap_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$11starts_with17hdfb29e04b3b37b19E_ZN52_$LT$char$u20$as$u20$core..str..pattern..Pattern$GT$12is_prefix_of17h2e3c056a5eee7f25E_ZN4core3str21_$LT$impl$u20$str$GT$11starts_with17h32ecef4b61e3524eEstarts_withrustc_demanglelegacy_ZN14rustc_demangle6legacy12is_rust_hash17h1fcae72f5019f6b7Eis_rust_hash_ZN4core4iter6traits8iterator8Iterator8try_fold17hec483f9e52dae442Etry_fold>_ZN4core4iter6traits8iterator8Iterator3all17ha279d503860bc3a6Eall_ZN4core3str11validations15utf8_first_byte17h0270ecd702bb22bcEutf8_first_byte_ZN14rustc_demangle6legacy12is_rust_hash28_$u7b$$u7b$closure$u7d$$u7d$17h0cbb222ae6055ed3E_ZN4core4iter6traits8iterator8Iterator3all5check28_$u7b$$u7b$closure$u7d$$u7d$17hc4e97f963054981dE{{closure}}_ZN4core3str21_$LT$impl$u20$str$GT$11starts_with17h71d7c0ac9b2fc05eE_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17hdb151ca87f056ac9E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17hdbe72baad7e0fcf1E_ZN52_$LT$char$u20$as$u20$core..str..pattern..Pattern$GT$13into_searcher17h7d284e65246e8232E_ZN4core3str21_$LT$impl$u20$str$GT$4find17h79ccd7b62fde94b0Efind_ZN4core6option15Option$LT$T$GT$3map17h54c504db5a549503Emap<(usize, usize),usize,closure-0>_ZN4core3str6traits117_$LT$impl$u20$core..slice..index..SliceIndex$LT$str$GT$$u20$for$u20$core..ops..range..RangeInclusive$LT$usize$GT$$GT$5index17hb186e61e4daddd77E_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17h9b63932247f300d3Eindex>_ZN4core3str6traits108_$LT$impl$u20$core..slice..index..SliceIndex$LT$str$GT$$u20$for$u20$core..ops..range..Range$LT$usize$GT$$GT$3get17h330319dc6fe88193E_ZN4core3str6traits108_$LT$impl$u20$core..slice..index..SliceIndex$LT$str$GT$$u20$for$u20$core..ops..range..Range$LT$usize$GT$$GT$5index17h1a493b5e5d76fcdbE_ZN4core5slice4iter13Iter$LT$T$GT$3new17h69c0c178887e16e1E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17ha8a4b21be2e68120E_ZN4core3str21_$LT$impl$u20$str$GT$12char_indices17hcbdc5d30860cc4c0Echar_indices_ZN95_$LT$core..str..pattern..MultiCharEqPattern$LT$C$GT$$u20$as$u20$core..str..pattern..Pattern$GT$13into_searcher17h22a84d5e47f9de94Einto_searcher_ZN49_$LT$F$u20$as$u20$core..str..pattern..Pattern$GT$13into_searcher17h22fe1cd405eb8a83E_ZN4core3str21_$LT$impl$u20$str$GT$4find17h217955969fb7af29Efind_ZN102_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17h1ff45579042d2ab9Elen_ZN97_$LT$core..str..pattern..MultiCharEqSearcher$LT$C$GT$$u20$as$u20$core..str..pattern..Searcher$GT$4next17h0d91ac7e24b42aecEnext_ZN4core3str7pattern8Searcher10next_match17h53f0aeac22b3d191Enext_match>_ZN99_$LT$core..str..pattern..CharPredicateSearcher$LT$F$GT$$u20$as$u20$core..str..pattern..Searcher$GT$10next_match17ha690cd9625cb577aEnext_match_ZN87_$LT$core..str..iter..CharIndices$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hc371463d9aa7efb6E_ZN71_$LT$rustc_demangle..legacy..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h59376c407e47dcbeE_ZN53_$LT$F$u20$as$u20$core..str..pattern..MultiCharEq$GT$7matches17h58a4f7cd1b5cb73fEmatches_ZN4core4iter6traits8iterator8Iterator8try_fold17h5183cee34081cf67E_ZN4core4iter6traits8iterator8Iterator3all17h2ffa1c8df263cc40E_ZN71_$LT$rustc_demangle..legacy..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h7c76cdd31898350cE_ZN4core4iter6traits8iterator8Iterator3all5check28_$u7b$$u7b$closure$u7d$$u7d$17hf1eba00272304f9aE_ZN4core6option15Option$LT$T$GT$8and_then17h2bb01f84fee10364Eand_then core::option::Option>_ZN4core4char7convert68_$LT$impl$u20$core..convert..TryFrom$LT$u32$GT$$u20$for$u20$char$GT$8try_from17hcddf90ba820bd081E_ZN4core4char7convert8from_u3217h5f49ae614a7b306eEfrom_u32_ZN4core3ops8function6FnOnce9call_once17haf09301f2eb9d548Ecall_once core::option::Option,(u32)>_ZN4core4char7methods22_$LT$impl$u20$char$GT$10is_control17hafdd629ecedc71bdEis_controlv0Ident_ZN14rustc_demangle2v05Ident25try_small_punycode_decode17h929c6cdee3557740Etry_small_punycode_decode>_ZN14rustc_demangle2v05Ident15punycode_decode17h244eb414f018ad67Epunycode_decodecopied_ZN104_$LT$core..iter..adapters..copied..Copied$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h32eb79d790913e79E_ZN81_$LT$core..str..iter..Bytes$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h160369f6f2356591Epeekable_ZN4core4iter8adapters8peekable17Peekable$LT$I$GT$4peek28_$u7b$$u7b$closure$u7d$$u7d$17h846691247548aec5E{{closure}}_ZN4core6option15Option$LT$T$GT$18get_or_insert_with17h1231e01bea8d669cEget_or_insert_with,closure-0>Peekable_ZN4core4iter8adapters8peekable17Peekable$LT$I$GT$4peek17h292c23c1c1fc7912Epeek_ZN4core6option15Option$LT$T$GT$3map17h501af2922d96eb83E_ZN4core6option19Option$LT$$RF$T$GT$6copied17h92d8da9965792941E_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17h8b772b039a6ce851Eget_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h2349707e3c53daceEgettry_small_punycode_decode_ZN14rustc_demangle2v05Ident25try_small_punycode_decode28_$u7b$$u7b$closure$u7d$$u7d$17hf6bd1078860a42e1E{{closure}}>_ZN64_$LT$rustc_demangle..v0..Ident$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h978a22b20165a290E_ZN4core6option15Option$LT$T$GT$14unwrap_or_else17h74fe644c1dfcdce9Eunwrap_or_else,closure-1>_ZN4core3num23_$LT$impl$u20$usize$GT$14saturating_sub17he5c41c3f5afb4ccdEsaturating_sub_ZN4core3cmp6max_by17hbe7dc1d5c2f1fad3E_ZN4core3cmp3Ord3max17h78c18f46d65fa3fdE_ZN4core3cmp3max17h4128092859dc603eE_ZN4core3cmp6min_by17h309640537561c68aE_ZN4core3cmp3Ord3min17hc59936474ffc83faE_ZN4core3cmp3min17h06208ac684ffbe5fE_ZN108_$LT$core..iter..adapters..peekable..Peekable$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h228a76ed4ebf4794Enext_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h73b3919903e30ddcE_ZN64_$LT$rustc_demangle..v0..Ident$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h2f4ffae97a14ee2cE_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h2b866858fee422e0Eoffset_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17hfb4132ea60a2356aEpost_inc_start_ZN14rustc_demangle2v06Parser4peek17h944089961cdcaf4eE_ZN14rustc_demangle2v06Parser3eat17h76928310802ae05bE_ZN4core6option15Option$LT$T$GT$3map17hb283530e0d197ff7E_ZN4core6option19Option$LT$$RF$T$GT$6cloned17he358e6af0ee0c03aEcloned_ZN14rustc_demangle2v06Parser8digit_1017h80ddf54ec228119fEdigit_10_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17hc70f56b9dad24c26Eindex>_ZN4core3str21_$LT$impl$u20$str$GT$5bytes17h6163db1261023f15E_ZN4core4iter6traits12double_ended19DoubleEndedIterator9try_rfold17h68217ebca8c95110Etry_rfold,usize,closure-0,core::ops::control_flow::ControlFlow>_ZN119_$LT$core..iter..adapters..copied..Copied$LT$I$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9try_rfold17h63adc0dda770cd10Etry_rfold,u8,usize,closure-0,core::ops::control_flow::ControlFlow>_ZN4core4iter6traits8iterator8Iterator9rposition17h69430e07ca8726a5Erposition>,closure-0>_ZN81_$LT$core..str..iter..Bytes$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17ha91f2bdab325cd54Erposition_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hdc356eba93241226Eident_ZN14rustc_demangle2v06Parser5ident28_$u7b$$u7b$closure$u7d$$u7d$17hde7a2dda202881deErposition_ZN4core4iter6traits8iterator8Iterator9rposition5check28_$u7b$$u7b$closure$u7d$$u7d$17hf8b45cd486207b5dEcopy_try_fold_ZN4core4iter8adapters6copied13copy_try_fold28_$u7b$$u7b$closure$u7d$$u7d$17hbf02c85667785258E{{closure}},closure-0>_ZN4core3str21_$LT$impl$u20$str$GT$8is_empty17hf62c03ee1b7b3aa1E_ZN14rustc_demangle2v06Parser4next17h5ea58e6cdc0b67bfE_ZN14rustc_demangle2v06Parser10integer_6217h0624bfc1e9205e57E_ZN14rustc_demangle2v06Parser7backref17h23d00de19e777e60Ebackref_ZN14rustc_demangle2v06Parser14opt_integer_6217h0e60cf85a5885d28Eopt_integer_62_ZN14rustc_demangle2v06Parser13disambiguator17he4790be26f33e2b7Edisambiguator_ZN14rustc_demangle2v06Parser16skip_generic_arg17hac72b9136cc167e0Eskip_generic_arg_ZN14rustc_demangle2v06Parser8digit_6217h018223f159c9c9e4Edigit_62_ZN14rustc_demangle2v06Parser9namespace17h0c2efa4459071804Enamespace_ZN14rustc_demangle2v010basic_type17hc74a8f36f6cbdc90Ebasic_type_ZN14rustc_demangle2v06Parser11hex_nibbles17h2d113d6be5d616b0Ehex_nibbles_ZN4core3num21_$LT$impl$u20$u64$GT$15overflowing_sub17hcefcc9485667e9e4E_ZN4core3num21_$LT$impl$u20$u64$GT$11checked_sub17h1c8a59ec1076f69cEPrinter_ZN4core6result19Result$LT$T$C$E$GT$6as_mut17hbfdc33200ef9e2d2Eas_mut_ZN14rustc_demangle2v07Printer10parser_mut17ha6748581e6b1b9cfEparser_mut_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h0ac5eda26e564b1cEmap_err<&mut rustc_demangle::v0::Parser,&mut rustc_demangle::v0::Invalid,rustc_demangle::v0::Invalid,closure-0>_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hc57b8d9cdc4f63a8Eand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u8,closure-0>print_path_ZN14rustc_demangle2v07Printer10print_path28_$u7b$$u7b$closure$u7d$$u7d$17ha4eb7f70e09f81a3E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h68901c61789e79b4Eand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-6>_ZN14rustc_demangle2v07Printer10print_path28_$u7b$$u7b$closure$u7d$$u7d$17hc295b7a89163a11fE_ZN14rustc_demangle2v07Printer15backref_printer17h7920b58def66bd56Ebackref_printer_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h9d69802ea3754857Eand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,rustc_demangle::v0::Parser,closure-0>_ZN14rustc_demangle2v07Printer15backref_printer28_$u7b$$u7b$closure$u7d$$u7d$17hda6f39a25132ffb5E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hc3a42fbf1f283e0dEand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-1>_ZN14rustc_demangle2v07Printer10print_path28_$u7b$$u7b$closure$u7d$$u7d$17h282f608a9f72cc74E_ZN4core6result19Result$LT$T$C$E$GT$5is_ok17h8189b3a9e7588ea9Eis_ok_ZN14rustc_demangle2v07Printer14print_sep_list17he1490012a013a06dEprint_sep_list core::result::Result<(), core::fmt::Error>>_ZN14rustc_demangle2v07Printer3eat28_$u7b$$u7b$closure$u7d$$u7d$17h76c9b8733f97ad89E_ZN4core6result19Result$LT$T$C$E$GT$3map17hf627d803dce2ee7dEmap<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,bool,closure-0>_ZN14rustc_demangle2v07Printer3eat17hfe989e0209249babE_ZN4core3ops8function2Fn4call17h280da4b6a624e800Ecall core::result::Result<(), core::fmt::Error>,(&mut rustc_demangle::v0::Printer)>_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hc294f4c776b0010cEand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,core::option::Option,closure-3>_ZN14rustc_demangle2v07Printer10print_path28_$u7b$$u7b$closure$u7d$$u7d$17ha66a9a57003956efE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hed98afc4fa03c0aaEand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-4>_ZN14rustc_demangle2v07Printer10print_path28_$u7b$$u7b$closure$u7d$$u7d$17hf93a318f04961370E_ZN14rustc_demangle2v07Printer10print_path28_$u7b$$u7b$closure$u7d$$u7d$17h64073e2e75550375E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hdf5033284f5b2d8bEand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,rustc_demangle::v0::Ident,closure-2>_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hfafa5ec645bd4ec5Eand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,(),closure-7>_ZN14rustc_demangle2v07Printer10print_path28_$u7b$$u7b$closure$u7d$$u7d$17h8de73ced3194c3a7E_ZN14rustc_demangle2v07Printer10print_path28_$u7b$$u7b$closure$u7d$$u7d$17h6959447900f9bc88E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h74e790a99324bbeaEand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,rustc_demangle::v0::Ident,closure-5>_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hb0dc5bd4a85c595bEand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-0>print_generic_arg_ZN14rustc_demangle2v07Printer17print_generic_arg28_$u7b$$u7b$closure$u7d$$u7d$17h8729412b5d12277fE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h4e534042821934efEand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u8,closure-3>print_type_ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$17hd8652150401653d0E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hfa801dee1fff3d79E_ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$17h0518d6bba1d624edE_ZN4core6result19Result$LT$T$C$E$GT$3map17h17be5b5a561eb864Emap<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,(),closure-2>_ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$17hd983319f1ac44047E_ZN14rustc_demangle2v07Printer9in_binder17heb240d78fb2fdf63Ein_binder_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h39eda821c52dfcaaEin_binder_ZN14rustc_demangle2v07Printer9in_binder28_$u7b$$u7b$closure$u7d$$u7d$17he9b9333cce7af41aE_ZN14rustc_demangle2v07Printer9in_binder17h2015e00743aebde7Ein_binder_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h114214af1c04bd74E_ZN14rustc_demangle2v07Printer9in_binder28_$u7b$$u7b$closure$u7d$$u7d$17hb0ceae300d76142fE_ZN14rustc_demangle2v07Printer14print_sep_list17h734034e05164f505E_ZN4core3ops8function2Fn4call17h4a42d17d1c4e40bcE_ZN14rustc_demangle2v07Printer14print_sep_list17hcb4d4f5f024c2c6bE_ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$17h36dba05163d28d77E_ZN4core3ops8function2Fn4call17h8678afbf02620bbdE_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17h04fb6d47f7af9b53E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h65f707911a5814ffEand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,u64,closure-5>_ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$17h51eba79682b5873cE_ZN4core3str21_$LT$impl$u20$str$GT$5split17h81ff6607d1e49eddEsplit_ZN4core3str4iter22SplitInternal$LT$P$GT$4next17h363f75bb1eabaf45E_ZN90_$LT$core..str..iter..Split$LT$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h67996733c9e40b14E_ZN4core6option15Option$LT$T$GT$6unwrap17h70f017db100368b9Eunwrap<&str>_ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h2a27bf4592cb238dE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hdb5a333b7e44ef0eEand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,rustc_demangle::v0::Ident,closure-0>_ZN4core3str4iter22SplitInternal$LT$P$GT$7get_end17hfc8f1c81bb2ba553E_ZN4core3str21_$LT$impl$u20$str$GT$13get_unchecked17hdc6c61fb997853c9E_ZN81_$LT$core..str..pattern..CharSearcher$u20$as$u20$core..str..pattern..Searcher$GT$8haystack17hc76fd975f5fdb3c9Ehaystack_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hedfa3da17bee13f3Eprint_dyn_trait_ZN14rustc_demangle2v07Printer15print_dyn_trait28_$u7b$$u7b$closure$u7d$$u7d$17h19808ea72bbed8b0Eprint_const_ZN14rustc_demangle2v07Printer11print_const28_$u7b$$u7b$closure$u7d$$u7d$17hcb3f138cdf92bcebE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h2b2615a22ce3f0dfE_ZN14rustc_demangle2v07Printer15print_const_int17h4b5b3cf1ed6f41dfEprint_const_intprint_const_bool_ZN14rustc_demangle2v07Printer16print_const_bool28_$u7b$$u7b$closure$u7d$$u7d$17h616c30f97d2c8baaE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hd14fc43ecb339356Eand_then<&mut rustc_demangle::v0::Parser,rustc_demangle::v0::Invalid,&str,closure-0>_ZN14rustc_demangle2v07Printer16print_const_bool17h3d65d9136e0c9ee4Eprint_const_char_ZN14rustc_demangle2v07Printer16print_const_char28_$u7b$$u7b$closure$u7d$$u7d$17heaf93b8cf16b6386E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17ha72ff8077a7dc98fE_ZN14rustc_demangle2v07Printer16print_const_char17h525224275b4c0ae0E_ZN4core6option15Option$LT$T$GT$6unwrap17hb86cd82bb1e19ee5Eunwrap_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h7fef2fa79ebb0768Eprint_const_uint_ZN14rustc_demangle2v07Printer16print_const_uint28_$u7b$$u7b$closure$u7d$$u7d$17hdccaa44782b4f7c3E_ZN4core3str21_$LT$impl$u20$str$GT$4find17hb542d754dd07df02Efind<&str>_ZN4core3str7pattern14TwoWaySearcher4next17ha48952f9801a77d6E_ZN4core4iter5range116_$LT$impl$u20$core..iter..traits..double_ended..DoubleEndedIterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$9next_back17hb60363899bb15808E_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h6a99602ebce38696E_ZN14rustc_demangle6legacy8demangle17h8d6714290a814500E_ZN4core4iter6traits8iterator8Iterator8try_fold17h92a7a544e8d41cf9E_ZN4core4iter6traits8iterator8Iterator3all17h81da1fdc8384332fE_ZN14rustc_demangle8demangle28_$u7b$$u7b$closure$u7d$$u7d$17he2d6bbcf82049c21E_ZN4core4iter6traits8iterator8Iterator3all5check28_$u7b$$u7b$closure$u7d$$u7d$17h00027cb53456450eE_ZN4core4iter6traits8iterator8Iterator8try_fold17h6f78790f19941dc8Etry_fold,(),closure-0,core::ops::control_flow::ControlFlow<(), ()>>_ZN104_$LT$core..iter..adapters..copied..Copied$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17habf00a7e8d602fb6Etry_fold,u8,(),closure-0,core::ops::control_flow::ControlFlow<(), ()>>_ZN4core4iter6traits8iterator8Iterator3any17h9b30b40ca6801b3aEany>,closure-0>_ZN81_$LT$core..str..iter..Bytes$u20$as$u20$core..iter..traits..iterator..Iterator$GT$3any17hbffa9dd2c316a4a9Eany_ZN14rustc_demangle6legacy8demangle28_$u7b$$u7b$closure$u7d$$u7d$17h029ce2371df828cdE_ZN4core4iter6traits8iterator8Iterator3any5check28_$u7b$$u7b$closure$u7d$$u7d$17h1099911fc41a087aE_ZN4core4iter8adapters6copied13copy_try_fold28_$u7b$$u7b$closure$u7d$$u7d$17h39a1e0450ca7a9afE{{closure}},closure-0>_ZN14rustc_demangle2v08demangle17h78e5b2231cc13a03E_ZN4core4iter6traits8iterator8Iterator8try_fold17hd141f47c625a2ca5E_ZN104_$LT$core..iter..adapters..copied..Copied$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h54df6e667ef62043E_ZN4core4iter6traits8iterator8Iterator3any17h3baa147d4965bd96E_ZN81_$LT$core..str..iter..Bytes$u20$as$u20$core..iter..traits..iterator..Iterator$GT$3any17hcd687f9250d17236E_ZN14rustc_demangle2v08demangle28_$u7b$$u7b$closure$u7d$$u7d$17hd7f3f0177aa6adffE_ZN4core4iter6traits8iterator8Iterator3any5check28_$u7b$$u7b$closure$u7d$$u7d$17h33b44c02141b7664E_ZN4core4iter8adapters6copied13copy_try_fold28_$u7b$$u7b$closure$u7d$$u7d$17h233392945cec167eE_ZN4core5slice4iter13Iter$LT$T$GT$10make_slice17haeaa3b22e74322c8Emake_slice_ZN4core5slice4iter13Iter$LT$T$GT$8as_slice17h53eb189483ee98b4Eas_sliceChars_ZN4core3str4iter5Chars6as_str17he7aae578f9aad16eE_ZN14rustc_demangle14is_symbol_like17h88743fb99a69c7c3Eis_symbol_like_ZN4core4iter6traits8iterator8Iterator8try_fold17h016f3f73d662568aE_ZN4core4iter6traits8iterator8Iterator3all17h3e73c60c762858c7E_ZN14rustc_demangle14is_symbol_like28_$u7b$$u7b$closure$u7d$$u7d$17hc1aab75292eda697E_ZN4core4iter6traits8iterator8Iterator3all5check28_$u7b$$u7b$closure$u7d$$u7d$17h364cf6fdb32b829dE_ZN14rustc_demangle20is_ascii_punctuation17h527df4083c60543fEis_ascii_punctuation_ZN4core6option15Option$LT$T$GT$8and_then17h773fcfe12112d162Eand_then_ZN4core6option15Option$LT$T$GT$7is_some17hf3a12100d6d32d3dEis_someDemangle_ZN63_$LT$rustc_demangle..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17hd7a0833add7cbde9E_ZN67_$LT$rustc_demangle..v0..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17h479c8baa2c07de9dE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h01377809133e1f4eE_ZN4core3ptr33drop_in_place$LT$$RF$$LP$$RP$$GT$17h592186bf36d4543bEdrop_in_place<&()>_ZN71_$LT$rustc_demangle..legacy..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17h8d32d137e161f723E_ZN64_$LT$rustc_demangle..v0..Ident$u20$as$u20$core..fmt..Display$GT$3fmt17h9758fc5c7bfbbab7E_ZN14rustc_demangle2v06Parser5ident17h313b300608370f4fE_ZN14rustc_demangle2v06Parser9skip_path17heaf9d046a5558771Eskip_path_ZN14rustc_demangle2v06Parser9skip_type17h1aaa089086913933Eskip_type_ZN14rustc_demangle2v06Parser10skip_const17h33b3c8df9422e87aEskip_const_ZN14rustc_demangle2v07Printer25print_lifetime_from_index17h1bbf5887e0686d55Eprint_lifetime_from_index_ZN14rustc_demangle2v07Printer10print_path17hfb80381c0e49a364E_ZN14rustc_demangle2v07Printer17print_generic_arg17h47a16444af999e77E_ZN14rustc_demangle2v07Printer10print_type17h792c547e8e94c37cE_ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$17h75c4e3acd8c2e7e4E_ZN14rustc_demangle2v07Printer30print_path_maybe_open_generics17h7a04f94405a3799aEprint_path_maybe_open_generics_ZN14rustc_demangle2v07Printer15print_dyn_trait17h73fd216606eb216eE_ZN14rustc_demangle2v07Printer11print_const17ha1e47e21e07b8575E_ZN14rustc_demangle2v07Printer16print_const_uint17h6748d9b16a2c3749E_ZN14rustc_demangle8demangle17hfadaf8598d01ea1bE_ZN14rustc_demangle12try_demangle17hd6e37a867168fc9cEtry_demangle_ZN14rustc_demangle8Demangle6as_str17ha912fe5ff5fc6f84E_ZN61_$LT$rustc_demangle..Demangle$u20$as$u20$core..fmt..Debug$GT$3fmt17hfba5770eca955fe1E_ZN69_$LT$rustc_demangle..TryDemangleError$u20$as$u20$core..fmt..Debug$GT$3fmt17hc5c88d1ff6457e3eElibrary/alloc/src/lib.rs_ZN5alloc3vec16Vec$LT$T$C$A$GT$6as_ptr17h88d6144d98bd11ecE_ZN72_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h2e3034fec6e8ab67E_ZN65_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17hd8987e06826ce54aE_ZN48_$LT$$u5b$T$u5d$$u20$as$u20$core..fmt..Debug$GT$3fmt17h834e40f5b3c770e0E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0810d8b85812f331E_ZN4core3fmt8builders9DebugList7entries17ha3192cf5b6062870E_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hd657735022d5b64cE_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17hb8f5d5deaca89eb2E_ZN4core3ptr46drop_in_place$LT$alloc..vec..Vec$LT$u8$GT$$GT$17h71bf0c8cd9013bc3E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14current_memory17h416b3f6ae640accaE_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17ha249df45048b380fE_ZN4core3ptr53drop_in_place$LT$alloc..raw_vec..RawVec$LT$u8$GT$$GT$17hebf5ea08a715593eE_ZN4core3ptr42drop_in_place$LT$alloc..string..String$GT$17h52e7bb42593a29d9E_ZN4core3fmt5Write9write_fmt17h6531f02654e00adbE_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11try_reserve17hfd1ce054d9fc47e7E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve17hdf3f5b6bb753f2a4E_ZN5alloc3vec16Vec$LT$T$C$A$GT$7reserve17hd448cfe259ce761bE_ZN5alloc3vec16Vec$LT$T$C$A$GT$15append_elements17h34eca676fc4d38c0E_ZN132_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$alloc..vec..spec_extend..SpecExtend$LT$$RF$T$C$core..slice..iter..Iter$LT$T$GT$$GT$$GT$11spec_extend17h8f87a976011c05d2E_ZN5alloc3vec16Vec$LT$T$C$A$GT$17extend_from_slice17h4895da3e1487511aE_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13needs_to_grow17h5fb28d0bd255ed03E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$14grow_amortized17h954c46e529054000E_ZN4core6option15Option$LT$T$GT$5ok_or17ha871132f2eae1cd2E_ZN4core3cmp6max_by17hbf1dcccde03b1522E_ZN4core3cmp3Ord3max17h96f4b2e3d4bb3e99E_ZN4core3cmp3max17h6c472c39449cf104E_ZN5alloc3vec16Vec$LT$T$C$A$GT$10as_mut_ptr17hdd2e874c864424c4E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h155f64c23d489dceE_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7set_ptr17haa465597ea07e765E_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h7bf40b9be0d3ca2aE_ZN4core10intrinsics19copy_nonoverlapping17hf026bcb0d0e73e76E__alloc_error_handler_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in17hc6e6a5369c69227fE_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16with_capacity_in17h2c51e6727aa8601fE_ZN5alloc7raw_vec15RawVec$LT$T$GT$13with_capacity17hdd1ce4e4cd0b937eE_ZN99_$LT$alloc..boxed..Box$LT$$u5b$T$u5d$$GT$$u20$as$u20$core..convert..From$LT$$RF$$u5b$T$u5d$$GT$$GT$4from17h91f811cbf58f3447E_ZN50_$LT$T$u20$as$u20$core..convert..Into$LT$U$GT$$GT$4into17h381fe4e911ecf1fbE_ZN71_$LT$alloc..borrow..Cow$LT$B$GT$$u20$as$u20$core..ops..deref..Deref$GT$5deref17h71333cacf708de15E_ZN4core3ptr50drop_in_place$LT$alloc..borrow..Cow$LT$str$GT$$GT$17h9107b95ad3ddbf8eE_ZN5alloc3vec16Vec$LT$T$C$A$GT$16with_capacity_in17hd44397d182b8ee9fE_ZN5alloc3vec12Vec$LT$T$GT$13with_capacity17ha526b6d3dd465f12Ereplacevec_dequewrap_copy_ZN4core3fmt9Arguments18estimated_capacity17h237ba91b5f1f2803Eestimated_capacity_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17he28b764997aff05aEoffset<&str>_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17he183f85304a08bccEadd<&str>_ZN4core5slice4iter13Iter$LT$T$GT$3new17h0d058813ace462b4E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17h89896e44978d76b6Eiter<&str>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h900e30673b14153cEnext<&str>_ZN4core4iter6traits8iterator8Iterator4fold17hfd950472f519703cEfold,usize,closure-0>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17h81b8b61d6080a1c5Efold,closure-0,usize,fn(usize, usize) -> usize>_ZN56_$LT$usize$u20$as$u20$core..iter..traits..accum..Sum$GT$3sum17hdc19b0647cf17b53Esum, closure-0>>_ZN4core4iter6traits8iterator8Iterator3sum17hd5ec09be07ed18cdEsum, closure-0>,usize>_ZN4core3ops8function5FnMut8call_mut17hb3ede101b4b23b5dE_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17hbe87674e758d98b3E{{closure}}<&&str,usize,usize,closure-0,fn(usize, usize) -> usize>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h56150a3b76026304E_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h9fa1f37e286f99b6Epost_inc_start<&str>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17h5669a9406177c046Eis_empty_ZN4core6result19Result$LT$T$C$E$GT$6expect17h14d9eb6708ddf519E_ZN4core6result19Result$LT$T$C$E$GT$7map_err17hff24b838c0a3b760E_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h3f5956252eaea73bE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h0eaf07366498b677E_ZN4core3ptr4read17h16db6f0ff146bd98E_ZN4core3ptr23swap_nonoverlapping_one17hbec0db48345607f7E_ZN4core3mem4swap17hf62a2b052f77c918E_ZN4core3mem7replace17h59f6b1d67b712938E_ZN4core3mem4take17h9cd6028a91668b01E_ZN4core10intrinsics19copy_nonoverlapping17h4405c220ab50576dE_ZN5alloc6string6String10into_bytes17hf9972c97616a04aaE_ZN5alloc3vec16Vec$LT$T$C$A$GT$8truncate17ha51673d077c8307bE_ZN5alloc5slice64_$LT$impl$u20$alloc..borrow..ToOwned$u20$for$u20$$u5b$T$u5d$$GT$10clone_into17h996f0d66215e159fE_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h21737e25970b37b1E_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h2a435ba319d588f6E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$13get_unchecked17ha5aac89fd8b8b37cE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$18split_at_unchecked17h69230c0940e665f7E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8split_at17hc4492214ae13873eE_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17h846b095db5836431E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16clone_from_slice17he6741ac8fd70d817E_ZN4core5clone5Clone10clone_from17h57486913a5c617d1E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h39dd58700ace9bf8E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h57d8dc0fdb87ec6cE_ZN4core3str11validations15next_code_point17h2f32380df7ebaf84E_ZN4core5slice4iter13Iter$LT$T$GT$3new17h19c01895803390cdE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hb4a24a9103ae472dE_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17hffa757215ab06741Eto_lowercase_ZN5alloc3str21_$LT$impl$u20$str$GT$12to_lowercase19map_uppercase_sigma17h8753d5c7a2fe79b9Emap_uppercase_sigma_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h6f9917643115e4a4E_ZN4core3str11validations23next_code_point_reverse17h6774df0d5e619bafEnext_code_point_reverse>_ZN96_$LT$core..str..iter..Chars$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h6d2073e8063d1e45E_ZN4core4iter6traits12double_ended19DoubleEndedIterator9try_rfold17hb7c11021b7a98977Etry_rfold>_ZN4core4iter6traits12double_ended19DoubleEndedIterator5rfind17hb5995070c68b5258Erfind_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4find17h5a09cfcd3b456114Eskip_while_ZN115_$LT$core..iter..adapters..skip_while..SkipWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hb23e5928a296a262Enext,closure-0>_ZN5alloc3str21_$LT$impl$u20$str$GT$12to_lowercase26case_ignoreable_then_cased17h426ba62814ea3635Ecase_ignoreable_then_cased>_ZN4core5slice4iter13Iter$LT$T$GT$11pre_dec_end17h959610bbd82bf37cEpre_dec_end_ZN4core3str11validations17utf8_is_cont_byte17hbb276746a6535297Eutf8_is_cont_bytecase_ignoreable_then_cased_ZN5alloc3str21_$LT$impl$u20$str$GT$12to_lowercase26case_ignoreable_then_cased28_$u7b$$u7b$closure$u7d$$u7d$17hb2079287f8a61440E{{closure}}>_ZN115_$LT$core..iter..adapters..skip_while..SkipWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next5check28_$u7b$$u7b$closure$u7d$$u7d$17h85547fee9a963e13Erfind_ZN4core4iter6traits12double_ended19DoubleEndedIterator5rfind5check28_$u7b$$u7b$closure$u7d$$u7d$17hf67682b9ce78ace1E_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17hbdb3d21a686dee13E_ZN4core4iter6traits8iterator8Iterator8try_fold17hb96c2eb32e8eb762Etry_fold>_ZN4core4iter6traits8iterator8Iterator4find17h517875667d6b4c56E_ZN115_$LT$core..iter..adapters..skip_while..SkipWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hb08f33da640d5dd9Enext_ZN5alloc3str21_$LT$impl$u20$str$GT$12to_lowercase26case_ignoreable_then_cased17h6cf924787c2957a4Ecase_ignoreable_then_cased_ZN115_$LT$core..iter..adapters..skip_while..SkipWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next5check28_$u7b$$u7b$closure$u7d$$u7d$17h768db014df9b7e3cE_ZN4core4iter6traits8iterator8Iterator4find5check28_$u7b$$u7b$closure$u7d$$u7d$17h856c03c8c67c8750E_ZN5alloc3str21_$LT$impl$u20$str$GT$12to_lowercase26case_ignoreable_then_cased28_$u7b$$u7b$closure$u7d$$u7d$17hb2989be3464841a6E{{closure}}_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$6repeat17hbd2e1808bfcfe64eErepeat_ZN4core6option15Option$LT$T$GT$6expect17h9bf37420d4217a7fEexpect_ZN5alloc3vec12Vec$LT$T$GT$3new17h02da0ea389a95f77E_ZN97_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..iter..traits..collect..Extend$LT$$RF$T$GT$$GT$6extend17habecdebd4756cbdcE_ZN5alloc3vec16Vec$LT$T$C$A$GT$7set_len17h66f852331867bba7E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17h6a1644075cd08666E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h776b0b656b50c49fE_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h119abd2053ed7924E_ZN4core5slice4iter13Iter$LT$T$GT$3new17h7bb55d0616ace7dfEnew_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hda5a204bfe1bb2aaEiter_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h54f1dd8f21f563f6E_ZN104_$LT$core..iter..adapters..cloned..Cloned$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h92c79f218fa5843aEnext,u16>_ZN99_$LT$core..char..decode..DecodeUtf16$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h9a4479227dbfe34bEnext>>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17hcbc4334fd3e6344fE_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17hc526571ccc299aacE_ZN4core6option15Option$LT$T$GT$3map17h7d99101d2a246093Emap<&u16,u16,closure-0>_ZN4core6option19Option$LT$$RF$T$GT$6cloned17hada9518c4cdf79b5Ecloned_ZN5alloc3vec16Vec$LT$T$C$A$GT$14into_raw_parts17h3abc841bebd21915Einto_raw_parts_ZN5alloc3vec16Vec$LT$T$C$A$GT$11try_reserve17hfb2e73ac55941828E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h48dec854eafd5cdfEfrom_error<(),alloc::collections::TryReserveError>_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$17try_reserve_exact17hfe576b234127ee7dE_ZN5alloc3vec16Vec$LT$T$C$A$GT$17try_reserve_exact17ha95841ef14358f93E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$10grow_exact17h13959f101c5f9befE_ZN5alloc3vec16Vec$LT$T$C$A$GT$4push17h9da07d784f886f29E_ZN4core3ptr5write17he2c00572f3314ec9E_ZN4core10intrinsics4copy17h5ba161691d03cf20E_ZN81_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..index..Index$LT$I$GT$$GT$5index17h7db88442ea3527bbEFromUtf8Error_ZN67_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..clone..Clone$GT$5clone17he8f4d82950db0d99E_ZN52_$LT$T$u20$as$u20$alloc..slice..hack..ConvertVec$GT$6to_vec17h67e3189756844aa3E_ZN5alloc5slice4hack6to_vec17h665203fd98bcfee8E_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$9to_vec_in17hb0c9b65a927aa85aE_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$22copy_to_nonoverlapping17hd4fd7cdc4e237703E_ZN67_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..clone..Clone$GT$10clone_from17h97c8515f276ea0c9Eclone_from_ZN75_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..deref..DerefMut$GT$9deref_mut17hf8fdc909a9b959eaE_ZN5alloc3str21_$LT$impl$u20$str$GT$11into_string17hf465ac438712b6a5E_ZN5alloc3vec16Vec$LT$T$C$A$GT$13shrink_to_fit17h53a0c5ed814b705fE_ZN5alloc3vec16Vec$LT$T$C$A$GT$16into_boxed_slice17h748d79eaf8a3c8b8E_ZN5alloc6string6String14into_boxed_str17h0996e8df197d8624Einto_boxed_str_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$6shrink17hb31ee9607918a9b8E_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$13shrink_to_fit17h7af1e136d65e68b4E_ZN4core6result19Result$LT$T$C$E$GT$7map_err17h55802e00ef26cabbE_ZN5alloc6borrow12Cow$LT$B$GT$10into_owned17h8686a0ff2572c689E_ZN5alloc5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$6to_vec17h346f1610cb85f210E_ZN5alloc5slice64_$LT$impl$u20$alloc..borrow..ToOwned$u20$for$u20$$u5b$T$u5d$$GT$8to_owned17hcefee94d4738d064E_ZN4core5slice4iter13Iter$LT$T$GT$10make_slice17hb008cbbd2528a1c7E_ZN4core5slice4iter13Iter$LT$T$GT$8as_slice17h9903c44941c84cb9EDrain_ZN5alloc6string5Drain6as_str17h99fda3a643ad0df7E_ZN5alloc3vec16Vec$LT$T$C$A$GT$5drain17hd5be7647058371a7Edrain>_ZN150_$LT$$LT$alloc..vec..drain..Drain$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h9ad2b7ec500e1c34E_ZN4core3ptr149drop_in_place$LT$$LT$alloc..vec..drain..Drain$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$u8$C$alloc..alloc..Global$GT$$GT$17h1e94e263e124d4f6E_ZN79_$LT$alloc..vec..drain..Drain$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h81a72e09623c957dE_ZN4core3ptr55drop_in_place$LT$alloc..vec..drain..Drain$LT$u8$GT$$GT$17h2656d746b58d1347E_ZN102_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17h471c02677f21c126E_ZN81_$LT$core..str..iter..Chars$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17hf08e2bb78e42c47bEswap_removeinsertsplit_off_ZN87_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$core..convert..From$LT$$RF$$u5b$T$u5d$$GT$$GT$4from17h14d2f25d7d673602E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h0007cb8163574b02E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1d2b02f91228ebaeE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7031ef0d6a288ed8Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h821594cbaf0e12dfE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h93dfffaddcf5584bE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hae2d876702271444E_ZN4core3ptr27drop_in_place$LT$$RF$u8$GT$17h33f88f1c3c3d1d44Edrop_in_place<&u8>_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h7b484d17c96f2743E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h727717b78fdc9466E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h2caae7f730c4946eE_ZN5alloc5alloc18handle_alloc_error17h35a88ac649661df0Ehandle_alloc_error__rdl_oom__rg_oom_ZN71_$LT$alloc..boxed..Box$LT$str$GT$$u20$as$u20$core..default..Default$GT$7default17h5c2199a3b9de0f36E_ZN67_$LT$alloc..boxed..Box$LT$str$GT$$u20$as$u20$core..clone..Clone$GT$5clone17ha0ee88f9faf9f920E_ZN92_$LT$alloc..borrow..Cow$LT$str$GT$$u20$as$u20$core..ops..arith..AddAssign$LT$$RF$str$GT$$GT$10add_assign17h7281b1415ff7ca76E_ZN77_$LT$alloc..borrow..Cow$LT$str$GT$$u20$as$u20$core..ops..arith..AddAssign$GT$10add_assign17hf0e55a73d2dfc303E_ZN93_$LT$alloc..collections..btree..mem..replace..PanicGuard$u20$as$u20$core..ops..drop..Drop$GT$4drop17h3f821e8265768661E_ZN5alloc11collections5btree4node10splitpoint17hbf6dd21b49eeb284Esplitpoint_ZN5alloc11collections9vec_deque17VecDeque$LT$T$GT$9wrap_copy4diff17h469cef5b19e35010Ediff_ZN74_$LT$alloc..collections..TryReserveError$u20$as$u20$core..fmt..Display$GT$3fmt17h1a80c161c4385d77E_ZN5alloc3fmt6format17h9c80dc3b228e2897Eformat_ZN5alloc7raw_vec11finish_grow17h00613e62b1566f7aE_ZN5alloc7raw_vec17capacity_overflow17h45670d7795721de0Ecapacity_overflow_ZN5alloc3str56_$LT$impl$u20$alloc..borrow..ToOwned$u20$for$u20$str$GT$10clone_into17h094ba77648852253E_ZN5alloc3str21_$LT$impl$u20$str$GT$12to_lowercase17h8f83984f910340a7E_ZN5alloc3str21_$LT$impl$u20$str$GT$12to_uppercase17hbd44c4d7b7708921Eto_uppercase_ZN5alloc3str21_$LT$impl$u20$str$GT$6repeat17h57a2401efc3e81ddE_ZN5alloc6string6String15from_utf8_lossy17h23e30baf5012b3caEfrom_utf8_lossy_ZN5alloc6string6String10from_utf1617hc9e2209882722ef3Efrom_utf16_ZN5alloc6string6String14into_raw_parts17h0d0a99b96e9d2852Einto_raw_parts_ZN5alloc6string6String11try_reserve17hd4ceb938e36d7031Etry_reserve_ZN5alloc6string6String17try_reserve_exact17h1dd08538bea88389Etry_reserve_exact_ZN5alloc6string6String12insert_bytes17hb5c54fe56805c4cdEinsert_bytes_ZN5alloc6string13FromUtf8Error8as_bytes17hadfa26896baedcc8E_ZN5alloc6string13FromUtf8Error10into_bytes17h8cfac235110cc45fE_ZN5alloc6string13FromUtf8Error10utf8_error17he5baafed92196a45E_ZN67_$LT$alloc..string..FromUtf8Error$u20$as$u20$core..fmt..Display$GT$3fmt17ha9443bbc89db4e01E_ZN68_$LT$alloc..string..FromUtf16Error$u20$as$u20$core..fmt..Display$GT$3fmt17hffc63419fc8eced2E_ZN60_$LT$alloc..string..String$u20$as$u20$core..clone..Clone$GT$5clone17hdbd8a6864f20aaceE_ZN60_$LT$alloc..string..String$u20$as$u20$core..clone..Clone$GT$10clone_from17h5004be7731ccd8dcEclone_from_ZN73_$LT$$RF$alloc..string..String$u20$as$u20$core..str..pattern..Pattern$GT$13into_searcher17h5115c66f2482d8a1E_ZN97_$LT$alloc..string..String$u20$as$u20$core..convert..From$LT$alloc..boxed..Box$LT$str$GT$$GT$$GT$4from17hdd48a570dc8a6846E_ZN5alloc6string107_$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$str$GT$$GT$4from17h38895f971ae256acE_ZN98_$LT$alloc..string..String$u20$as$u20$core..convert..From$LT$alloc..borrow..Cow$LT$str$GT$$GT$$GT$4from17hf524fa3174f37b74E_ZN5alloc6string104_$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$4from17h2ac43fe76d4b8367E_ZN57_$LT$alloc..string..Drain$u20$as$u20$core..fmt..Debug$GT$3fmt17h0aa0421c4cd45b87E_ZN62_$LT$alloc..string..Drain$u20$as$u20$core..ops..drop..Drop$GT$4drop17hc0f2afa8f21c91e6E_ZN79_$LT$alloc..string..Drain$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h6cef8f98def1b455E_ZN5alloc3vec16Vec$LT$T$C$A$GT$11swap_remove13assert_failed17h0e2bb223494b0181Eassert_failed_ZN5alloc3vec16Vec$LT$T$C$A$GT$6insert13assert_failed17h2824cf701b43edd6E_ZN5alloc3vec16Vec$LT$T$C$A$GT$6remove13assert_failed17h9cc7fd73decf979cE_ZN5alloc3vec16Vec$LT$T$C$A$GT$9split_off13assert_failed17ha205791c54e33f66E_ZN80_$LT$alloc..vec..Vec$LT$u8$GT$$u20$as$u20$core..convert..From$LT$$RF$str$GT$$GT$4from17ha12250e131636f0aE_ZN57_$LT$alloc..alloc..Global$u20$as$u20$core..fmt..Debug$GT$3fmt17h3fe95144d085220fE_ZN72_$LT$alloc..collections..TryReserveError$u20$as$u20$core..fmt..Debug$GT$3fmt17h8f0023caae858f4fE_ZN65_$LT$alloc..string..FromUtf8Error$u20$as$u20$core..fmt..Debug$GT$3fmt17hdd7b4419d4ffabd8E_ZN66_$LT$alloc..string..FromUtf16Error$u20$as$u20$core..fmt..Debug$GT$3fmt17h5ad05c8be19c5673Elibrary/core/src/lib.rs_ZN4core3ptr13read_volatile17hcaeeb7855a93ef24Eread_volatileUSIZE_MARKER_ZN4core3fmt12USIZE_MARKER28_$u7b$$u7b$closure$u7d$$u7d$17h0fc614ed6b18b98dEf32_ZN4core3f3221_$LT$impl$u20$f32$GT$7to_bits17h3dc8351dba224e7fEto_bitsf64_ZN4core3f6421_$LT$impl$u20$f64$GT$7to_bits17h12755c30070ff4eaEdec2fltalgorithm_ZN4core3num21_$LT$impl$u20$i16$GT$3abs17hbcab787798df77e4Eabs_ZN4core3cmp6min_by17h1645194b2d63da07E_ZN4core3cmp3Ord3min17hdd6b50f084db51d1E_ZN4core3cmp3min17h87e4e652a729b8bfEbignumBig32x40_ZN4core3num6bignum8Big32x407get_bit17ha0653e291a976457Eget_bit_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17h0bf75b0d411aaeceE_ZN4core3num6bignum8Big32x4010from_small17h990dbe9ae9847db3Efrom_small_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h1c1dd0a334f9f4bbE_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17he5b49f08637a9fcdE_ZN4core5slice4iter13Iter$LT$T$GT$3new17h81db886277cc9ce3E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hb75c712129b76290E_ZN4core5slice4iter87_$LT$impl$u20$core..iter..traits..collect..IntoIterator$u20$for$u20$$RF$$u5b$T$u5d$$GT$9into_iter17ha8c56db671701503Einto_iter_ZN4core4iter6traits8iterator8Iterator5chain17h69d5fe9105165c48Echain,&[u8]>chain_ZN106_$LT$core..iter..adapters..chain..Chain$LT$A$C$B$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hc11410901f942761Enext,core::slice::iter::Iter>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h05836a60a0e6540cE_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h0c50b131f8045207E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hbda8889c62ad52a6E_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h899c5217f526fed9Eindex_mut_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h496ecb9ba72effcaE_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h4f7eff05f0a1b6a1Eindex_mut>_ZN4core5array88_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$9index_mut17hd19617ab37988d1aE_ZN4core3num6bignum8Big32x409mul_small17hcc30f2c6ed7573ffEmul_small_ZN94_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h78d979cc8eadb56dEnext_ZN50_$LT$u32$u20$as$u20$core..num..bignum..FullOps$GT$8full_mul17h1f89d605d3f5e0e8Efull_mul_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h00faea33f689cf90Eoffset_ZN4core5slice4iter16IterMut$LT$T$GT$14post_inc_start17h1797a2b6f9a504fdEpost_inc_start_ZN4core3num6bignum8Big32x409add_small17h8e96c06d2d7532b4Eadd_small_ZN4core3num6bignum8Big32x406digits17hdf473f5569a6be97E_ZN4core3num6bignum8Big32x4010bit_length17h398509066052a03fEbit_length_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hdfe045f4439b7747Eindex_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h49d86e68fd6e3f7fE_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h9d7950452e2917b9Eindex>_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h36ecb97961072cfdE_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h6d7509a74eff41d9Enext_back_ZN4core4iter6traits12double_ended19DoubleEndedIterator9try_rfold17h624defa4beeb0d27Etry_rfold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h2b4b88dc779a1f9eEtry_fold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hc83514f12c08eb29Etry_fold>,closure-0,usize,closure-0,core::result::Result>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17ha099e8241ae5b4ceEfold>,closure-0,usize,fn(usize, &u32) -> usize>_ZN4core4iter6traits8iterator8Iterator5count17hcf1d3645fa661b47Ecount>, closure-0>>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold5check28_$u7b$$u7b$closure$u7d$$u7d$17hc5b3c26f209ab5a9E{{closure}}<&u32,usize,core::result::Result,closure-0,closure-0>_ZN4core3num6bignum8Big32x4010bit_length28_$u7b$$u7b$closure$u7d$$u7d$17hbcbc7824d7eda552E_ZN4core4iter6traits8iterator8Iterator5count4add117h8aeaa84013b101d5Eadd1<&u32>_ZN4core3ops8function5FnMut8call_mut17h7856903cbb7c5f67Ecall_mut usize,(usize, &u32)>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold2ok28_$u7b$$u7b$closure$u7d$$u7d$17h93bac766940590beE{{closure}} usize>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17h78dca06efbd1aa08Eis_empty_ZN4core4iter5range116_$LT$impl$u20$core..iter..traits..double_ended..DoubleEndedIterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$9next_back17ha6b4dfd34bbebb82E_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hc862a0a76d83535cEDecimal_ZN4core3num7dec2flt5parse10eat_digits17h7d6e127881cf159dEeat_digits_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h2066b0b0d7c37b9cE_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h4877fd7bcdf5d7cbE_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h6ebc11441aed967dE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$5first17h261d6621bfb0c1d1E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17h8b8fade5ef0b85a8E_ZN4core3num7dec2flt5parse9parse_exp17hb8a81a2b3f86d3a9Eparse_exp_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h7fceb3e21eef3598E_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h45d27b515c1ed939E_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hf8861b08e0e0a5a3E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hb247bea6d2e43e46E_ZN70_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..cmp..PartialEq$GT$2eq17h466d4306921d5e44Eeq<&u8>_ZN4core3cmp5impls53_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$u8$GT$2eq17hfe8d45ec38e4b7ebE_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17h96d4fdb9cc7eefc4E_ZN4core3num7dec2flt3num18from_str_unchecked17h36e3879b7cad287cEfrom_str_unchecked<&[u8]>rawfpUnpacked_ZN59_$LT$f32$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$14integer_decode17h7685c25ad7440dd8Einteger_decode_ZN4core3f3221_$LT$impl$u20$f32$GT$9from_bits17hfd085dd6cd97975cEfrom_bits_ZN59_$LT$f64$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$14integer_decode17h306f281d4f4dd5cbE_ZN4core3f6421_$LT$impl$u20$f64$GT$9from_bits17hc55131df93e7431cE_ZN4core3num7dec2flt3num8get_bits17h99e2e3da24ffa02eEget_bitsdiy_floatFp_ZN4core3num9diy_float2Fp9normalize17h7c7ec8038cc34ae8Enormalize_ZN4core3num7dec2flt3num21compare_with_half_ulp17h5b6be964b5f2c513Ecompare_with_half_ulpParseFloatError_ZN4core3num7dec2flt15ParseFloatError13__description17h8f4c1536504f169dE__description_ZN42_$LT$str$u20$as$u20$core..fmt..Display$GT$3fmt17hba1ddec6fae90f51E_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17hb2f9f14abf73acabEflt2decdecoder_ZN4core3num21_$LT$impl$u20$u64$GT$13leading_zeros17hf710d67225df7f75Eestimator_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$10as_mut_ptr17hc12691c13683ee15Eas_mut_ptr_ZN4core5slice4iter16IterMut$LT$T$GT$3new17h90fece30a2c7f05bEnew_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8iter_mut17h8127db93a076bf24Eiter_mut_ZN4core5slice4iter95_$LT$impl$u20$core..iter..traits..collect..IntoIterator$u20$for$u20$$RF$mut$u20$$u5b$T$u5d$$GT$9into_iter17h34f71aeb2efcec0bEinto_iterstrategydragon_ZN4core3num7flt2dec9estimator23estimate_scaling_factor17he302b29bac4dfff2Eestimate_scaling_factor_ZN4core3num6bignum8Big32x408from_u6417he185b9f65de11f9cEfrom_u64_ZN66_$LT$core..num..bignum..Big32x40$u20$as$u20$core..clone..Clone$GT$5clone17hab5ffe9463339a93E_ZN4core3num6bignum8Big32x403add17h2110f9df7bdfa89eE_ZN4core3cmp6max_by17h97f454ec86290476E_ZN4core3cmp3Ord3max17h1744d7868ba95201E_ZN4core3cmp3max17h31f679a7e0bd578cE_ZN111_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..adapters..zip..ZipImpl$LT$A$C$B$GT$$GT$4next17h0bfe36ef1147793cEnext,core::slice::iter::Iter>_ZN102_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h9dff3e146cb5cd42E_ZN50_$LT$u32$u20$as$u20$core..num..bignum..FullOps$GT$8full_add17hc9bc05de9915ae02Efull_add_ZN62_$LT$core..num..bignum..Big32x40$u20$as$u20$core..cmp..Ord$GT$3cmp17h043c80fa4b4eed60E_ZN4core4iter6traits8iterator8Iterator6cmp_by17h80027fcd41964059Ecmp_by>>,core::iter::adapters::rev::Rev>>,closure-0>_ZN4core4iter6traits8iterator8Iterator3cmp17h85c4940affb19503Ecmp>>,core::iter::adapters::rev::Rev>>>_ZN119_$LT$core..iter..adapters..cloned..Cloned$LT$I$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17ha994eb8ec2535753Enext_back,u32>_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hd13edc9d4dd409d6Enext>>_ZN4core6option15Option$LT$T$GT$3map17h154e30b7d6cdb666Emap<&u32,u32,closure-0>_ZN4core6option19Option$LT$$RF$T$GT$6cloned17h7acf2b891a8d76b2Ecloned_ZN4core4iter6traits8iterator8Iterator3cmp28_$u7b$$u7b$closure$u7d$$u7d$17h11ebb0aa66ad766aE{{closure}}>>,core::iter::adapters::rev::Rev>>>_ZN4core3cmp5impls48_$LT$impl$u20$core..cmp..Ord$u20$for$u20$i32$GT$3cmp17h2446f78ec1e7d39bE_ZN4core3cmp5impls55_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$i32$GT$11partial_cmp17h0a835b886376d8e6E_ZN61_$LT$core..cmp..Ordering$u20$as$u20$core..cmp..PartialOrd$GT$11partial_cmp17h437731948ae0d1f3E_ZN4core3cmp10PartialOrd2lt17h3df11c049117ba8dElt_ZN69_$LT$core..num..bignum..Big32x40$u20$as$u20$core..cmp..PartialOrd$GT$11partial_cmp17he80079863b0fd00eE_ZN4core3cmp10PartialOrd2ge17hb34d8feef5b3debdEge_ZN4core3num7flt2dec8strategy6dragon15div_rem_upto_1617h0cd517c57c5022eaEdiv_rem_upto_16_ZN4core3num6bignum8Big32x403sub17hc1a01a055137ad13E_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hb526f7a406efecddEindex>_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h217645a1abf9e621E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h763aacd763758005Eindex,core::ops::range::RangeTo>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h26a415774c1b3627Eindex_mut>_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17hac30db2c1ab0c43eE_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h2e2e41767c49553cEindex_mut,core::ops::range::RangeTo>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17hd47a49ad9a5db680E_ZN4core3num7flt2dec8round_up17h58935a71a86e95d4E_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h912cbd3867b5620dE_ZN4core3num7flt2dec8round_up28_$u7b$$u7b$closure$u7d$$u7d$17h00bac44e594ca69cE_ZN4core3num7flt2dec8strategy6dragon10div_2pow1017h29b2b2091efd1df1Ediv_2pow10_ZN4core3num6bignum8Big32x4013div_rem_small17h0a4ed0be59c16ceeEdiv_rem_small_ZN109_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h2b708604dde4a8d6E_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h40419fcd507d1fa2Enext>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h63fa7243d11899d2Eadd_ZN50_$LT$u32$u20$as$u20$core..num..bignum..FullOps$GT$12full_div_rem17hc271571d33115ccbEfull_div_rem_ZN4core5slice4iter16IterMut$LT$T$GT$11pre_dec_end17h863c96a6c56386fbEpre_dec_end_ZN4core3num6bignum8Big32x407is_zero17h0c7cd4f322aa0088E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$3all17hbb80e09576c8a50eEall_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h776ceb26404f9c5dE_ZN4core3num6bignum8Big32x407is_zero28_$u7b$$u7b$closure$u7d$$u7d$17h86fa2c665e4f1073E_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hdfd5214d7b18a72bEindex_mut,core::ops::range::Range>_ZN94_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hf6b9a7e48e5235c2Enext>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17ha963e0ded540f8bdEoffset>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h8f1ed1748b1e2f45Eadd>_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h6a0fde896b144a1dEget_unchecked_mut>grisu_ZN4core3num9diy_float2Fp12normalize_to17h3944e9e1df8bbe1aEnormalize_to_ZN4core3num7flt2dec8strategy5grisu12cached_power17he2e2bb972cc13d54Ecached_power_ZN4core3num9diy_float2Fp3mul17h9053f6ae1632dedaE_ZN4core3num7flt2dec8strategy5grisu22max_pow10_no_more_than17habfcd73c6bcdfc9dEmax_pow10_no_more_thanformat_shortest_opt_ZN4core3num7flt2dec8strategy5grisu19format_shortest_opt14round_and_weed17h466f7c48e87629c3Eround_and_weed_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8is_empty17h073edbc1d8e8b0c2Eis_empty>format_exact_optPart_ZN4core3num7flt2dec4Part3len17h483389dfcf505199E_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17h3dd2a64a1b15688fE_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17hf31f895c9644a9b2E_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17hec1c766106bf41eeEindex_mut>_ZN4core10intrinsics19copy_nonoverlapping17hfea80e97d011d098E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17h8694ea8e77db371fE_ZN109_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hd1354dc171fa759aE_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0ce14ed5ce2c15ceEnext>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$3add17h448d84b8af246348E_ZN4core5slice4iter16IterMut$LT$T$GT$3new17hc5cec04cd9ae7aafE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8iter_mut17h61716c368dffa1bdEiter_mut_ZN4core5slice4iter16IterMut$LT$T$GT$11pre_dec_end17hdd9f7cb728ba4e69E_ZN94_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hc41ca0bf68babcdaE_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h7149e9e69f7710d1EnextFormatted_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$9index_mut17hf5c639d46c75fbc3E_ZN4core5slice5index77_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$9index_mut17h713bc614d5b00c3dE_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h63b461a9a57ad1f7E_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$17get_unchecked_mut17h7c2124e7465ac912E_ZN4core6option15Option$LT$T$GT$5ok_or17h61a956ccd4f85826Eok_or_ZN69_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..ops..try..Try$GT$11into_result17h01fa2f4ea797decdEinto_result_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h7b5f34bc190aa53eEindex>_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hdfec466444713758E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h5c0a75e0744fe471Eindex,core::ops::range::RangeTo>TryFromIntErrorParseIntError_ZN4core3num5error13ParseIntError13__description17h46368f5503069c81E_ZN55_$LT$usize$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17ha5b6650780febea1E_ZN55_$LT$usize$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17h752554b92088db00E_ZN4core3num23_$LT$impl$u20$isize$GT$15overflowing_mul17h7ddad853e642be9aE_ZN4core3num23_$LT$impl$u20$isize$GT$11checked_mul17h33abbcf5b8bc8f14E_ZN55_$LT$isize$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17h33bfef7d395cfff4E_ZN55_$LT$isize$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17heaa918fdd4a7e33cE_ZN4core3num23_$LT$impl$u20$isize$GT$15overflowing_add17hfd30b7e2dbced3afE_ZN4core3num23_$LT$impl$u20$isize$GT$11checked_add17h85303b7ba613e966E_ZN55_$LT$isize$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_sub17hf0558a18335e3e47E_ZN4core3num23_$LT$impl$u20$isize$GT$15overflowing_sub17hb0ae1dea0b207917E_ZN4core3num23_$LT$impl$u20$isize$GT$11checked_sub17h8f31e51b17fd9272E_ZN4core3num21_$LT$impl$u20$u16$GT$15overflowing_mul17hccc3858fab61a60fE_ZN4core3num21_$LT$impl$u20$u16$GT$11checked_mul17h3cea68f21596fb44E_ZN53_$LT$u16$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17h27ac497c6e960a3fE_ZN4core3num21_$LT$impl$u20$u16$GT$15overflowing_add17h9add73efc6580402E_ZN4core3num21_$LT$impl$u20$u16$GT$11checked_add17h52eb91761f82ff49E_ZN53_$LT$u16$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17h3d220761f417c65eE_ZN53_$LT$u32$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17hf361d3a8e295cf0eE_ZN53_$LT$u32$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17ha967dbb457f01f34E_ZN4core3num20_$LT$impl$u20$u8$GT$15overflowing_mul17hd2f7f0a9f19d5afaE_ZN4core3num20_$LT$impl$u20$u8$GT$11checked_mul17h3397aec62206264eE_ZN52_$LT$u8$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17h79a33bb531922ddfE_ZN4core3num20_$LT$impl$u20$u8$GT$15overflowing_add17h32c12b156af9eeaeE_ZN4core3num20_$LT$impl$u20$u8$GT$11checked_add17h485da680709fe381E_ZN52_$LT$u8$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17he0efd18db5001012E_ZN4core3num22_$LT$impl$u20$u128$GT$15overflowing_mul17hc0c754c68f1e75e9E_ZN4core3num22_$LT$impl$u20$u128$GT$11checked_mul17h7125e3f87bf261afE_ZN54_$LT$u128$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17hd5c8e7035d9d3370E_ZN54_$LT$u128$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17hca43cccf2f935342E_ZN4core3num22_$LT$impl$u20$u128$GT$15overflowing_add17h0d65da9bb4f8f936E_ZN4core3num22_$LT$impl$u20$u128$GT$11checked_add17h18548092d467e3d3E_ZN4core3num21_$LT$impl$u20$i32$GT$15overflowing_mul17h17383691a6ffb8e7E_ZN4core3num21_$LT$impl$u20$i32$GT$11checked_mul17h9f75ea4f0923a29aE_ZN53_$LT$i32$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17hfc96b0cc46382369E_ZN4core3num21_$LT$impl$u20$i32$GT$15overflowing_add17h1700a81e640f5cd1E_ZN4core3num21_$LT$impl$u20$i32$GT$11checked_add17h8bce18e14643f32bE_ZN53_$LT$i32$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17h3125df5d04949a5bE_ZN4core3num21_$LT$impl$u20$i32$GT$15overflowing_sub17he462df7cb3b9c42eE_ZN4core3num21_$LT$impl$u20$i32$GT$11checked_sub17hfc94e158b63d5464E_ZN53_$LT$i32$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_sub17h36a58eefb5039f9dE_ZN4core3num20_$LT$impl$u20$i8$GT$15overflowing_mul17hec2a91d69cc99bd3E_ZN4core3num20_$LT$impl$u20$i8$GT$11checked_mul17h595f3b9b4ba5f517E_ZN52_$LT$i8$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17h25dca31dc3b17537E_ZN4core3num20_$LT$impl$u20$i8$GT$15overflowing_add17h23a1089a849046cbE_ZN4core3num20_$LT$impl$u20$i8$GT$11checked_add17h801d8442f6ad38bdE_ZN52_$LT$i8$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17h9ae903f6debbf14bE_ZN4core3num20_$LT$impl$u20$i8$GT$15overflowing_sub17hc1084f76847d8377E_ZN4core3num20_$LT$impl$u20$i8$GT$11checked_sub17hb82ccb43a5b77c67E_ZN52_$LT$i8$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_sub17h8bc7146b6f0640f2E_ZN4core3num22_$LT$impl$u20$i128$GT$15overflowing_mul17h40732b4a058b4065E_ZN4core3num22_$LT$impl$u20$i128$GT$11checked_mul17h8013ac51fb0756faE_ZN54_$LT$i128$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17hf8e34c7000e17d07E_ZN54_$LT$i128$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_sub17hbae38fa47d461336E_ZN4core3num22_$LT$impl$u20$i128$GT$15overflowing_sub17h246fd55b29c405c8E_ZN4core3num22_$LT$impl$u20$i128$GT$11checked_sub17h4123e0c216fb5c9aE_ZN54_$LT$i128$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17heb1a85331dd57155E_ZN4core3num22_$LT$impl$u20$i128$GT$15overflowing_add17h11a781fdb22e59b1E_ZN4core3num22_$LT$impl$u20$i128$GT$11checked_add17hb69135004fc3dcc2E_ZN4core3num21_$LT$impl$u20$i16$GT$15overflowing_mul17h42668ade3b360380E_ZN4core3num21_$LT$impl$u20$i16$GT$11checked_mul17h9f4505f76aa322abE_ZN53_$LT$i16$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17hf920bbbaf5858caaE_ZN4core3num21_$LT$impl$u20$i16$GT$15overflowing_add17h25d233ed1dac368fE_ZN4core3num21_$LT$impl$u20$i16$GT$11checked_add17h6485a6666b4a6545E_ZN53_$LT$i16$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17h9f27042280b44956E_ZN4core3num21_$LT$impl$u20$i16$GT$15overflowing_sub17h6df59907b5e43efaE_ZN4core3num21_$LT$impl$u20$i16$GT$11checked_sub17h8e1314dfcd212341E_ZN53_$LT$i16$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_sub17h46248729a464fb95EFormatter_ZN4core3fmt9Formatter9write_fmt17hf51714c6357b86a2Eescape_default_ZN4core5ascii14escape_default6hexify17hf2dc19e6e1a8421aEhexify_ZN4core10intrinsics19copy_nonoverlapping17h1e60d2faff6c8b3aE_ZN4core3ptr23swap_nonoverlapping_one17hfb817a2c7cb39468E_ZN4core3mem4swap17h8d995ab75b14a91aE_ZN4core3mem7replace17hfecd1910aef73074E_ZN85_$LT$core..ascii..EscapeDefault$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next28_$u7b$$u7b$closure$u7d$$u7d$17h6496a7e506c0dcefE_ZN4core6option15Option$LT$T$GT$3map17he24abc5ae2f63f2aEmap_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$9size_hint17h94ab7540755ca387Esize_hint_ZN100_$LT$core..ascii..EscapeDefault$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hd21c64d9f3eba5dcE_ZN100_$LT$core..ascii..EscapeDefault$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back28_$u7b$$u7b$closure$u7d$$u7d$17h5247bb4a92149175E_ZN4core6option15Option$LT$T$GT$3map17h7abdf2a1b33c3c34E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h81a22a453a1b85ffE_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h9053ec927ad07934E_ZN4core3fmt9Formatter9write_str17hd670d910ce02872fE_ZN4core3fmt8builders16debug_struct_new17he4f79bbb6102088bEdebug_struct_new_ZN4core3fmt9Formatter12debug_struct17hba584b36b0ade431Edebug_structParseCharError_ZN4core4char7convert14ParseCharError13__description17h12baa0e72a10f817EDecodeUtf16Error_ZN4core4char7convert10from_digit17h091e63264a76f4a2Efrom_digit_ZN57_$LT$core..fmt..Formatter$u20$as$u20$core..fmt..Write$GT$10write_char17hf9e47c6882cda77fE_ZN84_$LT$core..char..EscapeUnicode$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h98e5e8c9fd9a1ce3E_ZN4core4iter6traits8iterator8Iterator3nth17h090dd0f0eb745241Enth_ZN4core4iter6traits8iterator8Iterator10advance_by17he4ec66de0ab43178Eadvance_by_ZN84_$LT$core..char..EscapeUnicode$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4last17hc55fd02938139f23Elast_ZN69_$LT$core..char..EscapeDefaultState$u20$as$u20$core..clone..Clone$GT$5clone17hd565c54343c73a56E_ZN64_$LT$core..char..EscapeDefault$u20$as$u20$core..clone..Clone$GT$5clone17h44f25b07f2bb3b59E_ZN64_$LT$core..char..EscapeUnicode$u20$as$u20$core..clone..Clone$GT$5clone17habb6df5592fb1f68E_ZN84_$LT$core..char..EscapeDefault$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h16ceca69ab96cb9eE_ZN95_$LT$core..char..EscapeDefault$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17h5089755fc1713521E_ZN84_$LT$core..char..EscapeDefault$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h8e66f44e43478280E_ZN86_$LT$core..char..CaseMappingIter$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hfd77e2e8b2d0670cE_ZN86_$LT$core..char..CaseMappingIter$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h8f7ca5eae8d0fffaECaseMappingIter_ZN66_$LT$core..char..CaseMappingIter$u20$as$u20$core..fmt..Display$GT$3fmt17hb8440a570fcb9825EDebugStruct_ZN4core3fmt8builders11DebugStruct6finish17h018e364a0c02fd4bEfinish_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hb555d0bb65abab1bEand_then<(),core::fmt::Error,(),closure-0>_ZN4core3fmt8builders11DebugStruct9is_pretty17he96800dfaa58b58cEis_pretty_ZN4core3fmt8builders11DebugStruct6finish28_$u7b$$u7b$closure$u7d$$u7d$17hc5054a50eee3bd74E_ZN4core3fmt9Formatter9alternate17hf76beaf39e40cc25Ealternate_ZN31_$LT$dyn$u20$core..any..Any$GT$2is17h16fcf7849c45f47aE_ZN31_$LT$dyn$u20$core..any..Any$GT$12downcast_ref17h46c2eee0b7f29551E_ZN54_$LT$dyn$u20$core..any..Any$u2b$core..marker..Send$GT$12downcast_ref17hf4436e11317e9a89E_ZN58_$LT$core..any..TypeId$u20$as$u20$core..cmp..PartialEq$GT$2eq17h150fb9eeb65cc3b9E_ZN60_$LT$core..panic..Location$u20$as$u20$core..fmt..Display$GT$3fmt17h04ac48d2356e08fdELocation_ZN4core4sync6atomic11atomic_load17h68bfba62344f19bcE_ZN43_$LT$bool$u20$as$u20$core..fmt..Display$GT$3fmt17h68936f9faabe396cE_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17h6c0e695332276cb8E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h6973bec5a0fb7044E_ZN4core3str21_$LT$impl$u20$str$GT$4find17h16e7e283b99bd111E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hb9d06f3cc233c58bE_ZN4core5slice6memchr6memchr28_$u7b$$u7b$closure$u7d$$u7d$17h7798e15bdf5c3eebE_ZN4core3ptr12align_offset17h5aa1350f4067612bEalign_offset_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$12align_offset17hc5d8b8c95e040ea9E_ZN4core5slice6memchr19memchr_general_case17h169578dc8569beffEmemchr_general_case_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h3b2382850228d288E_ZN4core5slice6memchr19memchr_general_case28_$u7b$$u7b$closure$u7d$$u7d$17hdef5729d7db2fa5eE_ZN4core5slice6memchr18contains_zero_byte17h03ab21d2cf0a5bd4Econtains_zero_byte_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hbd869d66a9d2dd53E_ZN4core5slice6memchr19memchr_general_case28_$u7b$$u7b$closure$u7d$$u7d$17h6c99b8fa70bd0c5fE_ZN73_$LT$$u5b$A$u5d$$u20$as$u20$core..slice..cmp..SlicePartialEq$LT$B$GT$$GT$5equal17h680af2c53ffa16b6E_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h2b40235149f7d83bE_ZN4core3cmp5impls69_$LT$impl$u20$core..cmp..PartialEq$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2eq17hc28ad012dd610076E_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17h951646f024399ebeE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h68fa0b8b0de90a8fEfield_ZN4core3fmt8builders11DebugStruct5field28_$u7b$$u7b$closure$u7d$$u7d$17hc854979bb8256a18E_ZN4core3fmt9Formatter8wrap_buf17hf9d3cd353dde5f49Ewrap_bufPadAdapter_ZN4core3fmt8builders10PadAdapter4wrap17h87563b1913e0bbf8Ewrap_ZN4core3fmt8builders10PadAdapter4wrap28_$u7b$$u7b$closure$u7d$$u7d$17h285100ead9575ee2E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h1983da7faec6eceaEfinish_non_exhaustive_ZN4core3fmt8builders11DebugStruct21finish_non_exhaustive28_$u7b$$u7b$closure$u7d$$u7d$17hdbb2b0edbc8076e0E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h0e5ad71381d41ff2EDebugTuple_ZN4core3fmt8builders10DebugTuple9is_pretty17hf014fd10dff3c80bE_ZN4core3fmt8builders10DebugTuple5field28_$u7b$$u7b$closure$u7d$$u7d$17h8e69699212d2882aE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h9342e4b63d037360E_ZN4core3fmt8builders10DebugTuple6finish28_$u7b$$u7b$closure$u7d$$u7d$17h933c90e47b1791aeE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17he4f2427ce8a49bcfEDebugInner_ZN4core3fmt8builders10DebugInner9is_pretty17h6e3dffe5bf318db1E_ZN4core3fmt8builders10DebugInner5entry28_$u7b$$u7b$closure$u7d$$u7d$17hb1f70636c4b41894EDebugSet_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h1613f915eff44a77E_ZN4core3fmt8builders8DebugSet6finish28_$u7b$$u7b$closure$u7d$$u7d$17hd82095be0d537da3E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h46a6760a968822f4E_ZN4core3fmt8builders9DebugList6finish28_$u7b$$u7b$closure$u7d$$u7d$17haee736c948cca91dE_ZN4core3fmt8builders8DebugMap5value17h552a4a09278cfb8bE_ZN4core6result19Result$LT$T$C$E$GT$8and_then17h7a643c9ad831dd3fE_ZN4core3fmt8builders8DebugMap5value28_$u7b$$u7b$closure$u7d$$u7d$17hc7fa9bfc51480df3E_ZN4core3fmt8builders8DebugMap9is_pretty17hd1a9172f94e20155E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17ha5ec24e8de96b617E_ZN4core3fmt8builders8DebugMap3key28_$u7b$$u7b$closure$u7d$$u7d$17h7aff6c43918f2d62E_ZN4core6result19Result$LT$T$C$E$GT$8and_then17hd0ff6fea75217decE_ZN4core3fmt8builders8DebugMap6finish28_$u7b$$u7b$closure$u7d$$u7d$17hbf57b2f7f7931bc6E_ZN4core3num7flt2dec7decoder6decode17h3faf20977faf4485Edecode_ZN4core3num7flt2dec18to_exact_fixed_str17h8c4e0572b9f53d9eEto_exact_fixed_str], i16) -> (&[u8], i16)>_ZN4core3f6421_$LT$impl$u20$f64$GT$8classify17h700be6fbbbed9130Eclassify_ZN59_$LT$f64$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$8classify17h1d1af8fb60636703E_ZN4core3num7flt2dec14determine_sign17h86096f9f234e7436Edetermine_sign_ZN4core3num7flt2dec20estimate_max_buf_len17h9836146daa36c253Eestimate_max_buf_len_ZN4core3num7flt2dec8strategy5grisu12format_exact17hd5ccbcfb6527a41bEformat_exact_ZN4core3ops8function5FnMut8call_mut17h1e7987e5a03a5dbeEcall_mut], i16) -> (&[u8], i16),(&core::num::flt2dec::decoder::Decoded, &mut [core::mem::maybe_uninit::MaybeUninit], i16)>_ZN4core3num7flt2dec17digits_to_dec_str17h4605772f63bfc2a2Edigits_to_dec_str_ZN4core3num7flt2dec7decoder6decode17h015c332f30ac04b0Edecode_ZN4core3num7flt2dec18to_exact_fixed_str17h7e6cf9d57fed4588Eto_exact_fixed_str], i16) -> (&[u8], i16)>_ZN4core3f3221_$LT$impl$u20$f32$GT$8classify17h0b8aeb7d606717f0E_ZN59_$LT$f32$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$8classify17h0bd2772a166426a2E_ZN4core3num7flt2dec15to_shortest_str17h7bc0215e784645f7Eto_shortest_str]) -> (&[u8], i16)>_ZN4core3num7flt2dec8strategy5grisu15format_shortest17hfd3ccba4781c92ceEformat_shortest_ZN4core3ops8function5FnMut8call_mut17h862448c0ebe6e704Ecall_mut]) -> (&[u8], i16),(&core::num::flt2dec::decoder::Decoded, &mut [core::mem::maybe_uninit::MaybeUninit])>_ZN4core3num7flt2dec15to_shortest_str17h2436408225c84587Eto_shortest_str]) -> (&[u8], i16)>_ZN4core3num7flt2dec16to_exact_exp_str17h888e641968279c04Eto_exact_exp_str], i16) -> (&[u8], i16)>_ZN4core3num7flt2dec16to_exact_exp_str17h114b18b6d78145afEto_exact_exp_str], i16) -> (&[u8], i16)>_ZN4core3num7flt2dec19to_shortest_exp_str17h29bb31603c7cbc42Eto_shortest_exp_str]) -> (&[u8], i16)>_ZN4core3num7flt2dec19to_shortest_exp_str17h0135c3236521f0daEto_shortest_exp_str]) -> (&[u8], i16)>_ZN4core3fmt3num9udiv_1e1917hf2ef9fd377df8b7bEudiv_1e19_ZN4core3fmt3num10u128_mulhi17h9029a5335b20e51bEu128_mulhi_ZN4core10intrinsics11write_bytes17h194c50cb69269eabE_ZN4core3fmt5Write10write_char17hf7abebfcdcdbc844Ewrite_char_ZN4core3fmt5Write9write_fmt17hc8a1698fd3fde6e3Ewrite_fmtArgumentV1_ZN4core3fmt10ArgumentV13new17h63c95191680ff38fEnew_ZN59_$LT$core..fmt..Arguments$u20$as$u20$core..fmt..Display$GT$3fmt17h8966b5fdeddc7196E_ZN111_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..adapters..zip..ZipImpl$LT$A$C$B$GT$$GT$3new17he17d8dcf0918a959Enew,core::slice::iter::Iter<&str>>Zip_ZN4core4iter8adapters3zip16Zip$LT$A$C$B$GT$3new17h67c563ca87e2f843E_ZN4core4iter6traits8iterator8Iterator3zip17h0b7c2bdd73daaa14Ezip,core::slice::iter::Iter<&str>>_ZN111_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..adapters..zip..ZipImpl$LT$A$C$B$GT$$GT$4next17h53cc89d35d58afd7Enext,core::slice::iter::Iter<&str>>_ZN102_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h717df772290733a8E_ZN4core3fmt3run17hf9d38970e20e468eErun_ZN4core3fmt8getcount17h46124992121220ffEgetcount_ZN4core3fmt10ArgumentV18as_usize17hc5d9042932a2e9e6Eas_usize_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h70c6d8b9a8051904Eoffset_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h1ee42e6bf84ec542Eadd_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h9958d7cd4a1ec718Eget_unchecked_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$13get_unchecked17h6f5b23a2283d4f8eEget_unchecked_ZN111_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..adapters..zip..ZipImpl$LT$A$C$B$GT$$GT$3new17h56972fcefaff029bEnew,core::slice::iter::Iter<&str>>_ZN4core4iter8adapters3zip16Zip$LT$A$C$B$GT$3new17hf331c69b4ea6612dE_ZN4core4iter6traits8iterator8Iterator3zip17h00992228cfea42baEzip,core::slice::iter::Iter<&str>>_ZN111_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..adapters..zip..ZipImpl$LT$A$C$B$GT$$GT$4next17hd93cbe470114928dEnext,core::slice::iter::Iter<&str>>_ZN102_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h2de4506b7080cb9cE_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17h9bfaa75e831c496aE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17hf380f23cbbc94798Eget<&str,usize>_ZN4core3fmt9Formatter9sign_plus17h2767eae8549a0627Esign_plus_ZN4core4iter6traits8iterator8Iterator4fold17h904537b71d58414aEfold,usize,closure-0>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17h89da0f292d288effEfold,closure-0,usize,fn(usize, usize) -> usize>_ZN56_$LT$usize$u20$as$u20$core..iter..traits..accum..Sum$GT$3sum17hc8e167b5aab06543Esum, closure-0>>_ZN4core4iter6traits8iterator8Iterator3sum17h9f5cd94ec647ad83Esum, closure-0>,usize>_ZN108_$LT$core..iter..adapters..filter..Filter$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$5count17h5e029c89f8909584Ecount,closure-0>_ZN81_$LT$core..str..iter..Chars$u20$as$u20$core..iter..traits..iterator..Iterator$GT$5count17h2707b79bd5bf8b2bE_ZN81_$LT$core..str..iter..Chars$u20$as$u20$core..iter..traits..iterator..Iterator$GT$5count28_$u7b$$u7b$closure$u7d$$u7d$17h58cfbd53be20556fEto_usize_ZN108_$LT$core..iter..adapters..filter..Filter$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$5count8to_usize28_$u7b$$u7b$closure$u7d$$u7d$17h20ce4c2fc03a5a1bE{{closure}}<&u8,closure-0>_ZN4core4iter8adapters3map8map_fold28_$u7b$$u7b$closure$u7d$$u7d$17h0ca24d26fe032464E{{closure}}<&u8,usize,usize,closure-0,fn(usize, usize) -> usize>_ZN4core3ops8function5FnMut8call_mut17hf0770d43755bab43E_ZN4core3fmt9Formatter19sign_aware_zero_pad17he0679557a6a2de58Esign_aware_zero_pad_ZN4core3fmt9Formatter7padding17h26e671d35553fea1Epadding_ZN4core3ptr23swap_nonoverlapping_one17h005e5f13fdb111f3Eswap_nonoverlapping_one_ZN4core3mem4swap17h20606a8cec4bb1b2Eswap_ZN4core3mem7replace17h7706ad797d085a5dEreplace_ZN4core10intrinsics19copy_nonoverlapping17h1a47ff6b0f2fa4f8Ecopy_nonoverlapping_ZN4core3ptr23swap_nonoverlapping_one17h2ca0210682a15d14Eswap_nonoverlapping_one_ZN4core3mem4swap17h0c7fd34e4a74c58dEswap_ZN4core3mem7replace17h7e7ab17f47dde080Ereplace_ZN4core10intrinsics19copy_nonoverlapping17hc4fc31309fdc78b2Ecopy_nonoverlappingPostPadding_ZN4core3fmt11PostPadding5write17h3400f741060dd64cEpad_integral_ZN4core6option15Option$LT$T$GT$7is_some17h0d00458edc6741aeE_ZN4core6option15Option$LT$T$GT$7is_none17h8e658527ea195174E_ZN4core4iter6traits8iterator8Iterator10advance_by17hce5eec63a666c7f1Eadvance_by_ZN4core4iter6traits8iterator8Iterator3nth17h98581092e3138f8fEnth_ZN102_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..exact_size..ExactSizeIterator$GT$3len17h364a26d660fd6fc5E_ZN4core3str11validations15next_code_point17hd029942aff2f09c0E_ZN4core3str21_$LT$impl$u20$str$GT$3get17h0a0bf8a5893bf6feEget>_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17hd8c38f92ada8fffcE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17h627242adb2637e33E_ZN4core6option15Option$LT$T$GT$9unwrap_or17h224ebfb4fa0ac9c3E_ZN68_$LT$core..num..flt2dec..Formatted$u20$as$u20$core..clone..Clone$GT$5clone17hba632b04998a137fE_ZN4core3num7flt2dec9Formatted3len17h084bc1983ce12a61E_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h7f01597398c62483Eoffset_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17h25d929aa3679994aEpost_inc_start_ZN4core5slice4iter13Iter$LT$T$GT$3new17hb67202551e72c65eEnew_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17h8de66c6d784f0882E_ZN4core5slice4iter87_$LT$impl$u20$core..iter..traits..collect..IntoIterator$u20$for$u20$$RF$$u5b$T$u5d$$GT$9into_iter17h77f7bd95df9ca379Einto_iter_ZN4core5array88_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$9index_mut17h193e54d4580ff594Ewrite_formatted_parts_ZN4core3fmt9Formatter21write_formatted_parts11write_bytes17h96a409baaaa4d7cbEwrite_bytes_ZN4core3fmt8builders15debug_tuple_new17h75287f6720fce5a8Edebug_tuple_new_ZN4core3fmt8builders14debug_list_new17hb98e5df4962e4624Edebug_list_new_ZN4core3fmt8builders13debug_set_new17h4ca9e9545c486c4fEdebug_set_new_ZN4core3fmt8builders13debug_map_new17hdc14d6cb5e40bfe7Edebug_map_new_ZN4core3str6traits66_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$str$GT$5index17h09b4d6b6925ae9f2E_ZN82_$LT$core..char..EscapeDebug$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hbff5eaac3360abfeE_ZN54_$LT$$BP$const$u20$T$u20$as$u20$core..fmt..Pointer$GT$3fmt17h8142e674c081ff92Efmt_ZN4core5slice4iter16IterMut$LT$T$GT$3new17h17c3a9af2286daa7Enew>_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8iter_mut17h779efeb4de81657dEiter_mut>GenericRadix_ZN4core3fmt3num12GenericRadix7fmt_int17h42b60a3e40943e73Efmt_int_ZN4core3fmt3num55_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$usize$GT$3fmt17hc5d551cc331a3d29E_ZN47_$LT$usize$u20$as$u20$core..ops..arith..Div$GT$3div17h2a231d76f03413f0E_ZN52_$LT$usize$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817h82f56524b78c5bf3Eto_u8_ZN73_$LT$core..fmt..num..LowerHex$u20$as$u20$core..fmt..num..GenericRadix$GT$5digit17h7f04237c58dc6e5aE_ZN4core3mem12maybe_uninit20MaybeUninit$LT$T$GT$5write17hfaf570588b72d664E_ZN4core5slice4iter16IterMut$LT$T$GT$11pre_dec_end17h099940833bcff967Epre_dec_end>_ZN109_$LT$core..slice..iter..IterMut$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hcfb988368199fc6fEnext_back>_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hbcf32e61a3246dd9Enext>>_ZN4core3cmp5impls56_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$usize$GT$2eq17h44caefb03661dafdE_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hedf7d9df0aad7080E_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h7ff5650970835343Eindex,core::ops::range::RangeFrom>_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h473b2050ad6bf17aE_ZN4core5slice6memchr11repeat_byte17h9af25c903d4d750bErepeat_byte_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$8align_to17h54873b9e92d59525Ealign_to_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h27e1731a9fee2cc8E_ZN4core5slice6memchr7memrchr28_$u7b$$u7b$closure$u7d$$u7d$17hc0c5454a63245582E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h0e0b361c484a21c2Erposition_ZN4core5slice6memchr7memrchr28_$u7b$$u7b$closure$u7d$$u7d$17h37560080af87099dEcopy_from_slice_ZN4core3str11validations19run_utf8_validation17ha854aaaaf10d994fErun_utf8_validation_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hcf023d8473544bb9Efrom_error<&str,core::str::error::Utf8Error>converts_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h57b0c8e488d6e7e3Efrom_error<&mut str,core::str::error::Utf8Error>_ZN4core3fmt9Formatter10debug_list17h021990c116ea6512Edebug_list_ZN4core3fmt8builders9DebugList7entries17h0f9abe51d85f2d70Eentries_ZN4core3fmt8builders9DebugList5entry17hbd53ecf1d93f6974E_ZN4core3fmt8builders9DebugList6finish17h436f40b918c575b5E_ZN4core3str7pattern14TwoWaySearcher14maximal_suffix17h8ec8d7ccea3a13beE_ZN4core3str7pattern14TwoWaySearcher3new17haa2069a4dc257bf3E_ZN4core4iter6traits8iterator8Iterator4fold17ha74a9e1e85ba836aEfold,u64,closure-0>_ZN4core3str7pattern14TwoWaySearcher14byteset_create17hb5463e750bab665aEbyteset_create_ZN4core3str7pattern14TwoWaySearcher22reverse_maximal_suffix17hc2e36331e8e05533Ereverse_maximal_suffix_ZN4core3str7pattern14TwoWaySearcher14byteset_create28_$u7b$$u7b$closure$u7d$$u7d$17hdc4f59498b3a2dbfEStrSearcherUtf8Lossy_ZN4core3str11validations15utf8_char_width17h730f46fc27687d9cEutf8_char_width_ZN96_$LT$core..str..lossy..Utf8LossyChunksIter$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next8safe_get17habb1fd18d4a5d46fEsafe_get_ZN4core6option15Option$LT$T$GT$9unwrap_or17he23819d690c9a263Eunwrap_or<&u8>_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h015cfbf137d2c3a7E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$13get_unchecked17h50ac7bb089e905f0Eget_unchecked_ZN4core3str11validations25truncate_to_char_boundary17h7cc984e82576806bEtruncate_to_char_boundary_ZN4core6option15Option$LT$T$GT$6unwrap17hd38136ed6f28682aE_ZN4core6option15Option$LT$T$GT$3map17h443e08217482bcdbEmap_ZN4core3str21_$LT$impl$u20$str$GT$12escape_debug28_$u7b$$u7b$closure$u7d$$u7d$17hcfa68c917d9e3a74E_ZN4core4iter6traits8iterator8Iterator5chain17h49a1369ea2b50093Echain>,core::iter::adapters::flatten::FlatMap>_ZN4core4time8Duration11checked_add17hfdfe637dbedd8266E_ZN4core6option15Option$LT$T$GT$6expect17hc4d8b4327b974da5E_ZN62_$LT$core..time..Duration$u20$as$u20$core..ops..arith..Add$GT$3add17h58c02ea635aaf9b6E_ZN4core4time8Duration11checked_sub17h596e08c2e4590dabE_ZN62_$LT$core..time..Duration$u20$as$u20$core..ops..arith..Sub$GT$3sub17hd9d6367fd357fb23E_ZN4core4time8Duration11checked_mul17h45a931172b6e2089E_ZN73_$LT$core..time..Duration$u20$as$u20$core..ops..arith..Mul$LT$u32$GT$$GT$3mul17h29c04cbed029bbdbE_ZN4core4time8Duration11checked_div17hf587259b64b8d884Echecked_div_ZN73_$LT$core..time..Duration$u20$as$u20$core..ops..arith..Div$LT$u32$GT$$GT$3div17h819aea47541cd185E_ZN4core6option15Option$LT$T$GT$9unwrap_or17hf1671216a5367e38E_ZN4core6option15Option$LT$T$GT$3map17h6f39c20b5cfa92c1Emap_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h3121e7d14bb622c8E_ZN4core7unicode9printable5check17h0d86bbde5fd0d7aaE_ZN4core3ptr8non_null16NonNull$LT$T$GT$13new_unchecked17h92c80e0456f92db0Enew_unchecked<(u8, u8)>_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17hb849cc3d28576967Epost_inc_start<(u8, u8)>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hd1621b9adc751870Enext<(u8, u8)>_ZN104_$LT$core..iter..adapters..cloned..Cloned$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h8953a22acc2d64d2E_ZN4core6option15Option$LT$T$GT$3map17h158da17d5c117c3eE_ZN4core6option19Option$LT$$RF$T$GT$6cloned17h28c0135c2f05de2eEtaskRawWakerVTablemul_digits_ZN4core3num6bignum8Big32x4010mul_digits9mul_inner17hed6ceefb8af61ff1Emul_inner_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h541662d329b1f754Enext>_ZN50_$LT$u32$u20$as$u20$core..num..bignum..FullOps$GT$12full_mul_add17hfbff8477bdc87658Efull_mul_add_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17hd8e22992b26b1667E_ZN4core3cmp5impls70_$LT$impl$u20$core..cmp..PartialOrd$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2ge17h174a89846c1f3c5dE_ZN73_$LT$$u5b$A$u5d$$u20$as$u20$core..slice..cmp..SlicePartialEq$LT$B$GT$$GT$5equal17h01d3a37f00da6443Eequal_ZN4core5slice3cmp81_$LT$impl$u20$core..cmp..PartialEq$LT$$u5b$B$u5d$$GT$$u20$for$u20$$u5b$A$u5d$$GT$2eq17h8b924c7f0f7df4cfEeq_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h4019160f18030ec5EtestsBig8x3_ZN4core5array85_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$5index17h03d274aede1e7f66E_ZN4core3num6bignum5tests6Big8x36digits17hfbb704af4a644915E_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$3all17h7379aaa6c3d48314Eall_ZN4core3num6bignum5tests6Big8x37is_zero28_$u7b$$u7b$closure$u7d$$u7d$17h53db94aea5a2c826E_ZN4core4iter6traits12double_ended19DoubleEndedIterator9try_rfold17he8891b775f7fd59fEtry_rfold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hd7543baeeb21c235Etry_fold,usize,closure-0,core::ops::control_flow::ControlFlow, usize>>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h8bf5257185b5dc82Etry_fold>,closure-0,usize,closure-0,core::result::Result>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold17h0f6c2a3b2d5e6830Efold>,closure-0,usize,fn(usize, &u8) -> usize>_ZN4core4iter6traits8iterator8Iterator5count17h9ae21354780740c6Ecount>, closure-0>>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold5check28_$u7b$$u7b$closure$u7d$$u7d$17h4c6db588af89fe31E{{closure}}<&u8,usize,core::result::Result,closure-0,closure-0>_ZN4core3num6bignum5tests6Big8x310bit_length28_$u7b$$u7b$closure$u7d$$u7d$17hb1363c1d2da5c4fdE_ZN4core4iter6traits8iterator8Iterator5count4add117h0d65837c26884f13Eadd1<&u8>_ZN4core3ops8function5FnMut8call_mut17hfd37a372660ffceaEcall_mut usize,(usize, &u8)>_ZN115_$LT$core..iter..adapters..take_while..TakeWhile$LT$I$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4fold2ok28_$u7b$$u7b$closure$u7d$$u7d$17h368f7b9b8deb246aE{{closure}} usize>_ZN4core3num6bignum5tests6Big8x37get_bit17ha0df817052611b31E_ZN4core5array88_$LT$impl$u20$core..ops..index..IndexMut$LT$I$GT$$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$9index_mut17hd719c3e7f5c71e2cE_ZN111_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..adapters..zip..ZipImpl$LT$A$C$B$GT$$GT$4next17h9bf806596487b059Enext,core::slice::iter::Iter>_ZN102_$LT$core..iter..adapters..zip..Zip$LT$A$C$B$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0c9cd93c01b978daE_ZN49_$LT$u8$u20$as$u20$core..num..bignum..FullOps$GT$8full_add17h208e0386d8a8f65aE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$10as_mut_ptr17h4c7ed869ece17c68Eas_mut_ptr_ZN4core5slice4iter95_$LT$impl$u20$core..iter..traits..collect..IntoIterator$u20$for$u20$$RF$mut$u20$$u5b$T$u5d$$GT$9into_iter17h6e615f566f3881c4E_ZN49_$LT$u8$u20$as$u20$core..num..bignum..FullOps$GT$8full_mul17h1a49437508e341e9E_ZN4core5slice4iter16IterMut$LT$T$GT$14post_inc_start17h8fc5dbdd67d4a61fE_ZN4core3num6bignum5tests6Big8x39mul_small17h2eb9b7e773f6203bE_ZN4core3num6bignum5tests6Big8x310mul_digits9mul_inner17ha4f511f8c6a722c5E_ZN110_$LT$core..iter..adapters..enumerate..Enumerate$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hbee8a5a40b0d0666Enext>_ZN49_$LT$u8$u20$as$u20$core..num..bignum..FullOps$GT$12full_mul_add17h079b3da613520e9fE_ZN49_$LT$u8$u20$as$u20$core..num..bignum..FullOps$GT$12full_div_rem17h4b26e3daeb80261fE_ZN4core3num6bignum5tests6Big8x37is_zero17ha64e3d9bff263dddE_ZN4core3num6bignum5tests6Big8x310bit_length17h5dfdaa155e180305E_ZN67_$LT$core..num..bignum..tests..Big8x3$u20$as$u20$core..cmp..Ord$GT$3cmp17hecc7d4625fe76491E_ZN74_$LT$core..num..bignum..tests..Big8x3$u20$as$u20$core..cmp..PartialOrd$GT$11partial_cmp17h45e2284587237195E_ZN4core3cmp10PartialOrd2ge17h8cd5343ffbe79dc7Ege_ZN4core3cmp5impls70_$LT$impl$u20$core..cmp..PartialOrd$LT$$RF$B$GT$$u20$for$u20$$RF$A$GT$2ge17hb704e038680f9315E_ZN119_$LT$core..iter..adapters..cloned..Cloned$LT$I$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17haea206a3017160d6Enext_back,u8>_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h5a14ecb686fe1878Enext>>_ZN4core4iter6traits8iterator8Iterator6cmp_by17hb70c6a02c6923740Ecmp_by>>,core::iter::adapters::rev::Rev>>,closure-0>_ZN4core4iter6traits8iterator8Iterator3cmp17hb06b5ea413f57007Ecmp>>,core::iter::adapters::rev::Rev>>>_ZN4core3cmp5impls47_$LT$impl$u20$core..cmp..Ord$u20$for$u20$u8$GT$3cmp17h1b1144a57c3a3938E_ZN4core4iter6traits8iterator8Iterator3cmp28_$u7b$$u7b$closure$u7d$$u7d$17hf18f44ce101baba1E{{closure}}>>,core::iter::adapters::rev::Rev>>>_ZN4core3num6bignum5tests6Big8x33sub17h097a49a69b3ef767E_ZN98_$LT$core..iter..adapters..rev..Rev$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hceb7581c2a456524E_ZN4core3fmt9Formatter11debug_tuple17hf1334483fba2fa80Edebug_tuple_ZN4core3fmt8builders10DebugTuple6finish17h3656c2dddfe18430E_ZN4core3num14from_str_radix17h833d59f12a297684Efrom_str_radix_ZN4core3num14from_str_radix17h34c024246bde17a9Efrom_str_radix_ZN4core6option15Option$LT$T$GT$5ok_or17h668a749d06b54087Eok_or_ZN4core3num14from_str_radix17h716f1a7791055e99Efrom_str_radix_ZN4core6option15Option$LT$T$GT$5ok_or17ha1515ffe6469e052Eok_or_ZN4core3num14from_str_radix17h9a10937c9e812c4bEfrom_str_radix_ZN53_$LT$u64$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17hf8105600e7b68413E_ZN53_$LT$u64$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17hcfe58ecd2fdc6e49E_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hc67b1e8f658ff156Efrom_error_ZN4core6option15Option$LT$T$GT$5ok_or17hfbbc2f4370165a14Eok_or_ZN4core3num14from_str_radix17h85772ebd0a451b6bEfrom_str_radix_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hcd5b43ab99c26e24Efrom_error_ZN4core6option15Option$LT$T$GT$5ok_or17h407dd810db3aa053Eok_or_ZN4core3num14from_str_radix17hc45825254637833bEfrom_str_radix_ZN4core6option15Option$LT$T$GT$5ok_or17hd3ea393f9a5eb07cEok_or_ZN4core3num14from_str_radix17hdbb028700d57cf68Efrom_str_radix_ZN4core6option15Option$LT$T$GT$5ok_or17h1f4188913744a4c5Eok_or_ZN4core3num14from_str_radix17haf47a04ab9cf509dEfrom_str_radix_ZN4core6option15Option$LT$T$GT$5ok_or17h1e12c3c315f87ca6Eok_or_ZN4core3num14from_str_radix17h907bdc7ab154fb4bEfrom_str_radix_ZN4core3num21_$LT$impl$u20$i64$GT$15overflowing_mul17h9a888d8667055d43E_ZN4core3num21_$LT$impl$u20$i64$GT$11checked_mul17h7d28996e92e45271E_ZN53_$LT$i64$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_mul17h634cc2f7b7f7cf39E_ZN53_$LT$i64$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_add17h0c715229d949f99bE_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17h04fa31b7aa03fa74Efrom_error_ZN53_$LT$i64$u20$as$u20$core..num..FromStrRadixHelper$GT$11checked_sub17hb4730d25a96d363bE_ZN4core6option15Option$LT$T$GT$5ok_or17ha267303e28904608Eok_or_ZN4core3num14from_str_radix17hd56f66c27c440d65Efrom_str_radix_ZN73_$LT$core..result..Result$LT$T$C$E$GT$$u20$as$u20$core..ops..try..Try$GT$10from_error17hdc3245ca4992ad07Efrom_error_ZN4core6option15Option$LT$T$GT$5ok_or17h439ddc98cac3e66bEok_or_ZN4core3num20_$LT$impl$u20$u8$GT$31one_less_than_next_power_of_two17hef06dc3048c7cb58E_ZN4core3num20_$LT$impl$u20$u8$GT$12wrapping_add17h2adb1598275f2917E_ZN4core3num21_$LT$impl$u20$u16$GT$31one_less_than_next_power_of_two17hdc3c5da6791a8404E_ZN4core3num21_$LT$impl$u20$u16$GT$12wrapping_add17ha1ddc841eb53b955E_ZN4core3num21_$LT$impl$u20$u32$GT$31one_less_than_next_power_of_two17hdb8dcc888ee6cc0cE_ZN4core3num21_$LT$impl$u20$u32$GT$12wrapping_add17hf90f9bb80de6153fE_ZN4core3num21_$LT$impl$u20$u64$GT$31one_less_than_next_power_of_two17h2fe33920b6896987E_ZN4core3num22_$LT$impl$u20$u128$GT$31one_less_than_next_power_of_two17hcfdda1496f48633bE_ZN4core3num22_$LT$impl$u20$u128$GT$12wrapping_add17ha9f3c9454c07f491Emarker_ZN4core4sync6atomic11atomic_load17heab910f5a362aecbEatomic_loadAtomicI8_ZN4core4sync6atomic8AtomicI84load17h68fe9948028ef444E_ZN4core3fmt9Formatter15debug_lower_hex17hb9158b04f1f1b6d1Edebug_lower_hex_ZN4core3fmt3num49_$LT$impl$u20$core..fmt..Debug$u20$for$u20$i8$GT$3fmt17hc1991f5015f56c3cE_ZN4core3fmt9Formatter15debug_upper_hex17hdbac3cb457cbbe5cEdebug_upper_hex_ZN4core3fmt3num3imp51_$LT$impl$u20$core..fmt..Display$u20$for$u20$i8$GT$3fmt17h5b47bf677cadbde8E_ZN4core3fmt3num3imp7fmt_u6417hfe0084196fb8e906Efmt_u64_ZN4core3fmt3num12GenericRadix7fmt_int17hf1776825fefba79aEfmt_int_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i8$GT$3fmt17h545225617cf8ffb0E_ZN44_$LT$u8$u20$as$u20$core..ops..arith..Rem$GT$3rem17h640751d7ddab2442E_ZN44_$LT$u8$u20$as$u20$core..ops..arith..Div$GT$3div17h16b66467013d6df1E_ZN4core3fmt3num12GenericRadix7fmt_int17hc689d86f08febecbEfmt_int_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i8$GT$3fmt17h1ef66fc617bfb9a8E_ZN73_$LT$core..fmt..num..UpperHex$u20$as$u20$core..fmt..num..GenericRadix$GT$5digit17h45cef84e4184cc05E_ZN4core3fmt3num3imp51_$LT$impl$u20$core..fmt..Display$u20$for$u20$u8$GT$3fmt17h491f9bb81842401dE_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u8$GT$3fmt17h7bff6ffdd196c44eE_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u8$GT$3fmt17h674ec662ca3df834E_ZN4core4sync6atomic11atomic_load17h0ef9eb69fd581f89Eatomic_loadAtomicI16_ZN4core4sync6atomic9AtomicI164load17h04d0b7b9d1647814E_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$i16$GT$3fmt17h51681641df4c6128E_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i16$GT$3fmt17h372ff76693446843E_ZN4core3fmt3num12GenericRadix7fmt_int17hc203ceb4173e9424Efmt_int_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i16$GT$3fmt17h6af99fdceafabdc5E_ZN45_$LT$u16$u20$as$u20$core..ops..arith..Div$GT$3div17h21271daf248ac7a6E_ZN50_$LT$u16$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817h26aa76a68b526fe6E_ZN4core3cmp5impls54_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$u16$GT$2eq17hcec974fcaa3ea28fE_ZN4core3fmt3num12GenericRadix7fmt_int17heabfa90949e24335Efmt_int_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i16$GT$3fmt17h362544322d2810eeE_ZN4core4sync6atomic11atomic_load17h9e607b8b2b27f18eEatomic_loadAtomicU16_ZN4core4sync6atomic9AtomicU164load17h46877c8a4f51db65E_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u16$GT$3fmt17he76c21a3ab3a4402E_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u16$GT$3fmt17h324ba98e493fc3d2E_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u16$GT$3fmt17h273dc6674edc0054E_ZN4core4sync6atomic11atomic_load17h75d04840a3b8d442Eatomic_load_ZN4core4sync6atomic9AtomicI324load17h56b2ede1b54ab1c0E_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17h5d8dde62d565a4afE_ZN4core3fmt3num12GenericRadix7fmt_int17habbcc571dcc0159fEfmt_int_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i32$GT$3fmt17hae0ef2c5a0a98ae0E_ZN45_$LT$u32$u20$as$u20$core..ops..arith..Div$GT$3div17hde930294ad3c4087E_ZN50_$LT$u32$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817h522e8d126d370081E_ZN4core3cmp5impls54_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$u32$GT$2eq17hecd601cd4dd35bbaE_ZN4core3fmt3num12GenericRadix7fmt_int17h8b3b14ca78368f97Efmt_int_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i32$GT$3fmt17hd6bd52d94c3c8cbcE_ZN4core4sync6atomic11atomic_load17h5ae289ec6f7a6e31Eatomic_loadAtomicU32_ZN4core4sync6atomic9AtomicU324load17h0ef3d18b2487e90cE_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u32$GT$3fmt17h1d4e76aa86e94083E_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u32$GT$3fmt17had74a8494660bc5bE_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u32$GT$3fmt17h38d450780be8200cE_ZN4core4sync6atomic11atomic_load17hb6e3336844cb120cEatomic_loadAtomicI64_ZN4core4sync6atomic9AtomicI644load17hfc1938d28dbd10ddE_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i64$GT$3fmt17h933d77617ce25dd2E_ZN4core3fmt3num12GenericRadix7fmt_int17h283c30abe17eb09fEfmt_int_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i64$GT$3fmt17hc386b79478f7220bE_ZN45_$LT$u64$u20$as$u20$core..ops..arith..Div$GT$3div17h701072cdbebd0668E_ZN50_$LT$u64$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817h2b7d67a0912618d4E_ZN4core3cmp5impls54_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$u64$GT$2eq17h3895dcd5e64d1372E_ZN4core3fmt3num12GenericRadix7fmt_int17h8ec166b68c1d9a2cEfmt_int_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i64$GT$3fmt17h5804edae826a5de1E_ZN4core4sync6atomic11atomic_load17h1c9ca235a2d51408Eatomic_loadAtomicU64_ZN4core4sync6atomic9AtomicU644load17h09c293fe7f695f42E_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u64$GT$3fmt17h48d894a52c575073E_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u64$GT$3fmt17h4a7425b0397d303dE_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u64$GT$3fmt17h189acc5b7b62b8f7E_ZN4core4sync6atomic11atomic_load17h85a88c206a668a84E_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..Debug$u20$for$u20$isize$GT$3fmt17he24272ba9339b984E_ZN4core3fmt3num3imp54_$LT$impl$u20$core..fmt..Display$u20$for$u20$isize$GT$3fmt17h4ba84b449fdad08aE_ZN4core3fmt3num55_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$isize$GT$3fmt17hb3a4d748d52e855aE_ZN4core3fmt3num12GenericRadix7fmt_int17hcce27f97b3e40f99Efmt_int_ZN4core3fmt3num55_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$isize$GT$3fmt17hc0576ef2669a8b98E_ZN4core4sync6atomic11atomic_load17he5047a20e317148aE_ZN4core3fmt5float23float_to_decimal_common17h8cd58c5bd915b96dEfloat_to_decimal_common_ZN4core3fmt5float27float_to_exponential_common17hda75003947636b99Efloat_to_exponential_common_ZN4core3fmt5float23float_to_decimal_common17hb6db7d0a1fe8ff4dEfloat_to_decimal_common_ZN4core3fmt5float27float_to_exponential_common17h697862ce28c488a9Efloat_to_exponential_common_ZN4core3fmt3num12GenericRadix7fmt_int17hd8cde947f60a71b7Efmt_int_ZN71_$LT$core..fmt..num..Binary$u20$as$u20$core..fmt..num..GenericRadix$GT$5digit17ha316df8e60303ddeE_ZN4core3fmt3num12GenericRadix7fmt_int17hfecdff60a52c1e4aEfmt_int_ZN70_$LT$core..fmt..num..Octal$u20$as$u20$core..fmt..num..GenericRadix$GT$5digit17h2b663d02dd9240c0E_ZN4core3fmt3num12GenericRadix7fmt_int17h07e9c40643b0e096Efmt_int_ZN4core3fmt3num12GenericRadix7fmt_int17hcb206afd335dcb18Efmt_int_ZN4core3fmt3num12GenericRadix7fmt_int17h26694abe63178505Efmt_int_ZN4core3fmt3num12GenericRadix7fmt_int17h3f61c0c39f2c3e32Efmt_int_ZN4core3fmt3num12GenericRadix7fmt_int17hdef48e73383c0850Efmt_int_ZN4core3fmt3num12GenericRadix7fmt_int17hab730bb1b35655bcEfmt_int_ZN4core3fmt3num12GenericRadix7fmt_int17hfe118fb3041eb0ceEfmt_int_ZN46_$LT$u128$u20$as$u20$core..ops..arith..Div$GT$3div17h7ab7fb8003dc7df4E_ZN51_$LT$u128$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817h4756d81d16aebf1aE_ZN4core3cmp5impls55_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$u128$GT$2eq17h8ea301c8a85f6701E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17h794c34578eed1a67E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17h9cf2c31ca6963d3cE_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h6e510c1e14762a4aEget_unchecked>_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17h71e67ac7217363c9E_ZN4core3fmt3num12GenericRadix7fmt_int17h0c472a62b286c233Efmt_int_ZN4core3fmt3num12GenericRadix7fmt_int17h16a344181211ee13Efmt_int_ZN4core3fmt3num12GenericRadix7fmt_int17h0cf32ed2cff54acdEfmt_int_ZN4core3fmt3num3imp54_$LT$impl$u20$core..fmt..Display$u20$for$u20$usize$GT$3fmt17hdf38f9e8c4c02304E_ZN4core3fmt3num55_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$usize$GT$3fmt17h7b9678389d8e4dbaE_ZN49_$LT$u8$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u6417hab05903ed69df04bEto_u64_ZN50_$LT$u16$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u6417h6956e32efdbc1d67E_ZN50_$LT$u32$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u6417hd38b4fccb82c2c1fE_ZN50_$LT$u64$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u6417hb7939d125f1434faE_ZN51_$LT$u128$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817hf88ffdb3b8c1b07aEto_u128_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17habf2eaeede08144eE_ZN71_$LT$core..marker..PhantomData$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h4a5f102834123934Efmt<&mut &core::ffi::c_void>_ZN50_$LT$$RF$mut$u20$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hed08e7f046b921e5Efmt_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h6a9fa8cb82796e62Efmt_ZN80_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h51de779136d323abEfmt,core::str::LinesAnyMap>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17he17418a58c78f242E_ZN78_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17ha2f747d01f017fecEfmt>_ZN80_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17hba00e8c80a74fb45Efmt_ZN69_$LT$core..num..nonzero..NonZeroUsize$u20$as$u20$core..fmt..Debug$GT$3fmt17he5c2c3916ae7cc10E_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h9440f3532972f407Efmt_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17he6aa73503ca09feeEfmt>_ZN71_$LT$core..num..dec2flt..FloatErrorKind$u20$as$u20$core..fmt..Debug$GT$3fmt17h6f446d89bd3002a5E_ZN71_$LT$core..char..convert..CharErrorKind$u20$as$u20$core..fmt..Debug$GT$3fmt17h1366f04b59444f4cE_ZN52_$LT$$BP$mut$u20$T$u20$as$u20$core..fmt..Pointer$GT$3fmt17h1fb071703c807654E_ZN50_$LT$$BP$mut$u20$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h783633baad5fa2cfE_ZN54_$LT$$BP$const$u20$T$u20$as$u20$core..fmt..Pointer$GT$3fmt17h7a68a432cb36f4ccE_ZN84_$LT$core..iter..adapters..chain..Chain$LT$A$C$B$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17hff42d6b2f1048b3aEfmt>,core::iter::adapters::flatten::FlatMap>_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h1fa47d46b6f68f50Efmt>_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h11598de1a365a31eE_ZN4core3fmt5float50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$f64$GT$3fmt17h4711a45c457ccbb9E_ZN92_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h51911b239cb515a2Efmt_ZN64_$LT$core..option..Item$LT$A$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h49da3f4e778e0025E_ZN4core3fmt5float50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$f32$GT$3fmt17h81757ab46aac1637E_ZN69_$LT$core..hash..sip..Hasher$LT$S$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h1c0cb2e32a3521b3Efmt_ZN59_$LT$core..str..iter..Lines$u20$as$u20$core..fmt..Debug$GT$3fmt17hc942447ea704cfffE_ZN82_$LT$core..iter..adapters..copied..Copied$LT$I$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h82454f8b77c1eb53Efmt>_ZN62_$LT$core..char..EscapeDefault$u20$as$u20$core..fmt..Debug$GT$3fmt17hc2ac9056cb478075E_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17he9f161e20a737becEfmt_ZN84_$LT$core..iter..adapters..flatten..Flatten$LT$I$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h5b687782d0921b83Efmt,core::char::EscapeDebug>_ZN60_$LT$core..task..wake..Waker$u20$as$u20$core..fmt..Debug$GT$3fmt17hc7ab7bfbdc9d8d35E_ZN78_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h05e8278a58ab29d2E_ZN78_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h340c97643ee60aa5Efmt>_ZN82_$LT$dyn$u20$core..any..Any$u2b$core..marker..Send$u20$as$u20$core..fmt..Debug$GT$3fmt17he9fcea7eb180466fE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1821af362b146e45Efmt_ZN92_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h80108b92078012bcEfmt_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h8bcca0dd2b475136E_ZN67_$LT$core..num..error..IntErrorKind$u20$as$u20$core..fmt..Debug$GT$3fmt17h5377b8799a1bf591E_ZN48_$LT$$u5b$T$u5d$$u20$as$u20$core..fmt..Debug$GT$3fmt17h19cdf99883513aaeE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17he89e321b1fa0bd6dE_ZN4core5array69_$LT$impl$u20$core..fmt..Debug$u20$for$u20$$u5b$T$u3b$$u20$N$u5d$$GT$3fmt17hedb10a8ee6aff964E_ZN4core3fmt8builders9DebugList7entries17hfce4c20ef2edb552E_ZN80_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h62a4270cced8f278Efmt, core::str::BytesIsNotEmpty>,core::str::UnsafeBytesToStr>_ZN54_$LT$$BP$const$u20$T$u20$as$u20$core..fmt..Pointer$GT$3fmt17h0e3c7ced910a100bE_ZN52_$LT$$BP$const$u20$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hbb7d90d97898ba8fE_ZN69_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h5e4946c662100ba1E_ZN4core5slice4iter13Iter$LT$T$GT$10make_slice17hc9aabec26fce4022E_ZN4core5slice4iter13Iter$LT$T$GT$8as_slice17h44faf05e08c67cd0E_ZN68_$LT$core..option..IntoIter$LT$A$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h21727e9f1b19123fE_ZN92_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17he770eaec4e964d13Efmt_ZN78_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h85335346b03fc8ffE_ZN4core3ptr87_$LT$impl$u20$core..fmt..Debug$u20$for$u20$unsafe$u20$fn$LP$A$RP$$u20$.$GT$$u20$Ret$GT$3fmt17hab97c46e48412631Efmt_ZN86_$LT$core..iter..adapters..filter..Filter$LT$I$C$P$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h13ab21046a86a67eEfmt,core::str::IsNotEmpty>_ZN48_$LT$$u5b$T$u5d$$u20$as$u20$core..fmt..Debug$GT$3fmt17head6781963ac3554Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h68990493b100e944Efmt<[char]>_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0494131894efa39fE_ZN4core3fmt8builders9DebugList7entries17h99d628ac9a131608Eentries<&char,core::slice::iter::Iter>_ZN4core3ptr7mut_ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$6offset17h48282dcf60eb1d45E_ZN4core5slice4iter13Iter$LT$T$GT$14post_inc_start17hbc050fe62acc12a2E_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h675539e1124ab830Efmt>_ZN57_$LT$core..fmt..Arguments$u20$as$u20$core..fmt..Debug$GT$3fmt17h51ca8a7fe093aea3E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h760b264e6a502223Efmt_ZN69_$LT$core..hash..sip..Hasher$LT$S$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h94db7c4ffb2f4ce7Efmt_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h0695e768105114ceE_ZN67_$LT$core..char..EscapeUnicodeState$u20$as$u20$core..fmt..Debug$GT$3fmt17he8d7f866e530c7ceE_ZN60_$LT$core..char..EscapeDebug$u20$as$u20$core..fmt..Debug$GT$3fmt17h1f8585486e15392bE_ZN85_$LT$core..str..pattern..MultiCharEqSearcher$LT$C$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h134dd8df15a4e73dEfmt<&[char]>_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h9972d77748368619Efmt<&core::fmt::Arguments>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h9e682a31de2c704dE_ZN66_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h68964ba7a8832366Efmt>>_ZN65_$LT$core..hash..sip..SipHasher24$u20$as$u20$core..fmt..Debug$GT$3fmt17h0a0559981a73cee3E_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h905d9d1f052b2751E_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h1582a44e4bf1b813Eclone>>_ZN86_$LT$core..iter..adapters..chain..Chain$LT$A$C$B$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h14e17dd9837837bbEclone>,core::iter::adapters::flatten::FlatMap>_ZN67_$LT$core..str..iter..EscapeDebug$u20$as$u20$core..clone..Clone$GT$5clone17h060f9bf4f4e046eeE_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h17a66bbcfe62451dEclone>_ZN80_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h5b3a467754fb3278E_ZN96_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hf0097851e9f87cdfEclone,core::char::EscapeDebug>_ZN86_$LT$core..iter..adapters..flatten..Flatten$LT$I$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h59f7f461bb84e987E_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hb94eb31e75b45d44Eclone_ZN62_$LT$core..char..EscapeDebug$u20$as$u20$core..clone..Clone$GT$5clone17h54e296432d53e5cfE_ZN66_$LT$core..option..Item$LT$A$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hb864e9f880e1da8cE_ZN70_$LT$core..option..IntoIter$LT$A$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h7ec60d193127aa7fE_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h48e245e01f996f70Eclone>_ZN106_$LT$core..iter..adapters..chain..Chain$LT$A$C$B$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h1261bc05c84fb6caEtry_fold>,core::iter::adapters::flatten::FlatMap,(),closure-0,core::result::Result<(), core::fmt::Error>>_ZN87_$LT$core..str..iter..EscapeDebug$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h89b287cf13abbbd3Etry_fold<(),closure-0,core::result::Result<(), core::fmt::Error>>_ZN4core4iter6traits8iterator8Iterator12try_for_each17h825c6e6998aa81e7Etry_for_each>_ZN96_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hb1538c6f5b80b3c6Eclone,core::char::EscapeDebug>_ZN94_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h5db7b7a02b43842cEclone_ZN67_$LT$core..str..iter..EscapeDebug$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h6312085d18486d3fEtry_for_each_ZN4core4iter6traits8iterator8Iterator12try_for_each4call28_$u7b$$u7b$closure$u7d$$u7d$17hc63aa6d14aeb24b5E{{closure}},closure-0>_ZN4core3ops8function5impls79_$LT$impl$u20$core..ops..function..FnMut$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$8call_mut17hfa91f2eecfcfd032Ecall_mut<((), char),closure-0>_ZN4core3ops8function5impls79_$LT$impl$u20$core..ops..function..FnMut$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$8call_mut17h316266e440cb184aEcall_mut<((), char),&mut closure-0>_ZN4core4iter6traits8iterator8Iterator8try_fold17hd781cbab5dc0d5aeEtry_fold>_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hcd8915f74217f42fEtry_fold,core::char::EscapeDebug,(),&mut closure-0,core::result::Result<(), core::fmt::Error>>_ZN106_$LT$core..iter..adapters..flatten..Flatten$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h437edffc7e410aa8E_ZN4core4iter6traits8iterator8Iterator8try_fold17h577ae2613d38713fEtry_fold,(),closure-0,core::result::Result<(), core::fmt::Error>>_ZN107_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..adapters..fuse..FuseImpl$LT$I$GT$$GT$8try_fold17h7492308d8a22bb4dE_ZN100_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17he271b5701963908eE_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold7flatten28_$u7b$$u7b$closure$u7d$$u7d$17haafed29671eb134cE{{closure}},&mut closure-0>_ZN4core4iter6traits8iterator8Iterator8try_fold17hbf86df229fd02c08Etry_fold>_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h54785844dcb7cd0fEtry_fold,core::char::EscapeDebug,(),closure-0,core::result::Result<(), core::fmt::Error>>_ZN114_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h6b0554b0b9d9d941Etry_fold>_ZN4core4iter6traits8iterator8Iterator8try_fold17h9cdd2f9e0a747b20Etry_fold>_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hcc3fb45f3ffeef9dEtry_fold>_ZN107_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..adapters..fuse..FuseImpl$LT$I$GT$$GT$8try_fold17h0341fd9f2041088dEtry_fold,(),closure-0,core::result::Result<(), core::fmt::Error>>_ZN100_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h6f2c697ed6d24dbcE_ZN101_$LT$core..str..CharEscapeDebugContinue$u20$as$u20$core..ops..function..Fn$LT$$LP$char$C$$RP$$GT$$GT$4call17h554448224a781a4eE_ZN104_$LT$core..str..CharEscapeDebugContinue$u20$as$u20$core..ops..function..FnMut$LT$$LP$char$C$$RP$$GT$$GT$8call_mut17h91c3f0a75b30a03fEcall_mut_ZN4core4iter8adapters3map12map_try_fold28_$u7b$$u7b$closure$u7d$$u7d$17h720b17364ca9d7a9E{{closure}},core::str::CharEscapeDebugContinue,closure-0>_ZN4core4char7methods22_$LT$impl$u20$char$GT$14escape_unicode17h86b17ce8154dd863Eescape_unicode_ZN4core3num21_$LT$impl$u20$u32$GT$13leading_zeros17h60d37156fde03aacE_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold7flatten28_$u7b$$u7b$closure$u7d$$u7d$17hc65fd1d1fa81c912E{{closure}},closure-0>_ZN96_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hf7389204bdd68d80Eclone,core::char::EscapeDefault>_ZN94_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h8cf4d0665eae7461Eclone_ZN69_$LT$core..str..iter..EscapeDefault$u20$as$u20$core..clone..Clone$GT$5clone17ha7d7a44e4c9ad9d6E_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h71c39500ef7f2addEclone_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h05f6f065069373c4Etry_fold,core::char::EscapeDefault,(),closure-0,core::result::Result<(), core::fmt::Error>>_ZN114_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h6c9ece1db5ffc14fEtry_fold>_ZN89_$LT$core..str..iter..EscapeDefault$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h5853c9a47807d585E_ZN4core4iter6traits8iterator8Iterator12try_for_each17h10bac411ad43d15aEtry_for_each>_ZN4core4iter6traits8iterator8Iterator8try_fold17h5f8ce270f216b4e8E_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h2ebd98f320bca679Etry_fold>_ZN107_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..adapters..fuse..FuseImpl$LT$I$GT$$GT$8try_fold17hd17b750d00355641Etry_fold,(),closure-0,core::result::Result<(), core::fmt::Error>>_ZN100_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hc4a23322771e0686E_ZN4core4char7methods22_$LT$impl$u20$char$GT$14escape_default17h6960ea6a03afb1ddE_ZN95_$LT$core..str..CharEscapeDefault$u20$as$u20$core..ops..function..Fn$LT$$LP$char$C$$RP$$GT$$GT$4call17hdf70eeb8d4b7a928E_ZN98_$LT$core..str..CharEscapeDefault$u20$as$u20$core..ops..function..FnMut$LT$$LP$char$C$$RP$$GT$$GT$8call_mut17hbe703d7bbe867d68E_ZN4core4iter8adapters3map12map_try_fold28_$u7b$$u7b$closure$u7d$$u7d$17hd1f627a0afc1c18aE{{closure}},core::str::CharEscapeDefault,closure-0>_ZN69_$LT$core..str..iter..EscapeDefault$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17he5f6b809f9039971E_ZN4core4iter6traits8iterator8Iterator12try_for_each4call28_$u7b$$u7b$closure$u7d$$u7d$17h284ce55c15271412E_ZN4core3ops8function5impls79_$LT$impl$u20$core..ops..function..FnMut$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$8call_mut17h9f6f11651489f9b1E_ZN4core4iter6traits8iterator8Iterator8try_fold17hd8e0ad8f8a6cdf55Etry_fold>_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold7flatten28_$u7b$$u7b$closure$u7d$$u7d$17h58368fc27f1daf78E{{closure}},closure-0>_ZN96_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hd614bbd47761eeedEclone,core::char::EscapeUnicode>_ZN94_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h170e742af785df54Eclone_ZN69_$LT$core..str..iter..EscapeUnicode$u20$as$u20$core..clone..Clone$GT$5clone17he4cfd4b2c9b9e7bdE_ZN68_$LT$core..option..Option$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h3e95419e68bbae00Eclone_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hcf1c51eb084be6f7Etry_fold,core::char::EscapeUnicode,(),closure-0,core::result::Result<(), core::fmt::Error>>_ZN114_$LT$core..iter..adapters..flatten..FlatMap$LT$I$C$U$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h51eaeb7f49049a61Etry_fold>_ZN89_$LT$core..str..iter..EscapeUnicode$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h1b4c48c70b2b0a3aE_ZN4core4iter6traits8iterator8Iterator12try_for_each17h282737dd16f8ed2fEtry_for_each>_ZN4core4iter6traits8iterator8Iterator8try_fold17h85251bfcd2f78ce3E_ZN102_$LT$core..iter..adapters..map..Map$LT$I$C$F$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h74b7ec603088cbb6Etry_fold>_ZN107_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..adapters..fuse..FuseImpl$LT$I$GT$$GT$8try_fold17hafdd211aeae44b45Etry_fold,(),closure-0,core::result::Result<(), core::fmt::Error>>_ZN100_$LT$core..iter..adapters..fuse..Fuse$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17h1acdafc939ea7a2cE_ZN95_$LT$core..str..CharEscapeUnicode$u20$as$u20$core..ops..function..Fn$LT$$LP$char$C$$RP$$GT$$GT$4call17hf787fdfaa6766b4eE_ZN98_$LT$core..str..CharEscapeUnicode$u20$as$u20$core..ops..function..FnMut$LT$$LP$char$C$$RP$$GT$$GT$8call_mut17hb7b7b54ae29ce0c9E_ZN4core4iter8adapters3map12map_try_fold28_$u7b$$u7b$closure$u7d$$u7d$17hbdb3acd5f8109855E{{closure}},core::str::CharEscapeUnicode,closure-0>_ZN69_$LT$core..str..iter..EscapeUnicode$u20$as$u20$core..fmt..Display$GT$3fmt28_$u7b$$u7b$closure$u7d$$u7d$17h8cec0a2e13007f3aE_ZN4core4iter6traits8iterator8Iterator12try_for_each4call28_$u7b$$u7b$closure$u7d$$u7d$17h488012ed05072174E_ZN4core3ops8function5impls79_$LT$impl$u20$core..ops..function..FnMut$LT$A$GT$$u20$for$u20$$RF$mut$u20$F$GT$8call_mut17hdd5430490fb792abE_ZN4core4iter6traits8iterator8Iterator8try_fold17hea55e70718541779Etry_fold>_ZN116_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold7flatten28_$u7b$$u7b$closure$u7d$$u7d$17h2790e3b23a1f18d1E{{closure}},closure-0>unicode_data_ZN4core7unicode12unicode_data11skip_search17h4b1d7e1c72eb5299Eskip_search_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17h0dff99a343445d08Ebinary_search_by_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key17ha01f5b24c5463bfbEbinary_search_by_key_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$6offset17hec70294dce5117f2E_ZN4core3ptr9const_ptr33_$LT$impl$u20$$BP$const$u20$T$GT$3add17hdd54c669108c7705E_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$13get_unchecked17hc5de4015f40857cbEget_unchecked_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$13get_unchecked17h8355a01034f1dd7cEget_unchecked_ZN54_$LT$u32$u20$as$u20$core..ops..bit..Shl$LT$i32$GT$$GT$3shl17h924b10f0de59ada1Eshl_ZN58_$LT$$RF$u32$u20$as$u20$core..ops..bit..Shl$LT$i32$GT$$GT$3shl17h88c26ae669fcbc9aE_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17hf07072b116091d74E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key28_$u7b$$u7b$closure$u7d$$u7d$17hd6661f89b750bbe1E{{closure}}_ZN75_$LT$usize$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$3get17h1ee65533a9a7c31bEget_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$3get17hc2806d33c70dc31eEget_ZN4core7unicode12unicode_data13decode_length17h7a0682e81295d3dcEdecode_length_ZN4core6option15Option$LT$T$GT$3map17hee78fd980593056fEmap_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17ha607cdfd6f9c0241E_ZN4core7unicode12unicode_data17decode_prefix_sum17h9354547e3432be8fEdecode_prefix_sumalphabetic_ZN4core7unicode12unicode_data11skip_search17hcf2cd5eaab3bff98E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17h87e39a33ee6b52f0E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key17h68c93668a8b3a08bE_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17h02f127f99225b3ffE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key28_$u7b$$u7b$closure$u7d$$u7d$17h9fdbc635a0dd0896E_ZN4core6option15Option$LT$T$GT$3map17h02b10c2252f1e9c7E_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17he054da1c8dd89e3bEcase_ignorable_ZN4core7unicode12unicode_data11skip_search17h914a645dd6eac53aE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17h082e4bb31db1c563E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key17hef2625c8b04a816cE_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17h87d6e662e7cf34a9E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key28_$u7b$$u7b$closure$u7d$$u7d$17h530c118ba1e79711E_ZN4core6option15Option$LT$T$GT$3map17he629a55051fc42daE_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17hf34ba6b57924c0d3E_ZN4core7unicode12unicode_data11skip_search17hd8982dbd0876875dEcc_ZN4core7unicode12unicode_data11skip_search17hd788798da2bd2eabE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17hb23560aec5459402E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key17h9c110a42ed9138fdE_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17hdae531e5c7d45a15E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key28_$u7b$$u7b$closure$u7d$$u7d$17hecccfb9cdbff286dE_ZN4core6option15Option$LT$T$GT$3map17hbf485510e0b8a95fE_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17hfdbf69111206482cEgrapheme_extend_ZN4core7unicode12unicode_data13bitset_search17h7ab396dce0126c02Ebitset_search_ZN4core3num21_$LT$impl$u20$u64$GT$11rotate_left17h6fb8ce57d39af1aaErotate_left_ZN4core7unicode12unicode_data11skip_search17h78bf888d8a7d3da6E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17h55841179bb6c8023E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key17h4422a29e730317d3E_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17h6ecf79bb5ea27139E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key28_$u7b$$u7b$closure$u7d$$u7d$17hbb5361e90103414eE_ZN4core6option15Option$LT$T$GT$3map17h4833b114c8c843f2E_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17h41af035574e95a8fE_ZN4core7unicode12unicode_data13bitset_search17hcf80819c44d7bdacE_ZN4core7unicode12unicode_data11skip_search17h5d5f53d4c71925b5E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17hc4d65bf9f21f9f2dE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key17h08501fd065ab32d0E_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17hd6861070ad460927E_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$20binary_search_by_key28_$u7b$$u7b$closure$u7d$$u7d$17hd60f01884a5577eaE_ZN4core6option15Option$LT$T$GT$3map17h588feb5b133a4d9dE_ZN4core7unicode12unicode_data11skip_search28_$u7b$$u7b$closure$u7d$$u7d$17h589532a9042bb06dEwhite_space_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$16binary_search_by17hddf8d2ff168203afEbinary_search_by<(char, [char; 3]),closure-0>conversions_ZN4core7unicode12unicode_data11conversions18bsearch_case_table17hf9da06cea2156b91Ebsearch_case_table_ZN4core3cmp5impls49_$LT$impl$u20$core..cmp..Ord$u20$for$u20$char$GT$3cmp17h1e59de71dba4ff64E_ZN4core7unicode12unicode_data11conversions18bsearch_case_table28_$u7b$$u7b$closure$u7d$$u7d$17h753c34cf12e2c5c3Efuturesimd_ZN4core3ops8function6FnOnce9call_once17h00ad4a2ce289a64dEcall_once_ZN4core3ptr102drop_in_place$LT$$RF$core..iter..adapters..copied..Copied$LT$core..slice..iter..Iter$LT$u8$GT$$GT$$GT$17h5913dccf4681891cEdrop_in_place<&core::iter::adapters::copied::Copied>>_ZN4core3num7dec2flt9algorithm12power_of_ten17h2359e2e3c50ff862Epower_of_ten_ZN4core3num7dec2flt9algorithm10make_ratio17hbe7c10b75511b01fEmake_ratio_ZN4core3num7dec2flt3num13digits_to_big17h34e05b1343da2a46Edigits_to_big_ZN4core3num7dec2flt3num6to_u6417h0d6e8d9276f11592E_ZN4core3num7dec2flt5parse7Decimal3new17hc42301d4bcc47251E_ZN4core3num7dec2flt5parse13parse_decimal17h1612103485bce2ebEparse_decimal_ZN4core3num7dec2flt5rawfp8Unpacked3new17h7db506cf5135fb9aE_ZN59_$LT$f32$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$6unpack17h676f61228da3e659Eunpack_ZN59_$LT$f32$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$8from_int17h9a03245b3f5b083cEfrom_int_ZN59_$LT$f32$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$16short_fast_pow1017h7bafda4979917498Eshort_fast_pow10_ZN59_$LT$f32$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$7to_bits17h565e47ed76f812d5E_ZN59_$LT$f32$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$9from_bits17h65a319d63d341c22E_ZN59_$LT$f64$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$6unpack17h57daf513b1291a60E_ZN59_$LT$f64$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$8from_int17hb254660a44ee6b9aE_ZN59_$LT$f64$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$16short_fast_pow1017h139ef90570520d58E_ZN59_$LT$f64$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$7to_bits17h25272e2465e3f5ecE_ZN59_$LT$f64$u20$as$u20$core..num..dec2flt..rawfp..RawFloat$GT$9from_bits17hd9d5c458c51bd95fE_ZN4core3num7dec2flt5rawfp9big_to_fp17h6a3a2f98c7701a99Ebig_to_fp_ZN74_$LT$core..num..dec2flt..ParseFloatError$u20$as$u20$core..fmt..Display$GT$3fmt17h0bf16a0d9e71e255E_ZN4core3num7dec2flt9pfe_empty17h359b6d665f612d8bEpfe_empty_ZN4core3num7dec2flt11pfe_invalid17h0c6f213a957140b0Epfe_invalid_ZN4core3num7dec2flt12extract_sign17h22293d5d8c6c6feaEextract_sign_ZN4core3num7dec2flt25bound_intermediate_digits17h5fd82b52d2248130Ebound_intermediate_digits_ZN67_$LT$f32$u20$as$u20$core..num..flt2dec..decoder..DecodableFloat$GT$18min_pos_norm_value17hea1347eafc48cac1Emin_pos_norm_value_ZN67_$LT$f64$u20$as$u20$core..num..flt2dec..decoder..DecodableFloat$GT$18min_pos_norm_value17hda88f249a76df89eE_ZN4core3num7flt2dec8strategy6dragon9mul_pow1017h7010a2809b5becc9Emul_pow10_ZN4core3num7flt2dec8strategy6dragon15format_shortest17h496d35a4b8c77d89E_ZN4core3num7flt2dec8strategy6dragon12format_exact17ha4ea3bbc2ab4c81eE_ZN4core3num7flt2dec8strategy5grisu19format_shortest_opt17hbb989df3a7596133E_ZN4core3num7flt2dec8strategy5grisu16format_exact_opt17h6b5ca377918a780cE_ZN4core3num7flt2dec8strategy5grisu16format_exact_opt14possibly_round17h3b8ed675a60abc94Epossibly_round_ZN4core3num7flt2dec4Part5write17hea0bd1121ecd1965E_ZN4core3num7flt2dec9Formatted5write17h6e3fd58a0ffeba3eE_ZN4core3num7flt2dec17digits_to_exp_str17he3929dd66854410dEdigits_to_exp_str_ZN4core3num5error15TryFromIntError13__description17h407b9ce54929a5e6E_ZN72_$LT$core..num..error..TryFromIntError$u20$as$u20$core..fmt..Display$GT$3fmt17h9f31760b2f4438eeE_ZN4core3num5error13ParseIntError4kind17h2ae76360e605568aE_ZN70_$LT$core..num..error..ParseIntError$u20$as$u20$core..fmt..Display$GT$3fmt17h278d3088acda4e58E_ZN4core3num14from_str_radix17h03ff18537d24d62bEfrom_str_radix_ZN4core3num14from_str_radix17h0436f3533f308576Efrom_str_radix_ZN4core3cmp5impls56_$LT$impl$u20$core..cmp..PartialEq$u20$for$u20$$u21$$GT$2eq17h6e84bbec2d4a2678E_ZN4core3cmp5impls50_$LT$impl$u20$core..cmp..Ord$u20$for$u20$$u21$$GT$3cmp17h60dc4cd0a0bc4413E_ZN64_$LT$core..convert..Infallible$u20$as$u20$core..clone..Clone$GT$5clone17hfd446b5d57c6dfe3E_ZN64_$LT$core..ops..range..RangeFull$u20$as$u20$core..fmt..Debug$GT$3fmt17hd3e3e7bd7f201578E_ZN71_$LT$core..ops..range..Range$LT$Idx$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h1ed9b67004ff43bcE_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h108f63b8120e9c9cE_ZN105_$LT$dyn$u20$core..any..Any$u2b$core..marker..Send$u2b$core..marker..Sync$u20$as$u20$core..fmt..Debug$GT$3fmt17h9152a0dba973a86fE_ZN103_$LT$core..array..TryFromSliceError$u20$as$u20$core..convert..From$LT$core..convert..Infallible$GT$$GT$4from17hb66da8d1510da29cE_ZN4core5ascii14escape_default17hb825f4ea82c87a47E_ZN85_$LT$core..ascii..EscapeDefault$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hac186be3789b4bafE_ZN85_$LT$core..ascii..EscapeDefault$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h6e4a3f01000badf4E_ZN85_$LT$core..ascii..EscapeDefault$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4last17h8b0b7753b6fece1bE_ZN65_$LT$core..ascii..EscapeDefault$u20$as$u20$core..fmt..Display$GT$3fmt17h40624ce3f6fed36cE_ZN63_$LT$core..ascii..EscapeDefault$u20$as$u20$core..fmt..Debug$GT$3fmt17h1aa2a2aa1fa2b70cE_ZN60_$LT$core..cell..BorrowError$u20$as$u20$core..fmt..Debug$GT$3fmt17h0fbc332f9abf0df3E_ZN62_$LT$core..cell..BorrowError$u20$as$u20$core..fmt..Display$GT$3fmt17h50a80d826b8ad917E_ZN63_$LT$core..cell..BorrowMutError$u20$as$u20$core..fmt..Debug$GT$3fmt17h52cd71b13f3bc410E_ZN65_$LT$core..cell..BorrowMutError$u20$as$u20$core..fmt..Display$GT$3fmt17h451223c3dbafa8fbE_ZN74_$LT$core..char..convert..ParseCharError$u20$as$u20$core..fmt..Display$GT$3fmt17ha2738ca70ec9b9a7E_ZN76_$LT$core..char..convert..CharTryFromError$u20$as$u20$core..fmt..Display$GT$3fmt17h10af465f6476d74cE_ZN4core4char6decode16DecodeUtf16Error18unpaired_surrogate17h45ce079c7de59079Eunpaired_surrogate_ZN75_$LT$core..char..decode..DecodeUtf16Error$u20$as$u20$core..fmt..Display$GT$3fmt17h65925a5d04199caaE_ZN64_$LT$core..char..EscapeUnicode$u20$as$u20$core..fmt..Display$GT$3fmt17h59bd750f2765ddd1E_ZN84_$LT$core..char..EscapeDefault$u20$as$u20$core..iter..traits..iterator..Iterator$GT$3nth17he5d59a05aa43b4d4Enth_ZN84_$LT$core..char..EscapeDefault$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4last17h20be3814b888a2c0E_ZN64_$LT$core..char..EscapeDefault$u20$as$u20$core..fmt..Display$GT$3fmt17hc46d1294ba464b0bE_ZN82_$LT$core..char..EscapeDebug$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17hc3c74839249955a7E_ZN62_$LT$core..char..EscapeDebug$u20$as$u20$core..fmt..Display$GT$3fmt17h77e9c069827e0f00E_ZN82_$LT$core..char..ToLowercase$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h1c7f1500a98ff124E_ZN82_$LT$core..char..ToLowercase$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9size_hint17h6b81c87a5a7cbf2dE_ZN4core4char15CaseMappingIter3new17h4242ab67bf22ab71E_ZN62_$LT$core..char..ToLowercase$u20$as$u20$core..fmt..Display$GT$3fmt17ha061091353313b97E_ZN54_$LT$core..ffi..c_void$u20$as$u20$core..fmt..Debug$GT$3fmt17h2050e1f4447b82f8E_ZN63_$LT$core..ffi..VaListImpl$u20$as$u20$core..ops..drop..Drop$GT$4drop17hda4686896222328eE_ZN86_$LT$core..iter..adapters..filter..Filter$LT$I$C$P$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h5458b2e9b2194db6Efmt,core::str::BytesIsNotEmpty>_ZN80_$LT$$LP$$RP$$u20$as$u20$core..iter..traits..collect..Extend$LT$$LP$$RP$$GT$$GT$10extend_one17hd9365dd916e696d9Eextend_one_ZN4core6option13expect_failed17h5086d7196b9e2f90Eexpect_failed_ZN4core6option18expect_none_failed17hf37eebedadde29e6Eexpect_none_failed_ZN4core5panic9PanicInfo7payload17hf1c68f36344f6a51E_ZN4core5panic9PanicInfo7message17hf427e245f6f0bc24Emessage_ZN4core5panic9PanicInfo8location17h6f46fd595f355118E_ZN61_$LT$core..panic..PanicInfo$u20$as$u20$core..fmt..Display$GT$3fmt17h2556ac6dafe387a4E_ZN4core5panic8Location6caller17h38fa1e4f77f17674Ecaller_ZN4core5panic8Location20internal_constructor17h987e7dcc3f07e3e4E_ZN4core5panic8Location4file17h990f1df2dbd7dd55E_ZN4core5panic8Location4line17h4b6e6ebc7fdd665aE_ZN4core5panic8Location6column17hf4246f884916d541E_ZN4core9panicking5panic17h07405d6be4bce887E_ZN4core9panicking18panic_bounds_check17h16537cfb53a1364bEpanic_bounds_check_ZN4core9panicking9panic_fmt17hcd56f7f635f62c74E_ZN67_$LT$core..sync..atomic..AtomicBool$u20$as$u20$core..fmt..Debug$GT$3fmt17hd80e405df2b010adE_ZN68_$LT$core..fmt..builders..PadAdapter$u20$as$u20$core..fmt..Write$GT$9write_str17h3ae11c2145da0156E_ZN4core3fmt8builders11DebugStruct5field17h0feb4ae6bd60cf22E_ZN4core3fmt8builders11DebugStruct21finish_non_exhaustive17h6eb7b5f08a53bb02E_ZN4core3fmt8builders10DebugTuple5field17h581349ec22bf4733E_ZN4core3fmt8builders10DebugInner5entry17h3bf284e5698bb914E_ZN4core3fmt8builders8DebugSet5entry17hce63a6c648ea944bE_ZN4core3fmt8builders8DebugSet6finish17h92162aba0047bec9E_ZN4core3fmt8builders8DebugMap5entry17h2bf98cec852a3938E_ZN4core3fmt8builders8DebugMap3key17hb94af9c73b3c8619E_ZN4core3fmt8builders8DebugMap6finish17h0bd5b58c44f3b008E_ZN4core3fmt5float29float_to_decimal_common_exact17ha442b171227029a9Efloat_to_decimal_common_exact_ZN4core3fmt5float29float_to_decimal_common_exact17hdcabe8066eb672d1Efloat_to_decimal_common_exact_ZN4core3fmt5float32float_to_decimal_common_shortest17h8d2839b322d11a72Efloat_to_decimal_common_shortest_ZN4core3fmt5float32float_to_decimal_common_shortest17hb36cb0a7ab3841e4Efloat_to_decimal_common_shortest_ZN4core3fmt5float33float_to_exponential_common_exact17hafe1afbac8d1f6a3Efloat_to_exponential_common_exact_ZN4core3fmt5float33float_to_exponential_common_exact17hd82183672144bd42Efloat_to_exponential_common_exact_ZN4core3fmt5float36float_to_exponential_common_shortest17h8e507b5b556b62b6Efloat_to_exponential_common_shortest_ZN4core3fmt5float36float_to_exponential_common_shortest17hb42dd5e71b20775cEfloat_to_exponential_common_shortest_ZN4core3fmt3num14parse_u64_into17hfc9e18125c866011Eparse_u64_into_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..Display$u20$for$u20$u128$GT$3fmt17h52f504067e532100E_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..Display$u20$for$u20$i128$GT$3fmt17h4f9d229ce5ad4555E_ZN4core3fmt3num8fmt_u12817h1d99421f0734fbfeEfmt_u128_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h05503ff1e33fb434Ewrite_str_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h0ae7987257b4ab3aE_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17hf6469557449e863eE_ZN4core3fmt10ArgumentV110from_usize17hbca80ea941a0d417Efrom_usize_ZN4core3fmt5write17h89e4288724daa3faE_ZN4core3fmt9Formatter12pad_integral17h0f9951fc9f2b13b4E_ZN4core3fmt9Formatter12pad_integral12write_prefix17h89d94f6859d81915Ewrite_prefix_ZN4core3fmt9Formatter3pad17h2bed62c7a96ce09cE_ZN4core3fmt9Formatter19pad_formatted_parts17h2dce62d4cdc13500Epad_formatted_parts_ZN4core3fmt9Formatter21write_formatted_parts17ha3b52a332495e63aE_ZN4core3fmt9Formatter5flags17hea7537eaab398b94E_ZN4core3fmt9Formatter4fill17h6cad45fc2e830c66E_ZN4core3fmt9Formatter5align17h317b033db8a35cc9Ealign_ZN4core3fmt9Formatter5width17hff634eafc1a9bc8dE_ZN4core3fmt9Formatter9precision17h77a985ec1be2a811Eprecision_ZN4core3fmt9Formatter10sign_minus17hdb96cf6e081f5973Esign_minus_ZN4core3fmt9Formatter9debug_set17h316887504805f4faEdebug_set_ZN4core3fmt9Formatter9debug_map17h511017c44598f969Edebug_map_ZN55_$LT$core..fmt..Error$u20$as$u20$core..fmt..Display$GT$3fmt17h022aa06c89c91cadE_ZN42_$LT$$u21$$u20$as$u20$core..fmt..Debug$GT$3fmt17h2d732e55aebc237bE_ZN40_$LT$str$u20$as$u20$core..fmt..Debug$GT$3fmt17h9346546ee5d78916E_ZN41_$LT$char$u20$as$u20$core..fmt..Debug$GT$3fmt17h719f0c734842b405E_ZN43_$LT$char$u20$as$u20$core..fmt..Display$GT$3fmt17h1543a75782a98abfE_ZN52_$LT$$BP$const$u20$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h5b6b6bd152a9d945E_ZN127_$LT$$LT$core..cell..RefCell$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$..fmt..BorrowedPlaceholder$u20$as$u20$core..fmt..Debug$GT$3fmt17h1d2af3ba093ce7d8E_ZN4core5slice6memchr7memrchr17h22df4f26a28e06ffE_ZN4core5slice5index26slice_start_index_len_fail17h1218e2e291e3f22cEslice_start_index_len_fail_ZN4core5slice5index24slice_end_index_len_fail17h76d9198f7f9a8157Eslice_end_index_len_fail_ZN4core5slice5index22slice_index_order_fail17hff7ea017696aa219Eslice_index_order_fail_ZN4core5slice5index31slice_start_index_overflow_fail17h8e68a1592ab30a84Eslice_start_index_overflow_fail_ZN4core5slice5index29slice_end_index_overflow_fail17h28f291204f4ceb0fEslice_end_index_overflow_fail_ZN74_$LT$core..slice..iter..Split$LT$T$C$P$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h58759a6d51dda7e4Efmt_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17len_mismatch_fail17h7b96896d12c751c3Elen_mismatch_fail_ZN4core3str8converts9from_utf817h7b6cb3ecf3152b01E_ZN4core3str8converts13from_utf8_mut17h652783ffe0b0530fEfrom_utf8_mut_ZN66_$LT$core..str..error..Utf8Error$u20$as$u20$core..fmt..Display$GT$3fmt17h5b4fd468e04c7174E_ZN71_$LT$core..str..error..ParseBoolError$u20$as$u20$core..fmt..Display$GT$3fmt17h13404346792c8ff5E_ZN59_$LT$core..str..iter..Chars$u20$as$u20$core..fmt..Debug$GT$3fmt17hc8d9c0f9d2c19230E_ZN76_$LT$core..str..iter..SplitInternal$LT$P$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h47347e744d412d11E_ZN76_$LT$core..str..iter..SplitInternal$LT$P$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17hee2a143df4a8d244Efmt_ZN65_$LT$core..str..iter..EncodeUtf16$u20$as$u20$core..fmt..Debug$GT$3fmt17ha5f14d4e0418b0f7E_ZN4core3str6traits23str_index_overflow_fail17h2488b58f5882a4ddEstr_index_overflow_fail_ZN87_$LT$core..str..pattern..CharPredicateSearcher$LT$F$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17he46dfdedc99ab44aE_ZN4core3str7pattern11StrSearcher3new17h80082e7e7e8a6600E_ZN4core3str5lossy9Utf8Lossy10from_bytes17hd6307cf476ec27e9Efrom_bytes_ZN4core3str5lossy9Utf8Lossy6chunks17h13dc06f80abf8c20Echunks_ZN96_$LT$core..str..lossy..Utf8LossyChunksIter$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h90bc8f40546cd7bfE_ZN66_$LT$core..str..lossy..Utf8Lossy$u20$as$u20$core..fmt..Display$GT$3fmt17hab1f16c72cf81424E_ZN64_$LT$core..str..lossy..Utf8Lossy$u20$as$u20$core..fmt..Debug$GT$3fmt17hf0c8e64a977f250cE_ZN4core3str16slice_error_fail17h3dfd55b8eb058100E_ZN4core3str21_$LT$impl$u20$str$GT$12encode_utf1617he12589a6fcaac464Eencode_utf16_ZN4core3str21_$LT$impl$u20$str$GT$12escape_debug17h73d95eeb31051688E_ZN4core3str21_$LT$impl$u20$str$GT$14escape_default17h32c873c7fb97fc7dE_ZN4core3str21_$LT$impl$u20$str$GT$14escape_unicode17h27caf99294897c37E_ZN68_$LT$core..time..Duration$u20$as$u20$core..ops..arith..AddAssign$GT$10add_assign17h97fc6c7c377eaa04E_ZN68_$LT$core..time..Duration$u20$as$u20$core..ops..arith..SubAssign$GT$10sub_assign17hed43d4183ad06365E_ZN4core4time83_$LT$impl$u20$core..ops..arith..Mul$LT$core..time..Duration$GT$$u20$for$u20$u32$GT$3mul17h37026c4564b59c00E_ZN79_$LT$core..time..Duration$u20$as$u20$core..ops..arith..MulAssign$LT$u32$GT$$GT$10mul_assign17h8f077f342eb9cebaEmul_assign_ZN79_$LT$core..time..Duration$u20$as$u20$core..ops..arith..DivAssign$LT$u32$GT$$GT$10div_assign17h3428b4a5f79580adEdiv_assign_ZN57_$LT$core..time..Duration$u20$as$u20$core..fmt..Debug$GT$3fmt17h9d0bf566d4939d5aE_ZN57_$LT$core..time..Duration$u20$as$u20$core..fmt..Debug$GT$3fmt11fmt_decimal17h1a11e1102401804eEfmt_decimal_ZN4core7unicode9printable12is_printable17h485b5a131fb2a9eaEis_printable_ZN4core4task4wake14RawWakerVTable3new17hcc04facf19bcebcbE_ZN62_$LT$core..task..wake..Context$u20$as$u20$core..fmt..Debug$GT$3fmt17hee50b43d7e274d8cE_ZN71_$LT$core..alloc..layout..LayoutError$u20$as$u20$core..fmt..Display$GT$3fmt17hfe67dab5f654f651E_ZN62_$LT$core..alloc..AllocError$u20$as$u20$core..fmt..Display$GT$3fmt17h57f15cd241775f6fE_ZN50_$LT$u16$u20$as$u20$core..num..bignum..FullOps$GT$8full_add17hb5aff2970b99d247E_ZN50_$LT$u16$u20$as$u20$core..num..bignum..FullOps$GT$8full_mul17h3295159967ea4fa7E_ZN50_$LT$u16$u20$as$u20$core..num..bignum..FullOps$GT$12full_mul_add17ha9089424045bd3beE_ZN50_$LT$u16$u20$as$u20$core..num..bignum..FullOps$GT$12full_div_rem17h33b5f968a46b73abE_ZN4core3num6bignum8Big32x408mul_pow217hf43353df6d0b32e0Emul_pow2_ZN4core3num6bignum8Big32x408mul_pow517h8d56358fd8a160efEmul_pow5_ZN4core3num6bignum8Big32x4010mul_digits17h00f4993356612aebE_ZN4core3num6bignum8Big32x407div_rem17hd26d6b687bd7df95E_ZN68_$LT$core..num..bignum..Big32x40$u20$as$u20$core..cmp..PartialEq$GT$2eq17h6a59903a5c6ef143E_ZN64_$LT$core..num..bignum..Big32x40$u20$as$u20$core..fmt..Debug$GT$3fmt17h8e3bab72889819e4E_ZN4core3num6bignum5tests6Big8x310from_small17hcc4f1f44cb82c5f5E_ZN4core3num6bignum5tests6Big8x38from_u6417h2c5d080ce801a857E_ZN4core3num6bignum5tests6Big8x33add17hfc9a81c6665dd1f8E_ZN4core3num6bignum5tests6Big8x39add_small17ha14913fcca7ef90cE_ZN4core3num6bignum5tests6Big8x38mul_pow217h4bec266ee2a73e41E_ZN4core3num6bignum5tests6Big8x38mul_pow517h8f237563a7f424daE_ZN4core3num6bignum5tests6Big8x310mul_digits17h4ca221fa45f51a95E_ZN4core3num6bignum5tests6Big8x313div_rem_small17h96709ea76aed9698E_ZN4core3num6bignum5tests6Big8x37div_rem17h0ceedac0a5ddcabcE_ZN73_$LT$core..num..bignum..tests..Big8x3$u20$as$u20$core..cmp..PartialEq$GT$2eq17h277fe7039ffb58d4E_ZN71_$LT$core..num..bignum..tests..Big8x3$u20$as$u20$core..clone..Clone$GT$5clone17h180a83bdc9fbc888E_ZN69_$LT$core..num..bignum..tests..Big8x3$u20$as$u20$core..fmt..Debug$GT$3fmt17h57c38343b96e6ec2E_ZN68_$LT$core..num..dec2flt..parse..Sign$u20$as$u20$core..fmt..Debug$GT$3fmt17hd3218dfdb1278196E_ZN71_$LT$core..num..dec2flt..parse..Decimal$u20$as$u20$core..fmt..Debug$GT$3fmt17h807a672ee5094c36E_ZN75_$LT$core..num..dec2flt..parse..ParseResult$u20$as$u20$core..fmt..Debug$GT$3fmt17h91c3b2e8b8846408E_ZN72_$LT$core..num..dec2flt..rawfp..Unpacked$u20$as$u20$core..fmt..Debug$GT$3fmt17hfd0453335a24319cE_ZN72_$LT$core..num..dec2flt..ParseFloatError$u20$as$u20$core..fmt..Debug$GT$3fmt17habc8938b39f4beb0E_ZN61_$LT$core..num..diy_float..Fp$u20$as$u20$core..fmt..Debug$GT$3fmt17h663ee539dffe15bdE_ZN73_$LT$core..num..flt2dec..decoder..Decoded$u20$as$u20$core..fmt..Debug$GT$3fmt17h12b003eac8ba6ef4E_ZN77_$LT$core..num..flt2dec..decoder..FullDecoded$u20$as$u20$core..fmt..Debug$GT$3fmt17ha9889419ef295b8eE_ZN61_$LT$core..num..flt2dec..Part$u20$as$u20$core..fmt..Debug$GT$3fmt17h49c9d338de471ddfE_ZN61_$LT$core..num..flt2dec..Sign$u20$as$u20$core..fmt..Debug$GT$3fmt17h045b5a1bff452862E_ZN70_$LT$core..num..error..TryFromIntError$u20$as$u20$core..fmt..Debug$GT$3fmt17hb88dbd8a63c5538cE_ZN68_$LT$core..num..error..ParseIntError$u20$as$u20$core..fmt..Debug$GT$3fmt17h72df0e7a3eff2786E_ZN76_$LT$core..num..nonzero..NonZeroU8$u20$as$u20$core..str..traits..FromStr$GT$8from_str17he855cafc53df6a45E_ZN77_$LT$core..num..nonzero..NonZeroU16$u20$as$u20$core..str..traits..FromStr$GT$8from_str17h2e67f2fe79d09714E_ZN77_$LT$core..num..nonzero..NonZeroU32$u20$as$u20$core..str..traits..FromStr$GT$8from_str17h5d86d280e54e8e11E_ZN77_$LT$core..num..nonzero..NonZeroU64$u20$as$u20$core..str..traits..FromStr$GT$8from_str17hf4c60d195d653a4bE_ZN78_$LT$core..num..nonzero..NonZeroU128$u20$as$u20$core..str..traits..FromStr$GT$8from_str17h665f3c2215f7d674E_ZN76_$LT$core..num..nonzero..NonZeroI8$u20$as$u20$core..str..traits..FromStr$GT$8from_str17hb34c25510d9d3790E_ZN77_$LT$core..num..nonzero..NonZeroI16$u20$as$u20$core..str..traits..FromStr$GT$8from_str17h4869aaa38227497fE_ZN77_$LT$core..num..nonzero..NonZeroI32$u20$as$u20$core..str..traits..FromStr$GT$8from_str17h9bd29904c3b31be0E_ZN77_$LT$core..num..nonzero..NonZeroI64$u20$as$u20$core..str..traits..FromStr$GT$8from_str17he47e596dfa66e582E_ZN78_$LT$core..num..nonzero..NonZeroI128$u20$as$u20$core..str..traits..FromStr$GT$8from_str17hbf72b4e8dc0e5898E_ZN4core3num20_$LT$impl$u20$i8$GT$14from_str_radix17hcf330d7b6c4d9d81Efrom_str_radix_ZN4core3num21_$LT$impl$u20$i16$GT$14from_str_radix17h1fb494ec6e5d6262E_ZN4core3num21_$LT$impl$u20$i32$GT$14from_str_radix17h246351f8b9f1d95aE_ZN4core3num21_$LT$impl$u20$i64$GT$14from_str_radix17h8e82bcb5b3a5c4a5E_ZN4core3num22_$LT$impl$u20$i128$GT$14from_str_radix17hf331c1e066a7308fE_ZN4core3num20_$LT$impl$u20$u8$GT$14from_str_radix17h76e92a8940469a98E_ZN4core3num20_$LT$impl$u20$u8$GT$26wrapping_next_power_of_two17heb3c442eb6704597Ewrapping_next_power_of_two_ZN4core3num21_$LT$impl$u20$u16$GT$14from_str_radix17h34496335b6adc933E_ZN4core3num21_$LT$impl$u20$u16$GT$26wrapping_next_power_of_two17h879e9f61a0ff11caE_ZN4core3num21_$LT$impl$u20$u32$GT$14from_str_radix17h86becb1335b79b78E_ZN4core3num21_$LT$impl$u20$u32$GT$26wrapping_next_power_of_two17hf10a586854a7a66dE_ZN4core3num21_$LT$impl$u20$u64$GT$14from_str_radix17h03393f08e6cd5a8eE_ZN4core3num21_$LT$impl$u20$u64$GT$26wrapping_next_power_of_two17h06a606c2b41f6cf6E_ZN4core3num22_$LT$impl$u20$u128$GT$14from_str_radix17h64eec3d13b4511e5E_ZN4core3num22_$LT$impl$u20$u128$GT$26wrapping_next_power_of_two17hf5f083961cb66c80E_ZN58_$LT$core..num..FpCategory$u20$as$u20$core..fmt..Debug$GT$3fmt17h3eeeb8d763fcffdaE_ZN4core3num59_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$i8$GT$8from_str17hdf9e66306b6239d1E_ZN4core3num60_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$i16$GT$8from_str17h6a1afb5258eda358E_ZN4core3num60_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$i32$GT$8from_str17ha2d1579a025e972dE_ZN4core3num60_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$i64$GT$8from_str17h13e0498bc24e16e1E_ZN4core3num61_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$i128$GT$8from_str17he91346e18739b48eE_ZN4core3num59_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u8$GT$8from_str17hd1206102e9977b78E_ZN4core3num60_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u16$GT$8from_str17h2ba14c9a18543effE_ZN4core3num60_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u32$GT$8from_str17h53614cf475deb402E_ZN4core3num60_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u64$GT$8from_str17h3cb090062f7f905cE_ZN4core3num61_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u128$GT$8from_str17h49cf355c3f25b9b9E_ZN56_$LT$core..cmp..Ordering$u20$as$u20$core..fmt..Debug$GT$3fmt17h7000fb6d35db0a09E_ZN64_$LT$core..marker..PhantomPinned$u20$as$u20$core..fmt..Debug$GT$3fmt17h374c12e4e0edc045E_ZN54_$LT$core..any..TypeId$u20$as$u20$core..fmt..Debug$GT$3fmt17h64dbe770597f2022E_ZN67_$LT$core..array..TryFromSliceError$u20$as$u20$core..fmt..Debug$GT$3fmt17h8f3cee184b3e8be9E_ZN72_$LT$core..char..convert..ParseCharError$u20$as$u20$core..fmt..Debug$GT$3fmt17h5a95e2afc0d1f16dE_ZN74_$LT$core..char..convert..CharTryFromError$u20$as$u20$core..fmt..Debug$GT$3fmt17hbdd4844440585e3eE_ZN73_$LT$core..char..decode..DecodeUtf16Error$u20$as$u20$core..fmt..Debug$GT$3fmt17hbf8eef0893456d48E_ZN62_$LT$core..char..EscapeUnicode$u20$as$u20$core..fmt..Debug$GT$3fmt17h950f11f1d7dfa4eaE_ZN67_$LT$core..char..EscapeDefaultState$u20$as$u20$core..fmt..Debug$GT$3fmt17hb5bdd43355c0d6dbE_ZN60_$LT$core..char..ToLowercase$u20$as$u20$core..fmt..Debug$GT$3fmt17h303feda1f8456bb7E_ZN60_$LT$core..char..ToUppercase$u20$as$u20$core..fmt..Debug$GT$3fmt17hb63fc913eb3e1434E_ZN64_$LT$core..char..CaseMappingIter$u20$as$u20$core..fmt..Debug$GT$3fmt17he43ec5b36a2b93a2E_ZN58_$LT$core..ffi..VaListImpl$u20$as$u20$core..fmt..Debug$GT$3fmt17h6dc46a1e31b26f45E_ZN54_$LT$core..ffi..VaList$u20$as$u20$core..fmt..Debug$GT$3fmt17h3f630171acd3832bE_ZN94_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h8a4c174e2e3f701eEfmt,core::char::EscapeUnicode>_ZN94_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h95b7b9011d8025faE_ZN94_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17hb879289afcf07de8Efmt,core::char::EscapeDefault>_ZN94_$LT$core..iter..adapters..flatten..FlattenCompat$LT$I$C$U$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17heabd8fee2445a216Efmt,core::char::EscapeDebug>_ZN60_$LT$core..option..NoneError$u20$as$u20$core..fmt..Debug$GT$3fmt17h312edc69dfd0e014E_ZN59_$LT$core..panic..PanicInfo$u20$as$u20$core..fmt..Debug$GT$3fmt17he02d882bc7fa912cE_ZN58_$LT$core..panic..Location$u20$as$u20$core..fmt..Debug$GT$3fmt17h111b500e6cc3ecffE_ZN65_$LT$core..sync..atomic..Ordering$u20$as$u20$core..fmt..Debug$GT$3fmt17he553b8886c560617E_ZN65_$LT$core..sync..atomic..AtomicI8$u20$as$u20$core..fmt..Debug$GT$3fmt17h19370ca75a34491cE_ZN65_$LT$core..sync..atomic..AtomicU8$u20$as$u20$core..fmt..Debug$GT$3fmt17ha0c37050ffc61f0eE_ZN66_$LT$core..sync..atomic..AtomicI16$u20$as$u20$core..fmt..Debug$GT$3fmt17hc1c0b6b30d2c545eE_ZN66_$LT$core..sync..atomic..AtomicU16$u20$as$u20$core..fmt..Debug$GT$3fmt17h7d0a5b3f2f906f76E_ZN66_$LT$core..sync..atomic..AtomicI32$u20$as$u20$core..fmt..Debug$GT$3fmt17hb5d39acf5fd75905E_ZN66_$LT$core..sync..atomic..AtomicU32$u20$as$u20$core..fmt..Debug$GT$3fmt17h2b987fea67ee352dE_ZN66_$LT$core..sync..atomic..AtomicI64$u20$as$u20$core..fmt..Debug$GT$3fmt17h0046347d27be9998E_ZN66_$LT$core..sync..atomic..AtomicU64$u20$as$u20$core..fmt..Debug$GT$3fmt17h0cb85432ec021c6bE_ZN68_$LT$core..sync..atomic..AtomicIsize$u20$as$u20$core..fmt..Debug$GT$3fmt17h81149927f5201de2E_ZN68_$LT$core..sync..atomic..AtomicUsize$u20$as$u20$core..fmt..Debug$GT$3fmt17h38c4cf8f4dfde56dE_ZN4core3fmt5float52_$LT$impl$u20$core..fmt..Display$u20$for$u20$f32$GT$3fmt17hd6dc53e02795587dE_ZN4core3fmt5float53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$f32$GT$3fmt17hd0d6b1d729b5fdccE_ZN4core3fmt5float53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$f32$GT$3fmt17h8babd7a8692fe7deE_ZN4core3fmt5float52_$LT$impl$u20$core..fmt..Display$u20$for$u20$f64$GT$3fmt17hcdb056019734346cE_ZN4core3fmt5float53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$f64$GT$3fmt17h9b28f77137c21b57E_ZN4core3fmt5float53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$f64$GT$3fmt17h5ff0943acf28d0f9E_ZN49_$LT$i8$u20$as$u20$core..fmt..num..DisplayInt$GT$4zero17h69eba19e4dac6b70E_ZN49_$LT$i8$u20$as$u20$core..fmt..num..DisplayInt$GT$7from_u817hc108f3219eb5cbeaE_ZN49_$LT$i8$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817ha4254f7d932afa0dE_ZN49_$LT$i8$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u1617hca4345f8230773d2Eto_u16_ZN49_$LT$i8$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u3217h35e955ffb7aca3b2Eto_u32_ZN49_$LT$i8$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u6417h794dc86d00059994E_ZN49_$LT$i8$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817h9cc1f110c346e406E_ZN50_$LT$i16$u20$as$u20$core..fmt..num..DisplayInt$GT$4zero17h48b42601b4857c60E_ZN50_$LT$i16$u20$as$u20$core..fmt..num..DisplayInt$GT$7from_u817h56e30557e8e6d5cdE_ZN50_$LT$i16$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817h12ae226ecdb2a710E_ZN50_$LT$i16$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u3217h3492d1db0c7362a8E_ZN50_$LT$i16$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u6417h9ddf0a73170d366dE_ZN50_$LT$i16$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817h7a9d19534cdec3c6E_ZN50_$LT$i32$u20$as$u20$core..fmt..num..DisplayInt$GT$4zero17h467328e0ee01006bE_ZN50_$LT$i32$u20$as$u20$core..fmt..num..DisplayInt$GT$7from_u817hf9e7228c251c9959E_ZN50_$LT$i32$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817h35f3a4df95948c3fE_ZN50_$LT$i32$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u1617h29efd4d0feb9df57E_ZN50_$LT$i32$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u3217h7129db4fd6fc49e0E_ZN50_$LT$i32$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u6417hd5a9d54f219e8e8fE_ZN50_$LT$i32$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817he4b13a4b38f5d8b0E_ZN50_$LT$i64$u20$as$u20$core..fmt..num..DisplayInt$GT$4zero17h1b48b9f61102cb31E_ZN50_$LT$i64$u20$as$u20$core..fmt..num..DisplayInt$GT$7from_u817hdc62999f3e70fb8cE_ZN50_$LT$i64$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817hf1cd2723b5815323E_ZN50_$LT$i64$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u1617h8312bfdb892f2d3dE_ZN50_$LT$i64$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u3217h469facaf04577c13E_ZN50_$LT$i64$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u6417h8351705035715efcE_ZN50_$LT$i64$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817h47c16106f7e0202aE_ZN51_$LT$i128$u20$as$u20$core..fmt..num..DisplayInt$GT$4zero17h1e46b6f90b89bfc5E_ZN51_$LT$i128$u20$as$u20$core..fmt..num..DisplayInt$GT$7from_u817he69f3a7910ca9d32E_ZN51_$LT$i128$u20$as$u20$core..fmt..num..DisplayInt$GT$5to_u817hd5a29da88e2aa2c4E_ZN51_$LT$i128$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u1617h919e8a62a26249dfE_ZN51_$LT$i128$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u3217ha5ff914727dcb918E_ZN51_$LT$i128$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u6417h73f5fc3744fbd41cE_ZN51_$LT$i128$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817h2a52144e0a52e6f6E_ZN49_$LT$u8$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u1617hf87e2f0da0e40ecaE_ZN49_$LT$u8$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u3217h2432df94ccacaa4cE_ZN49_$LT$u8$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817h07bd663d79770f02E_ZN50_$LT$u16$u20$as$u20$core..fmt..num..DisplayInt$GT$6to_u3217hcc3c082c7d1f40f5E_ZN50_$LT$u16$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817h404041dffbb053aeE_ZN50_$LT$u32$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817hcd33104a513752abE_ZN50_$LT$u64$u20$as$u20$core..fmt..num..DisplayInt$GT$7to_u12817hf68913cd4fd3e346E_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Binary$u20$for$u20$i8$GT$3fmt17hfaa63f070ebc9ca4E_ZN4core3fmt3num49_$LT$impl$u20$core..fmt..Octal$u20$for$u20$i8$GT$3fmt17hc5177b2a7cdf5668E_ZN4core3fmt3num51_$LT$impl$u20$core..fmt..Binary$u20$for$u20$i16$GT$3fmt17h1cf5387ed4ab3d8eE_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Octal$u20$for$u20$i16$GT$3fmt17h5690ac9f3998762bE_ZN4core3fmt3num51_$LT$impl$u20$core..fmt..Binary$u20$for$u20$i32$GT$3fmt17h2642faca5e24d862E_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Octal$u20$for$u20$i32$GT$3fmt17h0780118791b9a3c5E_ZN4core3fmt3num51_$LT$impl$u20$core..fmt..Binary$u20$for$u20$i64$GT$3fmt17h595abaf70ea33b28E_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Octal$u20$for$u20$i64$GT$3fmt17hf9f697a7d059cd04E_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..Binary$u20$for$u20$i128$GT$3fmt17ha8d73549b6c3d8bcE_ZN4core3fmt3num51_$LT$impl$u20$core..fmt..Octal$u20$for$u20$i128$GT$3fmt17hece1690b456ab3d2E_ZN4core3fmt3num54_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i128$GT$3fmt17h9c9044e029103cfaE_ZN4core3fmt3num54_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i128$GT$3fmt17hfcb60ed1f3b8666cE_ZN4core3fmt3num3imp7exp_u6417h6ba2891ee1a26520Eexp_u64_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$i8$GT$3fmt17haeb8b1614831ead3E_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$u8$GT$3fmt17h73eb3c920e7a3801E_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$i16$GT$3fmt17h958b393a81e1eb10E_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$u16$GT$3fmt17h6e09919ce7d82ba2E_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$i32$GT$3fmt17hed145944474fedbbE_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$u32$GT$3fmt17h0d5eb67d5309e350E_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$i64$GT$3fmt17h4b537429800e14f1E_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$u64$GT$3fmt17hf4b916369cb9c291E_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$i8$GT$3fmt17h90e4540372d09ab6E_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$u8$GT$3fmt17h65b95157ca6449eeE_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$i16$GT$3fmt17he12656609d0cd2d2E_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$u16$GT$3fmt17h6f42b8e6d1a1dac4E_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$i32$GT$3fmt17h62af18672340c11bE_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$u32$GT$3fmt17h9a0feb5764d700c9E_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$i64$GT$3fmt17h1c31568386807bfcE_ZN4core3fmt3num3imp53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$u64$GT$3fmt17hb440dd9eaaade4f4E_ZN4core3fmt3num8exp_u12817hf98a2dbec7931115Eexp_u128_ZN4core3fmt3num54_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$i128$GT$3fmt17hdb04211c64903eb1E_ZN4core3fmt3num54_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$u128$GT$3fmt17h88ff7c62d4194902E_ZN4core3fmt3num54_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$i128$GT$3fmt17hf172d6ccdfaaf4ccE_ZN4core3fmt3num54_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$u128$GT$3fmt17h610582ef891787c3E_ZN57_$LT$core..fmt..Alignment$u20$as$u20$core..fmt..Debug$GT$3fmt17hd30292688b7eefd0E_ZN53_$LT$core..fmt..Error$u20$as$u20$core..fmt..Debug$GT$3fmt17h22678a8569e8da38E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h060898b5051b1b8bEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h083ebef199a1bdd4Efmt<&core::panic::Location>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h09658722a017be6bE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h09cf684ae2144e88E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h11ea27f6b10161aeEfmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h18ba647a1332dae9Efmt<&mut core::ffi::VaListImpl>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1d5bbee70fddd0e6Efmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1e9eefd8c3b96d6bEfmt, core::str::LinesAnyMap>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1f541714dab58823Efmt<&core::task::wake::RawWakerVTable>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h2440bcb2c245db0eE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h2649aa98e3468766E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h2a52258ee0520a6dEfmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h30adc39eecb0e43cE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h31236429db5520b8Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h321576cb4a9949d1Efmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h32c732150f4eb351Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h34fbd6b509a4ae0fEfmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h359d64d0117911c0Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h3706b7ab7c66afc7Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h39733c88f242202bEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h3af451f0f183a156E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h3fab4de9471fee6dEfmt<*mut core::ffi::c_void>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h473ba01aa07ddd27Efmt>, core::iter::adapters::flatten::FlatMap>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h4ab83a4496561067Efmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h4b5fe13236ed3b7eEfmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h4bcda2f8bc013ee9Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h4dfe33562a84eeb2Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h593a1d044f9e887fE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h62844986f2e6c93eEfmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h6469aabf0378315bEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h6953bb7d3c3213ecEfmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h69e48f86747c64a9Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h6a726c5fdb756646Efmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h6b048442e8489784E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h6d037d9e74ee2dbeEfmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h6d945f9882af3dbfE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h73c22f41f4713a6aEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h74f97ddd276c9979Efmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h78316540fdbb1a69Efmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7a15b8c2b6b84e0aE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7ab06693d1e4420eEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7c31e010861f5e1fEfmt<&Any>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7ee78bbf7a850f30Efmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h82aa4e1f1748fd9cEfmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h86bcc12bee3268f6E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h87d24750071b5658Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h883942d04b60b11dE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h88827021fbfcaaddEfmt, core::str::BytesIsNotEmpty>, core::str::UnsafeBytesToStr>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h9161cece948f51b9Efmt<*const ()>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h92b205898333de65E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h9717c238e86da23bE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h988fdbc8e8689654E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h993acaf244a930bcEfmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha0ad6d181d9011ecEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha115174b3aee41aeEfmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha240714939b374e6E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha6b011201586e276Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17haa96696165cfbd98Efmt core::task::wake::RawWaker>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17haeb7748a2c275139Efmt, core::str::IsNotEmpty>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hb2f01487d8e24b54E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hb875c1a55e13ad95E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hba4b4902073bd626Efmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hbac3ab9b97ec112bE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hbdece91b7a55496aEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hc3cd7ecbae5474cdEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hc63f05c470c8400aEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hc8e081ff34012fd2Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hcf9995f94f983b40Efmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hdb878b9bef5a343aE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hdc2b90d64b5941dbEfmt>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hdca332b830bb757fE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17he66c7cb04bab4a4dEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hecd1662e5763fe64E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hee1038ea2487832aEfmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17heeb8b232a322cd24Efmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf4cd0ac7cdf290aeEfmt>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf4e8aac6be6044f5E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf7d62a9da954c860Efmt>>>_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf7f55bc8b991d573Efmt_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hfd0abe48e17cb0e5Efmt_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h7663bd7977bdaf24E_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17hc61de3387f7ce4a2E_ZN65_$LT$core..hash..sip..SipHasher13$u20$as$u20$core..fmt..Debug$GT$3fmt17haa79ec5834595db8E_ZN63_$LT$core..hash..sip..SipHasher$u20$as$u20$core..fmt..Debug$GT$3fmt17h37fa0b14a02d2f97E_ZN59_$LT$core..hash..sip..State$u20$as$u20$core..fmt..Debug$GT$3fmt17h1422b10d26faf02cE_ZN65_$LT$core..hash..sip..Sip13Rounds$u20$as$u20$core..fmt..Debug$GT$3fmt17hf71d4f8c2417960aE_ZN65_$LT$core..hash..sip..Sip24Rounds$u20$as$u20$core..fmt..Debug$GT$3fmt17h30b446c61e6e019dE_ZN64_$LT$core..str..error..Utf8Error$u20$as$u20$core..fmt..Debug$GT$3fmt17h6b03b1cc0b978bb7E_ZN69_$LT$core..str..error..ParseBoolError$u20$as$u20$core..fmt..Debug$GT$3fmt17h38ce76d61760e17bE_ZN65_$LT$core..str..iter..CharIndices$u20$as$u20$core..fmt..Debug$GT$3fmt17hd44806739863c88cE_ZN59_$LT$core..str..iter..Bytes$u20$as$u20$core..fmt..Debug$GT$3fmt17hcaa1a0f661aca73dE_ZN68_$LT$core..str..iter..Split$LT$P$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h2a3934c32ed06dceE_ZN78_$LT$core..str..iter..SplitTerminator$LT$P$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h4065d78656b3f6a2E_ZN62_$LT$core..str..iter..LinesAny$u20$as$u20$core..fmt..Debug$GT$3fmt17h2912a1a646809f4cE_ZN69_$LT$core..str..iter..SplitWhitespace$u20$as$u20$core..fmt..Debug$GT$3fmt17h49aba51be29ae5f9E_ZN74_$LT$core..str..iter..SplitAsciiWhitespace$u20$as$u20$core..fmt..Debug$GT$3fmt17hf561dba49a722eecE_ZN65_$LT$core..str..iter..EscapeDebug$u20$as$u20$core..fmt..Debug$GT$3fmt17h4ed952be3fd95e82E_ZN67_$LT$core..str..iter..EscapeDefault$u20$as$u20$core..fmt..Debug$GT$3fmt17hbedcd0fd445677baE_ZN67_$LT$core..str..iter..EscapeUnicode$u20$as$u20$core..fmt..Debug$GT$3fmt17hd1216d52c4de3ec4E_ZN67_$LT$core..str..iter..EscapeDebug$u20$as$u20$core..fmt..Display$GT$3fmt17h65162db8d43d842dE_ZN69_$LT$core..str..iter..EscapeDefault$u20$as$u20$core..fmt..Display$GT$3fmt17h08b79e51576a09ecE_ZN69_$LT$core..str..iter..EscapeUnicode$u20$as$u20$core..fmt..Display$GT$3fmt17h833a79bf64317a2eE_ZN67_$LT$core..str..pattern..SearchStep$u20$as$u20$core..fmt..Debug$GT$3fmt17h8572d78ae6fbc3d4E_ZN69_$LT$core..str..pattern..CharSearcher$u20$as$u20$core..fmt..Debug$GT$3fmt17h55d0f5f4fcef5742E_ZN74_$LT$core..str..pattern..CharSliceSearcher$u20$as$u20$core..fmt..Debug$GT$3fmt17h7bc3982ca155d139E_ZN68_$LT$core..str..pattern..StrSearcher$u20$as$u20$core..fmt..Debug$GT$3fmt17h1611a6d5d3c94ad1E_ZN72_$LT$core..str..pattern..StrSearcherImpl$u20$as$u20$core..fmt..Debug$GT$3fmt17h7cbd5bd8ad5268b8E_ZN68_$LT$core..str..pattern..EmptyNeedle$u20$as$u20$core..fmt..Debug$GT$3fmt17h328592a797f7552cE_ZN71_$LT$core..str..pattern..TwoWaySearcher$u20$as$u20$core..fmt..Debug$GT$3fmt17h8bdefa299b858981E_ZN69_$LT$core..str..lossy..Utf8LossyChunk$u20$as$u20$core..fmt..Debug$GT$3fmt17h4aa03bd901aa5570E_ZN4core7unicode12unicode_data10alphabetic6lookup17hc99d7ec63df0732dElookup_ZN4core7unicode12unicode_data14case_ignorable6lookup17h60f1b119c5a0f751E_ZN4core7unicode12unicode_data5cased6lookup17h896d411116e27df4E_ZN4core7unicode12unicode_data2cc6lookup17hd4b094300826f8a9E_ZN4core7unicode12unicode_data15grapheme_extend6lookup17h28f040caa93359bbE_ZN4core7unicode12unicode_data9lowercase6lookup17hf288753bb4952506E_ZN4core7unicode12unicode_data1n6lookup17h4dd6390f4f5a35eeE_ZN4core7unicode12unicode_data9uppercase6lookup17hc2ba08381c9f0e6cE_ZN4core7unicode12unicode_data11white_space6lookup17ha09cd490c7ebe413E_ZN4core7unicode12unicode_data11conversions8to_lower17h646c463da845d4e2Eto_lower_ZN4core7unicode12unicode_data11conversions8to_upper17h24a61f88ef21cf41Eto_upper_ZN59_$LT$core..future..ResumeTy$u20$as$u20$core..fmt..Debug$GT$3fmt17h29acc569eba9d874E_ZN63_$LT$core..task..wake..RawWaker$u20$as$u20$core..fmt..Debug$GT$3fmt17h212da40c5dfa6316E_ZN69_$LT$core..task..wake..RawWakerVTable$u20$as$u20$core..fmt..Debug$GT$3fmt17hd64964c84025e892E_ZN64_$LT$core..alloc..layout..Layout$u20$as$u20$core..fmt..Debug$GT$3fmt17h754c3e9fbb8dfc01E_ZN69_$LT$core..alloc..layout..LayoutError$u20$as$u20$core..fmt..Debug$GT$3fmt17hc071128d13bef54aE_ZN60_$LT$core..alloc..AllocError$u20$as$u20$core..fmt..Debug$GT$3fmt17hecf618b197e5370cE_ZN64_$LT$core..core_arch..simd..u8x2$u20$as$u20$core..fmt..Debug$GT$3fmt17h996ac9f87bd3fd98E_ZN64_$LT$core..core_arch..simd..i8x2$u20$as$u20$core..fmt..Debug$GT$3fmt17ha330a827303e749fE_ZN64_$LT$core..core_arch..simd..u8x4$u20$as$u20$core..fmt..Debug$GT$3fmt17hc09384910b16c741E_ZN65_$LT$core..core_arch..simd..u16x2$u20$as$u20$core..fmt..Debug$GT$3fmt17h0a471662f89a89adE_ZN64_$LT$core..core_arch..simd..i8x4$u20$as$u20$core..fmt..Debug$GT$3fmt17hfbb77b3a6e0e8e0cE_ZN65_$LT$core..core_arch..simd..i16x2$u20$as$u20$core..fmt..Debug$GT$3fmt17h902ac3e3d08f67a7E_ZN64_$LT$core..core_arch..simd..u8x8$u20$as$u20$core..fmt..Debug$GT$3fmt17ha0d0e77103777e2cE_ZN65_$LT$core..core_arch..simd..u16x4$u20$as$u20$core..fmt..Debug$GT$3fmt17h9f573d7f3ff51176E_ZN65_$LT$core..core_arch..simd..u32x2$u20$as$u20$core..fmt..Debug$GT$3fmt17hf284334b98335692E_ZN65_$LT$core..core_arch..simd..u64x1$u20$as$u20$core..fmt..Debug$GT$3fmt17h326666440d089b74E_ZN64_$LT$core..core_arch..simd..i8x8$u20$as$u20$core..fmt..Debug$GT$3fmt17hf0a6c76be9d61ce7E_ZN65_$LT$core..core_arch..simd..i16x4$u20$as$u20$core..fmt..Debug$GT$3fmt17h9609347ef8026c06E_ZN65_$LT$core..core_arch..simd..i32x2$u20$as$u20$core..fmt..Debug$GT$3fmt17ha8770bc3f9c03596E_ZN65_$LT$core..core_arch..simd..i64x1$u20$as$u20$core..fmt..Debug$GT$3fmt17h48c6e7890b92bd6fE_ZN65_$LT$core..core_arch..simd..f32x2$u20$as$u20$core..fmt..Debug$GT$3fmt17h78d9a799161c7dbeE_ZN65_$LT$core..core_arch..simd..f64x1$u20$as$u20$core..fmt..Debug$GT$3fmt17he04003f2b7958e37E_ZN65_$LT$core..core_arch..simd..u8x16$u20$as$u20$core..fmt..Debug$GT$3fmt17h95a904b1318f442cE_ZN65_$LT$core..core_arch..simd..u16x8$u20$as$u20$core..fmt..Debug$GT$3fmt17haf9051cc13cba6d6E_ZN65_$LT$core..core_arch..simd..u32x4$u20$as$u20$core..fmt..Debug$GT$3fmt17h994a69d5db2d78a4E_ZN65_$LT$core..core_arch..simd..u64x2$u20$as$u20$core..fmt..Debug$GT$3fmt17h258ac010f9e77d52E_ZN65_$LT$core..core_arch..simd..i8x16$u20$as$u20$core..fmt..Debug$GT$3fmt17h01742737ed8f54a4E_ZN65_$LT$core..core_arch..simd..i16x8$u20$as$u20$core..fmt..Debug$GT$3fmt17ha485c90cc0e89434E_ZN65_$LT$core..core_arch..simd..i32x4$u20$as$u20$core..fmt..Debug$GT$3fmt17h75b0a71d754e308bE_ZN65_$LT$core..core_arch..simd..i64x2$u20$as$u20$core..fmt..Debug$GT$3fmt17h432f06c5fdaca694E_ZN65_$LT$core..core_arch..simd..f32x4$u20$as$u20$core..fmt..Debug$GT$3fmt17h83a88f5f6d4f88d6E_ZN65_$LT$core..core_arch..simd..f64x2$u20$as$u20$core..fmt..Debug$GT$3fmt17h7db5b5f8ed7e4258E_ZN65_$LT$core..core_arch..simd..m8x16$u20$as$u20$core..fmt..Debug$GT$3fmt17hf8ff283c3a50906bE_ZN65_$LT$core..core_arch..simd..m16x8$u20$as$u20$core..fmt..Debug$GT$3fmt17he59250571318809eE_ZN65_$LT$core..core_arch..simd..m32x4$u20$as$u20$core..fmt..Debug$GT$3fmt17hcc9f9f3ae6ba91bfE_ZN65_$LT$core..core_arch..simd..m64x2$u20$as$u20$core..fmt..Debug$GT$3fmt17h49bb5ac6a9f50e69E_ZN65_$LT$core..core_arch..simd..u8x32$u20$as$u20$core..fmt..Debug$GT$3fmt17h37c62fb4f1e5bd40E_ZN66_$LT$core..core_arch..simd..u16x16$u20$as$u20$core..fmt..Debug$GT$3fmt17h47c758291642b83aE_ZN65_$LT$core..core_arch..simd..u32x8$u20$as$u20$core..fmt..Debug$GT$3fmt17h3651c251278835d2E_ZN65_$LT$core..core_arch..simd..u64x4$u20$as$u20$core..fmt..Debug$GT$3fmt17ha0afb1b0c9c3ffe5E_ZN65_$LT$core..core_arch..simd..i8x32$u20$as$u20$core..fmt..Debug$GT$3fmt17hd0cedae6e12bdd9fE_ZN66_$LT$core..core_arch..simd..i16x16$u20$as$u20$core..fmt..Debug$GT$3fmt17h1ca2cab1fc47668dE_ZN65_$LT$core..core_arch..simd..i32x8$u20$as$u20$core..fmt..Debug$GT$3fmt17hf92850466a47fa7fE_ZN65_$LT$core..core_arch..simd..i64x4$u20$as$u20$core..fmt..Debug$GT$3fmt17h196450d19afe66aaE_ZN65_$LT$core..core_arch..simd..f32x8$u20$as$u20$core..fmt..Debug$GT$3fmt17hf0df695f88ba2681E_ZN65_$LT$core..core_arch..simd..i8x64$u20$as$u20$core..fmt..Debug$GT$3fmt17h6ac3ec70ef27b190E_ZN65_$LT$core..core_arch..simd..u8x64$u20$as$u20$core..fmt..Debug$GT$3fmt17hbc26e2a349fc6865E_ZN66_$LT$core..core_arch..simd..i16x32$u20$as$u20$core..fmt..Debug$GT$3fmt17hf76184c0e46b9dc9E_ZN66_$LT$core..core_arch..simd..u16x32$u20$as$u20$core..fmt..Debug$GT$3fmt17hb4ec2176932c887dE_ZN66_$LT$core..core_arch..simd..i32x16$u20$as$u20$core..fmt..Debug$GT$3fmt17h68823e5c6d574fc8E_ZN66_$LT$core..core_arch..simd..u32x16$u20$as$u20$core..fmt..Debug$GT$3fmt17h0ee05b14847e62b1E_ZN66_$LT$core..core_arch..simd..f32x16$u20$as$u20$core..fmt..Debug$GT$3fmt17h890fdabce9c0c692E_ZN65_$LT$core..core_arch..simd..i64x8$u20$as$u20$core..fmt..Debug$GT$3fmt17h60fb9c921f64cdf8E_ZN65_$LT$core..core_arch..simd..u64x8$u20$as$u20$core..fmt..Debug$GT$3fmt17h5346d24ee528395eE_ZN65_$LT$core..core_arch..simd..f64x8$u20$as$u20$core..fmt..Debug$GT$3fmt17h0dfaf37422ee6099E_ZN66_$LT$core..core_arch..x86..__m128i$u20$as$u20$core..fmt..Debug$GT$3fmt17hc0f8a96ecbae3b5fE_ZN65_$LT$core..core_arch..x86..__m128$u20$as$u20$core..fmt..Debug$GT$3fmt17h09b7239a6da6ef24E_ZN66_$LT$core..core_arch..x86..__m128d$u20$as$u20$core..fmt..Debug$GT$3fmt17h6f8a69f00e23d426E_ZN66_$LT$core..core_arch..x86..__m256i$u20$as$u20$core..fmt..Debug$GT$3fmt17h049732e1fefa0fc7E_ZN65_$LT$core..core_arch..x86..__m256$u20$as$u20$core..fmt..Debug$GT$3fmt17h497aa0ee3605a293E_ZN66_$LT$core..core_arch..x86..__m256d$u20$as$u20$core..fmt..Debug$GT$3fmt17h5e6846a41e6b1153E_ZN66_$LT$core..core_arch..x86..__m512i$u20$as$u20$core..fmt..Debug$GT$3fmt17h541863b8c4433cd4E_ZN65_$LT$core..core_arch..x86..__m512$u20$as$u20$core..fmt..Debug$GT$3fmt17h96f5c9442aea2397E_ZN66_$LT$core..core_arch..x86..__m512d$u20$as$u20$core..fmt..Debug$GT$3fmt17h7367f84bb17a21e9E_ZN77_$LT$core..core_arch..x86..cpuid..CpuidResult$u20$as$u20$core..fmt..Debug$GT$3fmt17hb39030a70b508288E/cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.39/src/lib.rscompiler_builtinsspecialized_div_rem_ZN17compiler_builtins3int19specialized_div_rem12u128_div_rem17h208bd80ad1c15aa6Eu128_div_remudiv_ZN17compiler_builtins3int4udiv9__umodti317he3e53fe6518ebd3eE__umodti3_ZN17compiler_builtins3int19specialized_div_rem19u128_by_u64_div_rem17hfe7349d1ba7041abEu128_by_u64_div_rem_ZN4core3num22_$LT$impl$u20$u128$GT$12wrapping_mul17hecb949bdf5e30939E_ZN4core3num21_$LT$impl$u20$u64$GT$11checked_rem17he9d33b1e475ed373Echecked_rem_ZN17compiler_builtins3int19specialized_div_rem18u64_by_u64_div_rem17ha81b3f5566a677d5Eu64_by_u64_div_rem_ZN17compiler_builtins3int4udiv9__udivti317h229f08fe2b7d5c00E__udivti3_ZN4core3num21_$LT$impl$u20$u64$GT$11checked_div17h777dc665dc4976b7E8͠VEnb qwc qT TVVqV T(TPTV T(TPTVT(TPTUT(TPTTT TdTvTTTdTqTPTdTvTTU.U7UIUUU0U7UIUU0U7UIUU:W?WeWiWtWzW+YAYMYmYtYYYY+YAYMYmYtYYYY+Y3YOYVYtY{YYZZ=ZDZqZxZZYZZ=ZDZqZxZZYZZ&ZDZKZZZZ[[E[N[[ZZZ[[E[N[[ZZZZ[[\]] ] ]N]V],^ ]N]V],^ ]0]7];] ]0]7];]n]]]]^^^^^^^^^^^^6_B_^^^^^^^___^^^___^^^___^^__$_3_^^__$_3_^^__$_3_____________`` `1```$`1`p`y````{aa%b`{aa%b```{aaa```a,a@aaa aa,a@aaa@a[aaa@a[aaa@a[aa,a[a{aa,a[a{aa,a[a{abbbbbbbbbbbbbbbbbbb +cbbb +cccc.cccc.c4c9ceCeHePeUe[e`ejeYe[e`ejeve{eeeve{eeeeeeeeeeeeeeeeeeeeeefeeefeeeffffWffffWffffWf!f.f2f=f)f.f2f=fAfGfKfWfEfGfKfWffff +gfff +gfff +gfff +gffffffffffg +gffg +ggggggggggggggggggggghhh h hhh h1h6h8hRhhhhhhhhhhhhhhhhhhhhhhhhhiihhiihhiihhii@iBiFiVi@iBiFiVi@iBiFiKijioisiijioisiiiiiiiiiiiiiiiiii!j*j2jkkEl!j*j2jkkEl!j*j2j{C{U{X{j{yzwzz{>{yywzz{{yzzz{,{zzzz,{>{p{{{{{{}}}}{{?}I}S}]}r}|}?}C}r}v}I}M}}}I}M}}}{{{{{{{{|m|}}m|w|{||||||||||||||||||||||||||T~&r~~6M~~6M~~~~~~~~~~~~6M:I:I~6~6~~~~~6#2#2MM`eM`etV\lpV\lpty|y|BEILBEILjmqtjmqtczĊӊczĊӊق<ӊ.Tcق.ӊڃڃ~~'zÆӆ؆ۆ Kh(Yav{&(Ya&(Yadžˆdžˆˆφφӆ37BFQUdh37BFQUdh7?FNUYlv<.QZ^f.I܉$܉$acacininz|z||Un|Un|UdUrnm2ӎێk2n2n2n2n2nď2nrvď2nrvďďď͏FipɐːNdpĐːNdpĐːNVry9@egՑ4@`gБ4@`gБ&BIgnғݓғݓV^V^G{@G@vG@vG@vG@v#,/G@ITV^{TV^{@ғ@ғ@ғ;;;;#&;r 5u 5u 5u 5u 5uŕʕ 5uy}ŕʕ 5uy}ŕʕŕʕŕʕҕRRRRRRږRVZږRVZږeږ^ɗTo^ɗTo^ɗ^ɗɗҗ%%glpvЙ 4[BF4[BF4[BF[^lEU[^lEU[EU[EU[aiw[aiw.ŜɜМ.ŜɜМ.ŜɜМ.ŜɜМ.ŜɜМ.ŜɜМU4U44BUmUmUmɜМ Ɲ˝ Ɲ˝ Ɲ C&IC&ICnCnCnCkV֠Vu٥VgԥVdѥu٥֠ +~~ݠ~~~T~T~T~O~/*/*/3Zu/3Zu/3Zu/3Zrܢ=ܢ=ܢ5>ܢ5>ܢ5>ܢ 5>PgPgҧҧҧҧҧ ئ ئ ئ ئ#36>#36>#36>#36>itǩܩitǩܩitǩܩitǩܩ>D>D>D>DªǪڪlªǪڪlªǪڪªǪڪªǪڪªǪڪ 8`n 8`n 8`n 5`nn¬Ьn¬Ьn¬Ьn¬ЬЬ!ƮЬ!Ʈ!Mu!Mu!Mu!JuԼV|V|F%*;@S°S°S°S°S°Ȼ޻Ȼ޻ʱʱʱʱS˹S˹SSSS|ٽ:pٽpٽpٽpٽp q qdҺdҺ2Ze2Ze2Ze/Zeeeeeȸָ@ȸָ$ȸָȸָOSY]LpLpLj,,,MwMwMw 5 5 5 +5_!E5_!E5_!?_cimVzVzVt#)-9=CGttt*D*DFPpFPpFPj}}}"">H\e~*-0*-22F28Fvy:Py:Py:Py:LPPjPePbj}(4EYri ( rwvi> > >z>z>z>u !$ 2D 2D 2D2DMMMMy''''    iiii)))))Wz)Wz)Wz)Tz3i8KQiBKQTaii))Zg "g"%1g +gN0l{N0v{N0DN0DNDN888 %murR+ !'"1"mvmvvurR+  !+!B!!v/+ 8 v+ 8 v+ 8 v+ 8 v+ 8 /D/Dwi!+!wi!+!wi!+!!+!!$!$!+!i{  {  {  {  {   + + + +iB![!iB![!iB![!*iB![!*@B!V!@ZV![!gggz)-1%)-1%)-1%)-1%)-18R8R8R8FNRBFNRBFNRBFNRBFNR%5"rlv3 B p#J$$$$$D%w%%%%5"rlv3 B p#J$$$$$D%w%%%lo'%%lo'%%lo'%%Clo'%%6@C6@C(6@C(6@C(6@C(6@CQ='Qs4'Qs4'ft|lo%%|4Blo|4B|4B|4B|4B|4B|4B#)1#)1#)1)1kloklokkkkt9JPX9JPX9JPX9BPX *QZbQZbH/@rKnrKnDODO)ADADAD,;k,4k{m'C B p#J$$$$$D%w%}'[ B p#J$$$$$D%w%';6;6T6@ 6@T.;G;G    &8?DJU&8?DJU&8?DJU&8?D8?DJUg8?DJUg8?DJUg8?DJUg{&{&&q&P&H&EPjqqqq     != != != !3))d)d)2Fd)2Zd2F2F2F2Fhpv{hpv{pv{##{##{##3 I ; I ; I ; I ?n?n?n?k))5>GM58>Gqc#$>GqEWWc#$k$$x$$x$$ '  . +9 @  . +9 @   ( +. +9 @   ( +. +9 @   ( +. +9 @   ( +. +9 @  +    + +   + +   + + + +   + + + +   + +   + +   + +   + +   + + + + + + + + + + +   $"$$$ | $"$$$ | $"$$$$"$$$    cp         6 L            R"$=$    "g\?\L"$=$ R=$J$$$=$J$$$=$J$$$=$J$$$5Zw%"#5Z%"#5Z%"#%"#%"#%"#""" ##<6C +*Ll 2 ; 7 (J$W$$$xJ$W$xJ$W$xx % ##W$o$$$%% % ##W$o$$$%% )2YcY]imims##s##  % $$  % $$ % $$ % $$    Sk.17NT`##W$o$Sk.17NT`##W$o$(##(##@o-##\V##\V##\V\V`jq#w>p$/$/L#a#L#a#L#a#a#s#a#s#a#s#$gp#L#$gp#L#KV^nKV^nv{v{    !!!"!!!"E&W*X \V&^W*X \&&'*****KHeHgZZD[i[&&'G*_**KHeHgZZD[i[&&'u'gZrZ&&'u'gZrZ&&'u'gZrZ&&'u'gZrZ&&'W'gZrZ&&'M'gZrZ&&'M'gZrZ'3'='@''3'='@'u'(rZ}Z'''(rZ}Z'''(rZ}Z'''(rZ}Z''''rZ}Z''''rZ}Z''''rZ}Z''''''''((}ZZ(#(*((}ZZ(#(*((}ZZ(#(*((}ZZ(#(*(o(}ZZ(#(*(e(}ZZ(#(*(e(}ZZ/(C(M(P(/(C(M(P(()_*c*KHWHZZ((()_*c*KHWHZZ((()_*c*KHWHZZ((()_*c*KHWHZZ((((_*c*KHWHZZ((((_*c*KHWHZZ((((_*c*KHWHZZ((KHNH((KHNH*****,,,--{+,,,--,,---B/F'GlYYZZ- +--n-n- .3..]/0@0p112233 434h4445$7^7778F88889B9i999:+::;#<J<==w===;>@@AA@BB/F'G--3..]//@0@112233334844456^7o777F8P88899i9s999+::;;J< =w=== >@@AAAA@BXBfBB/FVF^F'G3..@@@BHB3..@@@BHB3.I.`....@@3.I.`....@@3.I.`....@@3.I.`.|...@@@0I0`0000@0I0`0000@0I0`0000@0I0`0|0000001)1;10001)1;10001)1;10000)1;1127712771111 221111 221111 221111 222$2@2b2222$2@2b2222$2@2b2222$2@2\22223 3B3i3{323 3B3i3{323 3B3i3{323 3<3i3{3S5\5p5555S5\5p5555S5\5p5555S5\5p55555 6;[;555 6 66AA 66AA 6606R6y66AA 6606R6y66AA 6606R6y66AA 6606L6y66AA66J<=^FrFFG<=FG<<FF<<FF+::::fBsB+::::fBsB+:4:J:g:::::+:4:J:g:::::+:4:J:g:::::+:4:J:c:::::$.3./]/10@0112233$4344455<7^77778F88889Z9i999:+:;;;<J<U=w===S>@@AABlYYZZ5/]/K7^7YYK7T7YYK7T7YY>>??}YY??}YY??}YY +??@ +@'@@lY}Y:??@ +@'@@lY}YP??'@o@lY}YP??'@o@lY}YP??'@o@P??'@o@????'@0@@bAoAAABZZCAbAoAAABZZoAxAAAAAZZoAxAAAAAZZ,-DEZZy[[DEZZDEZZDEE?EC +CCC CC&C,CC&C0CJCC&C0CJCJCCiD|DJCCiD|DSCCiD|DSCCiD|DgCCiD|DCC3D6DC3D6DiDEF%Z2ZC3D6DiDEE%Z2ZC3D6DiDEE%Z2ZC3D6DiDEEC3D6DiDEE6DiDEEQKQPQ]QQ&QFQKQPQ]Q2RR$[8[2RR$[8[2RR$[8[RYS[$[R:S[$[R:S[$[SSTU4VDVYZ[[TUYZTUYZ$U)U.UdUUV*X=XUV*X=XUV*X=XUV*X=XUV*X=X,V4VDVV,V4VDVV1V4VDVVtVvVzVVtVvVzVVtVvVzVVVVVVVVVVWWW=WWWW=WWWW+W0W=WWW&W+W0W=W_XXXXoXXXXXXXXXXXXY\p\\+]K_s_\+]K_s_\+]K_Z_\+]K_Z_\+]K_Z_\+]K_Z_\+]K_Z_t\\\\+]P]c]k]w__t\\\\+]P]c]k]w__+]2]7]>]2]7]>]P]~^^^^~^^^^~^^^^ `9```G`m``aa`e`g`j`a`e`g`j`````````````aaaarooaaaaaavooooaavooaavooaaaaooaaooab'ccab b/bSbabab b/bSbabab b/bSbabab b,bSbab}bb4ccbbccbbccbbb'cmIoppbbbbbbbbc'cmmmnppm!nppm!nppmmn!nppmmn!nppmmn!nppmmn!nppnno%ocddl lmomppqccdd@eMeddghhhhioQpddghhioQpdd hh hhhioQp hh h#h#h3h]h_h_hhhhoQp_hhhhoQpehhoQpehwhoowhhoApff$iciff$icif,griif,griiijjHkpqjojjjpqjojjjpqjojjjjojjjIjNjRjojjjjjjjokl lll#mklfllklflpl~llkkflpl~llkk~lldddd2qrr3r{J{O{T{>{J{O{T{>{J{O{T{C{J{O{T{C{J{O{T{{{{{{{{{{{{{5||f}}:||f}}:||f}s}V||f}s}`|n|f}i}`|n|f}i}||}T}}}||9}T}|}T}f}||T}f}}}#~}#~}~}~1~4~LO1~4~LO6~?~#,?~I~,N?~I~,N?~I~,N?~I~,NT~~c~~c~~c~~~~Uc~~Uc~~ci~CptNR^blwy~CptNR^blwy~CptNR^b~CptNR^bptNR^blwyy~#W^glրˁłր"߀"dsdsdsdssssssssˁˁˁց˂Ђ˂Ђ@M7 +#+MV+-VXZ7Z%7Z%7Z%7Z%7Z%7Z%7Z%7Z%7Z%7Zs%7Zs%7Zs%7߄ n~߄ n~߄n~߄n~ _~ _~ _~ N~ N~( +ą( +ą(Յڅ݅ +( +*-mv +*-mv +*-mv-mvQVYmv~ +*ՆІ†džІL7L%7L%7L%7L%7L%7L%7L%7L%7L%7Le%7Le%7Le%7V O^VՈVՈbՈlz|lz| +:GÉʉÉŊ ÉŊ ÉҊ ׊׊ՉՉՉՉ?Ti/TZ/TZ//?Zir`ƌ`ȋ،`ȋ،`،`،`،`،`،`،`،`y،`y،`y،DD[ٍ/cx[ٍ/cx[ٍ/cx[Ӎcx_ӍcxݍHcݍHcӏӏÏgmrgmrgmr{ԓԓԓhmԓhmԓhm*hmKPShmv3P3P3P3P3P]]]];PD?PD?PDDM~P~3P~3P~3PV*ϕԕە1BW1BW1BWBWBWƖ˖Ζї ї ėǗїė˗ї@ʙ6ʙܙܙܙܙܙܙܙܙܙܙܙܙ8 B B B GjGjT]`jX]dj>IS_,Q>IS_>IS[_Q_QQlšššlllb՝b՝)b՝2b՝2b<b<b9=zŞzŞzŞzŞzzAP՝AP՝AF՝b؝ +b؝ +z؝ +DG{~05Ii+305Ii+305^i+305+3i{Vki{Vk+k}}}}}}}}}}}}Рՠ ˡӡРՠ ˡӡРՠ ˡӡРՠˡӡ    ,ˡ /,/,/,]/,]/,]/,]/,]/,]/,]/,E/,E/,E/DDMz  $$ϢϢ$Ƥ-<Z<Z<Zݣ<Hݣ<Hʣӣ֣ݣΣӣڣݣ9r'9r'9H'9H'9H'9H'9H'9H'9H'90'90'90'9wʥߥwʥߥʥߥĥcfߥ2_Ψߥ2_Ψߥ2_Ψ7_7_DQT_HQX_44Aa٦o٦oxxӧxӧxxxxxxxxxx'ͩSw'ew'ew'Xew'Xew'Xew'Xew'Xew'Xew'Xew'@ew'@ew'@ewϩz٩z٩z٩zީzީz3WbEWbEW8EW8EW8EW8EW8EW8EW8EW EW EW EWZrZrZrZrZfZf˫ԫ׫ϫԫ۫AMbAMbAMbAMb*Mb*Mb**֬۬ެ4444׭+׭+ɭͭ׭ĭɭѭ׭ڮ #ڮ #ڮ #ڮ #Ʈ Ʈ ƮƮGN.`.t`o`d`d +jo.:GN.:GN7:7:7:7:>Aа-B\cа'-7f˲Ҳ\c Ҳ\c\c\cܲα7TŲ7TŲ7TŲ7TŲ7TŲ-B-B-B'[psusuƳ)m[p)_)_)_)__h[p_h[phmô˴شu w    +47;=F+47;=FVemprFMrFMǵǵʵ˶϶$'),˶϶$'),#x˶϶ܶ$'),ȶ$'),ȶ˶˶϶')5Iv')5Iv5Iv5Iviv!iv!iv!iv!!*!*!*.VrvCNrvϹϹ  `HVHVqGVq@GVq)G38<GK$$; +#PZZZZ$$$$K$K$9$9$9$9$9PT PT ]n]n@ ;O OOOOuOuOeOe  3333333  &&3( ;3v(V ;3v(V3v(V3v(V3e(E3e(E3K(33K(3~^~^c~^cp&$       h $H 4H$H^$H^$H^ MR MR.4HN`#### 0 04<4< 04 044Wjw4WjwWYwyATATj}Lj}Lj}Lj}j}j}#(joLTejn 7 pz~Rwpz~pz~ 33NNRNRNR<>$>EJO|K|dy>EJO>EJO>EJO>EJO09>EW\59>A59>AswPQl@Q@Q@Q@Q@Q@Q@Q=l=ls + + + sB ?lsZ ?ls/?ls/?ls/?ls/?ls/?ls/4lsdIN~IN~IN~~;N ;N ;D NAZAZ:A@1BH1BH1BH1BHo1?Ho1?Xaeo\aio?  +?  +?  +?  +-  +-  #- '-?QV.....))a#F#FKKkkvv5ww.U_g0002IUBRU2IUUIU'2D'2D'2D'2D'2D'2D!2D!2D!2D`s|`s|sss~szszXeXeXe0>J6J`gq`gq 48oq 4=Xq&   vv|3w3w w wDN DH /3NR\w/3NR\w/3NR/3NR/3NR38RW=TTuTp$).<$).< Z%*Z`` RjRjRjRjjr  +r  +r  +r  +r  &15=  +&15=&15=CNRWCNRWCNRWt    k + + ; k + + ; N u z  f l z  r u               =      = S   = M   M S   S V   S V   \ u o  \ l o  \ c o v \ c o v u                                   9   +!LLSZ&AXmmm$<A <A <A<A<AJt't ''9'9'9'9'9'9<l<l""&+/D&+/Dp<lp<Yw<YQQQQQ DGJQ DGJ 6 6 6 6"&)V]<M=E7PwPXSW]|]__5`G`aab?b]bi]bW]i]W]i]W]i]p%]<M=E7PwPXS__5`G`aab?bp%aab?bWb2bOb2bOb2bOb2b Ob2b7b(b7b(b!*-7%*17Wp}W}aa}aa}aa}aaaaaaaa]<M=E7PwPXS__5`G`aa,]<M=E7PwPQ__5`G`aa,]<M=EIJwPQ__5`G`aaq]<<wPPq]<<~]<<<<wPPwPPwPP<M=EF<M=EF<<<<<<<<<<<<<<<<9=M=EE9=M=EE3FXFaFuFFVGPQFVGPQFFFFFFFFFFFFFFFFFFFFFFFFFFBGVGPPBGVGPPQHI__>HI__HHIoI__HHIoI__HHIoIHHIoIHHHHIIJ7PaaBMhMNNpMNNN,OXOOOSOXOOO`OiOqOO`OiOqOOQRRRQRRRRyRSCSRyRSCSRyRSCSdRfRjRyRdRfRjRyRdRfRjRoR}i]|]}i]|]}i]|]5:*:V:::]<x=E44 +55^^>44 +55^^G44 +55^^G44 +55d44 +55f''((f^v^f''((f^v^t''((f^v^t''((''((''' (''' ((()(p((()(p((()(p((()(p(6(C(H(S(>(C(H(S(X(^(c(p(\(^(c(p(\)e)V:_:~))**~))** ;]<x=B__;;;;;U<;;;;;U<;;;;;<E<R<;;;;;<E<R<;;;;;<E<R<;;;;;<E<R<B>K>N>`>>>AAl[lilwlll +mmll +mmmOnnpnOnnpnnnnnnnnooooooiiiijjjpjqjjjjjj-l0lwllm m5m@mLmPm\m`mp>Djm>DjmW`W`W`xE\E\E\  ;@CG@CGJJOzww\wLcLcc+NV+NV+NV$NVtByByy$9I9IIV+IV+NWZ^WZ^aafFF%FFoFooooo+++++++IMUY IMUY IMUYIMUY{ooIO"&"&.{{111A1A + + + + ?|  ? $' $' $' $' $'/BG /BG /BGT puy}uy}htht| 8AUf 8AUf  "%+"%+)257o)7o)v{)>v{)>v{v{Z`fiZ`fi   < )CetQ] )=et14mp14mp46pt46pt!CetSeMIMI-MIMP-MP-kPPg e e e  ^~y^s0^gE^EMEJTs1Ts}szTE +rE + +>E7/$,  &  &W]`dW]`dHSfHSfHSfHSfHS^S[)u)u)u)u)u ) 13P9P9P9P`PPgG<G    _ehm_ehmIIIIIIX#1;;;Pe?rc9@Erc9@Erc9@HPS\drHPS\r9=M,,,4<Zc@(9ug>@uD@uD@uk@uu}<(0<(0<@Vm(0Vm(0Vm(0Vm(0!,|(3||||| +v@H +ko$;@H$;@H$;@H$;@H3:3:3: + ;W37 $.2 $.2$(24$(248[ 8[ [d^yrzosV5uV5QV5QV5QV5<p595-5>O"%("%(,M`0sX`0L^`0L^`0Lb`07eilu}eilu04T   e   + +  e    e    e                 +# +   I  +# +   I  +# +                   # & * # & * /   U                 =      1 a    a    a         2<b1 2<b1 bg <G@nGMnZm~>IeZm~>IeF!$!$FnGZm~7>f7>f7>!!tGIeISZm~zhqZm~zhqZm~zZm~laOYg@ak@ak@ak&&inswnsw{    #&*#&*--2af7<?C<?CH    38"%)"%).aa((ttCgtztztztztxtxtxIUIUzzY\:PS:PS \`>@V`S`.0y   CPY`      ,3# v## v## v## v## v###  ###  ###  ###  ###  ###  ## u!## u!## u!## u!## !!R!## !!R!## !!R! !!R!   !!!!!"&#i#t#!!"&#i#t#!!"&#i#t#!!"&#i#t#"&#i#t#"&#i#t#""""!"\#i#!"\#i#!"\#i#!"\#i#!,"6"p"\#i#!,"6"p"\#i#!,"6"p"!,"6"p"""","6"?"  )09@3@\`###n$r$$$$$$$$$$$$$$$$$$$$$$$%%$$%%$$%%`&&&&&&&&&&&&&&&'&&&&&&&&&&&'))D*c*A*D*,7,A*D*,7,A*D*,,*+G,V,*+G,V,*********+G,V,*****+G,V,++.+3+++G,V,++G,V,+++++,V,p,+,V,p,,,,.,,,,,,,,Y-\-a--Y-\-a--.... +/ //e/ +/ //e/P0V0Y0[0S0V0Y0[000010001d1f1i111111122P21111122P21111112223 3<3>3y32223 363>3s32223 363>3s32222 3344z5544z5555665566B6E6N6Q6B6E6N6Q66666666666H7866H7866H7866H7866H7866H7866H77888888777E8T888888777778838T8888887778T8h888887778T8h8888877778838E888888877778838E88888889L9:U:99::;; ==;; ==;<<<A,B;;<<B<;;<<@<;<<B<<;;9<<<;$<B<<;$<B<<;<<<<<<<{<<<<<<<<<<<<A,B<<<<AB<<<<AB<<<<<<<<AAAAAAAA= =>=>= =>=>= =>=>= =>=>= =>=>= =>=>= =>==>>>>>>===:>I>~>>>>>=====>>(>I>z>>>>>====I>]>>>>>====I>]>>>>>====>>(>:>z>~>>>>>====>>(>:>z>~>>>>>>>&?@>>&?@>>&?@>>&?@>>&?@>>&?@>>&?q?@@@@@@???*@:@o@y@@@@??????@@:@k@y@@@@????:@N@y@}@@@????:@N@y@}@@@?????@@*@k@o@@@@@?????@@*@k@o@@@@@CDGGCDGGCDGGCCCCGGCCCCCCCCCCC +DDDDDDDD!D$D*DeDkD0D5D9D=D5D9D=DADNEE9HVHNEE9HVHGGGGJKKKJKKKJJJJK#KKKKKRLWLLLRLWLLLWL\LhLLWL\LLLNP QQxQQQSYY"ZxQQ`RRRRYYRRYYRRYYR SY ZR SY Z,S;SUW,S;SUW,S;SU[UVVVVVWsUUUMV\VVVVVVTT ZZTT ZZTT ZZTUBWY@YPYTUBWY@YPYTUBWWYYCYGYKYPYWWX}XXXXYGYKY\\\\]]]]\\\\]]]]\\\\]]]]\\\\]]]]\\]^\\]^\\^^\\^^\\^#^\\^#^\\#^/^\\#^/^] ]/^>^] ]/^>^](]>^M^](]>^M^(].]M^V^(].]M^V^M]V]V^e^M]V]V^e^V]t]e^n^V]t]e^n^t]}]n^}^t]}]n^}^}]]}^^}]]}^^]]^^]]^^]]^^^^]]^^^^`1`7`M`a bbb'b1bjRjjj>jRjjj>jRjjj>jRjjjjjjjjjjjjjjjjjj +kykkkSk_kkkSk_kkkSk_kkkklTmmklTmmqrr,s4sHsq2rr&sq2rr&s]s t(tItvvv"v1vl=S=h'|='===P>l>>#>8?M(a(?v(X?p??????@2((F@(ZL(n\(h(t((((((("(6$)Jp)^)r)))*+++, ,& @,: P,N l,b ,v , , , , - ,- <- +H- +\-* +|-> +-R +-f +-z +- +- +. +. +,. +H. +l. ' .- .A .U .i .}  / @/ X/ p/ / / / / /1 /E 0Y 0m (0 80 H0 X0 h0 |0 0 0 0! 05 0I 0] 0q 1 1 (1 41 P1 l1 x1 11%191M2a2u$242@2T2h22222)2=3Q<3el3y3333344(4<4-P4A4U4i4}505T5l5555 5515EX6Yt6m66666 7(787 p7!|757I7]7q777848\8l888%898M9a9u',9H999999 :( :<SV V XV ؀( w 8 F}@P3W'8_A 4`0 k0"p(TPD`bR0K0wK<e 0*`n1`Шwjp`]  G!!H!X!`M"` "0 + "#I]##E#$JU$p$8$@[$(5%7% U%%'&(Z& h&&'c'J'pK(\L(@s(`(@ (P)yO)z$)z)p{n$*{@a*X(**.+0&S+`+0{+(:,,,-HH@-VS-W-W.WS`.XS.pX .X :/X/X /XS,0 Y_0Y0Z0[?0[?'1\?X1P\1`\2\i2\2\p3 ] z30^4@^4P^5p^"5^F6^ 6^7p_'!8_Z8`Ri9``S:`:@b;`b"@<b<0c*=`c&}>c#E?c*@c@dAeBe^Ce QDe WEfGqF`f!GfHPgJ`gJJpgJguJh!1K0h"K`hKhLh!pLhCL iM0i'jM`i*MiNPl zN`l Npl#=Ol OlPPmFhPmIPn2QoQoRo+hRoRp!:Sp#Sp#T q&TPq T`qmUqUq]Vr{Vs RW0sWPsVKXsXPtKYu2YPyYp{SZ} 4ZpYeZЍ&Z"Z0n-[[@[5\\B\PB9]B]B]@;^P^`^@=_ _@D_O `uF``s``` da0 +Kaa"ab$Wbb b7c`c crdpd`Ze XeKff`\BgJNg&5g\h_Ghpahq#h@r`i`s$iti0j#j9)jAEjj}j@m jPm Dk mki ki Bljjlpj/mj\mjmm zm@wnp~ZnonnnnnAnAoA"oAAvB6oBJo(B^oy8DQyhDdyxDwyDyDy yz1z& wzqhzPs{PtO{t{u{u)|k|1|`2?|00(}`;Oo}$x}#}$e~~`~|N$23BH2 %$Fhd'vu*y9@S4́HفQ&PRGQ`_pm0U~Rǂ0 Ђ@R`QSPw\R. U҃yI PR#EyDŽ`&8Upppˆ}*p5dpo`py3 BRdڈ`=$? i C#։ 0 PQpMMt |#̋v o%lP B 3 @K_ 2'eeCwώk1`_n \؏PNtO"tȑۑpa`1&p%?PF`pPCϓN]pCI!dPMt`WkM0Z0)t• ("t36y˖k-Ax—ԗ@ _4c00ؘf:yBSO0SǙJ16jPB9šiFKXp@gP`m9'8PZr@(;8l/S +*2@Zjp.2S .jPg#60Bk  B ۠P18H#0lk@S|P1^Hbg_ #0Q`H\h@kPd@`jP!'@ͨK& 36ez`?*'1 @ I p%j!/r^CB=`jR`HS?py]O 4kv ,@®B yPm_pP+YkLtӯpB P]װp=B~0BPgZPfSQH DdֳPn'9CR(  gP(xW`j!60u`Hܶ)3 # i w@&t˸ `]p,0lG(i;|`j`s | &ֻ0Z3P?hPB9N'C ]~(O)0(IbuS0vUN`xXx"BͿ .I +N@ |"qcrtstuff.cderegister_tm_clones__do_global_dtors_auxcompleted.7325__do_global_dtors_aux_fini_array_entryframe_dummy__frame_dummy_init_array_entryhelloworld.7rcbfp3g-cgu.0_ZN68_$LT$std..process..ExitCode$u20$as$u20$std..process..Termination$GT$6report17h9638f0759d918907Ehelloworld.7rcbfp3g-cgu.1helloworld.7rcbfp3g-cgu.2_ZN10helloworld4main17h5c9978db3bd0f0b7Ehelloworld.7rcbfp3g-cgu.3GCC_except_table0helloworld.7rcbfp3g-cgu.4helloworld.7rcbfp3g-cgu.5helloworld.7rcbfp3g-cgu.6GCC_except_table2_ZN4core3ops8function6FnOnce9call_once17h89ad3197cc0f5561Ehelloworld.7rcbfp3g-cgu.7200iun7cze3rhf3ustd.b9wtcb8n-cgu.0GCC_except_table102GCC_except_table103GCC_except_table104GCC_except_table105GCC_except_table1066GCC_except_table1069GCC_except_table1071GCC_except_table1073GCC_except_table1077GCC_except_table1126GCC_except_table1128GCC_except_table1137GCC_except_table1141GCC_except_table1142GCC_except_table1148GCC_except_table1155GCC_except_table1167GCC_except_table1179GCC_except_table118GCC_except_table1181GCC_except_table1184GCC_except_table1185GCC_except_table1187GCC_except_table1190GCC_except_table1191GCC_except_table1192GCC_except_table1193GCC_except_table1194GCC_except_table1195GCC_except_table1196GCC_except_table1201GCC_except_table1202GCC_except_table1208GCC_except_table1211GCC_except_table1212GCC_except_table1215GCC_except_table122GCC_except_table1229GCC_except_table123GCC_except_table1230GCC_except_table1232GCC_except_table1237GCC_except_table1238GCC_except_table1239GCC_except_table1240GCC_except_table1248GCC_except_table1249GCC_except_table125GCC_except_table1255GCC_except_table126GCC_except_table1265GCC_except_table1266GCC_except_table1268GCC_except_table1301GCC_except_table1304GCC_except_table1305GCC_except_table1306GCC_except_table1310GCC_except_table140GCC_except_table157GCC_except_table180GCC_except_table190GCC_except_table200GCC_except_table203GCC_except_table206GCC_except_table212GCC_except_table217GCC_except_table219GCC_except_table220GCC_except_table225GCC_except_table254GCC_except_table255GCC_except_table264GCC_except_table265GCC_except_table266GCC_except_table275GCC_except_table291GCC_except_table292GCC_except_table293GCC_except_table304GCC_except_table320GCC_except_table328GCC_except_table329GCC_except_table333GCC_except_table336GCC_except_table338GCC_except_table342GCC_except_table344GCC_except_table345GCC_except_table350GCC_except_table351GCC_except_table354GCC_except_table355GCC_except_table357GCC_except_table363GCC_except_table367GCC_except_table368GCC_except_table372GCC_except_table409GCC_except_table410GCC_except_table412GCC_except_table414GCC_except_table448GCC_except_table455GCC_except_table456GCC_except_table457GCC_except_table458GCC_except_table48GCC_except_table485GCC_except_table494GCC_except_table505GCC_except_table507GCC_except_table512GCC_except_table515GCC_except_table540GCC_except_table541GCC_except_table553GCC_except_table556GCC_except_table557GCC_except_table558GCC_except_table562GCC_except_table563GCC_except_table564GCC_except_table567GCC_except_table569GCC_except_table570GCC_except_table571GCC_except_table572GCC_except_table573GCC_except_table578GCC_except_table579GCC_except_table583GCC_except_table588GCC_except_table589GCC_except_table591GCC_except_table592GCC_except_table594GCC_except_table595GCC_except_table596GCC_except_table597GCC_except_table598GCC_except_table599GCC_except_table600GCC_except_table601GCC_except_table602GCC_except_table603GCC_except_table604GCC_except_table611GCC_except_table612GCC_except_table613GCC_except_table615GCC_except_table616GCC_except_table617GCC_except_table618GCC_except_table619GCC_except_table620GCC_except_table624GCC_except_table625GCC_except_table627GCC_except_table628GCC_except_table629GCC_except_table638GCC_except_table639GCC_except_table640GCC_except_table645GCC_except_table646GCC_except_table647GCC_except_table648GCC_except_table649GCC_except_table650GCC_except_table652GCC_except_table653GCC_except_table654GCC_except_table682GCC_except_table684GCC_except_table699GCC_except_table706GCC_except_table708GCC_except_table726GCC_except_table742GCC_except_table794GCC_except_table795GCC_except_table796GCC_except_table798GCC_except_table799GCC_except_table817GCC_except_table841GCC_except_table848GCC_except_table849GCC_except_table860GCC_except_table861GCC_except_table864GCC_except_table870GCC_except_table871GCC_except_table872GCC_except_table874GCC_except_table875GCC_except_table880GCC_except_table884GCC_except_table891GCC_except_table893GCC_except_table906GCC_except_table908GCC_except_table909GCC_except_table912GCC_except_table916GCC_except_table917GCC_except_table925GCC_except_table936GCC_except_table942GCC_except_table943GCC_except_table944GCC_except_table945GCC_except_table949GCC_except_table951GCC_except_table97GCC_except_table970GCC_except_table972GCC_except_table973GCC_except_table978GCC_except_table981GCC_except_table982GCC_except_table983GCC_except_table991GCC_except_table995_ZN112_$LT$alloc..collections..btree..map..IntoIter$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h356981071f711b35E_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h60cace8300b3f443E_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17ha6a5e121cf9ec9e1E_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17hd44aec1bcefc6d1fE_ZN3std10sys_common11at_exit_imp4LOCK17ha18b1f5eb52a3732E_ZN3std10sys_common11at_exit_imp5QUEUE17h4e436df029024ccbE_ZN3std10sys_common11thread_info10ThreadInfo4with28_$u7b$$u7b$closure$u7d$$u7d$17h3a505e2b3e5f8505E_ZN3std10sys_common11thread_info11THREAD_INFO7__getit5__KEY17hbe5797bfdc0c823eE_ZN3std10sys_common17thread_local_dtor22register_dtor_fallback5DTORS17he792f65cead1d9ccE_ZN3std10sys_common17thread_local_dtor22register_dtor_fallback9run_dtors17h12d24c3465382169E_ZN3std10sys_common4util10dumb_print17h8385deb8b846d6f6E_ZN3std10sys_common4util15report_overflow17h885cd8470bac169dE_ZN3std10sys_common4util5abort17h46332374953ab698E_ZN3std10sys_common7cleanup7CLEANUP17h72a13b8254b3c4aaE_ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$17h560d2c51a627b1efE_ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$17hb7ccc9320f187bd3E_ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h46a5fe47a0167f49E_ZN3std10sys_common9backtrace15output_filename17hed0b49957cbc1843E_ZN3std10sys_common9backtrace18rust_backtrace_env7ENABLED17h4308734cbd7828caE_ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h4e5f4b72b04174c3E_ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h9599e90d24cd3cd7E_ZN3std10sys_common9backtrace4lock4LOCK17h31787910b1b4396eE_ZN3std12backtrace_rs5print17BacktraceFrameFmt21print_raw_with_column17h5cb4527d1d2741c4E_ZN3std12backtrace_rs9backtrace9libunwind5trace8trace_fn17hd82bfadf48329ac8E_ZN3std12backtrace_rs9symbolize5gimli3elf6Object7section17h2acfaec02cceb053E_ZN3std12backtrace_rs9symbolize5gimli5Cache11with_global14MAPPINGS_CACHE17h226e5d89d741d44aE_ZN3std12backtrace_rs9symbolize5gimli5stash5Stash8allocate17hcbdba7732b4f1eadE_ZN3std12backtrace_rs9symbolize5gimli7resolve17h57e3c4568c3a748eE_ZN3std12backtrace_rs9symbolize5gimli7resolve28_$u7b$$u7b$closure$u7d$$u7d$17hcea4609646a330dbE_ZN3std12backtrace_rs9symbolize5gimli8callback17h6dd1e9d1e70df9c6E_ZN3std12backtrace_rs9symbolize6Symbol4name17hca964af29b150b5fE_ZN3std2io5Write18write_all_vectored17h0776598a56c1f1efE_ZN3std2io5Write18write_all_vectored17hea37cbfe2109cf12E_ZN3std2io5Write9write_all17h6b1afc2ae6418884E_ZN3std2io5Write9write_all17hbe23447440e678b4E_ZN3std2io5Write9write_fmt17h61989113371c2355E_ZN3std2io5Write9write_fmt17h6d40f996e84584d9E_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$14write_vectored17hb1ed7c26a870f998E_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$17is_write_vectored17h5fa7f0aece573d92E_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$5flush17h21b755290a8d9a8eE_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$5write17h6d70cce501879c18E_ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$9write_all17h71b283c0429de956E_ZN3std2io5stdio14OUTPUT_CAPTURE7__getit5__KEY17h51587cae5b730e54E_ZN3std2io5stdio19OUTPUT_CAPTURE_USED17ha630e2b9da0ba7f8E.0.0_ZN3std2io5stdio6stdout8INSTANCE17h25aa828ce7e18ddfE_ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$9flush_buf17h7a9ea302f83154f0E_ZN3std3sys4unix14abort_internal17hd9edd474837d2a63E_ZN3std3sys4unix14stack_overflow3imp12make_handler17h81f6c5590d49944eE_ZN3std3sys4unix14stack_overflow3imp13MAIN_ALTSTACK17h4d0e706dce536f3bE_ZN3std3sys4unix14stack_overflow3imp13NEED_ALTSTACK17he555ad7aa9ee8537E.0.0_ZN3std3sys4unix14stack_overflow3imp14signal_handler17h2fd4ba0bd4311fcaE_ZN3std3sys4unix17decode_error_kind17h1f1bfdd8c114513cE_ZN3std3sys4unix2fs4File6open_c17h4172c6d00d87ac7fE_ZN3std3sys4unix2fs9try_statx11STATX_STATE17hbbc66cbb9d648e1cE.0.0_ZN3std3sys4unix2fs9try_statx17h3a2d7f9ffa2222c6E_ZN3std3sys4unix2fs9try_statx5statx5statx17ha3737111d1fc9dd7E_ZN3std3sys4unix2os12error_string17hb1a97bc32531b65aE_ZN3std3sys4unix2os8env_lock8ENV_LOCK17hfc7b241a74eac616E_ZN3std3sys4unix4args3imp15ARGV_INIT_ARRAY12init_wrapper17hc08d1c0401889fa2E_ZN3std3sys4unix4args3imp15ARGV_INIT_ARRAY17h98c0b822de0557abE_ZN3std3sys4unix4args3imp4ARGC17h2af7e44f1ee53211E_ZN3std3sys4unix4args3imp4ARGV17had71c5d57735da95E_ZN3std3sys4unix4args3imp4LOCK17h9dacbf35630121bdE_ZN3std3sys4unix4weak13Weak$LT$F$GT$10initialize17h425e23817ce727a1E_ZN3std3sys4unix5mutex14ReentrantMutex4init17h31f4deef68c52255E_ZN3std3sys4unix6thread5guard9PAGE_SIZE17h2f9acf00f744c966E_ZN3std4path10Components25parse_next_component_back17h44145634de3166d1E_ZN3std4sync4once4Once15call_once_force28_$u7b$$u7b$closure$u7d$$u7d$17hb2ce0af89567f983E_ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17h0cfcece65d026d5bE_ZN3std5alloc24default_alloc_error_hook17h2224d88cddd6cf4bE_ZN3std5alloc4HOOK17hfebaae9c19b117e5E_ZN3std5error5Error5cause17h3db827cf685e2ff0E_ZN3std5error5Error7type_id17ha7eea03b1c7ab49eE_ZN3std5error5Error9backtrace17hbc3c5f7a7224bbb5E_ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17h496e4f93e18cced5E_ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17h98dbc29c9ae7ee05E_ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17hf311e94cb3a48ed5E_ZN3std6thread5local4fast13destroy_value17he156ee869e2a3c42E_ZN3std6thread5local4fast13destroy_value17hfe1d117bb66f5e47E_ZN3std6thread8ThreadId3new5GUARD17h65dfa0878c675639E_ZN3std6thread8ThreadId3new7COUNTER17hbf4a0a3135e83307E_ZN3std9panicking11begin_panic17heb23b64fde311f4fE_ZN3std9panicking11begin_panic28_$u7b$$u7b$closure$u7d$$u7d$17h226205cfbc146caaE_ZN3std9panicking11panic_count17LOCAL_PANIC_COUNT7__getit5__KEY17h7b472f115f36e66bE_ZN3std9panicking12default_hook17h7b00dcc1d0944747E_ZN3std9panicking12default_hook28_$u7b$$u7b$closure$u7d$$u7d$11FIRST_PANIC17h9e4d54488f674689E_ZN3std9panicking12default_hook28_$u7b$$u7b$closure$u7d$$u7d$17h4245258b50e37e69E_ZN3std9panicking19begin_panic_handler28_$u7b$$u7b$closure$u7d$$u7d$17hd549436f6bb6dbb8E_ZN3std9panicking4HOOK17hdc2e7a15a13f3996E_ZN3std9panicking9HOOK_LOCK17h8f46978685000a74E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h2fac0e303ddb54f0E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7cc682e31e6bf085E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h81cecc596a7b141fE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h98b3474166d3b5cbE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h9bbca12584e42a59E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf20527557ce5ed52E_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h0b7a50a34f9e3fceE_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17he23951969e919595E_ZN45_$LT$$RF$T$u20$as$u20$core..fmt..UpperHex$GT$3fmt17h9bd28cd515e87208E_ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$i32$GT$3fmt17h3bbd72793eeb8431E_ZN4core3fmt5Write10write_char17h52dcb529f0fade68E_ZN4core3fmt5Write10write_char17hbb7e04b4a02d8127E_ZN4core3fmt5Write10write_char17hbc9049995716c0f4E_ZN4core3fmt5Write9write_fmt17h11cb207f429abc05E_ZN4core3fmt5Write9write_fmt17h6969d2de1d4b201bE_ZN4core3fmt5Write9write_fmt17h78fa6db8cd3791a7E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h10409f2917ce07dcE_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h218894f5a2efbe89E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h2cb25f3d2e692782E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h393ac2da40e736f9E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h65a991a2ae6744c9E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17ha0500ef8640e8c08E_ZN4core3ptr100drop_in_place$LT$$RF$mut$u20$std..io..Write..write_fmt..Adaptor$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$17h2ac35bf14045b6f1E_ZN4core3ptr101drop_in_place$LT$alloc..sync..Arc$LT$std..sync..mutex..Mutex$LT$alloc..vec..Vec$LT$u8$GT$$GT$$GT$$GT$17h3aaab528019987a8E_ZN4core3ptr109drop_in_place$LT$core..slice..sort..CopyOnDrop$LT$std..backtrace_rs..symbolize..gimli..elf..ParsedSym$GT$$GT$17hf88589dede443004E_ZN4core3ptr111drop_in_place$LT$alloc..raw_vec..RawVec$LT$$LP$usize$C$std..backtrace_rs..symbolize..gimli..Mapping$RP$$GT$$GT$17h5cebf8cb03d3d2f6E_ZN4core3ptr115drop_in_place$LT$core..cell..RefMut$LT$core..option..Option$LT$std..sys_common..thread_info..ThreadInfo$GT$$GT$$GT$17hce640d003450666aE_ZN4core3ptr119drop_in_place$LT$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Lines$C$gimli..read..Error$GT$$GT$$GT$17hccf8402a9cfd3ffcE_ZN4core3ptr123drop_in_place$LT$addr2line..ResUnit$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$17h2e2cfeb198ba26dcE_ZN4core3ptr125drop_in_place$LT$addr2line..FrameIter$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$17h7fba4a3a61d730d8E_ZN4core3ptr125drop_in_place$LT$core..result..Result$LT$i32$C$alloc..boxed..Box$LT$dyn$u20$core..any..Any$u2b$core..marker..Send$GT$$GT$$GT$17hd7f523f85c353cf6E_ZN4core3ptr131drop_in_place$LT$alloc..boxed..Box$LT$dyn$u20$core..ops..function..FnOnce$LT$$LP$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$GT$$GT$17heb2640d2af40abcbE_ZN4core3ptr137drop_in_place$LT$gimli..read..dwarf..Unit$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$17h7eb29b94d3d8c842E_ZN4core3ptr146drop_in_place$LT$alloc..vec..Vec$LT$addr2line..ResUnit$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17h585c27b7605bda1cE_ZN4core3ptr147drop_in_place$LT$alloc..vec..into_iter..IntoIter$LT$$LP$$BP$mut$u20$u8$C$unsafe$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$BP$mut$u20$u8$RP$$RP$$GT$$GT$17h7f48224a1c1f937fE_ZN4core3ptr153drop_in_place$LT$alloc..raw_vec..RawVec$LT$addr2line..ResUnit$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17h8bab7f8d6c99e939E_ZN4core3ptr153drop_in_place$LT$gimli..read..line..IncompleteLineProgram$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$17heb21451e3d08d924E_ZN4core3ptr154drop_in_place$LT$alloc..vec..Vec$LT$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17hcb5b610221957ccaE_ZN4core3ptr158drop_in_place$LT$alloc..vec..Vec$LT$$RF$addr2line..InlinedFunction$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$GT$$GT$17h76674abbd91fde6dE_ZN4core3ptr164drop_in_place$LT$alloc..vec..Vec$LT$gimli..read..line..FileEntry$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$$GT$17hccc96062101254e5E_ZN4core3ptr169drop_in_place$LT$alloc..vec..Vec$LT$gimli..read..unit..AttributeValue$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$$GT$17hed4ce1dacc9cbf20E_ZN4core3ptr170drop_in_place$LT$alloc..vec..into_iter..IntoIter$LT$alloc..boxed..Box$LT$dyn$u20$core..ops..function..FnOnce$LT$$LP$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$GT$$GT$$GT$17heaaa5d238754d7b2E_ZN4core3ptr174drop_in_place$LT$core..result..Result$LT$addr2line..Functions$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$17hb8367792f49109e9E_ZN4core3ptr175drop_in_place$LT$std..sys_common..remutex..ReentrantMutexGuard$LT$core..cell..RefCell$LT$std..io..buffered..linewriter..LineWriter$LT$std..io..stdio..StdoutRaw$GT$$GT$$GT$$GT$17h4406953af01b7addE_ZN4core3ptr181drop_in_place$LT$core..option..Option$LT$gimli..read..line..IncompleteLineProgram$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$GT$$GT$17he6759158665d2bdfE_ZN4core3ptr207drop_in_place$LT$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Functions$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$GT$17h12768e6246cb2025E_ZN4core3ptr226drop_in_place$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$GT$17hd8740aae014a66bbE_ZN4core3ptr246drop_in_place$LT$$LP$gimli..read..unit..UnitOffset$C$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$RP$$GT$17h799d3055803f156dE_ZN4core3ptr264drop_in_place$LT$$LT$alloc..vec..into_iter..IntoIter$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$alloc..boxed..Box$LT$dyn$u20$core..ops..function..FnOnce$LT$$LP$$RP$$GT$$u2b$Output$u20$$u3d$$u20$$LP$$RP$$GT$$C$alloc..alloc..Global$GT$$GT$17h43ee806833822df1E_ZN4core3ptr269drop_in_place$LT$alloc..vec..Vec$LT$$LP$gimli..read..unit..UnitOffset$C$addr2line..lazy..LazyCell$LT$core..result..Result$LT$addr2line..Function$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$GT$$C$gimli..read..Error$GT$$GT$$RP$$GT$$GT$17ha42b8c51b026f846E_ZN4core3ptr275drop_in_place$LT$gimli..read..line..LineRows$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$gimli..read..line..IncompleteLineProgram$LT$gimli..read..endian_slice..EndianSlice$LT$gimli..endianity..LittleEndian$GT$$C$usize$GT$$C$usize$GT$$GT$17haaf3091dd44be272E_ZN4core3ptr34drop_in_place$LT$std..fs..File$GT$17ha8658c0f4a71562aE_ZN4core3ptr40drop_in_place$LT$std..thread..Thread$GT$17h3b0963431274f289E_ZN4core3ptr42drop_in_place$LT$std..io..error..Error$GT$17h15987a7935718a31E_ZN4core3ptr44drop_in_place$LT$addr2line..LineSequence$GT$17h0e0e7cb6191b9ad7E_ZN4core3ptr44drop_in_place$LT$std..backtrace_rs..Bomb$GT$17h1034933388f8f855E_ZN4core3ptr44drop_in_place$LT$std..sync..once..Waiter$GT$17h642afe642424a08cE_ZN4core3ptr45drop_in_place$LT$std..ffi..c_str..CString$GT$17heb17becc70b70274E_ZN4core3ptr46drop_in_place$LT$std..ffi..c_str..NulError$GT$17h823efb507987d9ebE_ZN4core3ptr46drop_in_place$LT$std..io..stdio..StdinLock$GT$17h449b6ca39dc35e8bE_ZN4core3ptr49drop_in_place$LT$std..sync..once..WaiterQueue$GT$17hf124ea37c1837856E_ZN4core3ptr50drop_in_place$LT$alloc..borrow..Cow$LT$str$GT$$GT$17h3515f40017ff1df3E_ZN4core3ptr52drop_in_place$LT$gimli..read..abbrev..Attributes$GT$17h320625860ec3cf83E_ZN4core3ptr55drop_in_place$LT$gimli..read..abbrev..Abbreviations$GT$17h1977de9143c7d0c0E_ZN4core3ptr60drop_in_place$LT$std..sys..unix..mutex..PthreadMutexAttr$GT$17h29b8aee07448acebE_ZN4core3ptr61drop_in_place$LT$std..sys_common..mutex..StaticMutexGuard$GT$17h7d0ebbac33df7dcbE_ZN4core3ptr64drop_in_place$LT$alloc..vec..Vec$LT$addr2line..UnitRange$GT$$GT$17hbc5e45b998ea2e0eE_ZN4core3ptr64drop_in_place$LT$std..backtrace_rs..print..BacktraceFrameFmt$GT$17hc8ebf68e942f783dE_ZN4core3ptr65drop_in_place$LT$alloc..vec..Vec$LT$alloc..string..String$GT$$GT$17h890b198614ffe50aE_ZN4core3ptr65drop_in_place$LT$std..backtrace_rs..symbolize..gimli..Library$GT$17hf77f8232c32f26d9E_ZN4core3ptr65drop_in_place$LT$std..backtrace_rs..symbolize..gimli..Mapping$GT$17h082a77839a92d430E_ZN4core3ptr67drop_in_place$LT$alloc..vec..Vec$LT$addr2line..LineSequence$GT$$GT$17h2db6bbbaf0e5bd65E_ZN4core3ptr68drop_in_place$LT$core..option..Option$LT$std..thread..Thread$GT$$GT$17h8e359a4be6769f52E_ZN4core3ptr68drop_in_place$LT$std..backtrace_rs..symbolize..gimli..mmap..Mmap$GT$17hfaf7d00d99eba09fE_ZN4core3ptr69drop_in_place$LT$std..backtrace_rs..symbolize..gimli..elf..Object$GT$17h9ed496c2cf216536E_ZN4core3ptr70drop_in_place$LT$std..backtrace_rs..symbolize..gimli..stash..Stash$GT$17h48439ed87718bc64E_ZN4core3ptr70drop_in_place$LT$std..panicking..begin_panic_handler..PanicPayload$GT$17h12bea6f0875e3cc3E_ZN4core3ptr73drop_in_place$LT$alloc..vec..Vec$LT$alloc..slice..merge_sort..Run$GT$$GT$17hd5b9f6d26f33f086E_ZN4core3ptr73drop_in_place$LT$core..option..Option$LT$std..ffi..c_str..CString$GT$$GT$17h7f67c2d13ce7c242E_ZN4core3ptr78drop_in_place$LT$alloc..vec..Vec$LT$gimli..read..line..FileEntryFormat$GT$$GT$17h39ca1e691a933ed3E_ZN4core3ptr81drop_in_place$LT$$LP$usize$C$std..backtrace_rs..symbolize..gimli..Mapping$RP$$GT$17hcbd7f90b3f097fb1E_ZN4core3ptr83drop_in_place$LT$std..sys_common..thread_info..set..$u7b$$u7b$closure$u7d$$u7d$$GT$17hae2667e1d213d5b1E_ZN4core3ptr84drop_in_place$LT$std..io..stdio..set_output_capture..$u7b$$u7b$closure$u7d$$u7d$$GT$17h63a0f24549761583E_ZN4core3ptr86drop_in_place$LT$core..result..Result$LT$addr2line..Lines$C$gimli..read..Error$GT$$GT$17heb685802d05ff7e5E_ZN4core3ptr87drop_in_place$LT$std..io..Write..write_fmt..Adaptor$LT$$RF$mut$u20$$u5b$u8$u5d$$GT$$GT$17he6b36265caa5c218E_ZN4core3ptr88drop_in_place$LT$std..sys_common..backtrace.._print_fmt..$u7b$$u7b$closure$u7d$$u7d$$GT$17h44f89bc8bd6e99e6E_ZN4core3ptr89drop_in_place$LT$core..option..Option$LT$std..sys_common..thread_info..ThreadInfo$GT$$GT$17h4873d45ffd583255E_ZN4core3ptr90drop_in_place$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$..flush_buf..BufGuard$GT$17h7e78e82cd2249e00E_ZN4core3ptr91drop_in_place$LT$core..result..Result$LT$std..path..PathBuf$C$std..io..error..Error$GT$$GT$17hd5ad15c7dbbd72ecE_ZN4core3ptr95drop_in_place$LT$std..io..buffered..linewriter..LineWriter$LT$std..io..stdio..StdoutRaw$GT$$GT$17h2ebde5c2d8ba32b5E_ZN4core3str21_$LT$impl$u20$str$GT$8contains17h194016f7fbe87ddaE_ZN4core5slice4sort14break_patterns17h285610ceb4f0020fE_ZN4core5slice4sort22partial_insertion_sort17h717780d88e9adc95E_ZN4core5slice4sort7recurse17hb3ec6010972bc252E_ZN4core5slice4sort8heapsort17h5feb6e46bc0024ddE_ZN4core6option15Option$LT$T$GT$6unwrap17h04266acc3b40b593E_ZN4core6option15Option$LT$T$GT$6unwrap17hf0f271ef81e8b490E_ZN50_$LT$$BP$mut$u20$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hfd163c04b3039f48E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h3ac99577867382ebE_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h7fb4837300b6ba06E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hbf728b0a7d6a9439E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hd5b80709d2d17820E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h569a64abfd8edbd3E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h6e7c15a489991d48E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h8168b035bbc76311E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17hc6c2777dbe9628e4E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h22398aaa8a7941d3E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h4308675e8cb8edc0E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h679f429275b29e92E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17hb2b2c69936e90a07E_ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Debug$GT$3fmt17h6b9974d78db345f6E_ZN5alloc3vec16Vec$LT$T$C$A$GT$6insert17h35057afe8914dd4eE_ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17h64925e500ce5daa9E_ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17h6c12dfbe6156b1d2E_ZN5alloc5alloc8box_free17h1506726f870520a2E_ZN5alloc5alloc8box_free17h7235a2c09fe33bafE_ZN5alloc7raw_vec11finish_grow17h38202b483312bd78E_ZN5gimli4read4line15FileEntryFormat5parse17h8e4d07a2c88e3316E_ZN5gimli4read4line15parse_attribute17h31cb2d6c5e85d6c9E_ZN5gimli4read4line27FileEntry$LT$R$C$Offset$GT$5parse17h82de81a95975789eE_ZN5gimli4read4unit15parse_attribute17h445dcd9073146244E_ZN5gimli4read4unit18Attribute$LT$R$GT$5value17h0ebdec163f47b947E_ZN5gimli4read5dwarf14Dwarf$LT$R$GT$11attr_string17h7ade7658e5a2e063E_ZN5gimli4read6reader6Reader12read_address17hb0eb2c6d61da61d6E_ZN5gimli4read8rnglists20RngListIter$LT$R$GT$4next17h6da86a6bd1480f21E_ZN60_$LT$alloc..string..String$u20$as$u20$core..fmt..Display$GT$3fmt17hcece20dc22dd579dE_ZN61_$LT$std..path..Component$u20$as$u20$core..cmp..PartialEq$GT$2eq17hedd2829f90c428baE_ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$17is_write_vectored17h960222229191e64cE_ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17h61f90d8dd0038339E_ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17he2bea8ca4e6d810cE_ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17hefe52687a9099c8bE_ZN83_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$9write_all17h2aeae84ce6a15903E_ZN90_$LT$gimli..read..unit..AttributeValue$LT$R$C$Offset$GT$$u20$as$u20$core..clone..Clone$GT$5clone17hf312da8f8d452a06E_ZN91_$LT$std..panicking..begin_panic..PanicPayload$LT$A$GT$$u20$as$u20$core..panic..BoxMeUp$GT$3get17h693e27baada4cd54E_ZN91_$LT$std..panicking..begin_panic..PanicPayload$LT$A$GT$$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h89a91a020e8414caE_ZN9addr2line16Context$LT$R$GT$10from_dwarf17h75f8e4ae36b047acE_ZN9addr2line16ResUnit$LT$R$GT$11parse_lines17haec773167e562acaE_ZN9addr2line16ResUnit$LT$R$GT$11render_file17h59efc7ce3f09c364E_ZN9addr2line16ResUnit$LT$R$GT$13find_location17hcd85c40d212e1ce6E_ZN9addr2line17Function$LT$R$GT$14parse_children17hab00b6c18ba7193fE_ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17h7292b904e3faee8aE_ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17ha4c94a5024f5e0fdE_ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17hfd1e58f62d8f6250E_ZN9addr2line9name_attr17h39ed5df4834bf613E_rust_extern_with_linkage___dso_handlestr.5str.6panic_unwind.4wsda5s0-cgu.0_ZN12panic_unwind5dwarf2eh20read_encoded_pointer17h9203e6d953c5c5abE_ZN12panic_unwind8real_imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h19fd542a7d81e794E_ZN12panic_unwind8real_imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h6ac2cd7ffedcb1b3E_ZN12panic_unwind8real_imp5panic17exception_cleanup17h6f1f24e9c23abf8dE_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h014f2311447de4feE_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17hd02a7f735495c2a6E_ZN4core3ptr79drop_in_place$LT$alloc..boxed..Box$LT$panic_unwind..real_imp..Exception$GT$$GT$17he3bb12d446a4c56aE_ZN4core3ptr88drop_in_place$LT$panic_unwind..real_imp..find_eh_action..$u7b$$u7b$closure$u7d$$u7d$$GT$17h043e09c466faadc9E_ZN5alloc5alloc8box_free17h63b36fd526d4d83bE_ZN5alloc5alloc8box_free17h8ed8cb57aca0a7d0Eminiz_oxide.8suyx5qc-cgu.0_ZN11miniz_oxide7inflate4core11apply_match17he2690a87b4f1e69eE_ZN11miniz_oxide7inflate4core8transfer17h07c429c427a0449cE_ZN11miniz_oxide7inflate4core9init_tree17he1a4e584eeee2511Eadler.4jhznnrz-cgu.0object.5skt3w44-cgu.0addr2line.4s3xpjp0-cgu.0_ZN5alloc7raw_vec11finish_grow17h9d78bb65bd7027dfEgimli.5km17kr2-cgu.0GCC_except_table111GCC_except_table114GCC_except_table117GCC_except_table120GCC_except_table129GCC_except_table132GCC_except_table135GCC_except_table138GCC_except_table141GCC_except_table144GCC_except_table147GCC_except_table150GCC_except_table153GCC_except_table156GCC_except_table159GCC_except_table162GCC_except_table165GCC_except_table168GCC_except_table171GCC_except_table174GCC_except_table177GCC_except_table183GCC_except_table186GCC_except_table189GCC_except_table192GCC_except_table195GCC_except_table53GCC_except_table54GCC_except_table56_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h2ce21b83d36c3c37E_ZN4core3ptr134drop_in_place$LT$alloc..boxed..Box$LT$alloc..collections..btree..node..LeafNode$LT$u64$C$gimli..read..abbrev..Abbreviation$GT$$GT$$GT$17he295a5df3220188cE_ZN4core3ptr138drop_in_place$LT$alloc..boxed..Box$LT$alloc..collections..btree..node..InternalNode$LT$u64$C$gimli..read..abbrev..Abbreviation$GT$$GT$$GT$17h52ab5b12df554fe0E_ZN4core3ptr52drop_in_place$LT$gimli..read..abbrev..Attributes$GT$17h18d8fe9570724e3bE_ZN4core3ptr54drop_in_place$LT$gimli..read..abbrev..Abbreviation$GT$17h5b14a7be8b9f180aE_ZN4core3ptr68drop_in_place$LT$$LP$u64$C$gimli..read..abbrev..Abbreviation$RP$$GT$17h8e6dee8d5a097a9cE_ZN4core3ptr87drop_in_place$LT$alloc..vec..Vec$LT$gimli..read..abbrev..AttributeSpecification$GT$$GT$17h9f059490e44e9204E_ZN5alloc7raw_vec11finish_grow17h3009ec24e38b4c25Erustc_demangle.8fxhyhex-cgu.0_ZN14rustc_demangle2v06Parser10skip_const17h33b3c8df9422e87aE_ZN14rustc_demangle2v06Parser5ident17h313b300608370f4fE_ZN14rustc_demangle2v06Parser9skip_path17heaf9d046a5558771E_ZN14rustc_demangle2v06Parser9skip_type17h1aaa089086913933E_ZN14rustc_demangle2v07Printer10print_path17hfb80381c0e49a364E_ZN14rustc_demangle2v07Printer10print_type17h792c547e8e94c37cE_ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$17h75c4e3acd8c2e7e4E_ZN14rustc_demangle2v07Printer11print_const17ha1e47e21e07b8575E_ZN14rustc_demangle2v07Printer15print_dyn_trait17h73fd216606eb216eE_ZN14rustc_demangle2v07Printer16print_const_uint17h6748d9b16a2c3749E_ZN14rustc_demangle2v07Printer17print_generic_arg17h47a16444af999e77E_ZN14rustc_demangle2v07Printer25print_lifetime_from_index17h1bbf5887e0686d55E_ZN14rustc_demangle2v07Printer30print_path_maybe_open_generics17h7a04f94405a3799aE_ZN4core3ptr33drop_in_place$LT$$RF$$LP$$RP$$GT$17h592186bf36d4543bE_ZN81_$LT$core..str..pattern..CharSearcher$u20$as$u20$core..str..pattern..Searcher$GT$10next_match17hf989bcb6c9c7f97dEalloc.66u4awga-cgu.0GCC_except_table17GCC_except_table18GCC_except_table23GCC_except_table26GCC_except_table27GCC_except_table28GCC_except_table29GCC_except_table30GCC_except_table31_ZN4core3ptr42drop_in_place$LT$alloc..string..String$GT$17h52e7bb42593a29d9E_ZN5alloc7raw_vec11finish_grow17h00613e62b1566f7aEcore.bxlikzz4-cgu.0_ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h108f63b8120e9c9cE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h09658722a017be6bE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h82aa4e1f1748fd9cE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h87d24750071b5658E_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha0ad6d181d9011ecE_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hb2f01487d8e24b54E_ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h905d9d1f052b2751E_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..Debug$u20$for$u20$usize$GT$3fmt17h99c8e5bf1f4ab3f3E_ZN4core3fmt5Write10write_char17hf7abebfcdcdbc844E_ZN4core3fmt5Write9write_fmt17hc8a1698fd3fde6e3E_ZN4core3fmt8builders10DebugInner5entry17h3bf284e5698bb914E_ZN4core3fmt9Formatter12pad_integral12write_prefix17h89d94f6859d81915E_ZN4core3num14from_str_radix17h716f1a7791055e99E_ZN4core3ops8function6FnOnce9call_once17h00ad4a2ce289a64dE_ZN4core3ptr102drop_in_place$LT$$RF$core..iter..adapters..copied..Copied$LT$core..slice..iter..Iter$LT$u8$GT$$GT$$GT$17h5913dccf4681891cE_ZN4core3str11validations15UTF8_CHAR_WIDTH17h7ecfa496f7fe9524E_ZN4core7unicode12unicode_data11white_space17SHORT_OFFSET_RUNS17h42b3f556107ac511E_ZN4core7unicode12unicode_data15grapheme_extend17SHORT_OFFSET_RUNS17h04c130323a60817aE_ZN4core7unicode12unicode_data15grapheme_extend7OFFSETS17h24d3e692cf3b3b60E_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h0ae7987257b4ab3aE_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17hf6469557449e863eE_ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h05503ff1e33fb434E_ZN71_$LT$core..ops..range..Range$LT$Idx$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h1ed9b67004ff43bcEcompiler_builtins.e6fnnbtu-cgu.0compiler_builtins.e6fnnbtu-cgu.43compiler_builtins.e6fnnbtu-cgu.77__FRAME_END____rdl_alloc_zeroed__rust_probestack_ZN4core3fmt9Arguments6new_v117h7750373cfd6fbd78E__rdl_alloc_ZN3std3sys4unix7process14process_common8ExitCode6as_i3217hca62b9889bf21e71E_ZN3std2rt10lang_start17h96dda075b3a29f9dE__rdl_dealloc__rdl_realloc__init_array_end_ZN3std2rt10lang_start28_$u7b$$u7b$closure$u7d$$u7d$17h854069d088eac418E__rg_oom_ZN4core4hint9black_box17hd624f70a57266991E_ZN54_$LT$$LP$$RP$$u20$as$u20$std..process..Termination$GT$6report17h6256f5fafe142b16E_DYNAMIC_ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17hbc38a201165b0d4dE__init_array_start__GNU_EH_FRAME_HDR_GLOBAL_OFFSET_TABLE__ZN4core3ops8function6FnOnce9call_once17h40833b6ee984f973E_ZN93_$LT$std..panicking..begin_panic_handler..StrPanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h53b2a9e2810f2069E__libc_csu_finigetenv@@GLIBC_2.2.5_ZN82_$LT$core..char..EscapeDebug$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hbff5eaac3360abfeEdl_iterate_phdr@@GLIBC_2.2.5_ZN243_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$std..error..Error$GT$11description17h37c89e65a78a02d5E_ZN11miniz_oxide7inflate4core17DecompressorOxide3new17hccb4c7ef2855de81Efree@@GLIBC_2.2.5_ZN3std3env11current_dir17h9f7823af05474328E_ZN3std9panicking3try7cleanup17hd4070df0ec7514cfE_ZN6object4read4util11StringTable3get17he73817eb848712b3Erust_panic_ZN6object4read4util11StringTable3new17h3b78ad41b369f915E_ZN68_$LT$std..thread..local..AccessError$u20$as$u20$core..fmt..Debug$GT$3fmt17h494b05107d7a144fE_ZN3std4sync4once4Once10call_inner17he4820d88e5388bd4E_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17hfa3fe7a4e43757b4E_ZN4core7unicode9printable12is_printable17h485b5a131fb2a9eaEabort@@GLIBC_2.2.5_ZN3std9panicking15begin_panic_fmt17h818c3c917eaeb432E_Unwind_Backtrace@@GCC_3.3_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i32$GT$3fmt17hae0ef2c5a0a98ae0E_ZN4core3fmt9Formatter10debug_list17h021990c116ea6512E__errno_location@@GLIBC_2.2.5pthread_getattr_np@@GLIBC_2.2.5_ITM_deregisterTMCloneTable_ZN91_$LT$std..sys_common..backtrace.._print..DisplayBacktrace$u20$as$u20$core..fmt..Display$GT$3fmt17h171d4c10df1a98eeE_ZN4core3str7pattern11StrSearcher3new17h80082e7e7e8a6600E_ZN74_$LT$std..sys_common..wtf8..Wtf8Buf$u20$as$u20$core..ops..deref..Deref$GT$5deref17h2c870b0c1012b0cfE_ZN4core5slice5index22slice_index_order_fail17hff7ea017696aa219E_ZN11miniz_oxide7inflate4core10decompress17h130587eff724c815E_ZN4core7unicode12unicode_data2cc6lookup17hd4b094300826f8a9E_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u32$GT$3fmt17h1d4e76aa86e94083E_ZN14rustc_demangle8Demangle6as_str17ha912fe5ff5fc6f84E_ZN4core3fmt9Formatter15debug_upper_hex17hdbac3cb457cbbe5cE_ZN4core3fmt10ArgumentV110from_usize17hbca80ea941a0d417E_ZN3std2fs11OpenOptions5_open17h39f12ab0f763a312Ewritev@@GLIBC_2.2.5_ZN3std9panicking20rust_panic_with_hook17h71e6a073d87de1f5E_ZN3std3sys4unix17thread_local_dtor13register_dtor17hb28ac350c252193cE_ZN3std10sys_common11thread_info3set17h89c65182c9a494cdEsigaction@@GLIBC_2.2.5_ZN4core6option13expect_failed17h5086d7196b9e2f90E__rust_drop_panic_ZN58_$LT$std..io..error..Error$u20$as$u20$core..fmt..Debug$GT$3fmt17h2d93ee0d42607686E_ZN4core3fmt3num55_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$usize$GT$3fmt17h7b9678389d8e4dbaE_ZN5alloc6string6String15from_utf8_lossy17h23e30baf5012b3caE_ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$14write_vectored17heaf325e560f21019E_ZN242_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Debug$GT$3fmt17h65c0afef8dbe4a9bE_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$15copy_from_slice17len_mismatch_fail17h7b96896d12c751c3E__cxa_thread_atexit_impl@@GLIBC_2.18__xpg_strerror_r@@GLIBC_2.3.4readlink@@GLIBC_2.2.5_Unwind_GetRegionStart@@GCC_3.0write@@GLIBC_2.2.5_ZN99_$LT$std..sys_common..os_str_bytes..Buf$u20$as$u20$std..sys_common..AsInner$LT$$u5b$u8$u5d$$GT$$GT$8as_inner17hded3a3ff9bbb8970E_ZN4core3fmt8builders9DebugList6finish17h436f40b918c575b5E_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u64$GT$3fmt17h48d894a52c575073E_Unwind_GetTextRelBase@@GCC_3.0_Unwind_RaiseException@@GCC_3.0_edata_ZN3std7process5abort17hc961b4288a9c7d22E_ZN57_$LT$core..fmt..Formatter$u20$as$u20$core..fmt..Write$GT$10write_char17hf9e47c6882cda77fE_ZN4core3str8converts9from_utf817h7b6cb3ecf3152b01E_ZN40_$LT$str$u20$as$u20$core..fmt..Debug$GT$3fmt17h9346546ee5d78916EDW.ref.rust_eh_personality_ZN4core5slice5index24slice_end_index_len_fail17h76d9198f7f9a8157E_ZN3std9panicking11panic_count17is_zero_slow_path17h4996d7e61404dc4dE_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u64$GT$3fmt17h189acc5b7b62b8f7E_ZN4core3str5lossy9Utf8Lossy8from_str17hf7a25576a9f412d0E_ZN4core9panicking18panic_bounds_check17h16537cfb53a1364bE_ZN4core5panic9PanicInfo7message17hf427e245f6f0bc24E_ZN90_$LT$std..panicking..begin_panic_handler..PanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h7219dd4e9a7e5e13E_ZN57_$LT$core..fmt..Arguments$u20$as$u20$core..fmt..Debug$GT$3fmt17h51ca8a7fe093aea3E_ZN4core3fmt3num55_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$isize$GT$3fmt17hc0576ef2669a8b98Estrlen@@GLIBC_2.2.5_ZN60_$LT$std..io..error..Error$u20$as$u20$core..fmt..Display$GT$3fmt17h67041947ec7bdd97Epthread_mutexattr_destroy@@GLIBC_2.2.5mmap@@GLIBC_2.2.5_ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$5write17ha61e522533589548E_ZN70_$LT$std..sync..once..WaiterQueue$u20$as$u20$core..ops..drop..Drop$GT$4drop17hbca140fbed35c1f9E_ZN5gimli4read6abbrev13Abbreviations5empty17hc315447a378f2016E_ZN68_$LT$core..num..error..ParseIntError$u20$as$u20$core..fmt..Debug$GT$3fmt17h72df0e7a3eff2786Efstat64__rust_alloc_ZN4core3ptr85drop_in_place$LT$std..rt..lang_start$LT$$LP$$RP$$GT$..$u7b$$u7b$closure$u7d$$u7d$$GT$17h622f8c58953ffea6E_ZN43_$LT$char$u20$as$u20$core..fmt..Display$GT$3fmt17h1543a75782a98abfEpthread_setspecific@@GLIBC_2.2.5_ZN4core3fmt9Formatter12pad_integral17h0f9951fc9f2b13b4Epthread_mutex_destroy@@GLIBC_2.2.5_ZN4core3fmt9Formatter9write_fmt17hf51714c6357b86a2Epthread_mutexattr_init@@GLIBC_2.2.5_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i32$GT$3fmt17hd6bd52d94c3c8cbcErust_begin_unwind_ZN60_$LT$std..io..stdio..StdoutRaw$u20$as$u20$std..io..Write$GT$9write_all17hde0ccb3dab7a1b0cE_ZN4core3num21_$LT$impl$u20$u32$GT$14from_str_radix17h86becb1335b79b78E_ZN4core6option18expect_none_failed17hf37eebedadde29e6E_ZN96_$LT$core..str..lossy..Utf8LossyChunksIter$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h90bc8f40546cd7bfE_ZN4core5panic8Location6caller17h38fa1e4f77f17674E_ZN3std10sys_common16thread_local_key9StaticKey9lazy_init17hea50d4ae560ea5edE_ZN79_$LT$$RF$$u5b$u8$u5d$$u20$as$u20$std..ffi..c_str..CString..new..SpecIntoVec$GT$8into_vec17h00ba4d7a1aaa7d49E__rust_start_panic_ZN5gimli4read4unit20allow_section_offset17h1434bc929bf528feE__rust_dealloc_ZN3std3env7_var_os17he11885e7d22e8239E_ZN4core3str5lossy9Utf8Lossy6chunks17h13dc06f80abf8c20E_ZN4core3fmt8builders10DebugTuple5field17h581349ec22bf4733E__rust_alloc_zeroed_ZN64_$LT$std..sys..unix..stdio..Stdout$u20$as$u20$std..io..Write$GT$5flush17h4a081f96f50805f1Ememset@@GLIBC_2.2.5_ZN62_$LT$std..ffi..c_str..NulError$u20$as$u20$core..fmt..Debug$GT$3fmt17h7c9584138c609915Egetcwd@@GLIBC_2.2.5_Unwind_GetIPInfo@@GCC_4.2.0_ZN4core3num60_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u64$GT$8from_str17h3cb090062f7f905cEclose@@GLIBC_2.2.5_ZN4core3fmt9Formatter9write_str17hd670d910ce02872fE_ZN5gimli6common9SectionId4name17h07e1a3294fddf2ceE_ZN4core3fmt9Formatter15debug_lower_hex17hb9158b04f1f1b6d1E_ZN4core3fmt8builders9DebugList5entry17hbd53ecf1d93f6974Epthread_attr_getstack@@GLIBC_2.2.5_ZN41_$LT$char$u20$as$u20$core..fmt..Debug$GT$3fmt17h719f0c734842b405E_ZN61_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$9write_all17h1823251172a52664E_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i64$GT$3fmt17h5804edae826a5de1E_ZN244_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Display$GT$3fmt17h681b64d63d194660E_Unwind_GetLanguageSpecificData@@GCC_3.0memchr@@GLIBC_2.2.5__libc_start_main@@GLIBC_2.2.5_ZN4core3fmt8builders8DebugSet5entry17hce63a6c648ea944bE_ZN66_$LT$core..str..lossy..Utf8Lossy$u20$as$u20$core..fmt..Display$GT$3fmt17hab1f16c72cf81424E__tls_get_addr@@GLIBC_2.3_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u8$GT$3fmt17h7bff6ffdd196c44eE_ZN4core3str16slice_error_fail17h3dfd55b8eb058100Epthread_rwlock_rdlock@@GLIBC_2.2.5_ZN5alloc6string104_$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$4from17h2ac43fe76d4b8367E_ZN4core3str6traits23str_index_overflow_fail17h2488b58f5882a4ddE_ZN61_$LT$rustc_demangle..Demangle$u20$as$u20$core..fmt..Debug$GT$3fmt17hfba5770eca955fe1Ecalloc@@GLIBC_2.2.5_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i8$GT$3fmt17h1ef66fc617bfb9a8E_ZN5gimli4read6abbrev10Attributes4push17h4eb4ab275a28fa28E__fxstat64@@GLIBC_2.2.5_ZN5alloc11collections5btree4node10splitpoint17hbf6dd21b49eeb284Esignal@@GLIBC_2.2.5_ZN9addr2line9path_push17ha8ead515c427a5ddE_ZN4core3fmt3num55_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$isize$GT$3fmt17hb3a4d748d52e855aE_ZN3std4path10Components7as_path17ha1e874e5540953baE_ZN79_$LT$std..backtrace_rs..symbolize..SymbolName$u20$as$u20$core..fmt..Display$GT$3fmt17he92b327390e24179E_ZN5alloc7raw_vec17capacity_overflow17h45670d7795721de0E_ZN4core5slice6memchr19memchr_general_case17h169578dc8569beffE_ZN59_$LT$core..fmt..Arguments$u20$as$u20$core..fmt..Display$GT$3fmt17h8966b5fdeddc7196Esyscall@@GLIBC_2.2.5_ZN5gimli4read6abbrev13Abbreviations6insert17h11ddbcc1bebe58b7E_ZN5gimli4read4line7LineRow18apply_line_advance17h8a7d941cb2c11f32E_ZN4core6result13unwrap_failed17h3ad3048f75d7d745E__gmon_start__rust_oom_ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$5flush17h8c3539b6c7e68ab3E_ZN4core3fmt3num3imp54_$LT$impl$u20$core..fmt..Display$u20$for$u20$usize$GT$3fmt17hdf38f9e8c4c02304Ememcpy@@GLIBC_2.14_ZN4core3fmt8builders10DebugTuple6finish17h3656c2dddfe18430E_ZN62_$LT$std..io..error..ErrorKind$u20$as$u20$core..fmt..Debug$GT$3fmt17h2657609440c289adE_ZN4core3fmt9Formatter11debug_tuple17hf1334483fba2fa80E_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i64$GT$3fmt17hc386b79478f7220bE_ZN3std3sys4unix2fs8readlink17h9fa6eaf82d84d5bdE_Unwind_GetIP@@GCC_3.0__rust_alloc_error_handler_ZN3std9panicking11panic_count18GLOBAL_PANIC_COUNT17h58eefd64c8b28ca2Epthread_getspecific@@GLIBC_2.2.5pthread_mutex_unlock@@GLIBC_2.2.5__libc_csu_init_ZN4core3fmt5write17h89e4288724daa3faEpthread_mutexattr_settype@@GLIBC_2.2.5malloc@@GLIBC_2.2.5_ZN93_$LT$std..panicking..begin_panic_handler..StrPanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$3get17haeb07e5e3cecd701E_ZN3std3ffi5c_str104_$LT$impl$u20$core..convert..From$LT$std..ffi..c_str..NulError$GT$$u20$for$u20$std..io..error..Error$GT$4from17h06d65e9b6fc0adb3E_ZN4core3fmt9Formatter9alternate17hf76beaf39e40cc25E_ZN4core3fmt3num3imp51_$LT$impl$u20$core..fmt..Display$u20$for$u20$u8$GT$3fmt17h491f9bb81842401dEbcmp@@GLIBC_2.2.5pthread_rwlock_unlock@@GLIBC_2.2.5_ZN4core5slice5index26slice_start_index_len_fail17h1218e2e291e3f22cE_ZN80_$LT$std..path..Components$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hdc733caef0652771E_ZN61_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$9write_fmt17h46cdbb05ad893dabE_ZN3std2rt19lang_start_internal17hd5b67df56ca01daeE_ZN75_$LT$gimli..read..abbrev..Attributes$u20$as$u20$core..ops..deref..Deref$GT$5deref17h03bfc5d26bf62b05E_ZN5gimli4read6abbrev12Abbreviation3new17h43b770e15703886eErealloc@@GLIBC_2.2.5_ZN57_$LT$core..fmt..Formatter$u20$as$u20$core..fmt..Write$GT$9write_str17hd27d46e73e27f2bfE_ZN4core3num62_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$usize$GT$8from_str17h23287d83d426d8e9E__bss_start_ZN14rustc_demangle12try_demangle17hd6e37a867168fc9cEmunmap@@GLIBC_2.2.5main_ZN64_$LT$rustc_demangle..v0..Ident$u20$as$u20$core..fmt..Display$GT$3fmt17h9758fc5c7bfbbab7E_ZN14rustc_demangle8demangle17hfadaf8598d01ea1bEpthread_key_create@@GLIBC_2.2.5_Unwind_GetDataRelBase@@GCC_3.0poll@@GLIBC_2.2.5_Unwind_SetGR@@GCC_3.0open64@@GLIBC_2.2.5memmove@@GLIBC_2.2.5_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17h5d8dde62d565a4afE__rust_foreign_exception_ZN4core5panic9PanicInfo7payload17hf1c68f36344f6a51E_ZN5alloc5alloc18handle_alloc_error17h35a88ac649661df0E_ZN4core3fmt3num52_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i8$GT$3fmt17h545225617cf8ffb0E_ZN60_$LT$core..panic..Location$u20$as$u20$core..fmt..Display$GT$3fmt17h04ac48d2356e08fdEpthread_self@@GLIBC_2.2.5_ZN3std3env11current_exe17h0d2e2f1e48115b61E_ZN4core3fmt3num55_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$usize$GT$3fmt17hc5d551cc331a3d29Ememrchr@@GLIBC_2.2.5_ZN64_$LT$core..str..error..Utf8Error$u20$as$u20$core..fmt..Debug$GT$3fmt17h6b03b1cc0b978bb7E_ZN42_$LT$str$u20$as$u20$core..fmt..Display$GT$3fmt17hba1ddec6fae90f51E_ZN4core9panicking9panic_fmt17hcd56f7f635f62c74Emprotect@@GLIBC_2.2.5_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u32$GT$3fmt17had74a8494660bc5bEopen@@GLIBC_2.2.5_ZN90_$LT$std..panicking..begin_panic_handler..PanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$3get17h443c9527dd3d3996E__umodti3_ZN63_$LT$core..cell..BorrowMutError$u20$as$u20$core..fmt..Debug$GT$3fmt17h52cd71b13f3bc410Esysconf@@GLIBC_2.2.5_ZN3std3ffi5c_str7CString18from_vec_unchecked17h7ac4fa6ef273471aE_ZN3std4path4Path13_strip_prefix17hc8421e986cb33978E_ZN63_$LT$rustc_demangle..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17hd7a0833add7cbde9E_ZN4core3fmt8builders11DebugStruct5field17h0feb4ae6bd60cf22E__rust_panic_cleanup_ZN57_$LT$std..io..error..Repr$u20$as$u20$core..fmt..Debug$GT$3fmt17hca84ffc0fc9659d6Epthread_attr_destroy@@GLIBC_2.2.5_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u32$GT$3fmt17h38d450780be8200cE_ZN4core3fmt9Formatter3pad17h2bed62c7a96ce09cE_ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u64$GT$3fmt17h4a7425b0397d303dE_ZN71_$LT$rustc_demangle..legacy..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17h8d32d137e161f723E_ZN60_$LT$core..cell..BorrowError$u20$as$u20$core..fmt..Debug$GT$3fmt17h0fbc332f9abf0df3Epthread_key_delete@@GLIBC_2.2.5_ZN4core3str5lossy9Utf8Lossy10from_bytes17hd6307cf476ec27e9E__TMC_END___ZN4core3fmt3num52_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u8$GT$3fmt17h674ec662ca3df834E_ZN57_$LT$core..fmt..Formatter$u20$as$u20$core..fmt..Write$GT$9write_fmt17h45f6e1f4a0584ce9E_ZN3std2io5stdio6_print17hfdac4ecf8a146755Eposix_memalign@@GLIBC_2.2.5_ITM_registerTMCloneTable_Unwind_DeleteException@@GCC_3.0_ZN4core9panicking5panic17h07405d6be4bce887E_ZN68_$LT$core..fmt..builders..PadAdapter$u20$as$u20$core..fmt..Write$GT$9write_str17h3ae11c2145da0156E_ZN4core5panic9PanicInfo8location17h6f46fd595f355118Esigaltstack@@GLIBC_2.2.5dlsym@@GLIBC_2.2.5__rust_realloc_ZN73_$LT$std..sys_common..os_str_bytes..Slice$u20$as$u20$core..fmt..Debug$GT$3fmt17hacf30086fb8b8e9aE_Unwind_Resume@@GCC_3.0_ZN4core7unicode12unicode_data15grapheme_extend6lookup17h28f040caa93359bbE__udivti3pthread_mutex_init@@GLIBC_2.2.5__cxa_finalize@@GLIBC_2.2.5_ZN4core3fmt9Formatter12debug_struct17hba584b36b0ade431E_ZN4core3fmt8builders11DebugStruct6finish17h018e364a0c02fd4bEpthread_mutex_lock@@GLIBC_2.2.5pthread_mutex_trylock@@GLIBC_2.2.5_ZN5gimli4read6abbrev10Attributes3new17h449010590ce318ebE_Unwind_SetIP@@GCC_3.0_ZN55_$LT$std..path..Display$u20$as$u20$core..fmt..Debug$GT$3fmt17he4d67d8192391554E_ZN3std6thread6Thread3new17h97218b268a75acc2E_ZN5adler7Adler3211write_slice17ha7b5dce1a88ebc0aE.symtab.strtab.shstrtab.interp.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.got.text.fini.rodata.eh_frame_hdr.eh_frame.gcc_except_table.tbss.init_array.fini_array.data.rel.ro.dynamic.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_pubtypes.debug_ranges# 1$Do@@$N hhV@ +@ +^okoz=BxNxNHPP P P@`P`PpPpP)yy L Lh'h'T U Ex  U E0U0E8U8E"PwPg@yihpPPPp0Pp#lp2l3B d NY \\c:hv`u0vB)~)&1V' 72U2 \ No newline at end of file diff --git a/tests/fixtures/install/helloworld_macos b/tests/fixtures/install/helloworld_macos new file mode 100755 index 000000000..40e6ee515 --- /dev/null +++ b/tests/fixtures/install/helloworld_macos @@ -0,0 +1,689 @@ +H__PAGEZEROx__TEXT__text__TEXTf__stubs__TEXT||__stub_helper__TEXTP~P~__const__TEXT+__gcc_except_tab__TEXT| |__unwind_info__TEXT__eh_frame__TEXT((__DATA_CONST@@__got__DATA_CONST@__const__DATA_CONST(__DATA@@__la_symbol_ptr__DATAB__data__DATA__thread_vars__DATAx__thread_bss__DATAhq__bss__DATA__common__DATAH__LINKEDIT@@@09"0@A0@AFh/ zp +(#V Pz z . +B ! /usr/lib/dyldw-5YkK2  + +a*(@ 8d/usr/lib/libSystem.B.dylib 8/usr/lib/libresolv.9.dylib&Xv)yUHPHEH]ÐUHH HH}HMHHuHHEHUHHM{HEHEH ]f.UHHH?pEEH]ÐUHH1EEH]DUHH@}H}EEH]ÐUH]ÐUHH0H1H i1AH}HƺH}H0]DUHHHcH=HuHHUH]ÐUHHH?EEH]@UHH0H}H}EEH0]H}Fe HEUDUHHH]UHPH]ÐUHH H ]H}d HEUUHHHHEH7HWHUHuHWHwHO LG(H]Ð;f.f.f.UHAWAVAUATSHHF0HIHHF0HFHLDH}IIMo2I9HIIkpHt`JTH`HMJ@LHtwIHHt1f.H8HH9uH)IrFH8H8H8H8H8H8H8H8HuE1bHGA81DHID2LHI9HHtD0L`IHH`HHII_MoH}HHHHH[A\A]A^A_]H=^jHݥ+#\UHHYg,]UHH~]UHHjРG^ +]UHAVSHL7H;tLH[A^](1H0LHބt [A^]1[A^]6@UHAVSHL7HtLH[A^]3HLHބt [A^]3[A^]49@UHHH8H@H@H]f.UHH?]UHAWAVAUATSHHHLhHHUHEMt*L5qL}LeH]HLLLIuH}H[A\A]A^A_]f.@UHH?]sUHHHHwH]IfUHH?]S0UHAVSHIHtLH[A^]0HLHބt [A^]-1[A^]5@UHHEsHuE&H]Hu=s M$? EH]=s. M?ɀM$? EĭH]M ?ɀM?ɀM$? E舭H]fUHHEsHuE薫H]Hu=s M$? EiH]=s. M?ɀM$? E4H]M ?ɀM?ɀM$? EH]fUHHEsHuEHu=sM$? E]=s% M?ɀM$? E1M ?ɀM?ɀM$? E01H]UHH@H}HF(HEHF HEHFHEHFHEHHNHMHEH5fH}HUaH@]f.UHH@H}HF(HEHF HEHFHEHFHEHHNHMHEH56H}HUH@]f.UHH@H}HF(HEHF HEHFHEHFHEHHNHMHEH5H}HUH@]f.UHAVSH HHHJHMH +HRHUHMHHHEϋWHuHAH;HtHsHt +DH [A^]IHLx\ UHHHHEH}H]fUH]fDUH]fDUHAVSH0H1H HHDu H\t H0[A^]HEHEHEfEH=uZHH=HEHHEHHEHMH HHHH0[A^]^\H==`H 6L?HUqT IH}s;IHEH{HEHhHEHMH QHBH=3FHnLZ @UHHHHEH}H]fUH]f.UHHwHtH?HtHt ] +]UHAWAVATSIL'LMtEI1f.@H I9t#IDHH4@HtI|M&IvHt MtHtL[A\A^A_]x[A\A^A_]f.DUHHGHt H?HtHH4@Ht ]3]ÐUHH]UHHHpHtHtH8]]f.UHAWAVSPIHHGH<H@L<fDHL9tH;HtHsHtIIFHt)Ht$HH4@HtHH[A^A_]eH[A^A_]f.UHH]fUHu]]f.UHAVSHH?HCHCHpHtH;HP[A^][A^]IH;Hs]LjX fUH?u]]of.DUHHHu]M\]f.UHAVSHuL3HHuHH8[A^]X-OuAFfUH僿/u]];f.UHH?t HHHtHpHt ]]@UH]pXfDUHHwHtH?HtHt ]]UHAWAVATSIH?Ii_HtLHHHDLIGHt&I?HtHiHt[A\A^A_]P[A\A^A_]IHtLIĸHHuI?Iw LV If.fUHAWAVATSH?t [A\A^A_]IHGHMfHL<1fDHHI9tEI|uID0HH4HtI|(It@HtI|8tIFHH4HtI~SIF HH4@HOI~[A\A^A_](UHAWAVSPHG<w<t H[A^A_]L{I?IGIGHpHt I?HPH{H[A^A_]II?IwZH{ZL0U UH]UfDUHH?@]ifUHHGHt H?HtHH4Ht ]3]ÐUHHwHtH?HtHt ] +]UHAWAVSP?s H[A^A_]IH_H;HCHCHpHt H;HPIH[A^A_]IH;HsYIYLT f.@UHHwHtH?HtHHt ]G]DUHHH?HtHpHt ]]f.UHHHHtHpHt ]]f.UHAWAVAUATSHIL'HGHtGLkp1DHpI9t.I|tItHtI|HtHtպ{M&IFHtMtHkpHt LRIN HIVMN(2HLBII1HH8H82HI9uH)IcfH8H82H8H82H8H82H8H82HuHEHEE1'HHEHMHEHEH}HuLMH(HuZH8H}H}HtbLeL?MA8IDMt:IDM/1MLM侘IDLIMMuHĸ[A\A]A^A_]L(H](f.fLHH8HKHtHHHtH@HtHt7HIHUHHHu H]U]UHAVSHuL3H>HuHH8[A^]LQGuAFfUHHGHu +H]XT]fDUHAVSHHPp/u[A^]HH[A^]lIHH +LO UHAVS?t+HHHCHCHpHtH{HP[A^][A^]IH{HsULO f.UHHwHtH?HtHHt ]]DUHHHHtHpHt ]]f.UHAWAVAUATSPIL/HGHLi 1@H I9tsI|XjAx/uAu,At7IAtIAtIM.IFHt,Mt'Hi HtLH[A\A]A^A_]H[A\A]A^A_]II:II@I$H9t*I)II H H IuI>Iv}LM If.@UHHtHtHiHt ]]fUHHHt Hu]R]fDUHH?t#HwHtHHtHt ]]ÐUHAWAVSPHH?t<{r\L{I?IGIGHpHt I?HPQH{H{HtHsHtH[A^A_]H[A^A_]II?IwRH{HRLL f.@UHHwHtHtH?]]f.UHAWAVSPIHHGH<H@L<fDHL9tH;HtHsHt\IIFHt)Ht$HH4@HtHH[A^A_]%H[A^A_]f.UHSPHHGHtH;HtHH4Ht +Hs HtH{HtHtH[]H[]UHAWAVAUATSPIHG(Ht I~ HtHH4@Ht +vI~8HtBIF@HtHH4Ht +MIvXHtI~PHtHt ++IFpHtyI^hLiIPHðIPHðIPtPuHPIivpHtI~hH[A\A]A^A_]H[A\A]A^A_]IMtLIPHHHCII^[A^]HYHHCf.@UHSPHHw0HtH{(HtHHt +HCHHt H{@HtHH4@Ht +Hs`HtH{XHtHHt +HsxHtH{pHtHtH[]\H[]DUHAWAVATSH?t [A\A^A_]IHGHt_I^H@L<fHL9tH;HtHsHtIFHH4@HtI~M~ MtMfI1fDH I9t#IDHH4@HtI|Iv H7I~[A\A^A_]`UHHHt Hu]J]fDUHAWAVSPIHwHtI>HtHt +I~yIMIIGIIH@H@L<fDHL9tH;HtHsHtIIHt)Ht$HH4@HtHH[A^A_]^H[A^A_]HIHIIIƘL-HE UH]FfDUHHHu]-J]f.UHAWAVSPIHHGH^Lk8IH8L9t?H;HtHsHt +Hs HtH{HtHtĺjIIFHt%Ht Hk8HtHH[A^A_]7H[A^A_]f.fUHHHOHPHQHH@HAH]f.UHHHt Hu]H]fDUH]fDUHSPHtH[]HHG0HH4HtH{(Hs@HtH{8H[]lf.fUHHH@]UHH?]DUHAWAVSPHt{uHlI<w)<t%H;HtYHsHtPH[A^A_]I>IFIFHpHt I>HPLH;HuH[A^A_]II>IvHLHIHDLC f.UHAWAVATSIL'HGHtgHL<1f.HHI9tEI|uID0HH4HtI|(It@HtI|8M&IFHt'Mt"HH4HtL[A\A^A_][A\A^A_]fDUHAVSHHXx/uu#u/[A^]HqtH tHH[A^]@IHHUHHLA f.fUHSPHH?Ht;HsHt +Hs HtH{HtHtH[]H[]f.UHH?]BUHSPHH?HtHHCHtHH4Ht +_Hs HtH{HtHtH[]7H[]UHHH?HtHpHt ] ]f.UHHtHtHiHt ]]f@uUHH=TH*8f.@UHAWAVAUATSPIH}LoLgMM)tVIIIIfIIHL9t*I}IEI]HCHpHtI}HP'IvHtHt I> H[A\A]A^A_]II}IuDMtLIIuH}LX? If.UHHtHtHi Ht ]]fUHHGHH4@HtH]\]f.UH?tHGHu +H]B]ÐUH?u]]f.DUHAWAVAUATSPIL/HGHt9Li1HðI9tAuI|M.IFHt,Mt'HiHtLH[A\A]A^A_]H[A\A]A^A_]II$PH9t*I)IPIH HðIPuI>Iv0L= IUHAWAVAUATSHIHHHHh}@L]LEMHLhHpLxH}ID8IMH9eLuH]HMLHXH)H`HHHMAIsEL9MLGI:L@L9sKHH9 LaAT :LtH}LLE1JH9rhf.DHf.I9HL9H9H9AT A:tHXL`JH97L]H}bHhHpLDMHUf.HAHtH9tb<XH9H4x DHFL9t?FH?AAv9L9t=DHA?D ؀r8L9t<6?61LAAwAD .E1LD ؀sA D 1AAD fE="= ==HH9sL]L}HMHMM9MMGHuLJH9|AIsHHI :LI9t*HH9ATLsH:LtHHLf.@HtnHL9H9H9A\ A:tH}aD4EHMEu6ADMHU$EHU1LH}HELH}HĈ[A\A]A^A_]II9LBH!~L3H*~HL3H0~H3LiH5LH9HBH}c3UHAWAVAUATSH(HIIHvH|M|ItMlM9LIG9txM9IDI\HHHMHHPHUHMH HSHHPHKHHIteL}LmKdLuI)M9sIIHCHCHCHKHKHHMt"HsLsM9LIGL8txH]HEHCHEHMHKHH([A\A]A^A_]f.fUHAWAVAUATSHDEHMIHsIHxIAEÈ]MLpLeU}PHMIKt-K\mI2HNHHHMDM$LeLM9HHBHBMBH4IHL9HBLHBIHHLhL{LKTH OLI9HIBLBHCLBKT(H0L9HBLHBH8KIH(H9IBHIH@I9HBHPKLM|I1L9IBM}MMBMBIT(H9HHHCHHBOOL9HLL9EHL9LeHHHH;@HIH9MCL9MBLhH H9HL90HH8H;(HHHPf1HIKDII^IvIVIN HMHH HMHHHMHHHMHUHPHMN(IIFIv HIvHIvHHL1HFH9s"HIfDH; rHH(H9uHHI@HH9HXH;HHrHIT HUITHUITHUMITHULULS L[ML{HLcIMdLeM|MM\MT HEHC HEHCHEHCHEHUHSHHHFH9:fDHIHI@HI@HHIHIMI) +HM4MIU LLMLL8 +LpMu? +MM9C +KDIL$ HMIL$HMIL$HMI $IT$HUHMIL ITItIIH;LkM9LIGHuMt뱐LLpLUL]LXM9LMH}LXLuL]LpIYLE17f.f1M9BM1<LUIHL9et5LUE"IH{L+M9LIGHuMLt뱐LLpL]LuLXLL)LL)H9HFHAH IITHUIILHMHUA $HH IAHRItItI4ILILI4HHIOAWHRA4$HH4vI|I|If.LLH}LEIHDHscLLLE1HfLMHHGAAHHLL1HIHLE1DD1L9ZHw@1L9Z(Hw@1L9Z@HIw@1L9ZXHH`M9uLHHD1L9ZHAHHuLHIILL11DAEL9_IpAuL9_IpAuL9_IHAEL9_HwIHHI9uLMHaHf.AUL9IHIuL.f.@I9spLUL]AHH@IGItHuI4I|H}HuIwII_IHtHOuP[A^]Ŗ[A^]UHAVSIHH{ H{@藖H{ HtHs(Ht +{I>HtHOu8[A^]X[A^]UHAVSIHH{H{HtHs Ht +I>HtHOu0[A^][A^]fDUHHHvHt +HP]֕]@UHHiHt ]鵕]UH]霕f.fUHAWAVSPIIHtOHH9Ht$HqHtHLlHu M~+Mt8LH,HtIF1L M~1I^IH[A^A_]HHuDUHAWAVAUATSHxIILfMIEHHIIMMeHL<L蘔HIHEH]HEME1HH]HMHEMUH1E11@M\IM]IEA?u<HI @yHHI9uoIAfAIABID$H9MM\LH)HAM]IEADÃ]ЄxH]DeHMH9ZID$H9H].}M\HAM]IEA|}E EЀ}xDeȋ}HMH9SII9IDHIEIMADfDeM MЋ}HMH9HHH 6H9HGHHF1HHHDM׉}tHLxHuHE HDžxH`HHHxLhHpH`ZLEHHuHMDM׋}D"MAAfAHFCD?u<s,؉؃HI Ƅy,IIL9uOlHGLobIAL9t@M)I11LIL>LN?us"ۉڃHH Єy%Ir˸E1HGLHGHMHOHMHOL_ Lw(HG0HG8HG@1UHAWAVAUATSHHMIIH}AALLUIMl$DfIEHM<$MwHHM4$IL$A߃yHMwLXM4$M\$AO˃ ߄yMtIOHI $ID$AGf bGf+wxH HcHH}L"LEH}N HEL}MGM4$L}IGMwIHH[A\A]A^A_]øE1Ӂf  H HcHIUH< +I<$H1E11L}HwI4$IT$?u  +ۉ߃HI KHHr IUH I<$H1E11L}HwI4$IT$?u  ۉ߃HI HHr| AMIEH I $HQHI$ID$LHIUH? I<$H1E11L}HwI4$IT$?u ! ۉ߃HI HHrMUM M$E1H111L}MD3M4M$Mt$A3?u< ЉЃHH DŽ?HHI9uOIEH: +M$IHHI $ID$DDHL!þ# IEH I $HQHI$ID$DDIEH I $HQHI$ID$DQD DIEHe I $HQHI$ID$DDD[A IEHs +I $HQHI$ID$L IEHI $HQHI$ID$DL}DDHL!þIEH I $LAHM$ID$9IEHI $LAHM$ID$9IEHFI $HQHI$ID$DDBAH}IE +H1 +AH}IEHI $HQHI$ID$L + +M$ID$Ht1A<8 HH9u1L}HMGMUMM$E1H111L}MD3M4M$Mt$A3?u< ЉЃHH DŽ4 HHI9uIM' IEHtRI $LAHM$ID$9H)r:I 8I $ID$DDHL!þM$L}MGIEHpI $HQHI$ID$D1uIEH@I $HQHI$ID$9A 1AIEH1E1L}փHI HȄHI$HrI4$ID$?uĄtt1 +AIEHI $HQHI$ID$LIUHI<$H1E11L}HwI4$IT$?u ۉ߃HI y HHrFfUB<z +H ! HcHIEH I $HQHI$ID$D +IEHI $HQHI$ID$D 1IEHI $HQHI$ID$DD IEHSI $HQHI$ID$DDD IIEH8I $HQHI$ID$LDDHL!þ AQIEHI $HQHI$ID$LL 1AIEH~I $HQHI$ID$DDDtAIEHI $HQHI$ID$LIEH.I $HQHI$ID$LDDHL!þfA!DDHLH!þIUHI<$H1E11L}HwI4$IT$?u ۉ߃HI HHrWIUHtSI<$H1E11L}HwI4$IT$?us9ۉ߃HI HHrHI$L}йIEHI $HQHI$ID$LDDHL!þIEHZI $HQHI$ID$D1bIEH-I $HQHI$ID$D 15IEHI $HQHI$ID$DD 11L}A  H IwIGIHEfAG 1LIEHI $HQHI$ID$DQD D IEHrUI $HQHI$ID$DDD KL}AG IEHJI$L}IGIGIEHI$HEHEHEHEHEHEHEHEHML}IOIG=M $L}IEHI $HQHI$ID$DL}DDHL!þgDDHL!1=IEHI $HQHI$ID$DL}DDHL!þAIEH3I$HEHEHEHEHEHEHEHEHMIEH{I $HQHI$ID$DL}DDHL!þ +RIEH(I $HQHI$ID$DL}DDHL!þL}IGIGEWI $HQI$HID$DDDDDHL!þ DDHL!þ[I$XHH1@HDƃ@HMI DDHL!þ I $HQHI$ID$LL}HL!DDIEHI $HQHI$ID$D,I 8I $HH)IT$L}1IDDHL!þ LI9rMH>IDI)HLI$It$DDHL!þI9MMOIOVDDHL!þDDHL!þDDHL!þjIL8HHHI $IT$DDHL!þ*IEHI$L}IOIGsH>IDI)HLI$It$DDHL!þ1IEHI $HQHI$ID$LI $HQHI$ID$DL}DDHL!þCfnh*u([FvAWvZK[TkF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0OFOOO\UHF=0!dȁH HcHHHHH +xm=1!=2!ta=3!nH> +dHFHGH ]HHHCH HcHH> +)HFHGH]H> +HFHGH]HHHH HcHHFH> +HFHGH]HHHH +HcHHFHHH~H v +HcHHHH]H HcHHFqHHH 4H HcHHFHGH]HHHH B HcHHHHH HcHHHHH HcHHHHH gHcHHFHHHuH HcHHFH> +RHFHGH]HHH1H HcHHFHNHGHOH]HHHH HcHHFsHHHH HcHHHHH \HcHHFbH> +HFHGH]H> +nHFHGH]HHHLH HcHHHH+H [HcHHFHHHH HcHHF#HHHH HcHHF/HHHH uHcHHF7HHHH HcHHF4HHHYH HcHHFHGH]HFHy*FHGH]ËFHGH]FHGH]HHHH HcHHFH> +HFHGH]HHHH RHcHHFFFF HFHkHGH,]F$FF HFH@H=4GH+]F$FF HFH +H=fGH&]F$FF HFHH=GH)]F$FF HFHH=GH ]F$FF HFHgH=[GH(]F$FF HFH1H=%GH"]F$FF HFHH=GH$]F$FF HFHH=GH*]F$FF HFHH=GH#]FFF HFHx]HGH']FFF HFHx6H=w.GH%]F"FF HFHxH=v]9GH!]FFF HFHxHGH-]frrrh 7W?i1[2WMIOU&Z&`Wxh8I8`@0v|22HNTYppwXiX},,?EKP lrxR}R +oPaP`Wxh8I8` [aglUHH0HHHHc HHFPHNXL9|LL)p1f.<sHH9uLHFpHNxL9;LL)/1f.<3HH9u GDHLN`HNhH)rRII1HIH)s^HOLOHH0]HF@HNHL9LL)1@<HH9uLGLOIu3HwIOH9 LH)ATփxIDHEH8I\HIǸL +HHH0H +LHHHHxHHHPHHhH +HLHHHIM +IWH9$ITHUATփx xxHBII9HUfHIDHEx ‰xIfxL{ M HEȊt<} ƅPPHHEIvHEHHIwAAy0H?HEHHIwP׃EA  fEAHHAHEL~AAxfA!fE +MHAHEL~Q׃EA y6MHEf HHEA IHMLfA!xMM 111ɐHE8?u t<9ƒHH փHI9uH f +IHEHEA HLfEHHAHEL~Ѓy^MHQHUL~Q׃ y4MHUfo +HH IHMf& +HDžZHH@HDЃ@HMH HEHD8HEHIAHAH HDžHHHHHHHHxHu(HHHlM)HH +LLHHHH +HLHPHHދxLHHxHHHPHHh +H0HHH]AE1 MA +HH0HLLIHBYHEH+`L(LHEHH8HH0HHH(H 0h H IHAH H8HhH0H`H(HXH H8HPfHHHLHEHHHDUHEHJ HEHDžLLH]HJ HELHHhHHphH`Hp`HXHpXHPHpPHDžHDž(HDž8H@HDžHHPHXHDž/LHHHHHHDžHDžHMLmIXI11f.HLS?u ‰ƒHH քyHIr]f.HHDžHDžIMmHDžHDž9H 8McIRIC}HEtMH7IICHIKH"9IACHILMA/H8IACHILMAHMLHMHNH;HkpHIL+UM)MKD1ɀjHHHLHDžHHHHIIH0L8H@HHHHPH.HE.HE1HL`LI $MD$HPHHH0yrIIL@LHHHIUIuHHHHH.HHHHIMIEfq~SHfH ';HcHHHHH@fH p:HcHHHDHHEHHhHH0K=2!t>=3!6HH HHHHHHHXHHHHH8HHVHHuHHHD`HHHHEHHEHHE*HHuHHPLHMSL@HPH0+ 0LM|HHEA2IyIIIK ;Ht,1K9tHHGIHtHpHuIHEHtHHEO8DHHHDžHDžHDžL`H]H +Q/H`[MllAYƅ 2LmOA +HHHQHhHHHUHEIxFA HHAE1LELM'1HE1HE1HEE1E1HH0HpH8ƅH0HHHIH8HHfHHB0HBHH7H+ #1f@HL H H H H8HCH[HHHHHHLHHHHHu"HulHH۠H}uPH}u$HHH豠-AfH}uHHH0H肠H(HHHp@fDfHDž`HDžH`H;XucHH,#H H9HGHHF1ɺ HHHt2HPHi H0H8HDž@HP_HDž0HHHH0ЖHHH"HPHHH HXHi H HHHH`L`MH]MƅxHHOHMHHHUHHWHUHHHuHWPHWHpHUHu_htgHtQHHWHHHpHUHMWHUtHHJ9D2&{fDHrH~HHILMLL9rH~LOL9H9LHIHIT>M$>ILH)L`M9HhLMHuHMITI >HIL>HHH0IILuIIO,>IHH)HUH9HIIH(HLL vIHEH HL0@IGI;ErILf.ILHHIL$HHIL$HH@ID$I $M9II9wH(LLruL(HEHH9LeH(HIMH;HsIM HLHp HLI~ HXI^HXI^HH@IFIL9HIIL9@LH(E1IH8H`H9vHHxHtHtH0Ht +KHHtHHtHt +#LMtNHIILHHƉI`1HtHHِH0H9HFHPH HuHHHHHHHPHXHHH`HHH8qsHH{HUsHTE1HH1fHPhHH!HXHx8H9w1HHPH9v.HP(HxXH9w1HHPHHxxH9w,fDHPH9wHHP(HxXH9vHPHHxxH9wHHHLHjAL2LHDžL?AE1EAE1E1rIE1A>LHDžL?HH0HH8L?L7AAIIHHDžH?1AAIMMLHDžL?HH0HH8L7L?MIAL H uHHLaHAHHPy!HHtHHtHt + Hh [A\A]A^A_]AAwA1HHLXHxHH/mH8v'\HHJHBH빸HHqHAHHHDžH?HH0HH8H?H7HLciIHUi;HHLj'HLHuLeHEH *fHXt~f1MH0HրH0H8HH$HD$H}HMLMMgHEH LeH}MH0HbH0L8L@H}HHU }HEH AE1=LHIθ1HxHXLULILM HHLHHHH0H8HDž@HEHEH@HHEHHHHHHHHH HH(E1LAH]HxHHHL}LvH [KvHULI>HII)L9HpLHH`ITI >HMIL>HHhH@HML,HRMtH[LH)H9HUHIHL$@LLLNHIH}HM-M$HHHLIf.IL$H;OsHHfILHQHPHHIHHHI9HHI9riHL$@LLL#NHEHIH.I9%HELHL}IH;sIVHLfHqHLI}HYI]HHIIMI]L9HIIL9rLHIHAAIHtHtH}Ht +-H8Ht#H0HtHH4@Ht +LPHXL`LpL9MHHH4JHHLHHHd2HH1۹ HI\HMLHIHuHMHEH?HEH0HEH8H7L?IH]LpHEHPHUsHLHHHUIH0L8HDž@HEHEH@HHBHHBHHBHxA1HE1HAHUH(HbIILLtrIH{LHHHHHLH9LrLL9HtBLHH HHHt&HHHH9rwHPH9rA1]1MI) I9 LHMLHHxHHHUHZHHZHL +HZHLLILQHLYHLRLJLZHHYHHYLHHYL HH H{MNLHHALL)kMHH9rLLPMNHH9HwHL9sHuI HU%HLmI9L]{ IIIH_MI) MIHHL$IHHH LlM $L9lrLL9 L\HtHAID$HAID$HHYI\$I$IrBH]L+HA8HAHA0HAHA HQ(HQHH HH9tL9i0rwL9I rL LYLiHqHULL]HtIHI +MHM 1MHUHH9u`HHH~ H 6H9HGHHF1ɺHHHt,HHHHDžHuL^HDžH0HHHML8H@H0 +L}HHHHuHuHUHHIMtLMILMIH(L}L0L]LLHI)ILGHH`HHhHHpHLHI<ItHHUH1HHFL]LpLMILHu4MQLHI<tRLHJD:MDL9v8Hx9HgHL|8HHH9HYH8HHJL"7HN7rHUHHz8[H>HHu7CH5HDžH=DHw+]6Hy<7LHB5HkL7HWLo7HHI9rHPH}HuK7HH4HHu7Hu~uH(HL5aH,L5PH3LLX7HHH-HP, H!HHHHPH: fUHAWAVAUATSHIHHx/uIEIE+HH+HDžHDžHDžHDžhHDžpHDžxL1LHI-MofHH`HHMHH0HH8HuLHMtLHHHuHHIH}L}JL9LuHuL 1LHI,LHMtLHJHHuZHHNHLHHHHLL(9LHuL81LHI0,L(HMLHHHLIH(L0JL8L8HuHP@1HEHI+L@HMSLH7IMHHH HHLuIxH@HUHLL8IXA`Mp.Ax.HXH@)|(AoIIIpHEHXH`HHHhHHHMH HpHxHHHMHHMHHMHHH(HH0HH8H(H@H0HHH8HPH HMHHMHHxHHpHHhHH`HHX(f,IHH()H`HIHxH0HIH8HHHHHHHH8H0H0H(H(H HPHHHHH@H@H8HHHLPHHLXHuH`Hh)pLHHEHHEHHxHHpHHhHHXH`HHEffE,f(HDžHDžfo8HDžHDžHDžDžH HHHHMHHHMH HEJHMHHHpHLHhHLHXH`HTH HHt[HHAHfo77HA0HA(HA DžfHDžƅfDžL M LMAIrLH AtA:C< H 'HcHEA{f.Hl MB1HE11DM\I<LH AD?u< HI @y"HHI9u E]E1L9J3IDM)I)IHL LLMITMFHLADHH &HcHEA[He MB1H11f.DI\1IHH A\1?u ۉ؃HH DŽaHHI9uH +MB1H11fI\1IHH A\1?u 1ۉ؃HH DŽHHI9uE +A +pHl +MB1H11fDID9IHH AD9?u t<ƒHH փ?HHI9uWH MB1H11fI\1IHH A\1?u A ۉ؃HH DŽ1HHI9u& EAH| MB1H11fDI\1IHH A\1?u  ۉ؃HH DŽHHI9u EAEAE A HIAIHL AAE fEA LHH9 IH9 EM%A*HuMB1HE11f.@ID1MHL AD1?u<HI @HHI9u f M I1f.D|HI9ub M' I1H11f.DItIHHA\?u  ۉރHH HHI9u Hs H"Hc HMh IDIHLADEEfEHULEAHH@HDЃ@HMH EHuAE H}A EH}A~EH}AnEH}A^E ]A OHKMAIMII1L1f.IHL @?u< +ЉЃHH DŽyIFIr +M9}IIMu +EH}AL\HHLLHI9; +HDI)IHLHXH?LhHXL`HpHHVHHHNHHNHHN HHN(HH +HHPHHHHH@HH8HHH0H(ELML]AI IDIHLADOI IDIHLAD&I ID IHLIDEHEALuf.DMDUoEH(H0HHH8HH@HHHHHPHHHHHHHAH HcHHfH~HHHDžCfօ6fօHDžƅfօfօLHDžHHEHHxHHpHHhHHH`HXH`H;XHHH 6H9HGHHF1ɺ@HHHfHPHH(H0HDž8fH~HaVƅfօƅOHu7HHHDžy@$fH~HP@H1HHHH1HDž(H}HHH(,H}HuH}dHPHHXH`foH7HXH`HD7HL7HhHD7 HpHD7(HxHD70HEHD78H`E]LuAFM)L9 E]LELuALuM*f.111E11_AE1LuMDLuALMLELL8LL0LL MH*HHDž MH H H EI ńM{A:HxH +HhHpLL8IL"HDžhHpHBHH9:HH4IH L4IMHL]HEf.DM7LMXHDh HhLxLHH@HǹHBr L90uLxXDhf.L;pLHK $H9HGHHF1ɺHHM2JHRHXH`HDžhHt HILuLXL`HhHpHH;HHMH H9HGHHF1ɺ HHHt)HHHHHHDž HDžH(HHH(H0H8H(ZHHH_HDžXHHHHX(HHHHhHHHHpKdL4L|\DlILxLuLAE1qMD1aD*AHHHPHu!HHHDž0ƅ'@H1HHHH1LHEHuHMLMD9A1LuJT +LuALMHUHL8HL0LH IM\HEL]!AE1@M\1HL]HEA111Lu;IIMMD1L]HEALEHEAM111DIIE1UM\AHIDHgHDž_HHXHH`HLLLML]LL8LL0LL LuVLEHEAMHHELIZI +I|$MILU1L]4LHXH`HBHJHhHBIHHK +HHLH)vHrHHHEL HML9sLID HhID IL H`HXHBIAHBIAHHJIIIHIHLM9A@9fHH@HBHBHBHHZHZHBHHB L9B rHHMLH?IMLH(LH 1HIHMt LH覹HHhIHLHDžHDž(HDž0HDž8HEHHHHHHHHHH HE1LL%AHPHXHIIHLKLHLHHUL< +L9<LmHHHLA@LMLMt#LOLHHUHM]LPI9IrII)L9IIHHXHpHXHhLHXH`LXLILQHLYHLPLHLXHpHYHhHYLXH`HYL HH I{LmI KHZL94IILf.H_II)IHHHMLHHM +L9 IH]HHLHhHLHTH`HXHHIJHHIJHHPIRI +IrQLLM9J@AHHIHHHHHHHHXHXHHHH9tHH L9H LHXH`HHHPHhHHLHtIHI +H0I9LH:KL-H9HGHHF1ɺHHMH(LHHXH`HDžhDA1H0I9xH(f.fHHHHNE1f.L9#HIHI9IsLL)II HH0I9HDžXHHHHXHHH H(HH0IJ/Nt/L8IL8IHXHPL(HHELhLHI)ILHHH8HXHH`HLhH0I<ItH`HHH[LmL8ILMELHI<tSLHJt2IDH9v=II}HHILH0H9v5IHJ9t2v!IrI}HHILIDH9rI}HGI9 +I9 +HHI4HIT>M<>ILH)O +LEM9' +HH`LH0ILI>HXID>H`H8IILmIIOd5IHH)HH9HpIIH]HLLIHHHpLf.IFI;D$rILfILHHIOHHIOHH@IGIM9II9H}LL5LuHHH9L}HEHfI $H;sIL$ HLHp HLI} HXI]HXI]HH@IEI]L9HIIL9LHu1IH0I9HH0I9jAAHtHtH(Ht + LLMt4I1 H I9t#IDHH4@HtI|ưHHtHt L襰LuHDžHDžHDžHHfsH@:.uIPI@HLHXHH +LhL`HXHpL(L0H8HDžXHHX`8HHHHHHHHH8HGH(H0HOHHDžAHDž(HDž0HDž8HDžXHHX`~HHHHHHHHH8HGH(H0HOHLILHHHHH`JL4@HE1HE1;HH]H8JD7H(H0JL7J7HEIHE@HLHJHHfHMs6HtUHEH9PIH@HULf.fHEH9PqIHUHH@IH@:.JHHXHHHL`HhL`HX_HpL(H0H8HH9HHH]H 6H9HGHHF1ɺHHHt1HIH4H4vHXH`HDžhIHDžXHHHHXHHH.HHHHHHHLH9ZMQHH4vM(LLIH$L- HMHMLIHH7MLfDHI9tH;HtHsHt茫LMtIK4HtMt L_L}MHLHpHt#HhHtHH4@Ht +LLMt6I1 fH I9t#IDHH4@HtI|֪HHLtHt L貪HHLLLHx;u8HHC HHCHHCHHHKHHHLHuHHtHHNIMIEIu1IEHĸ[A\A]A^A_]Ht LܩALHLL9vOMtJHMIt%LL誩IHu%LHt LsAHaHpHt#HhHtHH4@Ht +21~HTLHHTHLHTHLgHTLSqH谙^H=4HQAH=HT$H=HKQHSLuHHLLH HuHu +<HޘHRS~HDSHLYj貘c諘\褘U蝘NH=DHS94H= +H[PHHH9sHRH] HRHL2LHuHuHuHUSQIH(蒷IH葱IH}sIIHXGkIfIH(qIIPIH(kH菰3I"I)I$IHHHH誾H~HhH6L + U\lP`s7p4 ] yaTUHAWAVAUATSHMIHIIHHtVLpIH}:LeoEH}LeELpHCfAr3I9FP9HEHEHEHCfAsHtxHI9FPH4@HIv@H}NIHMH.JH]LxfH~HHHPIH5HIHt*IHEHEHMIHMH.uHE.IHMH.LELMH}LL@HUHuH}H]LxH}ɔH]L}LuL@HUHHLXHPL`HhHIEH}LHtMtMtLLLLxH]H}HUMHMLELMH}LL?HUHuH}u;It$IT$I$H}HHuHբH}דH]LuL}L@HUHHLXHPL`HhHIEH}LHtMtMtLLZHEID$HEHMIL$ID$I$HĘ[A\A]A^A_]ALLH%L}H]H]LpLxH]HCfAHHP蘮HH}zHH UHAWAVSHIIH}HoEH}uAFfI~MIpHMH1HHHM9<wtM9|vmH9ItHtZML1HHM9IM8DeEU H MH HUAFLuHuLE LMt LuHuLE LMIE1ɀxIHHIUHx@Hx8H)HLIE H@H9GHL8H3AZAHHuLMCH7HDž/HH(HH0HHLLHHHLuLE L}AF#AFA1HHHH8HHAH HHx[A\A]A^A_]DeEU H MH HUAIUAHu萂HN(((((((((((((x(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Zjzoof.fUHAWAVAUATSHHIHHHH~D$PK@SPD$PHL$TT$\foD$@C@CPHKTS\HC8H;C0HHHK8L`MAT$ At$$E1E1I|$D$L$T$t$H|$)T$ )L$0HsHSH|$@ oD$HH|$@KAFIF D$PoCKD$PHL$TT$\(T$@SCHKS$HHt$@ HIFfAF(AN@AF0HCHL`L@MtHDDHs(HuWfAHs(HtIHHt@H|$H{ HT$)L$0)T$ LD$LD$HT$H|$(T$ (L$0HHt$@ HIFIVMfMF fE~(fEn*AV@AN0fI~MtAML$M9H(L$0(T$ H|$t$T$L$D$vMO IOOD'E1"E1(L$0(T$ H|$t$T$L$D$AALS@LCHDkPSTD{Xs\I$IL$IT$HtH?fIFIFINIV fAv(fA~*AN0AV@1IHe[A\A]A^A_]ÐUHAWAVAUATSH8H9IIIHHH@L(HKH;KuUHHH H9HGHHGº E1HAIHtHHHUHMHE H;9HEH}HMHLH}HuH}tDH;HHsHKHL,HDLdL|HCIFH8[A\A]A^A_]Hu|f.DUHAWAVAUATSH8H9IIIHHH@L(HKH;KuYHHH H9HGHHGºE1HAIHt"HHH IHUHMHE H;FHEH}HMHLmH}HEH}tHHHH;HHSHKHIL$L|LlHCIFH8[A\A]A^A_]Hu{H@UHAWAVAUATSH8H9IIIHHHPHH2H@L(HKH;KuYHHH H9HGHHGº E1HAIHHutHHHUHMHE H;=HEH}HMHLCH}HuH}tDH;HHsHKHuHL$L|HtLlHCIFH8[A\A]A^A_]HufzUHAWAVAUATSHILeM-MLMH t]HM.1IIHi I9HHL92Hi I+MlIM]IE@1A}I@LH)H|HH)H9LEMMPMU8MHH)HhL`LpLxHEtvH IHH)L)LHHE111f.fI\2H`HhA2?uswHH @y}HHuIMкQIFIF7ILfH)HHHH49Hi I9wH׺IVMFI~HHHI;M`HkpI9juHEHIHHH*HHHUи.HE1L1HMHHH LDPHH H` @fF~OfGtUȁ tfnugH}H(HMLELMH}HuLV#H}u4ftFf1u#H}H(^HEHEHEHPHEH9HpH%H}H(HMLELMH}HuL"H}uHEHEHEHXHEAF6IIMpHM]hE1D2HyLHHH2Ht.E1H9DAHLGHItHpMuLMIH8H(HHIINIFI;HEHtIFHXIFE1HuH.u,IFIHĸ[A\A]A^A_]EAFILHPLLEMATubH뼺 H2L3UHHHH5 DHUHEH}SH]f.UHSH8H=o@0t <t(1H8[]H=oHH5H试C0H=ooo@(fHnPEMHH HMH@(HEfH~HtfH~HtHEHu H}nH=OoHH8[]f.UHH=]o(LH]UHSHH=n@t <t(1H[]H=nHH5gH返CH=nHHH(HUHMHtHtH u H}@H=ynHH[]f.fUHHHHGHGHMHEHtHtHu H}H]f.DUHH`OWMEHG HO(HEHMG0HEHEHEHEHEHEHEHEHEHMHMHEHt}tHEHu H}H`]f.UHAVSHH=m8uHiHH`IHE1ɸIN(LI~0HnH]4I0K8LuE1HK(uaE1HMEHMEH1HSHt H9H{@H1HEPMHEMLs(uH1HC(HEHH]}tdH;OHEHu H}rH[A^]1I0K8)LuEH=H +L8HU++_HmHt8uCH=gH36V*HEMH=H O+L8HU+ H=H-^PH=HJ8HEHEHHEHl8HEHEHEHqHEHEHEH`H#HhHMHpHxHEHEH;HEH7H0HDž8HDž@H`HPHDžXH57H0HH}v-HH}HH}HH}LHH}H\ @UHAWAVAUATSHXHHOHWHUHMHteHEHEHMHEHMH}HusH]HUH1lHHEHEHEHMHMHEH}:IIE1L}LuHgHH]L-gIIEHgMH=g]VIĿ0}HHHHC(HHC HHCHHCHHCHrHP`}H(LxLpLh H@(L`0H@8HX@H@HHX[A\A]A^A_]H=wH*7~H=[H*+ d0PH)HMHUHUHMHEH]HMHUH=9H _'Lh*HU/: HH}lHH}HH}萗H fDUHAWAVAUATSHHIA|H>IHE(EȾHHt`LHHHEM^I9UH.LLH{IH%HCA"LMLH`KD-H9HGHHFMtH]LmHE HEH}HMH]LeH}HLHI߃"lIE1L}LeLmAFAF fAF AF IFIMtTMtOLLz=ALLzLmH]HEIFHEHMINIFILHH[A\A]A^A_]H]LeLmILH@H(H1$L}LmLmL}LmLmMuj HL HH}腊HS f.UHAWAVAUATSHIHPHXLuLH]HUH1uHLpHEHEHEHMHMHxHx6IIH`HhH[dHHxLHtLIHHAHt#HHxIHLLHE1H=cA$MtH`LxHpL(HXHXHĈ[A\A]A^A_]H)HMHUHUHMHxH]HMHUHxHEHUHPHEHBHEHEHEH HEH%HxHEHELuHEH5%HxH)&H1; HHHx=H`聒 HH}sH fUHH奎\X]UH1]UH1]UHHHW]UHHHHwH] fUHHHHwH]ifUHAWAVATSH0IIIHӿHtHvHHtqI<$I\$ID$Iu9HEH}HMHH}HuH}t6I<$It$LL^Mt$LH0[A\A^A_]þHhHug WHL̆H fUHAWAVSH8IHwH_H9uZHHHtIHEH]HEHEH}HMкH}HuH}I>IvH9u>IIHL9IFHHGHtIHEH]HEIL{0HEH}HMкHEHuH}tcIIvM~IvL9v1HMtLtHuLtLH8[A^A_]Hue +Hu e HHLMH UHAWAVSPI!TtHHÊC HHCHHCHHCHHtHtuIH(@sHtPHL8H!HCC EMCKI~HtIvHt +sHH[A^A_]ÿ!f.UHAWAVATSH`IIH}HHlH]HUH1BHt=H)HMHUHUHMHEH]HMHUH}HUHEE]HEHEHEHMHMHEH}HIHEHUH}HLyMtH}Lr}u+HEHMIL$ID$A$LH`[A\A^A_]ËEAD$1HH}XH f.@UHAWAVAUATSH8H}HEIHwHE1 HqIuL9.AEHL)IuLHHBӿHt 11HGIfHnftfȁuH]HEAEE1JH HE1HUH]L}AEt$tAt,HExtOf.fHI!HH<tuHH #<aH]H;HCHCHpHH;HPpLuMt,HL)IEtI}ILHI]MIL LH8[A\A]A^A_]Luп!8pHcHÊIC H7HCH$HCHHCHHoHIHfo@oHIL HIGAGEMAGAOMII8Mu.LuEM H DeI L}MIuHL)r[IEI}ILIHLMuLuHL6 H=gH+,H3L{! IILuH;HsHH}DL2 f.UHAWAVSH8IIHHOHHGH9vH"<HCL9vyHKHH)L9LHH9HGHHGH HMHEHEH}HMhH}HuH}H;HsHK?C{ucH{HLL< HHH8C%HHHH;HLLLsHHH H8[A^A_]H=H+Hu9^@UH]fDUHAVSH0HtGGEHH]HHHuHkH;lKGEHHHiHUHEH5nLH}HMhHË}趀EH5DLEHMHhHËuLuLBxH5sLTHLThHiH}HHuHl{H_LsHHH~HUHELuH5L#LuHMغLgH]H5eL#HMغLgL[iÉH0[A^]HH}2|H UHAVSHpIHtRt1WHWH5.HcHHHGH8H@H@@LHp[A^]wuH]HvH]HHEHEHEHhHEHHEHEHEHEHEHEHuL|H}H[HuHNgj?HpHMHHH HH|H nH`H\RH7DH 6H (H +H HHEHMHEHEHmHEHHEHEHEHEHEHEHuLE{ÉHp[A^]HH}yH f )7ESao}UHAWAVATSH0IIHIHNHFHH)L9s;LH H9HGHHGHtHHEHMHE H;4HEH}HMȺH}HuH}t8H;HsHCHLLL{M~ILH0[A\A^A_]HuXfUHAWAVAUATSHXIHIIIHuH}t!IHHHH‰ЃHpsE1HNM~IFHEE1HHE1HLiLiLi(Li8LiHLiXLihLixHHuHtHHf.L)HHuM~IFINIVHUHH)L9swLpHH9HGHHGHLEtIHMHEHEHEH}HM H}HuH}I>IvLEMILEI75fHEH8HLL_M7M7HLH9]L#LsHEHHH)L9sLH H9HGHHFHtHMH HMHEHEHEH}HM2H}HuH}t2HEH8HpHpFHELhHHX[A\A]A^A_]HugVfUH]UHAWAVSH8IIHHOHGHH)L9s;LH H9HGHHGHtHHEHMHE H;4HEH}HMкMH}HuH}t/H;HsHCHLLLs1H8[A^A_]HuUUH1]UHAWAVSPHHHIAtZHH!H H1u;r9I>IFIFHpHt I>HPdLdAHAH LH[A^A_]HI>IvL H^ fDUHAVSHPHHL0LLuHEHEEHC(HEHC HEHCHEHCHEHHKHMHEH5H}HUgU؄cH$IHIFHIbHHL0(@bHHHHHAAEUAQIIH8ewu9LuI>IFIFHpHt I>HPjbH}WbEM H DuI HMىIHH H}HLHP[A^]ÿA2HI>IvH}* HH}pH}nHQ H@UHAWAVAUATSHL7I~@IIIF@HEIF@ +qMfHHt2HHL9I~XtLLLH<urLPIFXHtI $| +u L<uHLLLx8A~`I`ILLHf<uII)LLL>HMHH[A\A]A^A_]H=H + L+HUоEH=vHW +#譾H=H%+蓾 HH}%kH f.UHAWAVATSHHG(HEHG HEHGHEHGHEHHOHxHpHH8HDž@*MtbH=OK8u HH :HHt>L#HMt/LeI|$HLHPAAHKHtHKHEHKH~HKHHHHHPHEHEHEHEHEHEHEHEHpHxHMHEHPHuH&<HHİ[A\A^A_]E1ID$AL$HPDXI|$ HEHEHEHEHEHEHEHEHpHxHMHEHu_ I<w><t:EtnI|$HL#HEHdHZH}oLI?IGIGHpHt I?HP^L]EuHBKHt谹yAD$nHEHPHPHEH= JH HU[KHHEHH8@uH(fEՉMHUH8HPH`HXHEH`HHhH HEHEHEH]HEH5 H}ֹ HH}l;HI?IwL/HHHP9iH}{HHI UHAWAVATSHAHtcII9p<Mt?IIB׿L,HtHtLH)IIMu\HHËnCH\HCHIHCH6H[HIH(@[HtkL0H HH@MًU܉HPHHH8A H1E1HHAH HH[A\A^A_]H@ HLevgUHAWAVATSHAHtcII詿"o<Mt?IIB׿LHtHtLH)IIMuZHHËCHHCHHCHH>ZHIH(8@ZHtkL0H 6HH@MًU܉HPHHH8A H1E1HHAH HH[A\A^A_]H HLո׶UHAWAVAUATSH(IIIHLHHHHIO1DH9uHHH9uHL9I)HILe%f.HXMhLLLLLEIu:]HEA<f.@H]H LHHHHIw11fHHH9wHHHH9uHHI9HHI7I)t#H)ID7H)IL7HHLE]I/HEЊ@A<t%}!lA<MH]H;HCHCHpHH;HPW1I)kgWHHËCHHCHHCHH#WHIH(@VHL0H HH@MUHPHHH8EM H UH HEɉHHH HH([A\A]A^A_]HgL觵H=H#蠳葳IH;HsRHLȺ UHAWAVAUATSH(IIHtOLHHHHIN1f.fH9uHHH9uHL9ZAI)uh1AI)ZHI?f.@IHH HEHEHEi<IAB׿L,HtHEHEHLHHHHIv11f.HHH9wHHHH9uHHI9oI)HH)IL>H)`M,>IT>H +IE}uN}r@H]H;HCHCHpHt H;HPTHuTMMM9THHËCHHCHpHCH]HSHIH(@SHL0H HH@MUHPHHH8A H1E1HHAH HH([A\A]A^A_]HIL色H=Hk #a肰sIH;Hs4HlL誷 fUHAVSHPH}EHF(HEHF HEHFHEHFHEHHNHMHEH5H}HUVURHIHkIFHYIWRHHL0(q@.RHHHHHHAAEUAQHHH8dwu9LuI>IFIFHpHt I>HPQH}QEM H uH HMHHH HHP[A^]ÿ跮訮HI>IviH}蠻 HH}"`Hе UHAVSHPH}EHF(HEHF HEHFHEHFHEHHNHMHEH5H}HU +UUPHIHIFHyIwPHHL0(@NPHHHHhHAAEUAQHHH8dwu9LuI>IFIFHpHt I>HPOH}OEM H uH HMHHH HHP[A^]ÿ׬ȬHI>Iv艹H} HH}B^H UHAWAVAUATSPHH?IAu1tEIIIC<w<u9L{I?IGIGHpHt I?HPNH{NDkLs DcLH0CI fDcH[A\A]A^A_]HEI?Iw觸H{޸DkLH0CLH fCDcLs H} fUHAWAVSH8IIHHKHCHH)L9s;LH H9HGHHGHtHHEHMHE H;4HEH}HMкMH}HuH}t*H;HsHCHLLɲL{1H8[A^A_]Hu>ժDUHAWAVAUATSPHH?IAu1tEIIIC<w<u9L{I?IGIGHpHt I?HP*MH{MDkLs DcLH0CI fDcH[A\A]A^A_]HEI?IwH{DkLH0CLH fCDcLs H}: fUHAWAVAUATSHIHH}LfLmLP@HEHC8HEHC0HEHC(HEHC HEHCHEHCHEHMHKHC<t;IL$H/IL$H(IL$H I $IT$HH{8K9)EEHHIUH IUH(IUH/IUIEEfMHHu HL HIF8HIF0HIF(HIF HIFHIFHHINIHHPH}H9uet,HHHXh7H H;`u$HHXH99貯,HE@8WHUuJHC8HC8HUHB8HC0HB0HC(HB(HC HB HCHBHCHBHHKHJHB8H[A\A]A^A_]fUHAVSG:FIHH HcHHS I;V H{IvH9t unHS0I;V0udH{(Iv(H9tW®uLLCA:F@HS I;V u4H{IvH9u%HS I;V uH{IvH9ty1ۉ[A^]bbUHAWAVAUATSHHHW_t7HO0HoHO)HhHO!H`HOHwHXHP8O9HEHU]HPHuHXHuH`HuHhHuHoHuE@w:M@uHc1f.@<8/tHH9uH1HtHH9HHEH)HUa1f.@</tHH9uH1HuHt Hu#8.uHH9HHEH)HUu1@;E1LPL}L%f.@1HH ǀIDHǸHEHw%u~@|@u +1gf1rHHc4HH}H92HuH}H_HHDH|HuH}H_HHDH|H9H9f1@]tAuxIc LH}HHHH9_f.1HHH9wBHHH9w-HMH}H_HHDH|HHH9LL&HXHuHH+PHUMWHMH}H_HHDH|HHH9wFH]HHLGI9A?@.@D I9@.A8/@HHEHĈ[A\A]A^A_]HGHHԤHHHMHHH;"O'O4K\MMLL)E11fH9t/HH</HuMM)Md M9MND)AM)t^It9IuRA8.uLF1<<E1ɨ<HDIHEA8.u1Ax.H)MLHOLGL_HEHMHG HO(HEHG0HEHG8HEHG@H([A\A]A^A_]HHLL0HHLf(kc(f.fUHAWAVAUATSHxH}DN9DF:E8wAmAcHVNF8E1@1EHEHE1€HTRHEHh'EAHiHcHH='H"(8u F9AHED H8JcHt'.u"/a)wTUAKCH?.6HHH>HVHEHGHNHtHHHNHEH$Hu1IDLFMH11f</tHI9uLHuAHHtAHtHu,:.ALDh:.uE1ۀz.AAM)HL]L]LuLuL}L}LULmLxLpL]LuL}LmLUMI)HH>L^Iu@AE8wAtAHpHcHF9HEHHx[A\A]A^A_]HEL HPHXHUHMHPHH HMHH(HMHH0HMHLf"RlsUHAWAVAUATSHID^9N:A8w7At1t,IL~L%Ic LA1<IEu!AE:ILHĈ[A\A]A^A_]H5HcHAE:FHIH2HQHI HqHHDHL2HQHI HqHHDHL2AE:HtAEIM0HwIM)HpIM!IUIuHUHuHMHpHwHMHUIAFAFHEHMIFIN!HEIF)HEIF1HEIF8AE:A}8uoAU1ɀI@u`IUHtIM@1Ht@.u y/t11H@.HIUII}HrI}IpH 1E11A¹HH AIDIuHHwVEE8HwIEAMQ1LHDto +L Ic LHzHD11EujW2HJHR HzHHDH|9HJHR HzHHDH|9H9H9&11EuA?LHDLHH9HhHXLdHXH`HHsHUHuHSHUHSHUHS HUHS(HUHS0HUIuHH)~I}H$E]9AM:7D LKcLHyHLHH9MAE:A8A~Ic LH=H(萖IMHHLOI9A@?@.D I9@.A9/LHH9_HAHI HyHHDH|8HAHI HyHHDH|8LHH9hIHEHMIFINHEIFHEIF HEIF(HEIF0HEIF8~H葖H +L`nn~6~ST^MTxMf.fUHAWAVSH8IIHHGHtH |/MuMt A?/u1 H9Cu>HH#HH9HGHHGHtH HMHEHE H;8HEH}HMк贠H}HuH}H;HsHC/HCHHCHKHH)L9s;LH H9HGHHGHtHHEHMHE H;4HEH}HMкH}HuH}t(H;HsHCHLL蚚LsH8[A^A_]Hu]&訒UHHHHwH]fUHAWAVAUATSH(HH)"HtHHEHEEH}1訚趚H)ÿ詚HHAA +H<@H}YL4A +HhI +DE1I AI +MvMCHǙL%2!L=+!H轙MtII$IL$IT$HHHHEHMHEHuHuRfHEH;EBHHHML(M.HXLSHsHtHSL3H([A\A]A^A_]H=HPƑH=H+讑IILH{H}WL誝L UHAWAVSHHHL0HMHH茘H]HHHu92HHHH@H@HHEL=L}HKH;Ku^HHH H9HGHHGºE1HAIHt'HHHUHMHEH=2[H;=HEH}HMHL蠜H}HuH}H;HHsHKHHL|HCH}j1HMfM̋MMI>H `HO8H MHO0H :HO(H 'HO H HOH HOH HOH ۫HHG@HGH(GPfG`EȉGbEfGf;HH[A^A_]H=H_+MN?Hu! .HH}uHDžxE11]IVEF 1AHEuHDžxEN$E10HHtHIHEHM1HxEN$AF(AN,L$$H}H(HxL%HK0HEH@H[A\A^A_]HH}KH軏 UHSHHHuH8u +HKH9dwPEECHK HUHUHEHEHEEHEHEHMHHEHHF}t 1HĘ[]À}usHC8tjHCHEHEHE8uHp HxڎHHEHDžp$H}HUHpE1$HK HEH@HCHHC 8HĘ[]HH}JH荎 DUHH HGHEHHOHMHEH}HUHH HGHEHHOHMHEH}UHAWAVAUATSHI>u*H:H]HE HDžxA u!SH^L~H]L}HDžxt+HL SHHLWH[A\A]A^A_]MHtǀ;/uHHIHLƅfDž0ƅ2Ht8/t1HEHMEHHHEHMUfEL8LHULLp3HpHEHhHEH`HEHXHEHPHEHHHEH8H@HMHEH}HH}H(G}HEHHMH8H@HHHCHLH5+HHHEHEHELeHEHuL{9DE1#HHx4H͋ DUHAVSH0@'HHHHC8HHC0H}HC(HjHC HWHCHDHCH1HCHHH]LuL)uJLuL1uHuHH}HH0[A^]ÿ@蕃HEHEEfEEH=H LIHU+ÃHEHEEfEEH=mH LHU+|BHEHEEfEEH=)H =LHU+8 HH}z5 HH}l5H}HHHH}P5H}4HՉ HUHAWAVAUATSHhIIHH5ڔL7=HLNHHNHEHUH}HuNHEHHLmL}HMHHEHMEELfDH}g=jEHMHEH9u/3DMuHUHEuHMHEH9 HqHux:AԹAD$tHcH9t?fulltA1Ht +NùEȸIEHEH=~H+CsH|1tzH=xH uL^HUȾFrH=UH RL;HUȾFmr2H u H}}H=!H LHUȾF9r IDIIH}+1IH}+H}1@I IH} H}>3I1H}1uH}t H}3Lx f.@UHAWAVAUATSHxIHHHOHwHEHsHEHMHEHuHLHEHHhHDžpHDžxHEHEHELjHLhLLAI<w<u8I<$ID$ID$HpHt I<$HP?L-HCCHQ1HBH;12+HHEHEHEH|HEHEHuLAH<w<H;HCHCHpHt H;HPHL%LwLe]HEHhHHpHqHEHEHELuHEHuLAHIH=*wwu4I?IGIGHpHt I?HPLHx[A\A]A^A_]IH;Hs{H(II?Iw{LII<$It${L{ IH}2Lu f.DUHAVSH H- +H5HnoIH +H+oHEH]LuH}FfDUHSH(HHHPHH(HtHuGHuBHz1Hu2HHHIHEHMH{ HKH5H}HHEHEH{b HKH5_H}H HH}%Ht UHAVSHPHLwMHHEHEHEHMHMHH(HMHH HMHHHMHHHMHH@HEHMH5ԷH}HULsHEHMHEHMHEHEI>HtHsHt +HEIFHEHMINIM6HCHKHMHEHCHCHCHEHMHMHE'Ht#L0HMHUHHHPHPHP[A^]ÿ@lHH}Hs f.UHAVSHPLwHHHHEHEHEHMHMHH(HMHH HMHHHMHHHMHH@HEHMH5bH}HUHEHMHEHMHEHEI>HtHsHt +*HEIFHEHMINIHDLHP[A^]HH}Hr f.UHH)E Ht(EHH]ÿjf.UHHH]UHHHHOHEHMHOH5H}1UHAVSHLwHHt' HtHLpHl[A^]e;jf.UHH?t HH4]eDUHAWAVAUATSH8IIIIHH=l8uH-Hu#H={H LHUFjHHHHv9HHEHEHEHuHEHEH} HuHEHxHELmLeH=]qt& #u%H=H$h=HL-MuLAV HEHUH}u!L%LAV HEHUHuLAUH H=pHv HLL1H=pH=H')-hf.UHH`H}HuH}uEHEHEHEHEHHEHEHEHEHEHEH}f.UHAWAVAUATSH8IH11_ou(o8 uH=n11o%1!ou(n8 uH=011Ko1nu(n8 uH=11 o oH9H]yoHL-M,I*oHHnIHnI)L1IMI)HMDLLAE1`nHL9LL1FnHEHEHU 1nH}H]u)EAH/HEHu 1{nHU +1dnH}u)EAHHEHu +1;nHYH(MmainHE(,qEH}HELmLeH}HHAWEEHHt%EHEHEH=H HU1`}u-L}LeLA$It$eHtIT$L]HcH8[A\A]A^A_]H=HdH=!HGeH=H eH=΃H HdidkILL&q IH}Lk H&cHEHUEHHUHAWAVATSHH>u +LvL~HF0H0HHD L6L~H}LL%}AtdHuHt[HUH}HEHtDHMHMHMHMHMHMHMHMHMHxHMHUHpHhIHEHEHEHEHEHEHEHEHxHEHhHpHMHEL3L{LcHEHMHCHK HEHC(HEHC0HEHC8HEHC@HEHCHHCHĀ[A\A^A_]UHAWAVAUATSHHEHHHzHHLjHBHz HHz(HHz0HHz8HHz@HHRHHHL!HAHIHHHHHux u HC1fD,H{H8HӻHEHEHEH@nHEHEHuHx ~L0H=<H pHPH5HXH`HhHMHEH{HEHEHPHEHEHuLHHPH?HXHHEHEH{HEHELPLuHEHuHx HHH=I HHPH aHXH`HhHHEHEHzHEHELuHEHuHHHH0H8HHEHHxHHpHHhHH`HHHXHPHIH HHH0H8HUHMLmHPHXHMHUH`HMHhHMHpHMHxHMHMHMH8HEH@HHHHHHDžHiqHHDžH8HHEHEHEHkHEHEHuhH0H8HUHMLmHPHXHMHUH`HMHhHMHpHMHxHMHMHMH8HEH@HHHHHHDžHDžH@HHDž HuHH8H5gvWtHH[A\A]A^A_]HHHHH@AWIMH@HHHH,(Hx L0H=}H HPH5VHXH`HhHMHEHvwHEHEHPHEHEHuLHH8HHEHEHEL5hLuHEHu>HHxL@H0HuHULeHHHEHMAPHH8H(HPL=9LXL%YLeHEHELPLmHEHu&}uUE0HH8H0HPLXLeHEHELmHEHuFHH8HɵHEHEHELuHEHuf.UHAWAVSH(HLH{LuȹLH]HHuLL}HbHuLLH([A^A_]UHSHH )HcHHM{HfLHvHhvH]HBvH]H!vIHvmHfH]HuHu|HuH] +sHuH] aHu+HzH]FH_uH] 4HBuH] "H+uH]H uH] HHH[](1:OXasf.fUHSHHHt Ht HukH[]HH aHHu+Cu]HHu*H{`H{H[]`/WKu_uWuCH=uH;X1HH]EH=gH 0LHU+X 4HH}Hw_ f.DUHAWAVATSH@I~tILH@[A\A^A_]HH/_L#I$8LHLr_LeHDžHHxHL_HtBtC^H IIFIFHEHHH}c:LL8D=..uFHHxLLT_Hsu=ftfu .tII~H t^IHEHK f.DUHAWAVAUATSPIYDAyttKEuK)1Eۍ4 EDtytYEu y €y +Y H}u'yEt5 +y tZy tD1Ҁy +Y H}tTuX +L1 + Eu€y u y +uy tHHGly +Y H}u~ +AD#) A ADaE1LDD1B]u.\- <tH H}H_HGAH}ЉGD7H[A\A]A^A_]À +yfDUHAWAVAUATSHxIHIHt"LtIHuLTALHLo\L}LeLeH}HL`H]HUH16\HtmH)HMHUHhH`HEH]HMHUH}wIVIFIMtMtLLLHx[A\A]A^A_]HEHEHEHMHMHEH}蛀IHpHUHxH[HthHHEHEHEHMHMHE0?H(^HXHMHUHHHP HMHH(IFAF1ZH IFIF1HuIAEHtHpMMـ0RHH}XH&Z f.@UHAVSH0IH]HZu;H]H߾ZumHuLZH}ZH0[A^]ÉHEHEEfEEH=aH LcHU+RHEHEEfEEH=?aH SL4HU+NRBHEHEEfEEH=`H LHU+ +R HH}L HH}>H}HHH}"HX UHAWAVATSHIW)E)E)E)p)`)P)@)0H0vYH0hYHH}H0H}L}H]Ht"HOIHuHPALLHJXM&I^I^Hİ[A\A^A_]H=mHŬPHlH1~RHEHMHMHEH=\_H НLHU+kPf.UHAWAVATSHPIAH=,8u HHnHHHHHHHH{HEH}sHMHUHEHMHUHEH;jLcH{tHC Hu H{ ZHEID$HEID$HEHMIL$I$HHHHHHCHt 1 HSHCHHHDHDIOH9wH9r&W)EHuD1WHP[A\A^A_]1HcHEHEHEHZHEHEH}[H=G\H L^HUؾNbH=I]H+OHH=5ZH .LOHUؾiN#H=ZH LHUؾDN IH}6 IHGILU UHSHW)EHE1Hu1UEUHAE1UHt[HÿUHH1TuUUHH]HEEH}1\UH]1HH[]H=,kH'LH=ekH-tL@UHSPHHHBHH UHtHC1SH HCHCHHH[]UHSPHHBH։THtHC1tSH HCHCHHH[]fUH]UH1]UHAWAVSH8IIH=F8uH=H1SH=*H=HHtcHKH;KHHH H9HGHHGºE1HAIHtjHHHUHMHEYHHHH@H@H=HHHKH;K_H;9HEH}HMHLWH}HuH}t+H;HHsHKHL<LtHCH8[A^A_]HuRJfUHAWAVAUATSH(H=L0HMuDH([A\A]A^A_]H=yHHLIHtM&M~I^HILeL}LeHEHEMfHtIEHt2I}IHfLmLmMu$nf.@ILmMOIELL0HLmH}L8VHvP f.@σHFHuP4H([]HÿqHN UHAWAVAUATSH(ulH_HHuL?DH}LH1 }uULmDuDeɾH=`HUuCEtBML9rKML)u0HH([A\A]A^A_]H}HuHUt1H([A\A]A^A_]HLHzHf.UHAWAVAUATSHxHH}1hHHKHH RHDHPHDHXhHHKHHDH`HHRHDHhhHHVKHHDHpHH^RHDHxIhHHKHHDHUHH)RHDHMhHHJHHDHUHHQHDHMgHHJHHDHUHHQHDHMgHHJIHHDHUHQLDgHHZJIIֿjgMH]LL-YQIDMDH}H%JHXHxHPHHhHH`HHxHHpHHMHHMHHMHHMHHH]HHDIDLHHLHDžLHDžLHDžLHDž HEH(HEH0L8HEH@ƅHHhHx耔Aht1HpHh@KDpqEtEHhHhKEMÉx{Au%HEƀH}Hx[A\A]A^A_]HhH]HJx{EȉMDEȋMˉHHHuHHx[A\A]A^A_]IHLI f.@UHAWAVATSHHHIHHEEH@Huq@uPHr;HPH;HCHCHpHt H;HPHIDW)E)E)E)E)E)p)`)P)@H@@It:L}E11LAE1JIHtIFM~AM& HIHHĠ[A\A^A_]IH;HsMH'NLeH f.UHAWAVAUATS&&H)HH?uHG HGHHHHDHMLMtH5H +5H-H fomL(HDžhHDžpHDžxGAE1HEE1E1D +E9H}DuGHDmtRHHoHHXDLGHt3H}t,HLuHHD1IHLuHH LeDhDpHDž`HhH@HE+A1HP1HpE11HDžHpHHH6LHxHHp+H`HHhIfoIC LpILpLA ID{M9LL)ALCuAH{{{ tu{ +to{ ti{ tc{ t]{uWHCH ^H9t__TE1@5XT u1H{(uH{0HPɸEHPLpDoCI9LH*K $H9HGHHF1ɺHHMfbLHLHHDžHA8}{|{ tv{ +tp{ tj{ td{ t^{uXHCH ]H9t__TE1@5XT u2{ u{$HPɸEHPLp~CI9LH(K $H9HGHHF1ɺHHMft)H`LHHHHDž HDžHpHHHcIHxHHp'H`HHhfofbHIB'LpII HtHtH`Ht +x1LuDLeR1O}CHEPLuH]LHpI9(H`HH IIt$HHtHHDH) +HHuHpr6Lf.H) +H)JH)J H)J0H)J@H)JPH)J`H)JpHH9uHMH]HXHDLet*H'H]HHXH'HLI`BH`HhHH HpH(LhLmH}HHEHHhHH(H HBHH HJHHEH81HLL)H9sgLDmj%K 6H9HGHHF1ɺ8HHMt2Ik8HpHxHDžf.DmXHDžpH`HHHpFHhHpH`$HH$I$I$HIH}AooH(H HNHVHxHpHNHVHhH`fH~HIk8LHD H`HhHT0HD(IHpHxHhH`gHEHhLxLpHxHHhHpHH0H H(HpHxHHHHHHHH[Lk8I H8L9t?H;HtHsHt +lHs HtH{HtHtĺJHaHbHtHtHk8Ht HH=KHiPHtLHHHLHHt"H=HtHiHt +HHHHHHHHLpHxHL}H5HL IE1LLUHBHz(Lj0H8HHt+HHH LHL9wHKL9vf.IGM9IuH Ht/t1LpHxƅHHHHfDžHHpLu蝙HHHHHp蒌HHH +Huj<HH;HCHCHpHt H;HPyHgEH}Hu}:LuLeDeOtXLPHHH;HHm HHu H>LuHDžHDž HDž(HpHuLy"HpHtY>tQHxHHp $HHpHEEƅAHhH69H H 9A~H}L 9AHhH8HpH8H8H@HPHXHHH`AQ HhHh8HHpHn8HPHXHXH`H`HhDhHiH)8HEHLHXH`HHHhHH=u=H (H5H7t HRLHHh7H9H=HUL)L-IuHHUWHuLmHLp LHLALxf.H`LAH`HhHxLIvHIvHxI6I~HpHhfu1HH8HxH0HhHpH(H HDžhHEHpIUIuI]I}HLHHhHPE1pr&HHtHHtHALmxIHIHHuKHHp I9IxLiJ?F?AI9pI`HL$1HL1IHHhHXH}t%LHtC|4)u1A<(HH9uHLLHLHE1HDžHDž HDž(MH]LeHpLH>poxof`fpHpH`6BHpH`!BHpHHtHxtHH;uHLHL9tLH3uHpLHHpHc>H]ƅARHHh~3HH Hc3HHO3HH H8H@H(HHH9HLHHI)ILHHMtIHH`HHHMUc`HpHHH`cHHDƅAH]HhH,2H Hp2AuH}H2AZHHh1H Hp1HH HPHXH(H`LuK>HH1HH g1HPHXH8H@H`HHu HhHLhL1D#H]J;H0LHEJ;HEJ;H8H@J;J;HHJ;AHX1AHDH8HH(HMHHHMHpHHhHXH1HELeO4dHEJHLHHhHPE11HELmLuL)H5IIHEM4KvHMHH IAHDžHEHHHHPH&[A\A]A^A_]LHEH)HHHHHRI9DwHHxHHpoIHHpH\ƅAL] LHHHqEHIhkHHEȺHpH ;,AHt&H(HEH`Hp,E1hkHPHH`+ #LLH+Et}sYE1H`L #H`HLZ+EЈEHEHELuILuI>IFIFHpHH`Lt I>HPLE1 #LH*MHhLMtB #+(HIH*LEXHEHM IފXp(+HqJHHxH2*LeLDMtLHHu +HHL)H L(L0HhHLhH0HH H(HHHpHHIH HJHH(HH HxHHpHHHhH`HH(HxH HpHH`HhHHHLAH0HpH H(HhH`HH H(1HH uGH(HxHHHr%HD8H @H9tG.dSY1@M t3HtHt +HEHuH,dHEHpLp(Mt HLHHHu +v HL'HLLHHL胋LLMtLSHHu + HLLW'HLLHH5n?HHt LHHHhH8HPH0HHHuE<HH;HCHCHpHt H;HPHqTtIHHHuHHHHu H*ƅ(HHtHHt +HxHtHHt +HHLu H`*(H(W LHHH<EHI #HHEȺL`LH =%AHt%H(HpHhL%E1 #LLHhH$H`L$ELtQ}r8H]H;HCHCHpHt H;HPaHOE1HhLDHH`$$HEHEЈELpH`H#MtG# H H`#EHHpM #HJBHpHHH @#L IvLuI^(HEHt IHLIHu ALH"L`HhHpH`HHU謆H`HpHhH_Hh7LpHxHEHhHt HVHDžHH@HHhLHU +HhH^>RHpHxHAH rkD^L9rbLJ ^t^IrwMAAI9rtM LH)ALC߃rA:uIzEJAB f$AB A H=f*/E1$f H=)H=*flhAtulfEh]flhAuNlf|hxH~fDM~E~xflo0ftf=tmƅ`HhH` H Ha QLHu HEHH $Hh +HHhHHpJqRtMU<uƅ`LHL LHHMUc`HhHLH`cHpJtBqH`H7`Lƅ(HH,(<;3ƅ(HhHH&H(HhLLH HHH H(HH0(H)HLLHEHH H(HHH0HHEHuH #HHHHH"(<EHH(HYL)LHLIIH@HHIHPHHtHHt +臸HxHtHHt +eHHH!H`HHH# HpHHH #HHL}DEHHLuu HP!}HHHHYzH@HHH8H@HPHHLeIHEHhLxLp"HMHhLxLpHާHEHhHEHxHEHpHt#QHEHhHEHxHEHp苧HEHhHEHxHEHpHt&HEHhHEHxHEHp5nHEHhHEHxHEHp}E11Hp!HDHhHEHxLpHpHpLU HEHhLxLpH#dH15ξHHGpLHPp11LHIH;HsHIH;HsHcIqIH;HsHfIFIHIH0IH`HHHHxII>IvLFIIHIHHhD#H]J;HHEJ;HEJ;H8H@J;J;HHJ;IHLH}0IH HpHIH}HumIHhIHtLIƸHHuH=H5HHHHПHHHHHpHxH HxIILL f.fUHHs H]Ë==P==tLӍ2r=t=uH r=t=uH7HwHW]=tw=uHrDNEvALFHBAAGL =f.M1=H rA8I HuHDNEALFHBAAGL M1HrA8tIHuA@H)AH H9s%I@HH)~IHHH9nHHH Yf.DUHAWAVAUATSHH0IF @HDžHDž HDž(HH %^H9I΋vHDžxHDžHHDžPHDžXE1A H8 H0HA HH1H8L%GE1LXLPfDHH<HH)IBHCC  HxMx  x + x  x  x  x x HPIH=@,H9LA2__DW1RWARF1L D t H@DH8LHPL9M D` LH)LHH93 xLH)$ pH9 IH0 HH0LHEHLHHEvLH]H!fDLLLHH]HEH]IHMIHUIvH}HHtIHLLLtF<w$tHFHhUHHLpHhHHHp(xH}LLLHEHH*f.DLLLHHH9]kIIHMIHU3H}IHtIHLLLtC<w$tL{H]H9xubHH H H9HGHHF1ɺHHMHt.HpH4H4vHUHuHEHp_HEHHHHMzHHH( HpHHHHxLMH[L4LDL|HH]H]H9u(HHwf.DW)EH Ht#HHtHH4@Ht +EHHEHMH HJHH(@uHEHEHLPt}HH?xHEHEHHH?@HIp@HHHHHH9ʹ!HGHLǹHFH8i@A@A)HHU1{ALXH8DL% #@A@A)HHU1lHDž H(H@HHDžHH@HHLLHIIAE1E111I@I9KH r$tfLdurH`MMLhLELEHuHusH}?HLhMMHLEHu0HKHpHH`SL`L`LhLELEHuHusH}IHLhL`L`ILMLEHuHH;HhHH HHH9HGHHF1ɺHHHHHHUHuHELLEHuH`SL1LEHuAMH`,HL{M9ugLHK H9HGHHF1ɺ(HHMIKLUHUHEHHpL HEHpHHHMHxHuHp-HHHLEHuLhL`L`HhHHL$L|HAHLHELHpHHHMLxHEHpL HHIIL(LEHuLhHpKI M|MtMdHhIL IL01VLLH0HuH H(HEH}HEHpHt +HH?@LHA@A)Hp1HEHMHHHEHHHHBHHHJHLLXMM)vwHPHL)L9LLH 6H9HGHHF1ɺHHHHHHiHUHuHELHLXIiưIMiI)1fDHðI9nAuI< +H9tHHCHCtH s>1E1I1E1LcLkHKHC Ls(HS0D{8EMC9K/LeLmAMLMLEL5 H}HuL1HuH}OHELMHUHpHHMHEWH=| H9t >/BLeLmAMpHULML5 H}HuL1RHuH}H}ELLuHUH H9.=// 1HEHMI3H H9t +=//ufLeLmA1LMLH H9tIH__.SYMDEH3NHFH u%-H= H9t!oft, f=t +1LLeLmA1LLL1E1LL1{1tH H9HMLEt=//t +1LLLeLmLM9E1HL1)1LeLmHEHMf 4UHAVSH0IH~t^HHVHNH}gH}tH HHCHEIF(HEIF HEIFHEIFHEHMINIILH0[A^]f.UHAWAVAUATSL~IAZ/Lٺ'Az Az Az Az Az t~Az trAz tfAz tZAz tN Az + tB +Az t6 Az t* Az t Az tAAz uI1A +1I9+AtЃ pIgHHsXAz Az t}Az tqAz teAz tYAz tMAz + tAAz t5 Az t) +Az t Az t Az uH1A +1H9A\2Ѓ IHHsAr@/u_Lٺ(Az ubH9NIHH)t"H)1AHH%HH9HGHHGHtH HMHEHE H;8HEH}HMȺH}HuH}H;HsHC/HCHHCHKHH)L9s;LH H9HGHHGHtHHEHMHE H;4HEH}HMȺH}HuH}t*H;HsHCHLLLsH0[A\A^A_]Hu rLf.UHAVSHL7H+tLH[A^]XH LHބt [A^]ͷ[A^]t@UHHt#HwHtHHtHt ]2]UHH?t#HwHtHHtHt ]]ÐUHHwHtH?HtHt ]ڀ]UHAWAVSPIIHtOHH9Ht$HqHtHL謀Hu M~+Mt8LHlHtIF1L M~1I^IH[A^A_]HHuDUH H@H5 Hc H H]ú H]úHp]H[]ú HD]ú H)]ú H]ú H]úH]ú +H]úH]úH]Ht]úHW]úH:]ú H]úH]ú +H]úH]*3AO]kyf.fUHHHHEHEHHGHGHMHUHOHW HMHO(H]UHAWAVAUATSHIL.I]H;_s@IIwHxIHkHa~RIuoI~(t~IF HtuMNI2HHHH 7Ht!1L9lIGHHt HuaHMt#IH8Mf MIFLLLHI;^)HH HH9HGHHGpE1HAIHIHkpHHHDž8|H> IHHHH*fADŽ$2IFMf 1LuHE$2I|$LHHH4Ht"1M9l@HGHHtHu LfDHHM8I>\HDžHHHLAHHH\ +I>HH$I$I$HIVI^HkpHHHHIF1ۉH[A\A]A^A_]H}HH}LHfA HHHMFHSL9s,HEH4HA<f0HH9uIIfK8L8fD0K@L8ANf0KHL8ANf0KPL8ANf0II9u11HULmHHHI^MofE9v)ID$J4JHwH1II&1fDIILmHELDuH5 H]HkAuEHUHt(HHuju,H5HjuHHuHUjtDHX[A\A]A^A_]H5HLuL}Mt+LeA$ELLptILeItAE1HHTҶH[L辶f.@UHAWAVATSIHvMHL9vIB<uuIMHAL9wE1L9|IB< woIMHt;IA +L9v%B Ѐ wIMHIp3Hs)1L9vIB< _uIMHLHr IHH9vH[A\A^A_]ML9t9C< +.HtH9tA< +O +HL)EM +M| +HH1L51f.@H9LcA<_LuLL)J "LL)Ht#L9tH9KL)LA<JT"Ht$HXL9tH9KL)LA|~~LHHMM)MKD M"LHwHMHGHGLHL7HOHGHwLQLL薶LWL1腶L^LHsUHAWAVATSH HOHwAH9HH0HFHG¾bL{H=fHcHLH9gA<__HFI1H9LA<sH~I?H9A<8_HI7H>A>HKHCH9wH;HKHCH9vH<ELA<Lu)HxI?H9v>A<8_u7HIHKHCH9vH <KuHHCH. tG1H99A8_tFr@ +r r@s©r@ HI?I@HsHI?H$H9LA<sH~I?H9A<8_HI7H9LA<sH~I?H9A<8_HI7H9OHD0HHsHr +<.HHKHCH9L A<sHxI?H9wA<9_lHIHH^H)1A>f.DH HAT_qJЀ +rJs©JtIIcHHsS1A>H9BA8_r@ +r r@s©r@HI?I@Hs1A>H9A8_r@ +r r@s©r@HI?I@Hs1A>H9xA8_r@ +r r@s©r@FHI?I2@Hs$IHH9HI?HHHJHZHH [A\A^A_]HI?HHHHH [A\A^A_]HIE1x1A>H9vkA9_t;r@ +rr@s© r@sAHI?Ip1@Hs&HI?HtHtH}HH}ADH [A\A^A_]fX +f.fUHAWAVSH(HL_HI9H8HOHK¿9L{1H5)HcHI9]LA<LOLOMM9C<_HI?(f.@HX[L[HKI9vH<EuHI1:H%&HH([A^A_]gLI9A<_HGI1RH{HH([A^A_]I9cLA<GUHOII9=A<_2HI?H+I9LA<GHOII9aA<_VHI?HsIH_AM)1A>IH/AD<_xp@ +rPsPIHIH@HHs1A>M9C<_+x@ +rPsPIMHIH@Hss1A>I9bA_z@ +r r@s©r@0HII@Hs1A>I9A_z@ +r r@s©r@HII@HsIHH9IMH-~HIHtqHtkLuI9v H;<EH"Ef.L[HKI9vH<puHHKLHH}t HtŰH([A^A_]HIHtHtI9vH<UuHII9v^H<KuUHQII9v<Cu HI:H}HH}tH}tH}uHhkHCH9CvH <EuHHCHH([A^A_]4HAII9/<L%HYII9v<_u H1A>I9_tBJЀ +rJs©JHIIHsHIH1_FFFD@UHAVSHwLOAL9LC< +Bu+IIHOH9A< +_IAHG1oHBIQHW<jRHr()HDH9vH<nu ILOLH9HHGLII)A1MLHAHLHOKIIH +rՍKr̀_HL)H9r:H9t v3A<~,E1L9HH)HDHA|L@L蠨1A>H9vnA +_tDZЀ +r&Zs©fZs;HHOIp*Hs HHOHtL9[A^]HuE1D[A^]DUHAWAVSHIHHH5gXYAtDH[A^A_]MtC L)s3HH{H5* H{H5H[A^A_]YHEHsaEHsH}b*H{H5XvHsH}ʂAafUHAWAVATSHPHHHHEHHH9HHD$ +HHHAD$<AH HcHH HHELQHAI9LA<sHxHyI9A<8_HHAtH3HHELVLLFMM9C<_MIBHF1H HHE\LQHAI9#LA<sHxHyI9A<8_HHA1)AHAEtH{H5(WH{H5r WH;E1L5HCH9Cv H <EMtH{LVHIH;uHHHEHHH9H HD$ +HHHAD$<rAğAAAHAH HHELQHAI9?LA<s1HxHyI9PA<8_EHHA1IzIE1A>1I I9zA8_Hr@ +r r@s©r@HHHyI3@Hs%1A>I9>A8_7r@ +r r@s©r@ HHyI@HsH~HuE1 IE1L9MBHKS LMLEHEHMUAH}>H{H5SnHsH}wYH{H5S7HHyHtHtH;t Ht(HH{H5eHP[A\A^A_]ISH{H54SAHQAM +H{H5RH18HELuH}HH}qIFHEIFHEIINHMHEAH}u H}vH{H5eRA2HsH}mAHHyHHH;HEHEHHCH{H5ZDeH{H5QvACASH{H5u1A>I9vWA8_tI 1HtLAT0_t8JЀ +rJs© Js$IsIpHHs IsHuHHH5]NH]T@UHAWAVAUATSH(HHHHE +HHH9H +HD< +HHHAG<9H51H V +HcHH{H5qPNA'HmAAu-H{H5@NHH{H5j H{H5>MAH{APH5ۿH{H5MAuHHHEtVHHH9HvLH< +LuCHHHH HHELHAHqIH9A<0_IHHqARtH{H5MHH([A\A]A^A_](H3HHENLVLLFMM9C<_MIBHF1H;tHKH1H([A\A]A^A_]H{H5K}LATH HHE$LQHAI9LA<GHxHyI9PA<8_EHHAE1H HHELQHAI9eLA<GWHxHyI9A<8_HHAE1H{H5KA~H;BE1L=HCH9Cv H <EMtH{L[K5H{%IH;uH5-H{H5ɽH{H5H5H5ϼH5ԼH{TH5H{?H5H{*H5~H5uH5@H{H5,H{H5MH{H5[7H5B.H5H{H5H5%H5 H{H5H{IzIE1A>1I ?HLAT;_1JЀ +rJs©JH~I +HHsE1HVD)s knE1H;E1L%wHCH9Cv H <EMtH{L1IH IH;utE1A>I9A8<_p@ +rPsPHHyLII@IstH~HuE1 IE1L9MBHKS LMLEHEHMȉUH}A?D){ 6HI1A>I2HAT0_z@ +r z@s©z@kHqIY@HHsHE1A>I9A8<_pp@ +rPsPdHHyLIMI@Is<HHCIuH{H5ʸXG2H{H5HHyItIu0HH{H5#GtAE1H{H5FuE1L=IC HGuM9MtH{LFtHHCD){ HqHHHuTH{H5]F$5HHyIt IHH{H52"FtDH([A\A]A^A_]HHHEbHHH9HTH< +LGHHHH HHE0LHAHqIH9vA<0_Iu HHqE1HIE1A>I2HAD0<_x@ +rPsPHqLII@HIsH{H5ڷEE1L% IC HqM9ttMtH{LDtH{H5öDHqIuLHH{H5H([A\A]A^A_]pDH{H5n[D0H{H5\9DHLH([A\A]A^A_] dddddddddd&&ee\dddddddddddd d,AVdkt}dddUHAWAVAUATSHIHHHE1HHH9HvH< +Uu$HHHAI<$uE1ID$I9D$weE1ID$I9D$vVI $<KuLHID$I$HIEWHHH9HH< +C HHHL=ٳEE1I|$H5zKBAUM_I|$H5!BA+HDžHHPHXLXH`HDžhHpHDžxH__HEfEI\$H}P}HUHMHHHHMIH)H}L@L}Mt&H]HtH}uEHEI$I|$H53HĨ[A\A]A^A_]A}<}tLHHPLHHPL9EL)LXHL@H}HH HH0}LmHHu&0uL8H@HMII)HE.}uc}t +LmL} LmL}M9tFEM)LmI|$H5@(I|$LL@[ I|$H5?I|$H5?AI<$te1L=ID$I9D$v +I $<Et7HtI|$Ls?LutHI<$uHID$I|$H55?uFI$HIEtHHH9HvH< +uu HHHE1I|$H5ű>tDHĨ[A\A]A^A_]LH=VHF+@UHAWAVATSH0HHHHHDHQH9QvLH1<BuCHHQH3HHEeLVLLFMM9vtC<_MujIBHF1>HKH9Kv@<Iu:HHKH1duH{H5b=A'H11IzIE1A>1I ?HtEAT;_JЀ +rJs© JsH~Ip HHsAH;E1L=\HCH9Cv H <EMtH{L(=-H(IH;uAH~HuE1 IE1L9MBHKS LMLEHEHMЉUH}ADH0[A\A^A_]HHCf.UHAWAVAUATSHHHA<DAH;LmAHCH9CH <pHHCH{AtH57+<t#fH5q<AH;LHH}HEHEHEHEHEHMHMHEHsH}uxH{H5ԭ;u_HuSH;AuE1AH{H5άd;-HEHH{H5N>;AEDHH[A\A]A^A_]AUHAWAVATSHPIH?LHHDHHH9HvUH< +BuLHHHI4$HIELVLLFLM9C<_LIBHF1It$MT$L9F4IRIT$AƟAwwEH JcHH9v1<nu+IMT$I|$H54:cLpOI|$:16I$I|$H5HP[A\A^A_]9IzHE1A>1f.DH9HAT;_ZЀ +rZs© Zs|H~IpnHHsaI|$H5E9uxAH5HJc HH5*H~HuE1 IE1L9MBIL$AT$ LMLEHEHMUH}HP[A\A^A_]H9HHGMD:HML +1f.DLH1A IDID$AH< +rۍA<rԀ_I L9H9t<I)It A|H<1L<0I|$H54I|$H5H9HHGNHILE1HLteC\KD +ID$CI< +rލC<r׀_u?K +L9H9t<I)Mt C<IAHv#I$I|$H5E571IWwɉ%=tMI|$HEHEH>HEHHEHEHEHEHEHEHu6H5_H5OH5H5mH5tH5KH5M~H53uH5PlH55cH5UH5GH5>H55H5,H5H5H5/ H5ǧI|$5OHI1ЉƒJ L9|x +HljJDL9t GH?1L׉ӃvJ4L9t7Hǃ?  D1L rJL9tHǃ? 1҃ =PЃ +Lp.pH=fH+I|$H5tH=8H@+ƀLf*`*`*`*`*`*` Hvvjvvv%.v<f.fUHAWAVATSHIHHHEHQHqH9HHGH9L$II)E1f.fLLCJ\HYXI€ +rۍXr<_u|JLH9HtH9t<HtHH)JDHt C|MzIvQI~H52uOI~LLII~H5H[A\A^A_]2HEIuIvH}\H[A\A^A_]OD"HH1(@ƉIL<HH HUL9tA $xIĉfID<L9tSAt$I?AAvKID<L9tJA$Iă?L ƀrAHD;L9t@HÃ?I41MAAwAD 91L ƀsA D !1AAD ƁFЃ +NNH=H+J}L;f.@UHAWAVAUATSHIIH@H HXAf@xL}usLULpIEHELXH`LhHMI| INH90L]LuHELHHH)HPLHHE]HXH`LDMHU HAHtH9t < H9Hx DHsL9t=sH?AAH}gDUHAVSH0HI?uCH{ Hs(HHEHEHEHHEHEHU t H0[A^]ILHH0[A^]Q?UHHYg,]UHH~ HF(H@H5 ]UHH~ HF(H@H5]UHHHc HG]\]OHHc HG}]ËwHW @ +0WBHt*HHW]G{]Gu]G\]G]tkvdUHHHW]UHHG]fDUHHG]fDUHH]UHH`HGH}HH UGHMHEHAHEH}HEH~ Hv(HsHEHEHEHEHEHEHU +H`]UHAWAVAUATSPH=IIIfohfopfo%xfL% ALHQII)fo!fo)fo%1fIG8t6I?IGLPffo%fofoЊL1 LH)$IHs:HLH)1f< +HH9ufHxHH)t3H9HGHt'1D< +HH9uHNH9vKHN1f.o8foffffftfЁu HH9vH9H9tPHILH)1Ҁ< +t +HH9u0HHHH\L9A< + fD1LIOI?IOI95vXA<~QLHQu'A<%LLLHLd1H[A\A]A^A_]HcL<LL1Htd@UHAWAVAUATSHhHAtDsC HHh[A\A]A^A_]IIIHP0K LEux1҄H H5HDHHx H@(PuHHx H@(LLPuHHx H@(H5PeH3LHEPu%Hx H@(H5&P0HP0E@ )EHMHMH4@p8HUM@upMH}H}HHELL(H5WH} HpLHEPH}HEH5qPAxf.UHSP Gt=Hu1H@0Hx H@(H@uH52 H5#ЈCH[]f.UHAWAVATSH`HAIIHHSH0uD1HHLjH5HDH)Hx H@(PH3LAWHu!Hx H@(H5|PuvHH0E@ )EHUHUP4@p8HMȉU@uEMHEHEHHEHuLAWuH}HEH5PADsHCHH`[A\A^A_]f.UHAVSHOGHt^HAuMHu*{t$H@0uHx H@(H5PuHHx H@(H5}PADsD[A^]f.UHAWAVATSH`HAIIH3F0K u2t"H~ HF(H5PH3LAWu!H~ HF(H5PutH3F0EF )EHMHMN4V8NEȉM̈UEMHEHEHnHEHuLAWuH}HEH5ZPADsC H`[A\A^A_]@UHSPHHH[]UHt]HHx H@(H@H5 ]@UHHEsHuE&H]Hu=s M$? EH]=s. M?ɀM$? EH]M ?ɀM?ɀM$? EH]fUHH@H}HF(HEHF HEHFHEHFHEHHNHMHEH5^H}HUH@]f.UHH?]UHHH?EsHuEH]Hu=s M$? EH]=s. M?ɀM$? EH]M ?ɀM?ɀM$? EEH]f.DUHH@HHEHF(HEHF HEHFHEHFHEHHNHMHEH5 H}HU~H@]UHHH]UHH0HF Hv(HO(HMHO HMHOHMHOHMHHWHUHMHUHH0]f.DUHAWAVAUATSHXIHH HEEHEHEH}HuHZH@IUIEIuH9HGHHEHuHUH0HPQMm H0LeIL}@CEECEHKHCHt Ht+HH I9LuIDH 1HMHEHKHCHt Ht#HH 8I9LuIDHf1HMHEHKHI| HuAT IH8Mt$H}HEIt$I$PMMe(IEIuI9LGMHEtbHuM} H0HPQ1MI<HuATueIt4LsH}HEHMHtHTPLt:E1L9w4LeHuL9v'H}HELHHMH4HTPt1HX[A\A]A^A_]DUHAWAVAUATSH(MMIHI@tMu I](If.@ItLuS tEAE4EAE8E1DH([A\A]A^A_]ÐbSUHAWAVSPIIHtH{ HC(P u%MtH{ HC(H@LLH[A^A_]1H[A^A_]fUHAWAVAUATSPIIILHGIu HtFHIOL%1HLOD2HA?HӃA A AE E Af.fHH)HHHtpI9H^yL9tH^DVA?HHf4?eUHHHHH]f.UHAWAVAUATSPIHH~ HF('P tH[A\A]A^A_]ËACwAtH HcHAnV\t (utAA0Ar(؃˃HMII AH E1DI~ IF(P ?\DHcHALH H HcHHI!A}HUЍ D< +W0BHHHHEA`HI!HI A{6HI!HI Au HI!HHI!HI AI~ IF(H@ 'H[A\A]A^A_]3@@a@@@@@@@@@@@@@@@@@@@@\@@@@\`(.XPb|UHHH>tH~uEEHEs Mʁs0U?ɀMyH~ HN(HI H]s' U?ʀU?ɀM3U ?ʀU?ʀU?ɀMHHH]f.fUHAH~HH)t9H9HGHt-1f.@D8HH9uHBH9vzHB1EHIfHnfpDfo gfogff.o$>ffofffftf́u HH9vH9wFH9u11&H)H11@D8t +HH9uHHHH]øH]HHH!AUHAVSL^II)HL)؃E1L9LBLCIM)NL H\1f.fI9t HKH@8;HuIM)M)I)@HHfHnfpDfo ffofff.LM9v-LAodffofffftf=tH9w=1@HtLI@8|LuL[A^]HLHH?HHHHT@@UHAWAVATSHE1HHLCHLFII)1L iIAfHH9x\ItD)@fHL9sH|H <LtH9<xHH9YfF< AAt1AtUAUHyH92> 4HyH9D<>tFuUApA0rj +HyH9D<>t}AAEAr$AEHyH9>uHyH9sn>tLqEyrAr+j{@ w Ey\ArTAwNuFEyAHyH9s">uHHCHpHP1.E1E1AAAII HHLpH[A\A^A_]f.UHAWAVAUATSHIHM*MIHUHuGE1MME1M9MFMGM9LLHEL9K44Mt:LLHBHޅt%MM)M9MGI1LHEAE11ҹE1"H\ +IM)1LIHM9txHL9soHHLH)HL9HHLL)L9HYAA8L9A LEE1HHQ0q7 +@BAPIIHHuԿL)HsxHNL׾HĀ]HHc HNPf5~HLD5A'I)H#ML׾1HĀ]H&f.UHH0Hdr,ȍ kd(H (NAfE$ &< +s0D H MAfE%LD A'I)HyLH1H0]@UHSH(IHc7IILL޸'I''IKY8m4L Mf.DLIH i'D)i{kd)HAAYf\ AKL1H([]f.UHH0ID'I''IKY8m4L NLf.LIH i'D)i{kd)HOAAfD=AqfD=HIIwHcv.i{kd)H5KVfT HHH +}0T HLHcwHKPfD HLD A'I)HJL׾1H0]f.@UHH0IL'I''IKY8m4L Kf.LIH i'D)i{kd)HOAAfD=AqfD=HIIwHc~.i{kd)H5JVfT HHH +}0T HLHcHiJPfD HLD A'I)HHL׾1dH0]f.@UHAVSH HL7A>IH{ HC(H5K@PH]؈EHEELuHH}HuHMEHtYuNHu+}t%HE@0uHx H@(H5dIPuHEHx H@(H5FIPÈ]H [A^]H{ HC(H@H5?H [A^]UHH?]UHHHN0u? unЀd  kd(H HAfE$LEE1fQ0yW +@BAPIIu>LEE1f.@Q0y7 +@BAPIIu׿L)HstH?HH]HĀ]ù&< +s0D HHPfE%LD A'I)HFH1 HĀ]HUHHH HcHH~ HF(H@H5P]H~ HF(H@H5P ]H~ HF(H@H5P ]H~ HF(H@H5sP ]H~ HF(H@H5E]vUHHHOHIH]f.UHHH7HWH]9fUHAWAVSHHILH~ HF(H5O PH]HELuH5OLUH]HM H L}H5OLnHM H}Et;u2HE@0Hx H@(H@uH5E H5EЈEH[A^A_]f.@UH s]Ãǁ!]UH 1$ HBHBLOAt 9HGHPAt 9HGHBAt 9HGHPAt 9HGA4 19HHHAHt ELI1HHrHA#AHHHI9t?)H=HGI1LNH9tB49w HI9uL$]HZHH.HHJHDUHIIvHHd$IIwL)Hd$HÐUHSHH&HFHȃ?IIIIOL 111ȉ 1H 1AAA1LL!1H9HCI9H)H9MKIH@HLHML HLHMLMLLH H\H H\LLHMHLHMHUHTH D D1؉11ȉ 1H 1ʉ1HL!1H9HCI9#H)H9KRH@H\H]L H\H]LMLLHL\HL\LLHUHTHUH]H\Hlj 1ȉ11ȉ 1HH 1ˉ1H L!1H9HCII9svH)H9s_K RH@HTHUHHtHuHUHTH4H\H4H\HTHMHLHMHUHTH H[]HAdHMHdLf.DUHAWAVSH(HHFHȃ?IIIIOL 111ȉ 1H 1AAA1LL!1H9HCI9H)H9kMKHHL HMHLHMHLHML HLHMLMLL LtL|H H\H H\L|LtLL HMHL HMHLHMHLHMHUHTH D D1؉11ȉ 1H 1ʉ1HL!1H9HCI9H)H9KHH\ H]H\H]H\H]L H\H]LMLL L\LtHL|HL|LtL\LL HUHT HUHTHUHTHUH]H\Hlj 1ȉ11ȉ 1HH 1ˉ1H L!1H9HCII9H)H9K HHT HUHTHUHTHUHHtHuHULD LLH\HHtHHtH\LLLD HMHL HMHLHMHLHMHUHTH H([A^A_]HaHMH`LUHAWAVAUATSH8L_(L~HGHEHG0HEHFHEE1"DHEH]HZHLbI^H9sNHIH\H;\:I@I9!HHHXH;PHH9D1H9H2HAH9H@L,IHDHEHHTHUHEJDHDJJTHTHHEJDHEHUJTJHHQLdLRN;dLuMLJMMHLML]N N\MMXJ\IXHtLN;dMsEHEJLuHCHCLCHCHCLHHCL;cHrMLuHUH]HXHL`IHH)HGN NdM9a(4IQMIAHELEIAMA IMAIA(IAHM9a@HEJHEH)@HH[HZLHZHZLBHHZL9b(rH<H8[A\A]A^A_]1H^HH#^HUHAWAVAUATSHXIH}HGHEHFHEA1+HHMHLhHMHHML}HMH:M9zHMKHMH$M9rIMIMM9HM9EMMH;L{HsLsM9LIGtyMMHMU1M9I2IL9HHMHO$H}HLHMH HTHUHMJLHLJ JTHTH HEJDHEHMJLJLLL)HL}HEJ H1HyHMLy NlM9LIGHut L} M9L}vMH}HGHMJLHMHHHOHHPHWHH$HEJLeL+e:f.M9HCHK(HKHKHS HSH HIH{Ls M9LIGHutxHX[A\A]A^A_]1H^[L6Hg[LL$@UHAWAVAUATSH8ILvLGHGPHEHFHEE17f.L:HEH}HBHzHEHBHEHB IH9sNHI²I;\;IDI9HHP(HX(H;HH9D1H9vH2lHAH9ryHL$IT HUITHUITHUII\H]HUKT IT KTITKTITKK\I\IHUKT HUKTHUKTHUH]K\KHM,HQHM}M;<I%@%B%D%F%H%J%L%N%P%R%T%V%X%Z%\%^%`%b%d%f%h%j%l%n%p%r%t%v%x%z%|%~%%%%%%%%%%%%%%%%%%%%%LAS%Ahhh8hVhkhhhhhhh0xhEnhTdhcZhPhFhhRhahthhzhpHello World! +!! already borrowedconnection resetentity not found at AddrNotAvailablePermissionDenied/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/collections/btree/map.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/num/mod.rsattempt to divide by zeroattempt to calculate the remainder with a divisor of zero/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/pattern.rsalready mutably borrowedassertion failed: `(left == right)` + left: ``, + right: ``/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/slice/mod.rsassertion failed: mid <= self.len()/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/slice/sort.rscalled `Option::unwrap()` on a `None` valuecalled `Result::unwrap()` on an `Err` value/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/vec.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/slice.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/line.rsInvalid Mach-O load command headerInvalid Mach-O load command sizeInvalid Mach-O load command table size/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/addr2line-0.14.0/src/lib.rsAccessErrorcannot access a Thread Local Storage value during or after destructionlibrary/std/src/thread/local.rsuse of std::thread::current() is not possible after the thread's local data has been destroyedlibrary/std/src/thread/mod.rsfailed to generate unique thread ID: bitspace exhaustedthread name may not contain interior null bytes" RUST_BACKTRACE0library/std/src/env.rsfailed to get environment variable ``: library/std/src/ffi/c_str.rsdata provided contains a nul bytelibrary/std/src/io/buffered/bufwriter.rsfailed to write the buffered dataunexpected end of fileother os erroroperation interruptedwrite zerotimed outinvalid datainvalid input parameteroperation would blockentity already existsbroken pipeaddress not availableaddress in usenot connectedconnection abortedconnection refusedpermission deniedOsmessage (os error )failed to write whole bufferlibrary/std/src/io/stdio.rsfailed printing to : stdoutlibrary/std/src/io/mod.rsformatter error:.internal error: entered unreachable codelibrary/std/src/path.rslibrary/std/src/sync/once.rsassertion failed: state_and_queue & STATE_MASK == RUNNINGOnce instance has previously been poisonedassertion failed: queue != DONElibrary/std/src/sys_common/at_exit_imp.rsstack backtrace: +note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. +__rust_begin_short_backtrace__rust_end_short_backtrace\x attempted to use a condition variable with two mutexeslibrary/std/src/sys_common/condvar/check.rsPoisonError { inner: .. }library/std/src/sys_common/thread_info.rsassertion failed: c.borrow().is_none()fatal runtime error: + +thread '' has overflowed its stack +�memory allocation of bytes failed +Rust panics must be rethrownRust cannot catch foreign exceptionslibrary/std/src/panicking.rs' panicked at '', note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +thread panicked while processing panic. aborting. +thread panicked while panicking. aborting. +failed to initiate panic, error library/std/src/../../backtrace/src/symbolize/mod.rs    - cannot panic during the backtrace functionlibrary/std/src/../../backtrace/src/lib.rserrorCustomUnexpectedEofOtherInterruptedWriteZeroInvalidDataInvalidInputWouldBlockAlreadyExistsBrokenPipeAddrInUseNotConnectedConnectionAbortedConnectionResetConnectionRefusedlibrary/std/src/sys_common/thread_parker/generic.rsinconsistent park statepark state changed unexpectedlyinconsistent state in unpark<advancing IoSlice beyond its lengthlibrary/std/src/sys/unix/io.rs2library/std/src/sys/unix/mutex.rsstrerror_r failurelibrary/std/src/sys/unix/os.rs/dev/nullrwlock maximum reader count exceededlibrary/std/src/sys/unix/rwlock.rsrwlock read lock would result in deadlockstack overflowfailed to allocate an alternative stacklibrary/std/src/sys/unix/stack_overflow.rsfailed to set up alternative stack guard pagelibrary/std/src/sys/unix/thread.rsassertion failed: page_size != 0failed to allocate a guard pagefailed to protect the guard pageassertion failed: signal(libc::SIGPIPE, libc::SIG_IGN) != libc::SIG_ERRlibrary/std/src/sys/unix/mod.rslibrary/std/src/../../backtrace/src/symbolize/gimli.rs.dSYMContents/Resources/DWARF__DWARF__library/std/src/../../backtrace/src/symbolize/gimli/macho.rs__TEXTSomeNoneKindcodekindfull/Boxthread 'NulErrorTimedOutNotFound__.SYMDEF SORTEDInvalid archive sizeUnsupported archive identifier///__.SYMDEFInvalid archive member header` +Invalid archive terminatorInvalid archive member sizeArchive member size is too largeInvalid archive extended name offset#1/Invalid archive extended name length! +Pcalled `Option::unwrap()` on a `None` value/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/collections/btree/map/entry.rsassertion failed: edge.height == self.height - 1/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/collections/btree/node.rsassertion failed: idx < CAPACITY.debug_types.debug_str_offsets.debug_str.debug_rnglists.debug_ranges.debug_pubtypes.debug_pubnames.debug_macro.debug_macinfo.debug_loclists.debug_loc.debug_line_str.debug_line.debug_info.eh_frame_hdr.eh_frame.debug_frame.debug_aranges.debug_addr.debug_abbrevassertion failed: `(left != right)` + left: ``, + right: ``/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/abbrev.rs()/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/pattern.rscalled `Option::unwrap()` on a `None` valuecalled `Result::unwrap()` on an `Err` value_ZN/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/legacy.rsZN::_$.SP@BP*RF<LP(RP)C,_R/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/v0.rs__Rpunycode{-}..._!f64f32usizeu64u32u16u8isizei64i32i16i8str'?, > ::{closure:#[] + ; const unsafe " fn( = : 0xfalse.llvm./Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/lib.rs__ZNu128i128charboolfor< as shimdyn mut -> trueextern "library/alloc/src/raw_vec.rscapacity overflow� + + + + + + + + + + + + + + + +??^1 + range end index ) when slicing ` <= Zero (bytes `from_str_radix_int: must lie in the range `[2, 36]` - found library/core/src/num/mod.rs..BorrowErrorBorrowMutErrorcalled `Option::unwrap()` on a `None` value: :index out of bounds: the len is but the index is library/core/src/fmt/builders.rs { +, +, { } }( +(,) +[]library/core/src/fmt/num.rs0x00010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899library/core/src/fmt/mod.rslibrary/core/src/slice/memchr.rsrange start index out of range for slice of length slice index starts at but ends at attempted to index str up to maximum usizelibrary/core/src/str/pattern.rslibrary/core/src/str/lossy.rsassertion failed: broken.is_empty()[...]byte index is out of bounds of `begin <= end ( is not a char boundary; it is inside ) of `library/core/src/unicode/printable.rs  +      +,- .012 xy0WXKL./?\]_ℍ)147:;=IJ] )14:;EFIJ^de )EIWde EIde񃅋HINOWY^_[\ mqno_}~FGNOXZ\^~rstu/_&./ߚ@0NOZ['/no7=?BESgu _"D5( /4 +PU +   :W PC- :%_ mj%Y    j +Y+F +, 1 ,  +!?L-t<<8+/- ! /; -t   7 \*8 +8F t ZY  + L 1& mx(*L   +  $jk   ';>NO 6=>V67VW5 )14:EFIJNOde\ + 69: 7 +;>fio_Zb'(U :?EQ͠"%>? #%&(38:HJLPSUVXZ\^`cefksx}Юyno^"{-f/.1$ +D*$$(4 7  +9c 0!@8K/ + @ ' 6: PI73 3. +&RN(*V NC +H' u ?A*; +QbH +^"E + 9 +6, 4 +_9QUje  + +( . RzH;?Q72m` 2& '5 kA?m #]5;7y+.f0X(`*X4=<=A+ $&|2>1XZl pY"L+ ! B " !"!B B"    Ē ɒ Β#ɒ # #:Α; >̑H ʑHIȑHQYZ1  ލZԎJِΏݏא͐  ’ݒ ?aaa a>a!a%F`*a++a,.[`[-[`[`]`]`]`_`__2``%% _1 _1K_Q(_YX^Z\^[^[^[^\^\^\ ^\^\^\^\]\2^]#^]^]]]]]#   8nn##32#4 ;2B $l)b&  KKMm[ 5924 U BBKKMKKM  # +kp:4? e&#### 4##,*)).U=##f YY[U-0P    1   %# # {) + VV#{yyy m +os%#aax###&+`` i###,v2#& ``baZa^ _"a"#b%(__)`),_,/ _/2a47 _7;_;>a?_@B^BUC^C^D]F ^FH^HK^L^LP]RW_WY]Z]\] ]]abaS% % % M%#$$$######$$%%%gPX4   :'  86 LPXQXa!!Q aQ QQQh||  P$%ĬP'جp(, --/1,06D09X:l<|`>DUfحp$`BsDpl Ȱذp0,@H`x0ı@`$@< Th0| ز@P,@<pd̳Pp4pt   д "%`+H-\ /h@3x4h`$\l |0qtd   P p@p0 + + + `  p @ `@`@`pPP` P!!@""# ##$`%%%0&&'P(@).p?P^p``@a bcdpfgii kpll`mq{@P`P,\`pb}}~~` ` Г 0Н  Ш0P0д@ ` 0 @ +p00@` +@`` +pP +0  + P P +00 0PQe jPjjklm n@qq`uu}@~~ p0 P0p@`p Pp0@Pp 0`@`P` !$`,,124P5<@=?@CCPE EH K@T`WX [0^^0_p__bzRx Y<Y\X|XzRx $9AC t 0ppp ?Z/0"~z}0"y|0"Pw|0"~0x@}0"KTO4!TO@TO@!Ã- 0" M M M  M |N|N|N0|N0|N'0"@0"p(0`) 0" 0"Yp,P(H*pJ"pJ1pJ?pJHpJIpJL[[[[X)0"TOY3 YHY0Y:YYYZY/&Y0)Y3Y2#*#*$߈0)0 @0Pp/ +;();(;(0"0"@0)00 ފ4ފފ *p*k!P'0P' `P'P#o g"Y&K L" }"&0"0 ϋ20" "ϋA1ϋϋϋ ϋ5u)0 @<  Xo0F+))))+)($)())"avw 0" Ŏӎ$$0")p)))P@@0)`X<KvNN-   0" + +0)0"0"  2Ώ+ 0"(P 0"8@ 4v+N00Ȑ= _v*d 0"0"p0"Pۑ3!&ۑ3/Ã- ߈%ۑ3,ۑ32#ۑ3fۑ3t !7A!:!;M!kA!n!oMM~ M6"' "/ 6* 6* "0 "l"q_ 6B6L1<@6\P@P  0`".[ [ -F RS] S]CS]\1O4!O@O@!JOO&Za6 +Za: +Za= +ZafZao'ZapZarZarHZasZa~Za(Za!Za!ZaEZaZa+Za/Za"Zaۛ]ۛ]ۛ]ۛ]8ۛ]eۛ]j ۛ]* ۛ]ۛ]ۛ] ۛ]V5ۛ])ۛ],ۛ],t^G^NQ<О3pp>p@@A as 2!s 3Ve̠ Z̠ s̠ "0" 6 w w"w0wwwy}t!je!Zݢ yT@yݢ &`2y@% +@%6(K((W(R>VXU`~j~t~~~~~~~~~~~~~~~ +(2<FPZdnx",6@JT^hr|€̀ր222-2PXp"ppTAppTBTBTBTBRBpRB RBRBRBRBRBRBRB RBppppXBRBRBRAppppTBTBTB SBpSBppSApRAppWApWASBSBRBRBSApppSBSB ppRBRBRBpp TBTBppRB"ppppRApTBppRBpTB RBRBQ#`@@__tlv_bootstrapQs@dyld_stub_binderrs@__Unwind_Backtraces@__Unwind_DeleteExceptions@__Unwind_GetDataRelBases@__Unwind_GetIPs @__Unwind_GetIPInfos(@__Unwind_GetLanguageSpecificDatas0@__Unwind_GetRegionStarts8@__Unwind_GetTextRelBases@@__Unwind_RaiseExceptionsH@__Unwind_ResumesP@__Unwind_SetGRsX@__Unwind_SetIPs`@___bzerosh@___errorsp@__dyld_get_image_headersx@__dyld_get_image_names@__dyld_get_image_vmaddr_slides@__dyld_image_counts@__tlv_atexits@_aborts@_close$NOCANCELs@_closedirs@_fcntls@_frees@_fstat$INODE64s@_getcwds@_getenvs@_mallocs@_memchrs@_memcmps@_memcpys@_memmoves@_mmaps@_mprotects@_munmaps@_opens@_opendir$INODE64s@_posix_memaligns@_pthread_cond_destroys@_pthread_cond_signals@_pthread_cond_waits@_pthread_get_stackaddr_nps@_pthread_get_stacksize_nps@_pthread_mutex_destroys@_pthread_mutex_inits@_pthread_mutex_locks@_pthread_mutex_trylocks@_pthread_mutex_unlocks@_pthread_mutexattr_destroys@_pthread_mutexattr_inits@_pthread_mutexattr_settypes@_pthread_rwlock_rdlocks@_pthread_rwlock_unlocks@_pthread_selfs@_readdir_r$INODE64s@_reallocs@_sigactions@_sigaltstacks@_signals@_strerror_rs@_strlens@_sysconfs@_writes@_writev__main:rust_&mh_execute_header6_r?ZN.ust_Udl_&g_oom7allocdreallocforeign_exception&p.start_panic.0_error_handlereallocrop_panic&011 63std247 5891/4; 8_$LT$0_$LT$1_$LT$7_$LT$std..path..PrefixComponent$u20$as$u20$core..cmp..PartialEq$GT$2eq17hc27c7959dd01443fE2_$LT$std..(4_$LT$+object4read.3_$LT$56_$LT$core..str..lossy..Utf8Lossy$u20$as$u20$core..fmt..Display$GT$3fmt17h74fc33f0f85fc8edELstd..thread..local..AccessError$u20$as$u20$core..fmt..Debug$GT$3fmt17h273f87e5dd3cef1aEcore..?6thread32410sys_common$9panicking(7process5abort17h3aac11b7f057a319EY4park17h4e0a5ea8b8cc0704E6Thread3new17h6b4affc24038a1baEenvffi5c_strsys4unix*11current_dir17h8e476354e14c7a88E7_var_os17he4f4ee986eda60b5E3_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$std..error..Error$GT$11description17ha938a107b7cdb3ceE 4_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Display$GT$3fmt17h08228dc511cb316dE 2_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Debug$GT$3fmt17hc540d384a135e2d4E 9_$LT$0_$LT$std..sync..once..WaiterQueue$u20$as$u20$core..ops..drop..Drop$GT$4drop17h7155e5839eee4f3fE$3_$LT$std..sys_common..os_str_bytes..Slice$u20$as$u20$core..fmt..Debug$GT$3fmt17hec992e4fc8fea675E%5_$LT$gimli..read..abbrev..Attributes$u20$as$u20$core..ops..deref..Deref$GT$5deref17h8cc1c55cb8addf1eE31_$LT$rustc_demangle..legacy..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17hc0f205cd35f0b469E4$RF$$u5b$u8$u5d$$u20$as$u20$std..ffi..c_str..CString..new..SpecIntoVec$GT$8into_vec17hc1afdddfe7a5a43cEstd..backtrace_rs..symbolize..SymbolName$u20$as$u20$core..fmt..Display$GT$3fmt17h5481f908bcfcf1f9E-7CString18from_vec_unchecked17hb4a87cd072bc5230E104_$LT$impl$u20$core..convert..From$LT$std..ffi..c_str..NulError$GT$$u20$for$u20$std..io..error..Error$GT$4from17h0d8da0bc9d655ef9Efs11OpenOptions5_open17h0592fb6dacd3d10fEio5stdio6_print17h2b92ca946b4108adErt19lang_start_internal17h1faf79574185df6dE(8_$LT$std..io..error..Error$u20$as$u20$core..fmt..Debug$GT$3fmt17hb15268f7a75e41e2E7_$LT$5_$LT$std..path..Display$u20$as$u20$core..fmt..Debug$GT$3fmt17h4eab566fdcb293c6E$gimli1alloc79_$LT$core..fmt..Arguments$u20$as$u20$core..fmt..Display$GT$3fmt17hdda8ea41e3d1d8e4EDstd..io..error..Repr$u20$as$u20$core..fmt..Debug$GT$3fmt17h980a0dd528b6f8b8Ecore..fmt..Dstd..io..core..:error..Error$u20$as$u20$core..fmt..Display$GT$3fmt17hcf4989df195aa7f5Estdio..StdoutRaw$u20$as$u20$std..io..Write$GT$9write_all17h438015c553a11ff1E$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$9write_fmt17h2a040ce7f300a9bcEstd..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$9write_all17h02d3d39763e125dfErustc_demangle..Demangle$u20$as$u20$core..fmt..Debug$GT$3fmt17hd65b8b7251b75e54E6Мpathsync4once4Once10call_inner17h755b6d60054eea69EY10Components7as_path17h1c6e41db64548857E7PathBuf5_push17hceb662aff65bc21eE$0_$LT$std..path..Components$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h13857d5e18b1c9dfE6_$LT$std..sys..unix..fs..ReadDir$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h8bf8320bf6d5e305E*2_$LT$core..char..EscapeDebug$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h571933ba2a1d97ecE;5_$LT$std..path..Components$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hf50057d659163bf8E$1_$LT$std..sys_common..backtrace.._print..DisplayBacktrace$u20$as$u20$core..fmt..Display$GT$3fmt17h34f76b2ca42fab41E$0_$LT$std..panicking..begin_panic_handler..PanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$&3_$LT$std..panicking..begin_panic_handler..StrPanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$'addr2line9path_push17hd2ef9754a0c8fa0dE16_$LT$core..str..lossy..Utf8LossyChunksIter$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hde7c21e241e97426EL5mutex12MovableMutex3new17h9870e9b6ed9c2299E%1%1thread_info3set17hcb72bf5da4fd3594E%3thread_parker7generic6Parker6unpark17h6aa121c7b8f4a08bE*oom&begin_unwind&panic(eh_personality.alloc&dealloc&realloc&8take_box17h34d30bb94d93fdecE'3get17h1abd87a207585fa8E'8take_box17h7d5123a61bf0b11dE(3get17h91405c3d141915a1E(20rust_panic_with_hook17h28bf9d6c3916221eE(1Y3try7cleanup17h5bff449612ac2cffE[Лffi..c_str..NulError$u20$as$u20$core..fmt..Debug$GT$3fmt17h618b66ceb7f31360E*io..error..ErrorKind$u20$as$u20$core..fmt..Debug$GT$3fmt17h0fe973120dff45ecE*2fs7readdir17h2836587a92cf11e2E+17thread_local_dtor13register_dtor17h6762234705c4baabE-std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$,rustc_demangle..v0..Ident$u20$as$u20$core..fmt..Display$GT$3fmt17h9717f14fbc1909adE4core..str..error..Utf8Error$u20$as$u20$core..fmt..Debug$GT$3fmt17hac3b2d48837c0e10EX5-14write_vectored17h6b2dd7f421c4a919E-write17h79844533ff1e4615E-flush17h135d85c4975875b5E-anic_cleanup.robestackY + + +4util11StringTable3/7archive11ArchiveFile5parse17h833d0f11ffe26734E/9ObjectMap3get17h4c1ecc3ea60da5a4E1new17h0b2660190ea7f7a2E/get17h254cff78bdbcec0cE/Ў + + +03_$LT$object..read..archive..ArchiveMemberIterator$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hfa1a102f805e214dE14rustc_demangle4 + + +6common9SectionId4name17hcc0c64229b4143d2E14read1 +6abbrev11433Abbreviations22Abbreviation3new17hf249fe84b4852507E20Attributes25empty17h1148f33bafc7f601E26insert17h6e76207660e7b51eE2 + + +3new17h8156b44ed52c0e75E34push17h37eaa776d64da3b5E3 + + +line7LineRow18apply_line_advance17h313d35e85ba294f7E4unit20allow_section_offset17h840de4f0c714ee4aE4 + + + +8412try_demangle17h6ebfe631036faf75E5demangle17hc97ece7dadee9ed4E5Demangle6as_str17h1e82f3c4c269f359E5   rustc_demangle..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17hf5d5adacbab34e24E6core..cell..BorrowMutError$u20$as$u20$core..fmt..Debug$GT$3fmt17h9ff749290d38bd62E;   11collections5btree4node10splitpoint17h0f5d6edf3db63eb3E87raw_vec17capacity_overflow17h84f2ee8706ad9006E86string85alloc18handle_alloc_error17h17828f1cec6e7e68E[  6String15from_utf8_lossy17hf1eb1c1633e093d9E818 3FromUtf8Error10into_bytes17hde44d7e3879cc819E:04_$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$4from17h04e9917c1cb5a5a5E: Л cell..BorrowError$u20$as$u20$core..fmt..Debug$GT$3fmt17h06ead577b1ca873fE;panic..Location$u20$as$u20$core..fmt..Display$GT$3fmt17ha2751887b615c60aE?   core>0_$LT$str$u20$as$u20$core..fmt..Debug$GT$3fmt17hfe0f1d4d0486e9abEI2_$LT$str$u20$as$u20$core..fmt..Display$GT$3fmt17h668ecf8eca00c6e1EI1_$LT$char$u20$as$u20$core..fmt..Debug$GT$3fmt17h979aff76c6c6ae27EI3_$LT$char$u20$as$u20$core..fmt..Display$GT$3fmt17h607d337768a224c1EI5>3A7unicodeL6[9panicking\panic>sliceI9PanicInfo>8Location6caller17hd326b0185ea5a49bE?7?8location17h4193e7d76b52197fE?payload17h74c84ca131d269d9E?message17h2c81884012b2bb51E? Т    fmt..builders..PadAdapter$u20$as$u20$core..fmt..Write$GT$9write_str17hfafb527e906b76b9EAnum..error..ParseIntError$u20$as$u20$core..fmt..Debug$GT$3fmt17hbadc9ebecd4f774fEM fmtAstrJnumM8buildersB10ArgumentV110from_usize17h896ab284c39982e1ED5write17h8f13d857463c51c1EF9FormatterF3numO1B9DebugListD8DebugSet5entry17h397b6bd50a20f754ED1DebugStructC0DebugTupleC5field17h1ea22deec867e5d9EC6finish17hbe41f7254329a605EC  5field17h8e2fa41ae2b86a83ED6finish17hdc300016aa138d9fED Я 5entry17hcfc18fed7eeb0e0dED6finish17he68c9b83833e8fd7ED     Arguments$u20$as$u20$core..fmt..Debug$GT$3fmt17h4fea634600e4154bEFFormatter$u20$as$u20$core..fmt..Write$GT$10write_char17hc8f23e7de483ed25EI  1F3pad17h8b93142d29ee2144EG9G2G5debug_H1debug_tuple17h607a2644ff900405EI0debug_list17hf0830059e9ccf358EIpad_integral17h0adac3bf3805f3a0EGdebug_struct17hd3a9d6b0629237bfEI  write_Halternate17h1eee0ad1d4327e92EHstr17h3c2681ff9bffe572EHfmt17h1ebe0ce9ba0da141EH   lower_hex17h153e6fc2538b988fEIupper_hex17h57414fd49f7e7913EI          6memchrI5index2]19memchr_general_case17h93144f1947fe4f7cEJ7memrchr17h9cc48724c17337a5EJ  8converts9from_utf817h10159aefe2b07dfcEL7pattern11StrSearcher3new17hba6905c9a273575bEL5lossy9Utf8LossyL6traits23str_index_overflow_fail17ha8d1e1fb4176068fE^16slice_error_fail17hde89b335320e0c53E^  10from_bytes17h34971ea3fbc55763EL6chunks17hbf5936e3438c750bEL    9printable12is_printable17hc19114cd11eedfacEM12unicode_dataY  21_$LT$impl$u20$u32$GT$14from_str_radix17h97a87b8b713c8cb4EN6N 0_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u64$GT$8from_str17h937e5f273a6822c8EO2_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$usize$GT$8from_str17h979c769f01e688b0EO  5O3imp5V2_$LT$impl$u20$core..fmt..P3_$LT$impl$u20$core..fmt..R5_$LT$impl$u20$core..fmt..TLowerHex$u20$for$u20$PUpperHex$u20$for$u20$Qi8$GT$3fmt17hb5fe08a71976400bEQu8$GT$3fmt17h3ee57fc64e0f18afEQ  i8$GT$3fmt17h244501593265148dERu8$GT$3fmt17h31d42928f6d9c292ER  LowerHex$u20$for$u20$RUpperHex$u20$for$u20$SiRu64$GT$3fmt17h52a5ee1562310d4aET32$GT$3fmt17h0d97eb230357535eES64$GT$3fmt17h96d1e85e1da4d4fdET iSu64$GT$3fmt17hb77ab9b19805c088EU32$GT$3fmt17h40e418e2dace0edaET64$GT$3fmt17hef559a8f86f55756EU   LowerHex$u20$for$u20$TUpperHex$u20$for$u20$Uisize$GT$3fmt17h72759f11bf7399d0EUusize$GT$3fmt17h44ee8ed27e1411e4EU  Н Н isize$GT$3fmt17hc9df9ed9e9211cb7EVusize$GT$3fmt17hacc8407a90f9b518EVН Н 1_$LT$impl$u20$core..fmt..Display$u20$for$u20$u8$GT$3fmt17h5cefcfc8713f25deEW2_$LT$impl$u20$core..fmt..Display$u20$for$u20$W4_$LT$impl$u20$core..fmt..Display$u20$for$u20$usize$GT$3fmt17hc174936c4bde64a2EX i32$GT$3fmt17hcb4e7a571aabe5a0EXuX 32$GT$3fmt17hc2785043f8722bb3EX64$GT$3fmt17h5c753548d23e6a7cEXЦ    2cc6lookup17heff602f3ee6e409eEY15grapheme_extend6lookup17h946cf3fa94cbe4abEY     1panic_count1Z5begin_panic_fmt17hc364d6defd6a88b8E[7is_zero_slow_path17h991e3a61e1166c13E[8GLOBAL_PANIC_COUNT17h6a4e4ef05ac2b79cE^    option1[result13unwrap_failed17h0d8a6fea161e6a5eE\3expect_failed17hc2d54dd321f2ef33E\8expect_none_failed17h5e793a721927d8b0E\   5panic17h2ca2e9d2b0a1f2bfE]18panic_bounds_check17hf2e6ff9d7438b148E]9panic_fmt17h65997884a2662b8cE]   6slice_start_index_len_fail17ha61876d93be6751aE^4slice_end_index_len_fail17hfb5fa93bcd2e1e91E^2slice_index_order_fail17h3caf0605b69fd185E^     ȋ,P0 0@0 @0@PP  P```  000 P @ 00 00000 @ P`000 00`0 00@`  0 ```00000 !"00p```` p` ) aa @ P  + + P00 P` p@@ +PP0` pp``Pc& + P @P000Pp@@   p0`   ` 0``` ` `0P0    @`@0`Pp0ppp T8 HDDr؆pHX0t0X X|LH,H(@TPD`$`X(# \*03X88 8p$9|990:Z:p::.;_;; ;t<<=I===P$>pm>>?L?0?@?*@`^@0@@P@(A A A  R@>>R`>oRP?RCRDSUHSfySuSvTvCTvTPwT0xFUyUzU|OV|V@}V}TW~W~XYXX YEY YY Y'ZUZZZpZ1[}[p[P[ A\ \`\p$]]]"^`Bd^s^v^x0_pl__B```'aДtaaa=bnb b0b0!cc dd eee(fPXff@f`f@,g ghhhi0Vi ij@jPj5kkkP9lpll mKm mPmpnpjn +n ;o ooQp@p"p`$p%Hq(q)q`+Pr,r-r- s /Ts@3s4s@f%thst{t0u@{uPu`u v9v vv&w wwPwCxtx@xpx +y;yy@y)zfzzz4{{{{@|m||P|9}0j}} } ~ =~~~P'[=#܀`O<UV΁VX`XX[-^f0adf)Pj[pmnuwALȩ| +0DĬXجlІ,DX l |4H\pح$ԇDl$Ȱ8ذL`t,H`Ĉx؈ı(<$P<dTxh|ˉز +,4<Id^s̳4NJd܊t0дEZoH\hËx؋$'\:lM|` o  Hߌ P W   # g   8[ P h Z   pPX1`jhpD.ddf.q$]P$N.P$$N.ߘ$$N.&$$N.m$$PNP.N$$PNP.P$P$ N .p+$p$N.t$\$N.$$N.H$$ N .0$0$N.@ߝ$@$PNP.=$q$N.`ž$`$N.0$0$N.*$$`N`.P\$P$`N`.$$`N`. $ mŠ$N. $ $ N . n$ $N. ʡ$ $N. &$ Ңg_$@N@."B$"$ N .0"$0"$N.@"ϥ$@"$0N0.p"$p"$N.#1$#$0N0.@#b$@#$N.P#$P#$0N0.#Ħ$#$N. $$ $$N.0$&$0$$ N .P$W$P$$PNP.$$$$ N .$$$$ N .$4$$eU$@N@. %$ %$ N .@%ک$@%$0N0.p% $p%$N.%<$%$0N0.%m$%$N.p&$p&$N.P'Ϫ$P'$N.'$'1$N.'$'$ N .(ӫ$($0N0.@($@($0N0.p(5$p($N.)f$)$0N0.0)$0)$0N0.`)Ȭ$`)$0N0.)$)*$N.P,z$P,$ N .p,$p,$@N@.,ܭ$,$ N ., $,$PNP. ->$ -$`N`.-o$-$0N0.-$-$0N0.-Ѯ$-$N.`/$`/$0N0./3$/$ N ./d$/$0N0./$/$N.0Ư$0$0N0.0$0$N.`1($`1$`N`.1Y$1$`N`. 3$ 3$0N0.P3$P3$ N .p3$p3$0N0.3j$3$0N0.3$3̱$@N@.4$4L$`N`.p4E$p4$N. 5v$ 5$N.6$6$ N .06س$06$0N0.`7 $`7$N.p7:$p7$ N .7k$7$N.P8$P8$0N0.8ʹ$8$ N .8$8$N.8/$8$`N`.9`$9$N. 9$ 9$N.09$09$N.:P$:$N.:$:$N.p;$p;$`N`.;$;$N.;$;$`N`.@<E$@<$0N0.p<v$p<$0N0.<$<ط$0N0.<3$<$N.=d$=$0N0.=$=$0N0. >Ƹ$ >$ N .@>$@>$ N .`>($`>$N.P?Y$P?7κ"r$@N@.C$CJ$0N0.D$D6$N.U$U$0N0.f$f$PNP.u$u$N.v6$v$0N0.vs$v$0N0.v$v$pNp.Pw$Pw$N.0xZ$0x$N.y$y$N.zV$z$N.|$|$`N`.|R$|$`N`.@}$@}$`N`.}$}$`N`.~W$~$N.~$~$N.$$N.\$$N.$$ N . $H$@N@. $ +$N.$$pNp. $ ?$`N`.$$ N .$$ N .$$ N .$$N.pL$pL$@N@.$)$ N .$$N.p$p i$N.P$P$ N . a$ $N. `$ $@N@.`$`H$ +N +.p$p$ N .$$N.z$s1$JNJ.$ [p$0N0.`B$`BT$0N0.s$s$N.v3$v$N.xw$x$N.p$p$0N0.$$ N .d$$ N .$$ N .:$$N.g$$@N@.$g$N.Д$Д$ N .$$N.M$$PNP.$$N.p$p@$@N@.P$$pNp. "$ P$N.$$PNP.$@$N. $ $N.0$0$N.@$@$N.P$P$ N .p$p$ N .-$$N.p$p$N.$z$N.$$0N0.0?$0$N./$$PNP.0$0$N.@$@$N.X$$N.$'$N.s$$`N`.$$N.r$$N.$$N.^$$N.$$N.!$$pNp.0$0$N.$$N.P>$P$N.n$$`N`.@$@$ N .`1$`$N.@a$@$N. $ $N.$$N.{$$N.$$N.Pf$P$N.0$0$`N`.$$ N .F$$`N`.$$`N`.p:$pj$N.$$ N .0_$0$N. h$ $N.$$0N0.$$N.d$$PNP.@$@<$N.P$P$0N0.e$$0N0.$$0N0.$G$`N`.@$@$N.@$@K$N.P$P$ N .po$p.$N.$$N.$$N.H$$PNP.|$$ N . $ $`N`.A$$ N .K$X$pNp.$$N. $ $N.$$@N@.$$@N@.P$P$ N .p*$p$N. }$ $PNP.p$p$N. $ $pNp. h$ $N. +$ +$PNP. +b$ +$N. +$ +$0N0. 0$ $`N`. $ $ N . )$ f$N.` $` $pNp. $ D$N.$$`N`.$$N.y$$pNp.$$N.3$$N.$$N.@$@$N. ,$ $0N0."]$"$pNp.`$$`$$`N`.%$%$PNP.($($N.)g$)$`N`.p)$p)$`N`.)$)$N.)$)$N.)T$)$pNp.`+$`+$@N@.,L$,$@N@.-$-$N.-$-$PNP.@. $@.w$N. /$ /$ N .@3 $@3$pNp.4L $4  Q + + a   $1N1.@f $@f$N.h $h)  $N.{ ${:$ N .[$[$pNp.^$^$ N .0a$0a$N.dS$d$N.f$f$N.Pj$Pj$ N .pm$pm$ N .n9$n$N. qk$ q$N.0q$0q$N.@t$@t$`N`.t`$t$N.@u$@u$@N@.u$u$0N0&& & &3&G&Ĭ[&جo&&&&&&,&D&X&l#&|7&K&_&s&ح&&&&$&&D&l&'&Ȱ;&ذO&c&w&&,&H&`&x&&&ı&+&?&$S&<g&T{&h&|&&&ز&& &"&,7&<L&da&v&&̳&&4&d&t& &&3&дH&]&r&&H&\&h&x&&& <& Hu& P& & & ~& & & N& & 8& PI& h& & G& & &<&Px&X&`&h(&pT&&&8&w& d d d f.0|!$0!$N.@("$@$N.P"$P$N.`"$`$N."$$ N .#$$ N . B#$ ##$N.3$$I$$PNP.@$$@$N.$$$ N .$$$N. T%$ $N.0%$0$ N %&d%d;&dY&f.-'$$N.^'$'$@N@.P'($P((<)$@ N@ .)$)J*$N.@*$@$PNP.*$$ N .+$$`N`.X+$$N.+$$N.+$$N.&,$$ N .m,$$ N .@,$@$N. -$$N._-$$N.P-$P$pNp.-$$N.p+.$p].$ N ..$$pNp..$$N.,/$$N./$$Nd/de0dz0f.031$0$0N0.`d1$`$N.pn1$p$`N`.1$$N.` 1$` $ N . 2$ $0N0. ]2$ $ N . 2$ $ N .u43$u$Nm3&|d3d3d4f. 4$ $ N .5$$N. 55$ g5$pNp.5$$N.6$$N. `6$ $ N .@6$@$ N .`7$`7$N.@7$@$N.P8$P$N.`D8$`$N.p{8$p$N.8$$N. +9$$N.s9$$N.@9$@$`N`.9$$0N0.-:$$N.Pk:$P$N.`:$`$N.`:$`$ N .;$$0N0.Y;$$N.;$$`N`.;$$N.<$$N.o<$$`N`.0<$0$N.@=$@$`N`.@X=$@$N.=$=$`N`.0>$$N.#j>$#$`N`.@$>$@$$0N0.p*>$p*$ N .*?$*$`N`.*N?$*$N.+?$+$N.+?$+$N. +?$ +$0N0.P+8@$P+$PNP.+q@$+$0N0.+@$+$ N .+ A$+$N.p1PA$p1$ N .1A$1$N.`4A$`4$N.P5+B$P5$ N .p6kB$p6$@N@.7B$7B$`N`.:$C$:$`N`.pB_C$pBC$N.BC$B$N.B$D$B$N. GD$ G$N.HE$HCE$N.JE$JE$N.`KJF$`K$N.pKF$pK$N.pKF$pK$N.LgG$L$N.LG$L$N.L'H$L$N.LH$L$N. MH$ M$N.MHI$M$N.@NI$@N$N.@N +J$@N$N.@NkJ$@N$N.@NJ$@N$N.N1K$N$N.NK$N$N.NK$N$N.NXL$N$N.`OL$`O$ N .QM$Q$N.R|M$R$@N@.PSM$PS$0N0.TDN$T$N.TN$T$0N0.UO$U$N.VWO$V$N.VO$V$`N`.XO$X$N.X2P$X$ N .X{P$X$ N .YP$Y$N.Y%Q$YcQ$ N .ZQ$ZR$PNP.uTR$u$`N`. vR$ v$N. vR$ v$N.vR$v#S$PNP.vqS$v$pNp.`wS$`w$0N0.wS$w$pNp.x%T$x$pNp.pxiT$px$pNp.xT$x$ N .yT$y$N!U&waU&LU&ȩdpp,p>@ZPn@7j0  #p)E v0p0qp=l q@t& @u^   t + +1] +p1 +`4 +0* Q R PSU T T L L L?L M@Na@NM#NN@NH@NNNqR@``B+zP+ +'+d+@$**=p*s`KpK%pKypBB;x}:7p!PW@`pxxJwP5p6u7 vp vZY.Hlvv`w^@+@n0@!pdu 3  t   `  1!p!@!!$"d""0" 5###L$$ +%l%%&&@&&YA''p) ()l()( G.)P))J[**`*P4+t++ ,Ps,@,`G--@.(..` +// / w00 +m1 +1r2B23,3;3 J3`T3`b3~3p3333`[33@44@"4 540J4T4` `4s44444445/5?5N5]5f5o555555556 666(60686@6H6P6X6a6g6q6y666666667)7=7Q7h7~77777788$8/8<8D8P8X8a8h8p8. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +^ +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +^ +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n + __ZN103_$LT$object..read..archive..ArchiveMemberIterator$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hfa1a102f805e214dE__ZN14rustc_demangle12try_demangle17h6ebfe631036faf75E__ZN14rustc_demangle8Demangle6as_str17h1e82f3c4c269f359E__ZN14rustc_demangle8demangle17hc97ece7dadee9ed4E__ZN242_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Debug$GT$3fmt17hc540d384a135e2d4E__ZN243_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$std..error..Error$GT$11description17ha938a107b7cdb3ceE__ZN244_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Display$GT$3fmt17h08228dc511cb316dE__ZN3std10sys_common11thread_info3set17hcb72bf5da4fd3594E__ZN3std10sys_common13thread_parker7generic6Parker6unpark17h6aa121c7b8f4a08bE__ZN3std10sys_common5mutex12MovableMutex3new17h9870e9b6ed9c2299E__ZN3std2fs11OpenOptions5_open17h0592fb6dacd3d10fE__ZN3std2io5stdio6_print17h2b92ca946b4108adE__ZN3std2rt19lang_start_internal17h1faf79574185df6dE__ZN3std3env11current_dir17h8e476354e14c7a88E__ZN3std3env7_var_os17he4f4ee986eda60b5E__ZN3std3ffi5c_str104_$LT$impl$u20$core..convert..From$LT$std..ffi..c_str..NulError$GT$$u20$for$u20$std..io..error..Error$GT$4from17h0d8da0bc9d655ef9E__ZN3std3ffi5c_str7CString18from_vec_unchecked17hb4a87cd072bc5230E__ZN3std3sys4unix17thread_local_dtor13register_dtor17h6762234705c4baabE__ZN3std3sys4unix2fs7readdir17h2836587a92cf11e2E__ZN3std4path10Components7as_path17h1c6e41db64548857E__ZN3std4path7PathBuf5_push17hceb662aff65bc21eE__ZN3std4sync4once4Once10call_inner17h755b6d60054eea69E__ZN3std6thread4park17h4e0a5ea8b8cc0704E__ZN3std6thread6Thread3new17h6b4affc24038a1baE__ZN3std7process5abort17h3aac11b7f057a319E__ZN3std9panicking11panic_count17is_zero_slow_path17h991e3a61e1166c13E__ZN3std9panicking11panic_count18GLOBAL_PANIC_COUNT17h6a4e4ef05ac2b79cE__ZN3std9panicking15begin_panic_fmt17hc364d6defd6a88b8E__ZN3std9panicking20rust_panic_with_hook17h28bf9d6c3916221eE__ZN3std9panicking3try7cleanup17h5bff449612ac2cffE__ZN40_$LT$str$u20$as$u20$core..fmt..Debug$GT$3fmt17hfe0f1d4d0486e9abE__ZN41_$LT$char$u20$as$u20$core..fmt..Debug$GT$3fmt17h979aff76c6c6ae27E__ZN42_$LT$str$u20$as$u20$core..fmt..Display$GT$3fmt17h668ecf8eca00c6e1E__ZN43_$LT$char$u20$as$u20$core..fmt..Display$GT$3fmt17h607d337768a224c1E__ZN4core3fmt10ArgumentV110from_usize17h896ab284c39982e1E__ZN4core3fmt3num3imp51_$LT$impl$u20$core..fmt..Display$u20$for$u20$u8$GT$3fmt17h5cefcfc8713f25deE__ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17hcb4e7a571aabe5a0E__ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u32$GT$3fmt17hc2785043f8722bb3E__ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u64$GT$3fmt17h5c753548d23e6a7cE__ZN4core3fmt3num3imp54_$LT$impl$u20$core..fmt..Display$u20$for$u20$usize$GT$3fmt17hc174936c4bde64a2E__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i8$GT$3fmt17hb5fe08a71976400bE__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u8$GT$3fmt17h3ee57fc64e0f18afE__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i8$GT$3fmt17h244501593265148dE__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u8$GT$3fmt17h31d42928f6d9c292E__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i32$GT$3fmt17h0d97eb230357535eE__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i64$GT$3fmt17h96d1e85e1da4d4fdE__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u64$GT$3fmt17h52a5ee1562310d4aE__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i32$GT$3fmt17h40e418e2dace0edaE__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i64$GT$3fmt17hef559a8f86f55756E__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u64$GT$3fmt17hb77ab9b19805c088E__ZN4core3fmt3num55_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$isize$GT$3fmt17h72759f11bf7399d0E__ZN4core3fmt3num55_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$usize$GT$3fmt17h44ee8ed27e1411e4E__ZN4core3fmt3num55_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$isize$GT$3fmt17hc9df9ed9e9211cb7E__ZN4core3fmt3num55_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$usize$GT$3fmt17hacc8407a90f9b518E__ZN4core3fmt5write17h8f13d857463c51c1E__ZN4core3fmt8builders10DebugTuple5field17h8e2fa41ae2b86a83E__ZN4core3fmt8builders10DebugTuple6finish17hdc300016aa138d9fE__ZN4core3fmt8builders11DebugStruct5field17h1ea22deec867e5d9E__ZN4core3fmt8builders11DebugStruct6finish17hbe41f7254329a605E__ZN4core3fmt8builders8DebugSet5entry17h397b6bd50a20f754E__ZN4core3fmt8builders9DebugList5entry17hcfc18fed7eeb0e0dE__ZN4core3fmt8builders9DebugList6finish17he68c9b83833e8fd7E__ZN4core3fmt9Formatter10debug_list17hf0830059e9ccf358E__ZN4core3fmt9Formatter11debug_tuple17h607a2644ff900405E__ZN4core3fmt9Formatter12debug_struct17hd3a9d6b0629237bfE__ZN4core3fmt9Formatter12pad_integral17h0adac3bf3805f3a0E__ZN4core3fmt9Formatter15debug_lower_hex17h153e6fc2538b988fE__ZN4core3fmt9Formatter15debug_upper_hex17h57414fd49f7e7913E__ZN4core3fmt9Formatter3pad17h8b93142d29ee2144E__ZN4core3fmt9Formatter9alternate17h1eee0ad1d4327e92E__ZN4core3fmt9Formatter9write_fmt17h1ebe0ce9ba0da141E__ZN4core3fmt9Formatter9write_str17h3c2681ff9bffe572E__ZN4core3num21_$LT$impl$u20$u32$GT$14from_str_radix17h97a87b8b713c8cb4E__ZN4core3num60_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u64$GT$8from_str17h937e5f273a6822c8E__ZN4core3num62_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$usize$GT$8from_str17h979c769f01e688b0E__ZN4core3str16slice_error_fail17hde89b335320e0c53E__ZN4core3str5lossy9Utf8Lossy10from_bytes17h34971ea3fbc55763E__ZN4core3str5lossy9Utf8Lossy6chunks17hbf5936e3438c750bE__ZN4core3str6traits23str_index_overflow_fail17ha8d1e1fb4176068fE__ZN4core3str7pattern11StrSearcher3new17hba6905c9a273575bE__ZN4core3str8converts9from_utf817h10159aefe2b07dfcE__ZN4core5panic8Location6caller17hd326b0185ea5a49bE__ZN4core5panic9PanicInfo7message17h2c81884012b2bb51E__ZN4core5panic9PanicInfo7payload17h74c84ca131d269d9E__ZN4core5panic9PanicInfo8location17h4193e7d76b52197fE__ZN4core5slice5index22slice_index_order_fail17h3caf0605b69fd185E__ZN4core5slice5index24slice_end_index_len_fail17hfb5fa93bcd2e1e91E__ZN4core5slice5index26slice_start_index_len_fail17ha61876d93be6751aE__ZN4core5slice6memchr19memchr_general_case17h93144f1947fe4f7cE__ZN4core5slice6memchr7memrchr17h9cc48724c17337a5E__ZN4core6option13expect_failed17hc2d54dd321f2ef33E__ZN4core6option18expect_none_failed17h5e793a721927d8b0E__ZN4core6result13unwrap_failed17h0d8a6fea161e6a5eE__ZN4core7unicode12unicode_data15grapheme_extend6lookup17h946cf3fa94cbe4abE__ZN4core7unicode12unicode_data2cc6lookup17heff602f3ee6e409eE__ZN4core7unicode9printable12is_printable17hc19114cd11eedfacE__ZN4core9panicking18panic_bounds_check17hf2e6ff9d7438b148E__ZN4core9panicking5panic17h2ca2e9d2b0a1f2bfE__ZN4core9panicking9panic_fmt17h65997884a2662b8cE__ZN55_$LT$std..path..Display$u20$as$u20$core..fmt..Debug$GT$3fmt17h4eab566fdcb293c6E__ZN57_$LT$core..fmt..Arguments$u20$as$u20$core..fmt..Debug$GT$3fmt17h4fea634600e4154bE__ZN57_$LT$core..fmt..Formatter$u20$as$u20$core..fmt..Write$GT$10write_char17hc8f23e7de483ed25E__ZN57_$LT$std..io..error..Repr$u20$as$u20$core..fmt..Debug$GT$3fmt17h980a0dd528b6f8b8E__ZN58_$LT$std..io..error..Error$u20$as$u20$core..fmt..Debug$GT$3fmt17hb15268f7a75e41e2E__ZN59_$LT$core..fmt..Arguments$u20$as$u20$core..fmt..Display$GT$3fmt17hdda8ea41e3d1d8e4E__ZN5alloc11collections5btree4node10splitpoint17h0f5d6edf3db63eb3E__ZN5alloc5alloc18handle_alloc_error17h17828f1cec6e7e68E__ZN5alloc6string104_$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$4from17h04e9917c1cb5a5a5E__ZN5alloc6string13FromUtf8Error10into_bytes17hde44d7e3879cc819E__ZN5alloc6string6String15from_utf8_lossy17hf1eb1c1633e093d9E__ZN5alloc7raw_vec17capacity_overflow17h84f2ee8706ad9006E__ZN5gimli4read4line7LineRow18apply_line_advance17h313d35e85ba294f7E__ZN5gimli4read4unit20allow_section_offset17h840de4f0c714ee4aE__ZN5gimli4read6abbrev10Attributes3new17h8156b44ed52c0e75E__ZN5gimli4read6abbrev10Attributes4push17h37eaa776d64da3b5E__ZN5gimli4read6abbrev12Abbreviation3new17hf249fe84b4852507E__ZN5gimli4read6abbrev13Abbreviations5empty17h1148f33bafc7f601E__ZN5gimli4read6abbrev13Abbreviations6insert17h6e76207660e7b51eE__ZN5gimli6common9SectionId4name17hcc0c64229b4143d2E__ZN60_$LT$core..cell..BorrowError$u20$as$u20$core..fmt..Debug$GT$3fmt17h06ead577b1ca873fE__ZN60_$LT$core..panic..Location$u20$as$u20$core..fmt..Display$GT$3fmt17ha2751887b615c60aE__ZN60_$LT$std..io..error..Error$u20$as$u20$core..fmt..Display$GT$3fmt17hcf4989df195aa7f5E__ZN60_$LT$std..io..stdio..StdoutRaw$u20$as$u20$std..io..Write$GT$9write_all17h438015c553a11ff1E__ZN61_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$9write_fmt17h2a040ce7f300a9bcE__ZN61_$LT$rustc_demangle..Demangle$u20$as$u20$core..fmt..Debug$GT$3fmt17hd65b8b7251b75e54E__ZN61_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$9write_all17h02d3d39763e125dfE__ZN62_$LT$std..ffi..c_str..NulError$u20$as$u20$core..fmt..Debug$GT$3fmt17h618b66ceb7f31360E__ZN62_$LT$std..io..error..ErrorKind$u20$as$u20$core..fmt..Debug$GT$3fmt17h0fe973120dff45ecE__ZN63_$LT$core..cell..BorrowMutError$u20$as$u20$core..fmt..Debug$GT$3fmt17h9ff749290d38bd62E__ZN63_$LT$rustc_demangle..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17hf5d5adacbab34e24E__ZN64_$LT$core..str..error..Utf8Error$u20$as$u20$core..fmt..Debug$GT$3fmt17hac3b2d48837c0e10E__ZN64_$LT$rustc_demangle..v0..Ident$u20$as$u20$core..fmt..Display$GT$3fmt17h9717f14fbc1909adE__ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$14write_vectored17h6b2dd7f421c4a919E__ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$5flush17h135d85c4975875b5E__ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$5write17h79844533ff1e4615E__ZN66_$LT$core..str..lossy..Utf8Lossy$u20$as$u20$core..fmt..Display$GT$3fmt17h74fc33f0f85fc8edE__ZN67_$LT$std..path..PrefixComponent$u20$as$u20$core..cmp..PartialEq$GT$2eq17hc27c7959dd01443fE__ZN68_$LT$core..fmt..builders..PadAdapter$u20$as$u20$core..fmt..Write$GT$9write_str17hfafb527e906b76b9E__ZN68_$LT$core..num..error..ParseIntError$u20$as$u20$core..fmt..Debug$GT$3fmt17hbadc9ebecd4f774fE__ZN68_$LT$std..thread..local..AccessError$u20$as$u20$core..fmt..Debug$GT$3fmt17h273f87e5dd3cef1aE__ZN6object4read4util11StringTable3get17h254cff78bdbcec0cE__ZN6object4read4util11StringTable3new17h0b2660190ea7f7a2E__ZN6object4read7archive11ArchiveFile5parse17h833d0f11ffe26734E__ZN6object4read9ObjectMap3get17h4c1ecc3ea60da5a4E__ZN70_$LT$std..sync..once..WaiterQueue$u20$as$u20$core..ops..drop..Drop$GT$4drop17h7155e5839eee4f3fE__ZN71_$LT$rustc_demangle..legacy..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17hc0f205cd35f0b469E__ZN73_$LT$std..sys_common..os_str_bytes..Slice$u20$as$u20$core..fmt..Debug$GT$3fmt17hec992e4fc8fea675E__ZN75_$LT$gimli..read..abbrev..Attributes$u20$as$u20$core..ops..deref..Deref$GT$5deref17h8cc1c55cb8addf1eE__ZN79_$LT$$RF$$u5b$u8$u5d$$u20$as$u20$std..ffi..c_str..CString..new..SpecIntoVec$GT$8into_vec17hc1afdddfe7a5a43cE__ZN79_$LT$std..backtrace_rs..symbolize..SymbolName$u20$as$u20$core..fmt..Display$GT$3fmt17h5481f908bcfcf1f9E__ZN80_$LT$std..path..Components$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h13857d5e18b1c9dfE__ZN82_$LT$core..char..EscapeDebug$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h571933ba2a1d97ecE__ZN86_$LT$std..sys..unix..fs..ReadDir$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h8bf8320bf6d5e305E__ZN90_$LT$std..panicking..begin_panic_handler..PanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$3get17h1abd87a207585fa8E__ZN90_$LT$std..panicking..begin_panic_handler..PanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h34d30bb94d93fdecE__ZN91_$LT$std..sys_common..backtrace.._print..DisplayBacktrace$u20$as$u20$core..fmt..Display$GT$3fmt17h34f76b2ca42fab41E__ZN93_$LT$std..panicking..begin_panic_handler..StrPanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$3get17h91405c3d141915a1E__ZN93_$LT$std..panicking..begin_panic_handler..StrPanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h7d5123a61bf0b11dE__ZN95_$LT$std..path..Components$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hf50057d659163bf8E__ZN96_$LT$core..str..lossy..Utf8LossyChunksIter$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hde7c21e241e97426E__ZN9addr2line9path_push17hd2ef9754a0c8fa0dE___rdl_alloc___rdl_dealloc___rdl_realloc___rg_oom___rust_alloc___rust_alloc_error_handler___rust_dealloc___rust_drop_panic___rust_foreign_exception___rust_panic_cleanup___rust_probestack___rust_realloc___rust_start_panic__mh_execute_header_main_rust_begin_unwind_rust_eh_personality_rust_oom_rust_panic__Unwind_Backtrace__Unwind_DeleteException__Unwind_GetDataRelBase__Unwind_GetIP__Unwind_GetIPInfo__Unwind_GetLanguageSpecificData__Unwind_GetRegionStart__Unwind_GetTextRelBase__Unwind_RaiseException__Unwind_Resume__Unwind_SetGR__Unwind_SetIP___bzero___error__dyld_get_image_header__dyld_get_image_name__dyld_get_image_vmaddr_slide__dyld_image_count__tlv_atexit__tlv_bootstrap_abort_close$NOCANCEL_closedir_fcntl_free_fstat$INODE64_getcwd_getenv_malloc_memchr_memcmp_memcpy_memmove_mmap_mprotect_munmap_open_opendir$INODE64_posix_memalign_pthread_cond_destroy_pthread_cond_signal_pthread_cond_wait_pthread_get_stackaddr_np_pthread_get_stacksize_np_pthread_mutex_destroy_pthread_mutex_init_pthread_mutex_lock_pthread_mutex_trylock_pthread_mutex_unlock_pthread_mutexattr_destroy_pthread_mutexattr_init_pthread_mutexattr_settype_pthread_rwlock_rdlock_pthread_rwlock_unlock_pthread_self_readdir_r$INODE64_realloc_sigaction_sigaltstack_signal_strerror_r_strlen_sysconf_write_writevdyld_stub_binder__ZN4core4hint9black_box17hd415cec6feaea823E__ZN3std2rt10lang_start17h971a0f1b940e4475E__ZN3std2rt10lang_start28_$u7b$$u7b$closure$u7d$$u7d$17he08f8019b80a85fdE__ZN54_$LT$$LP$$RP$$u20$as$u20$std..process..Termination$GT$6report17h261526e6a24e5152E__ZN68_$LT$std..process..ExitCode$u20$as$u20$std..process..Termination$GT$6report17h15c8b44f71ff7d3aE__ZN3std3sys4unix7process14process_common8ExitCode6as_i3217h11e9ac7b7276b822E__ZN10helloworld4main17h5c9978db3bd0f0b7E__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h2e65497749654303E__ZN4core3ops8function6FnOnce9call_once17hcb3f0a48b0e6d8e2E__ZN4core3ops8function6FnOnce9call_once17hf46c02e0c5f61658E__ZN4core3ptr13drop_in_place17hb090ba8d44f37366E__ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17h90ae195fb8d15105E__ZN4core3fmt9Arguments6new_v117hca4385833b246e0dE__ZN112_$LT$alloc..collections..btree..map..IntoIter$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0837be85d189cf85E__ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h4ba8e4423e227ee6E__ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17hce44aff5db5c6fe2E__ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17hde5492541d43b4c2E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h0f873f4a75a4b362E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1ff024cc7038a60fE__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h6ba5393f153ed164E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha6af0df82ab4a9a4E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hd5d3a1b5507b2883E__ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h739903887440c2d8E__ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17hd586830027d3629fE__ZN45_$LT$$RF$T$u20$as$u20$core..fmt..UpperHex$GT$3fmt17ha0d2495ee7d67d36E__ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$i32$GT$3fmt17h8401b47a744eceb5E__ZN4core3fmt5Write10write_char17h11b6874280bc6513E__ZN4core3fmt5Write10write_char17h72f75a48c36b65c5E__ZN4core3fmt5Write10write_char17h810f5e4389b78c43E__ZN4core3fmt5Write9write_fmt17h586cb77d4756c514E__ZN4core3fmt5Write9write_fmt17h6ad3d486b33f753cE__ZN4core3fmt5Write9write_fmt17h8f44113baea9f38dE__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h66846710ad8940f7E__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h6f193c75096b31aeE__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h8c728240013e8d29E__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h8d3744bbc5dc384bE__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17hb7b532e34e3e385bE__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17he7d49b1f491d7a31E__ZN4core3ptr13drop_in_place17h0001c4b85bcdeb97E__ZN4core3ptr13drop_in_place17h022b4b85cc38393dE__ZN4core3ptr13drop_in_place17h0357dba5b496e458E__ZN4core3ptr13drop_in_place17h0719c4772f09bd84E__ZN4core3ptr13drop_in_place17h0a660b2a203acd95E__ZN4core3ptr13drop_in_place17h0e80dc081aa8b67cE__ZN4core3ptr13drop_in_place17h15fe5790d2a0520dE__ZN4core3ptr13drop_in_place17h172ef6d61ce7c1edE__ZN4core3ptr13drop_in_place17h17b0029a687da7f6E__ZN4core3ptr13drop_in_place17h19e186fde122f6aaE__ZN4core3ptr13drop_in_place17h1ce02833bfcf8361E__ZN4core3ptr13drop_in_place17h2091ae9ae48cca00E__ZN4core3ptr13drop_in_place17h2b2f605e3096fddeE__ZN4core3ptr13drop_in_place17h2d8b95acec961bbfE__ZN4core3ptr13drop_in_place17h315a1ca4d07e57edE__ZN4core3ptr13drop_in_place17h3288062f1fc04a38E__ZN4core3ptr13drop_in_place17h3934ec390af16604E__ZN4core3ptr13drop_in_place17h3a4fbc96eb58b1e3E__ZN4core3ptr13drop_in_place17h3b90589b753c584eE__ZN4core3ptr13drop_in_place17h3debf7f414b250f3E__ZN4core3ptr13drop_in_place17h3dfc2aca8e1e1bb8E__ZN4core3ptr13drop_in_place17h41adba061e832346E__ZN4core3ptr13drop_in_place17h43027b75d60cbe9aE__ZN4core3ptr13drop_in_place17h47b5def27b724e21E__ZN4core3ptr13drop_in_place17h49901ec82d6a183eE__ZN4core3ptr13drop_in_place17h4b14187a25afd5b5E__ZN4core3ptr13drop_in_place17h4b6d5d0d7efb219aE__ZN4core3ptr13drop_in_place17h53616fc794574dc4E__ZN4core3ptr13drop_in_place17h538517a79da6b782E__ZN4core3ptr13drop_in_place17h5452c3ea121674fdE__ZN4core3ptr13drop_in_place17h5a5d87bcfd7664dfE__ZN4core3ptr13drop_in_place17h5f63aceff2a5b8f7E__ZN4core3ptr13drop_in_place17h64f1c92dee4d77f1E__ZN4core3ptr13drop_in_place17h6b20b8c1c593af28E__ZN4core3ptr13drop_in_place17h6fbdc20366dc7538E__ZN4core3ptr13drop_in_place17h729d9af1daf04918E__ZN4core3ptr13drop_in_place17h72b419bee64718efE__ZN4core3ptr13drop_in_place17h74d8861fb04ffc60E__ZN4core3ptr13drop_in_place17h75190625eaa75b34E__ZN4core3ptr13drop_in_place17h7baf4907fdbae59dE__ZN4core3ptr13drop_in_place17h81fbef6758eb2301E__ZN4core3ptr13drop_in_place17h83511727acfa8c0cE__ZN4core3ptr13drop_in_place17h8838f5c16c4fc122E__ZN4core3ptr13drop_in_place17h92f92d2cb94e2fb3E__ZN4core3ptr13drop_in_place17h9f7d1f2d52a27452E__ZN4core3ptr13drop_in_place17ha6226e4d7b35b031E__ZN4core3ptr13drop_in_place17ha86484731f53123bE__ZN4core3ptr13drop_in_place17ha9375dbd5f83cc63E__ZN4core3ptr13drop_in_place17ha94e2f1d102db85bE__ZN4core3ptr13drop_in_place17haa43e31a76904e2fE__ZN4core3ptr13drop_in_place17haa477af226bcfd13E__ZN4core3ptr13drop_in_place17had982f45f560f7d6E__ZN4core3ptr13drop_in_place17hadc2f558f2ff94dcE__ZN4core3ptr13drop_in_place17hb167217a5f901d1bE__ZN4core3ptr13drop_in_place17hb8cea66b0f53a3dcE__ZN4core3ptr13drop_in_place17hb9dc620aa9c27cf5E__ZN4core3ptr13drop_in_place17hbb7a4d1d9697aadaE__ZN4core3ptr13drop_in_place17hbd3007beddeda153E__ZN4core3ptr13drop_in_place17hc20dc3b9981f6cd9E__ZN4core3ptr13drop_in_place17hc6d789595865b5a6E__ZN4core3ptr13drop_in_place17hcabc80810034beb8E__ZN4core3ptr13drop_in_place17hd256dfc6fb0d76f7E__ZN4core3ptr13drop_in_place17hd4234fd2fc8d37d5E__ZN4core3ptr13drop_in_place17hd83fdd4029f00d92E__ZN4core3ptr13drop_in_place17hdd7b4a2dd430f461E__ZN4core3ptr13drop_in_place17hddf21e2d6beb145eE__ZN4core3ptr13drop_in_place17hdf3b711f31627af4E__ZN4core3ptr13drop_in_place17he13d79eea5109786E__ZN4core3ptr13drop_in_place17he4e7107691da6ef6E__ZN4core3ptr13drop_in_place17he569096b505583e3E__ZN4core3ptr13drop_in_place17he89316862fed7a0dE__ZN4core3ptr13drop_in_place17he8d043e14c4c39edE__ZN4core3ptr13drop_in_place17he985ef45a8da31f9E__ZN4core3ptr13drop_in_place17head2c15ebf9b5946E__ZN4core3ptr13drop_in_place17heb31b445a086f772E__ZN4core3ptr13drop_in_place17hf9cbea050bad923cE__ZN4core3ptr13drop_in_place17hfa66d01e9782ef16E__ZN4core3ptr13drop_in_place17hfa987b11389de4deE__ZN4core3ptr13drop_in_place17hfad525e23ac74451E__ZN4core3str21_$LT$impl$u20$str$GT$8contains17hdb9ab4ce824b5fd1E__ZN4core5slice4sort10shift_tail17h3844cb057a7b7177E__ZN4core5slice4sort7recurse17h1c62411bedafa373E__ZN4core5slice4sort7recurse17h37750ba1f8b09041E__ZN4core5slice4sort7recurse17hca6e6d182d228cc8E__ZN4core5slice4sort8heapsort28_$u7b$$u7b$closure$u7d$$u7d$17h769811aafeab5cd3E__ZN4core6option15Option$LT$T$GT$6unwrap17h855354511a0abb4aE__ZN4core6option15Option$LT$T$GT$6unwrap17hed00f5e5d25b8623E__ZN50_$LT$$BP$mut$u20$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h5affc32e8c99512aE__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h205ea02eb8a59909E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hb6053ad3eac89dc0E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hc24b373be71ddaf6E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hc6f501e03806c0dfE__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h1980679f0a84912aE__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h30f9cbfff89d16f3E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17hcfcee4d34d10b145E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17hdaebfb5281dc67a6E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h5dc3b8f6c25e27daE__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h9ae865b8e762bcacE__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17hcd8f5014e117f254E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17he584666e74ec2875E__ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Debug$GT$3fmt17h8363c3aee22734aaE__ZN5alloc3vec16Vec$LT$T$C$A$GT$6insert17h44f6c05570b4e998E__ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17h228f1ac451fa948dE__ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17hdd2654ecc980e2d6E__ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17he5d2da03883f9d6eE__ZN5alloc5alloc8box_free17h34c0a024434cc0b0E__ZN5alloc5alloc8box_free17h3dd29e0d8c8ccbabE__ZN5alloc5alloc8box_free17h76725ec2302ed6a8E__ZN5alloc7raw_vec11finish_grow17h57e63f99c8017fbdE__ZN5gimli4read4line15FileEntryFormat5parse17h53e650041446ec23E__ZN5gimli4read4line15parse_attribute17h224a09bc97bd7121E__ZN5gimli4read4line27FileEntry$LT$R$C$Offset$GT$5parse17haa5dc28df9c7934cE__ZN5gimli4read4unit15parse_attribute17haee1e3272748be7fE__ZN5gimli4read4unit18Attribute$LT$R$GT$5value17hc4d4cd690f6e3dc0E__ZN5gimli4read5dwarf14Dwarf$LT$R$GT$11attr_string17hdc5311a2420bf7f0E__ZN5gimli4read6reader6Reader12read_address17h01817967dad0149aE__ZN5gimli4read8rnglists20RngListIter$LT$R$GT$4next17h4f850b3c8d0b22b9E__ZN60_$LT$alloc..string..String$u20$as$u20$core..fmt..Display$GT$3fmt17ha1b559724cbd3a48E__ZN90_$LT$gimli..read..unit..AttributeValue$LT$R$C$Offset$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h64f4370d8fd7dadeE__ZN9addr2line16Context$LT$R$GT$10from_dwarf17h6107e5db12be34e1E__ZN9addr2line16Context$LT$R$GT$11find_frames17ha16c20a53a379882E__ZN9addr2line16ResUnit$LT$R$GT$11parse_lines17h7511c92fb61dff17E__ZN9addr2line16ResUnit$LT$R$GT$11render_file17hac98565df4da3786E__ZN9addr2line16ResUnit$LT$R$GT$13find_location17hb908671986c80953E__ZN9addr2line17Function$LT$R$GT$14parse_children17h86c79dd7fe8fcd42E__ZN9addr2line18FrameIter$LT$R$GT$4next17h1727261d8ad9f505E__ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17h8a4fad506e977361E__ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17h97294a5eaf80b5c7E__ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17hd4a764ad593de48bE__ZN9addr2line9name_attr17h55a0d3d1d4e76283E__ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17h3e1b2fd4e9ebbad5E__ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17h4ba7edc22d114ddfE__ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17hc9940217f12a295fE__ZN3std6thread5local4fast13destroy_value17h5efe6299bb114e7bE__ZN3std6thread5local4fast13destroy_value17hf426f934b45b9978E__ZN3std5error5Error7type_id17h65f37167cac664edE__ZN3std5error5Error9backtrace17he6c2c90efd2b9f08E__ZN3std5error5Error5cause17hb8d47cee058557daE__ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$9flush_buf17h49185b1ec1125c63E__ZN83_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$9write_all17h41ecf00f4bac090eE__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$5write17h9ce054a705021df9E__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$14write_vectored17hb35371796effb715E__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$17is_write_vectored17h46cded44848cdd6cE__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$9write_all17hfd7f3e3133bef30aE__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$5flush17h2787670ebb2f0920E__ZN3std2io5Write9write_all17h8eb2d4edcce31a61E__ZN3std2io5Write9write_all17hda8e0b8325612c9bE__ZN3std2io5Write18write_all_vectored17h55e81aa5ab6f7d47E__ZN3std2io5Write18write_all_vectored17hab65cd626c6237adE__ZN3std2io5Write9write_fmt17h013bead77842bdd6E__ZN3std2io5Write9write_fmt17h0a6214ccb1a8468bE__ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17hb46fb1811d1decf3E__ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17hc9c8d30f2ac05ba9E__ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17hf7bc37465b62b303E__ZN3std4path10iter_after17h47209421eb5c497aE__ZN3std4path10Components25parse_next_component_back17h716446795a9bd98bE__ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17h00f47741743939d6E__ZN3std4sync4once4Once15call_once_force28_$u7b$$u7b$closure$u7d$$u7d$17h6e9c7f44b7742eefE__ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$17h04b4d408d477fdcbE__ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h2b785c9b2b2d586fE__ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$17h8c28a55991973bc2E__ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h6292d384dc74f041E__ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h9a7e5cc6475b496bE__ZN3std10sys_common9backtrace15output_filename17h7ac82c1417d735a9E__ZN82_$LT$std..sys_common..poison..PoisonError$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h3f275db072f730c2E__ZN3std10sys_common11thread_info10ThreadInfo4with28_$u7b$$u7b$closure$u7d$$u7d$17h8dbc12f4d65485d5E__ZN3std10sys_common4util10dumb_print17h974a0886978cd6e8E__ZN3std10sys_common4util5abort17h2afc70d70e6e0608E__ZN3std10sys_common4util15report_overflow17h18a41ea3351fa15dE__ZN3std5alloc24default_alloc_error_hook17h72996271f640cdfcE__ZN3std9panicking12default_hook17h460969f1dc8f738dE__ZN3std9panicking12default_hook28_$u7b$$u7b$closure$u7d$$u7d$17hb14d90e928578cc7E__ZN3std9panicking19begin_panic_handler28_$u7b$$u7b$closure$u7d$$u7d$17h99569328be4adae9E__ZN3std9panicking11begin_panic28_$u7b$$u7b$closure$u7d$$u7d$17hd1153f4b5aa7cb4cE__ZN91_$LT$std..panicking..begin_panic..PanicPayload$LT$A$GT$$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h451fb217f095e369E__ZN91_$LT$std..panicking..begin_panic..PanicPayload$LT$A$GT$$u20$as$u20$core..panic..BoxMeUp$GT$3get17h8d9fbb4cb4185aedE__ZN3std12backtrace_rs9symbolize6Symbol4name17h0b4aba343862f932E__ZN3std12backtrace_rs5print17BacktraceFrameFmt21print_raw_with_column17h2da10e409b6783f2E__ZN3std3sys4unix2fs4File6open_c17hb41cfe2ecbbf477cE__ZN3std3sys4unix5mutex14ReentrantMutex4init17h21e67a6d82cb163aE__ZN3std3sys4unix2os12error_string17hfcf250b7074d01b7E__ZN3std3sys4unix14stack_overflow3imp14signal_handler17h9d4a7e7062fdb94aE__ZN3std3sys4unix14stack_overflow3imp12make_handler17h01917d6820f56325E__ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$17is_write_vectored17hd122ffdef32f049fE__ZN3std3sys4unix17thread_local_dtor13register_dtor9run_dtors17ha82f7e95b18f7cb8E__ZN3std3sys4unix17decode_error_kind17h00d6a0c6f65b7208E__ZN3std3sys4unix14abort_internal17h7c65afd76fd59ab4E__ZN3std12backtrace_rs9backtrace9libunwind5trace8trace_fn17h26837839f9872607E__ZN3std12backtrace_rs9symbolize5gimli7Context3new17heea20e6a9bf382c0E__ZN3std12backtrace_rs9symbolize5gimli4mmap17he56ebb42c8d19b47E__ZN3std12backtrace_rs9symbolize5gimli7resolve17h802d1df7295a768aE__ZN3std12backtrace_rs9symbolize5gimli5macho11find_header17h1fc46a35368989baE__ZN3std12backtrace_rs9symbolize5gimli5macho6Object5parse17h66b22413462821e4E__ZN3std12backtrace_rs9symbolize5gimli5macho6Object7section17h28a89dd39816544eE__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h1c4d4ebe961f86e2E__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h49adcc37e86e1881E__ZN4core3ptr13drop_in_place17h20c76b1664456991E__ZN4core3ptr13drop_in_place17hed2d1e1c774489c8E__ZN5alloc5alloc8box_free17h0ea2d49c9f0de4ffE__ZN5alloc5alloc8box_free17h53a88048d8152fe2E__ZN12panic_unwind5dwarf2eh20read_encoded_pointer17h25e918cc232c0e9aE__ZN12panic_unwind8real_imp5panic17exception_cleanup17hc94bf25d03998d60E__ZN12panic_unwind8real_imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h424faaead1de66f2E__ZN12panic_unwind8real_imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h8f164e91edd25c5aE__ZN6object4read7archive13ArchiveMember5parse17h776584df9e9596beE__ZN5alloc7raw_vec11finish_grow17h65c4d0722f46ac6aE__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1469ae14746b3a67E__ZN4core3ptr13drop_in_place17h1b738fc0bde64bb4E__ZN4core3ptr13drop_in_place17h5fdd230e15090e83E__ZN4core3ptr13drop_in_place17he62ee4d9a45c8206E__ZN5alloc7raw_vec11finish_grow17h98811d92461239b9E__ZN4core3ptr13drop_in_place17h156182fdd95e44cbE__ZN81_$LT$core..str..pattern..CharSearcher$u20$as$u20$core..str..pattern..Searcher$GT$10next_match17h3d7592d4120cad53E__ZN14rustc_demangle2v06Parser5ident17hca065d1bb8a0d636E__ZN14rustc_demangle2v06Parser9skip_path17hb9bbb42b7b263694E__ZN14rustc_demangle2v06Parser9skip_type17h6585a71e25583804E__ZN14rustc_demangle2v06Parser10skip_const17h3211fd1eac83bf07E__ZN14rustc_demangle2v07Printer25print_lifetime_from_index17h42ce2cc32d05ed17E__ZN14rustc_demangle2v07Printer10print_path17hc994748132c2c778E__ZN14rustc_demangle2v07Printer17print_generic_arg17h759deaefd5fdcd4dE__ZN14rustc_demangle2v07Printer10print_type17hb047e4aef4c2abb8E__ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$17hff1b84bde9f76320E__ZN14rustc_demangle2v07Printer30print_path_maybe_open_generics17h8b18f5a41e62e59eE__ZN14rustc_demangle2v07Printer15print_dyn_trait17h7fab0c4788b0b385E__ZN14rustc_demangle2v07Printer11print_const17h7d70ae8b703933dcE__ZN14rustc_demangle2v07Printer16print_const_uint17he0a619656a6d34b2E__ZN4core3ptr13drop_in_place17h14b1ba618aef86d2E__ZN5alloc7raw_vec11finish_grow17h5e11d989603838c3E__ZN4core3ops8function6FnOnce9call_once17he7576bda09634ee5E__ZN4core3ptr13drop_in_place17h00561e225b4bd4b3E__ZN4core3num14from_str_radix17h3c83031b7bbe500eE__ZN71_$LT$core..ops..range..Range$LT$Idx$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h559d514fbccfacdbE__ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h39271c2f8aa4b192E__ZN4core3fmt8builders10DebugInner5entry17hd993114f8979977aE__ZN4core3fmt5Write10write_char17hba5e917c308825ceE__ZN4core3fmt5Write9write_fmt17h119471deaf757c21E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h6080accf67cccf48E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h0da350b9cfe85ac2E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h7974e3105f512f1fE__ZN4core3fmt9Formatter12pad_integral12write_prefix17h41520003ef9610e2E__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..Debug$u20$for$u20$usize$GT$3fmt17h6dbda585eb44f152E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1139ce2b25fa7bb6E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h600af86e5735b7c4E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha856b618c9396d1cE__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hca8d91163a740509E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf2180e5ca5a27bc7E__ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h7116a69589465fb9E__ZN4core5slice4sort14break_patterns17h5298d42b84c7db75E__ZN4core5slice4sort14break_patterns17h845fce80afe79bd5E__ZN4core5slice4sort22partial_insertion_sort17h5e2bc01cd419fe15E__ZN4core5slice4sort22partial_insertion_sort17h7a57ff0f0112085bE__ZN4core5slice4sort22partial_insertion_sort17hf2b5851c05229d98E__ZN4core5slice4sort8heapsort17h018b933c391ce837E__ZN4core5slice4sort8heapsort17h3b6e8f18d2ed0604E__ZN4core5slice4sort8heapsort17hb7973b4e2c2a6e54E__ZN3std9panicking11begin_panic17h8b5bc66bed0a4003E_str.5_str.6__ZN4core3str11validations15UTF8_CHAR_WIDTH17h2a4853d2c1524450E__ZN4core7unicode12unicode_data15grapheme_extend17SHORT_OFFSET_RUNS17hd221a2f882a0e29aE__ZN4core7unicode12unicode_data15grapheme_extend7OFFSETS17h1274fcd0b20229fdEGCC_except_table1GCC_except_table0GCC_except_table92GCC_except_table96GCC_except_table113GCC_except_table128GCC_except_table131GCC_except_table138GCC_except_table152GCC_except_table153GCC_except_table159GCC_except_table163GCC_except_table172GCC_except_table186GCC_except_table200GCC_except_table202GCC_except_table213GCC_except_table220GCC_except_table232GCC_except_table233GCC_except_table234GCC_except_table276GCC_except_table286GCC_except_table302GCC_except_table303GCC_except_table304GCC_except_table305GCC_except_table329GCC_except_table333GCC_except_table353GCC_except_table362GCC_except_table420GCC_except_table423GCC_except_table518GCC_except_table550GCC_except_table572GCC_except_table573GCC_except_table588GCC_except_table630GCC_except_table634GCC_except_table659GCC_except_table673GCC_except_table674GCC_except_table675GCC_except_table676GCC_except_table677GCC_except_table682GCC_except_table1017GCC_except_table1020GCC_except_table1021GCC_except_table1023GCC_except_table1054GCC_except_table1056GCC_except_table1057GCC_except_table1060GCC_except_table1065GCC_except_table1085GCC_except_table1086GCC_except_table1090GCC_except_table1092GCC_except_table1112GCC_except_table1113GCC_except_table1118GCC_except_table1121GCC_except_table1122GCC_except_table1123GCC_except_table1135GCC_except_table1189GCC_except_table1274GCC_except_table1289GCC_except_table1332GCC_except_table1351GCC_except_table1377GCC_except_table1380GCC_except_table1381GCC_except_table1382GCC_except_table1386GCC_except_table3GCC_except_table50GCC_except_table51GCC_except_table53GCC_except_table30__dyld_private__ZN3std6thread8ThreadId3new5GUARD17h50b3a1d32bdf0a24E__ZN3std6thread8ThreadId3new7COUNTER17h3b5831e066fa0186E__ZN3std10sys_common11at_exit_imp4LOCK17hfa2aa5203b45c992E__ZN3std10sys_common9backtrace4lock4LOCK17hddfc8f03bfe24f7fE__ZN3std9panicking9HOOK_LOCK17h551dae91b49b5800E__ZN3std9panicking12default_hook28_$u7b$$u7b$closure$u7d$$u7d$11FIRST_PANIC17hba5d1cf54c365567E__ZN3std3sys4unix2os8env_lock8ENV_LOCK17h38b9052306abc038E__ZN3std2io5stdio14OUTPUT_CAPTURE7__getit5__KEY17h9040d387e54bd37fE__ZN3std10sys_common11thread_info11THREAD_INFO7__getit5__KEY17hacc6ab45cc28f1beE__ZN3std3sys4unix17thread_local_dtor13register_dtor5DTORS17hfb265f62e9ce6dafE__ZN3std9panicking11panic_count17LOCAL_PANIC_COUNT7__getit5__KEY17h281d74f56ae80201E__ZN3std3sys4unix17thread_local_dtor13register_dtor10REGISTERED17h8713364406fd6435E.0.0__ZN3std2io5stdio14OUTPUT_CAPTURE7__getit5__KEY17h9040d387e54bd37fE$tlv$init__ZN3std10sys_common11thread_info11THREAD_INFO7__getit5__KEY17hacc6ab45cc28f1beE$tlv$init__ZN3std3sys4unix17thread_local_dtor13register_dtor5DTORS17hfb265f62e9ce6dafE$tlv$init__ZN3std9panicking11panic_count17LOCAL_PANIC_COUNT7__getit5__KEY17h281d74f56ae80201E$tlv$init__ZN3std3sys4unix17thread_local_dtor13register_dtor10REGISTERED17h8713364406fd6435E.0.0$tlv$init__ZN3std2io5stdio6stdout8INSTANCE17hf99688b6f9fe169eE__ZN3std10sys_common11at_exit_imp5QUEUE17hfb9ad9d0411db937E__ZN3std10sys_common9backtrace18rust_backtrace_env7ENABLED17hb567501a82c856f9E__ZN3std10sys_common7cleanup7CLEANUP17h7dcea622c75da007E__ZN3std5alloc4HOOK17h70d60c6ff140baadE__ZN3std9panicking4HOOK17h71bd1bd0d59ab6a1E__ZN3std3sys4unix14stack_overflow3imp13MAIN_ALTSTACK17h97bcf4ab10712e15E__ZN3std3sys4unix6thread5guard9PAGE_SIZE17h6060ce72cbd82faaE__ZN3std12backtrace_rs9symbolize5gimli5Cache11with_global14MAPPINGS_CACHE17h3fea18c92cecccefE__ZN3std2io5stdio19OUTPUT_CAPTURE_USED17h9564eb93453036feE.0.0__ZN3std3sys4unix14stack_overflow3imp13NEED_ALTSTACK17h874fb3178e2303f1E.0.0/Users/runner/work/rust/rust/build/x86_64-apple-darwin/stage1-std/x86_64-apple-darwin/release/deps/library/std/src/lib.rs/@/std.2kfg1vkb-cgu.0/Users/sivachandran/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libstd-abe443acf5b6ec18.rlib(std-abe443acf5b6ec18.std.2kfg1vkb-cgu.0.rcgu.o)__ZN112_$LT$alloc..collections..btree..map..IntoIter$LT$K$C$V$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h0837be85d189cf85E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/collections/btree/map.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/option.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/ptr/mod.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/collections/btree/node.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/collections/btree/navigate.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/mem/maybe_uninit.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/alloc.rs__ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h4ba8e4423e227ee6E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/any.rs__ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17hce44aff5db5c6fe2E__ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17hde5492541d43b4c2E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h0f873f4a75a4b362E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/fmt/mod.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/fmt/num.rs__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1ff024cc7038a60fE__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h6ba5393f153ed164E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/boxed.rs__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha6af0df82ab4a9a4E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hd5d3a1b5507b2883E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/vec.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/slice/iter/macros.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/fmt/builders.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/ptr/mut_ptr.rs__ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h739903887440c2d8E__ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17hd586830027d3629fE__ZN45_$LT$$RF$T$u20$as$u20$core..fmt..UpperHex$GT$3fmt17ha0d2495ee7d67d36E__ZN4core3fmt3num50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$i32$GT$3fmt17h8401b47a744eceb5E__ZN4core3fmt5Write10write_char17h11b6874280bc6513E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/char/methods.rs__ZN4core3fmt5Write10write_char17h72f75a48c36b65c5E__ZN4core3fmt5Write10write_char17h810f5e4389b78c43E__ZN4core3fmt5Write9write_fmt17h586cb77d4756c514E__ZN4core3fmt5Write9write_fmt17h6ad3d486b33f753cE__ZN4core3fmt5Write9write_fmt17h8f44113baea9f38dE__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h66846710ad8940f7E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/ops/function.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/backtrace.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/raw_vec.rs__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h6f193c75096b31aeE__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h8c728240013e8d29E__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h8d3744bbc5dc384bE__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17hb7b532e34e3e385bE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/sync/atomic.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/lazy.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sync/once.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/io/stdio.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/mutex.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/io/buffered/linewriter.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/cell.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/intrinsics.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/result.rs__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17he7d49b1f491d7a31E__ZN4core3ptr13drop_in_place17h0001c4b85bcdeb97E__ZN4core3ptr13drop_in_place17h022b4b85cc38393dE__ZN4core3ptr13drop_in_place17h0357dba5b496e458E__ZN4core3ptr13drop_in_place17h0719c4772f09bd84E__ZN4core3ptr13drop_in_place17h0a660b2a203acd95E__ZN4core3ptr13drop_in_place17h0e80dc081aa8b67cE__ZN4core3ptr13drop_in_place17h15fe5790d2a0520dE__ZN4core3ptr13drop_in_place17h172ef6d61ce7c1edE__ZN4core3ptr13drop_in_place17h17b0029a687da7f6E__ZN4core3ptr13drop_in_place17h19e186fde122f6aaE__ZN4core3ptr13drop_in_place17h1ce02833bfcf8361E__ZN4core3ptr13drop_in_place17h2091ae9ae48cca00E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/sync.rs__ZN4core3ptr13drop_in_place17h2b2f605e3096fddeE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/poison.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sync/mutex.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/panicking.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/mutex.rs__ZN4core3ptr13drop_in_place17h2d8b95acec961bbfE__ZN4core3ptr13drop_in_place17h315a1ca4d07e57edE__ZN4core3ptr13drop_in_place17h3288062f1fc04a38E__ZN4core3ptr13drop_in_place17h3934ec390af16604E__ZN4core3ptr13drop_in_place17h3a4fbc96eb58b1e3E__ZN4core3ptr13drop_in_place17h3b90589b753c584eE__ZN4core3ptr13drop_in_place17h3debf7f414b250f3E__ZN4core3ptr13drop_in_place17h3dfc2aca8e1e1bb8E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/../../backtrace/src/symbolize/gimli/mmap_unix.rs__ZN4core3ptr13drop_in_place17h41adba061e832346E__ZN4core3ptr13drop_in_place17h43027b75d60cbe9aE__ZN4core3ptr13drop_in_place17h47b5def27b724e21E__ZN4core3ptr13drop_in_place17h49901ec82d6a183eE__ZN4core3ptr13drop_in_place17h4b14187a25afd5b5E__ZN4core3ptr13drop_in_place17h4b6d5d0d7efb219aE__ZN4core3ptr13drop_in_place17h53616fc794574dc4E__ZN4core3ptr13drop_in_place17h538517a79da6b782E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/convert/num.rs__ZN4core3ptr13drop_in_place17h5452c3ea121674fdE__ZN4core3ptr13drop_in_place17h5a5d87bcfd7664dfE__ZN4core3ptr13drop_in_place17h5f63aceff2a5b8f7E__ZN4core3ptr13drop_in_place17h64f1c92dee4d77f1E__ZN4core3ptr13drop_in_place17h6b20b8c1c593af28E__ZN4core3ptr13drop_in_place17h6fbdc20366dc7538E__ZN4core3ptr13drop_in_place17h729d9af1daf04918E__ZN4core3ptr13drop_in_place17h72b419bee64718efE__ZN4core3ptr13drop_in_place17h74d8861fb04ffc60E__ZN4core3ptr13drop_in_place17h75190625eaa75b34E__ZN4core3ptr13drop_in_place17h7baf4907fdbae59dE__ZN4core3ptr13drop_in_place17h81fbef6758eb2301E__ZN4core3ptr13drop_in_place17h83511727acfa8c0cE__ZN4core3ptr13drop_in_place17h8838f5c16c4fc122E__ZN4core3ptr13drop_in_place17h92f92d2cb94e2fb3E__ZN4core3ptr13drop_in_place17h9f7d1f2d52a27452E__ZN4core3ptr13drop_in_place17ha6226e4d7b35b031E__ZN4core3ptr13drop_in_place17ha86484731f53123bE__ZN4core3ptr13drop_in_place17ha9375dbd5f83cc63E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/ffi/c_str.rs__ZN4core3ptr13drop_in_place17ha94e2f1d102db85bE__ZN4core3ptr13drop_in_place17haa43e31a76904e2fE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/slice/sort.rs__ZN4core3ptr13drop_in_place17haa477af226bcfd13E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/io/buffered/bufwriter.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/ops/range.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/ptr/const_ptr.rs__ZN4core3ptr13drop_in_place17had982f45f560f7d6E__ZN4core3ptr13drop_in_place17hadc2f558f2ff94dcE__ZN4core3ptr13drop_in_place17hb167217a5f901d1bE__ZN4core3ptr13drop_in_place17hb8cea66b0f53a3dcE__ZN4core3ptr13drop_in_place17hb9dc620aa9c27cf5E__ZN4core3ptr13drop_in_place17hbb7a4d1d9697aadaE__ZN4core3ptr13drop_in_place17hbd3007beddeda153E__ZN4core3ptr13drop_in_place17hc20dc3b9981f6cd9E__ZN4core3ptr13drop_in_place17hc6d789595865b5a6E__ZN4core3ptr13drop_in_place17hcabc80810034beb8E__ZN4core3ptr13drop_in_place17hd256dfc6fb0d76f7E__ZN4core3ptr13drop_in_place17hd4234fd2fc8d37d5E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/../../backtrace/src/print.rs__ZN4core3ptr13drop_in_place17hd83fdd4029f00d92E__ZN4core3ptr13drop_in_place17hdd7b4a2dd430f461E__ZN4core3ptr13drop_in_place17hddf21e2d6beb145eE__ZN4core3ptr13drop_in_place17hdf3b711f31627af4E__ZN4core3ptr13drop_in_place17he13d79eea5109786E__ZN4core3ptr13drop_in_place17he4e7107691da6ef6E__ZN4core3ptr13drop_in_place17he569096b505583e3E__ZN4core3ptr13drop_in_place17he89316862fed7a0dE__ZN4core3ptr13drop_in_place17he8d043e14c4c39edE__ZN4core3ptr13drop_in_place17he985ef45a8da31f9E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/../../backtrace/src/lib.rs__ZN4core3ptr13drop_in_place17head2c15ebf9b5946E__ZN4core3ptr13drop_in_place17heb31b445a086f772E__ZN4core3ptr13drop_in_place17hf9cbea050bad923cE__ZN4core3ptr13drop_in_place17hfa66d01e9782ef16E__ZN4core3ptr13drop_in_place17hfa987b11389de4deE__ZN4core3ptr13drop_in_place17hfad525e23ac74451E__ZN4core3str21_$LT$impl$u20$str$GT$8contains17hdb9ab4ce824b5fd1E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/mod.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/pattern.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/cmp.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/iter/range.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/num/uint_macros.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/slice/index.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/traits.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/validations.rs__ZN4core5slice4sort10shift_tail17h3844cb057a7b7177E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/../../backtrace/src/symbolize/gimli/macho.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/slice/cmp.rs__ZN4core5slice4sort7recurse17h1c62411bedafa373E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/slice/mod.rs__ZN4core5slice4sort7recurse17h37750ba1f8b09041E__ZN4core5slice4sort7recurse17hca6e6d182d228cc8E__ZN4core5slice4sort8heapsort28_$u7b$$u7b$closure$u7d$$u7d$17h769811aafeab5cd3E__ZN4core6option15Option$LT$T$GT$6unwrap17h855354511a0abb4aE__ZN4core6option15Option$LT$T$GT$6unwrap17hed00f5e5d25b8623E__ZN50_$LT$$BP$mut$u20$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h5affc32e8c99512aE__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h205ea02eb8a59909E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hb6053ad3eac89dc0E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/io/mod.rs__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hc24b373be71ddaf6E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17hc6f501e03806c0dfE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/string.rs__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h1980679f0a84912aE__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h30f9cbfff89d16f3E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17hcfcee4d34d10b145E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17hdaebfb5281dc67a6E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h5dc3b8f6c25e27daE__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h9ae865b8e762bcacE__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17hcd8f5014e117f254E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17he584666e74ec2875E__ZN58_$LT$alloc..string..String$u20$as$u20$core..fmt..Debug$GT$3fmt17h8363c3aee22734aaE__ZN5alloc3vec16Vec$LT$T$C$A$GT$6insert17h44f6c05570b4e998E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/alloc/layout.rs__ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17h228f1ac451fa948dE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/condvar.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/condvar.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/rc.rs__ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17hdd2654ecc980e2d6E__ZN5alloc4sync12Arc$LT$T$GT$9drop_slow17he5d2da03883f9d6eE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/fs.rs__ZN5alloc5alloc8box_free17h34c0a024434cc0b0E__ZN5alloc5alloc8box_free17h3dd29e0d8c8ccbabE__ZN5alloc5alloc8box_free17h76725ec2302ed6a8E__ZN5alloc7raw_vec11finish_grow17h57e63f99c8017fbdE__ZN5gimli4read4line15FileEntryFormat5parse17h53e650041446ec23E/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/line.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/endian_slice.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/clone.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/leb128.rs__ZN5gimli4read4line15parse_attribute17h224a09bc97bd7121E/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/reader.rs__ZN5gimli4read4line27FileEntry$LT$R$C$Offset$GT$5parse17haa5dc28df9c7934cE__ZN5gimli4read4unit15parse_attribute17haee1e3272748be7fE/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/unit.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/common.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/constants.rs__ZN5gimli4read4unit18Attribute$LT$R$GT$5value17hc4d4cd690f6e3dc0E__ZN5gimli4read5dwarf14Dwarf$LT$R$GT$11attr_string17hdc5311a2420bf7f0E/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/dwarf.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/str.rs__ZN5gimli4read6reader6Reader12read_address17h01817967dad0149aE__ZN5gimli4read8rnglists20RngListIter$LT$R$GT$4next17h4f850b3c8d0b22b9E/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/rnglists.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/addr.rs__ZN60_$LT$alloc..string..String$u20$as$u20$core..fmt..Display$GT$3fmt17ha1b559724cbd3a48E__ZN90_$LT$gimli..read..unit..AttributeValue$LT$R$C$Offset$GT$$u20$as$u20$core..clone..Clone$GT$5clone17h64f4370d8fd7dadeE__ZN9addr2line16Context$LT$R$GT$10from_dwarf17h6107e5db12be34e1E/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/addr2line-0.14.0/src/lib.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/abbrev.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/loclists.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/collections/btree/search.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/ops/arith.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/slice.rs__ZN9addr2line16Context$LT$R$GT$11find_frames17ha16c20a53a379882E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/slice/iter.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/iter/adapters/take_while.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/iter/traits/double_ended.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/addr2line-0.14.0/src/lazy.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/gimli-0.23.0/src/read/mod.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/lib.rs__ZN9addr2line16ResUnit$LT$R$GT$11parse_lines17h7511c92fb61dff17E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/num/wrapping.rs__ZN9addr2line16ResUnit$LT$R$GT$11render_file17hac98565df4da3786E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/alloc/src/borrow.rs__ZN9addr2line16ResUnit$LT$R$GT$13find_location17hb908671986c80953E__ZN9addr2line17Function$LT$R$GT$14parse_children17h86c79dd7fe8fcd42E__ZN9addr2line18FrameIter$LT$R$GT$4next17h1727261d8ad9f505E__ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17h8a4fad506e977361E__ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17h97294a5eaf80b5c7E__ZN9addr2line24RangeAttributes$LT$R$GT$14for_each_range28_$u7b$$u7b$closure$u7d$$u7d$17hd4a764ad593de48bE__ZN9addr2line9name_attr17h55a0d3d1d4e76283E__ZN68_$LT$std..thread..local..AccessError$u20$as$u20$core..fmt..Debug$GT$3fmt17h273f87e5dd3cef1aE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/thread/local.rs__ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17h3e1b2fd4e9ebbad5E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/mem/mod.rs__ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17h4ba7edc22d114ddfE__ZN3std6thread5local4fast12Key$LT$T$GT$14try_initialize17hc9940217f12a295fE__ZN3std6thread5local4fast13destroy_value17h5efe6299bb114e7bE__ZN3std6thread5local4fast13destroy_value17hf426f934b45b9978E__ZN3std6thread4park17h4e0a5ea8b8cc0704E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/thread/mod.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/thread_parker/generic.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/condvar/check.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sync/condvar.rs__ZN3std6thread6Thread3new17h6b4affc24038a1baE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/convert/mod.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/memchr.rs__ZN3std3env11current_dir17h8e476354e14c7a88E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/env.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/os.rs__ZN3std3env7_var_os17he4f4ee986eda60b5E__ZN3std5error5Error7type_id17h65f37167cac664edE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/error.rs__ZN3std5error5Error9backtrace17he6c2c90efd2b9f08E__ZN3std5error5Error5cause17hb8d47cee058557daE__ZN243_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$std..error..Error$GT$11description17ha938a107b7cdb3ceE__ZN244_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Display$GT$3fmt17h08228dc511cb316dE__ZN242_$LT$std..error..$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..boxed..Box$LT$dyn$u20$std..error..Error$u2b$core..marker..Send$u2b$core..marker..Sync$GT$$GT$..from..StringError$u20$as$u20$core..fmt..Debug$GT$3fmt17hc540d384a135e2d4E__ZN79_$LT$$RF$$u5b$u8$u5d$$u20$as$u20$std..ffi..c_str..CString..new..SpecIntoVec$GT$8into_vec17hc1afdddfe7a5a43cE__ZN3std3ffi5c_str7CString18from_vec_unchecked17hb4a87cd072bc5230E__ZN3std3ffi5c_str104_$LT$impl$u20$core..convert..From$LT$std..ffi..c_str..NulError$GT$$u20$for$u20$std..io..error..Error$GT$4from17h0d8da0bc9d655ef9E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/io/error.rs__ZN3std2fs11OpenOptions5_open17h0592fb6dacd3d10fE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/fs.rs__ZN3std2io8buffered9bufwriter18BufWriter$LT$W$GT$9flush_buf17h49185b1ec1125c63E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/fd.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/mod.rs__ZN83_$LT$std..io..buffered..bufwriter..BufWriter$LT$W$GT$$u20$as$u20$std..io..Write$GT$9write_all17h41ecf00f4bac090eE__ZN58_$LT$std..io..error..Error$u20$as$u20$core..fmt..Debug$GT$3fmt17hb15268f7a75e41e2E__ZN57_$LT$std..io..error..Repr$u20$as$u20$core..fmt..Debug$GT$3fmt17h980a0dd528b6f8b8E__ZN60_$LT$std..io..error..Error$u20$as$u20$core..fmt..Display$GT$3fmt17hcf4989df195aa7f5E__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$5write17h9ce054a705021df9E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/io/impls.rs__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$14write_vectored17hb35371796effb715E__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$17is_write_vectored17h46cded44848cdd6cE__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$9write_all17hfd7f3e3133bef30aE__ZN3std2io5impls70_$LT$impl$u20$std..io..Write$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$5flush17h2787670ebb2f0920E__ZN60_$LT$std..io..stdio..StdoutRaw$u20$as$u20$std..io..Write$GT$9write_all17h438015c553a11ff1E__ZN61_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$9write_fmt17h2a040ce7f300a9bcE__ZN61_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$9write_all17h02d3d39763e125dfE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/io/buffered/linewritershim.rs__ZN3std2io5stdio6_print17h2b92ca946b4108adE__ZN3std2io5Write9write_all17h8eb2d4edcce31a61E__ZN3std2io5Write9write_all17hda8e0b8325612c9bE__ZN3std2io5Write18write_all_vectored17h55e81aa5ab6f7d47E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/io.rs__ZN3std2io5Write18write_all_vectored17hab65cd626c6237adE__ZN3std2io5Write9write_fmt17h013bead77842bdd6E__ZN3std2io5Write9write_fmt17h0a6214ccb1a8468bE__ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17hb46fb1811d1decf3E__ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17hc9c8d30f2ac05ba9E__ZN80_$LT$std..io..Write..write_fmt..Adaptor$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$9write_str17hf7bc37465b62b303E__ZN3std4path10iter_after17h47209421eb5c497aE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/path.rs__ZN67_$LT$std..path..PrefixComponent$u20$as$u20$core..cmp..PartialEq$GT$2eq17hc27c7959dd01443fE__ZN3std4path10Components7as_path17h1c6e41db64548857E__ZN3std4path10Components25parse_next_component_back17h716446795a9bd98bE__ZN80_$LT$std..path..Components$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h13857d5e18b1c9dfE__ZN95_$LT$std..path..Components$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17hf50057d659163bf8E__ZN3std4path7PathBuf5_push17hceb662aff65bc21eE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/path.rs__ZN55_$LT$std..path..Display$u20$as$u20$core..fmt..Debug$GT$3fmt17h4eab566fdcb293c6E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/ffi/os_str.rs__ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17h00f47741743939d6E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/stack_overflow.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/at_exit_imp.rs__ZN3std4sync4once4Once15call_once_force28_$u7b$$u7b$closure$u7d$$u7d$17h6e9c7f44b7742eefE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/remutex.rs__ZN70_$LT$std..sync..once..WaiterQueue$u20$as$u20$core..ops..drop..Drop$GT$4drop17h7155e5839eee4f3fE__ZN91_$LT$std..sys_common..backtrace.._print..DisplayBacktrace$u20$as$u20$core..fmt..Display$GT$3fmt17h34f76b2ca42fab41E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/../../backtrace/src/backtrace/libunwind.rs__ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$17h04b4d408d477fdcbE__ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$17h2b785c9b2b2d586fE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/../../backtrace/src/symbolize/mod.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/../../backtrace/src/symbolize/gimli.rs__ZN3std10sys_common9backtrace10_print_fmt28_$u7b$$u7b$closure$u7d$$u7d$17h8c28a55991973bc2E__ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h6292d384dc74f041E__ZN3std10sys_common9backtrace26__rust_end_short_backtrace17h9a7e5cc6475b496bE__ZN3std10sys_common9backtrace15output_filename17h7ac82c1417d735a9E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/os_str_bytes.rs__ZN3std10sys_common5mutex12MovableMutex3new17h9870e9b6ed9c2299E__ZN73_$LT$std..sys_common..os_str_bytes..Slice$u20$as$u20$core..fmt..Debug$GT$3fmt17hec992e4fc8fea675E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/bytestring.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/iter/adapters/flatten.rs__ZN82_$LT$std..sys_common..poison..PoisonError$LT$T$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h3f275db072f730c2E__ZN3std10sys_common11thread_info10ThreadInfo4with28_$u7b$$u7b$closure$u7d$$u7d$17h8dbc12f4d65485d5E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/thread_info.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/num/int_macros.rs__ZN3std10sys_common11thread_info3set17hcb72bf5da4fd3594E__ZN3std10sys_common4util10dumb_print17h974a0886978cd6e8E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys_common/util.rs__ZN3std10sys_common4util5abort17h2afc70d70e6e0608E__ZN3std10sys_common4util15report_overflow17h18a41ea3351fa15dE__ZN3std5alloc24default_alloc_error_hook17h72996271f640cdfcE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/alloc.rs_rust_oom___rdl_alloc/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/alloc.rs___rdl_dealloc___rdl_realloc___rust_drop_panic___rust_foreign_exception__ZN3std9panicking12default_hook17h460969f1dc8f738dE__ZN3std9panicking12default_hook28_$u7b$$u7b$closure$u7d$$u7d$17hb14d90e928578cc7E_rust_begin_unwind__ZN3std9panicking19begin_panic_handler28_$u7b$$u7b$closure$u7d$$u7d$17h99569328be4adae9E__ZN90_$LT$std..panicking..begin_panic_handler..PanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h34d30bb94d93fdecE__ZN90_$LT$std..panicking..begin_panic_handler..PanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$3get17h1abd87a207585fa8E__ZN93_$LT$std..panicking..begin_panic_handler..StrPanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h7d5123a61bf0b11dE__ZN93_$LT$std..panicking..begin_panic_handler..StrPanicPayload$u20$as$u20$core..panic..BoxMeUp$GT$3get17h91405c3d141915a1E__ZN3std9panicking11begin_panic28_$u7b$$u7b$closure$u7d$$u7d$17hd1153f4b5aa7cb4cE__ZN91_$LT$std..panicking..begin_panic..PanicPayload$LT$A$GT$$u20$as$u20$core..panic..BoxMeUp$GT$8take_box17h451fb217f095e369E__ZN91_$LT$std..panicking..begin_panic..PanicPayload$LT$A$GT$$u20$as$u20$core..panic..BoxMeUp$GT$3get17h8d9fbb4cb4185aedE__ZN3std9panicking20rust_panic_with_hook17h28bf9d6c3916221eE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/panic.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/rwlock.rs_rust_panic__ZN3std2rt19lang_start_internal17h1faf79574185df6dE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/rt.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/thread.rs__ZN3std12backtrace_rs9symbolize6Symbol4name17h0b4aba343862f932E__ZN3std12backtrace_rs5print17BacktraceFrameFmt21print_raw_with_column17h2da10e409b6783f2E__ZN62_$LT$std..ffi..c_str..NulError$u20$as$u20$core..fmt..Debug$GT$3fmt17h618b66ceb7f31360E__ZN62_$LT$std..io..error..ErrorKind$u20$as$u20$core..fmt..Debug$GT$3fmt17h0fe973120dff45ecE__ZN3std10sys_common13thread_parker7generic6Parker6unpark17h6aa121c7b8f4a08bE__ZN86_$LT$std..sys..unix..fs..ReadDir$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h8bf8320bf6d5e305E__ZN3std3sys4unix2fs4File6open_c17hb41cfe2ecbbf477cE__ZN3std3sys4unix2fs7readdir17h2836587a92cf11e2E__ZN3std3sys4unix5mutex14ReentrantMutex4init17h21e67a6d82cb163aE__ZN3std3sys4unix2os12error_string17hfcf250b7074d01b7E__ZN3std3sys4unix14stack_overflow3imp14signal_handler17h9d4a7e7062fdb94aE__ZN3std3sys4unix14stack_overflow3imp12make_handler17h01917d6820f56325E__ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$5write17h79844533ff1e4615E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/stdio.rs__ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$14write_vectored17h6b2dd7f421c4a919E__ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$17is_write_vectored17hd122ffdef32f049fE__ZN64_$LT$std..sys..unix..stdio..Stderr$u20$as$u20$std..io..Write$GT$5flush17h135d85c4975875b5E__ZN3std3sys4unix17thread_local_dtor13register_dtor17h6762234705c4baabE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/sys/unix/thread_local_dtor.rs__ZN3std3sys4unix17thread_local_dtor13register_dtor9run_dtors17ha82f7e95b18f7cb8E__ZN3std3sys4unix17decode_error_kind17h00d6a0c6f65b7208E__ZN3std3sys4unix14abort_internal17h7c65afd76fd59ab4E__ZN3std12backtrace_rs9backtrace9libunwind5trace8trace_fn17h26837839f9872607E__ZN79_$LT$std..backtrace_rs..symbolize..SymbolName$u20$as$u20$core..fmt..Display$GT$3fmt17h5481f908bcfcf1f9E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/error.rs__ZN3std12backtrace_rs9symbolize5gimli7Context3new17heea20e6a9bf382c0E__ZN3std12backtrace_rs9symbolize5gimli4mmap17he56ebb42c8d19b47E__ZN3std12backtrace_rs9symbolize5gimli7resolve17h802d1df7295a768aE/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/pod.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/read/macho/load_command.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/read/macho/segment.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/ptr/non_null.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/iter/traits/iterator.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/iter/adapters/enumerate.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/read/macho/file.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/../../backtrace/src/symbolize/gimli/stash.rs__ZN3std12backtrace_rs9symbolize5gimli5macho11find_header17h1fc46a35368989baE__ZN3std12backtrace_rs9symbolize5gimli5macho6Object5parse17h66b22413462821e4E/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/read/macho/symbol.rs/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/read/mod.rs__ZN3std12backtrace_rs9symbolize5gimli5macho6Object7section17h28a89dd39816544eE/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/object-0.22.0/src/read/macho/section.rs__ZN4core5slice4sort14break_patterns17h5298d42b84c7db75E__ZN4core5slice4sort14break_patterns17h845fce80afe79bd5E__ZN4core5slice4sort22partial_insertion_sort17h5e2bc01cd419fe15E__ZN4core5slice4sort22partial_insertion_sort17h7a57ff0f0112085bE__ZN4core5slice4sort22partial_insertion_sort17hf2b5851c05229d98E__ZN4core5slice4sort8heapsort17h018b933c391ce837E__ZN4core5slice4sort8heapsort17h3b6e8f18d2ed0604E__ZN4core5slice4sort8heapsort17hb7973b4e2c2a6e54E__ZN3std7process5abort17h3aac11b7f057a319E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/std/src/process.rs__ZN3std4sync4once4Once10call_inner17h755b6d60054eea69E__ZN3std9panicking11panic_count17is_zero_slow_path17h991e3a61e1166c13E__ZN3std9panicking3try7cleanup17h5bff449612ac2cffE__ZN3std9panicking15begin_panic_fmt17hc364d6defd6a88b8E__ZN3std9panicking11begin_panic17h8b5bc66bed0a4003E_str.5_str.6GCC_except_table92GCC_except_table96GCC_except_table113GCC_except_table128GCC_except_table131GCC_except_table138GCC_except_table152GCC_except_table153GCC_except_table159GCC_except_table163GCC_except_table172GCC_except_table186GCC_except_table200GCC_except_table202GCC_except_table213GCC_except_table220GCC_except_table232GCC_except_table233GCC_except_table234GCC_except_table276GCC_except_table286GCC_except_table302GCC_except_table303GCC_except_table304GCC_except_table305GCC_except_table329GCC_except_table333GCC_except_table353GCC_except_table362GCC_except_table420GCC_except_table423GCC_except_table518GCC_except_table550GCC_except_table572GCC_except_table573GCC_except_table588GCC_except_table630GCC_except_table634GCC_except_table659GCC_except_table673GCC_except_table674GCC_except_table675GCC_except_table676GCC_except_table677GCC_except_table682GCC_except_table1017GCC_except_table1020GCC_except_table1021GCC_except_table1023GCC_except_table1054GCC_except_table1056GCC_except_table1057GCC_except_table1060GCC_except_table1065GCC_except_table1085GCC_except_table1086GCC_except_table1090GCC_except_table1092GCC_except_table1112GCC_except_table1113GCC_except_table1118GCC_except_table1121GCC_except_table1122GCC_except_table1123GCC_except_table1135GCC_except_table1189GCC_except_table1274GCC_except_table1289GCC_except_table1332GCC_except_table1351GCC_except_table1377GCC_except_table1380GCC_except_table1381GCC_except_table1382GCC_except_table1386__ZN3std6thread8ThreadId3new5GUARD17h50b3a1d32bdf0a24E__ZN3std6thread8ThreadId3new7COUNTER17h3b5831e066fa0186E__ZN3std10sys_common11at_exit_imp4LOCK17hfa2aa5203b45c992E__ZN3std10sys_common9backtrace4lock4LOCK17hddfc8f03bfe24f7fE__ZN3std9panicking9HOOK_LOCK17h551dae91b49b5800E__ZN3std9panicking12default_hook28_$u7b$$u7b$closure$u7d$$u7d$11FIRST_PANIC17hba5d1cf54c365567E__ZN3std3sys4unix2os8env_lock8ENV_LOCK17h38b9052306abc038E__ZN3std2io5stdio14OUTPUT_CAPTURE7__getit5__KEY17h9040d387e54bd37fE__ZN3std10sys_common11thread_info11THREAD_INFO7__getit5__KEY17hacc6ab45cc28f1beE__ZN3std3sys4unix17thread_local_dtor13register_dtor5DTORS17hfb265f62e9ce6dafE__ZN3std9panicking11panic_count17LOCAL_PANIC_COUNT7__getit5__KEY17h281d74f56ae80201E__ZN3std3sys4unix17thread_local_dtor13register_dtor10REGISTERED17h8713364406fd6435E.0.0__ZN3std2io5stdio14OUTPUT_CAPTURE7__getit5__KEY17h9040d387e54bd37fE$tlv$init__ZN3std10sys_common11thread_info11THREAD_INFO7__getit5__KEY17hacc6ab45cc28f1beE$tlv$init__ZN3std3sys4unix17thread_local_dtor13register_dtor5DTORS17hfb265f62e9ce6dafE$tlv$init__ZN3std9panicking11panic_count17LOCAL_PANIC_COUNT7__getit5__KEY17h281d74f56ae80201E$tlv$init__ZN3std3sys4unix17thread_local_dtor13register_dtor10REGISTERED17h8713364406fd6435E.0.0$tlv$init__ZN3std2io5stdio6stdout8INSTANCE17hf99688b6f9fe169eE__ZN3std10sys_common11at_exit_imp5QUEUE17hfb9ad9d0411db937E__ZN3std10sys_common9backtrace18rust_backtrace_env7ENABLED17hb567501a82c856f9E__ZN3std10sys_common7cleanup7CLEANUP17h7dcea622c75da007E__ZN3std5alloc4HOOK17h70d60c6ff140baadE__ZN3std9panicking4HOOK17h71bd1bd0d59ab6a1E__ZN3std3sys4unix14stack_overflow3imp13MAIN_ALTSTACK17h97bcf4ab10712e15E__ZN3std3sys4unix6thread5guard9PAGE_SIZE17h6060ce72cbd82faaE__ZN3std12backtrace_rs9symbolize5gimli5Cache11with_global14MAPPINGS_CACHE17h3fea18c92cecccefE__ZN3std2io5stdio19OUTPUT_CAPTURE_USED17h9564eb93453036feE.0.0__ZN3std3sys4unix14stack_overflow3imp13NEED_ALTSTACK17h874fb3178e2303f1E.0.0__ZN3std9panicking11panic_count18GLOBAL_PANIC_COUNT17h6a4e4ef05ac2b79cE/Users/runner/work/rust/rust/build/x86_64-apple-darwin/stage1-std/x86_64-apple-darwin/release/deps/library/panic_unwind/src/lib.rs/@/panic_unwind.evr08ogz-cgu.0/Users/sivachandran/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libpanic_unwind-76bce8edb1686aec.rlib(panic_unwind-76bce8edb1686aec.panic_unwind.evr08ogz-cgu.0.rcgu.o)__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h1c4d4ebe961f86e2E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/panic_unwind/src/gcc.rs__ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h49adcc37e86e1881E__ZN4core3ptr13drop_in_place17h20c76b1664456991E__ZN4core3ptr13drop_in_place17hed2d1e1c774489c8E__ZN5alloc5alloc8box_free17h0ea2d49c9f0de4ffE__ZN5alloc5alloc8box_free17h53a88048d8152fe2E__ZN12panic_unwind5dwarf2eh20read_encoded_pointer17h25e918cc232c0e9aE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/panic_unwind/src/dwarf/eh.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/panic_unwind/src/dwarf/mod.rs___rust_panic_cleanup/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/panic_unwind/src/lib.rs___rust_start_panic__ZN12panic_unwind8real_imp5panic17exception_cleanup17hc94bf25d03998d60E__ZN12panic_unwind8real_imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h424faaead1de66f2E__ZN12panic_unwind8real_imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h8f164e91edd25c5aE_rust_eh_personalityGCC_except_table3/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/lib.rs/@/rustc_demangle.gj8mg8u6-cgu.0/Users/sivachandran/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/librustc_demangle-a4dde5aa1a7a7058.rlib(rustc_demangle-a4dde5aa1a7a7058.rustc_demangle.gj8mg8u6-cgu.0.rcgu.o)__ZN4core3ptr13drop_in_place17h156182fdd95e44cbE__ZN81_$LT$core..str..pattern..CharSearcher$u20$as$u20$core..str..pattern..Searcher$GT$10next_match17h3d7592d4120cad53E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/slice/memchr.rs__ZN71_$LT$rustc_demangle..legacy..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17hc0f205cd35f0b469E/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/legacy.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/iter.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/char/convert.rs__ZN64_$LT$rustc_demangle..v0..Ident$u20$as$u20$core..fmt..Display$GT$3fmt17h9717f14fbc1909adE/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/v0.rs/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/iter/adapters/peekable.rs__ZN14rustc_demangle2v06Parser5ident17hca065d1bb8a0d636E__ZN14rustc_demangle2v06Parser9skip_path17hb9bbb42b7b263694E__ZN14rustc_demangle2v06Parser9skip_type17h6585a71e25583804E__ZN14rustc_demangle2v06Parser10skip_const17h3211fd1eac83bf07E__ZN14rustc_demangle2v07Printer25print_lifetime_from_index17h42ce2cc32d05ed17E__ZN14rustc_demangle2v07Printer10print_path17hc994748132c2c778E__ZN14rustc_demangle2v07Printer17print_generic_arg17h759deaefd5fdcd4dE__ZN14rustc_demangle2v07Printer10print_type17hb047e4aef4c2abb8E__ZN14rustc_demangle2v07Printer10print_type28_$u7b$$u7b$closure$u7d$$u7d$17hff1b84bde9f76320E__ZN14rustc_demangle2v07Printer30print_path_maybe_open_generics17h8b18f5a41e62e59eE__ZN14rustc_demangle2v07Printer15print_dyn_trait17h7fab0c4788b0b385E__ZN14rustc_demangle2v07Printer11print_const17h7d70ae8b703933dcE__ZN14rustc_demangle2v07Printer16print_const_uint17he0a619656a6d34b2E__ZN14rustc_demangle8demangle17hc97ece7dadee9ed4E/Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/rustc-demangle-0.1.18/src/lib.rs__ZN14rustc_demangle12try_demangle17h6ebfe631036faf75E__ZN14rustc_demangle8Demangle6as_str17h1e82f3c4c269f359E__ZN61_$LT$rustc_demangle..Demangle$u20$as$u20$core..fmt..Debug$GT$3fmt17hd65b8b7251b75e54E__ZN63_$LT$rustc_demangle..Demangle$u20$as$u20$core..fmt..Display$GT$3fmt17hf5d5adacbab34e24E/Users/runner/work/rust/rust/build/x86_64-apple-darwin/stage1-std/x86_64-apple-darwin/release/deps/library/alloc/src/lib.rs/@/alloc.93uwhr78-cgu.0/Users/sivachandran/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/liballoc-3b92582b4d29b2e5.rlib(alloc-3b92582b4d29b2e5.alloc.93uwhr78-cgu.0.rcgu.o)__ZN4core3ptr13drop_in_place17h14b1ba618aef86d2E___rg_oom__ZN5alloc11collections5btree4node10splitpoint17h0f5d6edf3db63eb3E__ZN5alloc7raw_vec11finish_grow17h5e11d989603838c3E__ZN5alloc7raw_vec17capacity_overflow17h84f2ee8706ad9006E__ZN5alloc6string6String15from_utf8_lossy17hf1eb1c1633e093d9E__ZN5alloc6string13FromUtf8Error10into_bytes17hde44d7e3879cc819E__ZN5alloc6string104_$LT$impl$u20$core..convert..From$LT$alloc..string..String$GT$$u20$for$u20$alloc..vec..Vec$LT$u8$GT$$GT$4from17h04e9917c1cb5a5a5E__ZN5alloc5alloc18handle_alloc_error17h17828f1cec6e7e68EGCC_except_table30/Users/runner/work/rust/rust/build/x86_64-apple-darwin/stage1-std/x86_64-apple-darwin/release/deps/library/core/src/lib.rs/@/core.5058z95t-cgu.0/Users/sivachandran/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libcore-8892173c51407c3f.rlib(core-8892173c51407c3f.core.5058z95t-cgu.0.rcgu.o)__ZN4core3ops8function6FnOnce9call_once17he7576bda09634ee5E__ZN4core3ptr13drop_in_place17h00561e225b4bd4b3E__ZN4core3num14from_str_radix17h3c83031b7bbe500eE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/num/mod.rs__ZN71_$LT$core..ops..range..Range$LT$Idx$GT$$u20$as$u20$core..fmt..Debug$GT$3fmt17h559d514fbccfacdbE__ZN36_$LT$T$u20$as$u20$core..any..Any$GT$7type_id17h39271c2f8aa4b192E__ZN60_$LT$core..cell..BorrowError$u20$as$u20$core..fmt..Debug$GT$3fmt17h06ead577b1ca873fE__ZN63_$LT$core..cell..BorrowMutError$u20$as$u20$core..fmt..Debug$GT$3fmt17h9ff749290d38bd62E__ZN82_$LT$core..char..EscapeDebug$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17h571933ba2a1d97ecE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/char/mod.rs__ZN4core5panic9PanicInfo7payload17h74c84ca131d269d9E__ZN4core5panic9PanicInfo7message17h2c81884012b2bb51E__ZN4core5panic9PanicInfo8location17h4193e7d76b52197fE__ZN4core5panic8Location6caller17hd326b0185ea5a49bE__ZN60_$LT$core..panic..Location$u20$as$u20$core..fmt..Display$GT$3fmt17ha2751887b615c60aE__ZN68_$LT$core..fmt..builders..PadAdapter$u20$as$u20$core..fmt..Write$GT$9write_str17hfafb527e906b76b9E__ZN4core3fmt8builders11DebugStruct5field17h1ea22deec867e5d9E__ZN4core3fmt8builders11DebugStruct6finish17hbe41f7254329a605E__ZN4core3fmt8builders10DebugTuple5field17h8e2fa41ae2b86a83E__ZN4core3fmt8builders10DebugTuple6finish17hdc300016aa138d9fE__ZN4core3fmt8builders10DebugInner5entry17hd993114f8979977aE__ZN4core3fmt8builders9DebugList5entry17hcfc18fed7eeb0e0dE__ZN4core3fmt8builders8DebugSet5entry17h397b6bd50a20f754E__ZN4core3fmt8builders9DebugList6finish17he68c9b83833e8fd7E__ZN4core3fmt5Write10write_char17hba5e917c308825ceE__ZN4core3fmt5Write9write_fmt17h119471deaf757c21E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_str17h6080accf67cccf48E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$10write_char17h0da350b9cfe85ac2E__ZN50_$LT$$RF$mut$u20$W$u20$as$u20$core..fmt..Write$GT$9write_fmt17h7974e3105f512f1fE__ZN4core3fmt10ArgumentV110from_usize17h896ab284c39982e1E__ZN57_$LT$core..fmt..Arguments$u20$as$u20$core..fmt..Debug$GT$3fmt17h4fea634600e4154bE__ZN59_$LT$core..fmt..Arguments$u20$as$u20$core..fmt..Display$GT$3fmt17hdda8ea41e3d1d8e4E__ZN4core3fmt5write17h8f13d857463c51c1E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/iter/adapters/zip.rs__ZN4core3fmt9Formatter12pad_integral17h0adac3bf3805f3a0E__ZN4core3fmt9Formatter12pad_integral12write_prefix17h41520003ef9610e2E__ZN4core3fmt9Formatter3pad17h8b93142d29ee2144E__ZN4core3fmt9Formatter9write_str17h3c2681ff9bffe572E__ZN4core3fmt9Formatter9write_fmt17h1ebe0ce9ba0da141E__ZN4core3fmt9Formatter9alternate17h1eee0ad1d4327e92E__ZN4core3fmt9Formatter15debug_lower_hex17h153e6fc2538b988fE__ZN4core3fmt9Formatter15debug_upper_hex17h57414fd49f7e7913E__ZN4core3fmt9Formatter12debug_struct17hd3a9d6b0629237bfE__ZN4core3fmt9Formatter11debug_tuple17h607a2644ff900405E__ZN4core3fmt9Formatter10debug_list17hf0830059e9ccf358E__ZN57_$LT$core..fmt..Formatter$u20$as$u20$core..fmt..Write$GT$10write_char17hc8f23e7de483ed25E__ZN40_$LT$str$u20$as$u20$core..fmt..Debug$GT$3fmt17hfe0f1d4d0486e9abE__ZN42_$LT$str$u20$as$u20$core..fmt..Display$GT$3fmt17h668ecf8eca00c6e1E__ZN41_$LT$char$u20$as$u20$core..fmt..Debug$GT$3fmt17h979aff76c6c6ae27E__ZN43_$LT$char$u20$as$u20$core..fmt..Display$GT$3fmt17h607d337768a224c1E__ZN4core5slice6memchr19memchr_general_case17h93144f1947fe4f7cE__ZN4core5slice6memchr7memrchr17h9cc48724c17337a5E__ZN4core3str8converts9from_utf817h10159aefe2b07dfcE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/converts.rs__ZN4core3str7pattern11StrSearcher3new17hba6905c9a273575bE__ZN4core3str5lossy9Utf8Lossy10from_bytes17h34971ea3fbc55763E/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/str/lossy.rs__ZN4core3str5lossy9Utf8Lossy6chunks17hbf5936e3438c750bE__ZN96_$LT$core..str..lossy..Utf8LossyChunksIter$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hde7c21e241e97426E__ZN66_$LT$core..str..lossy..Utf8Lossy$u20$as$u20$core..fmt..Display$GT$3fmt17h74fc33f0f85fc8edE__ZN4core7unicode9printable12is_printable17hc19114cd11eedfacE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/unicode/printable.rs__ZN68_$LT$core..num..error..ParseIntError$u20$as$u20$core..fmt..Debug$GT$3fmt17hbadc9ebecd4f774fE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/num/error.rs__ZN4core3num21_$LT$impl$u20$u32$GT$14from_str_radix17h97a87b8b713c8cb4E__ZN4core3num62_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$usize$GT$8from_str17h979c769f01e688b0E__ZN4core3num60_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u64$GT$8from_str17h937e5f273a6822c8E__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u8$GT$3fmt17h3ee57fc64e0f18afE__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i8$GT$3fmt17hb5fe08a71976400bE__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u8$GT$3fmt17h31d42928f6d9c292E__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i8$GT$3fmt17h244501593265148dE__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i32$GT$3fmt17h0d97eb230357535eE__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i32$GT$3fmt17h40e418e2dace0edaE__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$i64$GT$3fmt17h96d1e85e1da4d4fdE__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$u64$GT$3fmt17h52a5ee1562310d4aE__ZN4core3fmt3num55_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$usize$GT$3fmt17h44ee8ed27e1411e4E__ZN4core3fmt3num55_$LT$impl$u20$core..fmt..LowerHex$u20$for$u20$isize$GT$3fmt17h72759f11bf7399d0E__ZN4core3fmt3num55_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$isize$GT$3fmt17hc9df9ed9e9211cb7E__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$u64$GT$3fmt17hb77ab9b19805c088E__ZN4core3fmt3num55_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$usize$GT$3fmt17hacc8407a90f9b518E__ZN4core3fmt3num53_$LT$impl$u20$core..fmt..UpperHex$u20$for$u20$i64$GT$3fmt17hef559a8f86f55756E__ZN4core3fmt3num52_$LT$impl$u20$core..fmt..Debug$u20$for$u20$usize$GT$3fmt17h6dbda585eb44f152E__ZN4core3fmt3num3imp51_$LT$impl$u20$core..fmt..Display$u20$for$u20$u8$GT$3fmt17h5cefcfc8713f25deE__ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17hcb4e7a571aabe5a0E__ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u32$GT$3fmt17hc2785043f8722bb3E__ZN4core3fmt3num3imp54_$LT$impl$u20$core..fmt..Display$u20$for$u20$usize$GT$3fmt17hc174936c4bde64a2E__ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$u64$GT$3fmt17h5c753548d23e6a7cE__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h1139ce2b25fa7bb6E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h600af86e5735b7c4E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17ha856b618c9396d1cE__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hca8d91163a740509E__ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17hf2180e5ca5a27bc7E__ZN44_$LT$$RF$T$u20$as$u20$core..fmt..Display$GT$3fmt17h7116a69589465fb9E__ZN64_$LT$core..str..error..Utf8Error$u20$as$u20$core..fmt..Debug$GT$3fmt17hac3b2d48837c0e10E__ZN4core7unicode12unicode_data2cc6lookup17heff602f3ee6e409eE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/unicode/unicode_data.rs__ZN4core7unicode12unicode_data15grapheme_extend6lookup17h946cf3fa94cbe4abE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/ops/bit.rs__ZN4core6option13expect_failed17hc2d54dd321f2ef33E__ZN4core6result13unwrap_failed17h0d8a6fea161e6a5eE__ZN4core6option18expect_none_failed17h5e793a721927d8b0E__ZN4core9panicking5panic17h2ca2e9d2b0a1f2bfE/rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b/library/core/src/panicking.rs__ZN4core9panicking18panic_bounds_check17hf2e6ff9d7438b148E__ZN4core9panicking9panic_fmt17h65997884a2662b8cE__ZN4core5slice5index26slice_start_index_len_fail17ha61876d93be6751aE__ZN4core5slice5index24slice_end_index_len_fail17hfb5fa93bcd2e1e91E__ZN4core5slice5index22slice_index_order_fail17h3caf0605b69fd185E__ZN4core3str6traits23str_index_overflow_fail17ha8d1e1fb4176068fE__ZN4core3str16slice_error_fail17hde89b335320e0c53E__ZN4core3str11validations15UTF8_CHAR_WIDTH17h2a4853d2c1524450E__ZN4core7unicode12unicode_data15grapheme_extend17SHORT_OFFSET_RUNS17hd221a2f882a0e29aE__ZN4core7unicode12unicode_data15grapheme_extend7OFFSETS17h1274fcd0b20229fdE \ No newline at end of file diff --git a/tests/fixtures/sort/default_unsorted_ints.expected.debug b/tests/fixtures/sort/default_unsorted_ints.expected.debug new file mode 100644 index 000000000..2bf082d3b --- /dev/null +++ b/tests/fixtures/sort/default_unsorted_ints.expected.debug @@ -0,0 +1,200 @@ +1 +_ +10 +__ +100 +___ +11 +__ +12 +__ +13 +__ +14 +__ +15 +__ +16 +__ +17 +__ +18 +__ +19 +__ +2 +_ +20 +__ +21 +__ +22 +__ +23 +__ +24 +__ +25 +__ +26 +__ +27 +__ +28 +__ +29 +__ +3 +_ +30 +__ +31 +__ +32 +__ +33 +__ +34 +__ +35 +__ +36 +__ +37 +__ +38 +__ +39 +__ +4 +_ +40 +__ +41 +__ +42 +__ +43 +__ +44 +__ +45 +__ +46 +__ +47 +__ +48 +__ +49 +__ +5 +_ +50 +__ +51 +__ +52 +__ +53 +__ +54 +__ +55 +__ +56 +__ +57 +__ +58 +__ +59 +__ +6 +_ +60 +__ +61 +__ +62 +__ +63 +__ +64 +__ +65 +__ +66 +__ +67 +__ +68 +__ +69 +__ +7 +_ +70 +__ +71 +__ +72 +__ +73 +__ +74 +__ +75 +__ +76 +__ +77 +__ +78 +__ +79 +__ +8 +_ +80 +__ +81 +__ +82 +__ +83 +__ +84 +__ +85 +__ +86 +__ +87 +__ +88 +__ +89 +__ +9 +_ +90 +__ +91 +__ +92 +__ +93 +__ +94 +__ +95 +__ +96 +__ +97 +__ +98 +__ +99 +__ diff --git a/tests/fixtures/sort/dictionary_order.expected.debug b/tests/fixtures/sort/dictionary_order.expected.debug new file mode 100644 index 000000000..f4a2d17db --- /dev/null +++ b/tests/fixtures/sort/dictionary_order.expected.debug @@ -0,0 +1,9 @@ +bbb +___ +___ +./bbc +_____ +_____ +bbd +___ +___ diff --git a/tests/fixtures/sort/exponents-positive-numeric.expected.debug b/tests/fixtures/sort/exponents-positive-numeric.expected.debug new file mode 100644 index 000000000..f5a32bad1 --- /dev/null +++ b/tests/fixtures/sort/exponents-positive-numeric.expected.debug @@ -0,0 +1,36 @@ + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key ++100000 +^ no match for key +_______ +10E +__ +___ +50e10 +__ +_____ +100E6 +___ +_____ +1000EDKLD +____ +_________ +10000K78 +_____ +________ diff --git a/tests/fixtures/sort/exponents_general.expected b/tests/fixtures/sort/exponents_general.expected new file mode 100644 index 000000000..308a82e1e --- /dev/null +++ b/tests/fixtures/sort/exponents_general.expected @@ -0,0 +1,28 @@ + + + + + + + + + -12e-5555.5 +0b10 // binary not supported +0x10 // hexadecimal not supported, but it should be +55e-20 +55e-20.10 +5.5.5.5 +10E +64e+ +99e- +1000EDKLD +10000K78 ++100000 ++100000 +100E6 +100E6 +10e10e10e10 +13e+10 +45e+10.5 +50e10 +50e10 diff --git a/tests/fixtures/sort/exponents_general.expected.debug b/tests/fixtures/sort/exponents_general.expected.debug new file mode 100644 index 000000000..a7238d10e --- /dev/null +++ b/tests/fixtures/sort/exponents_general.expected.debug @@ -0,0 +1,84 @@ + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + > -12e-5555.5 + _________ +______________ +0b10 // binary not supported +_ +____________________________ +0x10 // hexadecimal not supported, but it should be +_ +___________________________________________________ +55e-20 +______ +______ +55e-20.10 +______ +_________ +5.5.5.5 +___ +_______ +10E +__ +___ +64e+ +__ +____ +99e- +__ +____ +1000EDKLD +____ +_________ +10000K78 +_____ +________ ++100000 +_______ +_______ ++100000 +_______ +_______ +100E6 +_____ +_____ +100E6 +_____ +_____ +10e10e10e10 +_____ +___________ +13e+10 +______ +______ +45e+10.5 +______ +________ +50e10 +_____ +_____ +50e10 +_____ +_____ diff --git a/tests/fixtures/sort/exponents_general.txt b/tests/fixtures/sort/exponents_general.txt new file mode 100644 index 000000000..4a9bbba2e --- /dev/null +++ b/tests/fixtures/sort/exponents_general.txt @@ -0,0 +1,28 @@ +100E6 + +50e10 ++100000 + +10000K78 +0x10 // hexadecimal not supported, but it should be +10E +0b10 // binary not supported +64e+ +99e- + +45e+10.5 + +1000EDKLD + +13e+10 + +100E6 + +50e10 + -12e-5555.5 ++100000 + +10e10e10e10 +5.5.5.5 +55e-20 +55e-20.10 diff --git a/tests/fixtures/sort/ext_sort.expected b/tests/fixtures/sort/ext_sort.expected new file mode 100644 index 000000000..7599e0c96 --- /dev/null +++ b/tests/fixtures/sort/ext_sort.expected @@ -0,0 +1,20000 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884 +1885 +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906 +1907 +1908 +1909 +1910 +1911 +1912 +1913 +1914 +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933 +1934 +1935 +1936 +1937 +1938 +1939 +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955 +1956 +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974 +1975 +1976 +1977 +1978 +1979 +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991 +1992 +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +2035 +2036 +2037 +2038 +2039 +2040 +2041 +2042 +2043 +2044 +2045 +2046 +2047 +2048 +2049 +2050 +2051 +2052 +2053 +2054 +2055 +2056 +2057 +2058 +2059 +2060 +2061 +2062 +2063 +2064 +2065 +2066 +2067 +2068 +2069 +2070 +2071 +2072 +2073 +2074 +2075 +2076 +2077 +2078 +2079 +2080 +2081 +2082 +2083 +2084 +2085 +2086 +2087 +2088 +2089 +2090 +2091 +2092 +2093 +2094 +2095 +2096 +2097 +2098 +2099 +2100 +2101 +2102 +2103 +2104 +2105 +2106 +2107 +2108 +2109 +2110 +2111 +2112 +2113 +2114 +2115 +2116 +2117 +2118 +2119 +2120 +2121 +2122 +2123 +2124 +2125 +2126 +2127 +2128 +2129 +2130 +2131 +2132 +2133 +2134 +2135 +2136 +2137 +2138 +2139 +2140 +2141 +2142 +2143 +2144 +2145 +2146 +2147 +2148 +2149 +2150 +2151 +2152 +2153 +2154 +2155 +2156 +2157 +2158 +2159 +2160 +2161 +2162 +2163 +2164 +2165 +2166 +2167 +2168 +2169 +2170 +2171 +2172 +2173 +2174 +2175 +2176 +2177 +2178 +2179 +2180 +2181 +2182 +2183 +2184 +2185 +2186 +2187 +2188 +2189 +2190 +2191 +2192 +2193 +2194 +2195 +2196 +2197 +2198 +2199 +2200 +2201 +2202 +2203 +2204 +2205 +2206 +2207 +2208 +2209 +2210 +2211 +2212 +2213 +2214 +2215 +2216 +2217 +2218 +2219 +2220 +2221 +2222 +2223 +2224 +2225 +2226 +2227 +2228 +2229 +2230 +2231 +2232 +2233 +2234 +2235 +2236 +2237 +2238 +2239 +2240 +2241 +2242 +2243 +2244 +2245 +2246 +2247 +2248 +2249 +2250 +2251 +2252 +2253 +2254 +2255 +2256 +2257 +2258 +2259 +2260 +2261 +2262 +2263 +2264 +2265 +2266 +2267 +2268 +2269 +2270 +2271 +2272 +2273 +2274 +2275 +2276 +2277 +2278 +2279 +2280 +2281 +2282 +2283 +2284 +2285 +2286 +2287 +2288 +2289 +2290 +2291 +2292 +2293 +2294 +2295 +2296 +2297 +2298 +2299 +2300 +2301 +2302 +2303 +2304 +2305 +2306 +2307 +2308 +2309 +2310 +2311 +2312 +2313 +2314 +2315 +2316 +2317 +2318 +2319 +2320 +2321 +2322 +2323 +2324 +2325 +2326 +2327 +2328 +2329 +2330 +2331 +2332 +2333 +2334 +2335 +2336 +2337 +2338 +2339 +2340 +2341 +2342 +2343 +2344 +2345 +2346 +2347 +2348 +2349 +2350 +2351 +2352 +2353 +2354 +2355 +2356 +2357 +2358 +2359 +2360 +2361 +2362 +2363 +2364 +2365 +2366 +2367 +2368 +2369 +2370 +2371 +2372 +2373 +2374 +2375 +2376 +2377 +2378 +2379 +2380 +2381 +2382 +2383 +2384 +2385 +2386 +2387 +2388 +2389 +2390 +2391 +2392 +2393 +2394 +2395 +2396 +2397 +2398 +2399 +2400 +2401 +2402 +2403 +2404 +2405 +2406 +2407 +2408 +2409 +2410 +2411 +2412 +2413 +2414 +2415 +2416 +2417 +2418 +2419 +2420 +2421 +2422 +2423 +2424 +2425 +2426 +2427 +2428 +2429 +2430 +2431 +2432 +2433 +2434 +2435 +2436 +2437 +2438 +2439 +2440 +2441 +2442 +2443 +2444 +2445 +2446 +2447 +2448 +2449 +2450 +2451 +2452 +2453 +2454 +2455 +2456 +2457 +2458 +2459 +2460 +2461 +2462 +2463 +2464 +2465 +2466 +2467 +2468 +2469 +2470 +2471 +2472 +2473 +2474 +2475 +2476 +2477 +2478 +2479 +2480 +2481 +2482 +2483 +2484 +2485 +2486 +2487 +2488 +2489 +2490 +2491 +2492 +2493 +2494 +2495 +2496 +2497 +2498 +2499 +2500 +2501 +2502 +2503 +2504 +2505 +2506 +2507 +2508 +2509 +2510 +2511 +2512 +2513 +2514 +2515 +2516 +2517 +2518 +2519 +2520 +2521 +2522 +2523 +2524 +2525 +2526 +2527 +2528 +2529 +2530 +2531 +2532 +2533 +2534 +2535 +2536 +2537 +2538 +2539 +2540 +2541 +2542 +2543 +2544 +2545 +2546 +2547 +2548 +2549 +2550 +2551 +2552 +2553 +2554 +2555 +2556 +2557 +2558 +2559 +2560 +2561 +2562 +2563 +2564 +2565 +2566 +2567 +2568 +2569 +2570 +2571 +2572 +2573 +2574 +2575 +2576 +2577 +2578 +2579 +2580 +2581 +2582 +2583 +2584 +2585 +2586 +2587 +2588 +2589 +2590 +2591 +2592 +2593 +2594 +2595 +2596 +2597 +2598 +2599 +2600 +2601 +2602 +2603 +2604 +2605 +2606 +2607 +2608 +2609 +2610 +2611 +2612 +2613 +2614 +2615 +2616 +2617 +2618 +2619 +2620 +2621 +2622 +2623 +2624 +2625 +2626 +2627 +2628 +2629 +2630 +2631 +2632 +2633 +2634 +2635 +2636 +2637 +2638 +2639 +2640 +2641 +2642 +2643 +2644 +2645 +2646 +2647 +2648 +2649 +2650 +2651 +2652 +2653 +2654 +2655 +2656 +2657 +2658 +2659 +2660 +2661 +2662 +2663 +2664 +2665 +2666 +2667 +2668 +2669 +2670 +2671 +2672 +2673 +2674 +2675 +2676 +2677 +2678 +2679 +2680 +2681 +2682 +2683 +2684 +2685 +2686 +2687 +2688 +2689 +2690 +2691 +2692 +2693 +2694 +2695 +2696 +2697 +2698 +2699 +2700 +2701 +2702 +2703 +2704 +2705 +2706 +2707 +2708 +2709 +2710 +2711 +2712 +2713 +2714 +2715 +2716 +2717 +2718 +2719 +2720 +2721 +2722 +2723 +2724 +2725 +2726 +2727 +2728 +2729 +2730 +2731 +2732 +2733 +2734 +2735 +2736 +2737 +2738 +2739 +2740 +2741 +2742 +2743 +2744 +2745 +2746 +2747 +2748 +2749 +2750 +2751 +2752 +2753 +2754 +2755 +2756 +2757 +2758 +2759 +2760 +2761 +2762 +2763 +2764 +2765 +2766 +2767 +2768 +2769 +2770 +2771 +2772 +2773 +2774 +2775 +2776 +2777 +2778 +2779 +2780 +2781 +2782 +2783 +2784 +2785 +2786 +2787 +2788 +2789 +2790 +2791 +2792 +2793 +2794 +2795 +2796 +2797 +2798 +2799 +2800 +2801 +2802 +2803 +2804 +2805 +2806 +2807 +2808 +2809 +2810 +2811 +2812 +2813 +2814 +2815 +2816 +2817 +2818 +2819 +2820 +2821 +2822 +2823 +2824 +2825 +2826 +2827 +2828 +2829 +2830 +2831 +2832 +2833 +2834 +2835 +2836 +2837 +2838 +2839 +2840 +2841 +2842 +2843 +2844 +2845 +2846 +2847 +2848 +2849 +2850 +2851 +2852 +2853 +2854 +2855 +2856 +2857 +2858 +2859 +2860 +2861 +2862 +2863 +2864 +2865 +2866 +2867 +2868 +2869 +2870 +2871 +2872 +2873 +2874 +2875 +2876 +2877 +2878 +2879 +2880 +2881 +2882 +2883 +2884 +2885 +2886 +2887 +2888 +2889 +2890 +2891 +2892 +2893 +2894 +2895 +2896 +2897 +2898 +2899 +2900 +2901 +2902 +2903 +2904 +2905 +2906 +2907 +2908 +2909 +2910 +2911 +2912 +2913 +2914 +2915 +2916 +2917 +2918 +2919 +2920 +2921 +2922 +2923 +2924 +2925 +2926 +2927 +2928 +2929 +2930 +2931 +2932 +2933 +2934 +2935 +2936 +2937 +2938 +2939 +2940 +2941 +2942 +2943 +2944 +2945 +2946 +2947 +2948 +2949 +2950 +2951 +2952 +2953 +2954 +2955 +2956 +2957 +2958 +2959 +2960 +2961 +2962 +2963 +2964 +2965 +2966 +2967 +2968 +2969 +2970 +2971 +2972 +2973 +2974 +2975 +2976 +2977 +2978 +2979 +2980 +2981 +2982 +2983 +2984 +2985 +2986 +2987 +2988 +2989 +2990 +2991 +2992 +2993 +2994 +2995 +2996 +2997 +2998 +2999 +3000 +3001 +3002 +3003 +3004 +3005 +3006 +3007 +3008 +3009 +3010 +3011 +3012 +3013 +3014 +3015 +3016 +3017 +3018 +3019 +3020 +3021 +3022 +3023 +3024 +3025 +3026 +3027 +3028 +3029 +3030 +3031 +3032 +3033 +3034 +3035 +3036 +3037 +3038 +3039 +3040 +3041 +3042 +3043 +3044 +3045 +3046 +3047 +3048 +3049 +3050 +3051 +3052 +3053 +3054 +3055 +3056 +3057 +3058 +3059 +3060 +3061 +3062 +3063 +3064 +3065 +3066 +3067 +3068 +3069 +3070 +3071 +3072 +3073 +3074 +3075 +3076 +3077 +3078 +3079 +3080 +3081 +3082 +3083 +3084 +3085 +3086 +3087 +3088 +3089 +3090 +3091 +3092 +3093 +3094 +3095 +3096 +3097 +3098 +3099 +3100 +3101 +3102 +3103 +3104 +3105 +3106 +3107 +3108 +3109 +3110 +3111 +3112 +3113 +3114 +3115 +3116 +3117 +3118 +3119 +3120 +3121 +3122 +3123 +3124 +3125 +3126 +3127 +3128 +3129 +3130 +3131 +3132 +3133 +3134 +3135 +3136 +3137 +3138 +3139 +3140 +3141 +3142 +3143 +3144 +3145 +3146 +3147 +3148 +3149 +3150 +3151 +3152 +3153 +3154 +3155 +3156 +3157 +3158 +3159 +3160 +3161 +3162 +3163 +3164 +3165 +3166 +3167 +3168 +3169 +3170 +3171 +3172 +3173 +3174 +3175 +3176 +3177 +3178 +3179 +3180 +3181 +3182 +3183 +3184 +3185 +3186 +3187 +3188 +3189 +3190 +3191 +3192 +3193 +3194 +3195 +3196 +3197 +3198 +3199 +3200 +3201 +3202 +3203 +3204 +3205 +3206 +3207 +3208 +3209 +3210 +3211 +3212 +3213 +3214 +3215 +3216 +3217 +3218 +3219 +3220 +3221 +3222 +3223 +3224 +3225 +3226 +3227 +3228 +3229 +3230 +3231 +3232 +3233 +3234 +3235 +3236 +3237 +3238 +3239 +3240 +3241 +3242 +3243 +3244 +3245 +3246 +3247 +3248 +3249 +3250 +3251 +3252 +3253 +3254 +3255 +3256 +3257 +3258 +3259 +3260 +3261 +3262 +3263 +3264 +3265 +3266 +3267 +3268 +3269 +3270 +3271 +3272 +3273 +3274 +3275 +3276 +3277 +3278 +3279 +3280 +3281 +3282 +3283 +3284 +3285 +3286 +3287 +3288 +3289 +3290 +3291 +3292 +3293 +3294 +3295 +3296 +3297 +3298 +3299 +3300 +3301 +3302 +3303 +3304 +3305 +3306 +3307 +3308 +3309 +3310 +3311 +3312 +3313 +3314 +3315 +3316 +3317 +3318 +3319 +3320 +3321 +3322 +3323 +3324 +3325 +3326 +3327 +3328 +3329 +3330 +3331 +3332 +3333 +3334 +3335 +3336 +3337 +3338 +3339 +3340 +3341 +3342 +3343 +3344 +3345 +3346 +3347 +3348 +3349 +3350 +3351 +3352 +3353 +3354 +3355 +3356 +3357 +3358 +3359 +3360 +3361 +3362 +3363 +3364 +3365 +3366 +3367 +3368 +3369 +3370 +3371 +3372 +3373 +3374 +3375 +3376 +3377 +3378 +3379 +3380 +3381 +3382 +3383 +3384 +3385 +3386 +3387 +3388 +3389 +3390 +3391 +3392 +3393 +3394 +3395 +3396 +3397 +3398 +3399 +3400 +3401 +3402 +3403 +3404 +3405 +3406 +3407 +3408 +3409 +3410 +3411 +3412 +3413 +3414 +3415 +3416 +3417 +3418 +3419 +3420 +3421 +3422 +3423 +3424 +3425 +3426 +3427 +3428 +3429 +3430 +3431 +3432 +3433 +3434 +3435 +3436 +3437 +3438 +3439 +3440 +3441 +3442 +3443 +3444 +3445 +3446 +3447 +3448 +3449 +3450 +3451 +3452 +3453 +3454 +3455 +3456 +3457 +3458 +3459 +3460 +3461 +3462 +3463 +3464 +3465 +3466 +3467 +3468 +3469 +3470 +3471 +3472 +3473 +3474 +3475 +3476 +3477 +3478 +3479 +3480 +3481 +3482 +3483 +3484 +3485 +3486 +3487 +3488 +3489 +3490 +3491 +3492 +3493 +3494 +3495 +3496 +3497 +3498 +3499 +3500 +3501 +3502 +3503 +3504 +3505 +3506 +3507 +3508 +3509 +3510 +3511 +3512 +3513 +3514 +3515 +3516 +3517 +3518 +3519 +3520 +3521 +3522 +3523 +3524 +3525 +3526 +3527 +3528 +3529 +3530 +3531 +3532 +3533 +3534 +3535 +3536 +3537 +3538 +3539 +3540 +3541 +3542 +3543 +3544 +3545 +3546 +3547 +3548 +3549 +3550 +3551 +3552 +3553 +3554 +3555 +3556 +3557 +3558 +3559 +3560 +3561 +3562 +3563 +3564 +3565 +3566 +3567 +3568 +3569 +3570 +3571 +3572 +3573 +3574 +3575 +3576 +3577 +3578 +3579 +3580 +3581 +3582 +3583 +3584 +3585 +3586 +3587 +3588 +3589 +3590 +3591 +3592 +3593 +3594 +3595 +3596 +3597 +3598 +3599 +3600 +3601 +3602 +3603 +3604 +3605 +3606 +3607 +3608 +3609 +3610 +3611 +3612 +3613 +3614 +3615 +3616 +3617 +3618 +3619 +3620 +3621 +3622 +3623 +3624 +3625 +3626 +3627 +3628 +3629 +3630 +3631 +3632 +3633 +3634 +3635 +3636 +3637 +3638 +3639 +3640 +3641 +3642 +3643 +3644 +3645 +3646 +3647 +3648 +3649 +3650 +3651 +3652 +3653 +3654 +3655 +3656 +3657 +3658 +3659 +3660 +3661 +3662 +3663 +3664 +3665 +3666 +3667 +3668 +3669 +3670 +3671 +3672 +3673 +3674 +3675 +3676 +3677 +3678 +3679 +3680 +3681 +3682 +3683 +3684 +3685 +3686 +3687 +3688 +3689 +3690 +3691 +3692 +3693 +3694 +3695 +3696 +3697 +3698 +3699 +3700 +3701 +3702 +3703 +3704 +3705 +3706 +3707 +3708 +3709 +3710 +3711 +3712 +3713 +3714 +3715 +3716 +3717 +3718 +3719 +3720 +3721 +3722 +3723 +3724 +3725 +3726 +3727 +3728 +3729 +3730 +3731 +3732 +3733 +3734 +3735 +3736 +3737 +3738 +3739 +3740 +3741 +3742 +3743 +3744 +3745 +3746 +3747 +3748 +3749 +3750 +3751 +3752 +3753 +3754 +3755 +3756 +3757 +3758 +3759 +3760 +3761 +3762 +3763 +3764 +3765 +3766 +3767 +3768 +3769 +3770 +3771 +3772 +3773 +3774 +3775 +3776 +3777 +3778 +3779 +3780 +3781 +3782 +3783 +3784 +3785 +3786 +3787 +3788 +3789 +3790 +3791 +3792 +3793 +3794 +3795 +3796 +3797 +3798 +3799 +3800 +3801 +3802 +3803 +3804 +3805 +3806 +3807 +3808 +3809 +3810 +3811 +3812 +3813 +3814 +3815 +3816 +3817 +3818 +3819 +3820 +3821 +3822 +3823 +3824 +3825 +3826 +3827 +3828 +3829 +3830 +3831 +3832 +3833 +3834 +3835 +3836 +3837 +3838 +3839 +3840 +3841 +3842 +3843 +3844 +3845 +3846 +3847 +3848 +3849 +3850 +3851 +3852 +3853 +3854 +3855 +3856 +3857 +3858 +3859 +3860 +3861 +3862 +3863 +3864 +3865 +3866 +3867 +3868 +3869 +3870 +3871 +3872 +3873 +3874 +3875 +3876 +3877 +3878 +3879 +3880 +3881 +3882 +3883 +3884 +3885 +3886 +3887 +3888 +3889 +3890 +3891 +3892 +3893 +3894 +3895 +3896 +3897 +3898 +3899 +3900 +3901 +3902 +3903 +3904 +3905 +3906 +3907 +3908 +3909 +3910 +3911 +3912 +3913 +3914 +3915 +3916 +3917 +3918 +3919 +3920 +3921 +3922 +3923 +3924 +3925 +3926 +3927 +3928 +3929 +3930 +3931 +3932 +3933 +3934 +3935 +3936 +3937 +3938 +3939 +3940 +3941 +3942 +3943 +3944 +3945 +3946 +3947 +3948 +3949 +3950 +3951 +3952 +3953 +3954 +3955 +3956 +3957 +3958 +3959 +3960 +3961 +3962 +3963 +3964 +3965 +3966 +3967 +3968 +3969 +3970 +3971 +3972 +3973 +3974 +3975 +3976 +3977 +3978 +3979 +3980 +3981 +3982 +3983 +3984 +3985 +3986 +3987 +3988 +3989 +3990 +3991 +3992 +3993 +3994 +3995 +3996 +3997 +3998 +3999 +4000 +4001 +4002 +4003 +4004 +4005 +4006 +4007 +4008 +4009 +4010 +4011 +4012 +4013 +4014 +4015 +4016 +4017 +4018 +4019 +4020 +4021 +4022 +4023 +4024 +4025 +4026 +4027 +4028 +4029 +4030 +4031 +4032 +4033 +4034 +4035 +4036 +4037 +4038 +4039 +4040 +4041 +4042 +4043 +4044 +4045 +4046 +4047 +4048 +4049 +4050 +4051 +4052 +4053 +4054 +4055 +4056 +4057 +4058 +4059 +4060 +4061 +4062 +4063 +4064 +4065 +4066 +4067 +4068 +4069 +4070 +4071 +4072 +4073 +4074 +4075 +4076 +4077 +4078 +4079 +4080 +4081 +4082 +4083 +4084 +4085 +4086 +4087 +4088 +4089 +4090 +4091 +4092 +4093 +4094 +4095 +4096 +4097 +4098 +4099 +4100 +4101 +4102 +4103 +4104 +4105 +4106 +4107 +4108 +4109 +4110 +4111 +4112 +4113 +4114 +4115 +4116 +4117 +4118 +4119 +4120 +4121 +4122 +4123 +4124 +4125 +4126 +4127 +4128 +4129 +4130 +4131 +4132 +4133 +4134 +4135 +4136 +4137 +4138 +4139 +4140 +4141 +4142 +4143 +4144 +4145 +4146 +4147 +4148 +4149 +4150 +4151 +4152 +4153 +4154 +4155 +4156 +4157 +4158 +4159 +4160 +4161 +4162 +4163 +4164 +4165 +4166 +4167 +4168 +4169 +4170 +4171 +4172 +4173 +4174 +4175 +4176 +4177 +4178 +4179 +4180 +4181 +4182 +4183 +4184 +4185 +4186 +4187 +4188 +4189 +4190 +4191 +4192 +4193 +4194 +4195 +4196 +4197 +4198 +4199 +4200 +4201 +4202 +4203 +4204 +4205 +4206 +4207 +4208 +4209 +4210 +4211 +4212 +4213 +4214 +4215 +4216 +4217 +4218 +4219 +4220 +4221 +4222 +4223 +4224 +4225 +4226 +4227 +4228 +4229 +4230 +4231 +4232 +4233 +4234 +4235 +4236 +4237 +4238 +4239 +4240 +4241 +4242 +4243 +4244 +4245 +4246 +4247 +4248 +4249 +4250 +4251 +4252 +4253 +4254 +4255 +4256 +4257 +4258 +4259 +4260 +4261 +4262 +4263 +4264 +4265 +4266 +4267 +4268 +4269 +4270 +4271 +4272 +4273 +4274 +4275 +4276 +4277 +4278 +4279 +4280 +4281 +4282 +4283 +4284 +4285 +4286 +4287 +4288 +4289 +4290 +4291 +4292 +4293 +4294 +4295 +4296 +4297 +4298 +4299 +4300 +4301 +4302 +4303 +4304 +4305 +4306 +4307 +4308 +4309 +4310 +4311 +4312 +4313 +4314 +4315 +4316 +4317 +4318 +4319 +4320 +4321 +4322 +4323 +4324 +4325 +4326 +4327 +4328 +4329 +4330 +4331 +4332 +4333 +4334 +4335 +4336 +4337 +4338 +4339 +4340 +4341 +4342 +4343 +4344 +4345 +4346 +4347 +4348 +4349 +4350 +4351 +4352 +4353 +4354 +4355 +4356 +4357 +4358 +4359 +4360 +4361 +4362 +4363 +4364 +4365 +4366 +4367 +4368 +4369 +4370 +4371 +4372 +4373 +4374 +4375 +4376 +4377 +4378 +4379 +4380 +4381 +4382 +4383 +4384 +4385 +4386 +4387 +4388 +4389 +4390 +4391 +4392 +4393 +4394 +4395 +4396 +4397 +4398 +4399 +4400 +4401 +4402 +4403 +4404 +4405 +4406 +4407 +4408 +4409 +4410 +4411 +4412 +4413 +4414 +4415 +4416 +4417 +4418 +4419 +4420 +4421 +4422 +4423 +4424 +4425 +4426 +4427 +4428 +4429 +4430 +4431 +4432 +4433 +4434 +4435 +4436 +4437 +4438 +4439 +4440 +4441 +4442 +4443 +4444 +4445 +4446 +4447 +4448 +4449 +4450 +4451 +4452 +4453 +4454 +4455 +4456 +4457 +4458 +4459 +4460 +4461 +4462 +4463 +4464 +4465 +4466 +4467 +4468 +4469 +4470 +4471 +4472 +4473 +4474 +4475 +4476 +4477 +4478 +4479 +4480 +4481 +4482 +4483 +4484 +4485 +4486 +4487 +4488 +4489 +4490 +4491 +4492 +4493 +4494 +4495 +4496 +4497 +4498 +4499 +4500 +4501 +4502 +4503 +4504 +4505 +4506 +4507 +4508 +4509 +4510 +4511 +4512 +4513 +4514 +4515 +4516 +4517 +4518 +4519 +4520 +4521 +4522 +4523 +4524 +4525 +4526 +4527 +4528 +4529 +4530 +4531 +4532 +4533 +4534 +4535 +4536 +4537 +4538 +4539 +4540 +4541 +4542 +4543 +4544 +4545 +4546 +4547 +4548 +4549 +4550 +4551 +4552 +4553 +4554 +4555 +4556 +4557 +4558 +4559 +4560 +4561 +4562 +4563 +4564 +4565 +4566 +4567 +4568 +4569 +4570 +4571 +4572 +4573 +4574 +4575 +4576 +4577 +4578 +4579 +4580 +4581 +4582 +4583 +4584 +4585 +4586 +4587 +4588 +4589 +4590 +4591 +4592 +4593 +4594 +4595 +4596 +4597 +4598 +4599 +4600 +4601 +4602 +4603 +4604 +4605 +4606 +4607 +4608 +4609 +4610 +4611 +4612 +4613 +4614 +4615 +4616 +4617 +4618 +4619 +4620 +4621 +4622 +4623 +4624 +4625 +4626 +4627 +4628 +4629 +4630 +4631 +4632 +4633 +4634 +4635 +4636 +4637 +4638 +4639 +4640 +4641 +4642 +4643 +4644 +4645 +4646 +4647 +4648 +4649 +4650 +4651 +4652 +4653 +4654 +4655 +4656 +4657 +4658 +4659 +4660 +4661 +4662 +4663 +4664 +4665 +4666 +4667 +4668 +4669 +4670 +4671 +4672 +4673 +4674 +4675 +4676 +4677 +4678 +4679 +4680 +4681 +4682 +4683 +4684 +4685 +4686 +4687 +4688 +4689 +4690 +4691 +4692 +4693 +4694 +4695 +4696 +4697 +4698 +4699 +4700 +4701 +4702 +4703 +4704 +4705 +4706 +4707 +4708 +4709 +4710 +4711 +4712 +4713 +4714 +4715 +4716 +4717 +4718 +4719 +4720 +4721 +4722 +4723 +4724 +4725 +4726 +4727 +4728 +4729 +4730 +4731 +4732 +4733 +4734 +4735 +4736 +4737 +4738 +4739 +4740 +4741 +4742 +4743 +4744 +4745 +4746 +4747 +4748 +4749 +4750 +4751 +4752 +4753 +4754 +4755 +4756 +4757 +4758 +4759 +4760 +4761 +4762 +4763 +4764 +4765 +4766 +4767 +4768 +4769 +4770 +4771 +4772 +4773 +4774 +4775 +4776 +4777 +4778 +4779 +4780 +4781 +4782 +4783 +4784 +4785 +4786 +4787 +4788 +4789 +4790 +4791 +4792 +4793 +4794 +4795 +4796 +4797 +4798 +4799 +4800 +4801 +4802 +4803 +4804 +4805 +4806 +4807 +4808 +4809 +4810 +4811 +4812 +4813 +4814 +4815 +4816 +4817 +4818 +4819 +4820 +4821 +4822 +4823 +4824 +4825 +4826 +4827 +4828 +4829 +4830 +4831 +4832 +4833 +4834 +4835 +4836 +4837 +4838 +4839 +4840 +4841 +4842 +4843 +4844 +4845 +4846 +4847 +4848 +4849 +4850 +4851 +4852 +4853 +4854 +4855 +4856 +4857 +4858 +4859 +4860 +4861 +4862 +4863 +4864 +4865 +4866 +4867 +4868 +4869 +4870 +4871 +4872 +4873 +4874 +4875 +4876 +4877 +4878 +4879 +4880 +4881 +4882 +4883 +4884 +4885 +4886 +4887 +4888 +4889 +4890 +4891 +4892 +4893 +4894 +4895 +4896 +4897 +4898 +4899 +4900 +4901 +4902 +4903 +4904 +4905 +4906 +4907 +4908 +4909 +4910 +4911 +4912 +4913 +4914 +4915 +4916 +4917 +4918 +4919 +4920 +4921 +4922 +4923 +4924 +4925 +4926 +4927 +4928 +4929 +4930 +4931 +4932 +4933 +4934 +4935 +4936 +4937 +4938 +4939 +4940 +4941 +4942 +4943 +4944 +4945 +4946 +4947 +4948 +4949 +4950 +4951 +4952 +4953 +4954 +4955 +4956 +4957 +4958 +4959 +4960 +4961 +4962 +4963 +4964 +4965 +4966 +4967 +4968 +4969 +4970 +4971 +4972 +4973 +4974 +4975 +4976 +4977 +4978 +4979 +4980 +4981 +4982 +4983 +4984 +4985 +4986 +4987 +4988 +4989 +4990 +4991 +4992 +4993 +4994 +4995 +4996 +4997 +4998 +4999 +5000 +5001 +5002 +5003 +5004 +5005 +5006 +5007 +5008 +5009 +5010 +5011 +5012 +5013 +5014 +5015 +5016 +5017 +5018 +5019 +5020 +5021 +5022 +5023 +5024 +5025 +5026 +5027 +5028 +5029 +5030 +5031 +5032 +5033 +5034 +5035 +5036 +5037 +5038 +5039 +5040 +5041 +5042 +5043 +5044 +5045 +5046 +5047 +5048 +5049 +5050 +5051 +5052 +5053 +5054 +5055 +5056 +5057 +5058 +5059 +5060 +5061 +5062 +5063 +5064 +5065 +5066 +5067 +5068 +5069 +5070 +5071 +5072 +5073 +5074 +5075 +5076 +5077 +5078 +5079 +5080 +5081 +5082 +5083 +5084 +5085 +5086 +5087 +5088 +5089 +5090 +5091 +5092 +5093 +5094 +5095 +5096 +5097 +5098 +5099 +5100 +5101 +5102 +5103 +5104 +5105 +5106 +5107 +5108 +5109 +5110 +5111 +5112 +5113 +5114 +5115 +5116 +5117 +5118 +5119 +5120 +5121 +5122 +5123 +5124 +5125 +5126 +5127 +5128 +5129 +5130 +5131 +5132 +5133 +5134 +5135 +5136 +5137 +5138 +5139 +5140 +5141 +5142 +5143 +5144 +5145 +5146 +5147 +5148 +5149 +5150 +5151 +5152 +5153 +5154 +5155 +5156 +5157 +5158 +5159 +5160 +5161 +5162 +5163 +5164 +5165 +5166 +5167 +5168 +5169 +5170 +5171 +5172 +5173 +5174 +5175 +5176 +5177 +5178 +5179 +5180 +5181 +5182 +5183 +5184 +5185 +5186 +5187 +5188 +5189 +5190 +5191 +5192 +5193 +5194 +5195 +5196 +5197 +5198 +5199 +5200 +5201 +5202 +5203 +5204 +5205 +5206 +5207 +5208 +5209 +5210 +5211 +5212 +5213 +5214 +5215 +5216 +5217 +5218 +5219 +5220 +5221 +5222 +5223 +5224 +5225 +5226 +5227 +5228 +5229 +5230 +5231 +5232 +5233 +5234 +5235 +5236 +5237 +5238 +5239 +5240 +5241 +5242 +5243 +5244 +5245 +5246 +5247 +5248 +5249 +5250 +5251 +5252 +5253 +5254 +5255 +5256 +5257 +5258 +5259 +5260 +5261 +5262 +5263 +5264 +5265 +5266 +5267 +5268 +5269 +5270 +5271 +5272 +5273 +5274 +5275 +5276 +5277 +5278 +5279 +5280 +5281 +5282 +5283 +5284 +5285 +5286 +5287 +5288 +5289 +5290 +5291 +5292 +5293 +5294 +5295 +5296 +5297 +5298 +5299 +5300 +5301 +5302 +5303 +5304 +5305 +5306 +5307 +5308 +5309 +5310 +5311 +5312 +5313 +5314 +5315 +5316 +5317 +5318 +5319 +5320 +5321 +5322 +5323 +5324 +5325 +5326 +5327 +5328 +5329 +5330 +5331 +5332 +5333 +5334 +5335 +5336 +5337 +5338 +5339 +5340 +5341 +5342 +5343 +5344 +5345 +5346 +5347 +5348 +5349 +5350 +5351 +5352 +5353 +5354 +5355 +5356 +5357 +5358 +5359 +5360 +5361 +5362 +5363 +5364 +5365 +5366 +5367 +5368 +5369 +5370 +5371 +5372 +5373 +5374 +5375 +5376 +5377 +5378 +5379 +5380 +5381 +5382 +5383 +5384 +5385 +5386 +5387 +5388 +5389 +5390 +5391 +5392 +5393 +5394 +5395 +5396 +5397 +5398 +5399 +5400 +5401 +5402 +5403 +5404 +5405 +5406 +5407 +5408 +5409 +5410 +5411 +5412 +5413 +5414 +5415 +5416 +5417 +5418 +5419 +5420 +5421 +5422 +5423 +5424 +5425 +5426 +5427 +5428 +5429 +5430 +5431 +5432 +5433 +5434 +5435 +5436 +5437 +5438 +5439 +5440 +5441 +5442 +5443 +5444 +5445 +5446 +5447 +5448 +5449 +5450 +5451 +5452 +5453 +5454 +5455 +5456 +5457 +5458 +5459 +5460 +5461 +5462 +5463 +5464 +5465 +5466 +5467 +5468 +5469 +5470 +5471 +5472 +5473 +5474 +5475 +5476 +5477 +5478 +5479 +5480 +5481 +5482 +5483 +5484 +5485 +5486 +5487 +5488 +5489 +5490 +5491 +5492 +5493 +5494 +5495 +5496 +5497 +5498 +5499 +5500 +5501 +5502 +5503 +5504 +5505 +5506 +5507 +5508 +5509 +5510 +5511 +5512 +5513 +5514 +5515 +5516 +5517 +5518 +5519 +5520 +5521 +5522 +5523 +5524 +5525 +5526 +5527 +5528 +5529 +5530 +5531 +5532 +5533 +5534 +5535 +5536 +5537 +5538 +5539 +5540 +5541 +5542 +5543 +5544 +5545 +5546 +5547 +5548 +5549 +5550 +5551 +5552 +5553 +5554 +5555 +5556 +5557 +5558 +5559 +5560 +5561 +5562 +5563 +5564 +5565 +5566 +5567 +5568 +5569 +5570 +5571 +5572 +5573 +5574 +5575 +5576 +5577 +5578 +5579 +5580 +5581 +5582 +5583 +5584 +5585 +5586 +5587 +5588 +5589 +5590 +5591 +5592 +5593 +5594 +5595 +5596 +5597 +5598 +5599 +5600 +5601 +5602 +5603 +5604 +5605 +5606 +5607 +5608 +5609 +5610 +5611 +5612 +5613 +5614 +5615 +5616 +5617 +5618 +5619 +5620 +5621 +5622 +5623 +5624 +5625 +5626 +5627 +5628 +5629 +5630 +5631 +5632 +5633 +5634 +5635 +5636 +5637 +5638 +5639 +5640 +5641 +5642 +5643 +5644 +5645 +5646 +5647 +5648 +5649 +5650 +5651 +5652 +5653 +5654 +5655 +5656 +5657 +5658 +5659 +5660 +5661 +5662 +5663 +5664 +5665 +5666 +5667 +5668 +5669 +5670 +5671 +5672 +5673 +5674 +5675 +5676 +5677 +5678 +5679 +5680 +5681 +5682 +5683 +5684 +5685 +5686 +5687 +5688 +5689 +5690 +5691 +5692 +5693 +5694 +5695 +5696 +5697 +5698 +5699 +5700 +5701 +5702 +5703 +5704 +5705 +5706 +5707 +5708 +5709 +5710 +5711 +5712 +5713 +5714 +5715 +5716 +5717 +5718 +5719 +5720 +5721 +5722 +5723 +5724 +5725 +5726 +5727 +5728 +5729 +5730 +5731 +5732 +5733 +5734 +5735 +5736 +5737 +5738 +5739 +5740 +5741 +5742 +5743 +5744 +5745 +5746 +5747 +5748 +5749 +5750 +5751 +5752 +5753 +5754 +5755 +5756 +5757 +5758 +5759 +5760 +5761 +5762 +5763 +5764 +5765 +5766 +5767 +5768 +5769 +5770 +5771 +5772 +5773 +5774 +5775 +5776 +5777 +5778 +5779 +5780 +5781 +5782 +5783 +5784 +5785 +5786 +5787 +5788 +5789 +5790 +5791 +5792 +5793 +5794 +5795 +5796 +5797 +5798 +5799 +5800 +5801 +5802 +5803 +5804 +5805 +5806 +5807 +5808 +5809 +5810 +5811 +5812 +5813 +5814 +5815 +5816 +5817 +5818 +5819 +5820 +5821 +5822 +5823 +5824 +5825 +5826 +5827 +5828 +5829 +5830 +5831 +5832 +5833 +5834 +5835 +5836 +5837 +5838 +5839 +5840 +5841 +5842 +5843 +5844 +5845 +5846 +5847 +5848 +5849 +5850 +5851 +5852 +5853 +5854 +5855 +5856 +5857 +5858 +5859 +5860 +5861 +5862 +5863 +5864 +5865 +5866 +5867 +5868 +5869 +5870 +5871 +5872 +5873 +5874 +5875 +5876 +5877 +5878 +5879 +5880 +5881 +5882 +5883 +5884 +5885 +5886 +5887 +5888 +5889 +5890 +5891 +5892 +5893 +5894 +5895 +5896 +5897 +5898 +5899 +5900 +5901 +5902 +5903 +5904 +5905 +5906 +5907 +5908 +5909 +5910 +5911 +5912 +5913 +5914 +5915 +5916 +5917 +5918 +5919 +5920 +5921 +5922 +5923 +5924 +5925 +5926 +5927 +5928 +5929 +5930 +5931 +5932 +5933 +5934 +5935 +5936 +5937 +5938 +5939 +5940 +5941 +5942 +5943 +5944 +5945 +5946 +5947 +5948 +5949 +5950 +5951 +5952 +5953 +5954 +5955 +5956 +5957 +5958 +5959 +5960 +5961 +5962 +5963 +5964 +5965 +5966 +5967 +5968 +5969 +5970 +5971 +5972 +5973 +5974 +5975 +5976 +5977 +5978 +5979 +5980 +5981 +5982 +5983 +5984 +5985 +5986 +5987 +5988 +5989 +5990 +5991 +5992 +5993 +5994 +5995 +5996 +5997 +5998 +5999 +6000 +6001 +6002 +6003 +6004 +6005 +6006 +6007 +6008 +6009 +6010 +6011 +6012 +6013 +6014 +6015 +6016 +6017 +6018 +6019 +6020 +6021 +6022 +6023 +6024 +6025 +6026 +6027 +6028 +6029 +6030 +6031 +6032 +6033 +6034 +6035 +6036 +6037 +6038 +6039 +6040 +6041 +6042 +6043 +6044 +6045 +6046 +6047 +6048 +6049 +6050 +6051 +6052 +6053 +6054 +6055 +6056 +6057 +6058 +6059 +6060 +6061 +6062 +6063 +6064 +6065 +6066 +6067 +6068 +6069 +6070 +6071 +6072 +6073 +6074 +6075 +6076 +6077 +6078 +6079 +6080 +6081 +6082 +6083 +6084 +6085 +6086 +6087 +6088 +6089 +6090 +6091 +6092 +6093 +6094 +6095 +6096 +6097 +6098 +6099 +6100 +6101 +6102 +6103 +6104 +6105 +6106 +6107 +6108 +6109 +6110 +6111 +6112 +6113 +6114 +6115 +6116 +6117 +6118 +6119 +6120 +6121 +6122 +6123 +6124 +6125 +6126 +6127 +6128 +6129 +6130 +6131 +6132 +6133 +6134 +6135 +6136 +6137 +6138 +6139 +6140 +6141 +6142 +6143 +6144 +6145 +6146 +6147 +6148 +6149 +6150 +6151 +6152 +6153 +6154 +6155 +6156 +6157 +6158 +6159 +6160 +6161 +6162 +6163 +6164 +6165 +6166 +6167 +6168 +6169 +6170 +6171 +6172 +6173 +6174 +6175 +6176 +6177 +6178 +6179 +6180 +6181 +6182 +6183 +6184 +6185 +6186 +6187 +6188 +6189 +6190 +6191 +6192 +6193 +6194 +6195 +6196 +6197 +6198 +6199 +6200 +6201 +6202 +6203 +6204 +6205 +6206 +6207 +6208 +6209 +6210 +6211 +6212 +6213 +6214 +6215 +6216 +6217 +6218 +6219 +6220 +6221 +6222 +6223 +6224 +6225 +6226 +6227 +6228 +6229 +6230 +6231 +6232 +6233 +6234 +6235 +6236 +6237 +6238 +6239 +6240 +6241 +6242 +6243 +6244 +6245 +6246 +6247 +6248 +6249 +6250 +6251 +6252 +6253 +6254 +6255 +6256 +6257 +6258 +6259 +6260 +6261 +6262 +6263 +6264 +6265 +6266 +6267 +6268 +6269 +6270 +6271 +6272 +6273 +6274 +6275 +6276 +6277 +6278 +6279 +6280 +6281 +6282 +6283 +6284 +6285 +6286 +6287 +6288 +6289 +6290 +6291 +6292 +6293 +6294 +6295 +6296 +6297 +6298 +6299 +6300 +6301 +6302 +6303 +6304 +6305 +6306 +6307 +6308 +6309 +6310 +6311 +6312 +6313 +6314 +6315 +6316 +6317 +6318 +6319 +6320 +6321 +6322 +6323 +6324 +6325 +6326 +6327 +6328 +6329 +6330 +6331 +6332 +6333 +6334 +6335 +6336 +6337 +6338 +6339 +6340 +6341 +6342 +6343 +6344 +6345 +6346 +6347 +6348 +6349 +6350 +6351 +6352 +6353 +6354 +6355 +6356 +6357 +6358 +6359 +6360 +6361 +6362 +6363 +6364 +6365 +6366 +6367 +6368 +6369 +6370 +6371 +6372 +6373 +6374 +6375 +6376 +6377 +6378 +6379 +6380 +6381 +6382 +6383 +6384 +6385 +6386 +6387 +6388 +6389 +6390 +6391 +6392 +6393 +6394 +6395 +6396 +6397 +6398 +6399 +6400 +6401 +6402 +6403 +6404 +6405 +6406 +6407 +6408 +6409 +6410 +6411 +6412 +6413 +6414 +6415 +6416 +6417 +6418 +6419 +6420 +6421 +6422 +6423 +6424 +6425 +6426 +6427 +6428 +6429 +6430 +6431 +6432 +6433 +6434 +6435 +6436 +6437 +6438 +6439 +6440 +6441 +6442 +6443 +6444 +6445 +6446 +6447 +6448 +6449 +6450 +6451 +6452 +6453 +6454 +6455 +6456 +6457 +6458 +6459 +6460 +6461 +6462 +6463 +6464 +6465 +6466 +6467 +6468 +6469 +6470 +6471 +6472 +6473 +6474 +6475 +6476 +6477 +6478 +6479 +6480 +6481 +6482 +6483 +6484 +6485 +6486 +6487 +6488 +6489 +6490 +6491 +6492 +6493 +6494 +6495 +6496 +6497 +6498 +6499 +6500 +6501 +6502 +6503 +6504 +6505 +6506 +6507 +6508 +6509 +6510 +6511 +6512 +6513 +6514 +6515 +6516 +6517 +6518 +6519 +6520 +6521 +6522 +6523 +6524 +6525 +6526 +6527 +6528 +6529 +6530 +6531 +6532 +6533 +6534 +6535 +6536 +6537 +6538 +6539 +6540 +6541 +6542 +6543 +6544 +6545 +6546 +6547 +6548 +6549 +6550 +6551 +6552 +6553 +6554 +6555 +6556 +6557 +6558 +6559 +6560 +6561 +6562 +6563 +6564 +6565 +6566 +6567 +6568 +6569 +6570 +6571 +6572 +6573 +6574 +6575 +6576 +6577 +6578 +6579 +6580 +6581 +6582 +6583 +6584 +6585 +6586 +6587 +6588 +6589 +6590 +6591 +6592 +6593 +6594 +6595 +6596 +6597 +6598 +6599 +6600 +6601 +6602 +6603 +6604 +6605 +6606 +6607 +6608 +6609 +6610 +6611 +6612 +6613 +6614 +6615 +6616 +6617 +6618 +6619 +6620 +6621 +6622 +6623 +6624 +6625 +6626 +6627 +6628 +6629 +6630 +6631 +6632 +6633 +6634 +6635 +6636 +6637 +6638 +6639 +6640 +6641 +6642 +6643 +6644 +6645 +6646 +6647 +6648 +6649 +6650 +6651 +6652 +6653 +6654 +6655 +6656 +6657 +6658 +6659 +6660 +6661 +6662 +6663 +6664 +6665 +6666 +6667 +6668 +6669 +6670 +6671 +6672 +6673 +6674 +6675 +6676 +6677 +6678 +6679 +6680 +6681 +6682 +6683 +6684 +6685 +6686 +6687 +6688 +6689 +6690 +6691 +6692 +6693 +6694 +6695 +6696 +6697 +6698 +6699 +6700 +6701 +6702 +6703 +6704 +6705 +6706 +6707 +6708 +6709 +6710 +6711 +6712 +6713 +6714 +6715 +6716 +6717 +6718 +6719 +6720 +6721 +6722 +6723 +6724 +6725 +6726 +6727 +6728 +6729 +6730 +6731 +6732 +6733 +6734 +6735 +6736 +6737 +6738 +6739 +6740 +6741 +6742 +6743 +6744 +6745 +6746 +6747 +6748 +6749 +6750 +6751 +6752 +6753 +6754 +6755 +6756 +6757 +6758 +6759 +6760 +6761 +6762 +6763 +6764 +6765 +6766 +6767 +6768 +6769 +6770 +6771 +6772 +6773 +6774 +6775 +6776 +6777 +6778 +6779 +6780 +6781 +6782 +6783 +6784 +6785 +6786 +6787 +6788 +6789 +6790 +6791 +6792 +6793 +6794 +6795 +6796 +6797 +6798 +6799 +6800 +6801 +6802 +6803 +6804 +6805 +6806 +6807 +6808 +6809 +6810 +6811 +6812 +6813 +6814 +6815 +6816 +6817 +6818 +6819 +6820 +6821 +6822 +6823 +6824 +6825 +6826 +6827 +6828 +6829 +6830 +6831 +6832 +6833 +6834 +6835 +6836 +6837 +6838 +6839 +6840 +6841 +6842 +6843 +6844 +6845 +6846 +6847 +6848 +6849 +6850 +6851 +6852 +6853 +6854 +6855 +6856 +6857 +6858 +6859 +6860 +6861 +6862 +6863 +6864 +6865 +6866 +6867 +6868 +6869 +6870 +6871 +6872 +6873 +6874 +6875 +6876 +6877 +6878 +6879 +6880 +6881 +6882 +6883 +6884 +6885 +6886 +6887 +6888 +6889 +6890 +6891 +6892 +6893 +6894 +6895 +6896 +6897 +6898 +6899 +6900 +6901 +6902 +6903 +6904 +6905 +6906 +6907 +6908 +6909 +6910 +6911 +6912 +6913 +6914 +6915 +6916 +6917 +6918 +6919 +6920 +6921 +6922 +6923 +6924 +6925 +6926 +6927 +6928 +6929 +6930 +6931 +6932 +6933 +6934 +6935 +6936 +6937 +6938 +6939 +6940 +6941 +6942 +6943 +6944 +6945 +6946 +6947 +6948 +6949 +6950 +6951 +6952 +6953 +6954 +6955 +6956 +6957 +6958 +6959 +6960 +6961 +6962 +6963 +6964 +6965 +6966 +6967 +6968 +6969 +6970 +6971 +6972 +6973 +6974 +6975 +6976 +6977 +6978 +6979 +6980 +6981 +6982 +6983 +6984 +6985 +6986 +6987 +6988 +6989 +6990 +6991 +6992 +6993 +6994 +6995 +6996 +6997 +6998 +6999 +7000 +7001 +7002 +7003 +7004 +7005 +7006 +7007 +7008 +7009 +7010 +7011 +7012 +7013 +7014 +7015 +7016 +7017 +7018 +7019 +7020 +7021 +7022 +7023 +7024 +7025 +7026 +7027 +7028 +7029 +7030 +7031 +7032 +7033 +7034 +7035 +7036 +7037 +7038 +7039 +7040 +7041 +7042 +7043 +7044 +7045 +7046 +7047 +7048 +7049 +7050 +7051 +7052 +7053 +7054 +7055 +7056 +7057 +7058 +7059 +7060 +7061 +7062 +7063 +7064 +7065 +7066 +7067 +7068 +7069 +7070 +7071 +7072 +7073 +7074 +7075 +7076 +7077 +7078 +7079 +7080 +7081 +7082 +7083 +7084 +7085 +7086 +7087 +7088 +7089 +7090 +7091 +7092 +7093 +7094 +7095 +7096 +7097 +7098 +7099 +7100 +7101 +7102 +7103 +7104 +7105 +7106 +7107 +7108 +7109 +7110 +7111 +7112 +7113 +7114 +7115 +7116 +7117 +7118 +7119 +7120 +7121 +7122 +7123 +7124 +7125 +7126 +7127 +7128 +7129 +7130 +7131 +7132 +7133 +7134 +7135 +7136 +7137 +7138 +7139 +7140 +7141 +7142 +7143 +7144 +7145 +7146 +7147 +7148 +7149 +7150 +7151 +7152 +7153 +7154 +7155 +7156 +7157 +7158 +7159 +7160 +7161 +7162 +7163 +7164 +7165 +7166 +7167 +7168 +7169 +7170 +7171 +7172 +7173 +7174 +7175 +7176 +7177 +7178 +7179 +7180 +7181 +7182 +7183 +7184 +7185 +7186 +7187 +7188 +7189 +7190 +7191 +7192 +7193 +7194 +7195 +7196 +7197 +7198 +7199 +7200 +7201 +7202 +7203 +7204 +7205 +7206 +7207 +7208 +7209 +7210 +7211 +7212 +7213 +7214 +7215 +7216 +7217 +7218 +7219 +7220 +7221 +7222 +7223 +7224 +7225 +7226 +7227 +7228 +7229 +7230 +7231 +7232 +7233 +7234 +7235 +7236 +7237 +7238 +7239 +7240 +7241 +7242 +7243 +7244 +7245 +7246 +7247 +7248 +7249 +7250 +7251 +7252 +7253 +7254 +7255 +7256 +7257 +7258 +7259 +7260 +7261 +7262 +7263 +7264 +7265 +7266 +7267 +7268 +7269 +7270 +7271 +7272 +7273 +7274 +7275 +7276 +7277 +7278 +7279 +7280 +7281 +7282 +7283 +7284 +7285 +7286 +7287 +7288 +7289 +7290 +7291 +7292 +7293 +7294 +7295 +7296 +7297 +7298 +7299 +7300 +7301 +7302 +7303 +7304 +7305 +7306 +7307 +7308 +7309 +7310 +7311 +7312 +7313 +7314 +7315 +7316 +7317 +7318 +7319 +7320 +7321 +7322 +7323 +7324 +7325 +7326 +7327 +7328 +7329 +7330 +7331 +7332 +7333 +7334 +7335 +7336 +7337 +7338 +7339 +7340 +7341 +7342 +7343 +7344 +7345 +7346 +7347 +7348 +7349 +7350 +7351 +7352 +7353 +7354 +7355 +7356 +7357 +7358 +7359 +7360 +7361 +7362 +7363 +7364 +7365 +7366 +7367 +7368 +7369 +7370 +7371 +7372 +7373 +7374 +7375 +7376 +7377 +7378 +7379 +7380 +7381 +7382 +7383 +7384 +7385 +7386 +7387 +7388 +7389 +7390 +7391 +7392 +7393 +7394 +7395 +7396 +7397 +7398 +7399 +7400 +7401 +7402 +7403 +7404 +7405 +7406 +7407 +7408 +7409 +7410 +7411 +7412 +7413 +7414 +7415 +7416 +7417 +7418 +7419 +7420 +7421 +7422 +7423 +7424 +7425 +7426 +7427 +7428 +7429 +7430 +7431 +7432 +7433 +7434 +7435 +7436 +7437 +7438 +7439 +7440 +7441 +7442 +7443 +7444 +7445 +7446 +7447 +7448 +7449 +7450 +7451 +7452 +7453 +7454 +7455 +7456 +7457 +7458 +7459 +7460 +7461 +7462 +7463 +7464 +7465 +7466 +7467 +7468 +7469 +7470 +7471 +7472 +7473 +7474 +7475 +7476 +7477 +7478 +7479 +7480 +7481 +7482 +7483 +7484 +7485 +7486 +7487 +7488 +7489 +7490 +7491 +7492 +7493 +7494 +7495 +7496 +7497 +7498 +7499 +7500 +7501 +7502 +7503 +7504 +7505 +7506 +7507 +7508 +7509 +7510 +7511 +7512 +7513 +7514 +7515 +7516 +7517 +7518 +7519 +7520 +7521 +7522 +7523 +7524 +7525 +7526 +7527 +7528 +7529 +7530 +7531 +7532 +7533 +7534 +7535 +7536 +7537 +7538 +7539 +7540 +7541 +7542 +7543 +7544 +7545 +7546 +7547 +7548 +7549 +7550 +7551 +7552 +7553 +7554 +7555 +7556 +7557 +7558 +7559 +7560 +7561 +7562 +7563 +7564 +7565 +7566 +7567 +7568 +7569 +7570 +7571 +7572 +7573 +7574 +7575 +7576 +7577 +7578 +7579 +7580 +7581 +7582 +7583 +7584 +7585 +7586 +7587 +7588 +7589 +7590 +7591 +7592 +7593 +7594 +7595 +7596 +7597 +7598 +7599 +7600 +7601 +7602 +7603 +7604 +7605 +7606 +7607 +7608 +7609 +7610 +7611 +7612 +7613 +7614 +7615 +7616 +7617 +7618 +7619 +7620 +7621 +7622 +7623 +7624 +7625 +7626 +7627 +7628 +7629 +7630 +7631 +7632 +7633 +7634 +7635 +7636 +7637 +7638 +7639 +7640 +7641 +7642 +7643 +7644 +7645 +7646 +7647 +7648 +7649 +7650 +7651 +7652 +7653 +7654 +7655 +7656 +7657 +7658 +7659 +7660 +7661 +7662 +7663 +7664 +7665 +7666 +7667 +7668 +7669 +7670 +7671 +7672 +7673 +7674 +7675 +7676 +7677 +7678 +7679 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7830 +7831 +7832 +7833 +7834 +7835 +7836 +7837 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7936 +7937 +7938 +7939 +7940 +7941 +7942 +7943 +7944 +7945 +7946 +7947 +7948 +7949 +7950 +7951 +7952 +7953 +7954 +7955 +7956 +7957 +7958 +7959 +7960 +7961 +7962 +7963 +7964 +7965 +7966 +7967 +7968 +7969 +7970 +7971 +7972 +7973 +7974 +7975 +7976 +7977 +7978 +7979 +7980 +7981 +7982 +7983 +7984 +7985 +7986 +7987 +7988 +7989 +7990 +7991 +7992 +7993 +7994 +7995 +7996 +7997 +7998 +7999 +8000 +8001 +8002 +8003 +8004 +8005 +8006 +8007 +8008 +8009 +8010 +8011 +8012 +8013 +8014 +8015 +8016 +8017 +8018 +8019 +8020 +8021 +8022 +8023 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8032 +8033 +8034 +8035 +8036 +8037 +8038 +8039 +8040 +8041 +8042 +8043 +8044 +8045 +8046 +8047 +8048 +8049 +8050 +8051 +8052 +8053 +8054 +8055 +8056 +8057 +8058 +8059 +8060 +8061 +8062 +8063 +8064 +8065 +8066 +8067 +8068 +8069 +8070 +8071 +8072 +8073 +8074 +8075 +8076 +8077 +8078 +8079 +8080 +8081 +8082 +8083 +8084 +8085 +8086 +8087 +8088 +8089 +8090 +8091 +8092 +8093 +8094 +8095 +8096 +8097 +8098 +8099 +8100 +8101 +8102 +8103 +8104 +8105 +8106 +8107 +8108 +8109 +8110 +8111 +8112 +8113 +8114 +8115 +8116 +8117 +8118 +8119 +8120 +8121 +8122 +8123 +8124 +8125 +8126 +8127 +8128 +8129 +8130 +8131 +8132 +8133 +8134 +8135 +8136 +8137 +8138 +8139 +8140 +8141 +8142 +8143 +8144 +8145 +8146 +8147 +8148 +8149 +8150 +8151 +8152 +8153 +8154 +8155 +8156 +8157 +8158 +8159 +8160 +8161 +8162 +8163 +8164 +8165 +8166 +8167 +8168 +8169 +8170 +8171 +8172 +8173 +8174 +8175 +8176 +8177 +8178 +8179 +8180 +8181 +8182 +8183 +8184 +8185 +8186 +8187 +8188 +8189 +8190 +8191 +8192 +8193 +8194 +8195 +8196 +8197 +8198 +8199 +8200 +8201 +8202 +8203 +8204 +8205 +8206 +8207 +8208 +8209 +8210 +8211 +8212 +8213 +8214 +8215 +8216 +8217 +8218 +8219 +8220 +8221 +8222 +8223 +8224 +8225 +8226 +8227 +8228 +8229 +8230 +8231 +8232 +8233 +8234 +8235 +8236 +8237 +8238 +8239 +8240 +8241 +8242 +8243 +8244 +8245 +8246 +8247 +8248 +8249 +8250 +8251 +8252 +8253 +8254 +8255 +8256 +8257 +8258 +8259 +8260 +8261 +8262 +8263 +8264 +8265 +8266 +8267 +8268 +8269 +8270 +8271 +8272 +8273 +8274 +8275 +8276 +8277 +8278 +8279 +8280 +8281 +8282 +8283 +8284 +8285 +8286 +8287 +8288 +8289 +8290 +8291 +8292 +8293 +8294 +8295 +8296 +8297 +8298 +8299 +8300 +8301 +8302 +8303 +8304 +8305 +8306 +8307 +8308 +8309 +8310 +8311 +8312 +8313 +8314 +8315 +8316 +8317 +8318 +8319 +8320 +8321 +8322 +8323 +8324 +8325 +8326 +8327 +8328 +8329 +8330 +8331 +8332 +8333 +8334 +8335 +8336 +8337 +8338 +8339 +8340 +8341 +8342 +8343 +8344 +8345 +8346 +8347 +8348 +8349 +8350 +8351 +8352 +8353 +8354 +8355 +8356 +8357 +8358 +8359 +8360 +8361 +8362 +8363 +8364 +8365 +8366 +8367 +8368 +8369 +8370 +8371 +8372 +8373 +8374 +8375 +8376 +8377 +8378 +8379 +8380 +8381 +8382 +8383 +8384 +8385 +8386 +8387 +8388 +8389 +8390 +8391 +8392 +8393 +8394 +8395 +8396 +8397 +8398 +8399 +8400 +8401 +8402 +8403 +8404 +8405 +8406 +8407 +8408 +8409 +8410 +8411 +8412 +8413 +8414 +8415 +8416 +8417 +8418 +8419 +8420 +8421 +8422 +8423 +8424 +8425 +8426 +8427 +8428 +8429 +8430 +8431 +8432 +8433 +8434 +8435 +8436 +8437 +8438 +8439 +8440 +8441 +8442 +8443 +8444 +8445 +8446 +8447 +8448 +8449 +8450 +8451 +8452 +8453 +8454 +8455 +8456 +8457 +8458 +8459 +8460 +8461 +8462 +8463 +8464 +8465 +8466 +8467 +8468 +8469 +8470 +8471 +8472 +8473 +8474 +8475 +8476 +8477 +8478 +8479 +8480 +8481 +8482 +8483 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8491 +8492 +8493 +8494 +8495 +8496 +8497 +8498 +8499 +8500 +8501 +8502 +8503 +8504 +8505 +8506 +8507 +8508 +8509 +8510 +8511 +8512 +8513 +8514 +8515 +8516 +8517 +8518 +8519 +8520 +8521 +8522 +8523 +8524 +8525 +8526 +8527 +8528 +8529 +8530 +8531 +8532 +8533 +8534 +8535 +8536 +8537 +8538 +8539 +8540 +8541 +8542 +8543 +8544 +8545 +8546 +8547 +8548 +8549 +8550 +8551 +8552 +8553 +8554 +8555 +8556 +8557 +8558 +8559 +8560 +8561 +8562 +8563 +8564 +8565 +8566 +8567 +8568 +8569 +8570 +8571 +8572 +8573 +8574 +8575 +8576 +8577 +8578 +8579 +8580 +8581 +8582 +8583 +8584 +8585 +8586 +8587 +8588 +8589 +8590 +8591 +8592 +8593 +8594 +8595 +8596 +8597 +8598 +8599 +8600 +8601 +8602 +8603 +8604 +8605 +8606 +8607 +8608 +8609 +8610 +8611 +8612 +8613 +8614 +8615 +8616 +8617 +8618 +8619 +8620 +8621 +8622 +8623 +8624 +8625 +8626 +8627 +8628 +8629 +8630 +8631 +8632 +8633 +8634 +8635 +8636 +8637 +8638 +8639 +8640 +8641 +8642 +8643 +8644 +8645 +8646 +8647 +8648 +8649 +8650 +8651 +8652 +8653 +8654 +8655 +8656 +8657 +8658 +8659 +8660 +8661 +8662 +8663 +8664 +8665 +8666 +8667 +8668 +8669 +8670 +8671 +8672 +8673 +8674 +8675 +8676 +8677 +8678 +8679 +8680 +8681 +8682 +8683 +8684 +8685 +8686 +8687 +8688 +8689 +8690 +8691 +8692 +8693 +8694 +8695 +8696 +8697 +8698 +8699 +8700 +8701 +8702 +8703 +8704 +8705 +8706 +8707 +8708 +8709 +8710 +8711 +8712 +8713 +8714 +8715 +8716 +8717 +8718 +8719 +8720 +8721 +8722 +8723 +8724 +8725 +8726 +8727 +8728 +8729 +8730 +8731 +8732 +8733 +8734 +8735 +8736 +8737 +8738 +8739 +8740 +8741 +8742 +8743 +8744 +8745 +8746 +8747 +8748 +8749 +8750 +8751 +8752 +8753 +8754 +8755 +8756 +8757 +8758 +8759 +8760 +8761 +8762 +8763 +8764 +8765 +8766 +8767 +8768 +8769 +8770 +8771 +8772 +8773 +8774 +8775 +8776 +8777 +8778 +8779 +8780 +8781 +8782 +8783 +8784 +8785 +8786 +8787 +8788 +8789 +8790 +8791 +8792 +8793 +8794 +8795 +8796 +8797 +8798 +8799 +8800 +8801 +8802 +8803 +8804 +8805 +8806 +8807 +8808 +8809 +8810 +8811 +8812 +8813 +8814 +8815 +8816 +8817 +8818 +8819 +8820 +8821 +8822 +8823 +8824 +8825 +8826 +8827 +8828 +8829 +8830 +8831 +8832 +8833 +8834 +8835 +8836 +8837 +8838 +8839 +8840 +8841 +8842 +8843 +8844 +8845 +8846 +8847 +8848 +8849 +8850 +8851 +8852 +8853 +8854 +8855 +8856 +8857 +8858 +8859 +8860 +8861 +8862 +8863 +8864 +8865 +8866 +8867 +8868 +8869 +8870 +8871 +8872 +8873 +8874 +8875 +8876 +8877 +8878 +8879 +8880 +8881 +8882 +8883 +8884 +8885 +8886 +8887 +8888 +8889 +8890 +8891 +8892 +8893 +8894 +8895 +8896 +8897 +8898 +8899 +8900 +8901 +8902 +8903 +8904 +8905 +8906 +8907 +8908 +8909 +8910 +8911 +8912 +8913 +8914 +8915 +8916 +8917 +8918 +8919 +8920 +8921 +8922 +8923 +8924 +8925 +8926 +8927 +8928 +8929 +8930 +8931 +8932 +8933 +8934 +8935 +8936 +8937 +8938 +8939 +8940 +8941 +8942 +8943 +8944 +8945 +8946 +8947 +8948 +8949 +8950 +8951 +8952 +8953 +8954 +8955 +8956 +8957 +8958 +8959 +8960 +8961 +8962 +8963 +8964 +8965 +8966 +8967 +8968 +8969 +8970 +8971 +8972 +8973 +8974 +8975 +8976 +8977 +8978 +8979 +8980 +8981 +8982 +8983 +8984 +8985 +8986 +8987 +8988 +8989 +8990 +8991 +8992 +8993 +8994 +8995 +8996 +8997 +8998 +8999 +9000 +9001 +9002 +9003 +9004 +9005 +9006 +9007 +9008 +9009 +9010 +9011 +9012 +9013 +9014 +9015 +9016 +9017 +9018 +9019 +9020 +9021 +9022 +9023 +9024 +9025 +9026 +9027 +9028 +9029 +9030 +9031 +9032 +9033 +9034 +9035 +9036 +9037 +9038 +9039 +9040 +9041 +9042 +9043 +9044 +9045 +9046 +9047 +9048 +9049 +9050 +9051 +9052 +9053 +9054 +9055 +9056 +9057 +9058 +9059 +9060 +9061 +9062 +9063 +9064 +9065 +9066 +9067 +9068 +9069 +9070 +9071 +9072 +9073 +9074 +9075 +9076 +9077 +9078 +9079 +9080 +9081 +9082 +9083 +9084 +9085 +9086 +9087 +9088 +9089 +9090 +9091 +9092 +9093 +9094 +9095 +9096 +9097 +9098 +9099 +9100 +9101 +9102 +9103 +9104 +9105 +9106 +9107 +9108 +9109 +9110 +9111 +9112 +9113 +9114 +9115 +9116 +9117 +9118 +9119 +9120 +9121 +9122 +9123 +9124 +9125 +9126 +9127 +9128 +9129 +9130 +9131 +9132 +9133 +9134 +9135 +9136 +9137 +9138 +9139 +9140 +9141 +9142 +9143 +9144 +9145 +9146 +9147 +9148 +9149 +9150 +9151 +9152 +9153 +9154 +9155 +9156 +9157 +9158 +9159 +9160 +9161 +9162 +9163 +9164 +9165 +9166 +9167 +9168 +9169 +9170 +9171 +9172 +9173 +9174 +9175 +9176 +9177 +9178 +9179 +9180 +9181 +9182 +9183 +9184 +9185 +9186 +9187 +9188 +9189 +9190 +9191 +9192 +9193 +9194 +9195 +9196 +9197 +9198 +9199 +9200 +9201 +9202 +9203 +9204 +9205 +9206 +9207 +9208 +9209 +9210 +9211 +9212 +9213 +9214 +9215 +9216 +9217 +9218 +9219 +9220 +9221 +9222 +9223 +9224 +9225 +9226 +9227 +9228 +9229 +9230 +9231 +9232 +9233 +9234 +9235 +9236 +9237 +9238 +9239 +9240 +9241 +9242 +9243 +9244 +9245 +9246 +9247 +9248 +9249 +9250 +9251 +9252 +9253 +9254 +9255 +9256 +9257 +9258 +9259 +9260 +9261 +9262 +9263 +9264 +9265 +9266 +9267 +9268 +9269 +9270 +9271 +9272 +9273 +9274 +9275 +9276 +9277 +9278 +9279 +9280 +9281 +9282 +9283 +9284 +9285 +9286 +9287 +9288 +9289 +9290 +9291 +9292 +9293 +9294 +9295 +9296 +9297 +9298 +9299 +9300 +9301 +9302 +9303 +9304 +9305 +9306 +9307 +9308 +9309 +9310 +9311 +9312 +9313 +9314 +9315 +9316 +9317 +9318 +9319 +9320 +9321 +9322 +9323 +9324 +9325 +9326 +9327 +9328 +9329 +9330 +9331 +9332 +9333 +9334 +9335 +9336 +9337 +9338 +9339 +9340 +9341 +9342 +9343 +9344 +9345 +9346 +9347 +9348 +9349 +9350 +9351 +9352 +9353 +9354 +9355 +9356 +9357 +9358 +9359 +9360 +9361 +9362 +9363 +9364 +9365 +9366 +9367 +9368 +9369 +9370 +9371 +9372 +9373 +9374 +9375 +9376 +9377 +9378 +9379 +9380 +9381 +9382 +9383 +9384 +9385 +9386 +9387 +9388 +9389 +9390 +9391 +9392 +9393 +9394 +9395 +9396 +9397 +9398 +9399 +9400 +9401 +9402 +9403 +9404 +9405 +9406 +9407 +9408 +9409 +9410 +9411 +9412 +9413 +9414 +9415 +9416 +9417 +9418 +9419 +9420 +9421 +9422 +9423 +9424 +9425 +9426 +9427 +9428 +9429 +9430 +9431 +9432 +9433 +9434 +9435 +9436 +9437 +9438 +9439 +9440 +9441 +9442 +9443 +9444 +9445 +9446 +9447 +9448 +9449 +9450 +9451 +9452 +9453 +9454 +9455 +9456 +9457 +9458 +9459 +9460 +9461 +9462 +9463 +9464 +9465 +9466 +9467 +9468 +9469 +9470 +9471 +9472 +9473 +9474 +9475 +9476 +9477 +9478 +9479 +9480 +9481 +9482 +9483 +9484 +9485 +9486 +9487 +9488 +9489 +9490 +9491 +9492 +9493 +9494 +9495 +9496 +9497 +9498 +9499 +9500 +9501 +9502 +9503 +9504 +9505 +9506 +9507 +9508 +9509 +9510 +9511 +9512 +9513 +9514 +9515 +9516 +9517 +9518 +9519 +9520 +9521 +9522 +9523 +9524 +9525 +9526 +9527 +9528 +9529 +9530 +9531 +9532 +9533 +9534 +9535 +9536 +9537 +9538 +9539 +9540 +9541 +9542 +9543 +9544 +9545 +9546 +9547 +9548 +9549 +9550 +9551 +9552 +9553 +9554 +9555 +9556 +9557 +9558 +9559 +9560 +9561 +9562 +9563 +9564 +9565 +9566 +9567 +9568 +9569 +9570 +9571 +9572 +9573 +9574 +9575 +9576 +9577 +9578 +9579 +9580 +9581 +9582 +9583 +9584 +9585 +9586 +9587 +9588 +9589 +9590 +9591 +9592 +9593 +9594 +9595 +9596 +9597 +9598 +9599 +9600 +9601 +9602 +9603 +9604 +9605 +9606 +9607 +9608 +9609 +9610 +9611 +9612 +9613 +9614 +9615 +9616 +9617 +9618 +9619 +9620 +9621 +9622 +9623 +9624 +9625 +9626 +9627 +9628 +9629 +9630 +9631 +9632 +9633 +9634 +9635 +9636 +9637 +9638 +9639 +9640 +9641 +9642 +9643 +9644 +9645 +9646 +9647 +9648 +9649 +9650 +9651 +9652 +9653 +9654 +9655 +9656 +9657 +9658 +9659 +9660 +9661 +9662 +9663 +9664 +9665 +9666 +9667 +9668 +9669 +9670 +9671 +9672 +9673 +9674 +9675 +9676 +9677 +9678 +9679 +9680 +9681 +9682 +9683 +9684 +9685 +9686 +9687 +9688 +9689 +9690 +9691 +9692 +9693 +9694 +9695 +9696 +9697 +9698 +9699 +9700 +9701 +9702 +9703 +9704 +9705 +9706 +9707 +9708 +9709 +9710 +9711 +9712 +9713 +9714 +9715 +9716 +9717 +9718 +9719 +9720 +9721 +9722 +9723 +9724 +9725 +9726 +9727 +9728 +9729 +9730 +9731 +9732 +9733 +9734 +9735 +9736 +9737 +9738 +9739 +9740 +9741 +9742 +9743 +9744 +9745 +9746 +9747 +9748 +9749 +9750 +9751 +9752 +9753 +9754 +9755 +9756 +9757 +9758 +9759 +9760 +9761 +9762 +9763 +9764 +9765 +9766 +9767 +9768 +9769 +9770 +9771 +9772 +9773 +9774 +9775 +9776 +9777 +9778 +9779 +9780 +9781 +9782 +9783 +9784 +9785 +9786 +9787 +9788 +9789 +9790 +9791 +9792 +9793 +9794 +9795 +9796 +9797 +9798 +9799 +9800 +9801 +9802 +9803 +9804 +9805 +9806 +9807 +9808 +9809 +9810 +9811 +9812 +9813 +9814 +9815 +9816 +9817 +9818 +9819 +9820 +9821 +9822 +9823 +9824 +9825 +9826 +9827 +9828 +9829 +9830 +9831 +9832 +9833 +9834 +9835 +9836 +9837 +9838 +9839 +9840 +9841 +9842 +9843 +9844 +9845 +9846 +9847 +9848 +9849 +9850 +9851 +9852 +9853 +9854 +9855 +9856 +9857 +9858 +9859 +9860 +9861 +9862 +9863 +9864 +9865 +9866 +9867 +9868 +9869 +9870 +9871 +9872 +9873 +9874 +9875 +9876 +9877 +9878 +9879 +9880 +9881 +9882 +9883 +9884 +9885 +9886 +9887 +9888 +9889 +9890 +9891 +9892 +9893 +9894 +9895 +9896 +9897 +9898 +9899 +9900 +9901 +9902 +9903 +9904 +9905 +9906 +9907 +9908 +9909 +9910 +9911 +9912 +9913 +9914 +9915 +9916 +9917 +9918 +9919 +9920 +9921 +9922 +9923 +9924 +9925 +9926 +9927 +9928 +9929 +9930 +9931 +9932 +9933 +9934 +9935 +9936 +9937 +9938 +9939 +9940 +9941 +9942 +9943 +9944 +9945 +9946 +9947 +9948 +9949 +9950 +9951 +9952 +9953 +9954 +9955 +9956 +9957 +9958 +9959 +9960 +9961 +9962 +9963 +9964 +9965 +9966 +9967 +9968 +9969 +9970 +9971 +9972 +9973 +9974 +9975 +9976 +9977 +9978 +9979 +9980 +9981 +9982 +9983 +9984 +9985 +9986 +9987 +9988 +9989 +9990 +9991 +9992 +9993 +9994 +9995 +9996 +9997 +9998 +9999 +10000 +10001 +10002 +10003 +10004 +10005 +10006 +10007 +10008 +10009 +10010 +10011 +10012 +10013 +10014 +10015 +10016 +10017 +10018 +10019 +10020 +10021 +10022 +10023 +10024 +10025 +10026 +10027 +10028 +10029 +10030 +10031 +10032 +10033 +10034 +10035 +10036 +10037 +10038 +10039 +10040 +10041 +10042 +10043 +10044 +10045 +10046 +10047 +10048 +10049 +10050 +10051 +10052 +10053 +10054 +10055 +10056 +10057 +10058 +10059 +10060 +10061 +10062 +10063 +10064 +10065 +10066 +10067 +10068 +10069 +10070 +10071 +10072 +10073 +10074 +10075 +10076 +10077 +10078 +10079 +10080 +10081 +10082 +10083 +10084 +10085 +10086 +10087 +10088 +10089 +10090 +10091 +10092 +10093 +10094 +10095 +10096 +10097 +10098 +10099 +10100 +10101 +10102 +10103 +10104 +10105 +10106 +10107 +10108 +10109 +10110 +10111 +10112 +10113 +10114 +10115 +10116 +10117 +10118 +10119 +10120 +10121 +10122 +10123 +10124 +10125 +10126 +10127 +10128 +10129 +10130 +10131 +10132 +10133 +10134 +10135 +10136 +10137 +10138 +10139 +10140 +10141 +10142 +10143 +10144 +10145 +10146 +10147 +10148 +10149 +10150 +10151 +10152 +10153 +10154 +10155 +10156 +10157 +10158 +10159 +10160 +10161 +10162 +10163 +10164 +10165 +10166 +10167 +10168 +10169 +10170 +10171 +10172 +10173 +10174 +10175 +10176 +10177 +10178 +10179 +10180 +10181 +10182 +10183 +10184 +10185 +10186 +10187 +10188 +10189 +10190 +10191 +10192 +10193 +10194 +10195 +10196 +10197 +10198 +10199 +10200 +10201 +10202 +10203 +10204 +10205 +10206 +10207 +10208 +10209 +10210 +10211 +10212 +10213 +10214 +10215 +10216 +10217 +10218 +10219 +10220 +10221 +10222 +10223 +10224 +10225 +10226 +10227 +10228 +10229 +10230 +10231 +10232 +10233 +10234 +10235 +10236 +10237 +10238 +10239 +10240 +10241 +10242 +10243 +10244 +10245 +10246 +10247 +10248 +10249 +10250 +10251 +10252 +10253 +10254 +10255 +10256 +10257 +10258 +10259 +10260 +10261 +10262 +10263 +10264 +10265 +10266 +10267 +10268 +10269 +10270 +10271 +10272 +10273 +10274 +10275 +10276 +10277 +10278 +10279 +10280 +10281 +10282 +10283 +10284 +10285 +10286 +10287 +10288 +10289 +10290 +10291 +10292 +10293 +10294 +10295 +10296 +10297 +10298 +10299 +10300 +10301 +10302 +10303 +10304 +10305 +10306 +10307 +10308 +10309 +10310 +10311 +10312 +10313 +10314 +10315 +10316 +10317 +10318 +10319 +10320 +10321 +10322 +10323 +10324 +10325 +10326 +10327 +10328 +10329 +10330 +10331 +10332 +10333 +10334 +10335 +10336 +10337 +10338 +10339 +10340 +10341 +10342 +10343 +10344 +10345 +10346 +10347 +10348 +10349 +10350 +10351 +10352 +10353 +10354 +10355 +10356 +10357 +10358 +10359 +10360 +10361 +10362 +10363 +10364 +10365 +10366 +10367 +10368 +10369 +10370 +10371 +10372 +10373 +10374 +10375 +10376 +10377 +10378 +10379 +10380 +10381 +10382 +10383 +10384 +10385 +10386 +10387 +10388 +10389 +10390 +10391 +10392 +10393 +10394 +10395 +10396 +10397 +10398 +10399 +10400 +10401 +10402 +10403 +10404 +10405 +10406 +10407 +10408 +10409 +10410 +10411 +10412 +10413 +10414 +10415 +10416 +10417 +10418 +10419 +10420 +10421 +10422 +10423 +10424 +10425 +10426 +10427 +10428 +10429 +10430 +10431 +10432 +10433 +10434 +10435 +10436 +10437 +10438 +10439 +10440 +10441 +10442 +10443 +10444 +10445 +10446 +10447 +10448 +10449 +10450 +10451 +10452 +10453 +10454 +10455 +10456 +10457 +10458 +10459 +10460 +10461 +10462 +10463 +10464 +10465 +10466 +10467 +10468 +10469 +10470 +10471 +10472 +10473 +10474 +10475 +10476 +10477 +10478 +10479 +10480 +10481 +10482 +10483 +10484 +10485 +10486 +10487 +10488 +10489 +10490 +10491 +10492 +10493 +10494 +10495 +10496 +10497 +10498 +10499 +10500 +10501 +10502 +10503 +10504 +10505 +10506 +10507 +10508 +10509 +10510 +10511 +10512 +10513 +10514 +10515 +10516 +10517 +10518 +10519 +10520 +10521 +10522 +10523 +10524 +10525 +10526 +10527 +10528 +10529 +10530 +10531 +10532 +10533 +10534 +10535 +10536 +10537 +10538 +10539 +10540 +10541 +10542 +10543 +10544 +10545 +10546 +10547 +10548 +10549 +10550 +10551 +10552 +10553 +10554 +10555 +10556 +10557 +10558 +10559 +10560 +10561 +10562 +10563 +10564 +10565 +10566 +10567 +10568 +10569 +10570 +10571 +10572 +10573 +10574 +10575 +10576 +10577 +10578 +10579 +10580 +10581 +10582 +10583 +10584 +10585 +10586 +10587 +10588 +10589 +10590 +10591 +10592 +10593 +10594 +10595 +10596 +10597 +10598 +10599 +10600 +10601 +10602 +10603 +10604 +10605 +10606 +10607 +10608 +10609 +10610 +10611 +10612 +10613 +10614 +10615 +10616 +10617 +10618 +10619 +10620 +10621 +10622 +10623 +10624 +10625 +10626 +10627 +10628 +10629 +10630 +10631 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643 +10644 +10645 +10646 +10647 +10648 +10649 +10650 +10651 +10652 +10653 +10654 +10655 +10656 +10657 +10658 +10659 +10660 +10661 +10662 +10663 +10664 +10665 +10666 +10667 +10668 +10669 +10670 +10671 +10672 +10673 +10674 +10675 +10676 +10677 +10678 +10679 +10680 +10681 +10682 +10683 +10684 +10685 +10686 +10687 +10688 +10689 +10690 +10691 +10692 +10693 +10694 +10695 +10696 +10697 +10698 +10699 +10700 +10701 +10702 +10703 +10704 +10705 +10706 +10707 +10708 +10709 +10710 +10711 +10712 +10713 +10714 +10715 +10716 +10717 +10718 +10719 +10720 +10721 +10722 +10723 +10724 +10725 +10726 +10727 +10728 +10729 +10730 +10731 +10732 +10733 +10734 +10735 +10736 +10737 +10738 +10739 +10740 +10741 +10742 +10743 +10744 +10745 +10746 +10747 +10748 +10749 +10750 +10751 +10752 +10753 +10754 +10755 +10756 +10757 +10758 +10759 +10760 +10761 +10762 +10763 +10764 +10765 +10766 +10767 +10768 +10769 +10770 +10771 +10772 +10773 +10774 +10775 +10776 +10777 +10778 +10779 +10780 +10781 +10782 +10783 +10784 +10785 +10786 +10787 +10788 +10789 +10790 +10791 +10792 +10793 +10794 +10795 +10796 +10797 +10798 +10799 +10800 +10801 +10802 +10803 +10804 +10805 +10806 +10807 +10808 +10809 +10810 +10811 +10812 +10813 +10814 +10815 +10816 +10817 +10818 +10819 +10820 +10821 +10822 +10823 +10824 +10825 +10826 +10827 +10828 +10829 +10830 +10831 +10832 +10833 +10834 +10835 +10836 +10837 +10838 +10839 +10840 +10841 +10842 +10843 +10844 +10845 +10846 +10847 +10848 +10849 +10850 +10851 +10852 +10853 +10854 +10855 +10856 +10857 +10858 +10859 +10860 +10861 +10862 +10863 +10864 +10865 +10866 +10867 +10868 +10869 +10870 +10871 +10872 +10873 +10874 +10875 +10876 +10877 +10878 +10879 +10880 +10881 +10882 +10883 +10884 +10885 +10886 +10887 +10888 +10889 +10890 +10891 +10892 +10893 +10894 +10895 +10896 +10897 +10898 +10899 +10900 +10901 +10902 +10903 +10904 +10905 +10906 +10907 +10908 +10909 +10910 +10911 +10912 +10913 +10914 +10915 +10916 +10917 +10918 +10919 +10920 +10921 +10922 +10923 +10924 +10925 +10926 +10927 +10928 +10929 +10930 +10931 +10932 +10933 +10934 +10935 +10936 +10937 +10938 +10939 +10940 +10941 +10942 +10943 +10944 +10945 +10946 +10947 +10948 +10949 +10950 +10951 +10952 +10953 +10954 +10955 +10956 +10957 +10958 +10959 +10960 +10961 +10962 +10963 +10964 +10965 +10966 +10967 +10968 +10969 +10970 +10971 +10972 +10973 +10974 +10975 +10976 +10977 +10978 +10979 +10980 +10981 +10982 +10983 +10984 +10985 +10986 +10987 +10988 +10989 +10990 +10991 +10992 +10993 +10994 +10995 +10996 +10997 +10998 +10999 +11000 +11001 +11002 +11003 +11004 +11005 +11006 +11007 +11008 +11009 +11010 +11011 +11012 +11013 +11014 +11015 +11016 +11017 +11018 +11019 +11020 +11021 +11022 +11023 +11024 +11025 +11026 +11027 +11028 +11029 +11030 +11031 +11032 +11033 +11034 +11035 +11036 +11037 +11038 +11039 +11040 +11041 +11042 +11043 +11044 +11045 +11046 +11047 +11048 +11049 +11050 +11051 +11052 +11053 +11054 +11055 +11056 +11057 +11058 +11059 +11060 +11061 +11062 +11063 +11064 +11065 +11066 +11067 +11068 +11069 +11070 +11071 +11072 +11073 +11074 +11075 +11076 +11077 +11078 +11079 +11080 +11081 +11082 +11083 +11084 +11085 +11086 +11087 +11088 +11089 +11090 +11091 +11092 +11093 +11094 +11095 +11096 +11097 +11098 +11099 +11100 +11101 +11102 +11103 +11104 +11105 +11106 +11107 +11108 +11109 +11110 +11111 +11112 +11113 +11114 +11115 +11116 +11117 +11118 +11119 +11120 +11121 +11122 +11123 +11124 +11125 +11126 +11127 +11128 +11129 +11130 +11131 +11132 +11133 +11134 +11135 +11136 +11137 +11138 +11139 +11140 +11141 +11142 +11143 +11144 +11145 +11146 +11147 +11148 +11149 +11150 +11151 +11152 +11153 +11154 +11155 +11156 +11157 +11158 +11159 +11160 +11161 +11162 +11163 +11164 +11165 +11166 +11167 +11168 +11169 +11170 +11171 +11172 +11173 +11174 +11175 +11176 +11177 +11178 +11179 +11180 +11181 +11182 +11183 +11184 +11185 +11186 +11187 +11188 +11189 +11190 +11191 +11192 +11193 +11194 +11195 +11196 +11197 +11198 +11199 +11200 +11201 +11202 +11203 +11204 +11205 +11206 +11207 +11208 +11209 +11210 +11211 +11212 +11213 +11214 +11215 +11216 +11217 +11218 +11219 +11220 +11221 +11222 +11223 +11224 +11225 +11226 +11227 +11228 +11229 +11230 +11231 +11232 +11233 +11234 +11235 +11236 +11237 +11238 +11239 +11240 +11241 +11242 +11243 +11244 +11245 +11246 +11247 +11248 +11249 +11250 +11251 +11252 +11253 +11254 +11255 +11256 +11257 +11258 +11259 +11260 +11261 +11262 +11263 +11264 +11265 +11266 +11267 +11268 +11269 +11270 +11271 +11272 +11273 +11274 +11275 +11276 +11277 +11278 +11279 +11280 +11281 +11282 +11283 +11284 +11285 +11286 +11287 +11288 +11289 +11290 +11291 +11292 +11293 +11294 +11295 +11296 +11297 +11298 +11299 +11300 +11301 +11302 +11303 +11304 +11305 +11306 +11307 +11308 +11309 +11310 +11311 +11312 +11313 +11314 +11315 +11316 +11317 +11318 +11319 +11320 +11321 +11322 +11323 +11324 +11325 +11326 +11327 +11328 +11329 +11330 +11331 +11332 +11333 +11334 +11335 +11336 +11337 +11338 +11339 +11340 +11341 +11342 +11343 +11344 +11345 +11346 +11347 +11348 +11349 +11350 +11351 +11352 +11353 +11354 +11355 +11356 +11357 +11358 +11359 +11360 +11361 +11362 +11363 +11364 +11365 +11366 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11374 +11375 +11376 +11377 +11378 +11379 +11380 +11381 +11382 +11383 +11384 +11385 +11386 +11387 +11388 +11389 +11390 +11391 +11392 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11492 +11493 +11494 +11495 +11496 +11497 +11498 +11499 +11500 +11501 +11502 +11503 +11504 +11505 +11506 +11507 +11508 +11509 +11510 +11511 +11512 +11513 +11514 +11515 +11516 +11517 +11518 +11519 +11520 +11521 +11522 +11523 +11524 +11525 +11526 +11527 +11528 +11529 +11530 +11531 +11532 +11533 +11534 +11535 +11536 +11537 +11538 +11539 +11540 +11541 +11542 +11543 +11544 +11545 +11546 +11547 +11548 +11549 +11550 +11551 +11552 +11553 +11554 +11555 +11556 +11557 +11558 +11559 +11560 +11561 +11562 +11563 +11564 +11565 +11566 +11567 +11568 +11569 +11570 +11571 +11572 +11573 +11574 +11575 +11576 +11577 +11578 +11579 +11580 +11581 +11582 +11583 +11584 +11585 +11586 +11587 +11588 +11589 +11590 +11591 +11592 +11593 +11594 +11595 +11596 +11597 +11598 +11599 +11600 +11601 +11602 +11603 +11604 +11605 +11606 +11607 +11608 +11609 +11610 +11611 +11612 +11613 +11614 +11615 +11616 +11617 +11618 +11619 +11620 +11621 +11622 +11623 +11624 +11625 +11626 +11627 +11628 +11629 +11630 +11631 +11632 +11633 +11634 +11635 +11636 +11637 +11638 +11639 +11640 +11641 +11642 +11643 +11644 +11645 +11646 +11647 +11648 +11649 +11650 +11651 +11652 +11653 +11654 +11655 +11656 +11657 +11658 +11659 +11660 +11661 +11662 +11663 +11664 +11665 +11666 +11667 +11668 +11669 +11670 +11671 +11672 +11673 +11674 +11675 +11676 +11677 +11678 +11679 +11680 +11681 +11682 +11683 +11684 +11685 +11686 +11687 +11688 +11689 +11690 +11691 +11692 +11693 +11694 +11695 +11696 +11697 +11698 +11699 +11700 +11701 +11702 +11703 +11704 +11705 +11706 +11707 +11708 +11709 +11710 +11711 +11712 +11713 +11714 +11715 +11716 +11717 +11718 +11719 +11720 +11721 +11722 +11723 +11724 +11725 +11726 +11727 +11728 +11729 +11730 +11731 +11732 +11733 +11734 +11735 +11736 +11737 +11738 +11739 +11740 +11741 +11742 +11743 +11744 +11745 +11746 +11747 +11748 +11749 +11750 +11751 +11752 +11753 +11754 +11755 +11756 +11757 +11758 +11759 +11760 +11761 +11762 +11763 +11764 +11765 +11766 +11767 +11768 +11769 +11770 +11771 +11772 +11773 +11774 +11775 +11776 +11777 +11778 +11779 +11780 +11781 +11782 +11783 +11784 +11785 +11786 +11787 +11788 +11789 +11790 +11791 +11792 +11793 +11794 +11795 +11796 +11797 +11798 +11799 +11800 +11801 +11802 +11803 +11804 +11805 +11806 +11807 +11808 +11809 +11810 +11811 +11812 +11813 +11814 +11815 +11816 +11817 +11818 +11819 +11820 +11821 +11822 +11823 +11824 +11825 +11826 +11827 +11828 +11829 +11830 +11831 +11832 +11833 +11834 +11835 +11836 +11837 +11838 +11839 +11840 +11841 +11842 +11843 +11844 +11845 +11846 +11847 +11848 +11849 +11850 +11851 +11852 +11853 +11854 +11855 +11856 +11857 +11858 +11859 +11860 +11861 +11862 +11863 +11864 +11865 +11866 +11867 +11868 +11869 +11870 +11871 +11872 +11873 +11874 +11875 +11876 +11877 +11878 +11879 +11880 +11881 +11882 +11883 +11884 +11885 +11886 +11887 +11888 +11889 +11890 +11891 +11892 +11893 +11894 +11895 +11896 +11897 +11898 +11899 +11900 +11901 +11902 +11903 +11904 +11905 +11906 +11907 +11908 +11909 +11910 +11911 +11912 +11913 +11914 +11915 +11916 +11917 +11918 +11919 +11920 +11921 +11922 +11923 +11924 +11925 +11926 +11927 +11928 +11929 +11930 +11931 +11932 +11933 +11934 +11935 +11936 +11937 +11938 +11939 +11940 +11941 +11942 +11943 +11944 +11945 +11946 +11947 +11948 +11949 +11950 +11951 +11952 +11953 +11954 +11955 +11956 +11957 +11958 +11959 +11960 +11961 +11962 +11963 +11964 +11965 +11966 +11967 +11968 +11969 +11970 +11971 +11972 +11973 +11974 +11975 +11976 +11977 +11978 +11979 +11980 +11981 +11982 +11983 +11984 +11985 +11986 +11987 +11988 +11989 +11990 +11991 +11992 +11993 +11994 +11995 +11996 +11997 +11998 +11999 +12000 +12001 +12002 +12003 +12004 +12005 +12006 +12007 +12008 +12009 +12010 +12011 +12012 +12013 +12014 +12015 +12016 +12017 +12018 +12019 +12020 +12021 +12022 +12023 +12024 +12025 +12026 +12027 +12028 +12029 +12030 +12031 +12032 +12033 +12034 +12035 +12036 +12037 +12038 +12039 +12040 +12041 +12042 +12043 +12044 +12045 +12046 +12047 +12048 +12049 +12050 +12051 +12052 +12053 +12054 +12055 +12056 +12057 +12058 +12059 +12060 +12061 +12062 +12063 +12064 +12065 +12066 +12067 +12068 +12069 +12070 +12071 +12072 +12073 +12074 +12075 +12076 +12077 +12078 +12079 +12080 +12081 +12082 +12083 +12084 +12085 +12086 +12087 +12088 +12089 +12090 +12091 +12092 +12093 +12094 +12095 +12096 +12097 +12098 +12099 +12100 +12101 +12102 +12103 +12104 +12105 +12106 +12107 +12108 +12109 +12110 +12111 +12112 +12113 +12114 +12115 +12116 +12117 +12118 +12119 +12120 +12121 +12122 +12123 +12124 +12125 +12126 +12127 +12128 +12129 +12130 +12131 +12132 +12133 +12134 +12135 +12136 +12137 +12138 +12139 +12140 +12141 +12142 +12143 +12144 +12145 +12146 +12147 +12148 +12149 +12150 +12151 +12152 +12153 +12154 +12155 +12156 +12157 +12158 +12159 +12160 +12161 +12162 +12163 +12164 +12165 +12166 +12167 +12168 +12169 +12170 +12171 +12172 +12173 +12174 +12175 +12176 +12177 +12178 +12179 +12180 +12181 +12182 +12183 +12184 +12185 +12186 +12187 +12188 +12189 +12190 +12191 +12192 +12193 +12194 +12195 +12196 +12197 +12198 +12199 +12200 +12201 +12202 +12203 +12204 +12205 +12206 +12207 +12208 +12209 +12210 +12211 +12212 +12213 +12214 +12215 +12216 +12217 +12218 +12219 +12220 +12221 +12222 +12223 +12224 +12225 +12226 +12227 +12228 +12229 +12230 +12231 +12232 +12233 +12234 +12235 +12236 +12237 +12238 +12239 +12240 +12241 +12242 +12243 +12244 +12245 +12246 +12247 +12248 +12249 +12250 +12251 +12252 +12253 +12254 +12255 +12256 +12257 +12258 +12259 +12260 +12261 +12262 +12263 +12264 +12265 +12266 +12267 +12268 +12269 +12270 +12271 +12272 +12273 +12274 +12275 +12276 +12277 +12278 +12279 +12280 +12281 +12282 +12283 +12284 +12285 +12286 +12287 +12288 +12289 +12290 +12291 +12292 +12293 +12294 +12295 +12296 +12297 +12298 +12299 +12300 +12301 +12302 +12303 +12304 +12305 +12306 +12307 +12308 +12309 +12310 +12311 +12312 +12313 +12314 +12315 +12316 +12317 +12318 +12319 +12320 +12321 +12322 +12323 +12324 +12325 +12326 +12327 +12328 +12329 +12330 +12331 +12332 +12333 +12334 +12335 +12336 +12337 +12338 +12339 +12340 +12341 +12342 +12343 +12344 +12345 +12346 +12347 +12348 +12349 +12350 +12351 +12352 +12353 +12354 +12355 +12356 +12357 +12358 +12359 +12360 +12361 +12362 +12363 +12364 +12365 +12366 +12367 +12368 +12369 +12370 +12371 +12372 +12373 +12374 +12375 +12376 +12377 +12378 +12379 +12380 +12381 +12382 +12383 +12384 +12385 +12386 +12387 +12388 +12389 +12390 +12391 +12392 +12393 +12394 +12395 +12396 +12397 +12398 +12399 +12400 +12401 +12402 +12403 +12404 +12405 +12406 +12407 +12408 +12409 +12410 +12411 +12412 +12413 +12414 +12415 +12416 +12417 +12418 +12419 +12420 +12421 +12422 +12423 +12424 +12425 +12426 +12427 +12428 +12429 +12430 +12431 +12432 +12433 +12434 +12435 +12436 +12437 +12438 +12439 +12440 +12441 +12442 +12443 +12444 +12445 +12446 +12447 +12448 +12449 +12450 +12451 +12452 +12453 +12454 +12455 +12456 +12457 +12458 +12459 +12460 +12461 +12462 +12463 +12464 +12465 +12466 +12467 +12468 +12469 +12470 +12471 +12472 +12473 +12474 +12475 +12476 +12477 +12478 +12479 +12480 +12481 +12482 +12483 +12484 +12485 +12486 +12487 +12488 +12489 +12490 +12491 +12492 +12493 +12494 +12495 +12496 +12497 +12498 +12499 +12500 +12501 +12502 +12503 +12504 +12505 +12506 +12507 +12508 +12509 +12510 +12511 +12512 +12513 +12514 +12515 +12516 +12517 +12518 +12519 +12520 +12521 +12522 +12523 +12524 +12525 +12526 +12527 +12528 +12529 +12530 +12531 +12532 +12533 +12534 +12535 +12536 +12537 +12538 +12539 +12540 +12541 +12542 +12543 +12544 +12545 +12546 +12547 +12548 +12549 +12550 +12551 +12552 +12553 +12554 +12555 +12556 +12557 +12558 +12559 +12560 +12561 +12562 +12563 +12564 +12565 +12566 +12567 +12568 +12569 +12570 +12571 +12572 +12573 +12574 +12575 +12576 +12577 +12578 +12579 +12580 +12581 +12582 +12583 +12584 +12585 +12586 +12587 +12588 +12589 +12590 +12591 +12592 +12593 +12594 +12595 +12596 +12597 +12598 +12599 +12600 +12601 +12602 +12603 +12604 +12605 +12606 +12607 +12608 +12609 +12610 +12611 +12612 +12613 +12614 +12615 +12616 +12617 +12618 +12619 +12620 +12621 +12622 +12623 +12624 +12625 +12626 +12627 +12628 +12629 +12630 +12631 +12632 +12633 +12634 +12635 +12636 +12637 +12638 +12639 +12640 +12641 +12642 +12643 +12644 +12645 +12646 +12647 +12648 +12649 +12650 +12651 +12652 +12653 +12654 +12655 +12656 +12657 +12658 +12659 +12660 +12661 +12662 +12663 +12664 +12665 +12666 +12667 +12668 +12669 +12670 +12671 +12672 +12673 +12674 +12675 +12676 +12677 +12678 +12679 +12680 +12681 +12682 +12683 +12684 +12685 +12686 +12687 +12688 +12689 +12690 +12691 +12692 +12693 +12694 +12695 +12696 +12697 +12698 +12699 +12700 +12701 +12702 +12703 +12704 +12705 +12706 +12707 +12708 +12709 +12710 +12711 +12712 +12713 +12714 +12715 +12716 +12717 +12718 +12719 +12720 +12721 +12722 +12723 +12724 +12725 +12726 +12727 +12728 +12729 +12730 +12731 +12732 +12733 +12734 +12735 +12736 +12737 +12738 +12739 +12740 +12741 +12742 +12743 +12744 +12745 +12746 +12747 +12748 +12749 +12750 +12751 +12752 +12753 +12754 +12755 +12756 +12757 +12758 +12759 +12760 +12761 +12762 +12763 +12764 +12765 +12766 +12767 +12768 +12769 +12770 +12771 +12772 +12773 +12774 +12775 +12776 +12777 +12778 +12779 +12780 +12781 +12782 +12783 +12784 +12785 +12786 +12787 +12788 +12789 +12790 +12791 +12792 +12793 +12794 +12795 +12796 +12797 +12798 +12799 +12800 +12801 +12802 +12803 +12804 +12805 +12806 +12807 +12808 +12809 +12810 +12811 +12812 +12813 +12814 +12815 +12816 +12817 +12818 +12819 +12820 +12821 +12822 +12823 +12824 +12825 +12826 +12827 +12828 +12829 +12830 +12831 +12832 +12833 +12834 +12835 +12836 +12837 +12838 +12839 +12840 +12841 +12842 +12843 +12844 +12845 +12846 +12847 +12848 +12849 +12850 +12851 +12852 +12853 +12854 +12855 +12856 +12857 +12858 +12859 +12860 +12861 +12862 +12863 +12864 +12865 +12866 +12867 +12868 +12869 +12870 +12871 +12872 +12873 +12874 +12875 +12876 +12877 +12878 +12879 +12880 +12881 +12882 +12883 +12884 +12885 +12886 +12887 +12888 +12889 +12890 +12891 +12892 +12893 +12894 +12895 +12896 +12897 +12898 +12899 +12900 +12901 +12902 +12903 +12904 +12905 +12906 +12907 +12908 +12909 +12910 +12911 +12912 +12913 +12914 +12915 +12916 +12917 +12918 +12919 +12920 +12921 +12922 +12923 +12924 +12925 +12926 +12927 +12928 +12929 +12930 +12931 +12932 +12933 +12934 +12935 +12936 +12937 +12938 +12939 +12940 +12941 +12942 +12943 +12944 +12945 +12946 +12947 +12948 +12949 +12950 +12951 +12952 +12953 +12954 +12955 +12956 +12957 +12958 +12959 +12960 +12961 +12962 +12963 +12964 +12965 +12966 +12967 +12968 +12969 +12970 +12971 +12972 +12973 +12974 +12975 +12976 +12977 +12978 +12979 +12980 +12981 +12982 +12983 +12984 +12985 +12986 +12987 +12988 +12989 +12990 +12991 +12992 +12993 +12994 +12995 +12996 +12997 +12998 +12999 +13000 +13001 +13002 +13003 +13004 +13005 +13006 +13007 +13008 +13009 +13010 +13011 +13012 +13013 +13014 +13015 +13016 +13017 +13018 +13019 +13020 +13021 +13022 +13023 +13024 +13025 +13026 +13027 +13028 +13029 +13030 +13031 +13032 +13033 +13034 +13035 +13036 +13037 +13038 +13039 +13040 +13041 +13042 +13043 +13044 +13045 +13046 +13047 +13048 +13049 +13050 +13051 +13052 +13053 +13054 +13055 +13056 +13057 +13058 +13059 +13060 +13061 +13062 +13063 +13064 +13065 +13066 +13067 +13068 +13069 +13070 +13071 +13072 +13073 +13074 +13075 +13076 +13077 +13078 +13079 +13080 +13081 +13082 +13083 +13084 +13085 +13086 +13087 +13088 +13089 +13090 +13091 +13092 +13093 +13094 +13095 +13096 +13097 +13098 +13099 +13100 +13101 +13102 +13103 +13104 +13105 +13106 +13107 +13108 +13109 +13110 +13111 +13112 +13113 +13114 +13115 +13116 +13117 +13118 +13119 +13120 +13121 +13122 +13123 +13124 +13125 +13126 +13127 +13128 +13129 +13130 +13131 +13132 +13133 +13134 +13135 +13136 +13137 +13138 +13139 +13140 +13141 +13142 +13143 +13144 +13145 +13146 +13147 +13148 +13149 +13150 +13151 +13152 +13153 +13154 +13155 +13156 +13157 +13158 +13159 +13160 +13161 +13162 +13163 +13164 +13165 +13166 +13167 +13168 +13169 +13170 +13171 +13172 +13173 +13174 +13175 +13176 +13177 +13178 +13179 +13180 +13181 +13182 +13183 +13184 +13185 +13186 +13187 +13188 +13189 +13190 +13191 +13192 +13193 +13194 +13195 +13196 +13197 +13198 +13199 +13200 +13201 +13202 +13203 +13204 +13205 +13206 +13207 +13208 +13209 +13210 +13211 +13212 +13213 +13214 +13215 +13216 +13217 +13218 +13219 +13220 +13221 +13222 +13223 +13224 +13225 +13226 +13227 +13228 +13229 +13230 +13231 +13232 +13233 +13234 +13235 +13236 +13237 +13238 +13239 +13240 +13241 +13242 +13243 +13244 +13245 +13246 +13247 +13248 +13249 +13250 +13251 +13252 +13253 +13254 +13255 +13256 +13257 +13258 +13259 +13260 +13261 +13262 +13263 +13264 +13265 +13266 +13267 +13268 +13269 +13270 +13271 +13272 +13273 +13274 +13275 +13276 +13277 +13278 +13279 +13280 +13281 +13282 +13283 +13284 +13285 +13286 +13287 +13288 +13289 +13290 +13291 +13292 +13293 +13294 +13295 +13296 +13297 +13298 +13299 +13300 +13301 +13302 +13303 +13304 +13305 +13306 +13307 +13308 +13309 +13310 +13311 +13312 +13313 +13314 +13315 +13316 +13317 +13318 +13319 +13320 +13321 +13322 +13323 +13324 +13325 +13326 +13327 +13328 +13329 +13330 +13331 +13332 +13333 +13334 +13335 +13336 +13337 +13338 +13339 +13340 +13341 +13342 +13343 +13344 +13345 +13346 +13347 +13348 +13349 +13350 +13351 +13352 +13353 +13354 +13355 +13356 +13357 +13358 +13359 +13360 +13361 +13362 +13363 +13364 +13365 +13366 +13367 +13368 +13369 +13370 +13371 +13372 +13373 +13374 +13375 +13376 +13377 +13378 +13379 +13380 +13381 +13382 +13383 +13384 +13385 +13386 +13387 +13388 +13389 +13390 +13391 +13392 +13393 +13394 +13395 +13396 +13397 +13398 +13399 +13400 +13401 +13402 +13403 +13404 +13405 +13406 +13407 +13408 +13409 +13410 +13411 +13412 +13413 +13414 +13415 +13416 +13417 +13418 +13419 +13420 +13421 +13422 +13423 +13424 +13425 +13426 +13427 +13428 +13429 +13430 +13431 +13432 +13433 +13434 +13435 +13436 +13437 +13438 +13439 +13440 +13441 +13442 +13443 +13444 +13445 +13446 +13447 +13448 +13449 +13450 +13451 +13452 +13453 +13454 +13455 +13456 +13457 +13458 +13459 +13460 +13461 +13462 +13463 +13464 +13465 +13466 +13467 +13468 +13469 +13470 +13471 +13472 +13473 +13474 +13475 +13476 +13477 +13478 +13479 +13480 +13481 +13482 +13483 +13484 +13485 +13486 +13487 +13488 +13489 +13490 +13491 +13492 +13493 +13494 +13495 +13496 +13497 +13498 +13499 +13500 +13501 +13502 +13503 +13504 +13505 +13506 +13507 +13508 +13509 +13510 +13511 +13512 +13513 +13514 +13515 +13516 +13517 +13518 +13519 +13520 +13521 +13522 +13523 +13524 +13525 +13526 +13527 +13528 +13529 +13530 +13531 +13532 +13533 +13534 +13535 +13536 +13537 +13538 +13539 +13540 +13541 +13542 +13543 +13544 +13545 +13546 +13547 +13548 +13549 +13550 +13551 +13552 +13553 +13554 +13555 +13556 +13557 +13558 +13559 +13560 +13561 +13562 +13563 +13564 +13565 +13566 +13567 +13568 +13569 +13570 +13571 +13572 +13573 +13574 +13575 +13576 +13577 +13578 +13579 +13580 +13581 +13582 +13583 +13584 +13585 +13586 +13587 +13588 +13589 +13590 +13591 +13592 +13593 +13594 +13595 +13596 +13597 +13598 +13599 +13600 +13601 +13602 +13603 +13604 +13605 +13606 +13607 +13608 +13609 +13610 +13611 +13612 +13613 +13614 +13615 +13616 +13617 +13618 +13619 +13620 +13621 +13622 +13623 +13624 +13625 +13626 +13627 +13628 +13629 +13630 +13631 +13632 +13633 +13634 +13635 +13636 +13637 +13638 +13639 +13640 +13641 +13642 +13643 +13644 +13645 +13646 +13647 +13648 +13649 +13650 +13651 +13652 +13653 +13654 +13655 +13656 +13657 +13658 +13659 +13660 +13661 +13662 +13663 +13664 +13665 +13666 +13667 +13668 +13669 +13670 +13671 +13672 +13673 +13674 +13675 +13676 +13677 +13678 +13679 +13680 +13681 +13682 +13683 +13684 +13685 +13686 +13687 +13688 +13689 +13690 +13691 +13692 +13693 +13694 +13695 +13696 +13697 +13698 +13699 +13700 +13701 +13702 +13703 +13704 +13705 +13706 +13707 +13708 +13709 +13710 +13711 +13712 +13713 +13714 +13715 +13716 +13717 +13718 +13719 +13720 +13721 +13722 +13723 +13724 +13725 +13726 +13727 +13728 +13729 +13730 +13731 +13732 +13733 +13734 +13735 +13736 +13737 +13738 +13739 +13740 +13741 +13742 +13743 +13744 +13745 +13746 +13747 +13748 +13749 +13750 +13751 +13752 +13753 +13754 +13755 +13756 +13757 +13758 +13759 +13760 +13761 +13762 +13763 +13764 +13765 +13766 +13767 +13768 +13769 +13770 +13771 +13772 +13773 +13774 +13775 +13776 +13777 +13778 +13779 +13780 +13781 +13782 +13783 +13784 +13785 +13786 +13787 +13788 +13789 +13790 +13791 +13792 +13793 +13794 +13795 +13796 +13797 +13798 +13799 +13800 +13801 +13802 +13803 +13804 +13805 +13806 +13807 +13808 +13809 +13810 +13811 +13812 +13813 +13814 +13815 +13816 +13817 +13818 +13819 +13820 +13821 +13822 +13823 +13824 +13825 +13826 +13827 +13828 +13829 +13830 +13831 +13832 +13833 +13834 +13835 +13836 +13837 +13838 +13839 +13840 +13841 +13842 +13843 +13844 +13845 +13846 +13847 +13848 +13849 +13850 +13851 +13852 +13853 +13854 +13855 +13856 +13857 +13858 +13859 +13860 +13861 +13862 +13863 +13864 +13865 +13866 +13867 +13868 +13869 +13870 +13871 +13872 +13873 +13874 +13875 +13876 +13877 +13878 +13879 +13880 +13881 +13882 +13883 +13884 +13885 +13886 +13887 +13888 +13889 +13890 +13891 +13892 +13893 +13894 +13895 +13896 +13897 +13898 +13899 +13900 +13901 +13902 +13903 +13904 +13905 +13906 +13907 +13908 +13909 +13910 +13911 +13912 +13913 +13914 +13915 +13916 +13917 +13918 +13919 +13920 +13921 +13922 +13923 +13924 +13925 +13926 +13927 +13928 +13929 +13930 +13931 +13932 +13933 +13934 +13935 +13936 +13937 +13938 +13939 +13940 +13941 +13942 +13943 +13944 +13945 +13946 +13947 +13948 +13949 +13950 +13951 +13952 +13953 +13954 +13955 +13956 +13957 +13958 +13959 +13960 +13961 +13962 +13963 +13964 +13965 +13966 +13967 +13968 +13969 +13970 +13971 +13972 +13973 +13974 +13975 +13976 +13977 +13978 +13979 +13980 +13981 +13982 +13983 +13984 +13985 +13986 +13987 +13988 +13989 +13990 +13991 +13992 +13993 +13994 +13995 +13996 +13997 +13998 +13999 +14000 +14001 +14002 +14003 +14004 +14005 +14006 +14007 +14008 +14009 +14010 +14011 +14012 +14013 +14014 +14015 +14016 +14017 +14018 +14019 +14020 +14021 +14022 +14023 +14024 +14025 +14026 +14027 +14028 +14029 +14030 +14031 +14032 +14033 +14034 +14035 +14036 +14037 +14038 +14039 +14040 +14041 +14042 +14043 +14044 +14045 +14046 +14047 +14048 +14049 +14050 +14051 +14052 +14053 +14054 +14055 +14056 +14057 +14058 +14059 +14060 +14061 +14062 +14063 +14064 +14065 +14066 +14067 +14068 +14069 +14070 +14071 +14072 +14073 +14074 +14075 +14076 +14077 +14078 +14079 +14080 +14081 +14082 +14083 +14084 +14085 +14086 +14087 +14088 +14089 +14090 +14091 +14092 +14093 +14094 +14095 +14096 +14097 +14098 +14099 +14100 +14101 +14102 +14103 +14104 +14105 +14106 +14107 +14108 +14109 +14110 +14111 +14112 +14113 +14114 +14115 +14116 +14117 +14118 +14119 +14120 +14121 +14122 +14123 +14124 +14125 +14126 +14127 +14128 +14129 +14130 +14131 +14132 +14133 +14134 +14135 +14136 +14137 +14138 +14139 +14140 +14141 +14142 +14143 +14144 +14145 +14146 +14147 +14148 +14149 +14150 +14151 +14152 +14153 +14154 +14155 +14156 +14157 +14158 +14159 +14160 +14161 +14162 +14163 +14164 +14165 +14166 +14167 +14168 +14169 +14170 +14171 +14172 +14173 +14174 +14175 +14176 +14177 +14178 +14179 +14180 +14181 +14182 +14183 +14184 +14185 +14186 +14187 +14188 +14189 +14190 +14191 +14192 +14193 +14194 +14195 +14196 +14197 +14198 +14199 +14200 +14201 +14202 +14203 +14204 +14205 +14206 +14207 +14208 +14209 +14210 +14211 +14212 +14213 +14214 +14215 +14216 +14217 +14218 +14219 +14220 +14221 +14222 +14223 +14224 +14225 +14226 +14227 +14228 +14229 +14230 +14231 +14232 +14233 +14234 +14235 +14236 +14237 +14238 +14239 +14240 +14241 +14242 +14243 +14244 +14245 +14246 +14247 +14248 +14249 +14250 +14251 +14252 +14253 +14254 +14255 +14256 +14257 +14258 +14259 +14260 +14261 +14262 +14263 +14264 +14265 +14266 +14267 +14268 +14269 +14270 +14271 +14272 +14273 +14274 +14275 +14276 +14277 +14278 +14279 +14280 +14281 +14282 +14283 +14284 +14285 +14286 +14287 +14288 +14289 +14290 +14291 +14292 +14293 +14294 +14295 +14296 +14297 +14298 +14299 +14300 +14301 +14302 +14303 +14304 +14305 +14306 +14307 +14308 +14309 +14310 +14311 +14312 +14313 +14314 +14315 +14316 +14317 +14318 +14319 +14320 +14321 +14322 +14323 +14324 +14325 +14326 +14327 +14328 +14329 +14330 +14331 +14332 +14333 +14334 +14335 +14336 +14337 +14338 +14339 +14340 +14341 +14342 +14343 +14344 +14345 +14346 +14347 +14348 +14349 +14350 +14351 +14352 +14353 +14354 +14355 +14356 +14357 +14358 +14359 +14360 +14361 +14362 +14363 +14364 +14365 +14366 +14367 +14368 +14369 +14370 +14371 +14372 +14373 +14374 +14375 +14376 +14377 +14378 +14379 +14380 +14381 +14382 +14383 +14384 +14385 +14386 +14387 +14388 +14389 +14390 +14391 +14392 +14393 +14394 +14395 +14396 +14397 +14398 +14399 +14400 +14401 +14402 +14403 +14404 +14405 +14406 +14407 +14408 +14409 +14410 +14411 +14412 +14413 +14414 +14415 +14416 +14417 +14418 +14419 +14420 +14421 +14422 +14423 +14424 +14425 +14426 +14427 +14428 +14429 +14430 +14431 +14432 +14433 +14434 +14435 +14436 +14437 +14438 +14439 +14440 +14441 +14442 +14443 +14444 +14445 +14446 +14447 +14448 +14449 +14450 +14451 +14452 +14453 +14454 +14455 +14456 +14457 +14458 +14459 +14460 +14461 +14462 +14463 +14464 +14465 +14466 +14467 +14468 +14469 +14470 +14471 +14472 +14473 +14474 +14475 +14476 +14477 +14478 +14479 +14480 +14481 +14482 +14483 +14484 +14485 +14486 +14487 +14488 +14489 +14490 +14491 +14492 +14493 +14494 +14495 +14496 +14497 +14498 +14499 +14500 +14501 +14502 +14503 +14504 +14505 +14506 +14507 +14508 +14509 +14510 +14511 +14512 +14513 +14514 +14515 +14516 +14517 +14518 +14519 +14520 +14521 +14522 +14523 +14524 +14525 +14526 +14527 +14528 +14529 +14530 +14531 +14532 +14533 +14534 +14535 +14536 +14537 +14538 +14539 +14540 +14541 +14542 +14543 +14544 +14545 +14546 +14547 +14548 +14549 +14550 +14551 +14552 +14553 +14554 +14555 +14556 +14557 +14558 +14559 +14560 +14561 +14562 +14563 +14564 +14565 +14566 +14567 +14568 +14569 +14570 +14571 +14572 +14573 +14574 +14575 +14576 +14577 +14578 +14579 +14580 +14581 +14582 +14583 +14584 +14585 +14586 +14587 +14588 +14589 +14590 +14591 +14592 +14593 +14594 +14595 +14596 +14597 +14598 +14599 +14600 +14601 +14602 +14603 +14604 +14605 +14606 +14607 +14608 +14609 +14610 +14611 +14612 +14613 +14614 +14615 +14616 +14617 +14618 +14619 +14620 +14621 +14622 +14623 +14624 +14625 +14626 +14627 +14628 +14629 +14630 +14631 +14632 +14633 +14634 +14635 +14636 +14637 +14638 +14639 +14640 +14641 +14642 +14643 +14644 +14645 +14646 +14647 +14648 +14649 +14650 +14651 +14652 +14653 +14654 +14655 +14656 +14657 +14658 +14659 +14660 +14661 +14662 +14663 +14664 +14665 +14666 +14667 +14668 +14669 +14670 +14671 +14672 +14673 +14674 +14675 +14676 +14677 +14678 +14679 +14680 +14681 +14682 +14683 +14684 +14685 +14686 +14687 +14688 +14689 +14690 +14691 +14692 +14693 +14694 +14695 +14696 +14697 +14698 +14699 +14700 +14701 +14702 +14703 +14704 +14705 +14706 +14707 +14708 +14709 +14710 +14711 +14712 +14713 +14714 +14715 +14716 +14717 +14718 +14719 +14720 +14721 +14722 +14723 +14724 +14725 +14726 +14727 +14728 +14729 +14730 +14731 +14732 +14733 +14734 +14735 +14736 +14737 +14738 +14739 +14740 +14741 +14742 +14743 +14744 +14745 +14746 +14747 +14748 +14749 +14750 +14751 +14752 +14753 +14754 +14755 +14756 +14757 +14758 +14759 +14760 +14761 +14762 +14763 +14764 +14765 +14766 +14767 +14768 +14769 +14770 +14771 +14772 +14773 +14774 +14775 +14776 +14777 +14778 +14779 +14780 +14781 +14782 +14783 +14784 +14785 +14786 +14787 +14788 +14789 +14790 +14791 +14792 +14793 +14794 +14795 +14796 +14797 +14798 +14799 +14800 +14801 +14802 +14803 +14804 +14805 +14806 +14807 +14808 +14809 +14810 +14811 +14812 +14813 +14814 +14815 +14816 +14817 +14818 +14819 +14820 +14821 +14822 +14823 +14824 +14825 +14826 +14827 +14828 +14829 +14830 +14831 +14832 +14833 +14834 +14835 +14836 +14837 +14838 +14839 +14840 +14841 +14842 +14843 +14844 +14845 +14846 +14847 +14848 +14849 +14850 +14851 +14852 +14853 +14854 +14855 +14856 +14857 +14858 +14859 +14860 +14861 +14862 +14863 +14864 +14865 +14866 +14867 +14868 +14869 +14870 +14871 +14872 +14873 +14874 +14875 +14876 +14877 +14878 +14879 +14880 +14881 +14882 +14883 +14884 +14885 +14886 +14887 +14888 +14889 +14890 +14891 +14892 +14893 +14894 +14895 +14896 +14897 +14898 +14899 +14900 +14901 +14902 +14903 +14904 +14905 +14906 +14907 +14908 +14909 +14910 +14911 +14912 +14913 +14914 +14915 +14916 +14917 +14918 +14919 +14920 +14921 +14922 +14923 +14924 +14925 +14926 +14927 +14928 +14929 +14930 +14931 +14932 +14933 +14934 +14935 +14936 +14937 +14938 +14939 +14940 +14941 +14942 +14943 +14944 +14945 +14946 +14947 +14948 +14949 +14950 +14951 +14952 +14953 +14954 +14955 +14956 +14957 +14958 +14959 +14960 +14961 +14962 +14963 +14964 +14965 +14966 +14967 +14968 +14969 +14970 +14971 +14972 +14973 +14974 +14975 +14976 +14977 +14978 +14979 +14980 +14981 +14982 +14983 +14984 +14985 +14986 +14987 +14988 +14989 +14990 +14991 +14992 +14993 +14994 +14995 +14996 +14997 +14998 +14999 +15000 +15001 +15002 +15003 +15004 +15005 +15006 +15007 +15008 +15009 +15010 +15011 +15012 +15013 +15014 +15015 +15016 +15017 +15018 +15019 +15020 +15021 +15022 +15023 +15024 +15025 +15026 +15027 +15028 +15029 +15030 +15031 +15032 +15033 +15034 +15035 +15036 +15037 +15038 +15039 +15040 +15041 +15042 +15043 +15044 +15045 +15046 +15047 +15048 +15049 +15050 +15051 +15052 +15053 +15054 +15055 +15056 +15057 +15058 +15059 +15060 +15061 +15062 +15063 +15064 +15065 +15066 +15067 +15068 +15069 +15070 +15071 +15072 +15073 +15074 +15075 +15076 +15077 +15078 +15079 +15080 +15081 +15082 +15083 +15084 +15085 +15086 +15087 +15088 +15089 +15090 +15091 +15092 +15093 +15094 +15095 +15096 +15097 +15098 +15099 +15100 +15101 +15102 +15103 +15104 +15105 +15106 +15107 +15108 +15109 +15110 +15111 +15112 +15113 +15114 +15115 +15116 +15117 +15118 +15119 +15120 +15121 +15122 +15123 +15124 +15125 +15126 +15127 +15128 +15129 +15130 +15131 +15132 +15133 +15134 +15135 +15136 +15137 +15138 +15139 +15140 +15141 +15142 +15143 +15144 +15145 +15146 +15147 +15148 +15149 +15150 +15151 +15152 +15153 +15154 +15155 +15156 +15157 +15158 +15159 +15160 +15161 +15162 +15163 +15164 +15165 +15166 +15167 +15168 +15169 +15170 +15171 +15172 +15173 +15174 +15175 +15176 +15177 +15178 +15179 +15180 +15181 +15182 +15183 +15184 +15185 +15186 +15187 +15188 +15189 +15190 +15191 +15192 +15193 +15194 +15195 +15196 +15197 +15198 +15199 +15200 +15201 +15202 +15203 +15204 +15205 +15206 +15207 +15208 +15209 +15210 +15211 +15212 +15213 +15214 +15215 +15216 +15217 +15218 +15219 +15220 +15221 +15222 +15223 +15224 +15225 +15226 +15227 +15228 +15229 +15230 +15231 +15232 +15233 +15234 +15235 +15236 +15237 +15238 +15239 +15240 +15241 +15242 +15243 +15244 +15245 +15246 +15247 +15248 +15249 +15250 +15251 +15252 +15253 +15254 +15255 +15256 +15257 +15258 +15259 +15260 +15261 +15262 +15263 +15264 +15265 +15266 +15267 +15268 +15269 +15270 +15271 +15272 +15273 +15274 +15275 +15276 +15277 +15278 +15279 +15280 +15281 +15282 +15283 +15284 +15285 +15286 +15287 +15288 +15289 +15290 +15291 +15292 +15293 +15294 +15295 +15296 +15297 +15298 +15299 +15300 +15301 +15302 +15303 +15304 +15305 +15306 +15307 +15308 +15309 +15310 +15311 +15312 +15313 +15314 +15315 +15316 +15317 +15318 +15319 +15320 +15321 +15322 +15323 +15324 +15325 +15326 +15327 +15328 +15329 +15330 +15331 +15332 +15333 +15334 +15335 +15336 +15337 +15338 +15339 +15340 +15341 +15342 +15343 +15344 +15345 +15346 +15347 +15348 +15349 +15350 +15351 +15352 +15353 +15354 +15355 +15356 +15357 +15358 +15359 +15360 +15361 +15362 +15363 +15364 +15365 +15366 +15367 +15368 +15369 +15370 +15371 +15372 +15373 +15374 +15375 +15376 +15377 +15378 +15379 +15380 +15381 +15382 +15383 +15384 +15385 +15386 +15387 +15388 +15389 +15390 +15391 +15392 +15393 +15394 +15395 +15396 +15397 +15398 +15399 +15400 +15401 +15402 +15403 +15404 +15405 +15406 +15407 +15408 +15409 +15410 +15411 +15412 +15413 +15414 +15415 +15416 +15417 +15418 +15419 +15420 +15421 +15422 +15423 +15424 +15425 +15426 +15427 +15428 +15429 +15430 +15431 +15432 +15433 +15434 +15435 +15436 +15437 +15438 +15439 +15440 +15441 +15442 +15443 +15444 +15445 +15446 +15447 +15448 +15449 +15450 +15451 +15452 +15453 +15454 +15455 +15456 +15457 +15458 +15459 +15460 +15461 +15462 +15463 +15464 +15465 +15466 +15467 +15468 +15469 +15470 +15471 +15472 +15473 +15474 +15475 +15476 +15477 +15478 +15479 +15480 +15481 +15482 +15483 +15484 +15485 +15486 +15487 +15488 +15489 +15490 +15491 +15492 +15493 +15494 +15495 +15496 +15497 +15498 +15499 +15500 +15501 +15502 +15503 +15504 +15505 +15506 +15507 +15508 +15509 +15510 +15511 +15512 +15513 +15514 +15515 +15516 +15517 +15518 +15519 +15520 +15521 +15522 +15523 +15524 +15525 +15526 +15527 +15528 +15529 +15530 +15531 +15532 +15533 +15534 +15535 +15536 +15537 +15538 +15539 +15540 +15541 +15542 +15543 +15544 +15545 +15546 +15547 +15548 +15549 +15550 +15551 +15552 +15553 +15554 +15555 +15556 +15557 +15558 +15559 +15560 +15561 +15562 +15563 +15564 +15565 +15566 +15567 +15568 +15569 +15570 +15571 +15572 +15573 +15574 +15575 +15576 +15577 +15578 +15579 +15580 +15581 +15582 +15583 +15584 +15585 +15586 +15587 +15588 +15589 +15590 +15591 +15592 +15593 +15594 +15595 +15596 +15597 +15598 +15599 +15600 +15601 +15602 +15603 +15604 +15605 +15606 +15607 +15608 +15609 +15610 +15611 +15612 +15613 +15614 +15615 +15616 +15617 +15618 +15619 +15620 +15621 +15622 +15623 +15624 +15625 +15626 +15627 +15628 +15629 +15630 +15631 +15632 +15633 +15634 +15635 +15636 +15637 +15638 +15639 +15640 +15641 +15642 +15643 +15644 +15645 +15646 +15647 +15648 +15649 +15650 +15651 +15652 +15653 +15654 +15655 +15656 +15657 +15658 +15659 +15660 +15661 +15662 +15663 +15664 +15665 +15666 +15667 +15668 +15669 +15670 +15671 +15672 +15673 +15674 +15675 +15676 +15677 +15678 +15679 +15680 +15681 +15682 +15683 +15684 +15685 +15686 +15687 +15688 +15689 +15690 +15691 +15692 +15693 +15694 +15695 +15696 +15697 +15698 +15699 +15700 +15701 +15702 +15703 +15704 +15705 +15706 +15707 +15708 +15709 +15710 +15711 +15712 +15713 +15714 +15715 +15716 +15717 +15718 +15719 +15720 +15721 +15722 +15723 +15724 +15725 +15726 +15727 +15728 +15729 +15730 +15731 +15732 +15733 +15734 +15735 +15736 +15737 +15738 +15739 +15740 +15741 +15742 +15743 +15744 +15745 +15746 +15747 +15748 +15749 +15750 +15751 +15752 +15753 +15754 +15755 +15756 +15757 +15758 +15759 +15760 +15761 +15762 +15763 +15764 +15765 +15766 +15767 +15768 +15769 +15770 +15771 +15772 +15773 +15774 +15775 +15776 +15777 +15778 +15779 +15780 +15781 +15782 +15783 +15784 +15785 +15786 +15787 +15788 +15789 +15790 +15791 +15792 +15793 +15794 +15795 +15796 +15797 +15798 +15799 +15800 +15801 +15802 +15803 +15804 +15805 +15806 +15807 +15808 +15809 +15810 +15811 +15812 +15813 +15814 +15815 +15816 +15817 +15818 +15819 +15820 +15821 +15822 +15823 +15824 +15825 +15826 +15827 +15828 +15829 +15830 +15831 +15832 +15833 +15834 +15835 +15836 +15837 +15838 +15839 +15840 +15841 +15842 +15843 +15844 +15845 +15846 +15847 +15848 +15849 +15850 +15851 +15852 +15853 +15854 +15855 +15856 +15857 +15858 +15859 +15860 +15861 +15862 +15863 +15864 +15865 +15866 +15867 +15868 +15869 +15870 +15871 +15872 +15873 +15874 +15875 +15876 +15877 +15878 +15879 +15880 +15881 +15882 +15883 +15884 +15885 +15886 +15887 +15888 +15889 +15890 +15891 +15892 +15893 +15894 +15895 +15896 +15897 +15898 +15899 +15900 +15901 +15902 +15903 +15904 +15905 +15906 +15907 +15908 +15909 +15910 +15911 +15912 +15913 +15914 +15915 +15916 +15917 +15918 +15919 +15920 +15921 +15922 +15923 +15924 +15925 +15926 +15927 +15928 +15929 +15930 +15931 +15932 +15933 +15934 +15935 +15936 +15937 +15938 +15939 +15940 +15941 +15942 +15943 +15944 +15945 +15946 +15947 +15948 +15949 +15950 +15951 +15952 +15953 +15954 +15955 +15956 +15957 +15958 +15959 +15960 +15961 +15962 +15963 +15964 +15965 +15966 +15967 +15968 +15969 +15970 +15971 +15972 +15973 +15974 +15975 +15976 +15977 +15978 +15979 +15980 +15981 +15982 +15983 +15984 +15985 +15986 +15987 +15988 +15989 +15990 +15991 +15992 +15993 +15994 +15995 +15996 +15997 +15998 +15999 +16000 +16001 +16002 +16003 +16004 +16005 +16006 +16007 +16008 +16009 +16010 +16011 +16012 +16013 +16014 +16015 +16016 +16017 +16018 +16019 +16020 +16021 +16022 +16023 +16024 +16025 +16026 +16027 +16028 +16029 +16030 +16031 +16032 +16033 +16034 +16035 +16036 +16037 +16038 +16039 +16040 +16041 +16042 +16043 +16044 +16045 +16046 +16047 +16048 +16049 +16050 +16051 +16052 +16053 +16054 +16055 +16056 +16057 +16058 +16059 +16060 +16061 +16062 +16063 +16064 +16065 +16066 +16067 +16068 +16069 +16070 +16071 +16072 +16073 +16074 +16075 +16076 +16077 +16078 +16079 +16080 +16081 +16082 +16083 +16084 +16085 +16086 +16087 +16088 +16089 +16090 +16091 +16092 +16093 +16094 +16095 +16096 +16097 +16098 +16099 +16100 +16101 +16102 +16103 +16104 +16105 +16106 +16107 +16108 +16109 +16110 +16111 +16112 +16113 +16114 +16115 +16116 +16117 +16118 +16119 +16120 +16121 +16122 +16123 +16124 +16125 +16126 +16127 +16128 +16129 +16130 +16131 +16132 +16133 +16134 +16135 +16136 +16137 +16138 +16139 +16140 +16141 +16142 +16143 +16144 +16145 +16146 +16147 +16148 +16149 +16150 +16151 +16152 +16153 +16154 +16155 +16156 +16157 +16158 +16159 +16160 +16161 +16162 +16163 +16164 +16165 +16166 +16167 +16168 +16169 +16170 +16171 +16172 +16173 +16174 +16175 +16176 +16177 +16178 +16179 +16180 +16181 +16182 +16183 +16184 +16185 +16186 +16187 +16188 +16189 +16190 +16191 +16192 +16193 +16194 +16195 +16196 +16197 +16198 +16199 +16200 +16201 +16202 +16203 +16204 +16205 +16206 +16207 +16208 +16209 +16210 +16211 +16212 +16213 +16214 +16215 +16216 +16217 +16218 +16219 +16220 +16221 +16222 +16223 +16224 +16225 +16226 +16227 +16228 +16229 +16230 +16231 +16232 +16233 +16234 +16235 +16236 +16237 +16238 +16239 +16240 +16241 +16242 +16243 +16244 +16245 +16246 +16247 +16248 +16249 +16250 +16251 +16252 +16253 +16254 +16255 +16256 +16257 +16258 +16259 +16260 +16261 +16262 +16263 +16264 +16265 +16266 +16267 +16268 +16269 +16270 +16271 +16272 +16273 +16274 +16275 +16276 +16277 +16278 +16279 +16280 +16281 +16282 +16283 +16284 +16285 +16286 +16287 +16288 +16289 +16290 +16291 +16292 +16293 +16294 +16295 +16296 +16297 +16298 +16299 +16300 +16301 +16302 +16303 +16304 +16305 +16306 +16307 +16308 +16309 +16310 +16311 +16312 +16313 +16314 +16315 +16316 +16317 +16318 +16319 +16320 +16321 +16322 +16323 +16324 +16325 +16326 +16327 +16328 +16329 +16330 +16331 +16332 +16333 +16334 +16335 +16336 +16337 +16338 +16339 +16340 +16341 +16342 +16343 +16344 +16345 +16346 +16347 +16348 +16349 +16350 +16351 +16352 +16353 +16354 +16355 +16356 +16357 +16358 +16359 +16360 +16361 +16362 +16363 +16364 +16365 +16366 +16367 +16368 +16369 +16370 +16371 +16372 +16373 +16374 +16375 +16376 +16377 +16378 +16379 +16380 +16381 +16382 +16383 +16384 +16385 +16386 +16387 +16388 +16389 +16390 +16391 +16392 +16393 +16394 +16395 +16396 +16397 +16398 +16399 +16400 +16401 +16402 +16403 +16404 +16405 +16406 +16407 +16408 +16409 +16410 +16411 +16412 +16413 +16414 +16415 +16416 +16417 +16418 +16419 +16420 +16421 +16422 +16423 +16424 +16425 +16426 +16427 +16428 +16429 +16430 +16431 +16432 +16433 +16434 +16435 +16436 +16437 +16438 +16439 +16440 +16441 +16442 +16443 +16444 +16445 +16446 +16447 +16448 +16449 +16450 +16451 +16452 +16453 +16454 +16455 +16456 +16457 +16458 +16459 +16460 +16461 +16462 +16463 +16464 +16465 +16466 +16467 +16468 +16469 +16470 +16471 +16472 +16473 +16474 +16475 +16476 +16477 +16478 +16479 +16480 +16481 +16482 +16483 +16484 +16485 +16486 +16487 +16488 +16489 +16490 +16491 +16492 +16493 +16494 +16495 +16496 +16497 +16498 +16499 +16500 +16501 +16502 +16503 +16504 +16505 +16506 +16507 +16508 +16509 +16510 +16511 +16512 +16513 +16514 +16515 +16516 +16517 +16518 +16519 +16520 +16521 +16522 +16523 +16524 +16525 +16526 +16527 +16528 +16529 +16530 +16531 +16532 +16533 +16534 +16535 +16536 +16537 +16538 +16539 +16540 +16541 +16542 +16543 +16544 +16545 +16546 +16547 +16548 +16549 +16550 +16551 +16552 +16553 +16554 +16555 +16556 +16557 +16558 +16559 +16560 +16561 +16562 +16563 +16564 +16565 +16566 +16567 +16568 +16569 +16570 +16571 +16572 +16573 +16574 +16575 +16576 +16577 +16578 +16579 +16580 +16581 +16582 +16583 +16584 +16585 +16586 +16587 +16588 +16589 +16590 +16591 +16592 +16593 +16594 +16595 +16596 +16597 +16598 +16599 +16600 +16601 +16602 +16603 +16604 +16605 +16606 +16607 +16608 +16609 +16610 +16611 +16612 +16613 +16614 +16615 +16616 +16617 +16618 +16619 +16620 +16621 +16622 +16623 +16624 +16625 +16626 +16627 +16628 +16629 +16630 +16631 +16632 +16633 +16634 +16635 +16636 +16637 +16638 +16639 +16640 +16641 +16642 +16643 +16644 +16645 +16646 +16647 +16648 +16649 +16650 +16651 +16652 +16653 +16654 +16655 +16656 +16657 +16658 +16659 +16660 +16661 +16662 +16663 +16664 +16665 +16666 +16667 +16668 +16669 +16670 +16671 +16672 +16673 +16674 +16675 +16676 +16677 +16678 +16679 +16680 +16681 +16682 +16683 +16684 +16685 +16686 +16687 +16688 +16689 +16690 +16691 +16692 +16693 +16694 +16695 +16696 +16697 +16698 +16699 +16700 +16701 +16702 +16703 +16704 +16705 +16706 +16707 +16708 +16709 +16710 +16711 +16712 +16713 +16714 +16715 +16716 +16717 +16718 +16719 +16720 +16721 +16722 +16723 +16724 +16725 +16726 +16727 +16728 +16729 +16730 +16731 +16732 +16733 +16734 +16735 +16736 +16737 +16738 +16739 +16740 +16741 +16742 +16743 +16744 +16745 +16746 +16747 +16748 +16749 +16750 +16751 +16752 +16753 +16754 +16755 +16756 +16757 +16758 +16759 +16760 +16761 +16762 +16763 +16764 +16765 +16766 +16767 +16768 +16769 +16770 +16771 +16772 +16773 +16774 +16775 +16776 +16777 +16778 +16779 +16780 +16781 +16782 +16783 +16784 +16785 +16786 +16787 +16788 +16789 +16790 +16791 +16792 +16793 +16794 +16795 +16796 +16797 +16798 +16799 +16800 +16801 +16802 +16803 +16804 +16805 +16806 +16807 +16808 +16809 +16810 +16811 +16812 +16813 +16814 +16815 +16816 +16817 +16818 +16819 +16820 +16821 +16822 +16823 +16824 +16825 +16826 +16827 +16828 +16829 +16830 +16831 +16832 +16833 +16834 +16835 +16836 +16837 +16838 +16839 +16840 +16841 +16842 +16843 +16844 +16845 +16846 +16847 +16848 +16849 +16850 +16851 +16852 +16853 +16854 +16855 +16856 +16857 +16858 +16859 +16860 +16861 +16862 +16863 +16864 +16865 +16866 +16867 +16868 +16869 +16870 +16871 +16872 +16873 +16874 +16875 +16876 +16877 +16878 +16879 +16880 +16881 +16882 +16883 +16884 +16885 +16886 +16887 +16888 +16889 +16890 +16891 +16892 +16893 +16894 +16895 +16896 +16897 +16898 +16899 +16900 +16901 +16902 +16903 +16904 +16905 +16906 +16907 +16908 +16909 +16910 +16911 +16912 +16913 +16914 +16915 +16916 +16917 +16918 +16919 +16920 +16921 +16922 +16923 +16924 +16925 +16926 +16927 +16928 +16929 +16930 +16931 +16932 +16933 +16934 +16935 +16936 +16937 +16938 +16939 +16940 +16941 +16942 +16943 +16944 +16945 +16946 +16947 +16948 +16949 +16950 +16951 +16952 +16953 +16954 +16955 +16956 +16957 +16958 +16959 +16960 +16961 +16962 +16963 +16964 +16965 +16966 +16967 +16968 +16969 +16970 +16971 +16972 +16973 +16974 +16975 +16976 +16977 +16978 +16979 +16980 +16981 +16982 +16983 +16984 +16985 +16986 +16987 +16988 +16989 +16990 +16991 +16992 +16993 +16994 +16995 +16996 +16997 +16998 +16999 +17000 +17001 +17002 +17003 +17004 +17005 +17006 +17007 +17008 +17009 +17010 +17011 +17012 +17013 +17014 +17015 +17016 +17017 +17018 +17019 +17020 +17021 +17022 +17023 +17024 +17025 +17026 +17027 +17028 +17029 +17030 +17031 +17032 +17033 +17034 +17035 +17036 +17037 +17038 +17039 +17040 +17041 +17042 +17043 +17044 +17045 +17046 +17047 +17048 +17049 +17050 +17051 +17052 +17053 +17054 +17055 +17056 +17057 +17058 +17059 +17060 +17061 +17062 +17063 +17064 +17065 +17066 +17067 +17068 +17069 +17070 +17071 +17072 +17073 +17074 +17075 +17076 +17077 +17078 +17079 +17080 +17081 +17082 +17083 +17084 +17085 +17086 +17087 +17088 +17089 +17090 +17091 +17092 +17093 +17094 +17095 +17096 +17097 +17098 +17099 +17100 +17101 +17102 +17103 +17104 +17105 +17106 +17107 +17108 +17109 +17110 +17111 +17112 +17113 +17114 +17115 +17116 +17117 +17118 +17119 +17120 +17121 +17122 +17123 +17124 +17125 +17126 +17127 +17128 +17129 +17130 +17131 +17132 +17133 +17134 +17135 +17136 +17137 +17138 +17139 +17140 +17141 +17142 +17143 +17144 +17145 +17146 +17147 +17148 +17149 +17150 +17151 +17152 +17153 +17154 +17155 +17156 +17157 +17158 +17159 +17160 +17161 +17162 +17163 +17164 +17165 +17166 +17167 +17168 +17169 +17170 +17171 +17172 +17173 +17174 +17175 +17176 +17177 +17178 +17179 +17180 +17181 +17182 +17183 +17184 +17185 +17186 +17187 +17188 +17189 +17190 +17191 +17192 +17193 +17194 +17195 +17196 +17197 +17198 +17199 +17200 +17201 +17202 +17203 +17204 +17205 +17206 +17207 +17208 +17209 +17210 +17211 +17212 +17213 +17214 +17215 +17216 +17217 +17218 +17219 +17220 +17221 +17222 +17223 +17224 +17225 +17226 +17227 +17228 +17229 +17230 +17231 +17232 +17233 +17234 +17235 +17236 +17237 +17238 +17239 +17240 +17241 +17242 +17243 +17244 +17245 +17246 +17247 +17248 +17249 +17250 +17251 +17252 +17253 +17254 +17255 +17256 +17257 +17258 +17259 +17260 +17261 +17262 +17263 +17264 +17265 +17266 +17267 +17268 +17269 +17270 +17271 +17272 +17273 +17274 +17275 +17276 +17277 +17278 +17279 +17280 +17281 +17282 +17283 +17284 +17285 +17286 +17287 +17288 +17289 +17290 +17291 +17292 +17293 +17294 +17295 +17296 +17297 +17298 +17299 +17300 +17301 +17302 +17303 +17304 +17305 +17306 +17307 +17308 +17309 +17310 +17311 +17312 +17313 +17314 +17315 +17316 +17317 +17318 +17319 +17320 +17321 +17322 +17323 +17324 +17325 +17326 +17327 +17328 +17329 +17330 +17331 +17332 +17333 +17334 +17335 +17336 +17337 +17338 +17339 +17340 +17341 +17342 +17343 +17344 +17345 +17346 +17347 +17348 +17349 +17350 +17351 +17352 +17353 +17354 +17355 +17356 +17357 +17358 +17359 +17360 +17361 +17362 +17363 +17364 +17365 +17366 +17367 +17368 +17369 +17370 +17371 +17372 +17373 +17374 +17375 +17376 +17377 +17378 +17379 +17380 +17381 +17382 +17383 +17384 +17385 +17386 +17387 +17388 +17389 +17390 +17391 +17392 +17393 +17394 +17395 +17396 +17397 +17398 +17399 +17400 +17401 +17402 +17403 +17404 +17405 +17406 +17407 +17408 +17409 +17410 +17411 +17412 +17413 +17414 +17415 +17416 +17417 +17418 +17419 +17420 +17421 +17422 +17423 +17424 +17425 +17426 +17427 +17428 +17429 +17430 +17431 +17432 +17433 +17434 +17435 +17436 +17437 +17438 +17439 +17440 +17441 +17442 +17443 +17444 +17445 +17446 +17447 +17448 +17449 +17450 +17451 +17452 +17453 +17454 +17455 +17456 +17457 +17458 +17459 +17460 +17461 +17462 +17463 +17464 +17465 +17466 +17467 +17468 +17469 +17470 +17471 +17472 +17473 +17474 +17475 +17476 +17477 +17478 +17479 +17480 +17481 +17482 +17483 +17484 +17485 +17486 +17487 +17488 +17489 +17490 +17491 +17492 +17493 +17494 +17495 +17496 +17497 +17498 +17499 +17500 +17501 +17502 +17503 +17504 +17505 +17506 +17507 +17508 +17509 +17510 +17511 +17512 +17513 +17514 +17515 +17516 +17517 +17518 +17519 +17520 +17521 +17522 +17523 +17524 +17525 +17526 +17527 +17528 +17529 +17530 +17531 +17532 +17533 +17534 +17535 +17536 +17537 +17538 +17539 +17540 +17541 +17542 +17543 +17544 +17545 +17546 +17547 +17548 +17549 +17550 +17551 +17552 +17553 +17554 +17555 +17556 +17557 +17558 +17559 +17560 +17561 +17562 +17563 +17564 +17565 +17566 +17567 +17568 +17569 +17570 +17571 +17572 +17573 +17574 +17575 +17576 +17577 +17578 +17579 +17580 +17581 +17582 +17583 +17584 +17585 +17586 +17587 +17588 +17589 +17590 +17591 +17592 +17593 +17594 +17595 +17596 +17597 +17598 +17599 +17600 +17601 +17602 +17603 +17604 +17605 +17606 +17607 +17608 +17609 +17610 +17611 +17612 +17613 +17614 +17615 +17616 +17617 +17618 +17619 +17620 +17621 +17622 +17623 +17624 +17625 +17626 +17627 +17628 +17629 +17630 +17631 +17632 +17633 +17634 +17635 +17636 +17637 +17638 +17639 +17640 +17641 +17642 +17643 +17644 +17645 +17646 +17647 +17648 +17649 +17650 +17651 +17652 +17653 +17654 +17655 +17656 +17657 +17658 +17659 +17660 +17661 +17662 +17663 +17664 +17665 +17666 +17667 +17668 +17669 +17670 +17671 +17672 +17673 +17674 +17675 +17676 +17677 +17678 +17679 +17680 +17681 +17682 +17683 +17684 +17685 +17686 +17687 +17688 +17689 +17690 +17691 +17692 +17693 +17694 +17695 +17696 +17697 +17698 +17699 +17700 +17701 +17702 +17703 +17704 +17705 +17706 +17707 +17708 +17709 +17710 +17711 +17712 +17713 +17714 +17715 +17716 +17717 +17718 +17719 +17720 +17721 +17722 +17723 +17724 +17725 +17726 +17727 +17728 +17729 +17730 +17731 +17732 +17733 +17734 +17735 +17736 +17737 +17738 +17739 +17740 +17741 +17742 +17743 +17744 +17745 +17746 +17747 +17748 +17749 +17750 +17751 +17752 +17753 +17754 +17755 +17756 +17757 +17758 +17759 +17760 +17761 +17762 +17763 +17764 +17765 +17766 +17767 +17768 +17769 +17770 +17771 +17772 +17773 +17774 +17775 +17776 +17777 +17778 +17779 +17780 +17781 +17782 +17783 +17784 +17785 +17786 +17787 +17788 +17789 +17790 +17791 +17792 +17793 +17794 +17795 +17796 +17797 +17798 +17799 +17800 +17801 +17802 +17803 +17804 +17805 +17806 +17807 +17808 +17809 +17810 +17811 +17812 +17813 +17814 +17815 +17816 +17817 +17818 +17819 +17820 +17821 +17822 +17823 +17824 +17825 +17826 +17827 +17828 +17829 +17830 +17831 +17832 +17833 +17834 +17835 +17836 +17837 +17838 +17839 +17840 +17841 +17842 +17843 +17844 +17845 +17846 +17847 +17848 +17849 +17850 +17851 +17852 +17853 +17854 +17855 +17856 +17857 +17858 +17859 +17860 +17861 +17862 +17863 +17864 +17865 +17866 +17867 +17868 +17869 +17870 +17871 +17872 +17873 +17874 +17875 +17876 +17877 +17878 +17879 +17880 +17881 +17882 +17883 +17884 +17885 +17886 +17887 +17888 +17889 +17890 +17891 +17892 +17893 +17894 +17895 +17896 +17897 +17898 +17899 +17900 +17901 +17902 +17903 +17904 +17905 +17906 +17907 +17908 +17909 +17910 +17911 +17912 +17913 +17914 +17915 +17916 +17917 +17918 +17919 +17920 +17921 +17922 +17923 +17924 +17925 +17926 +17927 +17928 +17929 +17930 +17931 +17932 +17933 +17934 +17935 +17936 +17937 +17938 +17939 +17940 +17941 +17942 +17943 +17944 +17945 +17946 +17947 +17948 +17949 +17950 +17951 +17952 +17953 +17954 +17955 +17956 +17957 +17958 +17959 +17960 +17961 +17962 +17963 +17964 +17965 +17966 +17967 +17968 +17969 +17970 +17971 +17972 +17973 +17974 +17975 +17976 +17977 +17978 +17979 +17980 +17981 +17982 +17983 +17984 +17985 +17986 +17987 +17988 +17989 +17990 +17991 +17992 +17993 +17994 +17995 +17996 +17997 +17998 +17999 +18000 +18001 +18002 +18003 +18004 +18005 +18006 +18007 +18008 +18009 +18010 +18011 +18012 +18013 +18014 +18015 +18016 +18017 +18018 +18019 +18020 +18021 +18022 +18023 +18024 +18025 +18026 +18027 +18028 +18029 +18030 +18031 +18032 +18033 +18034 +18035 +18036 +18037 +18038 +18039 +18040 +18041 +18042 +18043 +18044 +18045 +18046 +18047 +18048 +18049 +18050 +18051 +18052 +18053 +18054 +18055 +18056 +18057 +18058 +18059 +18060 +18061 +18062 +18063 +18064 +18065 +18066 +18067 +18068 +18069 +18070 +18071 +18072 +18073 +18074 +18075 +18076 +18077 +18078 +18079 +18080 +18081 +18082 +18083 +18084 +18085 +18086 +18087 +18088 +18089 +18090 +18091 +18092 +18093 +18094 +18095 +18096 +18097 +18098 +18099 +18100 +18101 +18102 +18103 +18104 +18105 +18106 +18107 +18108 +18109 +18110 +18111 +18112 +18113 +18114 +18115 +18116 +18117 +18118 +18119 +18120 +18121 +18122 +18123 +18124 +18125 +18126 +18127 +18128 +18129 +18130 +18131 +18132 +18133 +18134 +18135 +18136 +18137 +18138 +18139 +18140 +18141 +18142 +18143 +18144 +18145 +18146 +18147 +18148 +18149 +18150 +18151 +18152 +18153 +18154 +18155 +18156 +18157 +18158 +18159 +18160 +18161 +18162 +18163 +18164 +18165 +18166 +18167 +18168 +18169 +18170 +18171 +18172 +18173 +18174 +18175 +18176 +18177 +18178 +18179 +18180 +18181 +18182 +18183 +18184 +18185 +18186 +18187 +18188 +18189 +18190 +18191 +18192 +18193 +18194 +18195 +18196 +18197 +18198 +18199 +18200 +18201 +18202 +18203 +18204 +18205 +18206 +18207 +18208 +18209 +18210 +18211 +18212 +18213 +18214 +18215 +18216 +18217 +18218 +18219 +18220 +18221 +18222 +18223 +18224 +18225 +18226 +18227 +18228 +18229 +18230 +18231 +18232 +18233 +18234 +18235 +18236 +18237 +18238 +18239 +18240 +18241 +18242 +18243 +18244 +18245 +18246 +18247 +18248 +18249 +18250 +18251 +18252 +18253 +18254 +18255 +18256 +18257 +18258 +18259 +18260 +18261 +18262 +18263 +18264 +18265 +18266 +18267 +18268 +18269 +18270 +18271 +18272 +18273 +18274 +18275 +18276 +18277 +18278 +18279 +18280 +18281 +18282 +18283 +18284 +18285 +18286 +18287 +18288 +18289 +18290 +18291 +18292 +18293 +18294 +18295 +18296 +18297 +18298 +18299 +18300 +18301 +18302 +18303 +18304 +18305 +18306 +18307 +18308 +18309 +18310 +18311 +18312 +18313 +18314 +18315 +18316 +18317 +18318 +18319 +18320 +18321 +18322 +18323 +18324 +18325 +18326 +18327 +18328 +18329 +18330 +18331 +18332 +18333 +18334 +18335 +18336 +18337 +18338 +18339 +18340 +18341 +18342 +18343 +18344 +18345 +18346 +18347 +18348 +18349 +18350 +18351 +18352 +18353 +18354 +18355 +18356 +18357 +18358 +18359 +18360 +18361 +18362 +18363 +18364 +18365 +18366 +18367 +18368 +18369 +18370 +18371 +18372 +18373 +18374 +18375 +18376 +18377 +18378 +18379 +18380 +18381 +18382 +18383 +18384 +18385 +18386 +18387 +18388 +18389 +18390 +18391 +18392 +18393 +18394 +18395 +18396 +18397 +18398 +18399 +18400 +18401 +18402 +18403 +18404 +18405 +18406 +18407 +18408 +18409 +18410 +18411 +18412 +18413 +18414 +18415 +18416 +18417 +18418 +18419 +18420 +18421 +18422 +18423 +18424 +18425 +18426 +18427 +18428 +18429 +18430 +18431 +18432 +18433 +18434 +18435 +18436 +18437 +18438 +18439 +18440 +18441 +18442 +18443 +18444 +18445 +18446 +18447 +18448 +18449 +18450 +18451 +18452 +18453 +18454 +18455 +18456 +18457 +18458 +18459 +18460 +18461 +18462 +18463 +18464 +18465 +18466 +18467 +18468 +18469 +18470 +18471 +18472 +18473 +18474 +18475 +18476 +18477 +18478 +18479 +18480 +18481 +18482 +18483 +18484 +18485 +18486 +18487 +18488 +18489 +18490 +18491 +18492 +18493 +18494 +18495 +18496 +18497 +18498 +18499 +18500 +18501 +18502 +18503 +18504 +18505 +18506 +18507 +18508 +18509 +18510 +18511 +18512 +18513 +18514 +18515 +18516 +18517 +18518 +18519 +18520 +18521 +18522 +18523 +18524 +18525 +18526 +18527 +18528 +18529 +18530 +18531 +18532 +18533 +18534 +18535 +18536 +18537 +18538 +18539 +18540 +18541 +18542 +18543 +18544 +18545 +18546 +18547 +18548 +18549 +18550 +18551 +18552 +18553 +18554 +18555 +18556 +18557 +18558 +18559 +18560 +18561 +18562 +18563 +18564 +18565 +18566 +18567 +18568 +18569 +18570 +18571 +18572 +18573 +18574 +18575 +18576 +18577 +18578 +18579 +18580 +18581 +18582 +18583 +18584 +18585 +18586 +18587 +18588 +18589 +18590 +18591 +18592 +18593 +18594 +18595 +18596 +18597 +18598 +18599 +18600 +18601 +18602 +18603 +18604 +18605 +18606 +18607 +18608 +18609 +18610 +18611 +18612 +18613 +18614 +18615 +18616 +18617 +18618 +18619 +18620 +18621 +18622 +18623 +18624 +18625 +18626 +18627 +18628 +18629 +18630 +18631 +18632 +18633 +18634 +18635 +18636 +18637 +18638 +18639 +18640 +18641 +18642 +18643 +18644 +18645 +18646 +18647 +18648 +18649 +18650 +18651 +18652 +18653 +18654 +18655 +18656 +18657 +18658 +18659 +18660 +18661 +18662 +18663 +18664 +18665 +18666 +18667 +18668 +18669 +18670 +18671 +18672 +18673 +18674 +18675 +18676 +18677 +18678 +18679 +18680 +18681 +18682 +18683 +18684 +18685 +18686 +18687 +18688 +18689 +18690 +18691 +18692 +18693 +18694 +18695 +18696 +18697 +18698 +18699 +18700 +18701 +18702 +18703 +18704 +18705 +18706 +18707 +18708 +18709 +18710 +18711 +18712 +18713 +18714 +18715 +18716 +18717 +18718 +18719 +18720 +18721 +18722 +18723 +18724 +18725 +18726 +18727 +18728 +18729 +18730 +18731 +18732 +18733 +18734 +18735 +18736 +18737 +18738 +18739 +18740 +18741 +18742 +18743 +18744 +18745 +18746 +18747 +18748 +18749 +18750 +18751 +18752 +18753 +18754 +18755 +18756 +18757 +18758 +18759 +18760 +18761 +18762 +18763 +18764 +18765 +18766 +18767 +18768 +18769 +18770 +18771 +18772 +18773 +18774 +18775 +18776 +18777 +18778 +18779 +18780 +18781 +18782 +18783 +18784 +18785 +18786 +18787 +18788 +18789 +18790 +18791 +18792 +18793 +18794 +18795 +18796 +18797 +18798 +18799 +18800 +18801 +18802 +18803 +18804 +18805 +18806 +18807 +18808 +18809 +18810 +18811 +18812 +18813 +18814 +18815 +18816 +18817 +18818 +18819 +18820 +18821 +18822 +18823 +18824 +18825 +18826 +18827 +18828 +18829 +18830 +18831 +18832 +18833 +18834 +18835 +18836 +18837 +18838 +18839 +18840 +18841 +18842 +18843 +18844 +18845 +18846 +18847 +18848 +18849 +18850 +18851 +18852 +18853 +18854 +18855 +18856 +18857 +18858 +18859 +18860 +18861 +18862 +18863 +18864 +18865 +18866 +18867 +18868 +18869 +18870 +18871 +18872 +18873 +18874 +18875 +18876 +18877 +18878 +18879 +18880 +18881 +18882 +18883 +18884 +18885 +18886 +18887 +18888 +18889 +18890 +18891 +18892 +18893 +18894 +18895 +18896 +18897 +18898 +18899 +18900 +18901 +18902 +18903 +18904 +18905 +18906 +18907 +18908 +18909 +18910 +18911 +18912 +18913 +18914 +18915 +18916 +18917 +18918 +18919 +18920 +18921 +18922 +18923 +18924 +18925 +18926 +18927 +18928 +18929 +18930 +18931 +18932 +18933 +18934 +18935 +18936 +18937 +18938 +18939 +18940 +18941 +18942 +18943 +18944 +18945 +18946 +18947 +18948 +18949 +18950 +18951 +18952 +18953 +18954 +18955 +18956 +18957 +18958 +18959 +18960 +18961 +18962 +18963 +18964 +18965 +18966 +18967 +18968 +18969 +18970 +18971 +18972 +18973 +18974 +18975 +18976 +18977 +18978 +18979 +18980 +18981 +18982 +18983 +18984 +18985 +18986 +18987 +18988 +18989 +18990 +18991 +18992 +18993 +18994 +18995 +18996 +18997 +18998 +18999 +19000 +19001 +19002 +19003 +19004 +19005 +19006 +19007 +19008 +19009 +19010 +19011 +19012 +19013 +19014 +19015 +19016 +19017 +19018 +19019 +19020 +19021 +19022 +19023 +19024 +19025 +19026 +19027 +19028 +19029 +19030 +19031 +19032 +19033 +19034 +19035 +19036 +19037 +19038 +19039 +19040 +19041 +19042 +19043 +19044 +19045 +19046 +19047 +19048 +19049 +19050 +19051 +19052 +19053 +19054 +19055 +19056 +19057 +19058 +19059 +19060 +19061 +19062 +19063 +19064 +19065 +19066 +19067 +19068 +19069 +19070 +19071 +19072 +19073 +19074 +19075 +19076 +19077 +19078 +19079 +19080 +19081 +19082 +19083 +19084 +19085 +19086 +19087 +19088 +19089 +19090 +19091 +19092 +19093 +19094 +19095 +19096 +19097 +19098 +19099 +19100 +19101 +19102 +19103 +19104 +19105 +19106 +19107 +19108 +19109 +19110 +19111 +19112 +19113 +19114 +19115 +19116 +19117 +19118 +19119 +19120 +19121 +19122 +19123 +19124 +19125 +19126 +19127 +19128 +19129 +19130 +19131 +19132 +19133 +19134 +19135 +19136 +19137 +19138 +19139 +19140 +19141 +19142 +19143 +19144 +19145 +19146 +19147 +19148 +19149 +19150 +19151 +19152 +19153 +19154 +19155 +19156 +19157 +19158 +19159 +19160 +19161 +19162 +19163 +19164 +19165 +19166 +19167 +19168 +19169 +19170 +19171 +19172 +19173 +19174 +19175 +19176 +19177 +19178 +19179 +19180 +19181 +19182 +19183 +19184 +19185 +19186 +19187 +19188 +19189 +19190 +19191 +19192 +19193 +19194 +19195 +19196 +19197 +19198 +19199 +19200 +19201 +19202 +19203 +19204 +19205 +19206 +19207 +19208 +19209 +19210 +19211 +19212 +19213 +19214 +19215 +19216 +19217 +19218 +19219 +19220 +19221 +19222 +19223 +19224 +19225 +19226 +19227 +19228 +19229 +19230 +19231 +19232 +19233 +19234 +19235 +19236 +19237 +19238 +19239 +19240 +19241 +19242 +19243 +19244 +19245 +19246 +19247 +19248 +19249 +19250 +19251 +19252 +19253 +19254 +19255 +19256 +19257 +19258 +19259 +19260 +19261 +19262 +19263 +19264 +19265 +19266 +19267 +19268 +19269 +19270 +19271 +19272 +19273 +19274 +19275 +19276 +19277 +19278 +19279 +19280 +19281 +19282 +19283 +19284 +19285 +19286 +19287 +19288 +19289 +19290 +19291 +19292 +19293 +19294 +19295 +19296 +19297 +19298 +19299 +19300 +19301 +19302 +19303 +19304 +19305 +19306 +19307 +19308 +19309 +19310 +19311 +19312 +19313 +19314 +19315 +19316 +19317 +19318 +19319 +19320 +19321 +19322 +19323 +19324 +19325 +19326 +19327 +19328 +19329 +19330 +19331 +19332 +19333 +19334 +19335 +19336 +19337 +19338 +19339 +19340 +19341 +19342 +19343 +19344 +19345 +19346 +19347 +19348 +19349 +19350 +19351 +19352 +19353 +19354 +19355 +19356 +19357 +19358 +19359 +19360 +19361 +19362 +19363 +19364 +19365 +19366 +19367 +19368 +19369 +19370 +19371 +19372 +19373 +19374 +19375 +19376 +19377 +19378 +19379 +19380 +19381 +19382 +19383 +19384 +19385 +19386 +19387 +19388 +19389 +19390 +19391 +19392 +19393 +19394 +19395 +19396 +19397 +19398 +19399 +19400 +19401 +19402 +19403 +19404 +19405 +19406 +19407 +19408 +19409 +19410 +19411 +19412 +19413 +19414 +19415 +19416 +19417 +19418 +19419 +19420 +19421 +19422 +19423 +19424 +19425 +19426 +19427 +19428 +19429 +19430 +19431 +19432 +19433 +19434 +19435 +19436 +19437 +19438 +19439 +19440 +19441 +19442 +19443 +19444 +19445 +19446 +19447 +19448 +19449 +19450 +19451 +19452 +19453 +19454 +19455 +19456 +19457 +19458 +19459 +19460 +19461 +19462 +19463 +19464 +19465 +19466 +19467 +19468 +19469 +19470 +19471 +19472 +19473 +19474 +19475 +19476 +19477 +19478 +19479 +19480 +19481 +19482 +19483 +19484 +19485 +19486 +19487 +19488 +19489 +19490 +19491 +19492 +19493 +19494 +19495 +19496 +19497 +19498 +19499 +19500 +19501 +19502 +19503 +19504 +19505 +19506 +19507 +19508 +19509 +19510 +19511 +19512 +19513 +19514 +19515 +19516 +19517 +19518 +19519 +19520 +19521 +19522 +19523 +19524 +19525 +19526 +19527 +19528 +19529 +19530 +19531 +19532 +19533 +19534 +19535 +19536 +19537 +19538 +19539 +19540 +19541 +19542 +19543 +19544 +19545 +19546 +19547 +19548 +19549 +19550 +19551 +19552 +19553 +19554 +19555 +19556 +19557 +19558 +19559 +19560 +19561 +19562 +19563 +19564 +19565 +19566 +19567 +19568 +19569 +19570 +19571 +19572 +19573 +19574 +19575 +19576 +19577 +19578 +19579 +19580 +19581 +19582 +19583 +19584 +19585 +19586 +19587 +19588 +19589 +19590 +19591 +19592 +19593 +19594 +19595 +19596 +19597 +19598 +19599 +19600 +19601 +19602 +19603 +19604 +19605 +19606 +19607 +19608 +19609 +19610 +19611 +19612 +19613 +19614 +19615 +19616 +19617 +19618 +19619 +19620 +19621 +19622 +19623 +19624 +19625 +19626 +19627 +19628 +19629 +19630 +19631 +19632 +19633 +19634 +19635 +19636 +19637 +19638 +19639 +19640 +19641 +19642 +19643 +19644 +19645 +19646 +19647 +19648 +19649 +19650 +19651 +19652 +19653 +19654 +19655 +19656 +19657 +19658 +19659 +19660 +19661 +19662 +19663 +19664 +19665 +19666 +19667 +19668 +19669 +19670 +19671 +19672 +19673 +19674 +19675 +19676 +19677 +19678 +19679 +19680 +19681 +19682 +19683 +19684 +19685 +19686 +19687 +19688 +19689 +19690 +19691 +19692 +19693 +19694 +19695 +19696 +19697 +19698 +19699 +19700 +19701 +19702 +19703 +19704 +19705 +19706 +19707 +19708 +19709 +19710 +19711 +19712 +19713 +19714 +19715 +19716 +19717 +19718 +19719 +19720 +19721 +19722 +19723 +19724 +19725 +19726 +19727 +19728 +19729 +19730 +19731 +19732 +19733 +19734 +19735 +19736 +19737 +19738 +19739 +19740 +19741 +19742 +19743 +19744 +19745 +19746 +19747 +19748 +19749 +19750 +19751 +19752 +19753 +19754 +19755 +19756 +19757 +19758 +19759 +19760 +19761 +19762 +19763 +19764 +19765 +19766 +19767 +19768 +19769 +19770 +19771 +19772 +19773 +19774 +19775 +19776 +19777 +19778 +19779 +19780 +19781 +19782 +19783 +19784 +19785 +19786 +19787 +19788 +19789 +19790 +19791 +19792 +19793 +19794 +19795 +19796 +19797 +19798 +19799 +19800 +19801 +19802 +19803 +19804 +19805 +19806 +19807 +19808 +19809 +19810 +19811 +19812 +19813 +19814 +19815 +19816 +19817 +19818 +19819 +19820 +19821 +19822 +19823 +19824 +19825 +19826 +19827 +19828 +19829 +19830 +19831 +19832 +19833 +19834 +19835 +19836 +19837 +19838 +19839 +19840 +19841 +19842 +19843 +19844 +19845 +19846 +19847 +19848 +19849 +19850 +19851 +19852 +19853 +19854 +19855 +19856 +19857 +19858 +19859 +19860 +19861 +19862 +19863 +19864 +19865 +19866 +19867 +19868 +19869 +19870 +19871 +19872 +19873 +19874 +19875 +19876 +19877 +19878 +19879 +19880 +19881 +19882 +19883 +19884 +19885 +19886 +19887 +19888 +19889 +19890 +19891 +19892 +19893 +19894 +19895 +19896 +19897 +19898 +19899 +19900 +19901 +19902 +19903 +19904 +19905 +19906 +19907 +19908 +19909 +19910 +19911 +19912 +19913 +19914 +19915 +19916 +19917 +19918 +19919 +19920 +19921 +19922 +19923 +19924 +19925 +19926 +19927 +19928 +19929 +19930 +19931 +19932 +19933 +19934 +19935 +19936 +19937 +19938 +19939 +19940 +19941 +19942 +19943 +19944 +19945 +19946 +19947 +19948 +19949 +19950 +19951 +19952 +19953 +19954 +19955 +19956 +19957 +19958 +19959 +19960 +19961 +19962 +19963 +19964 +19965 +19966 +19967 +19968 +19969 +19970 +19971 +19972 +19973 +19974 +19975 +19976 +19977 +19978 +19979 +19980 +19981 +19982 +19983 +19984 +19985 +19986 +19987 +19988 +19989 +19990 +19991 +19992 +19993 +19994 +19995 +19996 +19997 +19998 +19999 +20000 diff --git a/tests/fixtures/sort/ext_sort.txt b/tests/fixtures/sort/ext_sort.txt new file mode 100644 index 000000000..a409d67e1 --- /dev/null +++ b/tests/fixtures/sort/ext_sort.txt @@ -0,0 +1,20000 @@ +9155 +10575 +10442 +15874 +17013 +12130 +15558 +18263 +6574 +8957 +9851 +16606 +12331 +9865 +13795 +270 +6590 +11141 +4620 +5945 +10904 +8652 +8442 +8907 +1935 +13100 +3961 +7538 +4159 +11986 +4394 +9321 +15560 +5264 +5121 +11532 +6980 +2807 +19760 +8032 +5158 +13698 +4458 +9106 +3773 +1625 +9914 +8287 +5155 +14326 +18137 +19522 +9270 +6153 +1920 +12517 +13259 +17618 +9930 +3630 +15924 +4540 +263 +14212 +15620 +11328 +8704 +17848 +1614 +12587 +17970 +4542 +11976 +12885 +8743 +16323 +14582 +12101 +12472 +12620 +10713 +5148 +7522 +2417 +8602 +7860 +19596 +2892 +13359 +7731 +3707 +4628 +4710 +5642 +1610 +4784 +10128 +16341 +14168 +5829 +17901 +9447 +1041 +15193 +15260 +11224 +11723 +13368 +14011 +12200 +2001 +18479 +3965 +16642 +16680 +2384 +7557 +5539 +4305 +14588 +17386 +1359 +17721 +1142 +7287 +9946 +13139 +15022 +17237 +14454 +14358 +11297 +12485 +857 +19282 +117 +19179 +16040 +6978 +10743 +19161 +12308 +9509 +13233 +4666 +5850 +17040 +2473 +17323 +6728 +11500 +4401 +13887 +19944 +17601 +19731 +10715 +8327 +11196 +7944 +9068 +13253 +13913 +13419 +17649 +16894 +3333 +5747 +3000 +12724 +17772 +17341 +11854 +6042 +10362 +3438 +13828 +471 +17747 +13707 +17902 +8184 +3385 +19387 +46 +1848 +15848 +10768 +17481 +436 +17581 +4629 +13210 +5085 +19485 +44 +12549 +16407 +9646 +9884 +15802 +2461 +15134 +2936 +8156 +17411 +1228 +18200 +14616 +17443 +5512 +6017 +10137 +11424 +11940 +6655 +17669 +6147 +16570 +17281 +18915 +19689 +18013 +17895 +6925 +19766 +18634 +7195 +7001 +12335 +3908 +18754 +4833 +12486 +12892 +18879 +3691 +1693 +158 +8682 +1029 +3429 +644 +1664 +13972 +5352 +15422 +1928 +14561 +3322 +3570 +6298 +2251 +12216 +19823 +12658 +2081 +4177 +13843 +18454 +13755 +9340 +6373 +3290 +2893 +16274 +16610 +12782 +7269 +5681 +19372 +7843 +14844 +16236 +16004 +1136 +5759 +19347 +7684 +7435 +5892 +7305 +2504 +7064 +13264 +8781 +1327 +19943 +18122 +1803 +9999 +13695 +9742 +8274 +744 +2252 +10524 +1434 +4601 +6071 +10489 +19626 +10745 +18312 +872 +19166 +3417 +9272 +1433 +9431 +6486 +3532 +18452 +17830 +9835 +2495 +10475 +16725 +16019 +6594 +11355 +13055 +14782 +11924 +18838 +3563 +428 +12993 +14223 +6658 +2783 +1726 +6929 +13053 +19175 +8564 +4867 +19604 +17416 +9347 +2275 +16381 +9817 +11176 +14576 +6906 +9805 +14149 +2241 +11030 +453 +835 +15452 +2879 +4018 +17396 +16133 +1301 +3450 +10182 +2389 +19201 +4443 +14368 +2537 +7452 +1583 +13955 +3875 +7479 +17561 +3247 +16310 +5253 +8899 +6523 +10260 +13065 +11077 +15109 +7249 +12046 +5313 +8914 +19949 +2196 +3654 +7145 +12166 +18340 +17929 +12466 +7866 +3831 +15095 +2506 +17691 +12992 +6591 +9661 +19538 +2161 +3991 +6766 +18180 +182 +15952 +9709 +19601 +13427 +19071 +12698 +12157 +7963 +3485 +19327 +6029 +12948 +2261 +2844 +4864 +12148 +9187 +6695 +8171 +19771 +3782 +14122 +11658 +330 +10750 +6932 +4436 +15622 +5710 +18750 +5765 +10545 +10897 +16609 +9183 +802 +14708 +3423 +11557 +19098 +3641 +14490 +3249 +1355 +16886 +18500 +15309 +8010 +18543 +2342 +3813 +2135 +9055 +15148 +12720 +3253 +737 +11788 +253 +13352 +1521 +13949 +1957 +10884 +2273 +14730 +13979 +2401 +595 +12697 +9932 +11372 +11915 +760 +10930 +10659 +6472 +19706 +6488 +9730 +17705 +16085 +4134 +2070 +4852 +5122 +16359 +7044 +8510 +10868 +10172 +510 +11550 +260 +11181 +3018 +3668 +904 +10271 +17104 +12764 +3364 +1878 +2803 +14040 +1149 +15626 +12809 +11008 +2903 +8352 +12761 +13470 +11258 +1400 +8381 +12422 +8402 +3919 +7164 +17263 +18167 +4549 +7654 +6034 +8438 +19451 +12122 +5167 +19334 +9771 +1111 +2932 +18324 +4897 +12687 +1720 +2767 +7616 +6431 +16918 +579 +16504 +4559 +14384 +6337 +4008 +7937 +1086 +5314 +12489 +5211 +17500 +19641 +14815 +7967 +8140 +5239 +2571 +18601 +16197 +5142 +12714 +14895 +3432 +3995 +9206 +7668 +8703 +1661 +4315 +5941 +6849 +2505 +19547 +11736 +5319 +986 +7846 +16050 +9227 +13121 +1012 +18236 +4888 +3885 +11135 +17395 +4303 +3836 +18544 +9807 +15248 +10626 +13846 +17286 +5581 +14007 +2062 +4619 +14864 +13869 +2442 +17728 +11590 +16382 +19117 +19446 +6843 +8694 +14439 +3453 +2700 +9821 +8089 +9645 +14679 +4356 +11980 +5408 +2668 +8053 +1647 +19959 +17083 +14916 +8841 +2319 +11984 +12867 +4292 +4633 +1492 +10716 +12880 +8243 +3929 +2225 +2943 +17578 +12138 +5648 +9614 +15487 +18868 +10779 +12716 +403 +2908 +7040 +4772 +19912 +14823 +5045 +14250 +19733 +13073 +6947 +10387 +8021 +5201 +4488 +18161 +4100 +1422 +16865 +7646 +4370 +17271 +19121 +9808 +2613 +15130 +18893 +11654 +5903 +15058 +12954 +6480 +5764 +15830 +17813 +10224 +6324 +4412 +5607 +9497 +7849 +1291 +9401 +19126 +15067 +10197 +18480 +6258 +8590 +17216 +7437 +16511 +18807 +4267 +18809 +14488 +2345 +4395 +11054 +7624 +3708 +896 +18870 +19517 +2950 +7950 +19529 +155 +19786 +138 +7168 +2130 +10699 +19821 +19156 +11071 +8912 +9515 +17234 +10388 +195 +19909 +16687 +18628 +5870 +10436 +16939 +6562 +8748 +4929 +6282 +9147 +12262 +18067 +17029 +5593 +11043 +15042 +19516 +7618 +13353 +3793 +108 +8255 +8446 +9675 +6111 +5162 +17668 +11558 +17151 +4502 +4353 +19681 +9842 +9229 +13095 +6533 +5706 +14713 +130 +4435 +918 +5195 +4348 +13863 +1247 +13221 +11826 +14356 +7315 +19382 +14025 +10586 +13495 +2418 +13930 +17352 +10751 +5332 +19001 +148 +12921 +8219 +11851 +12210 +5136 +16621 +309 +11602 +3224 +2787 +831 +2423 +14749 +12053 +9389 +15413 +17125 +7143 +19332 +10719 +10433 +4229 +6003 +3725 +17978 +3086 +17007 +6993 +16758 +6015 +16832 +2292 +16344 +13161 +7474 +12363 +10615 +19599 +6856 +10583 +19326 +15872 +3318 +17397 +14798 +8994 +13566 +949 +8506 +17722 +14915 +16273 +14643 +12334 +6859 +3148 +16594 +1809 +16350 +10681 +5696 +19560 +11625 +12856 +14535 +12292 +10444 +14707 +19226 +15085 +17377 +10766 +1833 +14675 +6297 +11865 +9647 +1269 +11299 +18222 +12310 +5715 +3293 +5580 +16180 +3198 +5655 +14952 +4632 +18179 +14464 +18546 +19062 +14401 +10772 +11719 +12926 +6267 +9163 +7559 +6358 +6903 +12503 +842 +90 +11725 +5854 +2083 +9137 +3292 +2781 +10855 +13137 +1993 +6499 +1395 +4910 +9378 +445 +13443 +7039 +15416 +7434 +13093 +14981 +10377 +13571 +5652 +19404 +14335 +8636 +13404 +18715 +12722 +19189 +9989 +12956 +7993 +7848 +5771 +16660 +9063 +8452 +4845 +14997 +6883 +11982 +1931 +9618 +11593 +12712 +16973 +17452 +9993 +3728 +18598 +15326 +15360 +7612 +18837 +5048 +9659 +14572 +732 +10948 +8383 +15938 +9822 +15502 +231 +9438 +13629 +4987 +16527 +7250 +17364 +14600 +13817 +7983 +7154 +4103 +14313 +6931 +13983 +14009 +11778 +5478 +11543 +13446 +13037 +17142 +8307 +17676 +16495 +2274 +15324 +8828 +7999 +861 +6566 +17141 +9039 +694 +2882 +10144 +17051 +15743 +11263 +17156 +9122 +9916 +14398 +7063 +6237 +5638 +15763 +1781 +2049 +10105 +1246 +7266 +7500 +18846 +5535 +15135 +18616 +10987 +4354 +18659 +18721 +4950 +14666 +12702 +663 +11894 +11411 +19965 +3137 +5388 +7768 +5069 +7826 +19221 +1176 +18638 +3314 +36 +17709 +15578 +14710 +4791 +6413 +5461 +7776 +13204 +2302 +6382 +9622 +8769 +8967 +4208 +15083 +2464 +9639 +19391 +14833 +9760 +1577 +681 +236 +1985 +12792 +10147 +11477 +14536 +8012 +18444 +13183 +7810 +7717 +8593 +1654 +18958 +19769 +5659 +13596 +8469 +17760 +16629 +17402 +2140 +16696 +14869 +8103 +18250 +6429 +469 +7934 +16281 +16623 +7074 +4984 +9624 +16339 +7825 +19700 +6866 +15914 +19964 +19336 +13712 +11268 +3216 +10218 +12589 +4453 +14596 +16420 +1512 +18977 +11886 +11637 +12934 +496 +18503 +7326 +1082 +19257 +12682 +5177 +12065 +1500 +8097 +17636 +1973 +12448 +2209 +6165 +17875 +13036 +11911 +17546 +18476 +14284 +12114 +15674 +7720 +3484 +10471 +6089 +3441 +12887 +19772 +5168 +16222 +18075 +6793 +1074 +3428 +7593 +8465 +14048 +3463 +15554 +15329 +4352 +6135 +11756 +4268 +1482 +3523 +14390 +3681 +3090 +15748 +2656 +9255 +6536 +10528 +8574 +1926 +18022 +8625 +19593 +12288 +10632 +18212 +9782 +1875 +2082 +13643 +16171 +8385 +15465 +5751 +9420 +1004 +7771 +12499 +12525 +6097 +1513 +15921 +15484 +12663 +17072 +4693 +15491 +9584 +5864 +4977 +7841 +15412 +7923 +3536 +2540 +6911 +10031 +2206 +18931 +1856 +205 +8152 +12603 +4552 +19026 +9223 +10389 +11271 +16914 +16266 +9829 +8124 +3549 +11605 +16055 +5537 +19801 +11601 +3499 +7699 +735 +9037 +18773 +11078 +18295 +11935 +16267 +5072 +1822 +16710 +5097 +2812 +13191 +12077 +9819 +5524 +17767 +10587 +10513 +1994 +19862 +18907 +7968 +15272 +7789 +2409 +54 +19531 +8092 +3347 +673 +5449 +18599 +11457 +9023 +18216 +151 +3325 +7491 +12272 +1089 +17925 +12543 +4855 +910 +8895 +2662 +17435 +11455 +6263 +6049 +10308 +14696 +1120 +1857 +14658 +14709 +1827 +9133 +3732 +2308 +5021 +19895 +5130 +2321 +8478 +13751 +14668 +12758 +6368 +925 +6567 +13960 +4392 +17533 +11140 +8696 +4902 +19715 +19592 +19009 +6990 +7368 +2884 +1761 +9096 +5776 +19203 +12034 +13669 +14639 +8126 +11779 +16533 +1682 +208 +7340 +6351 +6564 +16168 +11449 +15859 +14482 +19057 +13581 +5965 +18130 +1427 +8670 +16155 +17607 +3754 +5050 +8369 +10157 +7623 +4580 +10289 +14147 +4613 +6316 +8441 +13630 +19850 +15986 +1160 +17770 +19266 +83 +6643 +4694 +10353 +4909 +4727 +15659 +5584 +2641 +3698 +3165 +13039 +13312 +4756 +3598 +8958 +1898 +16121 +18728 +6332 +6539 +12401 +18019 +13123 +15388 +1972 +3111 +13250 +13944 +15408 +9078 +452 +14346 +7560 +2306 +3883 +6312 +3541 +5518 +3377 +19440 +11416 +6459 +19730 +1018 +17717 +19070 +2979 +7628 +3294 +14038 +17208 +16535 +14850 +7 +16427 +18239 +5066 +9609 +9194 +11734 +14200 +4917 +13090 +2490 +3735 +3829 +13487 +7105 +4108 +450 +10527 +3391 +13080 +3884 +9246 +14599 +12759 +9940 +5528 +1425 +3209 +4 +11016 +14852 +17253 +15713 +4653 +5849 +4787 +16819 +12491 +19370 +12594 +3657 +10088 +3741 +9981 +3779 +18367 +4760 +8416 +16092 +18242 +12718 +18491 +13873 +10163 +11696 +4073 +1570 +18443 +8328 +3675 +4282 +7763 +6861 +17516 +18429 +7823 +11156 +9205 +18297 +13738 +7811 +3578 +8944 +2115 +16468 +3907 +15293 +10044 +6555 +2826 +9838 +6750 +15892 +4279 +6867 +7938 +9788 +1115 +13625 +2146 +11581 +1096 +18237 +10236 +9201 +17460 +13171 +9963 +7202 +3966 +4294 +5573 +10232 +13791 +19875 +9298 +11298 +18253 +10352 +14014 +10952 +16802 +17984 +3027 +11733 +3150 +3514 +5796 +16181 +16322 +15572 +9196 +9392 +6842 +13963 +7868 +4416 +5411 +4598 +12392 +8187 +8809 +1722 +14154 +7136 +10114 +806 +4506 +2210 +1234 +6487 +12601 +6345 +1222 +11032 +17837 +1436 +18510 +13192 +13409 +2916 +15236 +2171 +19849 +18365 +13536 +7186 +18356 +13562 +13042 +15819 +11301 +5777 +15869 +9462 +264 +6749 +6724 +19018 +3737 +4210 +13420 +16942 +8870 +14209 +19898 +882 +4021 +18094 +438 +15220 +12025 +19916 +8802 +16090 +7216 +13396 +19431 +15182 +11773 +2064 +2735 +4187 +14432 +6551 +14174 +4687 +14750 +19246 +5868 +8400 +16515 +3028 +1855 +15898 +12605 +2643 +9103 +7130 +10895 +9089 +2771 +19857 +10033 +19263 +9119 +14706 +14207 +18470 +11743 +18163 +859 +13245 +14698 +11764 +9748 +15584 +19089 +13388 +18928 +3289 +19660 +16732 +16194 +70 +19077 +2745 +11216 +5550 +15300 +7565 +1766 +9684 +18285 +3060 +14989 +5227 +2072 +8080 +14517 +12391 +13686 +7525 +14548 +11403 +8754 +16046 +10953 +7112 +5592 +6882 +9080 +4589 +13437 +16114 +5753 +6118 +16947 +4566 +9633 +7033 +13356 +9164 +13671 +9689 +11207 +18007 +2402 +15376 +16038 +6571 +4875 +3055 +16146 +18484 +19778 +12574 +966 +16007 +6908 +10248 +9118 +1820 +1830 +14591 +15893 +13881 +6987 +5794 +13255 +12003 +4537 +18485 +3567 +7203 +19079 +6338 +8671 +15590 +19654 +2552 +10446 +14189 +3207 +9582 +12209 +18993 +6941 +14448 +18639 +18694 +5814 +10292 +8377 +10796 +10680 +15 +870 +1777 +15404 +2044 +4232 +3917 +5371 +7725 +8974 +8227 +6073 +12404 +9084 +19466 +14267 +8223 +7381 +7682 +632 +12671 +1325 +11845 +11113 +8412 +19417 +6357 +17205 +380 +4919 +7842 +14100 +16317 +15235 +14613 +18211 +7461 +19872 +9913 +11784 +13436 +1859 +6597 +13750 +10136 +14029 +10842 +1795 +682 +11266 +16047 +5758 +1194 +16086 +7301 +6798 +10818 +3495 +17518 +298 +16767 +18903 +15113 +10358 +5676 +18567 +4812 +15165 +9477 +2283 +11622 +13722 +3073 +16187 +2544 +2482 +7534 +18691 +14260 +274 +14682 +3231 +16237 +6606 +16494 +12612 +17826 +18266 +17652 +11954 +19394 +16356 +15781 +6498 +7613 +18308 +9852 +12495 +11569 +6822 +15384 +18414 +16240 +17425 +3619 +2998 +4060 +281 +12126 +13552 +17956 +8648 +5199 +11470 +19559 +2184 +4127 +1782 +11302 +8272 +7227 +4378 +6617 +17001 +5565 +12212 +15110 +12717 +9177 +203 +15928 +14386 +18671 +3664 +5577 +5825 +18883 +11563 +7790 +16821 +19075 +11407 +4067 +481 +15007 +10607 +1437 +16173 +10793 +647 +3305 +2691 +15054 +1132 +8766 +14500 +14137 +11852 +14871 +765 +16596 +1727 +2747 +9784 +9337 +16309 +16810 +16508 +12105 +1127 +13997 +17502 +17305 +18799 +12701 +5281 +13678 +4044 +18969 +14380 +19526 +15873 +8501 +299 +1764 +18487 +19620 +4094 +9237 +12970 +4240 +14861 +11285 +1470 +3766 +9496 +9656 +5356 +7509 +9637 +15046 +19038 +1072 +13336 +784 +18523 +6996 +15991 +581 +14929 +16799 +4522 +8701 +9889 +5016 +7199 +19270 +15705 +2611 +10397 +19448 +17801 +11447 +16190 +16130 +3153 +12318 +5677 +14727 +13117 +9800 +15894 +15709 +9081 +5403 +15579 +6359 +5576 +552 +19272 +11427 +4343 +11192 +12732 +4424 +17024 +7715 +12633 +2562 +12400 +4330 +16677 +1150 +6402 +18957 +9338 +4726 +10064 +8644 +17968 +79 +14922 +12178 +7837 +11881 +18551 +2096 +7547 +6879 +16607 +17532 +17944 +10284 +10009 +9868 +2088 +7165 +17038 +14403 +11088 +9668 +13714 +9125 +13804 +13547 +200 +11058 +19642 +3016 +5375 +14376 +5202 +3268 +8476 +14820 +12021 +17213 +12957 +8549 +15190 +5397 +3339 +8084 +15262 +10297 +14127 +18950 +14402 +11073 +5657 +10318 +13866 +9180 +18302 +3183 +2397 +11747 +9357 +2022 +10447 +16582 +19247 +14261 +19923 +14503 +16422 +8778 +18439 +19673 +1679 +9156 +14756 +8836 +792 +14801 +14510 +4556 +12417 +6110 +15972 +1030 +2328 +525 +16238 +11164 +11570 +17610 +4118 +11897 +9444 +14758 +2978 +16124 +7333 +6201 +14646 +819 +16867 +758 +4095 +19080 +15720 +17338 +18410 +12800 +16679 +10495 +6063 +10001 +18512 +14521 +6137 +18160 +5900 +3606 +15776 +9127 +13491 +17690 +9173 +5013 +3745 +13371 +9315 +4604 +14737 +4625 +7850 +3071 +2681 +13915 +3716 +7617 +12597 +3512 +3565 +19435 +7564 +17592 +9035 +12394 +2941 +6473 +13995 +18469 +11981 +17680 +1932 +19172 +1959 +16466 +2043 +11677 +7471 +7635 +12870 +10337 +15199 +2517 +17905 +10239 +5615 +2269 +13794 +2664 +8883 +10087 +9073 +10617 +5548 +10940 +19822 +11659 +13147 +12171 +3164 +17034 +9484 +17682 +7142 +3559 +12980 +11388 +7572 +17292 +3311 +3561 +7590 +14998 +7454 +2874 +6168 +937 +14366 +8090 +8710 +12599 +8443 +8970 +18892 +329 +3254 +7781 +16904 +4896 +12343 +11478 +10553 +4132 +17450 +12864 +3510 +1402 +12055 +8183 +165 +9948 +3214 +6878 +5933 +228 +3230 +1281 +15215 +10404 +3367 +4014 +6632 +9043 +4818 +6661 +19398 +18517 +7085 +17011 +13682 +15769 +13317 +3843 +11294 +7302 +8179 +12539 +16626 +3607 +15203 +2254 +5182 +16659 +12406 +12573 +5917 +2373 +11062 +17231 +3916 +3105 +9085 +18613 +11408 +17161 +17366 +11591 +4238 +4660 +2848 +5891 +12804 +10288 +8174 +14239 +12514 +4654 +4250 +2852 +6314 +2368 +4331 +10102 +9215 +4154 +9775 +15534 +16486 +6072 +17897 +6804 +9025 +6688 +8484 +7362 +7728 +18465 +17285 +7308 +13520 +11839 +8577 +3723 +4068 +5628 +18978 +9294 +13440 +3112 +13821 +12027 +13670 +1564 +15275 +10179 +9740 +7109 +8716 +11499 +11306 +4092 +15096 +18461 +19703 +15349 +1079 +15249 +4831 +8609 +5402 +6252 +12462 +17598 +8256 +4873 +901 +1505 +10888 +13587 +16191 +1683 +13035 +13771 +4377 +17164 +4385 +9517 +18346 +10202 +807 +3176 +3393 +10311 +11856 +4420 +17807 +16514 +17296 +10185 +7689 +2121 +603 +19848 +14957 +6235 +3765 +6958 +16961 +16835 +11823 +15218 +3673 +14694 +9799 +10988 +11521 +16713 +2904 +6079 +3201 +18911 +4517 +5304 +6689 +3034 +17456 +14288 +3025 +9030 +10834 +72 +3640 +5419 +17997 +12664 +17332 +3392 +18034 +8415 +10580 +2582 +7067 +12922 +8116 +6069 +9456 +3945 +12121 +3205 +1471 +18203 +4563 +11758 +15828 +12696 +3029 +5878 +7584 +18021 +9781 +13367 +12159 +8708 +17930 +18482 +3810 +19468 +9992 +9466 +16650 +8319 +8075 +13026 +12750 +4248 +3756 +6904 +5987 +10300 +19513 +7835 +14553 +7997 +13118 +13895 +14201 +828 +19873 +14254 +14321 +6442 +7713 +18594 +9283 +3803 +18739 +5800 +8088 +11797 +12172 +17438 +8013 +6444 +2526 +19303 +7752 +5243 +10222 +14888 +1987 +12728 +2281 +14094 +13189 +18421 +232 +17792 +12315 +5112 +10252 +14472 +11282 +13205 +8666 +16375 +13298 +53 +16122 +15019 +18453 +11551 +17430 +10461 +11789 +5997 +2790 +18547 +12547 +6067 +19149 +2820 +18032 +10802 +10133 +18017 +7667 +13452 +16972 +4192 +2519 +15381 +12924 +10438 +19016 +4955 +3903 +10237 +15152 +2860 +19938 +5412 +14294 +2867 +15553 +8672 +13106 +11603 +408 +546 +6437 +7921 +7487 +11587 +14507 +4111 +15628 +13295 +8340 +18279 +7259 +14649 +19506 +14785 +10293 +14742 +19136 +6265 +1087 +12052 +15843 +18727 +5484 +845 +15185 +13976 +15646 +17664 +1068 +4335 +8722 +12020 +488 +2706 +282 +3534 +1294 +3043 +11397 +2713 +2975 +944 +10208 +100 +19744 +4924 +2107 +17519 +7385 +2507 +17006 +2763 +7137 +17314 +15094 +12296 +12237 +10544 +2758 +76 +12678 +10763 +3780 +17067 +8968 +975 +3659 +13505 +15863 +17766 +3363 +5423 +7463 +2178 +4126 +14612 +7382 +19859 +676 +12313 +9295 +8640 +11309 +10754 +13801 +12608 +13889 +18117 +16269 +3412 +10649 +12279 +3508 +7951 +13929 +12250 +17637 +8922 +18762 +18329 +14702 +9507 +19961 +850 +9597 +4414 +13247 +16822 +10422 +19205 +3713 +3436 +7248 +4243 +10902 +8762 +15545 +12653 +18681 +13455 +14691 +10967 +3489 +18920 +12677 +9470 +2134 +15958 +350 +19280 +17241 +19725 +3551 +7246 +19535 +7724 +18758 +1731 +3332 +17522 +467 +2625 +9608 +14969 +1323 +9233 +16160 +14099 +5302 +8554 +4449 +5333 +9273 +16185 +14522 +17604 +19605 +6303 +12330 +15146 +14008 +7440 +541 +11439 +1576 +16787 +16643 +3187 +1217 +9606 +833 +7777 +15549 +18991 +11612 +4806 +5366 +12275 +19215 +19449 +12385 +8947 +15472 +13739 +14947 +1225 +12670 +6053 +2155 +5435 +15931 +13807 +16673 +8413 +15099 +10069 +13744 +9676 +12002 +16917 +1192 +13262 +15795 +12097 +4419 +2704 +15031 +10581 +13753 +5473 +721 +8536 +15470 +12176 +11335 +3264 +1075 +3213 +12203 +1035 +18985 +621 +4571 +832 +18668 +1008 +6614 +10274 +7827 +18731 +2421 +10075 +15523 +2499 +3761 +13927 +7374 +2263 +4507 +209 +8779 +492 +9195 +18556 +10960 +16021 +10464 +5662 +18906 +13364 +13332 +13413 +8647 +2909 +6985 +16880 +16692 +17599 +788 +14233 +7122 +14248 +14319 +9678 +7149 +10526 +1587 +19510 +5975 +4104 +3319 +9437 +996 +4384 +6922 +5501 +17736 +3483 +7518 +8495 +368 +1461 +9559 +15729 +6638 +5407 +13111 +14491 +8824 +6615 +2284 +14186 +10279 +11785 +10097 +16919 +14273 +15533 +4079 +18344 +2175 +15635 +14883 +4928 +8034 +19930 +13460 +5421 +8072 +18176 +18157 +14272 +6271 +15237 +8601 +12886 +8145 +3390 +11900 +8524 +3615 +3893 +17727 +3817 +16812 +1177 +19385 +2759 +14657 +11853 +19444 +12660 +3987 +2960 +16110 +12808 +1706 +9939 +11800 +4441 +14638 +459 +13076 +18192 +10061 +18226 +8324 +19067 +17264 +14165 +19323 +3747 +9056 +4321 +9546 +8030 +2356 +18989 +16340 +11970 +16797 +14564 +5216 +359 +1881 +17087 +11333 +18725 +10957 +5118 +2959 +4838 +12425 +14879 +11620 +5585 +12994 +3695 +18873 +2286 +10737 +16869 +11498 +18970 +4309 +772 +4029 +18787 +8505 +4596 +2731 +12749 +1349 +16805 +7028 +14818 +5098 +7543 +6474 +8697 +4439 +5308 +12946 +18423 +13965 +11975 +2260 +7046 +17257 +15904 +1114 +7306 +5780 +2764 +8788 +19176 +15016 +7772 +5060 +10836 +9873 +11267 +10981 +8305 +5044 +5872 +19841 +7894 +8600 +19411 +5946 +13648 +255 +2447 +1558 +490 +17820 +17806 +15541 +893 +6841 +15371 +11170 +10039 +9423 +17294 +18620 +8311 +17065 +968 +3834 +545 +16969 +12174 +4056 +16630 +8260 +8432 +10238 +14779 +4390 +2883 +14841 +10338 +13475 +7354 +14736 +13167 +2772 +18162 +15228 +12305 +12719 +1644 +10361 +7441 +17815 +11553 +8711 +1066 +5487 +9175 +9275 +5210 +18973 +13240 +17780 +2550 +12982 +14832 +10927 +4661 +16513 +12471 +15925 +2872 +12541 +17750 +18498 +6578 +3611 +17994 +13313 +22 +18334 +2349 +1415 +16900 +13975 +3906 +7735 +9625 +11194 +18855 +11188 +16154 +10403 +3064 +15075 +1773 +5986 +8845 +12083 +920 +3050 +17827 +5658 +16020 +17909 +7881 +4933 +12873 +8433 +8631 +18760 +15821 +7722 +11460 +17342 +2034 +17490 +10780 +883 +14097 +15098 +14621 +6636 +5720 +1124 +16757 +10874 +15537 +1557 +10173 +17788 +1749 +8910 +13488 +11561 +18073 +15930 +12831 +14569 +2545 +11320 +11238 +19196 +3753 +12191 +1336 +17805 +8758 +8200 +7914 +2095 +8798 +6651 +11808 +2970 +19186 +15383 +19024 +8654 +14744 +12256 +1023 +963 +7280 +8548 +11983 +1423 +3704 +17529 +10627 +743 +3001 +16400 +5489 +5010 +180 +5853 +13238 +12358 +15963 +14717 +11350 +3159 +18665 +14449 +15660 +19809 +18975 +2655 +306 +4030 +7739 +8509 +14567 +8664 +9500 +13230 +16056 +567 +15875 +2716 +18559 +17496 +1212 +8394 +1828 +864 +16868 +16018 +4259 +2470 +10454 +14166 +5460 +4926 +10011 +3869 +1324 +13729 +5361 +11782 +9954 +10348 +16472 +11978 +10548 +2312 +14032 +4262 +4674 +1050 +855 +6933 +18283 +15984 +15960 +609 +5280 +7784 +3261 +10588 +13579 +19058 +13563 +15211 +17376 +18894 +13797 +14550 +15929 +11391 +19746 +2497 +2762 +5351 +3573 +7663 +13316 +5052 +18248 +10496 +9108 +17914 +1589 +10976 +12564 +5640 +7052 +3650 +19288 +17354 +5334 +1612 +8429 +19457 +12336 +844 +17372 +2722 +4020 +13935 +2141 +13269 +4597 +14880 +17706 +10707 +4160 +8588 +7049 +909 +17520 +17317 +18777 +10 +18364 +11199 +17916 +11227 +1696 +14325 +12214 +7281 +14539 +16857 +1591 +6780 +6432 +8874 +10189 +9146 +15350 +5802 +18704 +2868 +4437 +172 +4893 +14474 +13974 +13089 +5457 +10797 +13858 +6339 +821 +8035 +10046 +14123 +19109 +15420 +16257 +11615 +7462 +8867 +8253 +13737 +20 +107 +17031 +13078 +8634 +1974 +14051 +16800 +8299 +19040 +17896 +9109 +7124 +12631 +17931 +1890 +6823 +8000 +4767 +2295 +15732 +1915 +10664 +15103 +9049 +18741 +17887 +3320 +12120 +9574 +17724 +9563 +6734 +2316 +31 +3671 +4605 +1084 +9813 +6435 +520 +19309 +3978 +6141 +17935 +6068 +18886 +3372 +4828 +99 +14056 +13544 +17509 +853 +14034 +18028 +11904 +16706 +11293 +8434 +7642 +12996 +14371 +3298 +17073 +267 +18636 +6920 +4529 +4574 +8390 +11360 +5255 +5601 +12248 +10778 +13658 +5784 +5476 +7671 +19286 +18144 +1927 +14367 +6863 +3805 +17986 +16333 +3227 +18191 +3301 +18071 +7150 +8780 +13907 +12393 +16166 +11973 +15147 +9541 +14193 +7318 +3712 +13708 +11345 +10427 +4323 +12026 +10245 +19967 +1405 +388 +16958 +2546 +7439 +10000 +16496 +16774 +6023 +16728 +13478 +2087 +11657 +14383 +4916 +18463 +4677 +4421 +17658 +8330 +1958 +11352 +7005 +19148 +5629 +14120 +5343 +10312 +18412 +17808 +770 +13891 +7283 +1547 +19493 +8091 +13424 +303 +3252 +12888 +2924 +12908 +13878 +13442 +15359 +5838 +11929 +5483 +8948 +15000 +8852 +12754 +7103 +17378 +1990 +2635 +1314 +19376 +10616 +10319 +569 +16644 +18499 +6572 +7071 +8093 +2218 +7749 +8333 +3011 +6260 +3358 +13649 +3821 +11575 +17623 +8707 +19293 +9585 +16920 +16461 +15377 +19556 +8660 +11807 +9534 +12326 +6289 +16950 +12742 +7347 +339 +12876 +15013 +6976 +16105 +15043 +18193 +1348 +14931 +583 +19476 +8455 +7530 +13897 +13373 +13684 +13655 +5635 +9475 +377 +16225 +12223 +17025 +13706 +11763 +8756 +834 +10618 +19095 +11740 +15561 +7160 +11522 +8688 +7273 +4477 +14811 +9832 +12352 +14281 +7299 +8576 +1020 +2961 +12276 +1193 +16897 +3473 +1185 +1198 +1353 +12881 +4077 +15642 +5511 +12840 +9750 +13101 +8026 +2282 +14224 +5480 +10594 +9903 +16358 +458 +18927 +19045 +9355 +7312 +3094 +12584 +6116 +16287 +3091 +967 +19947 +5920 +5979 +4883 +11583 +15033 +2160 +3479 +15639 +1204 +16521 +2777 +13765 +3517 +18076 +16376 +4802 +1197 +11109 +11985 +7585 +11451 +19169 +10648 +18223 +9554 +18688 +16116 +19412 +19371 +17483 +10726 +13054 +15421 +15637 +5861 +2355 +6874 +2054 +8052 +4763 +5086 +17479 +16568 +286 +11314 +5630 +7638 +4785 +18259 +15063 +5927 +1902 +9487 +4430 +12127 +7984 +5323 +14082 +10574 +11798 +19408 +13315 +17400 +12810 +6405 +10885 +18982 +6347 +6107 +12879 +14257 +6212 +5437 +12789 +17322 +2320 +17370 +1352 +14275 +8316 +19375 +2163 +10911 +12257 +13001 +3599 +13911 +12429 +5992 +16178 +11690 +6844 +10925 +11040 +13829 +3140 +5848 +18252 +14050 +18210 +13620 +4801 +6090 +8264 +1200 +13511 +14581 +18087 +15366 +4711 +5058 +18509 +10826 +10217 +19119 +6825 +12066 +17167 +2869 +262 +14434 +2468 +11247 +4607 +16667 +4655 +4009 +19788 +11664 +15257 +3981 +11512 +18254 +241 +14508 +5385 +14884 +508 +1010 +3533 +9474 +12500 +476 +19878 +8245 +6221 +16128 +11381 +13202 +13770 +9372 +15750 +9753 +12263 +7979 +8317 +16030 +1428 +3304 +5890 +10040 +16840 +11006 +103 +15437 +1237 +11452 +6471 +14688 +815 +10416 +14624 +15082 +12329 +10168 +7885 +8055 +6173 +1700 +14259 +19945 +3396 +11197 +5867 +14058 +2610 +7808 +18272 +19800 +11895 +5748 +5678 +19439 +18288 +7690 +17950 +4670 +6855 +13832 +2375 +16247 +11035 +8411 +7119 +8172 +19577 +18407 +16033 +9886 +618 +6757 +8663 +7024 +4404 +3775 +5904 +3496 +11175 +1178 +18651 +540 +14839 +715 +14427 +19913 +11250 +10014 +18733 +1745 +8873 +19741 +17799 +19854 +17954 +1250 +10275 +9579 +1962 +7512 +15141 +4980 +7405 +8585 +10711 +16475 +11717 +18530 +7008 +17316 +2051 +17537 +13796 +1477 +7907 +6230 +8903 +15358 +17492 +12721 +12635 +9425 +7215 +4657 +15880 +5509 +9729 +5597 +15150 +928 +4194 +1885 +3352 +8450 +12802 +4699 +12373 +19727 +1007 +6365 +5531 +4505 +5181 +6139 +2523 +10598 +10730 +12987 +2547 +3516 +680 +18052 +19078 +4568 +18027 +2796 +1980 +19124 +7240 +10159 +19131 +17431 +8023 +2190 +13260 +5143 +7262 +5203 +1040 +509 +8107 +6132 +547 +7740 +865 +3225 +14348 +3 +17698 +4518 +14070 +8993 +3922 +15050 +7829 +15039 +9427 +18434 +2757 +6380 +6816 +19475 +4465 +1804 +19770 +10633 +6774 +768 +5538 +14069 +4741 +18234 +16102 +7251 +2454 +18843 +9332 +5262 +16198 +9344 +2407 +10856 +1814 +12693 +3466 +12384 +14777 +2629 +16280 +9697 +6262 +6032 +6644 +5723 +8028 +8690 +13169 +19321 +3191 +2749 +10658 +8676 +4347 +17068 +19545 +2317 +2813 +8048 +17365 +16087 +5632 +7524 +5071 +16539 +3634 +18685 +1946 +12445 +16760 +18307 +8191 +6206 +18602 +2410 +11873 +8244 +2398 +9473 +19936 +14607 +13920 +4149 +17223 +13809 +9226 +5991 +16764 +19141 +5709 +8294 +1017 +14026 +13389 +10963 +19174 +8850 +16622 +8344 +11248 +3721 +16117 +5731 +2810 +12726 +3596 +3072 +18576 +13369 +5425 +5430 +8846 +15783 +9879 +12443 +4728 +17085 +3188 +16256 +15425 +19267 +1227 +6170 +12137 +4440 +10004 +7949 +8129 +11707 +11220 +1256 +17421 +2007 +1174 +10396 +16049 +9773 +606 +2132 +9313 +5728 +4251 +14010 +10174 +16283 +3203 +11755 +2623 +2621 +15918 +18477 +14574 +6723 +5389 +14221 +7239 +2113 +16454 +16901 +6715 +4547 +12311 +19231 +15456 +18515 +5515 +245 +13456 +15386 +19927 +13823 +13702 +19978 +12766 +8962 +18392 +11673 +12983 +19551 +11223 +12740 +5505 +5675 +3331 +3480 +15799 +19170 +14468 +160 +19132 +6284 +19458 +16980 +1611 +15836 +2937 +10568 +14133 +7288 +13865 +13763 +19851 +16933 +12944 +10334 +9367 +8276 +11863 +9117 +2688 +16561 +13508 +14352 +13068 +4508 +14538 +13431 +5919 +17369 +12828 +13981 +2997 +16843 +4373 +8359 +15842 +12756 +2176 +13393 +811 +3988 +19814 +5265 +14033 +10860 +9549 +8273 +5788 +1121 +18359 +16169 +5434 +1772 +18744 +1245 +11874 +7131 +15168 +2703 +3079 +18947 +12397 +11053 +14900 +13163 +18433 +9651 +1265 +3100 +12452 +688 +18261 +19883 +14141 +4545 +16244 +2580 +9951 +16887 +9712 +2110 +17558 +13218 +5065 +4403 +2004 +18790 +17525 +285 +19661 +3891 +14106 +4975 +1769 +2406 +2606 +9744 +19775 +6918 +15410 +16248 +13083 +5247 +16733 +4649 +7420 +19254 +2432 +11139 +16608 +2 +11832 +7230 +1347 +16937 +15047 +3078 +9306 +6563 +10611 +5911 +7459 +634 +17381 +18323 +15443 +12902 +16385 +17239 +12229 +12747 +13786 +16923 +123 +11850 +17773 +12220 +14943 +4254 +3024 +6683 +9112 +9558 +16065 +9754 +6114 +10785 +9192 +15021 +4091 +10762 +3976 +13894 +7588 +13490 +2973 +3498 +6313 +14176 +12108 +3786 +17893 +5156 +18260 +7296 +4740 +15948 +10610 +12735 +5967 +2618 +7175 +558 +16931 +14886 +17757 +13469 +1182 +4252 +16241 +13638 +6514 +12370 +917 +18078 +16360 +8323 +8702 +7892 +1787 +9268 +12665 +16747 +8786 +10053 +4096 +4359 +9432 +12741 +4991 +9333 +12123 +1365 +1734 +8892 +804 +1002 +8888 +14001 +19777 +1742 +7191 +6492 +17321 +2068 +991 +15616 +18921 +2856 +8685 +8401 +19251 +7252 +16467 +4786 +1337 +7162 +12561 +660 +18128 +16329 +15805 +8765 +8106 +13931 +4253 +1899 +8547 +9874 +10070 +19855 +7469 +9369 +10993 +18299 +14560 +421 +11541 +17590 +11107 +17359 +8500 +18818 +17552 +3470 +8992 +2177 +9326 +16060 +1450 +8070 +6250 +9581 +5212 +12286 +10537 +16717 +17325 +16510 +11787 +9036 +16108 +16005 +15393 +15649 +12496 +1824 +561 +10873 +19807 +1411 +6834 +19425 +4272 +7146 +9611 +18896 +18294 +17823 +4757 +14002 +2660 +3994 +14277 +969 +5206 +6735 +16567 +4575 +13624 +9110 +798 +15233 +15876 +13539 +16505 +15269 +12232 +9980 +15998 +7732 +14228 +14795 +3918 +11534 +7952 +11627 +16205 +16946 +17793 +9019 +3471 +1285 +239 +17953 +15475 +5977 +12189 +13401 +10815 +6292 +19903 +7327 +6760 +6556 +16262 +12474 +3330 +12228 +2534 +19901 +5445 +6362 +3049 +1628 +6325 +16137 +15806 +3920 +19692 +1698 +8638 +10448 +7519 +2776 +2619 +13450 +19679 +12958 +18504 +7800 +15653 +19708 +13496 +11813 +3969 +1617 +5836 +14118 +3660 +3449 +959 +17861 +17043 +16370 +3242 +16253 +11202 +17489 +5862 +1627 +18955 +19988 +1843 +7603 +2440 +15520 +11045 +7795 +19496 +9489 +9346 +6272 +11126 +18224 +1203 +18554 +11653 +18772 +16097 +9587 +7388 +8880 +19014 +543 +14562 +12990 +3748 +5647 +8797 +14232 +11971 +19479 +7610 +10091 +1271 +7820 +1673 +17328 +2594 +7343 +11236 +874 +3089 +7018 +16476 +2543 +6482 +17442 +67 +8750 +16804 +12381 +5006 +10131 +14996 +19473 +8490 +2193 +16635 +1165 +7183 +814 +17197 +6759 +6047 +10512 +2091 +9638 +204 +12493 +4565 +15707 +8232 +6329 +12355 +5023 +17163 +729 +11060 +6342 +14723 +11649 +16541 +15807 +10782 +8629 +6041 +11896 +8801 +17349 +10470 +9858 +14075 +14626 +19697 +6045 +6171 +9956 +49 +12119 +3902 +14407 +15065 +15294 +6202 +11537 +16072 +17906 +2861 +7833 +16529 +7693 +8692 +614 +8952 +17057 +17227 +4899 +4345 +6184 +16556 +12150 +6706 +17543 +19292 +18274 +10212 +15172 +18316 +3349 +6396 +2695 +1666 +4209 +18277 +14509 +7526 +14587 +13711 +2701 +11318 +7359 +7451 +14937 +2357 +12236 +9354 +4396 +15724 +774 +9248 +8741 +13075 +13720 +1303 +8266 +297 +12084 +10243 +16373 +17437 +4478 +1064 +15761 +8887 +3265 +7413 +14851 +18791 +16852 +667 +6673 +251 +16703 +16756 +5197 +8570 +18065 +13676 +11280 +7581 +14199 +1681 +1094 +10998 +14419 +15655 +3625 +2520 +13185 +7110 +15500 +6580 +8159 +3202 +14387 +10684 +19307 +5348 +14265 +13122 +11848 +1550 +12552 +8395 +6506 +17169 +14684 +7286 +12039 +1476 +5620 +8775 +14177 +19511 +1005 +15419 +1601 +1675 +17138 +9162 +9172 +10298 +7258 +16748 +12974 +7620 +3694 +16357 +7943 +11426 +5682 +6565 +10333 +15589 +12567 +2227 +9777 +18432 +613 +839 +13344 +12205 +7941 +19245 +14968 +15595 +19147 +11613 +1695 +7502 +13653 +16324 +803 +4036 +14420 +2923 +18862 +11313 +10819 +8182 +15715 +6773 +12703 +6414 +17412 +2858 +17174 +7742 +9877 +11493 +38 +15556 +16962 +2829 +6205 +11902 +396 +11129 +5880 +14792 +12441 +17998 +69 +13664 +11580 +6084 +3525 +9990 +7069 +12692 +11726 +6145 +16715 +10095 +4293 +8728 +2823 +19998 +11276 +11329 +17646 +8009 +35 +5078 +10708 +7392 +11222 +4618 +12078 +1442 +14970 +15156 +6881 +3971 +2911 +7753 +4560 +14590 +4355 +10084 +6390 +8986 +7987 +7601 +2294 +17913 +7088 +15866 +15701 +5670 +14004 +8526 +17111 +14183 +14182 +6203 +18037 +4071 +18852 +10211 +7609 +15179 +15823 +10365 +13672 +19276 +15221 +11722 +6340 +16977 +9780 +14231 +11031 +719 +9797 +10705 +6775 +15435 +2592 +5224 +11256 +1386 +15251 +3125 +441 +6043 +16791 +19722 +16489 +15714 +2712 +7068 +4070 +16193 +7334 +8960 +1948 +9576 +13483 +11828 +18934 +7745 +13740 +16678 +718 +19145 +9998 +18233 +15327 +13971 +2756 +9602 +11095 +16348 +97 +10999 +8721 +13599 +4590 +11814 +8074 +16174 +8943 +12654 +12045 +15975 +3539 +10518 +15246 +15548 +14337 +16401 +468 +17409 +11063 +3783 +13608 +4621 +1536 +18990 +4994 +8020 +2780 +638 +11465 +14086 +4173 +14497 +6868 +316 +2151 +3672 +6934 +12739 +1026 +17584 +15290 +18151 +12861 +8203 +17444 +18532 +17967 +15313 +16661 +15814 +14410 +9567 +8268 +1418 +16936 +17695 +14013 +5707 +15870 +16975 +17117 +11635 +18866 +16530 +10301 +16424 +9982 +2076 +19111 +1867 +9856 +8551 +13097 +1984 +11011 +10725 +16015 +371 +17 +2327 +5102 +13302 +9442 +13025 +5669 +4622 +1660 +7876 +18531 +6832 +13570 +11001 +8166 +15467 +16666 +1251 +13377 +5770 +7265 +3851 +726 +18150 +18646 +10270 +3239 +871 +7779 +141 +11644 +879 +18105 +14687 +17158 +18605 +3895 +5298 +5081 +3272 +16441 +7632 +7404 +18597 +8138 +5721 +10678 +8186 +17795 +140 +16811 +3569 +6559 +5141 +7292 +15254 +325 +12348 +11977 +9511 +13403 +14563 +8578 +8341 +18473 +5754 +4098 +19989 +9179 +5426 +8502 +7425 +2617 +9323 +8332 +13509 +3338 +9921 +16739 +3402 +6214 +15692 +17999 +14914 +18267 +4713 +8558 +6464 +17779 +15722 +5367 +15661 +3244 +12322 +4212 +6552 +6885 +14614 +15927 +218 +14159 +10385 +12655 +10478 +1455 +16632 +8738 +19565 +1549 +14692 +17387 +17918 +17168 +4199 +19484 +16932 +5324 +5631 +4647 +10460 +10110 +17033 +13275 +12807 +19811 +5860 +2595 +16139 +10339 +11386 +17716 +15566 +822 +8953 +19795 +14760 +9985 +15775 +3328 +7022 +5666 +15704 +19926 +12575 +16347 +1313 +9941 +2840 +15093 +14148 +13627 +14344 +11941 +19970 +269 +1318 +14241 +3019 +8419 +19940 +10171 +4662 +5194 +4841 +4117 +14623 +19575 +14416 +824 +938 +7891 +6103 +15516 +10614 +5925 +16818 +18166 +13515 +95 +15406 +19134 +11628 +17979 +1319 +2744 +5070 +18099 +2359 +16881 +7317 +10696 +7630 +13391 +15771 +7346 +18313 +8844 +16699 +12388 +19591 +6455 +14269 +1646 +11540 +8579 +12195 +6517 +10214 +3041 +4329 +16465 +14135 +2266 +8262 +7932 +16970 +7365 +15173 +16220 +18402 +18717 +8235 +12535 +15352 +3006 +14791 +3232 +18218 +15011 +17642 +3547 +753 +5095 +17252 +3986 +3626 +4497 +1981 +9866 +1851 +2915 +633 +3008 +19073 +1672 +16067 +1304 +2770 +17594 +10531 +1316 +3147 +17340 +8314 +4191 +5851 +19306 +12734 +9571 +7472 +1162 +762 +12501 +14104 +3462 +12118 +19537 +10867 +16985 +17121 +10331 +7207 +19291 +14819 +19171 +16103 +1810 +11822 +10167 +5644 +2750 +11956 +2638 +13430 +8726 +15164 +16921 +14834 +3228 +13214 +12320 +9083 +7657 +9446 +14592 +14480 +11566 +17878 +625 +1444 +19721 +16743 +17076 +2512 +19734 +5115 +8468 +16031 +6970 +12674 +17941 +12439 +16286 +15833 +611 +8489 +15367 +1186 +12645 +19794 +12851 +15045 +5815 +13926 +7450 +5447 +5587 +10840 +1473 +19572 +10193 +4492 +1052 +13756 +13386 +14158 +15816 +17053 +19329 +19381 +4953 +8058 +4528 +12776 +18810 +2164 +9786 +16531 +7587 +17128 +6062 +15194 +8386 +15312 +4862 +10516 +18457 +15501 +8014 +5049 +18686 +9979 +13290 +15217 +8258 +11885 +4992 +4804 +1051 +6808 +8996 +11544 +11998 +15433 +2593 +3503 +4553 +11775 +11830 +11155 +19097 +2350 +16824 +3867 +16311 +4512 +886 +9208 +17629 +15605 +10366 +15288 +1553 +14342 +5401 +7079 +4521 +17777 +13521 +11149 +10379 +18112 +11283 +19934 +11485 +11910 +14617 +14283 +514 +19618 +13292 +9308 +19877 +1636 +17647 +13923 +370 +14766 +15962 +10177 +9713 +18321 +14160 +6218 +13667 +5873 +8849 +10158 +7221 +6839 +11160 +11390 +147 +5220 +6953 +934 +13510 +15121 +15338 +1278 +1170 +7464 +2101 +11571 +9134 +7423 +6336 +15471 +17458 +7918 +3378 +7319 +19483 +8734 +9613 +2720 +11265 +6765 +8372 +16232 +10871 +8774 +19504 +6028 +1021 +11576 +1953 +15631 +5944 +12261 +612 +6211 +3979 +2476 +10484 +9700 +12035 +6418 +4433 +12461 +1613 +9820 +10101 +13982 +11020 +6507 +14873 +12825 +848 +2488 +15477 +17672 +6393 +11936 +13241 +7177 +18271 +16063 +5349 +378 +19032 +2933 +3890 +15297 +14979 +1748 +1585 +19406 +16633 +9888 +14586 +8125 +5082 +12337 +16759 +19325 +7031 +19274 +17178 +16104 +12095 +11438 +9745 +3021 +19471 +6770 +685 +11585 +14793 +18847 +6305 +2910 +14485 +15512 +4915 +2846 +19600 +19826 +17586 +7415 +17362 +19755 +15594 +11122 +8146 +12596 +19407 +14661 +18918 +740 +10393 +10191 +8210 +19827 +13785 +5128 +8170 +12032 +11174 +18322 +10912 +9443 +9480 +17635 +11351 +17084 +1498 +19752 +6420 +16387 +2785 +10149 +9115 +16305 +15375 +5907 +16639 +11511 +12763 +14669 +19299 +18490 +18933 +6629 +16839 +13719 +15680 +7349 +17553 +14295 +18195 +18256 +10788 +9975 +6476 +10935 +10392 +389 +3844 +19319 +17549 +1842 +10006 +10265 +6475 +9405 +11574 +14731 +8437 +669 +2441 +8966 +7289 +17410 +1950 +4738 +12818 +4793 +15009 +9634 +4324 +18380 +9530 +9671 +17036 +6731 +13583 +7000 +9502 +12830 +2057 +15810 +19666 +2205 +4409 +18016 +410 +5606 +5739 +13569 +4962 +18270 +5416 +6407 +13061 +9050 +1272 +8997 +13365 +5845 +13713 +14425 +2265 +10491 +592 +18033 +6223 +16491 +15591 +738 +5190 +826 +5386 +2798 +293 +19242 +14475 +6215 +10246 +9257 +6672 +7032 +11375 +17202 +11877 +4074 +9239 +14305 +13632 +14683 +5833 +505 +3046 +14960 +11614 +3942 +14130 +5686 +16352 +10081 +8296 +13752 +8627 +1530 +338 +448 +13840 +18948 +8403 +9402 +5948 +19030 +4638 +176 +2649 +15559 +1741 +8406 +3346 +6269 +15673 +10151 +5292 +1710 +11436 +10951 +978 +12139 +6625 +1317 +8876 +5074 +16409 +4326 +3646 +2822 +10979 +11204 +4072 +3444 +16458 +4057 +16554 +1263 +3146 +5159 +15116 +6853 +2358 +18281 +8954 +1703 +3167 +8099 +12532 +7680 +19549 +5730 +6675 +10926 +13175 +915 +2866 +17992 +3420 +9885 +8557 +4295 +2335 +9846 +11275 +9523 +11905 +19419 +15062 +8896 +10465 +7295 +15543 +13428 +4676 +19146 +10621 +8863 +15911 +17798 +18672 +10390 +3336 +7783 +18747 +12730 +5523 +13064 +11019 +6104 +2153 +12998 +19804 +8382 +11757 +7257 +1593 +7521 +3356 +18181 +17710 +2027 +6584 +16875 +16215 +8757 +14496 +15645 +9207 +13318 +10850 +10286 +654 +6096 +16083 +6467 +17575 +4066 +16453 +9550 +6660 +7766 +19152 +18049 +10443 +41 +13514 +16334 +7436 +12473 +16583 +14053 +14297 +15656 +12490 +6886 +19208 +10432 +6377 +18863 +256 +10634 +2990 +7431 +19759 +6002 +2585 +9536 +3886 +6257 +16525 +15323 +1707 +16165 +15648 +5876 +1048 +4265 +15344 +307 +17066 +5471 +7759 +19561 +8494 +11599 +13033 +14924 +13999 +3749 +12344 +4163 +19128 +19181 +3887 +2925 +12744 +12087 +17291 +11311 +3662 +17814 +10228 +19105 +18335 +19362 +5667 +18221 +17856 +9600 +6035 +5779 +17796 +11086 +15926 +3731 +1908 +16463 +320 +3222 +1451 +14375 +14012 +939 +11594 +9718 +11737 +15853 +14296 +13639 +14856 +9824 +507 +4520 +15803 +16938 +15506 +16470 +11068 +17334 +585 +8791 +7489 +19713 +12283 +7707 +3277 +2922 +10703 +13287 +18629 +4452 +15291 +18096 +5059 +9210 +14525 +11264 +4363 +15985 +7696 +7087 +3120 +1823 +11117 +14340 +16978 +2399 +13609 +7387 +1223 +10276 +3259 +628 +10430 +13209 +1452 +14247 +5018 +7081 +1868 +14663 +11959 +3143 +1219 +9732 +14714 +13594 +1358 +17261 +12848 +9178 +3235 +7091 +4715 +16349 +3386 +4183 +2654 +15049 +11768 +6525 +1254 +19219 +17371 +2554 +19981 +14935 +19342 +3506 +1253 +6705 +5429 +12177 +8613 +16303 +15514 +1978 +4585 +8365 +10140 +11950 +10947 +10651 +16127 +104 +16307 +1472 +10463 +12915 +1869 +17835 +8275 +10313 +11693 +18844 +14498 +12745 +16452 +13059 +19867 +16929 +5899 +1169 +5028 +6875 +6076 +3645 +11112 +12965 +7086 +13105 +11584 +19634 +14686 +7704 +16408 +16825 +14870 +13901 +11735 +10240 +4206 +4372 +6818 +6966 +7073 +8078 +503 +10373 +19271 +7351 +1416 +9702 +14438 +4273 +16421 +10187 +17427 +17797 +19366 +2521 +19397 +12893 +18562 +14896 +7338 +17932 +14203 +5328 +14418 +1519 +1737 +13480 +16145 +9785 +8458 +14726 +6824 +3310 +5844 +16095 +6259 +7621 +407 +12332 +1768 +14428 +2949 +12868 +2459 +9959 +4235 +2453 +15633 +18381 +18265 +10798 +19553 +6570 +19683 +13912 +4956 +16701 +7492 +3388 +8057 +7060 +16726 +9445 +5902 +9935 +17300 +6714 +86 +9015 +6465 +12651 +13030 +6620 +7225 +10315 +7121 +9095 +13362 +14194 +16129 +5679 +13769 +5767 +13162 +14483 +5204 +1019 +3174 +1449 +2905 +6050 +16589 +17834 +13582 +6598 +12528 +6971 +13350 +6102 +16308 +17064 +12426 +10974 +8112 +1864 +5856 +10451 +17559 +12475 +10499 +8163 +13683 +3580 +7045 +18352 +7551 +3700 +10320 +12245 +10160 +9726 +14578 +2031 +5491 +10494 +15716 +15909 +9305 +4371 +1955 +2396 +14843 +607 +19224 +12076 +11346 +13781 +2080 +19571 +1340 +7270 +10090 +15693 +6521 +2337 +10535 +15053 +12504 +7303 +3973 +10345 +18965 +1756 +2566 +2982 +695 +11573 +12760 +19702 +17811 +18104 +11103 +8990 +3733 +13172 +3842 +7247 +16693 +19401 +432 +15256 +15841 +6010 +11327 +1286 +10485 +1971 +1866 +9683 +13271 +14751 +5999 +2766 +5272 +7797 +8620 +2299 +11316 +11133 +5782 +14115 +6175 +7272 +5107 +2945 +16915 +18776 +11021 +13335 +5957 +14566 +15760 +3989 +3800 +7457 +4890 +11228 +2531 +686 +6115 +15981 +14391 +13766 +17630 +17154 +9555 +13019 +10872 +11234 +5340 +1863 +1370 +14740 +4696 +5940 +16460 +13689 +16637 +8303 +12407 +5600 +9533 +19776 +18427 +17960 +4938 +10310 +4055 +12240 +11317 +548 +12440 +11530 +3898 +1574 +9605 +6099 +7442 +13387 +16315 +5396 +17035 +17877 +15302 +7410 +10299 +17225 +16548 +10487 +5377 +19773 +8735 +6194 +11480 +17802 +10625 +7793 +5671 +13685 +15966 +6278 +4336 +455 +15178 +11860 +16209 +7867 +8376 +3062 +12403 +12938 +8787 +17420 +9419 +4813 +5622 +13646 +10469 +2914 +8238 +5269 +13951 +6064 +6140 +18419 +11691 +14216 +14502 +15767 +16925 +10567 +6489 +14825 +2124 +11036 +19312 +6526 +1417 +19688 +15686 +1945 +8192 +250 +11190 +133 +14045 +1532 +8040 +6543 +9400 +3492 +19554 +2147 +19503 +13124 +3688 +4002 +14845 +8580 +18435 +14868 +5075 +15577 +354 +19876 +19144 +11075 +10962 +6633 +16722 +14885 +14299 +11838 +13305 +12772 +3932 +14951 +17939 +3031 +7323 +6950 +852 +13363 +14899 +2280 +16826 +3702 +18951 +1091 +6722 +11533 +13493 +10468 +11598 +12737 +6310 +577 +14609 +5214 +1762 +17122 +11048 +13327 +8569 +18535 +19894 +6281 +9934 +2634 +14894 +10866 +3475 +4038 +9783 +1273 +17957 +14467 +14236 +13904 +14214 +14541 +2074 +12175 +12103 +15535 +4486 +4398 +2964 +1949 +10382 +4874 +7688 +15407 +13482 +17181 +11261 +13127 +19277 +2023 +6077 +7275 +9377 +8527 +15550 +1333 +5219 +9526 +12349 +8185 +16890 +1711 +15551 +15787 +3093 +14372 +14809 +12968 +10799 +2962 +17273 +13548 +8261 +10261 +11642 +622 +1904 +2162 +17288 +15265 +17126 +12512 +5824 +11646 +11960 +17214 +19724 +9793 +14379 +2120 +16520 +16141 +8193 +12282 +15688 +10020 +4837 +7787 +10477 +15160 +10748 +705 +400 +460 +16391 +15749 +19480 +12273 +17088 +14699 +18840 +14936 +14023 +7279 +10559 +5689 +2224 +1153 +7903 +3552 +16959 +17667 +17120 +18425 +11482 +18264 +15253 +1657 +7214 +14136 +11004 +8188 +16316 +9540 +3864 +18474 +162 +18604 +902 +12929 +4256 +8560 +1027 +8281 +11085 +7595 +5993 +7698 +15978 +19090 +3045 +4970 +16614 +9643 +9131 +12238 +19655 +10226 +15959 +8282 +11286 +2984 +11394 +2133 +19586 +761 +4551 +18276 +13194 +7337 +14770 +19065 +15191 +17765 +18905 +11882 +12131 +10882 +18656 +19550 +596 +9725 +13297 +3693 +2428 +16485 +9569 +4201 +5363 +725 +5273 +17098 +8931 +362 +10770 +10340 +1940 +3013 +6516 +10542 +3308 +16371 +18478 +9044 +2307 +284 +1888 +2325 +18719 +9845 +423 +5781 +3273 +1467 +11749 +9641 +626 +7718 +13674 +10922 +15280 +6896 +7379 +10062 +9297 +17937 +11474 +9111 +4461 +19049 +8298 +14370 +1947 +5145 +18411 +19017 +12477 +11189 +16061 +1060 +15899 +5859 +19452 +16459 +11762 +742 +10520 +11469 +19933 +15974 +7395 +8820 +6119 +14287 +19360 +3181 +12085 +3968 +941 +11968 +11166 +1097 +18215 +14204 +16455 +2732 +13499 +6439 +1376 +18674 +14211 +13531 +2935 +4308 +791 +10316 +2696 +19330 +2037 +5054 +1723 +17714 +5760 +11347 +7117 +17910 +19498 +2365 +16898 +7394 +8668 +16335 +14940 +2094 +6481 +14309 +7661 +3493 +2715 +18742 +13598 +12327 +13445 +12533 +3927 +5610 +15112 +3957 +249 +4463 +16670 +776 +9071 +1894 +4716 +16708 +11464 +10753 +1725 +11680 +2220 +16285 +14743 +10295 +12075 +17333 +15529 +16010 +1641 +18549 +10728 +8515 +17018 +9765 +18745 +1754 +2877 +13622 +3889 +1753 +5032 +6425 +3998 +13268 +18086 +6124 +9672 +10994 +12976 +1493 +8039 +6802 +312 +11252 +18244 +19843 +18273 +17254 +7764 +2940 +16572 +8587 +11556 +18522 +3419 +11039 +14084 +3649 +15987 +7172 +14810 +7016 +17060 +13877 +1871 +11376 +5176 +4584 +12354 +10178 +18832 +18569 +14443 +219 +2150 +18328 +2311 +2370 +5488 +17743 +1970 +7738 +15562 +3845 +1146 +1100 +916 +1308 +1537 +19514 +9833 +3848 +16558 +8033 +1404 +6013 +6291 +1378 +19580 +7096 +17146 +3862 +17870 +846 +12736 +2855 +10034 +15604 +9230 +15270 +101 +440 +723 +2615 +13576 +3211 +19581 +17771 +11631 +3647 +1835 +8641 +4827 +8098 +13977 +10411 +17632 +16948 +2608 +373 +2233 +8980 +18729 +9277 +14417 +5691 +14108 +15746 +11056 +16425 +6320 +13618 +15906 +11572 +4595 +8773 +13120 +964 +15387 +15092 +9421 +7151 +17886 +4730 +16956 +16296 +3434 +10851 +9667 +4573 +10449 +6927 +16545 +12056 +11187 +892 +6889 +3017 +14949 +10702 +563 +17595 +17625 +12779 +713 +5529 +15189 +9512 +10591 +7277 +19636 +5160 +17784 +13013 +2258 +9892 +15846 +1049 +16321 +18912 +18534 +2541 +14494 +7645 +739 +593 +7652 +14119 +706 +4843 +248 +4645 +14126 +16547 +11262 +14393 +3967 +10667 +6900 +10923 +7138 +1350 +4868 +313 +19297 +18600 +11524 +4810 +5183 +11776 +2438 +2011 +15691 +6454 +1059 +13072 +1092 +6315 +16500 +17965 +6113 +12995 +17171 +19764 +14942 +2058 +16433 +2709 +159 +7077 +9580 +16157 +7733 +1964 +9762 +18158 +16611 +19454 +17005 +16738 +4569 +17220 +17232 +2063 +10749 +7924 +3763 +7563 +5801 +11663 +2951 +2760 +9996 +16059 +11545 +14519 +14320 +14530 +16587 +9330 +13952 +7913 +9424 +3939 +12379 +2805 +19612 +14863 +6327 +4216 +8927 +3457 +4161 +5192 +6276 +11930 +13811 +4947 +1551 +11051 +12770 +2603 +1568 +10025 +9815 +12170 +10886 +14733 +6125 +16147 +7647 +2089 +127 +5617 +4269 +9869 +211 +8821 +7182 +773 +3282 +2024 +18935 +18489 +9693 +12551 +2510 +4368 +15201 +11091 +13418 +8794 +16934 +8565 +7115 +14739 +12751 +9292 +11110 +797 +8362 +18954 +9219 +1305 +3852 +13234 +7947 +15610 +17274 +8364 +17507 +3799 +19316 +629 +5821 +5380 +9772 +8680 +2069 +9957 +19628 +14470 +1490 +6322 +9217 +10894 +15912 +19072 +7546 +18711 +9351 +17344 +16406 +6415 +3959 +11623 +9160 +16294 +7222 +10098 +18890 +19443 +734 +14258 +15864 +18055 +18246 +6952 +6609 +8740 +16001 +9927 +6227 +11079 +8645 +2831 +11816 +14363 +13110 +7886 +4339 +13742 +10878 +3590 +4367 +18580 +18164 +15478 +8747 +8293 +3047 +17462 +12161 +15668 +11724 +10645 +1356 +17465 +11186 +3727 +17337 +659 +2360 +17991 +19640 +18114 +4882 +8533 +10305 +10492 +1688 +3665 +10652 +19392 +11198 +10619 +8539 +6588 +202 +17699 +10700 +12293 +18008 +1095 +1288 +7094 +6729 +5572 +16779 +10148 +10890 +15373 +9518 +17190 +18618 +4302 +15469 +11796 +5261 +122 +17466 +19447 +3274 +9795 +11991 +9519 +5778 +9665 +1635 +18131 +15427 +17103 +8905 +18095 +11588 +261 +7822 +62 +11419 +10227 +10517 +7116 +16457 +16965 +18396 +8595 +15547 +3528 +7210 +9254 +11244 +11212 +19311 +4615 +8425 +18269 +18696 +13793 +5586 +13113 +5564 +17045 +2481 +6008 +2795 +4734 +18793 +17000 +1816 +10467 +9492 +15747 +3426 +9901 +17713 +18100 +17977 +18676 +4190 +6447 +7129 +19236 +3460 +7909 +4431 +19501 +18626 +5369 +12849 +6301 +10500 +4374 +4567 +17293 +6733 +2963 +17132 +605 +8854 +12211 +4789 +13052 +10774 +2017 +8015 +2614 +5858 +235 +12576 +14343 +4922 +10671 +11567 +15774 +14374 +4541 +19063 +19127 +7798 +8865 +12836 +2487 +7329 +1374 +17585 +15231 +7887 +178 +9238 +4853 +11334 +5582 +3938 +2466 +4554 +16792 +13012 +6969 +8270 +19735 +3772 +73 +5399 +12822 +2969 +2449 +11242 +16487 +10213 +2400 +16873 +16410 +858 +18653 +5307 +17497 +185 +13165 +6163 +4049 +13697 +3059 +4869 +1807 +17432 +16156 +10456 +17152 +12289 +2602 +8389 +19662 +15718 +5722 +11290 +10880 +9857 +887 +18643 +8479 +19928 +8683 +12984 +5602 +8661 +10905 +10283 +6754 +169 +14716 +9011 +8027 +14197 +6600 +14988 +12833 +14043 +14173 +4865 +15399 +16534 +18426 +18932 +7367 +8195 +19627 +3233 +11855 +10906 +1306 +3002 +12252 +15698 +3686 +8691 +7433 +6355 +515 +15365 +15792 +6835 +12959 +2492 +12167 +13079 +15476 +4448 +5609 +14565 +4766 +19833 +10251 +7996 +12524 +1900 +11099 +19864 +10577 +17485 +13293 +5513 +7649 +1258 +9091 +16369 +19542 +16597 +18165 +6074 +1919 +15933 +5830 +9029 +6037 +16183 +11732 +19318 +15450 +15849 +13164 +19983 +16278 +15728 +3899 +3546 +13134 +9193 +823 +5110 +2705 +17755 +17570 +17742 +324 +8350 +18757 +1701 +16686 +280 +5384 +18751 +14360 +4879 +12368 +1406 +15391 +16833 +18391 +11402 +5553 +12571 +19140 +6217 +12347 +17947 +19528 +17166 +2974 +18291 +6809 +6669 +17279 +19214 +3588 +16084 +9191 +495 +11090 +14771 +9669 +5983 +12523 +936 +10085 +4671 +16565 +18606 +9997 +3237 +4035 +14838 +14312 +19151 +10384 +3448 +2451 +17883 +15967 +11651 +17093 +10507 +19902 +10324 +17904 +19882 +19900 +14545 +9190 +3769 +12907 +1746 +3257 +11883 +6231 +11105 +8805 +8336 +5755 +645 +19052 +14412 +17748 +6387 +12985 +1393 +6764 +3877 +9361 +11440 +12346 +675 +12017 +4707 +13942 +10989 +10650 +12102 +11636 +14206 +19305 +2727 +15731 +9468 +6149 +14234 +12074 +16152 +7915 +5151 +12725 +8674 +4204 +19991 +13550 +14573 +17671 +17651 +27 +2640 +3554 +3361 +19783 +66 +2573 +12249 +14556 +5008 +61 +4264 +8263 +18409 +80 +6667 +3530 +9801 +7316 +7517 +17828 +52 +952 +5209 +5982 +3830 +7134 +15370 +11547 +13602 +6708 +16806 +19590 +5301 +5633 +8908 +9950 +841 +16730 +2109 +6060 +6915 +8353 +13086 +9952 +9301 +9449 +12165 +13024 +946 +19044 +30 +12837 +4968 +7857 +15117 +9839 +12898 +13051 +1341 +4535 +4982 +8334 +14171 +4635 +8435 +14079 +17272 +5774 +11843 +7989 +17933 +5953 +3467 +7520 +16231 +11182 +15613 +2789 +15163 +12458 +19614 +17393 +6277 +10314 +2354 +14161 +2824 +11909 +4770 +15581 +18891 +4826 +13497 +12040 +3540 +5560 +4277 +16318 +6738 +19472 +19344 +1475 +1705 +7973 +12852 +9735 +9016 +9592 +4391 +19209 +961 +7515 +14681 +7568 +2864 +17477 +8571 +9121 +3401 +14306 +8461 +14476 +10724 +4705 +15333 +4039 +1465 +2477 +2183 +17209 +18621 +17140 +8833 +18347 +19269 +17183 +19213 +13603 +18152 +6595 +15114 +11868 +17711 +2533 +591 +16742 +4052 +16053 +700 +8729 +3256 +19633 +18336 +8724 +6702 +1671 +19818 +382 +16 +16447 +5683 +5248 +4749 +6758 +11708 +752 +12797 +1494 +4703 +5157 +183 +19955 +12015 +9076 +15188 +15625 +19415 +7757 +11507 +15700 +19069 +18963 +14164 +11888 +19283 +17157 +394 +14840 +14513 +464 +11163 +15624 +4739 +18529 +12859 +2955 +3135 +3061 +4931 +6718 +10241 +17568 +17791 +19036 +4180 +11739 +15131 +14618 +17382 +242 +13273 +19837 +12625 +10363 +1344 +18788 +19028 +9907 +9261 +6656 +5113 +8095 +391 +3337 +16601 +1735 +6685 +10663 +913 +1721 +18056 +6468 +17737 +3098 +7917 +15449 +14897 +2475 +10296 +7658 +9244 +7393 +5544 +9486 +18857 +1685 +19229 +2170 +14208 +10582 +3690 +1221 +10675 +2753 +9972 +8881 +6155 +19762 +4474 +8736 +16992 +19671 +19979 +19110 +17617 +18592 +6479 +14134 +8375 +18015 +14678 +1071 +4820 +14020 +11147 +878 +10569 +6830 +6891 +439 +3795 +9936 +13331 +17982 +381 +3507 +6031 +12832 +15267 +6461 +6522 +2719 +8568 +3285 +4905 +15241 +1173 +11857 +10741 +15871 +5812 +4217 +15939 +11997 +273 +9654 +15536 +16036 +15105 +15708 +4665 +13862 +2954 +6634 +13320 +9861 +8301 +14575 +6778 +9339 +11272 +4880 +12945 +18349 +12218 +18024 +3129 +17170 +18168 +17759 +1360 +9435 +15989 +3431 +6851 +14891 +14738 +7321 +9336 +4558 +9461 +3548 +10630 +16000 +10483 +9918 +19210 +19569 +19896 +11083 +18936 +7653 +14225 +1514 +19748 +9034 +15258 +1516 +3770 +12785 +3781 +11315 +12424 +6892 +10414 +12314 +3157 +5096 +9166 +15303 +2189 +8838 +18492 +2680 +6426 +10697 +12333 +1503 +10769 +4426 +1744 +1667 +9736 +13034 +3518 +14252 +39 +19635 +7834 +19081 +8712 +6510 +2262 +18516 +16549 +18310 +1487 +6143 +3010 +8938 +8199 +19665 +17116 +12405 +9583 +9768 +14913 +7445 +7284 +1648 +17852 +16507 +19845 +8220 +7633 +11504 +16816 +12246 +9138 +19042 +2111 +2103 +8101 +4376 +19343 +17733 +9891 +11721 +14944 +13011 +7233 +13709 +7497 +8891 +18775 +10374 +9212 +9214 +18577 +8814 +11918 +3865 +3897 +8919 +18946 +18640 +12360 +17318 +8739 +383 +16762 +3873 +18292 +7537 +8677 +15824 +18232 +3194 +5787 +12028 +15332 +290 +12153 +1439 +5179 +16210 +19941 +13131 +11859 +11461 +17375 +14773 +146 +17014 +15061 +33 +9267 +16428 +9417 +12916 +9472 +1670 +19143 +16099 +5207 +8894 +11279 +16501 +361 +17180 +2569 +18449 +19718 +500 +19966 +3750 +4579 +16723 +8076 +4322 +18058 +17470 +4795 +13477 +5350 +6955 +5634 +14198 +3537 +13970 +17670 +6253 +15321 +10971 +328 +13640 +18502 +17659 +17541 +8991 +5567 +2298 +11490 +12821 +12527 +1208 +4152 +8764 +19745 +10821 +12727 +5492 +7025 +4223 +6156 +2073 +2799 +12353 +15820 +11932 +9629 +28 +8407 +9738 +11246 +13471 +12611 +11138 +6945 +6367 +7170 +7942 +13479 +4743 +8982 +8853 +6547 +12207 +19828 +3952 +8217 +538 +16993 +10727 +19123 +19118 +18574 +19974 +16464 +13631 +16828 +206 +13190 +11750 +658 +7879 +10083 +15459 +17922 +1443 +17613 +18045 +3329 +2714 +2587 +11538 +153 +10941 +11061 +2827 +2841 +15304 +13414 +3825 +4737 +1070 +4366 +15585 +7775 +2006 +19929 +1458 +7208 +15862 +9717 +7930 +10688 +18001 +9434 +4298 +1216 +7871 +15060 +15934 +9575 +12632 +549 +3870 +16910 +5007 +7226 +7174 +9203 +139 +4623 +12201 +15495 +18009 +3487 +8800 +13607 +4725 +1879 +8289 +10371 +19138 +16200 +3373 +6998 +16566 +15488 +837 +14529 +18170 +4815 +8308 +4611 +9564 +11694 +9410 +15106 +4664 +10041 +1510 +10835 +11841 +19533 +18327 +13441 +10486 +91 +4405 +9995 +1343 +17137 +13673 +19595 +10005 +14806 +18703 +14991 +17962 +3464 +11582 +13716 +14196 +7741 +8581 +1460 +18501 +5019 +10733 +1780 +4934 +9157 +19518 +7796 +15493 +13257 +10092 +1524 +9415 +7140 +18177 +8151 +4263 +7494 +3088 +10876 +19832 +16850 +6829 +2498 +18806 +4042 +15615 +19469 +4858 +18851 +13180 +11382 +13199 +533 +1464 +17678 +8929 +12911 +8209 +13900 +8388 +950 +11406 +11319 +1895 +9430 +199 +7061 +11799 +9794 +19258 +11861 +4923 +13227 +12434 +18900 +13917 +7992 +9379 +18004 +9398 +15494 +13617 +13277 +8486 +2229 +6800 +17394 +7196 +132 +17662 +8066 +11308 +18061 +7760 +2653 +19492 +4476 +11177 +17404 +1649 +12086 +5101 +16246 +15982 +16860 +2301 +17193 +14664 +15780 +3309 +85 +14415 +15586 +10800 +8965 +9384 +2047 +3118 +13551 +13157 +14022 +6192 +7371 +12258 +5589 +2697 +13140 +1495 +10028 +17589 +5970 +19410 +14039 +10096 +19607 +7758 +4702 +14821 +7755 +15005 +11592 +16602 +5062 +6178 +15634 +8306 +5969 +9557 +6840 +11698 +2913 +6519 +5613 +16986 +1618 +11728 +16964 +9827 +19768 +16351 +16081 +2041 +20000 +19840 +425 +16736 +5961 +9537 +7053 +7328 +18140 +17990 +5379 +2408 +16744 +10723 +13309 +18235 +532 +19810 +10423 +149 +5716 +10557 +8693 +6640 +16555 +4974 +16798 +11157 +7332 +17008 +9126 +4525 +6186 +15576 +8913 +8659 +11829 +4365 +1107 +1802 +9291 +197 +5368 +12778 +9264 +15612 +11287 +18333 +3699 +19486 +6968 +11494 +2145 +13340 +5803 +13996 +14826 +17842 +2556 +13613 +3740 +12562 +2313 +14665 +13324 +19985 +12914 +19182 +8045 +10325 +18876 +18386 +5056 +18655 +19922 +4245 +5120 +15460 +9364 +12080 +17101 +8511 +14332 +4612 +4782 +8532 +15298 +10424 +757 +8839 +5752 +16955 +2341 +3642 +5541 +5034 +4059 +12266 +18647 +8816 +781 +13267 +12622 +10514 +18828 +3037 +14938 +1907 +187 +17248 +16877 +5664 +18680 +16663 +15362 +10546 +8207 +771 +13824 +7488 +17846 +5690 +19954 +18339 +2900 +2687 +6356 +3583 +11656 +6225 +13465 +7291 +9296 +18139 +14052 +18149 +17484 +11145 +2560 +11009 +10813 +10828 +4193 +1624 +6162 +8175 +17588 +11955 +18029 +10115 +1322 +14889 +4515 +4691 +17524 +17787 +6618 +1481 +7508 +16484 +12415 +9174 +18111 +14062 +2897 +7417 +11700 +7743 +16106 +6174 +2279 +7390 +13408 +177 +4280 +14347 +12790 +9561 +16586 +14129 +16766 +9003 +14523 +10123 +12005 +15650 +310 +9924 +19436 +10417 +15540 +75 +8871 +10116 +15314 +15818 +14055 +16217 +7665 +728 +13464 +7945 +2752 +18395 +16814 +11817 +6977 +18240 +11923 +980 +15882 +17301 +19982 +15905 +14945 +13099 +7263 +14413 +6051 +7803 +4142 +2902 +2056 +2865 +799 +11741 +15907 +587 +14784 +10686 +336 +1854 +225 +142 +3592 +13961 +10503 +10488 +19160 +12375 +911 +2009 +2042 +17563 +8723 +17424 +4129 +11951 +5546 +13500 +11456 +14142 +13666 +9418 +18587 +15896 +9082 +5196 +18320 +19615 +17551 +9064 +10565 +4500 +14585 +16436 +12483 +1840 +17899 +9362 +9265 +5914 +11898 +11167 +9854 +4034 +5603 +8410 +3760 +19308 +17423 +16598 +15754 +8761 +6956 +3490 +3789 +12964 +13390 +10810 +12432 +3838 +3940 +12895 +15567 +15108 +7453 +8940 +5738 +11901 +6198 +3397 +14695 +16878 +5909 +13232 +17926 +3679 +3238 +7424 +15736 +5806 +19995 +7589 +88 +9062 +8669 +19248 +11074 +12419 +3215 +4120 +3170 +16863 +1817 +522 +4447 +13208 +13705 +6716 +6302 +10037 +6181 +17873 +6654 +16859 +6287 +19237 +16149 +1923 +891 +12891 +18735 +9451 +15936 +9271 +2738 +4239 +18558 +18238 +15856 +19092 +14689 +17996 +6589 +9790 +3509 +1147 +11270 +15614 +5257 +1000 +16135 +6852 +1573 +584 +126 +17694 +16945 +12143 +18584 +17415 +2443 +7664 +1929 +14887 +3007 +1571 +5508 +18113 +18537 +19310 +14948 +6219 +19055 +9327 +19233 +14977 +19158 +17198 +18438 +1297 +19463 +9834 +2185 +289 +2174 +3279 +18722 +3739 +5981 +18889 +8717 +6870 +12827 +16306 +6255 +15222 +3175 +10656 +8059 +5289 +6052 +10126 +3560 +19019 +19074 +12548 +5330 +15107 +18956 +5288 +4637 +6821 +11801 +5088 +5452 +2576 +2834 +4381 +13668 +11780 +11804 +5424 +14355 +6981 +2104 +16546 +8161 +10689 +18147 +15017 +12454 +18385 +2188 +343 +4839 +18811 +14270 +2967 +8460 +4386 +9252 +16823 +11793 +10022 +10653 +19374 +8698 +457 +894 +7594 +18736 +19646 +10901 +18689 +11811 +8414 +7155 +12829 +1658 +14408 +15804 +6374 +9964 +12155 +12140 +10759 +4932 +11621 +6410 +5931 +18136 +14831 +7458 +17869 +11119 +3141 +5364 +19699 +8658 +13235 +17915 +5036 +16390 +15583 +17150 +11454 +9910 +7687 +5442 +18189 +3206 +11422 +1501 +11769 +12845 +13812 +8449 +9623 +5164 +2168 +16268 +6984 +4464 +3909 +5980 +18325 +16419 +4709 +9107 +19421 +8760 +5287 +17942 +4958 +12387 +19304 +17419 +3734 +6524 +4895 +7821 +1716 +1546 +14829 +16990 +11678 +8834 +5479 +4444 +9386 +18126 +5303 +17539 +10729 +6092 +8165 +15001 +13300 +8236 +9150 +8047 +10551 +23 +3545 +1274 +11937 +8542 +7556 +10419 +10356 +17900 +17353 +9499 +3443 +1009 +19184 +2166 +3286 +4697 +17062 +8110 +18209 +10401 +4301 +1332 +10394 +6138 +12113 +15988 +518 +8851 +5053 +17620 +8265 +14409 +3035 +6495 +9881 +10823 +11887 +16272 +12427 +7411 +16009 +11610 +1774 +19133 +16576 +7034 +12846 +491 +3263 +10455 +12707 +6398 +18204 +11277 +18709 +7026 +1548 +1872 +4779 +10606 +10162 +14620 +9721 +11912 +2666 +9061 +15600 +13962 +3960 +17738 +10266 +18363 +296 +15379 +14978 +5068 +19585 +5063 +15742 +7960 +9703 +18496 +16483 +6962 +16024 +5847 +18880 +17082 +16627 +1158 +8713 +6611 +10861 +8002 +14392 +13153 +2005 +9893 +9373 +2981 +2404 +14315 +10758 +12193 +19139 +1109 +7555 +12242 +10900 +19676 +5433 +17606 +12966 +13381 +11096 +11559 +7201 +11098 +6936 +9796 +1639 +3491 +4075 +1847 +13108 +12556 +1138 +19437 +5810 +10578 +8128 +11076 +356 +14980 +16203 +17092 +6511 +11810 +2248 +7762 +2859 +19566 +15143 +16479 +7911 +334 +15087 +15355 +7859 +19225 +4031 +10309 +1850 +14217 +15213 +12197 +15837 +6239 +9542 +10685 +8347 +18355 +5353 +13973 +19705 +13486 +12640 +18286 +7935 +15308 +19663 +3828 +9048 +2102 +4413 +15773 +18959 +5736 +11906 +10121 +7106 +12519 +14813 +8283 +17995 +18245 +17528 +9664 +17514 +12975 +19180 +10776 +5813 +8248 +10809 +5714 +18275 +17511 +3266 +6741 +18541 +15913 +11962 +17903 +16954 +11969 +10747 +10817 +4768 +12361 +4644 +1078 +10225 +15292 +7541 +16364 +8121 +10849 +10508 +12672 +13805 +12359 +3415 +105 +12544 +2669 +6109 +8445 +10024 +1011 +13058 +12643 +25 +10913 +18623 +4593 +3931 +12 +2221 +3544 +15357 +193 +8483 +7874 +4218 +19784 +17358 +18553 +9388 +13395 +10285 +7980 +15753 +13612 +14110 +8226 +12962 +9413 +2444 +3839 +8799 +8120 +14653 +1806 +6353 +16080 +4093 +7975 +16968 +2983 +11979 +11746 +11862 +5064 +8423 +698 +10196 +18712 +5556 +17463 +16295 +14169 +6756 +4706 +6466 +12484 +6914 +5041 +444 +9153 +10742 +9094 +6229 +14835 +1788 +8358 +17297 +8194 +15854 +19056 +5225 +12367 +3178 +7933 +18853 +13392 +12610 +5908 +11284 +15829 +358 +8681 +243 +9363 +17255 +15461 +15770 +8428 +9848 +9961 +2207 +18578 +18187 +4603 +3604 +1631 +11597 +18360 +15034 +17912 +4234 +4361 +4811 +2907 +2663 +4064 +5274 +10457 +7662 +13062 +2525 +3350 +10254 +8331 +18062 +10376 +5816 +14534 +3204 +4854 +15587 +13195 +3990 +14365 +4017 +18262 +5611 +11794 +13077 +9691 +12285 +13835 +10349 +19198 +11448 +15544 +1689 +13986 +16431 +1164 +366 +19223 +9911 +14965 +3609 +9947 +1315 +19685 +18734 +11761 +6602 +511 +18486 +17360 +19869 +18089 +14054 +19378 +19515 +664 +13338 +12624 +19588 +13516 +15006 +19774 +717 +19102 +18654 +17433 +4752 +3812 +10509 +14495 +679 +5734 +13129 +12281 +1133 +3697 +7499 +18278 +15640 +10425 +15827 +8545 +18831 +13749 +17888 +10938 +6204 +18059 +5646 +11803 +13074 +10833 +14143 +11005 +9293 +12834 +1786 +4866 +19249 +9836 +16392 +9181 +13855 +13176 +9478 +701 +9132 +1542 +8862 +12341 +17309 +18661 +16443 +4640 +14857 +8290 +17283 +5496 +14242 +8793 +4576 +4679 +11889 +1438 +4925 +10355 +3819 +6376 +2532 +13526 +14322 +10347 +18854 +5956 +19423 +15665 +8915 +4663 +10692 +19644 +15832 +18590 +8621 +13148 +1924 +17794 +9825 +15755 +10445 +19190 +17758 +14146 +6411 +2590 +8168 +15901 +3581 +6440 +15382 +14036 +13349 +6535 +6592 +13203 +3161 +4546 +8444 +17303 +18984 +15002 +8550 +19625 +19884 +233 +7041 +19499 +18047 +4468 +17987 +13641 +10589 +17550 +7576 +7093 +19113 +1199 +1380 +9182 +12319 +19033 +1001 +17730 +13731 +7802 +19430 +6872 +8684 +6579 +8562 +6561 +11864 +6199 +15051 +15499 +11065 +18566 +5996 +13174 +4025 +7480 +15136 +17700 +3085 +5949 +7681 +9905 +11608 +13104 +17189 +7514 +3618 +3353 +17233 +8916 +15953 +18436 +13280 +5084 +7360 +5594 +6404 +6187 +10143 +3949 +14028 +4990 +2245 +13736 +17844 +11748 +15719 +17244 +876 +3124 +15721 +14763 +5663 +11000 +18467 +6098 +17920 +2939 +6864 +7719 +2765 +5726 +16995 +13325 +11705 +18849 +8292 +3368 +13861 +16438 +6196 +17304 +18376 +4872 +1275 +2509 +2557 +2340 +7021 +2650 +1794 +12043 +14059 +9408 +18205 +18720 +13010 +17627 +11010 +17859 +17921 +10917 +12656 +5336 +8553 +6975 +4383 +4116 +14693 +11771 +6093 +26 +9224 +14712 +17335 +17173 +9586 +17776 +1680 +10825 +4244 +15878 +8628 +17165 +3066 +818 +7383 +15126 +18393 +10612 +15174 +5763 +12617 +14167 +5003 +3096 +13585 +1448 +9831 +3218 +16882 +15123 +18705 +2600 +15032 +7241 +11132 +3297 +13040 +18608 +9974 +14192 +13958 +7070 +8843 +7418 +4296 +4012 +5566 +16074 +5409 +5514 +14423 +10210 +9240 +10558 +8792 +4174 +13021 +2508 +8744 +3624 +9826 +2099 +2450 +4997 +8300 +9202 +7290 +8354 +9455 +11114 +7824 +18422 +16705 +14690 +5329 +6739 +15794 +1497 +2426 +5643 +15341 +4695 +17307 +18641 +16288 +6546 +3326 +1076 +6025 +19048 +5454 +11089 +10899 +16578 +1260 +17090 +2870 +11028 +12158 +13954 +17078 +18718 +16446 +9290 +4775 +1233 +19424 +15685 +18182 +11836 +5741 +18378 +11354 +1724 +11609 +10093 +5968 +19296 +16590 +3108 +10896 +12243 +11 +14765 +11872 +12395 +11295 +17536 +18464 +5233 +995 +13449 +11846 +427 +4382 +11744 +12932 +18627 +1129 +7773 +1205 +15155 +12680 +10125 +16326 +6385 +13849 +11225 +3097 +16889 +399 +10042 +15394 +7503 +3511 +3026 +16831 +2012 +7969 +15158 +13916 +15538 +19165 +15629 +3383 +1615 +4608 +8345 +2181 +15602 +2985 +1206 +13910 +17242 +9573 +10789 +13366 +9324 +627 +10717 +18922 +2137 +6038 +8617 +14878 +1819 +12227 +16619 +7412 +15689 +13830 +14674 +15857 +18942 +8806 +3933 +5087 +17243 +17602 +4797 +9471 +12786 +6785 +15817 +12382 +5942 +13423 +657 +766 +12638 +15369 +2293 +4261 +4313 +19519 +13182 +13050 +294 +11471 +9368 +3217 +8225 +3714 +416 +12791 +19712 +11496 +10593 +1969 +1261 +9453 +5450 +2264 +1520 +17027 +14102 +8043 +16588 +17379 +16002 +7426 +4960 +1687 +12676 +17614 +7422 +2558 +10843 +16071 +16109 +11505 +9696 +2708 +15539 +15414 +560 +12428 +3582 +9599 +12300 +404 +5525 +7065 +19368 +15657 +14440 +15111 +13909 +3300 +10929 +13225 +17587 +4320 +2199 +5742 +11038 +4081 +7977 +12058 +3130 +1240 +13057 +11639 +5235 +8789 +2850 +5839 +19562 +8872 +17666 +18377 +10257 +17356 +18091 +7705 +215 +9917 +7102 +18268 +16976 +9009 +16032 +7962 +7666 +15885 +7128 +14114 +17499 +12351 +7184 +1280 +9320 +12328 +19482 +11432 +8508 +6719 +16981 +1659 +14253 +13553 +17390 +8635 +10945 +13402 +1201 +15144 +18331 +1181 +5335 +10864 +16844 +11055 +4745 +6403 +13747 +1579 +6133 +8077 +7402 +17330 +10048 +102 +838 +6401 +12303 +14218 +9804 +17107 +13621 +10206 +881 +11995 +17268 +15072 +12536 +9458 +18251 +8868 +13994 +13206 +15980 +17688 +13754 +1299 +17566 +15345 +6375 +3924 +17069 +5004 +14362 +9065 +18043 +714 +18225 +15089 +3084 +287 +11080 +7256 +7701 +18466 +15354 +11668 +3553 +14395 +19915 +18786 +825 +19835 +13575 +1831 +247 +2016 +4286 +8007 +12230 +1643 +3260 +1430 +19238 +16397 +11291 +17482 +18813 +12673 +11067 +1375 +13775 +16079 +7496 +6538 +8212 +10677 +12710 +15102 +1845 +10450 +11695 +3706 +8988 +16641 +3005 +5552 +11908 +6518 +18416 +18560 +14484 +10812 +311 +6700 +2489 +4814 +6725 +8462 +8875 +8512 +6328 +7243 +15055 +18698 +12542 +10775 +5152 +5131 +5549 +16658 +17703 +10351 +15186 +9407 +13696 +14357 +4714 +18871 +6300 +5477 +222 +5256 +14735 +9200 +16765 +4856 +13549 +1656 +18619 +13966 +2214 +5952 +796 +8537 +3193 +5094 +16830 +11210 +11692 +11994 +8379 +17603 +2092 +13879 +18172 +15026 +4179 +16301 +19341 +9136 +11273 +5930 +7936 +5398 +14274 +18913 +13555 +14098 +1330 +2296 +12950 +16616 +11661 +2529 +6732 +14431 +12913 +13222 +3720 +11359 +18399 +9565 +18706 +17075 +12089 +17130 +2672 +5208 +15159 +9660 +3923 +2693 +16745 +2934 +9287 +13990 +4122 +17963 +6070 +2628 +19739 +6648 +8719 +17515 +11774 +15489 +14652 +5338 +4892 +3433 +4484 +11632 +9010 +3033 +8230 +3200 +3977 +17847 +8202 +18675 +1119 +10056 +1413 +7573 +14341 +1036 +17108 +12098 +4137 +3651 +13379 +7904 +10641 +14976 +2180 +10944 +19356 +473 +16989 +8832 +15224 +6890 +2891 +2126 +4276 +11488 +12117 +6388 +4027 +8068 +409 +17687 +18778 +4822 +414 +18290 +3038 +6865 +10262 +14837 +10141 +9792 +13545 +18885 +4761 +4475 +3529 +19217 +19693 +3348 +7212 +18332 +7372 +12269 +3032 +11697 +16051 +13558 +2718 +19082 +6046 +11137 +6485 +9052 +14647 +13333 +5828 +4397 +7386 +8605 +5651 +6024 +5189 +16345 +15434 +14725 +4514 +11023 +13382 +7578 +13239 +4532 +15295 +11892 +9545 +2152 +14703 +18904 +8531 +15223 +18084 +4524 +74 +367 +3302 +15187 +17948 +5692 +6128 +6172 +862 +1800 +4684 +9414 +11033 +13573 +6000 +9615 +17476 +9059 +4805 +17054 +8582 +11549 +5650 +12626 +14308 +2238 +11714 +566 +5316 +2751 +4733 +970 +18769 +12843 +4658 +6209 +8830 +18171 +19497 +14780 +3730 +2661 +12284 +7012 +12277 +10008 +11933 +3142 +18428 +3667 +161 +12152 +12630 +18370 +7939 +2046 +3771 +16803 +13993 +2129 +14608 +18839 +12060 +16404 +11870 +18923 +10698 +6659 +2352 +1561 +4226 +14741 +17692 +9649 +5073 +15142 +19353 +6009 +3240 +5344 +10170 +4550 +17907 +11679 +7651 +6796 +397 +7148 +12621 +5558 +3054 +14049 +2090 +13856 +12317 +10660 +2514 +14338 +10482 +19202 +11648 +16403 +1335 +19574 +16665 +11989 +4482 +16313 +4481 +17290 +3742 +4407 +1528 +12901 +7516 +15834 +10231 +4945 +11337 +12609 +5516 +17039 +18026 +11509 +15831 +6085 +976 +18368 +2249 +17712 +16657 +2085 +1054 +1880 +6681 +8094 +9636 +18833 +14291 +7659 +11754 +19714 +17347 +1565 +18074 +7791 +6470 +2289 +10027 +1934 +12826 +19295 +17179 +6112 +15008 +17860 +9711 +12338 +18888 +9216 +17573 +15741 +6557 +11821 +3785 +13764 +14853 +5129 +15446 +1243 +2836 +11920 +4115 +19743 +1410 +16817 +18379 +3104 +5661 +13223 +4483 +2670 +945 +17124 +4863 +13476 +18169 +15448 +18006 +19349 +8378 +1572 +12920 +7204 +4230 +19243 +9426 +12260 +16377 +10194 +2825 +4908 +11368 +3711 +19583 +17367 +292 +12903 +16330 +5391 +13254 +494 +16445 +13690 +7236 +15348 +14251 +9734 +13249 +16374 +11516 +7995 +5557 +5923 +11866 +7832 +5799 +19500 +8329 +18652 +19034 +5186 +14753 +1061 +3947 +5497 +4861 +9169 +15018 +12213 +2179 +13884 +5766 +4358 +14866 +3880 +19470 +14598 +11652 +10155 +19732 +13138 +4287 +131 +16430 +7010 +4214 +12811 +1373 +9830 +13243 +3291 +12009 +14404 +3379 +12855 +1414 +13853 +14429 +4053 +3056 +4022 +9318 +7637 +3941 +5417 +16719 +8978 +16432 +19505 +12738 +1730 +16789 +18145 +18371 +3497 +8119 +7470 +17800 +13870 +18571 +6554 +11431 +14445 +7197 +1933 +15623 +12777 +7361 +13844 +143 +10883 +14593 +11806 +2645 +17512 +6887 +18030 +3128 +4333 +8911 +10198 +12129 +5486 +8823 +17547 +14551 +11753 +10950 +16379 +8214 +2067 +18622 +17927 +14904 +4844 +14790 +5246 +12162 +10631 +649 +15091 +14794 +11946 +6781 +17949 +15902 +6055 +8503 +9719 +7506 +15682 +4291 +15994 +13645 +9256 +4156 +12447 +7339 +3122 +3601 +19670 +15202 +14577 +17212 +6424 +6674 +4651 +2075 +8017 +8278 +12156 +8651 +5077 +1480 +3701 +4011 +9612 +17701 +12062 +19899 +15976 +12877 +14421 +18792 +6460 +12295 +13661 +3963 +3847 +12668 +5080 +16134 +2026 +12629 +10804 +10771 +12274 +214 +4299 +9503 +19905 +6019 +2035 +6059 +17521 +5218 +16809 +536 +6746 +12068 +9279 +19432 +15122 +10060 +10991 +6585 +1998 +10142 +3087 +11964 +1525 +1860 +11818 +2219 +14103 +13693 +5011 +7139 +13527 +5879 +7955 +9316 +16697 +8869 +11251 +1534 +4284 +733 +17527 +5569 +14351 +17418 +15542 +14860 +9767 +13284 +15301 +15678 +15219 +17311 +11024 +5699 +4445 +12438 +13540 +746 +6888 +19798 +6721 +1389 +145 +4078 +8049 +15621 +6921 +12862 +14073 +18173 +10683 +5789 +18085 +2374 +16355 +14745 +12662 +4894 +8104 +12685 +6399 +13724 +10841 +18069 +9887 +2652 +11241 +18298 +8535 +8474 +16926 +9249 +7268 +6697 +19167 +1891 +11305 +8575 +18527 +6213 +8178 +13619 +19999 +18898 +13321 +10640 +8731 +7009 +7686 +2565 +4069 +12508 +15261 +2480 +18716 +17238 +15868 +8197 +19619 +14934 +18585 +10536 +767 +13067 +8857 +18953 +16893 +13144 +19008 +4964 +9658 +4364 +9335 +8459 +379 +18910 +3409 +6979 +1409 +4906 +15490 +630 +2038 +2139 +5842 +6783 +696 +18035 +4543 +14226 +19690 +5147 +9021 +6036 +1128 +4325 +13201 +18119 +10323 +9701 +9494 +10550 +18311 +15527 +19917 +1122 +3407 +19589 +4884 +11907 +196 +19568 +6717 +13372 +13179 +16909 +14987 +6436 +14334 +5811 +15522 +1797 +3359 +15798 +8064 +7523 +11405 +15664 +8189 +14549 +19802 +2658 +3425 +14066 +15800 +11281 +16488 +9329 +8763 +10973 +3798 +5228 +3687 +13819 +9967 +3652 +8239 +8705 +8318 +10694 +7897 +9937 +11380 +17016 +10220 +12399 +17621 +1650 +17071 +14603 +15735 +7510 +3269 +17403 +4318 +3343 +2797 +3306 +3109 +5897 +3526 +9286 +14601 +10375 +16691 +10859 +16013 +14381 +1922 +8004 +7460 +19022 +10605 +14881 +8109 +16389 +9692 +435 +5 +1713 +7550 +12168 +4808 +9708 +9148 +4876 +16569 +6508 +13657 +17582 +1709 +1232 +16140 +4037 +17249 +14610 +1293 +8356 +7380 +8971 +14378 +19185 +16906 +15180 +14222 +3003 +8038 +17821 +11942 +18488 +10903 +11667 +608 +2157 +12806 +8649 +3983 +16528 +14 +15311 +17327 +13842 +19256 +16648 +184 +9485 +15858 +1309 +4362 +16655 +17745 +13184 +9441 +4408 +16967 +19195 +16827 +16671 +9188 +3824 +18471 +6317 +14144 +13056 +10402 +1108 +18707 +4121 +16297 +11827 +18002 +19301 +16290 +10822 +7114 +17389 +534 +2364 +1159 +17258 +18341 +6967 +13564 +2743 +6768 +8031 +18141 +363 +18456 +14654 +7884 +19790 +8115 +12111 +8521 +12506 +7756 +7607 +5973 +8925 +18952 +11686 +6895 +5100 +9731 +3107 +7847 +1580 +4143 +2344 +7721 +7342 +13237 +6268 +12144 +4032 +10943 +4063 +565 +15758 +18159 +1539 +14732 +8563 +18624 +7076 +9595 +13354 +4046 +7679 +5455 +14993 +13154 +4082 +2148 +10549 +12991 +5394 +4182 +12226 +16029 +19740 +16292 +4952 +19380 +10330 +10990 +17685 +6678 +6527 +18455 +17874 +9650 +18494 +3807 +2346 +6256 +11483 +1874 +14111 +10073 +10328 +692 +10003 +10563 +9710 +8137 +3685 +16689 +129 +6753 +5559 +12231 +1290 +4105 +8819 +5636 +14720 +5296 +11586 +16631 +7615 +11047 +14797 +7355 +1883 +14151 +8546 +15245 +11203 +1408 +11596 +1398 +4197 +14191 +7156 +16091 +19409 +1633 +5277 +4310 +6226 +454 +9288 +5453 +9412 +3163 +5238 +10146 +6151 +2424 +4145 +18612 +16892 +19907 +5693 +15343 +12492 +13020 +965 +4898 +17448 +4652 +10150 +17739 +16189 +4860 +4473 +8136 +8583 +7726 +1771 +2539 +8935 +12164 +12192 +11527 +5119 +14890 +9766 +2570 +16100 +9570 +14602 +16325 +7391 +6299 +14230 +8447 +5740 +6443 +14046 +17740 +10235 +19488 +13597 +2875 +17644 +16773 +1058 +12614 +13906 +16543 +16394 +14939 +14905 +11468 +18827 +18564 +19462 +13002 +14430 +13677 +9396 +5223 +16987 +11600 +8430 +6621 +13135 +12534 +4158 +10596 +14768 +3334 +16593 +7267 +82 +1042 +13700 +13928 +3593 +2728 +17783 +13616 +18860 +16477 +1884 +3341 +4455 +8523 +5360 +6744 +9787 +712 +12234 +64 +9539 +6601 +14071 +18366 +5169 +15012 +16284 +4748 +2977 +5519 +8456 +7158 +8475 +9258 +16579 +8251 +3106 +10428 +19736 +1630 +16367 +4317 +15059 +16195 +7278 +5500 +8624 +6245 +18284 +12479 +4221 +17256 +17119 +135 +9422 +8909 +7927 +10264 +13017 +7051 +12580 +4089 +192 +11988 +6610 +19422 +8392 +17224 +5795 +5322 +1995 +6348 +9236 +4495 +6127 +19207 +16255 +4836 +9538 +19629 +14271 +11400 +3575 +18824 +4141 +15209 +13699 +2686 +14671 +6450 +13634 +18974 +19253 +14865 +16388 +18247 +1431 +12762 +7066 +5608 +5924 +6989 +14656 +9274 +6333 +15028 +6261 +1608 +11467 +19389 +13533 +1491 +3458 +1015 +2794 +8610 +18369 +7108 +7727 +10071 +19320 +8491 +12090 +8934 +3015 +9067 +16834 +4963 +14605 +18596 +2405 +1991 +6503 +15378 +8231 +17919 +4285 +2496 +555 +793 +2366 +13341 +18687 +1202 +6599 +17973 +11949 +9640 +5875 +12414 +14414 +6094 +10920 +13905 +18533 +10406 +13899 +8976 +1188 +7873 +19188 +12857 +16770 +10304 +18077 +9698 +17593 +12390 +11536 +9862 +5744 +5033 +13998 +5743 +1031 +10481 +9928 +5362 +5057 +5149 +18682 +5295 +2131 +5474 +8808 +3726 +14455 +4422 +12459 +8650 +17260 +14754 +15993 +5910 +18194 +19914 +4904 +11235 +6712 +2430 +9566 +7643 +19651 +10145 +19816 +18051 +15056 +6195 +2502 +12838 +259 +8380 +13378 +5311 +5826 +19153 +13762 +14531 +12340 +19532 +4780 +15970 +5958 +17384 +15415 +11795 +9404 +7356 +11945 +8321 +10830 +321 +18044 +5786 +6319 +12251 +10016 +2739 +7976 +15319 +4319 +4911 +5599 +12753 +11303 +1210 +10440 +11546 +6635 +18617 +19729 +662 +18724 +16559 +17829 +8114 +19373 +14057 +16199 +5306 +2419 +3513 +17503 +3405 +1569 +15166 +3577 +15124 +9460 +3982 +12280 +18257 +5138 +15084 +5883 +3655 +18036 +18505 +11417 +7229 +11943 +19333 +7107 +19524 +4591 +754 +17184 +9066 +5834 +11322 +8985 +3984 +13421 +3023 +13334 +18132 +2854 +7330 +5410 +18118 +4630 +6441 +12951 +7407 +170 +12047 +5117 +683 +3403 +5236 +48 +14544 +18723 +2059 +816 +14524 +6826 +17732 +7325 +17945 +14759 +16490 +12132 +8464 +7878 +12376 +13459 +304 +11191 +13578 +3797 +16282 +3876 +14933 +9528 +3901 +16331 +429 +7880 +2484 +3398 +19582 +1596 +933 +9747 +18174 +2976 +12715 +1793 +8877 +2291 +2237 +6528 +16638 +6294 +279 +16974 +11660 +14995 +6694 +8041 +10029 +7527 +4754 +4013 +671 +7549 +18405 +12204 +9904 +11927 +11064 +7059 +14336 +4228 +15510 +1463 +1763 +17946 +1144 +14279 +15274 +9282 +16781 +17761 +14361 +4040 +9075 +19980 +4399 +13015 +8746 +17579 +17764 +18041 +7678 +3115 +14892 +13945 +4227 +1014 +5415 +570 +18354 +18808 +19142 +6619 +19507 +15353 +1381 +10597 +14597 +11939 +11383 +4369 +19836 +18420 +11034 +15451 +2912 +13181 +17693 +1844 +14101 +6400 +4602 +813 +17818 +14729 +13534 +10620 +18667 +3751 +15942 +9006 +10752 +11965 +13946 +2648 +11486 +19726 +7409 +11815 +15088 +1116 +5694 +1914 +433 +14816 +9631 +17106 +7899 +14328 +6912 +485 +16628 +11183 +17172 +7634 +10806 +5383 +16801 +14746 +19564 +19742 +13883 +13397 +15364 +1255 +2775 +12225 +7235 +19495 +3944 +17472 +1581 +19200 +7814 +3585 +19346 +14017 +899 +18850 +4157 +16396 +16035 +8732 +13932 +17177 +13345 +19379 +1145 +897 +17560 +4224 +16014 +16988 +4311 +13296 +1552 +10120 +13326 +5962 +16790 +19631 +10321 +10996 +4099 +17222 +7567 +18442 +19656 +6238 +19874 +16230 +12050 +2236 +11548 +7056 +14571 +1382 +1642 +14526 +14518 +16550 +6581 +19885 +223 +7449 +1605 +16119 +10624 +15328 +2097 +10058 +6965 +5217 +1196 +11506 +4668 +9397 +4270 +18060 +11229 +7898 +7554 +13048 +13155 +15733 +4900 +1715 +12112 +3515 +16874 +9746 +42 +13347 +11552 +1110 +3879 +19871 +974 +7765 +6836 +3355 +124 +13405 +1469 +13989 +11169 +14533 +1105 +3168 +15740 +18925 +9135 +736 +13177 +1101 +13116 +19539 +19803 +11259 +10571 +93 +4170 +2136 +2149 +8315 +5835 +5146 +16683 +14300 +8141 +14570 +16242 +10722 +6364 +11082 +13458 +8339 +7965 +6334 +16884 +12771 +14021 +550 +8998 +51 +17976 +19806 +703 +1339 +4380 +8285 +9915 +9806 +16158 +3052 +18125 +1999 +18684 +13119 +2395 +8639 +19154 +2367 +19891 +5733 +14450 +8069 +17660 +16498 +997 +1941 +7448 +8520 +14805 +6120 +11676 +14629 +186 +17567 +5106 +355 +8831 +8257 +18066 +19011 +17346 +17940 +17746 +3905 +11148 +14121 +16966 +9385 +13780 +6134 +13248 +17871 +19839 +8060 +2276 +19749 +2901 +15838 +16115 +7095 +8085 +16777 +1674 +10712 +15745 +3953 +3837 +8037 +10572 +9635 +14477 +11699 +827 +5470 +5852 +9543 +1751 +5889 +18669 +16258 +9054 +17331 +13029 +12408 +4429 +10307 +15826 +14301 +973 +16123 +276 +16012 +9945 +18403 +15923 +17262 +15662 +9810 +9923 +7320 +8457 +16911 +10992 +14162 +12969 +10473 +16845 +16935 +3251 +11115 +8087 +12731 +9823 +5242 +7432 +10216 +18202 +10939 +17401 +15813 +3446 +3081 +18924 +15029 +16668 +317 +3012 +19552 +11206 +6558 +6081 +3628 +9662 +6419 +15498 +13943 +15513 +7818 +990 +6923 +68 +15508 +15161 +5127 +4534 +9165 +3951 +8100 +14187 +16434 +18842 +10691 +1620 +14783 +7801 +3241 +2583 +10907 +14552 +19695 +3846 +13358 +2516 +6664 +13523 +1545 +11097 +17269 +19369 +14156 +17245 +17640 +14426 +780 +17131 +11392 +4758 +7819 +19694 +6701 +6 +13947 +17021 +17924 +7401 +4138 +322 +13588 +10490 +8715 +8267 +6898 +10476 +5051 +17392 +3042 +14317 +17980 +6122 +13792 +12560 +11510 +15968 +13481 +17974 +2988 +14875 +4936 +10290 +6408 +3543 +8371 +13400 +19824 +6448 +92 +5547 +6228 +15940 +19420 +2314 +14093 +19285 +16682 +17955 +18802 +7961 +15630 +16023 +11819 +13723 +10369 +3833 +9724 +14906 +18783 +8086 +12179 +6687 +19870 +18518 +4144 +16795 +4781 +14676 +9051 +16876 +6409 +5315 +12644 +1062 +2581 +14210 +14092 +18300 +7029 +15641 +9977 +12109 +13322 +1312 +7861 +8218 +17468 +156 +12623 +14235 +16161 +18642 +16952 +15766 +5871 +7614 +18929 +6142 +12679 +18408 +15070 +1377 +12570 +13385 +16243 +17250 +18081 +19255 +506 +3915 +571 +12497 +4080 +19023 +8920 +6752 +7676 +4499 +4480 +16328 +16656 +14090 +8466 +9488 +2876 +11340 +19962 +7599 +136 +11041 +1976 +13485 +15259 +6786 +16277 +17096 +6086 +1155 +1056 +7694 +19490 +14437 +7592 +19787 +5475 +17600 +2226 +18997 +9883 +12463 +12711 +6354 +2538 +13032 +13256 +5251 +9382 +15900 +342 +60 +14505 +10564 +16440 +18611 +12910 +4570 +5290 +6246 +12646 +12124 +11903 +4114 +5877 +14619 +16366 +17310 +8269 +8063 +12941 +5439 +4672 +13660 +19265 +6164 +691 +5819 +19567 +3586 +12884 +463 +3722 +9383 +15725 +13096 +18398 +16383 +2272 +12977 +14807 +9041 +1445 +4237 +6946 +15317 +1607 +11531 +11336 +16343 +4271 +19812 +6220 +2839 +8725 +13567 +3746 +7737 +8132 +5393 +1279 +19012 +9170 +12350 +7839 +19813 +840 +3313 +7600 +12378 +19107 +5762 +4650 +17686 +601 +13133 +8396 +3794 +19 +13838 +3387 +5441 +12389 +15696 +10875 +12803 +16761 +5972 +5866 +15504 +17399 +8488 +2958 +18573 +8886 +16413 +5205 +13433 +10655 +661 +6616 +15515 +7253 +8342 +2612 +3134 +4165 +4972 +782 +1829 +994 +12931 +12936 +4155 +13115 +4503 +15575 +12267 +17414 +16263 +6652 +15759 +8463 +2156 +4001 +17493 +17236 +10519 +15734 +9902 +2899 +12783 +11925 +19649 +18825 +15683 +18897 +18155 +278 +13790 +6180 +14615 +5616 +9942 +12801 +15687 +5249 +6727 +11421 +16176 +15891 +16112 +3219 +19367 +10367 +12593 +2889 +6144 +650 +12616 +7037 +8346 +808 +18834 +15385 +2616 +617 +14786 +12559 +19508 +17657 +9012 +19716 +4107 +8946 +956 +12154 +4215 +11869 +16151 +17287 +18666 +5318 +6745 +10410 +1067 +8018 +5305 +1983 +18588 +12684 +8572 +529 +13503 +5510 +6185 +14035 +10441 +1183 +7232 +9933 +12188 +18404 +3853 +11560 +15524 +789 +10959 +5000 +6490 +8541 +16202 +544 +19494 +8642 +4562 +4776 +19919 +13538 +18005 +9880 +8858 +13826 +16786 +4957 +16752 +4800 +15603 +9596 +16896 +2578 +12051 +7294 +17473 +3669 +11445 +18692 +6846 +10007 +4470 +5649 +16365 +5376 +13628 +13590 +5188 +2250 +2390 +14215 +18135 +420 +1652 +13217 +7493 +12689 +7716 +13398 +4297 +18088 +12986 +7571 +13886 +2045 +18737 +18243 +18971 +3610 +14397 +3579 +15336 +6321 +6391 +1719 +17319 +17572 +15230 +6030 +17246 +9619 +12294 +2268 +15325 +9604 +14781 +17879 +3826 +4181 +15004 +12981 +11931 +3501 +12309 +19467 +16188 +8 +5761 +5047 +7931 +9004 +17186 +14911 +2842 +1834 +19606 +12927 +12540 +17812 +13687 +17206 +9098 +16417 +11704 +486 +2431 +17720 +11230 +4778 +19738 +8234 +1102 +15532 +906 +10229 +4889 +16302 +10964 +9673 +4084 +9912 +3422 +7104 +14634 +10845 +10107 +11378 +14685 +2387 +18342 +15699 +3608 +13286 +12217 +5020 +16120 +8543 +12979 +15796 +6285 +16456 +4969 +18845 +751 +6159 +16228 +2015 +3849 +9102 +849 +13417 +1778 +2108 +810 +6833 +17100 +4136 +4526 +348 +17187 +272 +5831 +16304 +12874 +7566 +4659 +3616 +9359 +18645 +3395 +8105 +1424 +14024 +18314 +18123 +2361 +17857 +2684 +2114 +8646 +10010 +17429 +12024 +10773 +6044 +9399 +16045 +542 +15225 +7062 +17619 +4266 +9973 +17451 +11670 +749 +9490 +5913 +5705 +19084 +13556 +7908 +8753 +1939 +5448 +15643 +11219 +6994 +5668 +7353 +19668 +18092 +2999 +15511 +18207 +2458 +9269 +18782 +14041 +19358 +18175 +7113 +5123 +11606 +13263 +17892 +16218 +17449 +302 +8544 +15266 +19465 +15546 +10679 +13494 +6645 +18063 +12033 +8167 +4509 +13501 +258 +18154 +12290 +955 +13412 +12081 +7255 +3542 +11523 +5713 +16957 +10784 +19886 +6200 +12116 +10209 +10858 +18213 +4051 +5413 +3900 +5108 +16709 +17534 +19460 +8025 +8304 +7176 +9374 +3312 +4346 +8566 +19106 +6582 +14715 +12146 +18011 +1930 +353 +4631 +212 +7994 +9144 +18080 +12526 +18229 +5619 +6973 +19112 +9953 +5365 +7482 +3955 +19937 +7042 +13816 +17966 +2216 +9590 +17203 +8882 +4918 +5865 +17565 +10643 +6811 +12356 +3950 +3632 +5804 +2244 +15663 +19481 +19534 +14651 +15785 +152 +13732 +2563 +13773 +11820 +12989 +7313 +16704 +8337 +19352 +7817 +2633 +15432 +8955 +18497 +15417 +8848 +4148 +3764 +10395 +14673 +2832 +6877 +15756 +19707 +4682 +8989 +9450 +2535 +9723 +6006 +12912 +2255 +521 +7730 +277 +15079 +8893 +11751 +318 +15397 +6416 +4171 +12817 +12345 +11092 +19364 +18796 +19477 +5517 +5241 +14964 +10554 +16073 +5680 +9393 +12410 +305 +4274 +4973 +7369 +15226 +5568 +12591 +2721 +9655 +11535 +9032 +8160 +10585 +16016 +7561 +8812 +9828 +5266 +1351 +5358 +7389 +3806 +18586 +12487 +15436 +4986 +9498 +12180 +4337 +15483 +8271 +11957 +16279 +9859 +15845 +1502 +11066 +6412 +2620 +3718 +14954 +19976 +10790 +4471 +4189 +18102 +18519 +14333 +12339 +17361 +8204 +4937 +1295 +19094 +868 +4859 +19365 +3413 +1775 +13156 +5936 +5390 +11015 +2632 +11963 +7828 +6039 +3276 +5656 +17665 +7501 +1080 +9674 +11243 +7922 +11042 +6307 +13892 +13940 +9482 +8866 +15118 +6576 +1784 +17951 +1901 +8366 +17129 +10200 +16885 +19240 +16170 +3948 +3835 +7631 +12396 +19611 +17295 +9348 +8686 +12530 +3715 +3212 +9841 +8213 +1604 +11849 +1684 +465 +10127 +6136 +10256 +1758 +13323 +1538 +17436 +2032 +12036 +8338 +10050 +17148 +14112 +15592 +5090 +13384 +15492 +15339 +13173 +6208 +4736 +18764 +18690 +18124 +1396 +18789 +9741 +18713 +10086 +16093 +4799 +19020 +1485 +365 +17407 +15632 +3063 +5342 +13070 +1329 +8878 +11152 +13787 +15979 +4891 +16398 +7218 +11289 +18249 +5469 +11418 +10870 +1887 +16429 +8675 +7986 +11159 +5387 +58 +9168 +16846 +17467 +9452 +17447 +16503 +651 +5458 +6370 +10169 +10063 +18820 +406 +17339 +17417 +1384 +19709 +12480 +9303 +2448 +5043 +6791 +3077 +6666 +19340 +17611 +10865 +9900 +11742 +12695 +17002 +14767 +11634 +17841 +19678 +9097 +11650 +1808 +110 +1770 +10863 +17491 +14461 +3759 +5698 +12149 +19093 +17735 +5231 +2271 +14514 +12100 +13467 +2066 +2445 +15481 +5126 +3149 +16664 +6392 +10399 +65 +7855 +7970 +18525 +6126 +15844 +5768 +18805 +9621 +15101 +5300 +19530 +5312 +4151 +13860 +19004 +1266 +10777 +5150 +4816 +5172 +252 +702 +5823 +5863 +11111 +11508 +13339 +3729 +10030 +9843 +2624 +17380 +8679 +3709 +8051 +9589 +3365 +3280 +18010 +15057 +230 +12690 +8969 +11484 +19218 +13348 +17118 +2100 +14262 +10255 +594 +19852 +7830 +19461 +5345 +5502 +6363 +2256 +13852 +17012 +2494 +19958 +4995 +15409 +6789 +3974 +10122 +1511 +7786 +1248 +8127 +13084 +2500 +18524 +19013 +5258 +15961 +3004 +5337 +523 +19968 +6275 +8662 +19779 +10343 +1977 +15801 +12321 +16162 +7341 +9281 +14796 +9310 +19512 +19405 +19782 +14145 +13741 +19751 +150 +11990 +11568 +9552 +1184 +11165 +2873 +17804 +18743 +14394 +16041 +15676 +8228 +15025 +8795 +720 +5934 +349 +16651 +11366 +19021 +424 +14289 +2211 +8771 +5009 +18528 +17697 +19558 +3653 +11674 +14124 +6360 +18317 +13045 +16862 +17105 +14501 +10910 +18357 +13959 +17312 +11254 +6699 +1163 +14463 +17133 +1379 +3424 +19235 +16506 +13474 +2966 +750 +6251 +17774 +6665 +11172 +16449 +18591 +11218 +15077 +11681 +7650 +1566 +16690 +971 +5472 +19354 +623 +5621 +14700 +9018 +15048 +10975 +12805 +2052 +19103 +16048 +12467 +6146 +11128 +13798 +16299 +5624 +11716 +15569 +12681 +19003 +14089 +5005 +17643 +18054 +8507 +624 +9764 +430 +5139 +12955 +17633 +18795 +1088 +19129 +843 +19819 +14469 +15666 +4582 +9920 +13681 +10066 +8065 +9648 +2202 +96 +7484 +1267 +690 +16179 +3182 +5125 +10811 +5724 +15850 +2222 +9046 +6423 +13733 +15684 +15392 +17495 +12863 +498 +10164 +18966 +12418 +6222 +9976 +288 +16999 +15426 +13872 +14451 +9547 +10515 +7344 +854 +7902 +2768 +15997 +19294 +17308 +12595 +18887 +2689 +6909 +12091 +12844 +3926 +6542 +15474 +18227 +201 +5498 +17574 +4109 +9572 +4954 +6101 +7505 +16538 +16793 +17192 +17517 +351 +5133 +2050 +1282 +18186 +11233 +14645 +19337 +6158 +3351 +914 +5701 +3136 +5414 +1420 +11999 +11489 +7586 +442 +7805 +3809 +3138 +8291 +13592 +16618 +16338 +2127 +3972 +5562 +9028 +14912 +5653 +4166 +3743 +7872 +599 +6954 +10668 +2845 +19100 +16617 +154 +11374 +6779 +14547 +13415 +17097 +18994 +8608 +14527 +2486 +1154 +17689 +7869 +15346 +2994 +13851 +7350 +5431 +19834 +13357 +5989 +17009 +10533 +2351 +14369 +2285 +15677 +15380 +1910 +13132 +5639 +4735 +3009 +12004 +14330 +12835 +7845 +19647 +4479 +7473 +9394 +11296 +5279 +7863 +10458 +3954 +8373 +5988 +1220 +461 +2378 +14855 +5317 +10956 +1916 +4531 +4698 +15306 +11094 +12270 +13226 +8061 +14314 +9906 +8102 +11665 +3427 +962 +4411 +9899 +4033 +2513 +18110 +12481 +6737 +3661 +13591 +1504 +5545 +17726 +11208 +2362 +17204 +12377 +13014 +15207 +4708 +2123 +18387 +10018 +10180 +3360 +13529 +972 +12769 +6091 +11867 +2515 +17622 +7430 +18493 +19051 +18031 +221 +9493 +18830 +106 +12860 +6790 +1446 +1412 +3044 +4097 +9986 +3684 +9728 +656 +8351 +10291 +19880 +9679 +3629 +15564 +7370 +13046 +5887 +11953 +12133 +5966 +3892 +19597 +7750 +707 +5503 +1714 +9459 +12006 +1362 +12357 +14220 +5717 +18583 +1321 +15403 +19546 +3620 +890 +17508 +4586 +9158 +15310 +923 +17278 +6502 +9406 +1790 +1540 +16916 +14091 +13304 +4494 +10326 +2230 +56 +13219 +17320 +14202 +15503 +3861 +78 +10493 +4999 +1081 +17061 +11221 +10599 +12757 +8972 +1653 +15651 +9007 +3796 +5485 +14396 +13088 +4283 +5605 +13224 +12841 +4878 +9395 +10511 +11666 +4720 +5286 +9628 +18394 +3878 +16354 +4939 +8961 +14625 +19956 +1130 +227 +3913 +5466 +3840 +8302 +5604 +10791 +985 +7015 +210 +8742 +3455 +14814 +15884 +6188 +10504 +18972 +5749 +9758 +7990 +1103 +17428 +17696 +7485 +18153 +16044 +19587 +7929 +14339 +14636 +8643 +19199 +16971 +1486 +11765 +10794 +11709 +7038 +9211 +19761 +10590 +18417 +15283 +3850 +11144 +11415 +17838 +8117 +19322 +9644 +18451 +12386 +7331 +17077 +1241 +13242 +11125 +18440 +6857 +14276 +948 +13000 +13679 +18108 +14331 +14504 +9428 +15808 +15276 +1889 +15889 +7092 +4491 +9983 +5339 +14909 +2277 +18390 +8313 +19687 +2677 +15712 +4442 +8932 +17952 +9513 +9342 +16675 +14298 +11027 +2809 +12147 +16592 +1466 +9322 +17985 +1361 +15154 +6515 +15035 +3816 +7558 +11435 +19043 +6607 +13969 +4050 +19652 +17195 +16509 +18631 +13091 +121 +4472 +6568 +63 +12768 +10195 +16562 +13875 +19791 +1584 +7606 +4387 +15320 +11616 +711 +3083 +9262 +10710 +431 +15922 +17958 +4246 +513 +4971 +15273 +4172 +179 +3030 +3110 +17836 +3411 +7670 +12478 +2343 +11805 +5184 +18447 +4592 +12949 +16164 +8917 +14532 +10124 +14711 +18508 +5684 +2267 +15883 +5745 +19792 +5436 +3051 +8936 +8933 +11459 +14963 +7533 +14460 +16624 +19992 +10765 +10332 +14389 +13601 +10117 +19429 +7209 +5347 +2379 +4765 +12342 +17445 +13760 +6061 +13939 +3600 +4168 +17313 +11921 +7373 +2793 +4088 +10740 +9908 +1873 +13799 +11871 +6386 +17673 +18756 +6457 +9522 +14324 +7836 +19278 +19573 +14453 +710 +12582 +6241 +16363 +8485 +16552 +14762 +15601 +5534 +14245 +13043 +16439 +17385 +10985 +13933 +12906 +3602 +727 +18115 +3648 +17155 +10543 +8471 +13825 +10986 +5137 +9331 +15772 +18383 +11781 +10937 +10474 +3173 +13848 +10555 +15690 +7083 +3299 +12421 +5542 +9260 +14095 +9350 +14971 +6232 +7345 +77 +17822 +374 +912 +14680 +12700 +10161 +16652 +18815 +16724 +4907 +5555 +12470 +7205 +578 +7780 +851 +1865 +16522 +9008 +7293 +9463 +3192 +18536 +5030 +4959 +18579 +4587 +6512 +1024 +10980 +10898 +13636 +3095 +18779 +1733 +12699 +16512 +16480 +1179 +10921 +14594 +14388 +18748 +8898 +7486 +55 +17440 +9243 +1668 +8540 +13289 +9436 +17648 +346 +12871 +16749 +164 +12634 +19758 +8937 +15947 +1861 +17849 +4989 +12096 +16698 +11948 +8399 +12457 +15480 +12110 +11619 +16899 +11292 +9074 +5373 +14465 +15305 +10982 +6406 +112 +1284 +9356 +13890 +8959 +15879 +580 +7714 +5506 +3190 +17881 +14872 +4306 +18338 +9994 +17684 +17898 +87 +472 +6161 +4723 +3447 +18148 +3158 +18542 +4948 +3738 +5297 +19281 +14788 +15127 +13776 +13611 +10153 +7853 +12450 +10108 +14227 +19753 +6458 +1003 +19973 +15140 +6123 +16735 +6928 +4327 +10420 +16963 +940 +19622 +17196 +1925 +10566 +9358 +12819 +2030 +9681 +10077 +4334 +6690 +14318 +16043 +426 +1151 +8349 +4942 +5598 +2853 +19639 +11215 +4920 +13434 +9791 +2586 +5757 +5697 +14377 +16353 +18217 +8190 +10013 +18738 +19502 +18120 +9467 +9864 +16532 +11069 +8612 +1937 +1372 +15299 +16473 +5612 +12577 +15073 +716 +13517 +16768 +18633 +14902 +15125 +1093 +2678 +7539 +5928 +6696 +8923 +10954 +2918 +12820 +2851 +16694 +7692 +16254 +19650 +2386 +4220 +4701 +4004 +17718 +2989 +6924 +477 +5937 +9535 +4961 +16542 +12774 +1691 +10135 +14188 +17597 +15935 +14882 +4357 +13662 +18206 +8885 +5504 +7217 +5111 +5964 +11358 +3451 +8604 +8519 +15887 +12545 +982 +16497 +11323 +11385 +18188 +19645 +10984 +15886 +2551 +6679 +12606 +10824 +3956 +11180 +7574 +4028 +16212 +3914 +7677 +14076 +13885 +11514 +1767 +10012 +12423 +9778 +2821 +2811 +7956 +769 +14842 +19029 +13439 +18214 +2223 +3792 +10346 +9860 +517 +15205 +19674 +15361 +16625 +14219 +16820 +19101 +4351 +640 +18765 +11121 +4350 +16482 +6707 +6810 +14542 +2791 +8006 +12823 +689 +2929 +19232 +8752 +1342 +7597 +19672 +16838 +830 +14492 +16941 +14633 +3724 +989 +4184 +1453 +8029 +3327 +3677 +16206 +2457 +17398 +8335 +10118 +266 +5533 +4680 +11379 +17478 +9527 +19617 +1678 +10329 +2741 +18138 +2456 +16540 +12104 +11443 +1298 +2118 +17615 +5995 +6862 +3488 +15526 +11304 +4840 +8637 +15790 +775 +1137 +8983 +18397 +9798 +722 +5346 +15242 +12505 +15983 +19275 +15580 +13633 +13717 +11944 +12196 +10522 +13473 +2644 +10497 +17461 +17569 +6378 +8597 +16327 +1211 +4162 +6847 +4340 +19951 +1599 +7135 +15964 +5626 +14662 +11134 +5105 +12657 +17545 +3080 +18801 +11012 +16064 +4083 +2642 +18572 +977 +12963 +1483 +9630 +11837 +71 +10721 +3758 +18526 +10761 +8113 +4746 +9448 +3092 +16557 +17825 +18446 +8252 +392 +18106 +2957 +14830 +13937 +13308 +3804 +755 +7778 +17863 +8619 +13266 +17882 +16879 +19924 +11389 +11255 +14986 +15788 +1779 +7856 +19252 +11341 +805 +3380 +9491 +5805 +10094 +15694 +17089 +3040 +11579 +3307 +15278 +10400 +6058 +9593 +13908 +17052 +7700 +4979 +11938 +16412 +18864 +4819 +12537 +4342 +8687 +12683 +12049 +13008 +15497 +992 +6943 +19289 +12947 +1456 +14316 +8409 +16042 +13950 +13145 +14558 +14961 +10435 +15751 +2927 +15037 +13411 +13988 +16928 +12420 +14982 +3404 +15797 +14812 +19720 +11288 +1366 +4130 +9898 +998 +14385 +2657 +12093 +18980 +12937 +15151 +224 +10603 +2698 +3295 +6210 +10846 +11517 +11958 +7695 +9031 +2278 +17046 +15210 +7702 +11565 +2208 +877 +14359 +14139 +14411 +9053 +12569 +5575 +14752 +6876 +10816 +9560 +3562 +3894 +11237 +12842 +3335 +17299 +5688 +16983 +12775 +8516 +18919 +5076 +6027 +11966 +18406 +13103 +18220 +7896 +14930 +1302 +8829 +8453 +314 +10673 +4087 +7300 +19948 +800 +10413 +8825 +11842 +17749 +8810 +4490 +17681 +836 +12925 +11007 +9020 +5874 +9433 +7709 +8667 +4530 +1106 +9895 +17803 +16113 +8158 +1187 +19264 +6286 +19216 +16332 +2287 +19260 +15395 +17989 +17056 +4257 +6020 +12588 +11996 +9770 +6531 +5827 +1785 +12064 +10807 +10294 +19059 +4504 +15596 +6438 +4825 +7552 +9057 +18677 +8279 +17911 +19664 +4538 +17226 +19027 +9047 +17028 +14974 +14105 +2303 +11840 +9568 +10111 +3082 +10249 +13152 +5532 +14213 +16516 +18014 +19653 +8949 +10972 +14520 +16575 +3656 +14027 +15027 +9694 +12890 +10080 +18771 +16314 +10556 +12661 +19972 +18649 +699 +13948 +7751 +3131 +6784 +2676 +275 +2888 +16062 +7163 +19120 +12723 +17616 +18763 +10595 +15530 +2995 +783 +13107 +3416 +8081 +8176 +17959 +1728 +10932 +19737 +12468 +15440 +10682 +10281 +10498 +11967 +9314 +9189 +11332 +17661 +18196 +14557 +786 +17267 +8999 +4686 +1022 +7812 +18280 +456 +4312 +10302 +2906 +8606 +19544 +14775 +730 +16858 +19191 +6550 +13128 +17408 +18023 +9971 +19711 +11312 +4487 +4085 +15128 +14255 +8297 +18539 +787 +331 +6999 +12733 +10978 +14555 +16517 +15097 +8241 +3234 +15937 +13922 +17459 +1870 +17768 +14584 +19259 +5116 +5727 +931 +3767 +8005 +2607 +11446 +16883 +13893 +17149 +6018 +13261 +19066 +4685 +13725 +10893 +8622 +19603 +3692 +7888 +10635 +14670 +14441 +16672 +10622 +10074 +11786 +2699 +19206 +8367 +18976 +3421 +10434 +4451 +7403 +3857 +1799 +13049 +18178 +8514 +10714 +6771 +3152 +18337 +10109 +1083 +8326 +19805 +5950 +19847 +4527 +5855 +11501 +19808 +6397 +15479 +19244 +4186 +2528 +12598 +7043 +17510 +15752 +11162 +6982 +6216 +6264 +13484 +2039 +19015 +2433 +2694 +1544 +8215 +10538 +16695 +118 +16077 +11429 +1496 +11057 +13818 +14005 +12615 +5221 +12602 +3674 +301 +14175 +13343 +600 +14983 +524 +820 +15281 +11539 +4133 +4198 +19963 +5947 +10165 +15234 +11491 +4135 +4983 +1876 +7528 +7304 +1562 +15212 +1043 +19677 +4850 +16854 +8897 +18780 +14903 +3881 +5463 +5893 +15405 +16276 +1209 +13525 +6806 +10732 +7767 +13288 +15528 +6372 +12709 +6129 +12409 +9811 +18287 +2895 +15777 +401 +3278 +8573 +1554 +6500 +15252 +13647 +11399 +2242 +12502 +12507 +3477 +17207 +10341 +15525 +4823 +9161 +6308 +13294 +10629 +16245 +3296 +3538 +2801 +10584 +9403 +12498 +8714 +5198 +1338 +19990 +3574 +7314 +16620 +7569 +3494 +1 +14065 +3145 +17457 +9284 +7180 +10892 +7111 +8180 +1821 +2014 +16794 +19005 +12917 +8470 +17343 +1518 +7529 +6587 +11100 +1760 +16159 +6964 +19509 +8222 +11116 +15229 +13559 +6183 +709 +2098 +15239 +6169 +19667 +17363 +13213 +3144 +10767 +11387 +5134 +2003 +12185 +19682 +9113 +4577 +19384 +8926 +537 +11326 +11783 +16912 +4178 +16291 +10344 +17866 +5561 +2746 +10562 +11578 +5294 +14800 +19925 +12412 +15835 +11577 +9481 +14515 +17350 +14493 +7078 +6986 +18146 +9531 +16411 +5954 +2511 +5791 +11662 +13463 +14537 +6179 +2025 +4119 +6428 +7919 +12301 +741 +17003 +11520 +2322 +18545 +2816 +5994 +6105 +16107 +1073 +14622 +13342 +18050 +10078 +17345 +17554 +1543 +18 +7660 +5438 +9943 +3594 +3703 +5395 +11370 +16581 +15418 +3400 +10412 +14131 +13197 +13665 +12372 +18872 +12839 +2460 +16996 +12585 +13902 +15263 +9686 +16563 +1457 +13276 +947 +3589 +1135 +18197 +11713 +12163 +2204 +2919 +9626 +16423 +15582 +15949 +4205 +17938 +17413 +19576 +4993 +5283 +14579 +5309 +14546 +15726 +2849 +2142 +11410 +13810 +9479 +3820 +866 +9978 +16784 +11671 +6837 +16320 +11812 +12184 +8153 +6873 +7419 +7101 +3344 +19846 +9263 +1478 +10669 +12194 +4501 +10924 +7264 +13394 +18353 +1956 +1277 +12092 +12460 +5232 +19324 +2119 +16437 +9390 +11362 +7475 +2597 +15271 +10529 +6995 +19228 +4045 +4951 +8139 +4466 +18481 +4561 +16783 +10099 +6860 +17063 +927 +2033 +12648 +17781 +2898 +1320 +9871 +6326 +17469 +10601 +14705 +9870 +19192 +7219 +8847 +2792 +15438 +6422 +12590 +11420 +2627 +6361 +18901 +19204 +16903 +15181 +11050 +18231 +2536 +1986 +9228 +19402 +2165 +6001 +7311 +4519 +11158 +16208 +13691 +1942 +7375 +6005 +19039 +12972 +16462 +12515 +9276 +6880 +11200 +9931 +5623 +2862 +9716 +50 +9944 +8391 +12853 +11878 +7254 +15717 +14919 +19413 +7322 +4016 +2527 +16907 +2524 +5135 +17276 +10647 +13279 +10015 +9776 +12604 +3113 +16471 +14999 +11702 +19608 +10787 +8154 +5807 +13462 +604 +8939 +6273 +8979 +12619 +10386 +13069 +15727 +11689 +4536 +16075 +13938 +13580 +15599 +18962 +10735 +11802 +10383 +1399 +4410 +3535 +17480 +14985 +2814 +3123 +2724 +6224 +18865 +8240 +17731 +19163 +11893 +3245 +12224 +10103 +2013 +3435 +5017 +19932 +18568 +2339 +13 +3243 +17153 +10233 +4851 +2574 +17494 +10453 +8242 +9960 +372 +3410 +11084 +5357 +9627 +3896 +12304 +15424 +4673 +3841 +3832 +17147 +8123 +13614 +19935 +18746 +8343 +2887 +11414 +2347 +7245 +589 +13837 +5735 +18374 +5222 +2040 +10839 +15184 +16493 +1697 +8528 +3958 +15919 +14802 +14478 +12316 +47 +3814 +15941 +17556 +5025 +6505 +2599 +4807 +16573 +9026 +4753 +13330 +17961 +6951 +4176 +18581 +6280 +482 +7481 +847 +5703 +6686 +12430 +9343 +15955 +14406 +1063 +5293 +1944 +10734 +14286 +17833 +9802 +6627 +4307 +11310 +7206 +4848 +13644 +17175 +11330 +4675 +8977 +15247 +14724 +535 +16143 +3270 +4548 +6938 +6677 +9005 +7020 +9088 +15010 +17070 +704 +119 +12456 +15356 +13788 +9116 +7416 +237 +15198 +59 +13761 +10205 +9325 +10372 +1454 +12134 +17095 +13936 +11049 +502 +4606 +6182 +3863 +15307 +4583 +11554 +15812 +14138 +3258 +6628 +2885 +16888 +641 +11710 +5554 +14854 +9242 +16270 +11171 +19856 +18552 +15074 +17754 +2806 +7711 +4314 +19993 +3468 +12255 +6787 +15711 +7231 +4434 +10023 +9285 +5031 +19987 +13934 +12706 +5672 +9465 +7875 +10303 +19459 +4489 +6807 +6819 +11240 +5921 +12952 +3370 +9733 +10462 +12708 +4175 +5746 +5906 +4485 +10783 +12094 +9690 +18895 +10977 +880 +15847 +8134 +7030 +2154 +18109 +13728 +5571 +11363 +13663 +4131 +8656 +10532 +14433 +17810 +15439 +17251 +4456 +14559 +17505 +1586 +8790 +12115 +3177 +6671 +670 +8561 +17786 +18107 +16930 +14761 +1432 +5153 +6021 +111 +14955 +4624 +16076 +14237 +9844 +1270 +17917 +17015 +15227 +19331 +18072 +7003 +1960 +10914 +6799 +15138 +15068 +13651 +19053 +8900 +16740 +12291 +2503 +5685 +6639 +8718 +7792 +8309 +12079 +45 +84 +13028 +19830 +17453 +10848 +18701 +3321 +2212 +8817 +19290 +19602 +3811 +13789 +144 +7167 +7729 +2717 +6197 +13454 +13704 +14757 +17324 +15910 +9469 +14907 +4555 +708 +1123 +7625 +13782 +13126 +17596 +13957 +9220 +6709 +8019 +11503 +2173 +4388 +16776 +7399 +18430 +6831 +4496 +642 +7723 +5530 +19442 +3778 +2952 +11253 +8700 +5520 +4446 +12978 +1215 +7685 +9872 +15951 +3934 +9149 +1390 +2471 +12160 +14399 +2434 +18415 +1218 +32 +7982 +6812 +4124 +16855 +18941 +2465 +2734 +16235 +6157 +11791 +2737 +4717 +6371 +13109 +7912 +11730 +3555 +16654 +6456 +15368 +7580 +8096 +10407 +14311 +10043 +14424 +369 +12222 +930 +11154 +10068 +4544 +5456 +19536 +4857 +17200 +8804 +13532 +8733 +422 +1506 +18343 +14719 +14153 +3048 +10267 +14506 +5029 +19942 +5898 +2382 +3445 +9501 +18362 +15809 +12221 +17889 +1979 +2217 +16234 +5817 +10847 +16634 +18902 +1743 +4247 +8945 +19623 +10002 +4438 +12048 +6623 +9521 +13864 +17763 +9245 +17975 +11607 +1909 +17851 +10919 +18575 +9464 +10642 +6247 +2061 +18940 +6649 +2106 +14928 +9727 +5719 +8118 +11365 +19383 +4681 +1252 +5370 +9341 +932 +19183 +2420 +11824 +15570 +3993 +15431 +12494 +6548 +16249 +9922 +8387 +17677 +1629 +11720 +3636 +16336 +14087 +8133 +3755 +960 +3946 +16751 +8827 +4885 +11718 +17113 +2463 +17058 +2197 +11153 +17542 +13968 +1692 +9510 +1598 +17488 +19609 +3440 +173 +1849 +6383 +13880 +5226 +8374 +7870 +4086 +12667 +7468 +6736 +10201 +2125 +2589 +6608 +5270 +7683 +3717 +14243 +10644 +11638 +1189 +8767 +19540 +9812 +3980 +13301 +13319 +16386 +14660 +6190 +19137 +18090 +6845 +9849 +7178 +9816 +308 +9653 +11880 +4949 +1903 +7656 +2818 +15129 +13426 +14721 +12555 +7133 +9304 +1140 +5193 +17641 +19302 +2755 +9232 +2290 +12070 +14373 +18000 +6573 +1429 +18199 +12099 +9266 +19799 +19842 +14630 +15890 +5400 +1168 +1334 +678 +6820 +19767 +9867 +3627 +15482 +4219 +18098 +11759 +6569 +1522 +5971 +14975 +19122 +3102 +10832 +14152 +15486 +11430 +14481 +10335 +3613 +19350 +4041 +3053 +8884 +8173 +14611 +5180 +9204 +3476 +18133 +7054 +15400 +17218 +2182 +5252 +13778 +10306 +8472 +17474 +13635 +15264 +8964 +19173 +13839 +5596 +12642 +2008 +6478 +4278 +10186 +6869 +984 +4803 +3481 +18944 +14282 +13615 +15811 +19363 +11136 +7189 +15192 +1759 +3303 +7237 +13518 +11633 +14817 +14946 +16346 +5785 +4870 +8768 +4729 +14672 +13143 +12444 +7398 +14648 +16298 +8079 +14285 +7397 +14078 +13859 +4581 +14442 +16714 +9176 +8370 +188 +12186 +11185 +2192 +556 +6540 +17373 +7988 +7629 +8772 +15852 +1841 +7050 +3644 +1975 +16088 +10223 +3437 +5406 +398 +9409 +8221 +11022 +4599 +17923 +19212 +8525 +13827 +13178 +13063 +13568 +597 +8534 +12787 +9439 +12550 +17022 +7335 +4231 +14528 +17725 +4976 +14923 +15675 +12650 +747 +13745 +4043 +10501 +10969 +4941 +4153 +2195 +12187 +11124 +447 +15401 +18301 +10561 +6296 +1363 +3414 +12037 +4513 +9714 +4258 +4202 +1567 +9251 +3195 +2028 +13727 +10188 +17434 +5451 +393 +10472 +18208 +5378 +3288 +15950 +3389 +16984 +10052 +7082 +1509 +16150 +11193 +3482 +18241 +15206 +12694 +8589 +19453 +14117 +8083 +18296 +15671 +903 +16727 +14083 +19159 +10439 +493 +5493 +17086 +15611 +1575 +16574 +11052 +2315 +19831 +1676 +14627 +19279 +9199 +7674 +5230 +15390 +15977 +19765 +11356 +12465 +18800 +5462 +2300 +8322 +4146 +16519 +16998 +4393 +7958 +3184 +13159 +2890 +1996 +14181 +637 +13125 +13038 +3623 +3067 +11766 +12208 +5955 +12813 +16951 +8522 +3119 +15340 +19563 +19939 +4996 +19335 +1037 +18714 +17876 +18389 +13231 +15917 +7782 +14898 +18670 +11630 +17753 +8603 +3584 +10272 +18520 +19060 +15779 +6553 +2105 +3022 +6160 +11143 +15697 +13675 +220 +13874 +6529 +13783 +8706 +1262 +10317 +12012 +12435 +18774 +19300 +1419 +11201 +16096 +12869 +4769 +14310 +1364 +16991 +6117 +2631 +6040 +3103 +6942 +11453 +7901 +6972 +14364 +12145 +417 +9965 +12878 +2626 +17576 +19338 +15036 +13574 +12971 +12247 +13085 +2336 +19684 +5237 +5187 +11919 +562 +13007 +16523 +12939 +5250 +5588 +16600 +10405 +9663 +12558 +19723 +16362 +8135 +19763 +9391 +2427 +7476 +2029 +18293 +15895 +2385 +1489 +636 +981 +1156 +13282 +15115 +9598 +1213 +16544 +1296 +15737 +2784 +5932 +11104 +13888 +2530 +9706 +11081 +3524 +8956 +13166 +18557 +6065 +163 +6033 +516 +18459 +16866 +11518 +5428 +478 +11492 +10280 +7532 +7002 +14327 +3220 +14828 +7036 +16393 +13768 +2930 +1117 +6726 +2318 +13211 +4689 +3342 +10203 +12398 +16526 +8782 +4418 +8237 +3169 +19441 +10112 +18812 +13734 +4102 +17219 +5543 +1906 +14728 +19262 +15429 +7648 +7893 +17037 +4627 +16891 +11123 +5327 +6657 +2501 +1812 +13229 +3099 +3375 +5468 +3815 +4459 +860 +11151 +4140 +15652 +11792 +7192 +1686 +19348 +13925 +19637 +7427 +18068 +2010 +13216 +10431 +17501 +17030 +9687 +18018 +13730 +19817 +18679 +8473 +10827 +341 +4169 +1846 +9755 +14042 +1180 +13438 +7194 +15654 +9099 +15454 +12018 +19197 +1755 +4150 +15169 +10857 +6352 +7006 +10408 +13355 +19450 +15119 +7004 +257 +10915 +6684 +8840 +18930 +4641 +10877 +229 +7166 +9896 +5905 +7545 +344 +15920 +9152 +246 +9058 +19520 +4300 +4792 +19691 +3504 +817 +8737 +12905 +2415 +6907 +8860 +5027 +8024 +3888 +16163 +11647 +14006 +12023 +4877 +7644 +1563 +11462 +18219 +12019 +1989 +8497 +6763 +3996 +181 +11278 +11703 +554 +6004 +16785 +5024 +17144 +11675 +2857 +2485 +13659 +17741 +11130 +12704 +19747 +6166 +778 +6670 +19756 +8796 +19227 +385 +10731 +11961 +4047 +15990 +19669 +12521 +16944 +16474 +13432 +10829 +6960 +19887 +2559 +18752 +8361 +13833 +17824 +13186 +8008 +10746 +9302 +12298 +19491 +17194 +94 +2726 +9562 +17936 +14229 +17211 +1264 +2388 +7536 +9309 +1090 +4704 +2987 +16669 +1069 +5974 +666 +4110 +12960 +7011 +3430 +3658 +7957 +13867 +2305 +6814 +9642 +18184 +6066 +10263 +6331 +6583 +11401 +18710 +7761 +9120 +18732 +7057 +15086 +13461 +9607 +620 +357 +10244 +16750 +12518 +14047 +13311 +1637 +8493 +9688 +3472 +12299 +5998 +13924 +6504 +7669 +1921 +9307 +3126 +6080 +18350 +17884 +19096 +19377 +1765 +3605 +16444 +6057 +19150 +7336 +745 +12446 +18967 +17715 +954 +6207 +12627 +3154 +11384 +14172 +15881 +10026 +2786 +18142 +18848 +14487 +19946 +14489 +12259 +1326 +10541 +1739 +7035 +13278 +10706 +1226 +352 +7017 +19211 +1966 +5756 +19780 +18829 +34 +11245 +2462 +4457 +14180 +2692 +14910 +13246 +6710 +10638 +7946 +7282 +8727 +1368 +3519 +5185 +6794 +8042 +5645 +5808 +4835 +17102 +3921 +11209 +12136 +10628 +3576 +4998 +7242 +18183 +4817 +1796 +6850 +16380 +8288 +16177 +12374 +2774 +12953 +19135 +17368 +12202 +2671 +12030 +3502 +13272 +18318 +2947 +9429 +17981 +13291 +16647 +9353 +13506 +1345 +1606 +17865 +15331 +3223 +9213 +2329 +6693 +15916 +2748 +1597 +12141 +14140 +10183 +17864 +15681 +10661 +17526 +3179 +2682 +9129 +17455 +9142 +7890 +908 +4428 +1257 +6910 +4718 +19099 +15214 +168 +15250 +19414 +6957 +7013 +3617 +15080 +2637 +19908 +7213 +2778 +8424 +6742 +13447 +1388 +8942 +6449 +13283 +6520 +14973 +1632 +9919 +3172 +10166 +15706 +1954 +12442 +6048 +265 +884 +19234 +2575 +19868 +18708 +1191 +3020 +14077 +15453 +1936 +2761 +13577 +17654 +9508 +15423 +12865 +3808 +2055 +13652 +5522 +8046 +17315 +11752 +2304 +4058 +7626 +9317 +10968 +6605 +18609 +12029 +9514 +12933 +6311 +6106 +4719 +10381 +6532 +12583 +14195 +11685 +4255 +15557 +6704 +15840 +15208 +6497 +8632 +3696 +7840 +12973 +18856 +9969 +19613 +18563 +6743 +13422 +6575 +12637 +3962 +14827 +1112 +19268 +5240 +5901 +13009 +5481 +15268 +13265 +16451 +18319 +1837 +8355 +8598 +4207 +983 +12961 +13919 +14456 +1836 +1239 +3682 +2158 +15971 +12416 +17843 +12431 +5091 +2773 +11993 +10113 +10676 +17265 +115 +11344 +13027 +6813 +17885 +15398 +5191 +16829 +7964 +13565 +2469 +15284 +15334 +15636 +16577 +17943 +13522 +13595 +15555 +2598 +17872 +10530 +17790 +5792 +4328 +19037 +4015 +14635 +1783 +3928 +17277 +10138 +10764 +21 +7171 +5579 +2956 +15658 +4832 +9159 +12366 +2086 +1677 +1346 +13813 +14918 +19250 +3229 +5583 +15552 +17391 +19445 +19064 +19222 +8963 +10540 +14799 +9 +11515 +12578 +13606 +8198 +18794 +4379 +3132 +19960 +18979 +631 +5846 +12072 +15204 +5022 +7193 +12746 +8665 +4090 +8310 +4594 +11466 +15411 +13457 +5418 +16502 +10360 +13018 +1912 +2683 +19853 +2078 +3221 +17284 +6288 +14554 +7948 +16763 +3317 +3633 +3568 +6613 +16070 +17081 +15908 +12464 +8082 +13060 +2555 +3439 +8477 +12271 +5038 +19860 +4829 +11706 +7998 +8384 +1595 +1805 +1640 +474 +14984 +3614 +10814 +14329 +419 +4940 +10881 +9506 +13006 +10918 +8530 +17562 +5725 +17235 +1167 +17756 +462 +11525 +8492 +2843 +6761 +11361 +6935 +11226 +8856 +16721 +17026 +57 +5769 +14925 +9033 +10129 +2837 +8439 +1616 +6434 +11611 +14205 +6075 +11770 +5291 +2326 +7364 +586 +12935 +14640 +9955 +335 +18730 +1813 +11972 +4690 +672 +5793 +13220 +5178 +13492 +19396 +15145 +8657 +11858 +19994 +19162 +1033 +7147 +2330 +19757 +572 +643 +384 +9925 +1125 +16239 +1468 +14128 +11184 +17656 +19701 +15014 +2804 +19155 +18053 +16216 +4912 +17608 +12940 +9707 +16399 +9962 +1229 +2002 +9092 +4211 +14353 +15441 +18468 +9370 +16688 +987 +9588 +8286 +7260 +40 +2980 +12044 +3622 +16853 +6776 +1292 +11037 +14858 +11338 +3271 +6792 +5869 +17176 +4935 +9850 +3133 +530 +5284 +11481 +15789 +14037 +1792 +10600 +16448 +16402 +7271 +10259 +18759 +8559 +16204 +16052 +3246 +12904 +15531 +10970 +4450 +483 +12566 +15607 +588 +15992 +5443 +1447 +12752 +2411 +166 +19825 +16716 +6513 +18826 +12041 +10452 +16902 +829 +4188 +4493 +3208 +17099 +18648 +13847 +8111 +18607 +13743 +18881 +3827 +6130 +4139 +4965 +6177 +10051 +12253 +13041 +9234 +18908 +8614 +1776 +14967 +18358 +3366 +11589 +413 +18726 +18555 +17591 +2060 +8879 +3791 +18548 +2665 +7895 +15282 +19893 +2338 +14473 +11013 +207 +13584 +19911 +18401 +16144 +13453 +5700 +10181 +13519 +4557 +16640 +10933 +8755 +6884 +10786 +8921 +8348 +8360 +3935 +7072 +11688 +18657 +16435 +16612 +9620 +15485 +12302 +1287 +4750 +17816 +6462 +19313 +13429 +10803 +19658 +1811 +2333 +2788 +12509 +2391 +13374 +756 +10119 +526 +11502 +4846 +16478 +6897 +18228 +14718 +9334 +1484 +16094 +14722 +17019 +15695 +18441 +11231 +12369 +6240 +9002 +3631 +615 +7153 +4790 +10958 +17839 +10995 +9926 +6795 +12125 +1982 +4400 +9387 +1529 +5381 +18595 +17504 +2169 +4636 +2246 +18988 +17023 +11444 +16361 +13146 +17374 +14877 +18345 +300 +18462 +12824 +564 +134 +17523 +1134 +2452 +1038 +18878 +5092 +18926 +451 +11879 +15764 +13985 +5625 +8596 +12546 +12755 +10421 +3777 +10152 +11441 +19910 +12031 +16841 +7655 +10693 +5392 +18506 +12563 +18995 +15619 +11364 +14263 +13044 +12997 +13346 +13160 +11672 +17259 +2736 +319 +9151 +10928 +1832 +7854 +15517 +3459 +2878 +17775 +19969 +6304 +18289 +37 +7244 +13589 +3371 +8941 +13784 +7754 +5591 +89 +18899 +16011 +1249 +7622 +8592 +16098 +7570 +12850 +7579 +13637 +6854 +11655 +14479 +3180 +18981 +19456 +4523 +10036 +504 +8811 +12882 +14072 +4101 +602 +1818 +8398 +2965 +4771 +14349 +619 +3381 +9045 +17723 +11003 +551 +11987 +6641 +10576 +5382 +4609 +2232 +7400 +14606 +17782 +1882 +11952 +12883 +1013 +1045 +2239 +4588 +12565 +9769 +15195 +15723 +19314 +14132 +8295 +942 +5104 +16908 +10156 +4667 +13361 +13593 +17199 +17751 +15670 +16848 +4233 +7844 +13082 +18753 +16815 +5325 +9544 +18949 +15867 +18450 +1523 +13507 +3925 +9375 +8022 +16922 +19002 +18483 +6997 +9114 +869 +6463 +18983 +1099 +7611 +15944 +19025 +11257 +19088 +16057 +4747 +3210 +12362 +8623 +553 +7619 +8730 +13142 +12287 +17628 +5674 +2143 +2667 +19194 +14067 +14994 +5916 +6983 +11142 +18968 +9128 +234 +16008 +13918 +14901 +8770 +7161 +7706 +8783 +4742 +7058 +16184 +14926 +1098 +2953 +13416 +9591 +13168 +6290 +2187 +13489 +12669 +3316 +1603 +14778 +11423 +17530 +11102 +13092 +10690 +11992 +15793 +7483 +3486 +14589 +17624 +3801 +13150 +6451 +9171 +17302 +4744 +12516 +7190 +17853 +17486 +15132 +575 +16293 +10909 +19815 +7396 +16384 +18258 +4260 +9017 +1057 +418 +15588 +18699 +7408 +1669 +9855 +17928 +4332 +19007 +7179 +7097 +10636 +8254 +15571 +17880 +17858 +2467 +4824 +8630 +5507 +7748 +13207 +7708 +9601 +13215 +9756 +16026 +7734 +12007 +3985 +3975 +24 +8499 +19781 +16997 +19931 +7498 +18003 +898 +3774 +5267 +19904 +1141 +3236 +3997 +340 +8277 +10219 +19621 +9143 +17010 +11669 +12691 +8169 +9079 +14583 +14459 +12061 +11205 +14789 +3757 +4913 +4123 +1307 +687 +8143 +5783 +6087 +3116 +6893 +18700 +1126 +18939 +14849 +19168 +13694 +3354 +4732 +7220 +9715 +2729 +9476 +7883 +3283 +18448 +7298 +19525 +6913 +10908 +17048 +9894 +3151 +1736 +12383 +4842 +18693 +11914 +7090 +7865 +5521 +4669 +12482 +19952 +8529 +15462 +2518 +327 +10523 +1055 +13857 +19428 +11179 +2896 +15066 +11934 +935 +4289 +11899 +568 +1028 +3057 +1623 +12628 +9328 +9278 +19555 +8131 +10592 +16847 +11519 +4304 +18582 +5299 +2381 +2830 +3465 +14862 +2112 +3199 +15457 +9221 +15445 +6534 +10946 +1244 +4061 +14787 +19829 +10695 +19455 +5951 +3522 +14155 +18282 +4454 +13337 +16782 +9130 +8003 +1143 +6838 +6755 +16851 +6626 +15090 +5895 +18185 +9123 +19638 +11475 +1588 +5718 +8144 +12244 +7806 +9909 +13328 +12618 +16186 +14803 +3571 +1175 +6242 +13141 +4981 +16953 +15739 +15888 +15825 +8584 +12073 +12181 +6668 +13546 +17247 +7490 +5641 +18695 +17270 +19130 +15593 +9991 +8480 +19426 +17306 +3868 +2172 +4648 +16842 +7443 +12297 +16167 +16153 +8206 +17653 +16223 +18306 +8011 +13258 +8749 +11413 +17355 +18821 +2392 +7736 +1065 +3762 +11127 +13274 +14848 +7261 +11626 +14264 +10701 +9139 +6803 +7406 +16136 +15216 +18770 +8147 +10579 +5432 +1354 +10479 +8928 +13710 +2474 +11118 +13383 +15609 +5990 +19489 +15815 +8567 +16068 +2522 +3666 +11847 +16138 +7991 +12520 +15287 +18644 +4712 +9022 +14031 +1952 +10045 +2917 +13650 +2881 +19104 +3556 +5163 +6530 +16196 +3566 +9300 +5245 +2996 +18038 +2647 +3943 +13251 +13680 +17217 +1077 +6341 +15865 +1918 +437 +4834 +2572 +7862 +5711 +8408 +8924 +3418 +19594 +13314 +16731 +18513 +3075 +19643 +11476 +18781 +11249 +16940 +13425 +8467 +10608 +5912 +4692 +6496 +17159 +18817 +9774 +17707 +10887 +2646 +3101 +15565 +13814 +7910 +10234 +7672 +18593 +16125 +3872 +4688 +13502 +15285 +10258 +15956 +16674 +17513 +16734 +18127 +283 +16584 +3550 +2235 +19977 +4930 +2725 +2122 +13871 +5420 +13472 +5896 +17210 +9381 +2334 +15279 +7181 +3162 +10175 +2835 +6150 +13023 +1663 +5737 +5310 +2815 +7940 +12773 +16395 +11629 +15496 +2439 +17094 +5132 +3999 +17160 +10801 +3114 +4724 +1838 +4275 +19750 +10670 +7456 +12380 +15744 +14920 +4978 +5790 +9529 +8616 +12128 +4683 +6244 +1403 +3531 +360 +13158 +11178 +1997 +14972 +3992 +1034 +10672 +5935 +5578 +19888 +6243 +6653 +2371 +9222 +18521 +2413 +16275 +785 +3406 +16603 +9376 +4375 +12899 +17609 +8678 +13468 +16027 +14774 +14184 +3171 +2946 +15157 +6421 +18315 +18057 +13759 +14435 +17583 +11371 +4966 +15100 +1712 +8162 +13435 +7357 +11300 +17969 +16426 +13370 +6748 +10065 +6604 +5001 +9209 +3874 +14068 +5079 +14734 +434 +6630 +6747 +1394 +1085 +4425 +3478 +2053 +1367 +1025 +1560 +7981 +7309 +993 +15315 +9454 +7358 +11342 +7099 +7703 +12000 +4024 +14266 +9311 +2993 +15389 +19584 +18740 +8699 +11727 +6541 +11947 +3186 +7348 +13898 +693 +3189 +3074 +2425 +18658 +3065 +2567 +12010 +16450 +13757 +13022 +14769 +14444 +15466 +17832 +8016 +7075 +9185 +4847 +16771 +10268 +9578 +6919 +19624 +13031 +13380 +5124 +13554 +15078 +19046 +470 +3930 +655 +4019 +8440 +19527 +194 +9411 +9840 +7478 +6682 +4887 +4617 +17055 +759 +16034 +14466 +684 +16571 +2455 +16807 +6394 +5985 +15965 +10079 +2847 +13081 +7466 +15162 +17571 +13721 +6698 +11339 +14030 +14447 +10426 +13351 +8454 +18388 +4572 +13310 +13512 +6676 +2730 +18079 +15177 +895 +14003 +16172 +3572 +14307 +7807 +8842 +3323 +6491 +8751 +18445 +7376 +1592 +7774 +18987 +9532 +12636 +8777 +7540 +4054 +17548 +16481 +19598 +19357 +6078 +9000 +11767 +190 +2819 +17894 +3474 +4462 +13444 +8448 +15973 +10837 +13252 +12071 +15238 +5285 +7605 +7234 +7421 +8906 +11564 +1479 +14953 +19400 +5465 +15855 +2019 +16192 +10889 +8776 +15519 +6817 +345 +16653 +13688 +2403 +14018 +16537 +19797 +19997 +4634 +14400 +8655 +9483 +18683 +13841 +9504 +16741 +5014 +2577 +4225 +9013 +14064 +16518 +10623 +387 +17050 +6189 +999 +12600 +13726 +5888 +6007 +11479 +16718 +12795 +19897 +16182 +18458 +13772 +7673 +19890 +7047 +5618 +5959 +7185 +15330 +2138 +8591 +2605 +7691 +18431 +9186 +17634 +15342 +11687 +919 +8615 +10055 +2690 +11161 +2548 +10916 +8538 +5012 +1559 +5083 +8487 +2702 +18625 +9752 +6730 +11701 +10378 +7582 +5144 +16250 +17020 +18819 +17867 +2077 +10760 +6501 +16111 +5174 +1236 +8417 +15243 +15428 +4185 +17971 +11150 +2270 +4076 +10418 +9616 +14304 +9739 +14354 +11173 +9077 +2553 +17544 +16796 +7414 +5750 +16219 +11777 +3621 +12054 +6991 +4516 +3866 +13047 +17679 +2416 +13399 +337 +14655 +18382 +16054 +18064 +17422 +17215 +17498 +1750 +7126 +3127 +18565 +6762 +18960 +10966 +6662 +6082 +3070 +15563 +12371 +7905 +4700 +11434 +3014 +18514 +12815 +17114 +14966 +3384 +2723 +12173 +291 +1462 +3643 +17993 +1139 +7562 +8067 +8759 +8205 +14015 +3287 +1738 +10139 +1963 +15196 +7513 +5494 +15932 +17383 +6751 +7542 +5886 +15038 +3784 +2253 +7851 +2779 +12151 +7157 +19881 +11373 +17650 +174 +4010 +5259 +18803 +11562 +7188 +11876 +17734 +6949 +10287 +14157 +18143 +8517 +1622 +16646 +6088 +12780 +5103 +3603 +13777 +11604 +16943 +2542 +4967 +1369 +6433 +11825 +12008 +6494 +7531 +15518 +11926 +1104 +18507 +2332 +2257 +4511 +1230 +7978 +958 +10757 +4564 +15232 +5841 +6680 +10704 +17564 +15669 +5712 +2926 +3964 +3324 +15679 +15296 +5331 +3663 +1717 +17708 +5943 +11395 +16378 +5660 +4341 +1166 +17091 +1582 +6016 +216 +18784 +4639 +17240 +18603 +3597 +6350 +17348 +12607 +10364 +3058 +10709 +7744 +2871 +6905 +4195 +17230 +6343 +10021 +16126 +15597 +17983 +5405 +16319 +885 +15877 +14568 +3527 +7602 +13623 +1531 +14019 +12641 +157 +4128 +2733 +12364 +18822 +1283 +15255 +8284 +11428 +4062 +15606 +7132 +16755 +2863 +16252 +17191 +10100 +10459 +13758 +13200 +3710 +7159 +13800 +15040 +5271 +6711 +13654 +9837 +5173 +19220 +10368 +11398 +6330 +4006 +12476 +6586 +5797 +4242 +15703 +1665 +8427 +14178 +5244 +1968 +5818 +12107 +15505 +13285 +11529 +8822 +6603 +16260 +19339 +7627 +5654 +14824 +4389 +17580 +12135 +3680 +889 +10104 +15702 +13504 +1214 +7198 +19579 +15374 +12365 +12999 +11772 +14776 +9617 +6293 +9577 +13967 +18943 +16729 +7577 +14436 +19298 +6622 +10665 +8431 +19395 +19984 +10662 +14632 +16580 +16368 +12239 +6318 +13228 +8861 +7813 +6366 +1645 +13066 +2491 +11844 +15839 +12306 +14755 +19548 +18460 +2393 +5422 +364 +17185 +7575 +16636 +4921 +11833 +3376 +3818 +3752 +5026 +14107 +18861 +19157 +9505 +271 +17577 +2479 +9984 +2376 +15784 +14631 +6083 +957 +3039 +15020 +18999 +1508 +6772 +10931 +17855 +6992 +19287 +12666 +14170 +1740 +12923 +6858 +2309 +9440 +18070 +2886 +10054 +15402 +4626 +4196 +9897 +5702 +13410 +8233 +12649 +590 +19261 +238 +1938 +12592 +12402 +11487 +1732 +3452 +1752 +6939 +9524 +16769 +9060 +1911 +5708 +2742 +697 +13692 +17972 +10130 +12765 +6963 +1276 +7169 +9722 +3860 +9525 +6254 +5355 +8312 +12798 +8280 +1371 +18400 +15762 +1407 +4048 +9087 +15999 +2369 +6100 +7596 +1131 +19386 +3638 +1032 +12675 +18835 +812 +6274 +17032 +386 +2167 +3678 +10792 +13541 +10961 +7152 +18589 +11442 +7770 +2065 +9704 +5282 +6167 +16058 +5089 +18413 +6249 +8785 +1896 +171 +5035 +12241 +1190 +17145 +7144 +17135 +8142 +9241 +4830 +18909 +2636 +14302 +8987 +18964 +17752 +12531 +19686 +16553 +8709 +14063 +12538 +7511 +10082 +2968 +1893 +12781 +13845 +2048 +10552 +6937 +9259 +15372 +4901 +10380 +240 +19041 +17426 +9757 +244 +13914 +2372 +3036 +6899 +4460 +14836 +11513 +98 +2310 +12522 +7953 +531 +19399 +19557 +6452 +18372 +2159 +15351 +4288 +2639 +8950 +7120 +3454 +14580 +19091 +13984 +8855 +8837 +5926 +13956 +9366 +15757 +12812 +10755 +14921 +5929 +14512 +15133 +7920 +6593 +5687 +8889 +15860 +2928 +19630 +6427 +4721 +16681 +11324 +19844 +17817 +10370 +1708 +16101 +347 +10038 +8229 +315 +16837 +17819 +15710 +15957 +1594 +4849 +988 +14540 +14061 +466 +10409 +1590 +13376 +14016 +5551 +2128 +7123 +5960 +2971 +2894 +2673 +113 +18841 +19657 +943 +17769 +10736 +12748 +3823 +10505 +1441 +6012 +5093 +5732 +8689 +4642 +7535 +11738 +12190 +2754 +15430 +390 +6266 +12967 +3068 +18040 +14457 +19114 +17612 +1231 +14044 +17221 +6801 +6131 +763 +9072 +2323 +18702 +11260 +16132 +4616 +3505 +14452 +10756 +191 +8073 +479 +13987 +14278 +10273 +9516 +13779 +11450 +10853 +6560 +10506 +19086 +18039 +9299 +11353 +5320 +16870 +14867 +167 +4794 +17329 +14958 +10076 +17110 +6788 +18190 +16720 +8224 +795 +4646 +6493 +1161 +5263 +10666 +748 +10573 +9966 +6233 +17645 +6417 +16039 +10192 +17280 +6430 +18198 +8044 +4755 +7504 +2203 +6848 +16849 +7324 +7591 +5536 +2021 +18495 +17862 +3744 +11217 +7378 +9632 +10720 +11790 +7906 +8422 +16003 +9140 +11526 +7747 +1148 +17188 +15170 +14893 +2288 +1242 +1044 +15730 +2828 +17845 +15822 +8368 +18914 +3357 +16524 +3520 +7310 +8211 +9024 +6767 +9319 +7926 +7467 +8259 +2377 +2483 +15244 +4914 +17406 +8216 +17683 +19085 +1387 +6646 +14486 +10510 +18046 +11070 +13360 +16754 +15081 +9737 +3911 +4777 +10278 +15289 +14511 +17201 +7858 +18664 +12469 +18097 +6663 +10134 +3399 +3912 +10869 +3442 +17538 +17850 +17631 +2782 +326 +16022 +18134 +9553 +16702 +7882 +7788 +7816 +1877 +1951 +1047 +5321 +11269 +1555 +11555 +10739 +8981 +16342 +13822 +979 +17702 +9247 +921 +18937 +16591 +1535 +13921 +4600 +12206 +12042 +19793 +10602 +19418 +7187 +9416 +4614 +16415 +14096 +13803 +226 +16737 +19230 +13198 +18116 +10277 +14249 +17439 +19986 +13236 +17136 +12900 +5341 +7985 +2679 +5627 +9312 +10199 +16861 +2942 +1852 +10466 +7838 +11922 +8420 +15176 +2986 +17555 +5978 +7507 +4112 +1992 +1988 +6446 +10154 +6176 +16089 +9104 +11211 +18823 +18351 +8555 +11458 +10327 +15240 +3768 +1397 +16753 +1435 +19820 +2920 +17298 +14659 +9014 +16372 +7697 +17405 +11495 +14499 +7238 +2422 +3904 +13281 +17674 +10891 +2231 +16960 +7274 +12581 +14323 +16416 +15765 +724 +17605 +2601 +16006 +4423 +17675 +16772 +15137 +12001 +12449 +14088 +2348 +19239 +19610 +12057 +18615 +11643 +5915 +19006 +9876 +17123 +18082 +17785 +4026 +17663 +17042 +17964 +11624 +5976 +15444 +10059 +15667 +15786 +12511 +11528 +7769 +17282 +12557 +10398 +18996 +2584 +6022 +16775 +14244 +5590 +7363 +875 +6815 +15076 +14959 +557 +2437 +9090 +2020 +19675 +405 +18129 +12453 +18373 +8859 +16864 +17115 +14085 +17182 +11106 +12069 +12909 +7080 +11712 +16142 +217 +7297 +11393 +18678 +14908 +8633 +8695 +10844 +6283 +527 +17049 +8815 +18650 +18884 +13586 +15995 +19789 +4881 +7954 +19487 +12038 +2817 +19863 +9280 +8054 +19464 +13003 +3267 +8071 +16069 +10342 +6306 +11396 +6477 +8864 +5704 +2710 +12199 +19054 +8150 +18916 +598 +1798 +10862 +3564 +2493 +11425 +19355 +43 +2000 +6381 +7100 +11343 +863 +13642 +17638 +268 +13767 +4498 +5229 +3469 +11367 +14847 +4946 +11731 +13604 +11640 +402 +15347 +19050 +10879 +2674 +13005 +15778 +10391 +11884 +3160 +7852 +14628 +18986 +1357 +10049 +15644 +12059 +17044 +10057 +11641 +5467 +19892 +11377 +9988 +4316 +12799 +18538 +1474 +13114 +14950 +5039 +16025 +9250 +10657 +7118 +4222 +19918 +14667 +15052 +16492 +5938 +900 +7900 +7710 +5822 +18875 +8196 +18882 +2880 +1152 +12659 +5037 +10089 +10221 +4065 +13978 +926 +16585 +18992 +12586 +2191 +9141 +528 +19659 +7864 +12705 +19187 +17454 +5459 +794 +2685 +3822 +14642 +12897 +12235 +18761 +7972 +18561 +15638 +3558 +3281 +11239 +12014 +81 +14644 +6095 +7307 +19241 +11026 +19273 +4402 +9027 +17908 +13087 +9145 +5881 +13560 +12142 +15568 +7465 +5444 +16213 +19698 +2972 +6944 +17487 +19328 +2036 +9863 +13626 +18917 +11146 +9070 +19393 +7971 +11890 +5695 +635 +10250 +295 +15996 +17229 +9818 +17134 +15200 +3936 +1634 +12688 +3340 +7352 +18614 +16175 +12743 +12930 +17127 +15322 +11875 +7639 +13703 +17626 +17535 +19031 +6930 +14697 +1825 +16979 +3705 +18768 +8208 +16300 +4000 +11325 +16131 +15139 +12729 +13528 +332 +18635 +16676 +10965 +15507 +7223 +639 +13513 +856 +8973 +9929 +9743 +19521 +19061 +11018 +3185 +11891 +16895 +2198 +19403 +3970 +10820 +9093 +4773 +15782 +10687 +12854 +5884 +11595 +15030 +2711 +5526 +12793 +6369 +6740 +14772 +18938 +3802 +19193 +6108 +4678 +907 +3461 +16201 +5374 +11025 +539 +11369 +2622 +12082 +11433 +9720 +11321 +12455 +2353 +3790 +6902 +449 +7641 +5161 +19164 +14956 +8586 +2591 +16662 +19906 +2380 +12652 +9882 +14462 +779 +8482 +2800 +16037 +15024 +11349 +12814 +9198 +4722 +2446 +1556 +12784 +8673 +16469 +415 +7447 +11195 +10674 +1046 +12767 +18816 +14060 +6056 +4578 +10502 +12510 +2802 +10838 +3637 +1690 +3156 +8481 +1662 +7583 +6152 +1862 +9289 +7438 +7598 +5326 +13903 +16604 +17475 +9371 +3069 +4759 +19035 +16499 +11168 +2194 +10852 +8599 +8552 +4281 +18637 +18012 +375 +15003 +5165 +5574 +16872 +12433 +10637 +5673 +653 +10539 +10521 +8807 +12451 +19728 +10072 +5563 +13953 +8904 +15337 +16685 +19478 +7023 +9759 +616 +15171 +2579 +2117 +10525 +3776 +8050 +12265 +2659 +10955 +4871 +8826 +5215 +8556 +7636 +5354 +9040 +16536 +2478 +4610 +7428 +1310 +14804 +15627 +5729 +13802 +4533 +7916 +17655 +9218 +9878 +8901 +14109 +15473 +18424 +14516 +17854 +922 +9809 +777 +15617 +1328 +6959 +16227 +11101 +16684 +1801 +5166 +3937 +8975 +19858 +5359 +4985 +11760 +5918 +16780 +10560 +15954 +7804 +3155 +6148 +12639 +6777 +120 +15463 +11542 +3639 +1391 +19390 +8181 +7014 +10253 +3250 +15768 +1224 +3635 +17809 +1016 +18230 +8803 +11834 +14932 +9345 +8653 +9225 +17041 +213 +1541 +13991 +16261 +12413 +19838 +8918 +809 +13016 +5260 +5055 +10934 +10983 +19317 +3855 +18375 +13094 +17275 +3345 +582 +8155 +15791 +2259 +9749 +3612 +13735 +1619 +18673 +10429 +7055 +3676 +3787 +11307 +8421 +1385 +5837 +11412 +8363 +9380 +5042 +8496 +10106 +6121 +4167 +18201 +13748 +12307 +109 +6346 +13306 +10480 +12215 +17004 +14747 +13535 +16264 +1172 +14846 +5114 +19359 +11684 +10032 +8835 +12411 +4147 +19345 +2363 +10354 +9495 +9197 +15041 +1943 +19543 +13605 +2240 +7746 +4005 +15943 +2549 +1421 +13992 +15064 +12013 +5570 +18797 +16442 +13196 +6916 +9235 +137 +7200 +5527 +6624 +16927 +13187 +17080 +12312 +5464 +8951 +6445 +9958 +12928 +1917 +14677 +13004 +2429 +4643 +15183 +12254 +19921 +6191 +11831 +13834 +16233 +19879 +4656 +14240 +5820 +13572 +5939 +13868 +4798 +9814 +10744 +4417 +15897 +11917 +12437 +3197 +14604 +646 +17778 +6926 +7007 +18540 +4762 +11729 +6453 +16615 +15672 +8745 +8164 +1053 +10646 +18766 +7477 +14917 +19578 +4236 +6537 +10230 +18156 +10047 +16229 +497 +18798 +9853 +2838 +1259 +8518 +9677 +10997 +18749 +19570 +13151 +13964 +9652 +14081 +2596 +8611 +10570 +10854 +5200 +2944 +951 +12686 +16778 +2324 +17719 +8357 +489 +18662 +18101 +9890 +8036 +1729 +443 +1289 +3196 +12816 +12016 +559 +13561 +5773 +2018 +12529 +19632 +2992 +7877 +8451 +2213 +10654 +1527 +11087 +18384 +9763 +6650 +11809 +1609 +4467 +10204 +1488 +15738 +14701 +15455 +2079 +3456 +11029 +15574 +7377 +9987 +2948 +5175 +14345 +7366 +5213 +7608 +19866 +10247 +3374 +11014 +5775 +8122 +2564 +11404 +10184 +12264 +7048 +18945 +19704 +8325 +18305 +13815 +10132 +6797 +10936 +1702 +10350 +3315 +1039 +19438 +7141 +499 +4415 +17139 +12106 +15573 +13098 +9349 +2740 +6011 +17074 +14704 +13188 +12325 +5268 +128 +3117 +17471 +7712 +19416 +6805 +5840 +18755 +1747 +12198 +2297 +6940 +7928 +3557 +16605 +9100 +3284 +929 +2991 +5171 +9105 +6612 +8201 +17441 +10795 +7211 +9938 +4213 +9610 +15608 +6395 +14637 +18330 +11331 +13876 +9594 +2243 +13102 +12866 +13537 +8418 +15277 +16949 +11213 +19616 +8513 +15023 +14446 +6948 +8498 +10269 +9670 +14458 +6901 +11357 +19957 +10534 +16712 +18348 +1383 +5275 +16251 +333 +2412 +14927 +7276 +1858 +4349 +3275 +648 +5278 +9666 +6384 +7228 +17464 +4764 +16289 +2921 +19010 +7815 +3736 +11913 +19719 +16259 +8890 +18025 +1886 +18121 +4821 +7384 +5276 +11473 +6379 +12858 +13407 +2561 +19861 +7675 +15363 +16265 +10215 +15396 +17059 +14382 +9101 +13831 +17112 +1118 +19648 +12896 +15509 +1621 +18998 +17789 +14808 +2200 +17934 +9253 +16813 +8397 +9695 +17162 +12788 +15149 +4886 +9657 +17540 +5440 +6871 +446 +7966 +3719 +18020 +8594 +19427 +4106 +1655 +11974 +17266 +18550 +5482 +4944 +17868 +8149 +13808 +1459 +677 +4943 +3369 +13600 +12436 +4788 +16414 +13820 +12613 +17079 +9685 +1791 +19696 +11232 +8813 +6279 +13149 +4003 +1331 +4751 +13718 +17326 +10718 +4988 +8720 +13244 +12894 +4469 +19523 +4164 +574 +3262 +3121 +15197 +12488 +14422 +3394 +15618 +12647 +5404 +8148 +18660 +6270 +6769 +12942 +16017 +4344 +14650 +2435 +4241 +18303 +9680 +15286 +13701 +16994 +11131 +7553 +2568 +9968 +6309 +11711 +8818 +14293 +13980 +1157 +6691 +17351 +801 +17557 +1268 +10067 +18697 +15903 +11645 +7544 +7831 +10738 +18610 +19076 +10609 +7455 +12919 +412 +4731 +15175 +9352 +4903 +3856 +12088 +7429 +16924 +5427 +15464 +10176 +11120 +19541 +1626 +17762 +17228 +3076 +17289 +7974 +15069 +17047 +11409 +7799 +2707 +7794 +15153 +16613 +3139 +14179 +12875 +17143 +9761 +12067 +6544 +4249 +6828 +11108 +17891 +13329 +6349 +1526 +14859 +3882 +14876 +13375 +1311 +512 +19351 +1517 +10942 +19710 +12323 +3382 +16148 +9603 +15167 +7444 +1961 +17744 +18475 +6961 +11835 +12011 +13212 +19177 +15521 +16905 +8607 +13854 +905 +4023 +19920 +1113 +665 +888 +16595 +10604 +10613 +6549 +4809 +12713 +6988 +7495 +4539 +1238 +9551 +14471 +13112 +18767 +17729 +10282 +14074 +9360 +12943 +116 +10781 +18042 +8436 +14543 +5234 +5963 +14405 +19971 +1195 +1694 +19717 +16271 +9803 +2931 +3670 +5140 +12918 +9154 +15316 +4203 +5170 +13130 +12889 +18632 +12169 +5109 +4927 +13882 +1892 +9167 +5772 +11017 +7604 +8626 +254 +17357 +519 +11928 +610 +19953 +8246 +1815 +18859 +19000 +11059 +13451 +12572 +7127 +5540 +2675 +12233 +11916 +19785 +5499 +18869 +13170 +14185 +7098 +17890 +7125 +3362 +4796 +12872 +13299 +18437 +1515 +16028 +924 +15969 +13406 +6335 +19083 +19680 +8405 +6974 +14150 +18472 +175 +17704 +6026 +10359 +125 +9949 +323 +16066 +8426 +9705 +17840 +11618 +16405 +17831 +5495 +7925 +5446 +13136 +16856 +501 +5798 +5046 +18804 +2436 +15071 +1789 +3595 +9365 +573 +14080 +6014 +1401 +10190 +7089 +1300 +15946 +5040 +3788 +7285 +10547 +8250 +13270 +19474 +5254 +18304 +3166 +8157 +14246 +1905 +18877 +1826 +14292 +2116 +14290 +14303 +19315 +3500 +1440 +17336 +4125 +5832 +13656 +7446 +1578 +18255 +13466 +2394 +10357 +10322 +16599 +484 +14238 +16871 +576 +19975 +13303 +3587 +11715 +3858 +19108 +13193 +6484 +16913 +13746 +3689 +7785 +11274 +3226 +867 +3521 +9875 +7548 +11683 +2938 +2808 +10639 +5637 +12182 +14113 +8393 +19388 +14595 +2186 +13448 +16746 +4338 +14350 +6545 +15318 +11072 +12553 +189 +5154 +19178 +14990 +7640 +16551 +114 +1718 +17988 +16207 +18663 +8784 +19889 +15104 +14822 +10831 +1235 +3859 +6637 +8056 +15442 +3255 +12219 +1651 +13557 +2588 +674 +4427 +1533 +790 +4406 +19996 +6344 +6631 +2247 +5894 +5984 +9042 +18361 +16707 +1207 +10035 +2604 +9086 +9038 +2093 +9184 +12278 +14256 +475 +18083 +376 +16078 +17109 +16982 +6483 +14280 +18418 +18093 +16337 +12183 +11093 +11437 +16118 +14962 +13543 +11745 +4113 +5099 +13806 +19115 +15015 +16645 +10805 +16214 +19047 +12324 +16211 +18511 +16564 +14116 +7889 +1392 +16836 +764 +5843 +6642 +10019 +652 +9520 +12063 +12796 +5614 +3854 +13715 +1967 +6234 +19116 +17506 +5372 +1757 +9779 +1602 +17388 +1426 +10242 +15945 +15458 +16226 +3591 +1600 +8249 +19284 +11497 +19087 +19865 +1171 +13498 +9789 +11682 +10949 +1897 +16649 +6389 +17446 +4783 +6917 +7019 +16224 +11046 +6236 +15851 +1965 +6323 +15120 +13774 +1913 +668 +6193 +11617 +18867 +1839 +1507 +19433 +18326 +5922 +15468 +14764 +19434 +15915 +17531 +2201 +9970 +8108 +6647 +3871 +15044 +198 +13071 +13836 +2234 +3248 +7027 +18630 +6894 +8504 +14268 +13542 +12579 +4510 +14641 +11348 +10437 +411 +9682 +13850 +12554 +2215 +4432 +19754 +6577 +6692 +5885 +13896 +13530 +8995 +8984 +6713 +1638 +13610 +12847 +8177 +17639 +5061 +7959 +16560 +5002 +5882 +10017 +7224 +2383 +395 +10415 +14874 +10808 +19361 +1853 +5595 +2833 +2630 +4200 +9069 +953 +1704 +2651 +5490 +15447 +6469 +18785 +15647 +8618 +18836 +8001 +6054 +12794 +8130 +11472 +14941 +12022 +5015 +14748 +19796 +10336 +16788 +9751 +8247 +16711 +5665 +480 +9231 +19950 +9124 +5067 +12568 +8320 +16221 +12513 +4007 +11214 +7084 +18858 +15861 +5809 +3408 +12988 +18103 +2228 +2414 +11002 +11463 +487 +2084 +873 +1499 +6827 +8902 +19125 +1699 +6154 +29 +14125 +9699 +16418 +3683 +6248 +7809 +2144 +9001 +8404 +8930 +6509 +10207 +2609 +14163 +15598 +5857 +731 +6295 +16312 +13307 +8062 +18874 +6720 +14190 +9457 +18814 +18570 +4360 +18309 +6782 +9548 +14992 +17017 +16082 +2331 +6703 +13941 +16808 +6596 +18048 +12268 +2472 +11044 +19068 +18961 +3910 +14000 +9847 +2769 +4774 +15335 +2071 +7173 +13524 +16700 +1006 +4290 +9556 diff --git a/tests/fixtures/sort/ext_stable.expected b/tests/fixtures/sort/ext_stable.expected new file mode 100644 index 000000000..11ca4deb7 --- /dev/null +++ b/tests/fixtures/sort/ext_stable.expected @@ -0,0 +1,4 @@ +0a +0a +0b +0b diff --git a/tests/fixtures/sort/ext_stable.txt b/tests/fixtures/sort/ext_stable.txt new file mode 100644 index 000000000..11ca4deb7 --- /dev/null +++ b/tests/fixtures/sort/ext_stable.txt @@ -0,0 +1,4 @@ +0a +0a +0b +0b diff --git a/tests/fixtures/sort/human-numeric-whitespace.expected b/tests/fixtures/sort/human-numeric-whitespace.expected new file mode 100644 index 000000000..6fb9291ff --- /dev/null +++ b/tests/fixtures/sort/human-numeric-whitespace.expected @@ -0,0 +1,11 @@ + + + + + + + +456K +4568K + 456M + 6.2G diff --git a/tests/fixtures/sort/human-numeric-whitespace.expected.debug b/tests/fixtures/sort/human-numeric-whitespace.expected.debug new file mode 100644 index 000000000..66afcda66 --- /dev/null +++ b/tests/fixtures/sort/human-numeric-whitespace.expected.debug @@ -0,0 +1,33 @@ + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key +456K +____ +____ +4568K +_____ +_____ +>>>456M + ____ +_______ + 6.2G + ____ +__________________ diff --git a/tests/fixtures/sort/human-numeric-whitespace.txt b/tests/fixtures/sort/human-numeric-whitespace.txt new file mode 100644 index 000000000..19db648b1 --- /dev/null +++ b/tests/fixtures/sort/human-numeric-whitespace.txt @@ -0,0 +1,11 @@ + + +456K + + 456M + + +4568K + + 6.2G + diff --git a/tests/fixtures/sort/human_block_sizes.expected.debug b/tests/fixtures/sort/human_block_sizes.expected.debug new file mode 100644 index 000000000..5f4860a85 --- /dev/null +++ b/tests/fixtures/sort/human_block_sizes.expected.debug @@ -0,0 +1,33 @@ +844K +____ +____ +981K +____ +____ +11M +___ +___ +13M +___ +___ +14M +___ +___ +16M +___ +___ +18M +___ +___ +19M +___ +___ +20M +___ +___ +981T +____ +____ +20P +___ +___ diff --git a/tests/fixtures/sort/ignore_case.expected.debug b/tests/fixtures/sort/ignore_case.expected.debug new file mode 100644 index 000000000..08f0abb8d --- /dev/null +++ b/tests/fixtures/sort/ignore_case.expected.debug @@ -0,0 +1,21 @@ +aaa +___ +___ +BBB +___ +___ +ccc +___ +___ +DDD +___ +___ +eee +___ +___ +FFF +___ +___ +ggg +___ +___ diff --git a/tests/fixtures/sort/keys_blanks.expected b/tests/fixtures/sort/keys_blanks.expected new file mode 100644 index 000000000..1789659c4 --- /dev/null +++ b/tests/fixtures/sort/keys_blanks.expected @@ -0,0 +1,3 @@ + cab + abc + bca diff --git a/tests/fixtures/sort/keys_blanks.expected.debug b/tests/fixtures/sort/keys_blanks.expected.debug new file mode 100644 index 000000000..bb09ea8a2 --- /dev/null +++ b/tests/fixtures/sort/keys_blanks.expected.debug @@ -0,0 +1,9 @@ +>cab + __ +____ +>abc + __ +____ +>bca + __ +____ diff --git a/tests/fixtures/sort/keys_blanks.txt b/tests/fixtures/sort/keys_blanks.txt new file mode 100644 index 000000000..7c4f313a3 --- /dev/null +++ b/tests/fixtures/sort/keys_blanks.txt @@ -0,0 +1,3 @@ + abc + cab + bca diff --git a/tests/fixtures/sort/keys_closed_range.expected b/tests/fixtures/sort/keys_closed_range.expected new file mode 100644 index 000000000..45005621b --- /dev/null +++ b/tests/fixtures/sort/keys_closed_range.expected @@ -0,0 +1,6 @@ +dd aa ff +gg aa cc +aa bb cc +èè éé èè +👩‍🔬 👩‍🔬 👩‍🔬 +💣💣 💣💣 💣💣 diff --git a/tests/fixtures/sort/keys_closed_range.expected.debug b/tests/fixtures/sort/keys_closed_range.expected.debug new file mode 100644 index 000000000..b78db4af1 --- /dev/null +++ b/tests/fixtures/sort/keys_closed_range.expected.debug @@ -0,0 +1,18 @@ +dd aa ff + _ +________ +gg aa cc + _ +________ +aa bb cc + _ +________ +èè éé èè + _ +________ +👩‍🔬 👩‍🔬 👩‍🔬 + __ +______________ +💣💣 💣💣 💣💣 + __ +______________ diff --git a/tests/fixtures/sort/keys_closed_range.txt b/tests/fixtures/sort/keys_closed_range.txt new file mode 100644 index 000000000..d6bf40785 --- /dev/null +++ b/tests/fixtures/sort/keys_closed_range.txt @@ -0,0 +1,6 @@ +aa bb cc +dd aa ff +gg aa cc +èè éé èè +💣💣 💣💣 💣💣 +👩‍🔬 👩‍🔬 👩‍🔬 \ No newline at end of file diff --git a/tests/fixtures/sort/keys_custom_separator.expected b/tests/fixtures/sort/keys_custom_separator.expected new file mode 100644 index 000000000..2aba42033 --- /dev/null +++ b/tests/fixtures/sort/keys_custom_separator.expected @@ -0,0 +1,3 @@ +ddxaaxff +ggxaaxcc +aaxbbxcc diff --git a/tests/fixtures/sort/keys_custom_separator.expected.debug b/tests/fixtures/sort/keys_custom_separator.expected.debug new file mode 100644 index 000000000..5d4dbc776 --- /dev/null +++ b/tests/fixtures/sort/keys_custom_separator.expected.debug @@ -0,0 +1,9 @@ +ddxaaxff + _ +________ +ggxaaxcc + _ +________ +aaxbbxcc + _ +________ diff --git a/tests/fixtures/sort/keys_custom_separator.txt b/tests/fixtures/sort/keys_custom_separator.txt new file mode 100644 index 000000000..a8f473061 --- /dev/null +++ b/tests/fixtures/sort/keys_custom_separator.txt @@ -0,0 +1,3 @@ +aaxbbxcc +ddxaaxff +ggxaaxcc diff --git a/tests/fixtures/sort/keys_multiple_ranges.expected b/tests/fixtures/sort/keys_multiple_ranges.expected new file mode 100644 index 000000000..09e4e8729 --- /dev/null +++ b/tests/fixtures/sort/keys_multiple_ranges.expected @@ -0,0 +1,6 @@ +gg aa cc +dd aa ff +aa bb cc +èè éé èè +👩‍🔬 👩‍🔬 👩‍🔬 +💣💣 💣💣 💣💣 diff --git a/tests/fixtures/sort/keys_multiple_ranges.expected.debug b/tests/fixtures/sort/keys_multiple_ranges.expected.debug new file mode 100644 index 000000000..830e9afd0 --- /dev/null +++ b/tests/fixtures/sort/keys_multiple_ranges.expected.debug @@ -0,0 +1,24 @@ +gg aa cc + ___ + ___ +________ +dd aa ff + ___ + ___ +________ +aa bb cc + ___ + ___ +________ +èè éé èè + ___ + ___ +________ +👩‍🔬 👩‍🔬 👩‍🔬 + _____ + _____ +______________ +💣💣 💣💣 💣💣 + _____ + _____ +______________ diff --git a/tests/fixtures/sort/keys_multiple_ranges.txt b/tests/fixtures/sort/keys_multiple_ranges.txt new file mode 100644 index 000000000..d6bf40785 --- /dev/null +++ b/tests/fixtures/sort/keys_multiple_ranges.txt @@ -0,0 +1,6 @@ +aa bb cc +dd aa ff +gg aa cc +èè éé èè +💣💣 💣💣 💣💣 +👩‍🔬 👩‍🔬 👩‍🔬 \ No newline at end of file diff --git a/tests/fixtures/sort/keys_negative_size.expected b/tests/fixtures/sort/keys_negative_size.expected new file mode 100644 index 000000000..3774da60e --- /dev/null +++ b/tests/fixtures/sort/keys_negative_size.expected @@ -0,0 +1 @@ +a b c diff --git a/tests/fixtures/sort/keys_negative_size.expected.debug b/tests/fixtures/sort/keys_negative_size.expected.debug new file mode 100644 index 000000000..e392ec7f3 --- /dev/null +++ b/tests/fixtures/sort/keys_negative_size.expected.debug @@ -0,0 +1,3 @@ +a b c + ^ no match for key +_____ diff --git a/tests/fixtures/sort/keys_negative_size.txt b/tests/fixtures/sort/keys_negative_size.txt new file mode 100644 index 000000000..3774da60e --- /dev/null +++ b/tests/fixtures/sort/keys_negative_size.txt @@ -0,0 +1 @@ +a b c diff --git a/tests/fixtures/sort/keys_no_char_match.expected b/tests/fixtures/sort/keys_no_char_match.expected new file mode 100644 index 000000000..dcb361837 --- /dev/null +++ b/tests/fixtures/sort/keys_no_char_match.expected @@ -0,0 +1,3 @@ +c +ba +aaa diff --git a/tests/fixtures/sort/keys_no_char_match.expected.debug b/tests/fixtures/sort/keys_no_char_match.expected.debug new file mode 100644 index 000000000..5287a0de9 --- /dev/null +++ b/tests/fixtures/sort/keys_no_char_match.expected.debug @@ -0,0 +1,9 @@ +c + ^ no match for key +_ +ba + _ +__ +aaa + __ +___ diff --git a/tests/fixtures/sort/keys_no_char_match.txt b/tests/fixtures/sort/keys_no_char_match.txt new file mode 100644 index 000000000..1c952a6b8 --- /dev/null +++ b/tests/fixtures/sort/keys_no_char_match.txt @@ -0,0 +1,3 @@ +aaa +ba +c diff --git a/tests/fixtures/sort/keys_no_field_match.expected b/tests/fixtures/sort/keys_no_field_match.expected new file mode 100644 index 000000000..e2f183e13 --- /dev/null +++ b/tests/fixtures/sort/keys_no_field_match.expected @@ -0,0 +1,6 @@ +aa bb cc +dd aa ff +gg aa cc +èè éé èè +👩‍🔬 👩‍🔬 👩‍🔬 +💣💣 💣💣 💣💣 diff --git a/tests/fixtures/sort/keys_no_field_match.expected.debug b/tests/fixtures/sort/keys_no_field_match.expected.debug new file mode 100644 index 000000000..60197b1de --- /dev/null +++ b/tests/fixtures/sort/keys_no_field_match.expected.debug @@ -0,0 +1,18 @@ +aa bb cc + ^ no match for key +________ +dd aa ff + ^ no match for key +________ +gg aa cc + ^ no match for key +________ +èè éé èè + ^ no match for key +________ +👩‍🔬 👩‍🔬 👩‍🔬 + ^ no match for key +______________ +💣💣 💣💣 💣💣 + ^ no match for key +______________ diff --git a/tests/fixtures/sort/keys_no_field_match.txt b/tests/fixtures/sort/keys_no_field_match.txt new file mode 100644 index 000000000..d6bf40785 --- /dev/null +++ b/tests/fixtures/sort/keys_no_field_match.txt @@ -0,0 +1,6 @@ +aa bb cc +dd aa ff +gg aa cc +èè éé èè +💣💣 💣💣 💣💣 +👩‍🔬 👩‍🔬 👩‍🔬 \ No newline at end of file diff --git a/tests/fixtures/sort/keys_open_ended.expected b/tests/fixtures/sort/keys_open_ended.expected new file mode 100644 index 000000000..09e4e8729 --- /dev/null +++ b/tests/fixtures/sort/keys_open_ended.expected @@ -0,0 +1,6 @@ +gg aa cc +dd aa ff +aa bb cc +èè éé èè +👩‍🔬 👩‍🔬 👩‍🔬 +💣💣 💣💣 💣💣 diff --git a/tests/fixtures/sort/keys_open_ended.expected.debug b/tests/fixtures/sort/keys_open_ended.expected.debug new file mode 100644 index 000000000..d3a56ffd6 --- /dev/null +++ b/tests/fixtures/sort/keys_open_ended.expected.debug @@ -0,0 +1,18 @@ +gg aa cc + ____ +________ +dd aa ff + ____ +________ +aa bb cc + ____ +________ +èè éé èè + ____ +________ +👩‍🔬 👩‍🔬 👩‍🔬 + _______ +______________ +💣💣 💣💣 💣💣 + _______ +______________ diff --git a/tests/fixtures/sort/keys_open_ended.txt b/tests/fixtures/sort/keys_open_ended.txt new file mode 100644 index 000000000..d6bf40785 --- /dev/null +++ b/tests/fixtures/sort/keys_open_ended.txt @@ -0,0 +1,6 @@ +aa bb cc +dd aa ff +gg aa cc +èè éé èè +💣💣 💣💣 💣💣 +👩‍🔬 👩‍🔬 👩‍🔬 \ No newline at end of file diff --git a/tests/fixtures/sort/merge_stable.expected b/tests/fixtures/sort/merge_stable.expected new file mode 100644 index 000000000..49f57888d --- /dev/null +++ b/tests/fixtures/sort/merge_stable.expected @@ -0,0 +1,3 @@ +0a +0c +0b diff --git a/tests/fixtures/sort/merge_stable_1.txt b/tests/fixtures/sort/merge_stable_1.txt new file mode 100644 index 000000000..20528104f --- /dev/null +++ b/tests/fixtures/sort/merge_stable_1.txt @@ -0,0 +1,2 @@ +0a +0c \ No newline at end of file diff --git a/tests/fixtures/sort/merge_stable_2.txt b/tests/fixtures/sort/merge_stable_2.txt new file mode 100644 index 000000000..d3523d976 --- /dev/null +++ b/tests/fixtures/sort/merge_stable_2.txt @@ -0,0 +1 @@ +0b \ No newline at end of file diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric.expected b/tests/fixtures/sort/mixed_floats_ints_chars_numeric.expected index a781a36bb..59541af32 100644 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric.expected +++ b/tests/fixtures/sort/mixed_floats_ints_chars_numeric.expected @@ -21,10 +21,10 @@ CARAvan 8.013 45 46.89 - 4567. - 37800 576,446.88800000 576,446.890 + 4567. + 37800 4798908.340000000000 4798908.45 4798908.8909800 diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric.expected.debug b/tests/fixtures/sort/mixed_floats_ints_chars_numeric.expected.debug new file mode 100644 index 000000000..b7b76e589 --- /dev/null +++ b/tests/fixtures/sort/mixed_floats_ints_chars_numeric.expected.debug @@ -0,0 +1,90 @@ +-2028789030 +___________ +___________ +-896689 +_______ +_______ +-8.90880 +________ +________ +-1 +__ +__ +-.05 +____ +____ + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key +000 +___ +___ +CARAvan +^ no match for key +_______ +00000001 +________ +________ +1 +_ +_ +1.040000000 +___________ +___________ +1.444 +_____ +_____ +1.58590 +_______ +_______ +8.013 +_____ +_____ +45 +__ +__ +46.89 +_____ +_____ +576,446.88800000 +___ +________________ +576,446.890 +___ +___________ + 4567. + _____ +____________________ +>>>>37800 + _____ +_________ +4798908.340000000000 +____________________ +____________________ +4798908.45 +__________ +__________ +4798908.8909800 +_______________ +_______________ diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.expected b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.expected index 63a3e646d..0ccdd84c0 100644 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.expected +++ b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.expected @@ -8,11 +8,14 @@ +-0 CARAvan +-0 000 +-0 1 00000001 1.040000000 @@ -21,10 +24,10 @@ CARAvan 8.013 45 46.89 +576,446.890 +576,446.88800000 4567. 37800 -576,446.88800000 -576,446.890 4798908.340000000000 4798908.45 4798908.8909800 diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.expected.debug b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.expected.debug new file mode 100644 index 000000000..66a98b208 --- /dev/null +++ b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.expected.debug @@ -0,0 +1,66 @@ +-2028789030 +___________ +-896689 +_______ +-8.90880 +________ +-1 +__ +-.05 +____ + +^ no match for key + +^ no match for key + +^ no match for key + +^ no match for key + +^ no match for key +-0 +__ +CARAvan +^ no match for key +-0 +__ + +^ no match for key + +^ no match for key + +^ no match for key +000 +___ +-0 +__ +1 +_ +00000001 +________ +1.040000000 +___________ +1.444 +_____ +1.58590 +_______ +8.013 +_____ +45 +__ +46.89 +_____ +576,446.890 +___ +576,446.88800000 +___ + 4567. + _____ +>>>>37800 + _____ +4798908.340000000000 +____________________ +4798908.45 +__________ +4798908.8909800 +_______________ diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.txt b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.txt index a5813ea3a..44667ef03 100644 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.txt +++ b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_stable.txt @@ -17,7 +17,9 @@ -2028789030 -896689 +-0 CARAvan +-0 -8.90880 -.05 @@ -28,3 +30,4 @@ CARAvan 8.013 000 +-0 \ No newline at end of file diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique.expected b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique.expected index cb27c6664..cd4256c5f 100644 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique.expected +++ b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique.expected @@ -11,10 +11,9 @@ 8.013 45 46.89 +576,446.890 4567. 37800 -576,446.88800000 -576,446.890 4798908.340000000000 4798908.45 4798908.8909800 diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique.expected.debug b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique.expected.debug new file mode 100644 index 000000000..663a4b3a9 --- /dev/null +++ b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique.expected.debug @@ -0,0 +1,38 @@ +-2028789030 +___________ +-896689 +_______ +-8.90880 +________ +-1 +__ +-.05 +____ + +^ no match for key +1 +_ +1.040000000 +___________ +1.444 +_____ +1.58590 +_______ +8.013 +_____ +45 +__ +46.89 +_____ +576,446.890 +___ + 4567. + _____ +>>>>37800 + _____ +4798908.340000000000 +____________________ +4798908.45 +__________ +4798908.8909800 +_______________ diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_reverse.expected b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_reverse.expected index bbce16934..97e261f14 100644 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_reverse.expected +++ b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_reverse.expected @@ -1,10 +1,9 @@ 4798908.8909800 4798908.45 4798908.340000000000 -576,446.890 -576,446.88800000 37800 4567. +576,446.890 46.89 45 8.013 diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_reverse.expected.debug b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_reverse.expected.debug new file mode 100644 index 000000000..01f7abf5b --- /dev/null +++ b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_reverse.expected.debug @@ -0,0 +1,38 @@ +4798908.8909800 +_______________ +4798908.45 +__________ +4798908.340000000000 +____________________ +>>>>37800 + _____ + 4567. + _____ +576,446.890 +___ +46.89 +_____ +45 +__ +8.013 +_____ +1.58590 +_______ +1.444 +_____ +1.040000000 +___________ +1 +_ + +^ no match for key +-.05 +____ +-1 +__ +-8.90880 +________ +-896689 +_______ +-2028789030 +___________ diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_stable.expected b/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_stable.expected deleted file mode 100644 index bbce16934..000000000 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_stable.expected +++ /dev/null @@ -1,20 +0,0 @@ -4798908.8909800 -4798908.45 -4798908.340000000000 -576,446.890 -576,446.88800000 - 37800 - 4567. -46.89 -45 -8.013 -1.58590 -1.444 -1.040000000 -1 - --.05 --1 --8.90880 --896689 --2028789030 diff --git a/tests/fixtures/sort/month_default.expected b/tests/fixtures/sort/month_default.expected index dc51f5d5e..99baa235a 100644 --- a/tests/fixtures/sort/month_default.expected +++ b/tests/fixtures/sort/month_default.expected @@ -1,3 +1,4 @@ + asdf N/A Ut enim ad minim veniam, quis Jan Lorem ipsum dolor sit amet mar laboris nisi ut aliquip ex ea diff --git a/tests/fixtures/sort/month_default.expected.debug b/tests/fixtures/sort/month_default.expected.debug new file mode 100644 index 000000000..f28ba1c48 --- /dev/null +++ b/tests/fixtures/sort/month_default.expected.debug @@ -0,0 +1,33 @@ + asdf + ^ no match for key +_____ +N/A Ut enim ad minim veniam, quis +^ no match for key +_________________________________ +Jan Lorem ipsum dolor sit amet +___ +______________________________ +mar laboris nisi ut aliquip ex ea +___ +_________________________________ +May sed do eiusmod tempor incididunt +___ +____________________________________ +JUN nostrud exercitation ullamco +___ +________________________________ +Jul 1 should remain 2,1,3 +___ +_________________________ +Jul 2 these three lines +___ +_______________________ +Jul 3 if --stable is provided +___ +_____________________________ +Oct ut labore et dolore magna aliqua +___ +____________________________________ +Dec consectetur adipiscing elit +___ +_______________________________ diff --git a/tests/fixtures/sort/month_default.txt b/tests/fixtures/sort/month_default.txt index 6d64bf4f8..c96bad300 100644 --- a/tests/fixtures/sort/month_default.txt +++ b/tests/fixtures/sort/month_default.txt @@ -8,3 +8,4 @@ mar laboris nisi ut aliquip ex ea Jul 2 these three lines Jul 1 should remain 2,1,3 Jul 3 if --stable is provided + asdf diff --git a/tests/fixtures/sort/month_stable.expected b/tests/fixtures/sort/month_stable.expected index 868728a18..cb3a8da8f 100644 --- a/tests/fixtures/sort/month_stable.expected +++ b/tests/fixtures/sort/month_stable.expected @@ -1,4 +1,5 @@ N/A Ut enim ad minim veniam, quis + asdf Jan Lorem ipsum dolor sit amet mar laboris nisi ut aliquip ex ea May sed do eiusmod tempor incididunt diff --git a/tests/fixtures/sort/month_stable.expected.debug b/tests/fixtures/sort/month_stable.expected.debug new file mode 100644 index 000000000..740f9187c --- /dev/null +++ b/tests/fixtures/sort/month_stable.expected.debug @@ -0,0 +1,22 @@ +N/A Ut enim ad minim veniam, quis +^ no match for key + asdf + ^ no match for key +Jan Lorem ipsum dolor sit amet +___ +mar laboris nisi ut aliquip ex ea +___ +May sed do eiusmod tempor incididunt +___ +JUN nostrud exercitation ullamco +___ +Jul 2 these three lines +___ +Jul 1 should remain 2,1,3 +___ +Jul 3 if --stable is provided +___ +Oct ut labore et dolore magna aliqua +___ +Dec consectetur adipiscing elit +___ diff --git a/tests/fixtures/sort/month_stable.txt b/tests/fixtures/sort/month_stable.txt index 6d64bf4f8..c96bad300 100644 --- a/tests/fixtures/sort/month_stable.txt +++ b/tests/fixtures/sort/month_stable.txt @@ -8,3 +8,4 @@ mar laboris nisi ut aliquip ex ea Jul 2 these three lines Jul 1 should remain 2,1,3 Jul 3 if --stable is provided + asdf diff --git a/tests/fixtures/sort/months-dedup.expected.debug b/tests/fixtures/sort/months-dedup.expected.debug new file mode 100644 index 000000000..aded4b951 --- /dev/null +++ b/tests/fixtures/sort/months-dedup.expected.debug @@ -0,0 +1,12 @@ + +^ no match for key +JAN +___ +apr +___ +MAY +___ +JUNNNN +___ +AUG +___ diff --git a/tests/fixtures/sort/months-whitespace.expected b/tests/fixtures/sort/months-whitespace.expected new file mode 100644 index 000000000..84a44d564 --- /dev/null +++ b/tests/fixtures/sort/months-whitespace.expected @@ -0,0 +1,8 @@ + + +JAN + FEb + apr + apr + JUNNNN +AUG diff --git a/tests/fixtures/sort/months-whitespace.expected.debug b/tests/fixtures/sort/months-whitespace.expected.debug new file mode 100644 index 000000000..ef626f505 --- /dev/null +++ b/tests/fixtures/sort/months-whitespace.expected.debug @@ -0,0 +1,24 @@ + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key +JAN +___ +___ + FEb + ___ +_____ + apr + ___ +____ + apr + ___ +____ +>>>JUNNNN + ___ +_________ +AUG +___ +____ diff --git a/tests/fixtures/sort/months-whitespace.txt b/tests/fixtures/sort/months-whitespace.txt new file mode 100644 index 000000000..45c477477 --- /dev/null +++ b/tests/fixtures/sort/months-whitespace.txt @@ -0,0 +1,8 @@ +JAN + JUNNNN +AUG + + apr + apr + + FEb diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_reverse.expected b/tests/fixtures/sort/multiple_decimals.expected similarity index 86% rename from tests/fixtures/sort/mixed_floats_ints_chars_numeric_reverse.expected rename to tests/fixtures/sort/multiple_decimals.expected index 6b024210b..6afbdcaa0 100644 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_reverse.expected +++ b/tests/fixtures/sort/multiple_decimals.expected @@ -1,30 +1,33 @@ -4798908.8909800 -4798908.45 -4798908.340000000000 -576,446.890 -576,446.88800000 - 37800 - 4567. -46.89 -45 -8.013 -1.58590 -1.444 -1.040000000 -1 -00000001 -CARAvan -000 - - - - - - - - --.05 --1 --8.90880 --896689 -2028789030 +-896689 +-8.90880 +-1 +-.05 + + + + + + + + +000 +CARAvan +00000001 +1 +1.040000000 +1.444 +1.58590 +8.013 +45 +46.89 + 4567..457 + 4567. +4567.1 +4567.34 + 37800 +576,446.88800000 +576,446.890 +4798908.340000000000 +4798908.45 +4798908.8909800 diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_stable.txt b/tests/fixtures/sort/multiple_decimals_general.expected similarity index 69% rename from tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_stable.txt rename to tests/fixtures/sort/multiple_decimals_general.expected index a5813ea3a..b08ada324 100644 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_unique_stable.txt +++ b/tests/fixtures/sort/multiple_decimals_general.expected @@ -1,30 +1,37 @@ -576,446.890 -576,446.88800000 - 4567. + + + + + +CARAvan + NaN + -inf +-2028789030 +-896689 +-8.90880 +-1 +-.05 +000 +00000001 +1 +1.040000000 +1.444 +1.58590 +8.013 45 46.89 --1 -1 -00000001 +576,446.88800000 +576,446.890 + 4567..457 + 4567. +4567.1 +4567.34 + 37800 + 45670.89079.098 + 45670.89079.1 4798908.340000000000 4798908.45 4798908.8909800 - - - 37800 - --2028789030 --896689 -CARAvan - --8.90880 --.05 -1.444 -1.58590 -1.040000000 - -8.013 - -000 +inf diff --git a/tests/fixtures/sort/multiple_decimals_general.expected.debug b/tests/fixtures/sort/multiple_decimals_general.expected.debug new file mode 100644 index 000000000..1bf5d2669 --- /dev/null +++ b/tests/fixtures/sort/multiple_decimals_general.expected.debug @@ -0,0 +1,111 @@ + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key +CARAvan +^ no match for key +_______ + NaN + ___ +_____ +>-inf + ____ +_____ +-2028789030 +___________ +___________ +-896689 +_______ +_______ +-8.90880 +________ +________ +-1 +__ +__ +-.05 +____ +____ +000 +___ +___ +00000001 +________ +________ +1 +_ +_ +1.040000000 +___________ +___________ +1.444 +_____ +_____ +1.58590 +_______ +_______ +8.013 +_____ +_____ +45 +__ +__ +46.89 +_____ +_____ +576,446.88800000 +___ +________________ +576,446.890 +___ +___________ +>>>>>>>>>>4567..457 + _____ +___________________ + 4567. + _____ +____________________ +4567.1 +______ +______ +4567.34 +_______ +_______ +>>>>37800 + _____ +_________ +>>>>>>45670.89079.098 + ___________ +_____________________ +>>>>>>45670.89079.1 + ___________ +___________________ +4798908.340000000000 +____________________ +____________________ +4798908.45 +__________ +__________ +4798908.8909800 +_______________ +_______________ +inf +___ +___ diff --git a/tests/fixtures/sort/multiple_decimals_general.txt b/tests/fixtures/sort/multiple_decimals_general.txt new file mode 100644 index 000000000..0feb0ce7f --- /dev/null +++ b/tests/fixtures/sort/multiple_decimals_general.txt @@ -0,0 +1,37 @@ +576,446.890 +576,446.88800000 + +4567.1 + 4567..457 + 45670.89079.1 + 45670.89079.098 +4567.34 + 4567. +45 +46.89 +-1 +1 +00000001 +4798908.340000000000 +4798908.45 +4798908.8909800 + + + 37800 + +-2028789030 +-896689 +CARAvan + +-8.90880 +-.05 +1.444 +1.58590 +1.040000000 + +8.013 + +000 + NaN +inf + -inf diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_reverse_stable.expected b/tests/fixtures/sort/multiple_decimals_numeric.expected similarity index 73% rename from tests/fixtures/sort/mixed_floats_ints_chars_numeric_reverse_stable.expected rename to tests/fixtures/sort/multiple_decimals_numeric.expected index cb1028f0e..8f42e7ce5 100644 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_reverse_stable.expected +++ b/tests/fixtures/sort/multiple_decimals_numeric.expected @@ -1,30 +1,35 @@ -4798908.8909800 -4798908.45 -4798908.340000000000 -576,446.890 -576,446.88800000 - 37800 - 4567. -46.89 -45 -8.013 -1.58590 -1.444 -1.040000000 -1 -00000001 +-2028789030 +-896689 +-8.90880 +-1 +-.05 -CARAvan 000 --.05 --1 --8.90880 --896689 --2028789030 +CARAvan +00000001 +1 +1.040000000 +1.444 +1.58590 +8.013 +45 +46.89 +576,446.88800000 +576,446.890 + 4567..457 + 4567. +4567.1 +4567.34 + 37800 + 45670.89079.098 + 45670.89079.1 +4798908.340000000000 +4798908.45 +4798908.8909800 diff --git a/tests/fixtures/sort/multiple_decimals_numeric.expected.debug b/tests/fixtures/sort/multiple_decimals_numeric.expected.debug new file mode 100644 index 000000000..948c4869c --- /dev/null +++ b/tests/fixtures/sort/multiple_decimals_numeric.expected.debug @@ -0,0 +1,105 @@ +-2028789030 +___________ +___________ +-896689 +_______ +_______ +-8.90880 +________ +________ +-1 +__ +__ +-.05 +____ +____ + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key +000 +___ +___ +CARAvan +^ no match for key +_______ +00000001 +________ +________ +1 +_ +_ +1.040000000 +___________ +___________ +1.444 +_____ +_____ +1.58590 +_______ +_______ +8.013 +_____ +_____ +45 +__ +__ +46.89 +_____ +_____ +576,446.88800000 +___ +________________ +576,446.890 +___ +___________ +>>>>>>>>>>4567..457 + _____ +___________________ + 4567. + _____ +____________________ +4567.1 +______ +______ +4567.34 +_______ +_______ +>>>>37800 + _____ +_________ +>>>>>>45670.89079.098 + ___________ +_____________________ +>>>>>>45670.89079.1 + ___________ +___________________ +4798908.340000000000 +____________________ +____________________ +4798908.45 +__________ +__________ +4798908.8909800 +_______________ +_______________ diff --git a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_reverse_stable.txt b/tests/fixtures/sort/multiple_decimals_numeric.txt similarity index 73% rename from tests/fixtures/sort/mixed_floats_ints_chars_numeric_reverse_stable.txt rename to tests/fixtures/sort/multiple_decimals_numeric.txt index a5813ea3a..4e65ecfda 100644 --- a/tests/fixtures/sort/mixed_floats_ints_chars_numeric_reverse_stable.txt +++ b/tests/fixtures/sort/multiple_decimals_numeric.txt @@ -1,7 +1,11 @@ 576,446.890 576,446.88800000 - +4567.1 + 4567..457 + 45670.89079.1 + 45670.89079.098 +4567.34 4567. 45 46.89 @@ -28,3 +32,4 @@ CARAvan 8.013 000 + diff --git a/tests/fixtures/sort/numeric-floats-with-nan2.expected.debug b/tests/fixtures/sort/numeric-floats-with-nan2.expected.debug new file mode 100644 index 000000000..b5a2c2f64 --- /dev/null +++ b/tests/fixtures/sort/numeric-floats-with-nan2.expected.debug @@ -0,0 +1,69 @@ +-8.90880 +________ +________ +-.05 +____ +____ + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key + +^ no match for key +^ no match for key +Karma +^ no match for key +_____ +1 +_ +_ +1.0/0.0 +___ +_______ +1.040000000 +___________ +___________ +1.2 +___ +___ +1.444 +_____ +_____ +1.58590 +_______ +_______ diff --git a/tests/fixtures/sort/numeric_fixed_floats.expected.debug b/tests/fixtures/sort/numeric_fixed_floats.expected.debug new file mode 100644 index 000000000..fa8a909c5 --- /dev/null +++ b/tests/fixtures/sort/numeric_fixed_floats.expected.debug @@ -0,0 +1,6 @@ +.00 +___ +___ +.01 +___ +___ diff --git a/tests/fixtures/sort/numeric_floats.expected.debug b/tests/fixtures/sort/numeric_floats.expected.debug new file mode 100644 index 000000000..e24056376 --- /dev/null +++ b/tests/fixtures/sort/numeric_floats.expected.debug @@ -0,0 +1,6 @@ +.02 +___ +___ +.03 +___ +___ diff --git a/tests/fixtures/sort/numeric_floats_and_ints.expected.debug b/tests/fixtures/sort/numeric_floats_and_ints.expected.debug new file mode 100644 index 000000000..c43d6bfb6 --- /dev/null +++ b/tests/fixtures/sort/numeric_floats_and_ints.expected.debug @@ -0,0 +1,6 @@ +0 +_ +_ +.02 +___ +___ diff --git a/tests/fixtures/sort/numeric_floats_with_nan.expected.debug b/tests/fixtures/sort/numeric_floats_with_nan.expected.debug new file mode 100644 index 000000000..07e72db53 --- /dev/null +++ b/tests/fixtures/sort/numeric_floats_with_nan.expected.debug @@ -0,0 +1,9 @@ +NaN +^ no match for key +___ +.02 +___ +___ +.03 +___ +___ diff --git a/tests/fixtures/sort/numeric_unfixed_floats.expected.debug b/tests/fixtures/sort/numeric_unfixed_floats.expected.debug new file mode 100644 index 000000000..a60daf623 --- /dev/null +++ b/tests/fixtures/sort/numeric_unfixed_floats.expected.debug @@ -0,0 +1,6 @@ +.000 +____ +____ +.01 +___ +___ diff --git a/tests/fixtures/sort/numeric_unique.expected b/tests/fixtures/sort/numeric_unique.expected new file mode 100644 index 000000000..8a31187f6 --- /dev/null +++ b/tests/fixtures/sort/numeric_unique.expected @@ -0,0 +1,2 @@ +-10 bb +aa diff --git a/tests/fixtures/sort/numeric_unique.expected.debug b/tests/fixtures/sort/numeric_unique.expected.debug new file mode 100644 index 000000000..79ec70364 --- /dev/null +++ b/tests/fixtures/sort/numeric_unique.expected.debug @@ -0,0 +1,4 @@ +-10 bb +___ +aa +^ no match for key diff --git a/tests/fixtures/sort/numeric_unique.txt b/tests/fixtures/sort/numeric_unique.txt new file mode 100644 index 000000000..15cc08022 --- /dev/null +++ b/tests/fixtures/sort/numeric_unique.txt @@ -0,0 +1,3 @@ +aa +-10 bb +-10 aa diff --git a/tests/fixtures/sort/numeric_unsorted_ints.expected.debug b/tests/fixtures/sort/numeric_unsorted_ints.expected.debug new file mode 100644 index 000000000..b16931f5e --- /dev/null +++ b/tests/fixtures/sort/numeric_unsorted_ints.expected.debug @@ -0,0 +1,300 @@ +1 +_ +_ +2 +_ +_ +3 +_ +_ +4 +_ +_ +5 +_ +_ +6 +_ +_ +7 +_ +_ +8 +_ +_ +9 +_ +_ +10 +__ +__ +11 +__ +__ +12 +__ +__ +13 +__ +__ +14 +__ +__ +15 +__ +__ +16 +__ +__ +17 +__ +__ +18 +__ +__ +19 +__ +__ +20 +__ +__ +21 +__ +__ +22 +__ +__ +23 +__ +__ +24 +__ +__ +25 +__ +__ +26 +__ +__ +27 +__ +__ +28 +__ +__ +29 +__ +__ +30 +__ +__ +31 +__ +__ +32 +__ +__ +33 +__ +__ +34 +__ +__ +35 +__ +__ +36 +__ +__ +37 +__ +__ +38 +__ +__ +39 +__ +__ +40 +__ +__ +41 +__ +__ +42 +__ +__ +43 +__ +__ +44 +__ +__ +45 +__ +__ +46 +__ +__ +47 +__ +__ +48 +__ +__ +49 +__ +__ +50 +__ +__ +51 +__ +__ +52 +__ +__ +53 +__ +__ +54 +__ +__ +55 +__ +__ +56 +__ +__ +57 +__ +__ +58 +__ +__ +59 +__ +__ +60 +__ +__ +61 +__ +__ +62 +__ +__ +63 +__ +__ +64 +__ +__ +65 +__ +__ +66 +__ +__ +67 +__ +__ +68 +__ +__ +69 +__ +__ +70 +__ +__ +71 +__ +__ +72 +__ +__ +73 +__ +__ +74 +__ +__ +75 +__ +__ +76 +__ +__ +77 +__ +__ +78 +__ +__ +79 +__ +__ +80 +__ +__ +81 +__ +__ +82 +__ +__ +83 +__ +__ +84 +__ +__ +85 +__ +__ +86 +__ +__ +87 +__ +__ +88 +__ +__ +89 +__ +__ +90 +__ +__ +91 +__ +__ +92 +__ +__ +93 +__ +__ +94 +__ +__ +95 +__ +__ +96 +__ +__ +97 +__ +__ +98 +__ +__ +99 +__ +__ +100 +___ +___ diff --git a/tests/fixtures/sort/numeric_unsorted_ints_unique.expected.debug b/tests/fixtures/sort/numeric_unsorted_ints_unique.expected.debug new file mode 100644 index 000000000..072a57ccf --- /dev/null +++ b/tests/fixtures/sort/numeric_unsorted_ints_unique.expected.debug @@ -0,0 +1,8 @@ +1 +_ +2 +_ +3 +_ +4 +_ diff --git a/tests/fixtures/sort/version-empty-lines.expected b/tests/fixtures/sort/version-empty-lines.expected new file mode 100644 index 000000000..c496c0ff5 --- /dev/null +++ b/tests/fixtures/sort/version-empty-lines.expected @@ -0,0 +1,11 @@ + + + + + + + +1.2.3-alpha +1.2.3-alpha2 +11.2.3 + 1.12.4 diff --git a/tests/fixtures/sort/version-empty-lines.txt b/tests/fixtures/sort/version-empty-lines.txt new file mode 100644 index 000000000..9b6b89788 --- /dev/null +++ b/tests/fixtures/sort/version-empty-lines.txt @@ -0,0 +1,11 @@ +11.2.3 + + + +1.2.3-alpha2 + + +1.2.3-alpha + + + 1.12.4 diff --git a/tests/fixtures/sort/version.expected.debug b/tests/fixtures/sort/version.expected.debug new file mode 100644 index 000000000..2d922b5c0 --- /dev/null +++ b/tests/fixtures/sort/version.expected.debug @@ -0,0 +1,12 @@ +1.2.3-alpha +___________ +___________ +1.2.3-alpha2 +____________ +____________ +1.12.4 +______ +______ +11.2.3 +______ +______ diff --git a/tests/fixtures/sort/words_unique.expected b/tests/fixtures/sort/words_unique.expected new file mode 100644 index 000000000..2444ce1c6 --- /dev/null +++ b/tests/fixtures/sort/words_unique.expected @@ -0,0 +1,3 @@ +aaa +bbb +zzz diff --git a/tests/fixtures/sort/words_unique.expected.debug b/tests/fixtures/sort/words_unique.expected.debug new file mode 100644 index 000000000..0c32daf74 --- /dev/null +++ b/tests/fixtures/sort/words_unique.expected.debug @@ -0,0 +1,6 @@ +aaa +___ +bbb +___ +zzz +___ diff --git a/tests/fixtures/sort/words_unique.txt b/tests/fixtures/sort/words_unique.txt new file mode 100644 index 000000000..9c6666029 --- /dev/null +++ b/tests/fixtures/sort/words_unique.txt @@ -0,0 +1,4 @@ +zzz +aaa +bbb +bbb diff --git a/tests/fixtures/sort/zero-terminated.expected.debug b/tests/fixtures/sort/zero-terminated.expected.debug new file mode 100644 index 000000000..fbef272b0 --- /dev/null +++ b/tests/fixtures/sort/zero-terminated.expected.debug @@ -0,0 +1,84 @@ +../.. +_____ +../../by-util +_____________ +../../common +____________ +../../fixtures +______________ +../../fixtures/cat +__________________ +../../fixtures/cksum +____________________ +../../fixtures/comm +___________________ +../../fixtures/cp +_________________ +../../fixtures/cp/dir_with_mount +________________________________ +../../fixtures/cp/dir_with_mount/copy_me +________________________________________ +../../fixtures/cp/hello_dir +___________________________ +../../fixtures/cp/hello_dir_with_file +_____________________________________ +../../fixtures/csplit +_____________________ +../../fixtures/cut +__________________ +../../fixtures/cut/sequences +____________________________ +../../fixtures/dircolors +________________________ +../../fixtures/du +_________________ +../../fixtures/du/subdir +________________________ +../../fixtures/du/subdir/deeper +_______________________________ +../../fixtures/du/subdir/links +______________________________ +../../fixtures/env +__________________ +../../fixtures/expand +_____________________ +../../fixtures/fmt +__________________ +../../fixtures/fold +___________________ +../../fixtures/hashsum +______________________ +../../fixtures/head +___________________ +../../fixtures/join +___________________ +../../fixtures/mv +_________________ +../../fixtures/nl +_________________ +../../fixtures/numfmt +_____________________ +../../fixtures/od +_________________ +../../fixtures/paste +____________________ +../../fixtures/ptx +__________________ +../../fixtures/shuf +___________________ +../../fixtures/sort +___________________ +../../fixtures/sum +__________________ +../../fixtures/tac +__________________ +../../fixtures/tail +___________________ +../../fixtures/tsort +____________________ +../../fixtures/unexpand +_______________________ +../../fixtures/uniq +___________________ +../../fixtures/wc +_________________ diff --git a/tests/fixtures/test/non_empty_file b/tests/fixtures/test/non_empty_file new file mode 100644 index 000000000..34425caf6 --- /dev/null +++ b/tests/fixtures/test/non_empty_file @@ -0,0 +1 @@ +Not empty! diff --git a/tests/fixtures/test/regular_file b/tests/fixtures/test/regular_file new file mode 100644 index 000000000..e69de29bb diff --git a/tests/fixtures/wc/emptyfile.txt b/tests/fixtures/wc/emptyfile.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/fixtures/wc/manyemptylines.txt b/tests/fixtures/wc/manyemptylines.txt new file mode 100644 index 000000000..716f02896 --- /dev/null +++ b/tests/fixtures/wc/manyemptylines.txt @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/fixtures/wc/notrailingnewline.txt b/tests/fixtures/wc/notrailingnewline.txt new file mode 100644 index 000000000..789819226 --- /dev/null +++ b/tests/fixtures/wc/notrailingnewline.txt @@ -0,0 +1 @@ +a diff --git a/tests/fixtures/wc/onelongemptyline.txt b/tests/fixtures/wc/onelongemptyline.txt new file mode 100644 index 000000000..f93ac3c2c --- /dev/null +++ b/tests/fixtures/wc/onelongemptyline.txt @@ -0,0 +1 @@ + diff --git a/tests/fixtures/wc/onelongword.txt b/tests/fixtures/wc/onelongword.txt new file mode 100644 index 000000000..9d693a7ca --- /dev/null +++ b/tests/fixtures/wc/onelongword.txt @@ -0,0 +1 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/util/build-gnu.sh b/util/build-gnu.sh new file mode 100644 index 000000000..9d73450f6 --- /dev/null +++ b/util/build-gnu.sh @@ -0,0 +1,99 @@ +#!/bin/bash +set -e +if test ! -d ../gnu; then + echo "Could not find ../gnu" + echo "git clone git@github.com:coreutils/coreutils.git ../gnu" + exit 1 +fi +if test ! -d ../gnulib; then + echo "Could not find ../gnulib" + echo "git clone git@github.com:coreutils/gnulib.git ../gnulib" + exit 1 +fi + + +pushd $(pwd) +make PROFILE=release +BUILDDIR="$PWD/target/release/" +cp "${BUILDDIR}/install" "${BUILDDIR}/ginstall" # The GNU tests rename this script before running, to avoid confusion with the make target +# Create *sum binaries +for sum in b2sum md5sum sha1sum sha224sum sha256sum sha384sum sha512sum +do + sum_path="${BUILDDIR}/${sum}" + test -f "${sum_path}" || cp "${BUILDDIR}/hashsum" "${sum_path}" +done +test -f "${BUILDDIR}/[" || cp "${BUILDDIR}/test" "${BUILDDIR}/[" +popd +GNULIB_SRCDIR="$PWD/../gnulib" +pushd ../gnu/ + +# Any binaries that aren't built become `false` so their tests fail +for binary in $(./build-aux/gen-lists-of-programs.sh --list-progs) +do + bin_path="${BUILDDIR}/${binary}" + test -f "${bin_path}" || { echo "'${binary}' was not built with uutils, using the 'false' program"; cp "${BUILDDIR}/false" "${bin_path}"; } +done + +./bootstrap --gnulib-srcdir="$GNULIB_SRCDIR" +./configure --quiet --disable-gcc-warnings +#Add timeout to to protect against hangs +sed -i 's|"\$@|/usr/bin/timeout 600 "\$@|' build-aux/test-driver +# Change the PATH in the Makefile to test the uutils coreutils instead of the GNU coreutils +sed -i "s/^[[:blank:]]*PATH=.*/ PATH='${BUILDDIR//\//\\/}\$(PATH_SEPARATOR)'\"\$\$PATH\" \\\/" Makefile +sed -i 's| tr | /usr/bin/tr |' tests/init.sh +make +# Generate the factor tests, so they can be fixed +# Used to be 36. Reduced to 20 to decrease the log size +for i in {00..20} +do + make tests/factor/t${i}.sh +done + +# strip the long stuff +for i in {21..36} +do + sed -i -e "s/\$(tf)\/t${i}.sh//g" Makefile +done + + +grep -rl 'path_prepend_' tests/* | xargs sed -i 's|path_prepend_ ./src||' +sed -i -e 's|^seq |/usr/bin/seq |' -e 's|sha1sum |/usr/bin/sha1sum |' tests/factor/t*sh + +# Remove tests checking for --version & --help +# Not really interesting for us and logs are too big +sed -i -e '/tests\/misc\/invalid-opt.pl/ D' \ + -e '/tests\/misc\/help-version.sh/ D' \ + -e '/tests\/misc\/help-version-getopt.sh/ D' \ + Makefile + +# logs are clotted because of this test +sed -i -e '/tests\/misc\/seq-precision.sh/ D' \ + Makefile + +# printf doesn't limit the values used in its arg, so this produced ~2GB of output +sed -i '/INT_OFLOW/ D' tests/misc/printf.sh + +# Use the system coreutils where the test fails due to error in a util that is not the one being tested +sed -i 's|stat|/usr/bin/stat|' tests/chgrp/basic.sh tests/cp/existing-perm-dir.sh tests/touch/60-seconds.sh tests/misc/sort-compress-proc.sh +sed -i 's|ls -|/usr/bin/ls -|' tests/chgrp/posix-H.sh tests/chown/deref.sh tests/cp/same-file.sh tests/misc/mknod.sh tests/mv/part-symlink.sh tests/du/8gb.sh +sed -i 's|mkdir |/usr/bin/mkdir |' tests/cp/existing-perm-dir.sh tests/rm/empty-inacc.sh +sed -i 's|timeout \([[:digit:]]\)| /usr/bin/timeout \1|' tests/tail-2/inotify-rotate.sh tests/tail-2/inotify-dir-recreate.sh tests/tail-2/inotify-rotate-resources.sh tests/cp/parent-perm-race.sh tests/ls/infloop.sh tests/misc/sort-exit-early.sh tests/misc/sort-NaN-infloop.sh tests/misc/uniq-perf.sh tests/tail-2/inotify-only-regular.sh tests/tail-2/pipe-f2.sh tests/tail-2/retry.sh tests/tail-2/symlink.sh tests/tail-2/wait.sh tests/tail-2/pid.sh tests/dd/stats.sh tests/tail-2/follow-name.sh tests/misc/shuf.sh # Don't break the function called 'grep_timeout' +sed -i 's|chmod |/usr/bin/chmod |' tests/du/inacc-dir.sh tests/mkdir/p-3.sh tests/tail-2/tail-n0f.sh tests/cp/fail-perm.sh tests/du/inaccessible-cwd.sh tests/mv/i-2.sh tests/chgrp/basic.sh tests/misc/shuf.sh +sed -i 's|sort |/usr/bin/sort |' tests/ls/hyperlink.sh tests/misc/test-N.sh +sed -i 's|split |/usr/bin/split |' tests/misc/factor-parallel.sh +sed -i 's|truncate |/usr/bin/truncate |' tests/split/fail.sh +sed -i 's|dd |/usr/bin/dd |' tests/du/8gb.sh tests/tail-2/big-4gb.sh init.cfg +sed -i 's|id -|/usr/bin/id -|' tests/misc/runcon-no-reorder.sh +sed -i 's|touch |/usr/bin/touch |' tests/cp/preserve-link.sh tests/cp/reflink-perm.sh tests/ls/block-size.sh tests/ls/abmon-align.sh tests/ls/rt-1.sh tests/mv/update.sh tests/misc/ls-time.sh tests/misc/stat-nanoseconds.sh tests/misc/time-style.sh tests/misc/test-N.sh +sed -i 's|ln -|/usr/bin/ln -|' tests/cp/link-deref.sh +sed -i 's|printf |/usr/bin/printf |' tests/dd/ascii.sh +sed -i 's|cp |/usr/bin/cp |' tests/mv/hard-2.sh +sed -i 's|paste |/usr/bin/paste |' tests/misc/od-endian.sh +sed -i 's|seq |/usr/bin/seq |' tests/misc/sort-discrim.sh + +#Add specific timeout to tests that currently hang to limit time spent waiting +sed -i 's|seq \$|/usr/bin/timeout 0.1 seq \$|' tests/misc/seq-precision.sh tests/misc/seq-long-double.sh +sed -i 's|cat |/usr/bin/timeout 0.1 cat |' tests/misc/cat-self.sh + +test -f "${BUILDDIR}/getlimits" || cp src/getlimits "${BUILDDIR}" + diff --git a/util/run-gnu-test.sh b/util/run-gnu-test.sh new file mode 100644 index 000000000..b9948ccd3 --- /dev/null +++ b/util/run-gnu-test.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -e +BUILDDIR="${PWD}/uutils/target/release" +GNULIB_DIR="${PWD}/gnulib" +pushd gnu + +timeout -sKILL 2h make -j "$(nproc)" check SUBDIRS=. RUN_EXPENSIVE_TESTS=yes RUN_VERY_EXPENSIVE_TESTS=yes VERBOSE=no || : # Kill after 4 hours in case something gets stuck in make