pax_global_header00006660000000000000000000000064145465317050014524gustar00rootroot0000000000000052 comment=36842a3bccfb78f5c27642435bff387b42f7d13b
btop-1.3.0/000077500000000000000000000000001454653170500124715ustar00rootroot00000000000000btop-1.3.0/.editorconfig000066400000000000000000000001711454653170500151450ustar00rootroot00000000000000[*.{cpp,h,hpp,sh,md,cfg,sample}]
indent_style = tab
indent_size = 4
[*.{yml,yaml}]
indent_style = space
indent_size = 2
btop-1.3.0/.github/000077500000000000000000000000001454653170500140315ustar00rootroot00000000000000btop-1.3.0/.github/FUNDING.yml000066400000000000000000000011031454653170500156410ustar00rootroot00000000000000# These are supported funding model platforms
github: aristocratos
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: aristocratos
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: https://paypal.me/aristocratos
btop-1.3.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001454653170500162145ustar00rootroot00000000000000btop-1.3.0/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000031771454653170500207160ustar00rootroot00000000000000---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: bug
assignees: aristocratos
---
**Read the README.md and search for similar issues before posting a bug report!**
Any bug that can be solved by just reading the [prerequisites](https://github.com/aristocratos/btop#prerequisites) section of the README will likely be ignored.
**Describe the bug**
[A clear and concise description of what the bug is.]
**To Reproduce**
[Steps to reproduce the behavior:]
**Expected behavior**
[A clear and concise description of what you expected to happen.]
**Screenshots**
[If applicable, add screenshots to help explain your problem.]
**Info (please complete the following information):**
- btop++ version: `btop -v`
- If using snap: `snap info btop`
- Binary: [self compiled or static binary from release]
- (If compiled) Compiler and version:
- Architecture: [x86_64, aarch64, etc.] `uname -m`
- Platform: [Linux, FreeBSD, OsX]
- (Linux) Kernel: `uname -r`
- (OSX/FreeBSD) Os release version:
- Terminal used:
- Font used:
**Additional context**
Contents of `~/.config/btop/btop.log`
Note: The snap uses: `~/snap/btop/current/.config/btop`
(try running btop with `--debug` flag if btop.log is empty)
**GDB Backtrace**
If btop++ is crashing at start the following steps could be helpful:
(Extra helpful if compiled with `make OPTFLAGS="-O0 -g"`)
1. run (linux): `gdb btop` (macos): `lldb btop`
2. `r` to run, wait for crash and press enter if prompted, CTRL+L to clear screen if needed.
3. (gdb): `thread apply all bt` (lldb): `bt all` to get backtrace for all threads
4. Copy and paste the backtrace here:
btop-1.3.0/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011571454653170500217450ustar00rootroot00000000000000---
name: Feature request
about: Suggest an idea for this project
title: "[REQUEST]"
labels: enhancement
assignees: aristocratos
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
btop-1.3.0/.github/workflows/000077500000000000000000000000001454653170500160665ustar00rootroot00000000000000btop-1.3.0/.github/workflows/cmake-freebsd.yml000066400000000000000000000016541454653170500213070ustar00rootroot00000000000000name: FreeBSD CMake
on:
push:
branches: main
tags-ignore: '*.*'
paths:
- '.github/workflows/cmake-freebsd.yml'
- 'CMakeLists.txt'
- 'include/**'
- 'src/*pp'
- 'src/freebsd/*pp'
pull_request:
branches: main
paths:
- '.github/workflows/cmake-freebsd.yml'
- 'CMakeLists.txt'
- 'include/**'
- 'src/*pp'
- 'src/freebsd/*pp'
jobs:
cmake_build_on_freebsd:
runs-on: ubuntu-22.04
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- name: Compile
uses: vmactions/freebsd-vm@v1
with:
release: '14.0'
usesh: true
prepare: pkg install -y cmake ninja
run: |
CXX=clang++ cmake -B build -G Ninja -DBTOP_STATIC=ON
cmake --build build --verbose
btop-1.3.0/.github/workflows/cmake-linux.yml000066400000000000000000000016531454653170500210330ustar00rootroot00000000000000name: Linux CMake
on:
push:
branches: main
tags-ignore: '*.*'
paths:
- '.github/workflows/cmake-linux.yml'
- 'CMakeLists.txt'
- 'include/**'
- 'src/*pp'
- 'src/linux/*pp'
pull_request:
branches: main
paths:
- '.github/workflows/cmake-linux.yml'
- 'CMakeLists.txt'
- 'include/**'
- 'src/*pp'
- 'src/linux/*pp'
jobs:
cmake_build_on_linux:
runs-on: ubuntu-latest
container: alpine:edge
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- name: Install build tools
run: apk add --no-cache --update clang cmake lld ninja
- name: Configure
run: CXX=clang++ LDFLAGS=-fuse-ld=lld cmake -B build -G Ninja -DBTOP_STATIC=ON
- name: Compile
run: cmake --build build --verbose
btop-1.3.0/.github/workflows/cmake-macos.yml000066400000000000000000000023541454653170500207750ustar00rootroot00000000000000name: macOS CMake
on:
push:
branches: main
tags-ignore: '*.*'
paths:
- '.github/workflows/cmake-macos.yml'
- 'CMakeLists.txt'
- 'include/**'
- 'src/*pp'
- 'src/osx/*pp'
pull_request:
branches: main
paths:
- '.github/workflows/cmake-macos.yml'
- 'CMakeLists.txt'
- 'include/**'
- 'src/*pp'
- 'src/osx/*pp'
jobs:
cmake_build_on_macos:
runs-on: macos-latest
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- name: Install build tools
run: |
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
brew update --quiet
brew install --force --overwrite cmake llvm@17 ninja
- name: Configure
run: |
export LLVM_PREFIX="$(brew --prefix llvm)"
export CXX="$LLVM_PREFIX/bin/clang++"
export CPPFLAGS="-I$LLVM_PREFIX/include"
export LDFLAGS="-L$LLVM_PREFIX/lib -L$LLVM_PREFIX/lib/c++ -Wl,-rpath,$LLVM_PREFIX/lib/c++ -fuse-ld=$LLVM_PREFIX/bin/ld64.lld"
cmake -B build -G Ninja
- name: Compile
run: cmake --build build --verbose
btop-1.3.0/.github/workflows/continuous-build-freebsd.yml000066400000000000000000000030061454653170500235230ustar00rootroot00000000000000name: Continuous Build FreeBSD
on:
workflow_dispatch:
push:
branches:
- main
tags-ignore:
- '*.*'
paths:
- 'src/**'
- '!src/linux/**'
- '!src/osx/**'
- '!src/openbsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/continuous-build-freebsd.yml'
pull_request:
branches:
- main
paths:
- 'src/**'
- '!src/linux/**'
- '!src/osx/**'
- '!src/openbsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/continuous-build-freebsd.yml'
jobs:
build-freebsd:
runs-on: ubuntu-22.04
timeout-minutes: 20
strategy:
matrix:
compiler: ["clang++", "g++"]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile
uses: vmactions/freebsd-vm@v1
with:
release: '14.0'
usesh: true
prepare: |
pkg install -y gmake gcc coreutils git
git config --global --add safe.directory /home/runner/work/btop/btop
run: |
CXX=${{ matrix.compiler }} gmake STATIC=true STRIP=true
GIT_HASH=$(git rev-parse --short "$GITHUB_SHA")
COMPILER=$(echo ${{ matrix.compiler }} | sed 's/clang++/llvm/' | sed 's/g++/gcc/')
mv bin/btop bin/btop-"$COMPILER"-"$GIT_HASH"
ls -alh bin
- uses: actions/upload-artifact@v3
with:
name: btop-x86_64-freebsd-14
path: 'bin/*'
if-no-files-found: error
btop-1.3.0/.github/workflows/continuous-build-linux.yml000066400000000000000000000065401454653170500232560ustar00rootroot00000000000000name: Continuous Build Linux
on:
workflow_dispatch:
push:
branches:
- main
tags-ignore:
- '*.*'
paths:
- 'src/**'
- '!src/osx/**'
- '!src/freebsd/**'
- '!src/openbsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/continuous-build-linux.yml'
pull_request:
branches:
- main
paths:
- 'src/**'
- '!src/osx/**'
- '!src/freebsd/**'
- '!src/openbsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/continuous-build-linux.yml'
jobs:
static-build:
continue-on-error: true
strategy:
matrix:
toolchain:
- aarch64-linux-musl
- aarch64_be-linux-musl
- arm-linux-musleabi
- arm-linux-musleabihf
- armeb-linux-musleabi
- armeb-linux-musleabihf
- armel-linux-musleabi
- armel-linux-musleabihf
- armv5l-linux-musleabi
- armv5l-linux-musleabihf
- armv6-linux-musleabi
- armv6-linux-musleabihf
- armv7l-linux-musleabihf
- armv7m-linux-musleabi
- armv7r-linux-musleabihf
- i486-linux-musl
- i686-linux-musl
- m68k-linux-musl
- mips-linux-musl
- mips-linux-musln32sf
- mips-linux-muslsf
- mips64-linux-musl
- mips64-linux-musln32
- mips64-linux-musln32sf
- mips64el-linux-musl
- mips64el-linux-musln32
- mips64el-linux-musln32sf
- mipsel-linux-musl
- mipsel-linux-musln32
- mipsel-linux-musln32sf
- mipsel-linux-muslsf
- powerpc-linux-musl
- powerpc-linux-muslsf
- powerpc64-linux-musl
- powerpc64le-linux-musl
- powerpcle-linux-musl
- powerpcle-linux-muslsf
- riscv32-linux-musl
- riscv64-linux-musl
- s390x-linux-musl
- x86_64-linux-musl
- x86_64-linux-muslx32
# - or1k-linux-musl
# - sh2-linux-musl
# - sh2-linux-muslfdpic
# - sh2eb-linux-musl
# - sh2eb-linux-muslfdpic
# - sh4-linux-musl
# - sh4eb-linux-musl
runs-on: ubuntu-latest
container: muslcc/x86_64:${{ matrix.toolchain }}
steps:
- name: Install build tools
run: apk add --no-cache coreutils git make tar zstd
- name: Fix - Unsafe repository stop
run: git config --global --add safe.directory /__w/btop/btop
- name: Checkout source
uses: actions/checkout@v3
with:
submodules: recursive
- name: Fix - Stopping at filesystem boundary
run: git init # [fix Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).]
- name: Build
run: make STATIC=true STRIP=true
- name: Make executable
run: chmod +x bin/*
- name: Set up directories
run: |
mkdir .artifacts
mkdir .package
- name: Create binary atrifacts
run: |
TOOLCHAIN=${{ matrix.toolchain }}
GIT_HASH=$(git rev-parse --short "${{ github.sha }}")
FILENAME=btop-${TOOLCHAIN/linux-musl/}-$GIT_HASH
cp bin/btop .artifacts/$FILENAME
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: btop-${{ matrix.toolchain }}
path: '.artifacts/**'
btop-1.3.0/.github/workflows/continuous-build-macos.yml000066400000000000000000000031551454653170500232200ustar00rootroot00000000000000name: Continuous Build MacOS
on:
workflow_dispatch:
push:
branches:
- main
tags-ignore:
- '*.*'
paths:
- 'src/**'
- '!src/linux/**'
- '!src/freebsd/**'
- '!src/openbsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/continuous-build-macos.yml'
pull_request:
branches:
- main
paths:
- 'src/**'
- '!src/linux/**'
- '!src/freebsd/**'
- '!src/openbsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/continuous-build-macos.yml'
jobs:
build-macos11:
runs-on: macos-11
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- name: Compile
run: |
make CXX=g++-11 ARCH=x86_64 STATIC=true STRIP=true
GIT_HASH=$(git rev-parse --short "$GITHUB_SHA")
mv bin/btop bin/btop-x86_64-BigSur-$GIT_HASH
ls -alh bin
- uses: actions/upload-artifact@v3
with:
name: btop-x86_64-macos11-BigSur
path: 'bin/*'
build-macos12:
runs-on: macos-12
steps:
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- uses: actions/checkout@v3
with:
submodules: recursive
- name: Compile
run: |
make CXX=g++-12 ARCH=x86_64 STATIC=true STRIP=true
GIT_HASH=$(git rev-parse --short "$GITHUB_SHA")
mv bin/btop bin/btop-x86_64-Monterey-$GIT_HASH
ls -alh bin
- uses: actions/upload-artifact@v3
with:
name: btop-x86_64-macos12-Monterey
path: 'bin/*'
btop-1.3.0/.github/workflows/continuous-build-openbsd.yml000066400000000000000000000025211454653170500235440ustar00rootroot00000000000000name: Continuous Build OpenBSD
on:
workflow_dispatch:
push:
branches:
- main
tags-ignore:
- '*.*'
paths:
- 'src/**'
- '!src/linux/**'
- '!src/osx/**'
- '!src/freebsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/continuous-build-openbsd.yml'
pull_request:
branches:
- main
paths:
- 'src/**'
- '!src/linux/**'
- '!src/osx/**'
- '!src/freebsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/continuous-build-openbsd.yml'
jobs:
build-openbsd:
runs-on: ubuntu-22.04
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile
uses: vmactions/openbsd-vm@v1
with:
release: '7.4'
usesh: true
prepare: |
pkg_add gmake gcc%11 g++%11 coreutils git
git config --global --add safe.directory /home/runner/work/btop/btop
run: |
gmake CXX=eg++ STATIC=true STRIP=true
GIT_HASH=$(git rev-parse --short "$GITHUB_SHA")
mv bin/btop bin/btop-GCC11-"$GIT_HASH"
ls -alh bin
- uses: actions/upload-artifact@v3
with:
name: btop-x86_64-openbsd-7.4
path: 'bin/*'
if-no-files-found: error
btop-1.3.0/.github/workflows/test-snap-can-build.yml000066400000000000000000000015411454653170500223640ustar00rootroot00000000000000name: 🧪 Test snap can be built on x86_64
on:
workflow_dispatch:
push:
branches: [ main ]
tags-ignore:
- '*.*'
paths:
- 'src/**'
- '!src/osx/**'
- '!src/freebsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/test-snap-can-build.yml'
pull_request:
branches: [ main ]
paths:
- 'src/**'
- '!src/osx/**'
- '!src/freebsd/**'
- 'include/**'
- 'Makefile'
- '.github/workflows/test-snap-can-build.yml'
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
steps:
- uses: actions/checkout@v2
- uses: snapcore/action-build@v1
id: build
- uses: diddlesnaps/snapcraft-review-action@v1
with:
snap: ${{ steps.build.outputs.snap }}
isClassic: 'false'
btop-1.3.0/.gitignore000066400000000000000000000020461454653170500144630ustar00rootroot00000000000000# gitginore template for creating Snap packages
# website: https://snapcraft.io/
parts/
prime/
stage/
*.snap
# Snapcraft global state tracking data(automatically generated)
# https://forum.snapcraft.io/t/location-to-save-global-state/768
/snap/.snapcraft/
# Source archive packed by `snapcraft cleanbuild` before pushing to the LXD container
/*_source.tar.bz2
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
build
bin
btop
.*/
# Optional libraries
lib/rocm_smi_lib
# Don't ignore .github directory
!.github/
# Ignore files created by Qt Creator
*.config
*.creator
*.creator.user
*.creator.user.*
*.cflags
*.cxxflags
*.files
*.includes
# CMake
CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps
# CLion
cmake-build-*
btop-1.3.0/.gitmodules000066400000000000000000000000001454653170500146340ustar00rootroot00000000000000btop-1.3.0/CHANGELOG.md000066400000000000000000000321511454653170500143040ustar00rootroot00000000000000## v1.3.0
* Added Gpu Support Linux | @romner-set | PR #529
* Added platform support for OpenBSD | @joske | PR #607
* Enable macos clang | @muneebmahmed | PR #666
* Fix Apple Silicon CPUs misprinted | @masiboss | PR #679
* Cmake support for MacOS | @imwints | PR #675
* Elementarish theme: color update according to Elementary palette | @stradicat | PR #660
* Add alternative key codes for Delete, Insert, Home, End | @ivanp7 | PR #659
* Fix scrollbar not clearing sometimes. | @DecklynKern | PR #643
* Add keybind for toggling memory display mode in PROC box | @rahulaggarwal965 | PR #623
* Minor string initialization improvement | @imwints | PR #636
* Made disks statvfs logic asynchronous. | @crestfallnatwork | PR #633
* Fix signal list on non-linux/weird linux platforms | @lvxnull | PR #630
* Add option to accumulate a child's resources in parent in tree-view | @imwints | PR #618
* Add CMake support for Linux | @imwints | PR #589
* Horizon theme | @SidVeld | PR #610
* Fix short conversion of 1000-1023 *iB | @scorpion-26 | #609
* Fix integer overflows in btop_collect.cpp | @dorrellmw | #546
* Support compiling with LLVM | @imwints | #510
* Fix getting zfs pool name with '.' char in freebsd | @jfouquart | #602
* [macos/freebsd] support gcc13 | @joske | #600
* FreeBSD swap info | @rrveex | #560
* Create adwaita.theme | @flipflop133 | #485
* Try get terminal size of "/dev/tty" if stdout fails | @imwints | PR #627
* Refresh rate program argument | @imwints | PR #640
* Improved error handling when determining the config directory | @imwints | #652
* Use native POSIX polling syscalls to read input | @lvxnull | #624
* Conditional compile on Big Sur and up | @joske | PR #690
+ Various fixes by @imwints, @simplepad, @joske, @gwena, @cpalv, @iambeingtracked, @mattico, @NexAdn
## v1.2.13
* Makefile: VERBOSE=true flag for Makefile to display all compiler commands and fixed so already set CXXFLAGS and LDFLAGS are displayed.
* Makefile: Added autodetection for gcc12 to make compiling on macos Ventura easier.
* Changed: Reverted back to sysconf(_SC_NPROCESSORS_ONLN) for Cpu core count ant let the new dynamic update fix if cores are turned on later
* Fixed: Ignore disks that fails in statvfs64() to avoid slowdowns and possible crashes.
* Fixed: Moved up get_cpuHz() in the execution order to get better cpu clock reading.
* Added: proc tree view: if there's more than 40 width left, try to print full cmd, by @Superty
* Fixed: Show the first IP of the interface in NET box instead of the last, by @correabuscar
* Changed: Replace getnameinfo with inet_ntop [on Linux], by @correabuscar
* Fixed: Not picking up last username from /etc/passwd
* Fixed: Process nice value underflowing, issue #461
* Changed: Replace getnameinfo with inet_ntop [on FreeBSD], by @correabuscar
* Changed: Replace getnameinfo with inet_ntop [on macos], by @correabuscar
## v1.2.12
* Added: Dynamic updating of max number of CPU cores.
## v1.2.11
* Fixed: Number of cores wrongly detected for Ryzen in rare cases.
## v1.2.10
* Fixed: Process tree filtering not case insensitive
* Added: Paper theme, by @s6muel
* Fixed: Extra checks to avoid crash on trying to replace empty strings in tree mode
* Fixed: Crashing when cores are offline
* Fixed: Cpu::collect() core count counter...
* Changed: Using sysconf(_SC_NPROCESSORS_CONF) for number of cores instead of sysconf(_SC_NPROCESSORS_ONLN)
* Maintenance: Code cleanup, by @stefanos82
## v1.2.9
* Fixed: Memory values not clearing properly when not in graph mode in mem box
* Changed: kyli0x theme color update, by @kyli0x
* Added: Elementarish theme, by @dennismayr
* Added: key "?" to see help, by @mohi001
* Added: solarized_light theme, by @Fingerzam
* Changed: Made ZFS stats collection compatible with zfs_pools_only option, by @simplepad
* Changed: Rewrite of process sorting and tree generation including fixes for tree sorting and mouse support
* Added: Option to hide the small cpu graphs for processes
* Changed: Small graphs now show colors for each character
* Fixed: Getting selfpath on macos (fix for finding theme folder)
## v1.2.8
* Added: Support for ZFS pool io stats monitoring, by @simplepad
* Added: Filtering of kernel processes, by @0xJoeMama
* Added: New theme everforest-dark-hard, by @iambeingtracked
* Added: New theme tomorrow-night, by @appuchias
* Changed: Disable battery monitoring if it fails instead of exiting
## v1.2.7
* Fixed: Disk IO stats for individual partitions instead of whole disk (Linux)
* Added: Case insensitive process filtering, by @abrasumente233
* Added: Include ZFS ARC in cached/available memory on Linux, by @mattico
* Added: Desktop entry and icons, by @yonatan8070
* Fixed: Net sync scale bug
* Added: tokyo-night & tokyo-storm themes, by @Schievel1
## v1.2.6
* Fixed: Wrong memory unit when shorten and size is less than 10, by @mohi001
* Fixed: Use cpu cores avarage temp if missing cpu package temp for FreeBSD
* Changed: Enter symbol to a more common variant
## v1.2.5
* Fixed: Fallback to less accurate UTF8 char count if conversion to wstring fails
* Fixed: Small ui fixes for mem and disks
* Added: New theme HotPurpleTrafficLight, by @pallebone
* Fixed: title_left symbol between auto and zero in the net box is not displayed, by @mrdotx
* Fixed: Mouse mappings for net box
## v1.2.4
* Optimization: Proc::draw()
* Fixed: Ignore duplicate disks with same mountpoint
* Changed: Restrict command line for processes to 1000 characters to fix utf8 conversion errors
* Added: add "g" and "G" to vim keys, by @mohi001
## v1.2.3
* Changed: floating_humanizer() now show fractions when shortened and value is < 10
* Fixed: Process tree not redrawing properly
* Fixed: string to wstring conversion crash when string is too big
## v1.2.2
* Changed: Reverted uncolor() back to using regex to fix delay in opening menu when compiled with musl
* Added: Toggle for showing free disk space for privileged or normal users
* Added: Clarification on signal screen that number can be manually entered
## v1.2.1
* Added: Arrow only after use of "f" when filtering processes, by @NavigationHazard
* Fixed: Fx::uncolor not removing all escapes
* Fixed: Text alignment for popup boxes
* Fixed: Terminal resize warning getting stuck
* Removed: Unnecessary counter for atomic_lock
* Added: Percentage progress to Makefile
* Fixed: Alignment of columns in proc box when wide UTF8 characters are used
* Fixed: Battery meter draw fix
## v1.2.0
* Added: Support for FreeBSD, by @joske and @aristocratos
* Fixed (again): Account for system rolling over net speeds in Net::collect()
* Added: Theme gruvbox_material_dark, by @marcoradocchia
* Added: Option for base 10 bytes/bits
## v1.1.5
* Fixed: Account for system rolling over net speeds in Net::collect()
## v1.1.4
* Fixed: Create dependency files in build directory when compiling, by @stwnt
* Fixed: fix CPU temp fallback on macOS, by @joske
* Changed: From rng::sort() to rng::stable_sort() for more stability
* Fixed: in_avail() can always be zero, by @pg83
## v1.1.3
* Added: New theme ayu, by @AlphaNecron
* Added: New theme gruvbox_dark_v2, by @pietryszak
* Fixed: Macos cpu coretemp for Intel, by @joske
* Added: New theme OneDark, by @vtmx
* Fixed: Fixed network graph scale int rollover
* Fixed: Suspected possibility of very rare stall in Input::clear()
## v1.1.2
* Fixed: SISEGV on macos Mojave, by @mgradowski
* Fixed: Small optimizations and fixes to Mem::collect() and Input::get()
* Fixed: Wrong unit for net_upload and net_download in config menu
* Fixed: UTF-8 detection on macos
* Fixed: coretemp iteration due to missing tempX_input, by @KFilipek
* Fixed: coretemp ordering
## v1.1.1
* Added: Partial static build (libgcc, libstdc++) for macos
* Changed: Continuous build macos switched to OSX 11.6 (Big Sur) and partial static build
* Changed: Release binaries for macos switched to OSX 12 (Monterey) and partial static build
## v1.1.0
* Added: Support for OSX, by @joske and @aristocratos
## v1.0.24
* Changed: Collection ordering
* Fixed: Restore all escape seq mouse modes on exit
* Fixed: SIGINT not cleaning up on exit
## v1.0.23
* Fixed: Config parser missing first value when not including version header
* Fixed: Vim keys menu lists selection
* Fixed: Stall when clearing input queue on exit and queue is >1
* Fixed: Inconsistent behaviour of "q" key in the menus
## v1.0.22
* Fixed: Bad values for disks and network on 32-bit
## v1.0.21
* Fixed: Removed extra spaces in cpu name
* Added: / as alternative bind for filter
* Fixed: Security issue when running with SUID bit set
## v1.0.20
* Added: Improved cpu sensor detection for Ryzen Mobile, by @adnanpri
* Changed: Updated makefile
* Changed: Regex for Fx::uncolor() changed to string search and replace
* Changed: Removed all use of regex with dedicated string functions
## v1.0.19
* Fixed: Makefile now tests compiler flag compatibility
## v1.0.18
* Fixed: Makefile g++ -dumpmachine failure to get platform on some distros
## v1.0.17
* Changed: Reverted mutexes back to custom atomic bool based locks
* Added: Static binaries switched to building with musl + more platforms, by @jan-guenter
* Fixed: Improved battery detection, by @jan-guenter
* Added: Displayed battery selectable in options menu
* Fixed: Battery error if non existent battery named is entered
## v1.0.16
* Fixed: atomic_wait() and atomic_lock{} use cpu pause instructions instead of thread sleep
* Fixed: Swapped from atomic bool spinlocks to mutexes to fix rare deadlock
* Added: Continuous Build workflow for OSX branch, by @ShrirajHegde
* Changed: Reverted thread mutex lock to atomic bool with wait and timeout
* Changed: Removed unnecessary async threads in Runner thread
* Added: Try to restart secondary thread in case of stall and additional error checks for ifstream in Proc::collect()
* Fixed: change [k]ill to [K]ill when enabling vim keys, by @jlopezcur
## v1.0.15
* Fixed: Extra "root" partition when running in snap
* Changed: Limit atomic_wait() to 1000ms to fix rare stall
* Fixed: Removed unneeded lock in Runner::run()
* Added: Toggle in options for enabling directional vim keys "h,j,k,l"
## v1.0.14
* Changed: Total system memory is checked at every update instead of once at start
* Added: Continuous Build workflow, by @ShrirajHegde
* Fixed: Uid -> User fallback to getpwuid() if failure for non static builds
* Fixed: snap root disk and changed to compiler flags instead of env variables for detection
* Added: Development branch for OSX, by @joske
## v1.0.13
* Changed: Graph empty symbol is now regular whitespace
## v1.0.12
* Fixed: Exception handling for faulty net download/upload speed
* Fixed: Cpu percent formatting if over 10'000
## v1.0.11
* Changed: atomic_wait to use while loop instead of wait() because of rare stall when a signal handler is triggered while waiting
* Fixed: Get real / mountpoint when running inside snap
* Fixed: UTF8 set LANG and LC_ALL to empty before UTF8 search and fixed empty error msg on exit before signal handler init
* Changed: Init will continue with a warning if UTF-8 locale are detected and it fails to set the locale
## v1.0.10
* Added: Wait for terminal size properties to be available at start
* Changed: Stop second thread before updating terminal size variables
* Changed: Moved check for valid terminal dimensions to before platform init
* Added: Check for empty percentage deques
* Changed: Cpu temp values check for existing values
* Fixed: Cpu percent cutting off above 1000 percent and added scaling with "k" prefix above 10'000
* Fixed: Crash when rapidly resizing terminal at start
## v1.0.9
* Added: ifstream check and try-catch for stod() in Tools::system_uptime()
* Fixed: Freeze on cin.ignore()
## v1.0.8
* Fixed: Additional NULL checks in UTF-8 detection
* Changed: Makefile: Only look for g++-11 if CXX=g++
* Fixed: Missing NULL check for ttyname
* Changed: Only log tty name if known
## v1.0.7
* Fixed: Crash when opening menu at too small size
* Fixed: Cores not constrained to cpu box and core numbers above 100 cut off
* Fixed: Scrollbar position incorrect in small lists and selection not working when filtering
## v1.0.6
* Fixed: Check that getenv("LANG") is not NULL in UTF-8 check
* Fixed: Processes not completely hidden when collapsed in tree mode
* Fixed: Changed wrong filename error.log to btop.log
## v1.0.5
* Fixed: Load AVG sizing when hiding temperatures
* Fixed: Sizing constraints bug on start and boxes can be toggled from size error screen
* Fixed: UTF-8 check crashing if LANG was set to non existant locale
## v1.0.4
* Fixed: Use /proc/pid/statm if RSS memory from /proc/pid/stat is faulty
## v1.0.3
* Fixed: stoi 0 literal pointer to nullptr and added more clamping for gradient array access
## v1.0.2
* Fixed: ARCH detection in Makefile
* Fixed: Color gradient array out of bounds, added clamp 0-100 for cpu percent values
* Fixed: Menu size and preset size issues and added warnings for small terminal size
* Fixed: Options menu page selection alignment
## v1.0.1
* Fixed: UTF-8 check to include UTF8
* Fixed: Added thread started check before joining in clean_quit()
* Fix documentation of --utf-force in README and --help. by @purinchu
## v1.0.0
* First release for Linux
btop-1.3.0/CMakeLists.txt000066400000000000000000000141031454653170500152300ustar00rootroot00000000000000# SPDX-License-Identifier: Apache-2.0
#
# CMake configuration for btop
#
cmake_minimum_required(VERSION 3.24)
# Disable in-source builds since they would override the Makefile
if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
message(FATAL_ERROR "In-source builds are not allowed")
endif()
project("btop"
VERSION 1.2.13
DESCRIPTION "A monitor of resources"
HOMEPAGE_URL "https://github.com/aristocratos/btop"
LANGUAGES CXX
)
include(CheckCXXCompilerFlag)
include(CheckIncludeFileCXX)
include(CheckIPOSupported)
include(CMakeDependentOption)
# Make our Find.cmake files available
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
# When the build type is not set we can't fortify
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_COLOR_DIAGNOSTICS ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
option(BTOP_STATIC "Link btop statically" OFF)
option(BTOP_LTO "Enable LTO" ON)
option(BTOP_USE_MOLD "Use mold to link btop" OFF)
option(BTOP_PEDANTIC "Enable a bunch of additional warnings" OFF)
option(BTOP_WERROR "Compile with warnings as errors" OFF)
option(BTOP_GPU "Enable GPU support" ON)
cmake_dependent_option(BTOP_RSMI_STATIC "Link statically to ROCm SMI" OFF "BTOP_GPU" OFF)
if(BTOP_STATIC AND NOT APPLE)
# Set this before calling find_package
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
endif()
add_executable(btop
src/btop.cpp
src/btop_config.cpp
src/btop_draw.cpp
src/btop_input.cpp
src/btop_menu.cpp
src/btop_shared.cpp
src/btop_theme.cpp
src/btop_tools.cpp
)
if(APPLE)
target_sources(btop PRIVATE src/osx/btop_collect.cpp src/osx/sensors.cpp src/osx/smc.cpp)
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
target_sources(btop PRIVATE src/freebsd/btop_collect.cpp)
elseif(LINUX)
target_sources(btop PRIVATE src/linux/btop_collect.cpp)
else()
message(FATAL_ERROR "${CMAKE_SYSTEM_NAME} is not supported")
endif()
check_include_file_cxx(ranges CXX_HAVE_RANGES)
if(NOT CXX_HAVE_RANGES)
message(FATAL_ERROR "The compiler doesn't support ")
endif()
# Check for and enable LTO
check_ipo_supported(RESULT ipo_supported)
if(ipo_supported AND BTOP_LTO)
set_target_properties(btop PROPERTIES INTERPROCEDURAL_OPTIMIZATION ON)
endif()
target_compile_options(btop PRIVATE -Wall -Wextra -Wpedantic -ftree-vectorize)
if(BTOP_PEDANTIC)
target_compile_options(btop PRIVATE
-Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wunused -Woverloaded-virtual
-Wconversion -Wsign-conversion -Wdouble-promotion -Wformat=2 -Wimplicit-fallthrough -Weffc++
$<$:-Wheader-hygiene -Wgnu -Wthread-safety>
$<$:-Wduplicated-cond -Wduplicated-branches -Wlogical-op>
$<$:-Wnull-dereference -Wuseless-cast>
)
endif()
if(BTOP_WERROR)
target_compile_options(btop PRIVATE -Werror)
endif()
if(NOT APPLE)
target_compile_options(btop PRIVATE -fstack-clash-protection)
endif()
check_cxx_compiler_flag(-fstack-protector HAS_FSTACK_PROTECTOR)
if(HAS_FSTACK_PROTECTOR)
target_compile_options(btop PRIVATE -fstack-protector)
endif()
check_cxx_compiler_flag(-fcf-protection HAS_FCF_PROTECTION)
if(HAS_FCF_PROTECTION)
target_compile_options(btop PRIVATE -fcf-protection)
endif()
target_compile_definitions(btop PRIVATE
_FILE_OFFSET_BITS=64
$<$:_GLIBCXX_ASSERTIONS _LIBCPP_ENABLE_ASSERTIONS=1>
# Only has an effect with optimizations enabled
$<$>:_FORTIFY_SOURCE=2>
)
target_include_directories(btop SYSTEM PRIVATE include)
# Enable pthreads
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(btop Threads::Threads)
# Enable GPU support
if(LINUX AND BTOP_GPU)
target_compile_definitions(btop PRIVATE GPU_SUPPORT)
if(BTOP_RSMI_STATIC)
# ROCm doesn't properly add it's folders to the module path if `CMAKE_MODULE_PATH` is already
# set
# We could also manully append ROCm's path here
set(_CMAKE_MODULE_PATH CMAKE_MODULE_PATH)
unset(CMAKE_MODULE_PATH)
# NOTE: This might be problematic in the future if other sub projects depend on this or if
# btop starts producing libraries
# Build a static ROCm library
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
add_subdirectory(lib/rocm_smi_lib EXCLUDE_FROM_ALL)
add_library(ROCm INTERFACE)
# Export ROCm's properties to a target
target_compile_definitions(ROCm INTERFACE RSMI_STATIC)
target_include_directories(ROCm INTERFACE lib/rocm_smi_lib/include)
target_link_libraries(ROCm INTERFACE rocm_smi64)
set(CMAKE_MODULE_PATH _CMAKE_MODULE_PATH)
target_link_libraries(btop ROCm)
endif()
endif()
if(BTOP_USE_MOLD)
target_link_options(btop PRIVATE -fuse-ld=mold)
endif()
if(BTOP_STATIC)
target_compile_definitions(btop PRIVATE STATIC_BUILD)
target_link_options(btop PRIVATE -static LINKER:--fatal-warnings)
endif()
# Other platform depdendent flags
if(APPLE)
target_link_libraries(btop
$ $
)
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
# Avoid version mismatch for libstdc++ when a specific version of GCC is installed and not the
# default one since all use the default ones RPATH
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
string(REGEX MATCH "^[0-9]+" GCC_VERSION_MAJOR "${CMAKE_CXX_COMPILER_VERSION}")
set_target_properties(btop PROPERTIES
INSTALL_RPATH "/usr/local/lib/gcc${GCC_VERSION_MAJOR}"
BUILD_WITH_INSTALL_RPATH TRUE
)
endif()
find_package(devstat REQUIRED)
target_link_libraries(btop devstat::devstat)
if(BTOP_STATIC)
find_package(elf REQUIRED)
find_package(kvm REQUIRED)
target_link_libraries(btop elf::elf kvm::kvm)
endif()
endif()
install(TARGETS btop RUNTIME)
install(FILES "btop.desktop" DESTINATION "share/applications")
install(FILES "Img/icon.png" DESTINATION "share/icons/hicolor/48x48/apps" RENAME "btop.png")
install(FILES "Img/icon.svg" DESTINATION "share/icons/hicolor/scalable/apps" RENAME "btop.svg")
install(DIRECTORY "themes" DESTINATION "share/btop")
btop-1.3.0/CODE_OF_CONDUCT.md000066400000000000000000000064251454653170500152770ustar00rootroot00000000000000# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at admin@qvantnet.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faqbtop-1.3.0/CONTRIBUTING.md000066400000000000000000000036371454653170500147330ustar00rootroot00000000000000# Contributing guidelines
## When submitting pull requests
* Explain your thinking in why a change or addition is needed.
* Is it a requested change or feature?
* If not, open a feature request to get feedback before making a pull request.
* Split up multiple unrelated changes in multiple pull requests.
* If it's a fix for a unreported bug, make a bug report and link the pull request.
* Purely cosmetic changes won't be accepted without a very good explanation of its value.
## Formatting
### Follow the current syntax design
* Indent type: Tabs
* Tab size: 4
* Alternative operators `and`, `or` and `not`.
* Opening curly braces `{` at the end of the same line as the statement/condition.
## General guidelines
* Don't force a programming style. Use object oriented, functional, data oriented, etc., where it's suitable.
* Use [RAII](https://en.cppreference.com/w/cpp/language/raii).
* Make use of the standard algorithms library, (re)watch [C++ Seasoning](https://www.youtube.com/watch?v=W2tWOdzgXHA) and [105 STL Algorithms](https://www.youtube.com/watch?v=bFSnXNIsK4A) for inspiration.
* Make use of the included [robin_hood unordered map & set](https://github.com/martinus/robin-hood-hashing)
* Do not add includes if the same functionality can be achieved using the already included libraries.
* Use descriptive names for variables.
* Use comments if not very obvious what your code is doing.
* Add comments as labels for what's currently happening in bigger sections of code for better readability.
* Avoid writing to disk.
* If using the logger functions, be sensible, only call it if something of importance has changed.
* Benchmark your code and look for alternatives if they cause a noticeable negative impact.
For questions open a new discussion thread or send a mail to jakob@qvantnet.com
For proposing changes to this document create a [new issue](https://github.com/aristocratos/btop/issues/new/choose).
btop-1.3.0/Img/000077500000000000000000000000001454653170500132055ustar00rootroot00000000000000btop-1.3.0/Img/alt.png000066400000000000000000004626661454653170500145170ustar00rootroot00000000000000�PNG
IHDR��t
sBIT��O�tEXtSoftwaremate-screenshotȖ�J IDATx��y<���ό�c'K��R��"J��h/)�_�����T�JQ)�%�xUR��d���2�2d�1~ό�������sϹ�}��Yq$ �@ ��}��@ ��m@��@ �)<��}@ z������Q�ʼn�U��v�
}����J����@��?����+J�1v�[K�'��~�[������6]q֒$���K��H
��g(��R�0����Ă�ܔ�G(X��Qv��%�.��6(ۆ�P�GkW�_E�kv���}�=�^~ 6l�����ECp�g�8s�fB���9ؒ"u�7<�r9��$����T�s����)��>���.�Ԉ��x�ߢ�P�鮓$&X]�C�Έ
p3J�����YǂR)q���SS��iR��}�0�e���S$ ]�kobr(��Q�Ǘ��w�-�F�er6<37?��RE����̆����//�_�(#��UP�|C-���Ƽ}qs}�iӖ}4c�.��¬��mcH�;|��ऌ����7�7h ���.u�P�����
`�I�z���� ���f!7H��nˮ.PX�$;����v�@T_��,>����J-.//��� r�t,����z;�S>%#)��69���/
y��������#�X���C1)J�{�qm��tt�
E�1�*�>3j�����hV�V�,�N�Ά�#����|���ԓ����7;�rnSS�(��vr��m���8�#��Q��М���_`\9@EyE369����B���}�g%_�i�D�`_��Z��bv�����X���ۧ,�O����Pg����2�ģ���ܜO�O/Q�r��3\h�[���
k?����K��t��k��O��!�KYV*���^q��È����kVc�LQ���=��z�Z����"y��J�'#�(Yi�;��wN�o�����&W���F|�䅩
k�$��w����k=OƤ�ꇒ�ȼ$�u��ZcpPWK���5�-����DA7�|�yn�h������\3�3q(����?�A�~Ŗ�����JM�ȧ�%���%�_���w�l�m��h�s y�敂�aY%#;�<�|o����F�E��ֻ�$�ݲ��?���cO*���_ݦ٢.>�¨��oLӀi��
��J���������b���i�ao�y�Bv�Z������Vy�Zi^� x�y����S(m�o찡?�Rt��8���Ǭ�Z{D4t�M|�5�>�eu�m6"��J��E���xR�a|��Ze���K\���(,Ak��US���m��$tf�K_�W�`�N���uŨ�Ks'�]I��j:z�:��0�����k�h�!�M�W�����G�KB6�e�����7�m=���C��\��{f���)u-��9:p��*RNhv���S�E�_s�N�w��ab����***�F�(��4u4$$ı�)�6���x��o�eD?8�g�djYN��/f�彴�c�\�(n��\�74�[ȭ9j�ta�Ơ�E(L#���
RSI|�)�����|���Й�j���f�d'�Q�[tU�^�bȉ�����g�q�A��qv�L*Q���&�4��t��%�Drω�^^QS�_� ���];b�C��Z^�2�U�_WO�c��Ɩ��VKU@d���f�Fme�)�)��wN�nz���zZf�[�A͵o�
�hD�����at��8k~vF;�?�t��`ΓY#.����|ZV�x��s���3��fD��{@@L��(Y�#Gr�����n.W(?z�~5�//0�M$��x?�љ�)z����㑊֗ϬR흕���N�۲��\����(}��0��9��
�7�/P�%
��<���|8e-1�zy�����n~������|��|�3b���M���)�TGk�@y�=�7//�Ga�xm���GmO�uH�ׯ@C�ϙ�hz{�5<�H �$=��u�ezS��*9�?��p�AR���F�nr��8�0@Q{��q���"c
q��Y���^G����%�~0+�MbU;=������Eٙ9_��,7/�ʜ�s�t�ɢ��"5 �9��<���
��hx�l��χ����=DYc��?9{���蝸�B�����K���Q�p��~�N��(���A�Alx[B���1��.zȇ�'Cʅf��d81_���T����X8�j<��� ��{�u���u��2/y��{�%�x<��,#-��Hz�y�_ @}P]�.�/�Iq@}Vx�p�
�k�Ԧڸ���R�2lXa�ϻ�����[�{%q5[d�Y�_Z����
�Џe��r��
}W�Kj�WUM͢�~�U�����ZO�ׅ��I�aPc£�Ĕ�<��XZ_��0��f�G١xDZ*#yMѭ�� �N�}��X]fUU@T�a�����O&&<\Γ+k��UF�.�K��������B��5�E�ƕ��^�D �L��>X����p�=�5<��I��Q��?�]�/=�\���(4�h�'��_���A���f�̀��q���/U���F�j�RN�o��t:
�xG �F�VI>��>���FSuV���t�mxyyĖ_˜O>Aj��466@�e��j����Ko�1������It�
ۭ�����8��ۥ�F;���h��؛g�9�Hy�y�n ��@Ϯ�\S�y$�+2j7;'d�QsC=vyF�n�~�5�����E�/M��\������lT�ktt�!�gݗ�jR�.ƄH$��߯y����%Ϲ�_g��I����q���32�߆�t���+��BԺ/;ǨzZ�_�Zޱ�s&���)�獾?PY�� Eqw��Q���6��ˋӋ+����fH��y�u2��՞K�Օ�d�ʁ��N�W�@ͤ�Ff�[4��h2�69��-h�u�u��K[::����e��wݿ�7���.;CDq,�J�$_�䷞.g�b��`0g1D"��:��ԾRi���6~1q���:M`�z�ա��yTO�J�/�ܒ`�D�u>���(X��ס���f�J��-�@�ш�vkN��f����8����������LI����0�n�Lof0���|����ۻ�����A|��0Qr?�{Ϫ�؍��7vņQ�%�ʹ6>��VAA�dee( ''����)HZt9�sV���ѹ��j�0�<^�r����{
��� O$�0����@�Hh�d�o�,k��ڸ��0;�|s�[/lll(�ߪ��R@-�^�����$���F��:sa�К{O�~����ٸ�Q�%�jdCf����7�:tU;#��Ք��2D�"��
��HXV�5��Z�Y1���/u�#��-��ߩ�w�7�ɣ����]3��6�
G�/H7'm�H$��:M��mq�qa ���j������Ӧ���aS�3W}c�ʢ�*l��4\�����
��k���~��D"n��@�R��E2�v*�guZ��T���l�W������hhh`�Hp�e%ȱM�$ف�^�C������:���,��8�*��b=�I�C^YI���26ɈF�3{
�I��+K���^�ݛ$0�����r�uD�E[�v������d;U��[��.�LL_����6���x҉�Ƙ��$���]�9;�_�VFmmu���h�w��x�殓>��ۄ��y2k�F
�#�l�u+
p����
�߭�*ANl�8(ꚛV�?z� �Q�qëݐV�R�J�hh(i�c�R}](M6_J�ilnj�Ȏ ���y�2vӝ����,��ϗ}�� ,��MU%%�6���R��ǀ����Α�6�E�����~�^ӕ��HyBb3�|�Ʃ����>�,2�~�n���av.�xV�
�z�)I��ah�BC"� �9�dJ�1�?��ȡ|������А�5���["mb�%��3!-6�f:�l���wd���5*�9����<�% =OЈ�S[juݽ+Oc(兔�����O�n"�"�鶬�
�LL�[e2��xT���+�?g|��;�p8xD I2:8Z=��Za���/%���ui�>��{���nu���䣄T���v�Nfb��"Cճ�0���N����#�7�LL�3[8���$���.-�.�w!RSvg^s�<�U��[�\aҐ��e�b�=�5��D"�<�s������[��2p���|v���������@yE׆A}�A�����DKljU7�=_���tk��-B���!b��^9�m=�u�^Z+�_/da��k�:�{�ۣ�T���Ё���%9���t�~�����
E ���9��@{�h�!{`����u�����]���|��NSI�����p���ɵ��OF��
�=�Ǖ�=xt� ���\������e�Ck���+�t�Hnf��;�F���n3ᡅOp&�`]�I���wZ�?{g����Z�%q�5c��̥V���{�5��s@ i%��_t,�NNeJ�4ws3O;� mF!���/��� ���@jn*����_��X�?�9�j�ӞS3[4i�'��>��.Jc����o�ϲmK�5�&�;����?��0����Q�%�7j��p�Y���fpw�V^�(#=w*O���n$���!�:ވ��\�2����F13�+�5�%��/ڷ����e��X�1�)� $0�l�������|�s��q�����$��k��p�z����kv�k*Otv���m�q,�ף��>%1�����8�&�'�o��z^l]������l�T���ǜv{�%�[���i�Mn&�u�Q�b;�MskL�S�{�l�[@F���1�E�G8ny��n�6N��!
*������Ey�^�g�n�;����s^��I`9�����9s1�F����ں�!�ϭhɵ���%�֔��ST��# �CT���Ի<ą�=,矝h��5O�>�E�)����;�;�8黻�8�巸��go:?���k+���l�8������6���;�Ϫ}��W��$o�Y����5�ݾa�a#�������;��B�<�_�����I��c�/8�����w�=�8��Q9.9�Iq���N&����*��:m��OQ���������Lyq�TW������[< �^u,oD@ ?��r���J�W<����`��=#�q8ٱ��@ zJc�M��}��@ ~��ey?�_�K>�@ ◦��? m,�;��!�[��7��w$�z�|�m�r�/��m���Z��cn�$��G��~7T��F�ڻg�m˹Jmr�7{�%�_N��]@ �@ ����@ �S�X?����+J�1v�ي�T�.-?#)�{��,��ѡ�����;���E:Rmn���-�ˎ
������1ye��j���
p.���SK��~INcAp�_[ɍ?���u*�$p��ϩ#��}�@r�յ��Y����7s
�~�:�G
��^��(;����:���H�"�7�WB
٢�Z�w�35�ur8_��r�q��%#)��6��Ca�z�TJv��|�nEP������<�w7�����>�b˿��r��υ���R2���3����е��&&����|� ^��C1)J�{�q�+�aD��������$:@y�����[��`�ɢ������Z�'�8�)������6�Az翜ւ�Ȼ�n���fAUU��9�"*((2�,��%���<2��y�y?7��Ȼ�n'��-���b�:�w�-�F�er6<37?��RE���?gL��T���m�ձ�S��DCiV�[��!��?9+3P�E�il�HMLjVTmwbBXCo*9�Qhq�������2����ɡdg���
%���ԏ{��
�<�CM80s�N��m��e�C�hX�2��mv>��k����\P���t�D~���B��)i��5��u��~�N��e���4R�U�/�DŽ���@�L2p���&��,?��"j���D^6�Xh�y�&�U�m^����@|�5�>�eu�m6"�>��p�5�gd�7~WF���t���'j��VW �l�Ԝ��x�$��'�=�Y�dx�ݼ�W{R9����6ͦ��|��/'0��oKMYY~�����c&6Y�M������������D"K����,`4�,.z��.]t5��uQz���ݎY��zb��CWo����ύ/
��Ζ�ys�+�)��om���x�\6�������Y���Xɢ��"5��9�;�v��r���ڠ{q݊�r�~�=�)�/q�z}��P�d},T o���rr��~����r�{>oB�G9L�6^[�T��0(�s���[R��͔��яAz��^�K����E���;~=@��9_���_�yL���.�����-F��U2V���̕�ϋ� $�_Ny�ti���B�Hf����A�Sq�
��k������*9�?���uc�IJ����ar�@`0<�R�Ҽ���&BK�?K����N�ˊ@��(ce��bj IDAT��Z�Pq���#X�j��YC-1��l���?q���F��B���
���c`}��&��ʛ�.!~
�[?��ˋӋ+��{i4���T�i� f���#^g>m��0�ܻ�O��������?��� �O]�'�ٹ�j�!����9X���W�n�6X�D���0�X�t���r���4iws}�g�Qu���>�~�顁� ]�v����&����~����-��9�|� $$D"�No�\[#�!X�l\c�ţ�ve����wl�+s_n�W�R�+:�I��
@g��� O��h�C����+-?-"�
w?o�K�u�+�TY2���Pp�x�7���ct0�7�MMt��=�~���D���Y�x5y��Z��w��SǍJ��6����^��ot�����5��(*H�]O�}� 3�����ht��i��G�J�*��Ӂ@�h���-��Y��1�&4�c�`�,�;���@����VH)�OHoj��l7���N����OKt��{"��'++@99y���|��>�F�\at���Ò��+���w���wI�V<���� �����v��?�TP��hjj��<�M$���F��:sa�К{O�*���(ɜ�<�8Iɶ��i���N��Sf���N5��>O
H؞�֪}��|�����xx�2����Sc#@��V=�H�|#�1�d@ |wQ�'D�
��@XXd!�����`��ґՏ�����:_TX�ga�~�э����yL8���0�YIO���|� }��y-~ZD����z'�����Yt -��AscMe#@K���������ڎ������4���`����(O|.k:sd�ݘ�I�1d�R?!���Q5�]������e��h�\t:
���`ٌ�W�ʯY9�=<����X6I�1F0L�ځ>n�-��ѣԇVJ���^���A�h��A����Q�V��<_�H�ӟ�Gc�P>HlH��fc���>����X����S�O�-���悕�a: �g�u���&�����~fD��%ZӦ��ӲػHவ�SJ^&��z�:Gvڨv�4"�P���X�0h@l�2+����;���W������p1㙼��&�9
5Y:����N���q!z����f��.�,�DD
��_�������+(�J)�-���ET��>��Ka8�Ckʌ��j0���}�㰡ddN3Z:;������� ,���*1����l��[o(}�!�
{���#�XY&3.�
ϲrHJ^:� &�fe��Qȹ�BYg��33���M�J�� �&Nk��*�!�IMm}tL�d��]�ؼ\}�AGG�Q�b-�-`>CWUV_W���G� ��O�f���W��:[8��J��U�Eu��^x���b���s���Nt�?��0�O����߰�b��o`�B{�h��t����V+t�.���<
���]�3c磦1�$�$���1��2��폿o����_��l۩+��+�V9�bN� aa_�ks�Ddt+�I����O������\i��vr�y��N\��a����NF�����e�U�_u_;�$���:���5�XPsƐd��y�ӈ8B}������h^iKGGCY�ؚ9=�(��l�,��e���4�i-]:���O0��nr��V�m���ӜǤ�|MI.LMJb� �ej�g��u��`,�t���P�j��z�:})[�WYN�����J�7[�h�O�����nV�O}��4q�*�;�@���|_��r���e���t,��a�<��5����r�bc2b#?����X��J��6�G0���}jj�yy���D�6bZm\��q�Gz��Y0w�D�����ڊ��5۰�v凂���h���v������~]0�T/f����'.b��Kګcj�����{��np{��Pn��w �6�Ѷ����&�{s+�Y����}f�ui�WI�#D�ee2���s��^D�@��7�ߊ@ zN��p�c_;��oV��k'z�?/"�@ �? �@ NA��౫�ʍGu�leŧ����ʪ"ε~�$�*?�f7�~h#@W=�GD�=z�J���o���o������@ �@ 8��@ ��� *ʋ��?
>iyi�������vxbaqvR�M�Ej$�ч?Q��(�[�^�Ly]Pnʵ%�^5����]>!)y�����bSȹ:���в�B��l��5W_}�K�������$��.�%�e�2�/�>wa�cU�uDߣ��z�
����1W�K�l��t]3K��(�_r2c�#�]@L��Zv/��7���Oa�KjkD�o���� ��'?dR��^^�gd�A��t�{�̚'������x��N/��7h����9�~:����)Yiw�go����<������/?��WG�{�h���+tv]6+=4c��Y���mݿX
�������k�{|�z��kjo�m�죞3��L:f������xV���3�X�A(��m���Gd�G(�^�x䰙�<�i������������\�Y�UE\E�
Q��f��du���c�%:j�JH�=�贍.w�(��{���Ba~���:"�� ��RR��m?1A��b���(�=wP��|���Q�d�c�x�&N�Y=?,Y�t��[���v��N_ׁ������]i��mī���&�|�~q�4V�8o�68��G��g�覇 ˔��~@�$EE�!���UY!�-��o�^3�g9?���KO�f5�̺p�K���S{�'�e�^^��o),���<��}ʷe�7���p/u�)>y�D|jfv)%�c��+�Z�O4��|�TH���t��w��h�*����j?��N��ν�����Ӿ�N�
R�!>��+�Jc���)���w.�"���h~���U��jX�6h_^���S���e O���-uo?���As�*��W�nB���}�g%_�i���NvΙ�J���k���7�?�շ�RRZ~OL`%�9~bA���}=�Z�P��Q_~����-��=?UL�I���&37�+?��rfcKf�� 'W��Z:�K��H�*�Wys�t��9��uL��rP넧�,�e���Y{+o_7Ǚ[�A�DQ��ɫ���\6�L��&�_�Y���qԀ!�j-/mͲ�LM�'�
U3�e*DتI���;�O������6�ʡmF�0`���_u�T�L�95s�*."���"J�X[�3+���Ϣ$�G)�����F�jև�F:{��]m���ĕpbC�ʔ���׃��J��II�z|~�&˼����*�AX�;����F��g�[���qL�'I��T�U8U���E!�xnX�a�ܭ�_٨H-��O�i{���uT�S�3�w��c����k�s�@[g��D��v��9�������;W�q��Dc��ݤ[G})]~�y�����%yi>:/v]O�* ��yq�������v��
���y�2�"���瞛w��欜�'������G��?��@�����oO��e��"����j<9Ks����]�L�X�3,za��2]\�7��?V�&����&'�:��"�w��n2n���w�F)8�=�Ρ3�ҋ���c��H2;ς�ƞ��"����� �~@�
��ܶ�3|��A{}Me��D�u>�"#�EF�TC��*���#��`�잚j/������y��и�o.M����e8�
��J%���DbcC�B&���>~o��ة�&�٫��bv��:���c�C�f��Z莞�\�XQ�����������{qÆp�:fE7K/��uͱ
Y�@�����䥥�ˎ:.�~o�:Wa��E�%�sO�s��>���ޥ-9�_$�'��vZ��zd��t�Mt:�A��x������f��ќ�q�Y@�ש;���asss�����j�^]����=�m:à��'~���
�������0���,������&dQ9����<��Y�co?&�Mx:�X^^+))���( �
<��h��r:�GM�U�����'hkO���:p�V��!�4Z#�=Vș9M}j�<\SKw�<[�t:w�����c�##+[XP��������"���ԇL���Y�Z�rl���5���T������p���}c�Z�VX�qw�����TǬ����U�ʭ/�c;���k��]�����_�I�����ȿ����t�� 9�w�4_y$�`�SR ��Nj��%T*���T�ݻ�������꿒�mHB�B O>�$� 9�A���c��ԀuR��K���V�,\ʺ}4eŇ����²��X߭:�܄T�`�Ʒ�\B��m%�]u"����,->�Z����N�%�q8���/�ۻt���
��4�s{
��*=7'%)�����YG.��
�#�k�iV�ƕ���˫
�
���f�a^ ��U�"��/v�Hu�?J���4����N6�-k��-/��MӅy��.<�0iL�5#��!ϲ%��oΞih�f��Ƥu�#�@ �_��@�����oO��ep����Iy�����6/�a(�0Mifyڭc���u �ڝnO�ܰ|�ƹ[}��b?����_��˺�9b��3�`�ތE;��]�7�e���jEA���ۢ��4�py�^
M1�7����Z�r�:�*�(�i�;���$��s���x^����"����~�-CRSSd��y�
�^A�Q��+ˡT��_�@ �?��/���5�}FӍ^�����v����9��ԳM�gTx����S�D"�No9�L�шĖ�hss3��A [ũɏ}���g#))Y^^ѥXcEA^�T��{q5��T�0!�$�-=�剛�ڏuSǿx;���/ǧ��f[W[�7��m�ܹ��.mq����F�����u�~���6��嵒��]����?TP�bb�
淣#"���70!�@�I��������صlht:O��I<����:�H���슨�,��"""]I),�yD�?�Sy�a�M��@3�����А�
C8D>�z/(���o�N�ձ�7�1������d�K�����sVO;X���B�@�����Nn�GBC��6�[�@ �����_��ffb������$~��ƺ��Ė7����O�e��ѭ��-n�V[���Ó��z��GAN���J�.��h�����e�yI��+�k�D����<�v���*F�ճ������m���uaUI^�r�@)"���R���Ά��JY~n}�uu�����`�J��Rs��W�W�<��ߛ\^�@ �@��|�ͫ��g�m���謤����;�27%O>�$� 9�A���c�['�ei������^r�'R����q��ۯ|�өԒ�N:�^TjI���
��m��ܔkK�Tu]3K��(�_r2c�#ǵ��7����?q'Sb��籥lF ~,#�J�M7T�kOX�S��u~�J��Qק5�۽Θ�p!��`�Z��y�f,3����\M�~Č�����
�=����z��@���BX�K+G�j�rMiWX�䘥���_Tg���rM�@ �rx������~b�,�cVy-���$�Q[V\\V��M�k��;�i�ǖ~?�W훗稧,�8�ȋoۖ������F�����P�M��g ��Ĥ�W�`+�A�ǘ?SvrYݶ.�{|�z��kj;�DGmY Ɂc��������.��w��Nn;�[|Ç��8�[0��
ɲӦ
m�cI�Z]{�C�N��?�d/��}洞g6��M�|y���G)�6�����obr(��nfCI��%��=�LΆg��G]\�2�<�RKZH(X����5d^
��7���9_����
�E��r���]�
Iz��Hp.��q�������O�*�L.YZ�����C�t��B�����Kn]?8�R��q�o=�%s��q (Z���PKSc��^��hUb��MO����t;6�g#��v\JJB���i���(��̢d�Ex��bI-��WCvc�ZB��f^7��f�F��D��1`�M���f&��O�soˬ*+k���nhf�W}m�*/k��.���j}}I�O@���&IL����p�#����4�ʡ�s�����Ҙ'O�C���m����;�9�'��F y���@�� �f,�;cdrR*������/d��ř�!k=.X�q
�
��6��T�N4'@2l�*�����0�\�#:/3%����E[j*
��GN�"����:I]\B��$&b�
U����!�ǃ� �VM�L6��}�� 1y�ԸO��y���� $�_Ny�ti���B�l#�%�mޔ�[�F�}[���D�<��ϛ����0l�� @C�ϙ�hz{�5<�H ��������vy�����X���GmO�uH�ׯ$��������?~�XzسW��r��I�[���������z�,)�htf7�������n�o�,:������� jڸ���9s�u3����&�pl4��[=_r}n�ҸV�t �$=��u�ezS'с�>.ȍ��^�����8�Ju����f������ry�JUS����ci}m^��P�a��,�v��s~_Z�5���4Vr-�xnX�a�ܭ��ux��ǜ�ZL5�>�6��c�/@�K��&\�T����e`Y6�p,$1���Cx������/��v#X;0t���Ⓖ4���'q�}ׅ�7����.��1�l.�#�_��W5��=�X�///���k����'BB�,T��h4:��4��k�J�����x������q��q2C�'��?�x�z���a�g]��H��Pw��?H[�\�kqB\^�^\XIc-�#;���O[�>�>�n�D�S�u6���l0��BRWO��{����~���Yʙx�@��΄d0g*?�=z�ܕzg:�ɿm��&E��G������+R�7�����:ߥd��G4co�잝^l�ޢ*jN�8�l��^��p��H��[>aL���ܪ"4z�YW�DZ#^D�te����'�[o~'�Mg'��_Xj@�����e�|f��lԹk#��TS'�6�z|3+I,��-w�Vy���� ΟN�Y{���8�L��,�g��-�sᦽ���P�ߞe&&���:n˓R.�"�
/o�%K��;o��1Ǧ��F�r���g��b������ԵKK�/R��$����ddoE��"�d��/�[2���4Ei�q:��v����k������}��y���yޟ9l��0}���-��a-//�P����jf��ˋ~�(,�(���6�bj�/|��D�1u��u��J]n'R333��� �����Q��/<某�/�o6hr�����I����ק�\?��Ɔ�7Y�iN[�v��x��g̘=c��W�Y��g��[
�;��
��w�IN�AG�$�Kp����w�!�8ʽ��夏�����lrP�d��U?4����Y{܌�b��uv2{�q^]�<�PO���a�g,�an5�D�Ͻ|I@@��dV����V��eˊJ��22y���b�������$23i�Ճ]���&�/��M����EI��Ͽ4)G�ڀ�9���d����%�}�3�ƌ�*.�[�m��-;�DŽI�"�`�[����YF������GC�HCc���x�EJM0y�⍓MI0 �� Nu�zt?~��ڣ;��T˹JeAGWɑ8�����UF3������o%0�L���Ԝ ��A��_Yz�OzտLK&@Qj�O$
��w��z����$'Ԡ#���0}�t��|ԁ�ll�R��W�Ӛ`��Pu����%����#��̏G�,/LkFʤ�(�y�t/�na\u�[�����X#Ÿd1vrr6??E�{72[H^�HŢnj�₩?�^{YEc�i�m��W�ӯ6s�:��訜��Ӕ_ye ��>q�ק� l����S�}5]>S��'���1����߷�V/��+Kk�ҡ!�=��'�2�L�{�k�n��w:�.�v�-P}OA����v�*�|������BK���xo���$��b���ұ���]>p.'*0 d{��d�x��6��% �{iqڛn��V~v���Z���m��_}�����wO>斖d>���ŝ�o%�o�~���g��Ó��xk�)5��tt��FE}璒�A�t��Q�U��
�7��]2�z�)7n��랕��W�f�hQB��i�Q��[�Lφ%G��S�Zv�]�3��؞2�ڇȏ���WH������O�Q���N�uȘ��D 3��������'5@n��4F^��dN���B���*��i\fb�MK�Ӧi�~�~[�)_^8)y-���'���2ϯ��l��۸�A'�}X��Z6T?��h���0:���V�*��0:#?5��C�kk�7����gAlW�:�~��M��ӦN����B�.��nb�/G�3^�y6�u������tK[����ԃ�]��:�A�n`�o���;�x�?̨���Ro���>W�&ꮿ���x��o^���:��!�B�c���j?n.Q��ѕ@!������B!����B]^��'�I��<��ywtП�? �B!�x���B!��8�̏g3���vͪ����1Zs�'4!+-������pފB!�5�~j{�y욮�xy�ĭD�ug\��vt�B!�Ps���=��#$ �ʖU{\ל������}�B����Pۓ��H��H�Xl(^���uB!�B́�Ծ،�����B!�j&��6��HB� *�.+R��J+��� ��T�<�~��y�$�=�� ))�ls#,$�e�y�B!�q>�蟿z�L�e�b�f$v� �+�� ��N��ϭ�U���AP��7���+�B!����Q�;z�,n��jDz8,?��_B��x�q��)������-|ub庫Y]'�B!�������\�C�V����u��kG�!�B�^��B!���B!�B���B!�B�W��8�B�A"*�����m�Z�����>��Ka9��y�Yq���N��<�����=y��Փ{5���� �S5�s4�m�/f˪�P����B!��p��B!���H�*J]��"(�$'���8@m�Ǫ����:��mz����j3�Ź����8ߪ��>�e�i��fR[1O
G����ͬ3B�F�U��x��feg�ǽ��ŤvN����I�r[?A_�\z��:�]��y����I�LR�^�&o��MFV��'�k�fՅ����}�>�����AB�v7X��%��rk�y0<G�˥�V�%�1��kR�'��'(����oꏛ�GX�P��|���:��%��j'ǎ��;�gG��)ՙ3{�����Ow�9��2Z3O�Bͥ6XG��(}l�Lw6Q�W������)�6�䃐��Y
�K�q^�-=�������ezn�3?���'����Os���ӌ��3���ܣp�FW���}vn�*�)e��7P.N�P����س��W��HAJJAJJAJ}�_�5�0?zzܛ5�����8n6*���!K§_u��oNr�?���b�MU3�?�c�'S��-w�f��3IaҿA����K�����0r]�h�먇�8ߍf3��d�][җ�Iy�se��o�TX����3Շd�zZy�LK���l"U���d��s{�!�@x���Wh��F*��-+)(,c�J~���@��;,g9�߯�y[�{�Χ�V����>I**�ͺ���J����C?�Bⴝ'�Lpy���p�ְ�9��Ǝn��<�Ҳ��ߞ�lޓ� �vY��5�ʫ>��x\�a���;W�s#�SRR��~Wτbf���W��^�dyk��3Q�9yT�E�M��`����y�m\����'��'jQ_b���9yܠ�踎�j;�g��s�c��ל=��a��_k�����!K�Z���K��<�n���|��w��@S�>�O�5�Es��Re�TS�$���U������.����C�7��V��c�kX<�k��(��k�����!���~�(�X�6kl
KO��xc�r���b(�xp�ylA��d
���C���X~����E~.(x�,P��L@��L����lN��Y.��CV��3=X����n�,;X_y�R��ᴽ!�#s�j�b>sb�݇��) ))&e����������Z��|IT��� Q��L�""s���lx�����驥�"\�B`��˛�w.<S}�Ӹ�p��1�˲�"�>�=S���}�����mu0���W��uAmF�zF��;Q�Ro���u·��OY��2\��]q��QY�Z��Z�Ms�쥭M{q�CNiq��C�����_?x#��U�%�c3�!���b���:u�b5.�t��d�(ӱc��8F���kE鱝w�x(�����lzz���ϖ������L$G��>��u���^��ߞ�
+`U��}#=HG��w��d2Y�*/'Nʏ~yf�ֻ�w��CM�gLL�S$I�X���m-��u]�[�qN
ns����&�6}WP��m�o0�t�ɸ�4�-R�Zs땭B�ܡ5z��h�p���qq�
=�8�����P���{]�fٷ���g���ʠ�A6����i^��ɬ�����p���]sa��"�k�l4?O
�R�YQA�4,�{���_����l!ޫT��w��[��e��ϫ�o�oКu#άK|Π�h�1W�U��{mx;�h���D1���o��Ǣ�)\w��|�7��5�$�c�ۋ�f���,�牎#
�>���}<���R(�e��3*�"Z�����B�ǎ�s�N��]|�+U$z���u'��c�222yy�u�lv�ߕ�������8?}-���1��+Vԫj�Y'��!MZx�^���^�_��ۑ���p��+j��[c�\y{ʩ�J�ep
�q\��"ϭ�]��F�`ӧ����g���T��g�QF̴L�}�x��O�TTp�Zs�{�,�D��A�`2���/O���gVԿ���UB�?H�K�����M^<��m��l&��T@ee���{���RT]�"����*b}���H5إY>o���(����w�Q�F�����Lm��g�����߿��s5wk7;
#.��0�:p���zǎ,�v�p~~���x݀�<6����;�
FC�S����]�����=Z@y����k��ѻ@�q��:n��8���g��-;���H^/'�~���>�ɯ��
�
��yè��k���c��L�s��h��_<���QL����"?n�ϑ���pЄD~|��0<�:ƙ�
K��ۧ����ԑ{�%dƼu����`0>
!�xzd�U�O�2#nZҜ6]H}<����o b}����7kb��������ݯ�=\��\f�iܓ�Eu�m緦[�����5_��ݗ�1�`젇�L��3(>&���ܝ[�r;xT������u���ϭݑiy�Cb��K_��[��̲ꏆE��nO4������������1�O�9~�=�&1=6����}�-��_g�?�_�I��MN�a�1�۲�[L�z=x�hu��P��r�Du���!��A�!����C��!�3M��^��n#�������!��5�ث�ib�P}�f��:̄{v�����K=?���!����搕ѡz�>�����d��҃[�����)lA����J�~,,�v~|��<���f��s�~x�����p�z����Jcoۙ�n0�4
+��/v�^���W��^��{��Ѱ�o�����r��MN�a�1��U�YYy|B ��,���P�IL�2|��]���D!Թu�r95%��Ҽ�[��lF��;J�v��G��W�����ڥ��}�dQ��%����Om�P{ʿ<���.�g�!�:����n� }��1W������� 5a�+J��r���f.�B!��]if��cuQ%���������n��jOscn��ݒ��y����o�Gj3]���>w�*!���z**W�G��m�Z����}ۼ�I-�.��������5����:vT���ܒ<Ռ�����k�W��
���B!���B!��ITEI��+�V��Z�>.�?��g�椯 IDAT~<�Ag0茜����;�*�m7!�P"6�#7���K�g��ri����Fvt��Ya�~�����{,$����,��\���n��\Zn��� 1d͕�i���`�m�r$N�����'��O��M����Mm�wZ쥙�:�ګ7��v�zs��X��������v�\��n��ڹ���B!�ڙ�`I�
�͑�R���r�嬯 %����M�ԭ�in����c��v&�ڼ�B��*ge�8v�����������F?�-W��Xi���&h�q� \^+�a:���4��~��?�m����������.�$|�Uw�f����N�Co��1�K`��\�'�B�v#��
)�xp�ylo��lx�����驥�"���^:��L� �4jD_)iiΩ���)i�C��8�ջ��3�8j�R�g���������#�V�k�_?�zNְ�X_y�R��ᴽ!�#י��"�>�=S�����}��l2 W<�B����5��N]�X���{ik�^���SZ����_x��\Ux���7b
Y%_?�z����{f圕�&;�i�{��O5��11��J�����P�a&�o�p>�H���!��C/}�L�
<�;7H\���_��f6�r�_�b�'Ro���u·��OY��2U�
[�L&P���I��/Ϭ�z��iH\\�BO5�&/'�ơ�E"�����z �Bd���S�Ak֍h�#y(
�Y�
cfE�R�'�fW��,��B��Έy�y�/��ŵnS222y���K[��������������H������@E�w��z��F��N�'�>v�ȯ|�)���+���Fn�����R����$���?C��By^^����!���+�����Y]�B�Y�d������S��F]_���W}y??���^~
����6�0��n�ڹ/_���|qqq����X`m�V3�R��~k������҃�f˖�0ded�r��� � ���H���)<ޘ�{#7,����¸����;?�;���
����"yy��T��j'���6m�<���̎�B!������ѳ�O}�ͦ�J&EE)���+%$�8�¸"*�[U�x�~=�������"#��ck,?�y�����\�?� d��J��w�%�_+ݯ;v�e�H���
����#�����O����ˏ��1�U�|����O\3e�hs&���Ŕ{��)��&+�Y��
Z����������T�e��+�K@z���f����j'�#V��2����KN'��K!�PW����gz6,9�o��ײ�慎w��=�2c�:�^^x0�f�ύ���ȋ��\�a�E���C,�֝�>��`п�7���`�ӎ�U��Ą%��|�H�^��'�?�{��p�������~�~[�)_^8)y-������_7G��kx(��`���L�ͥ�3�9j��Z��7z�a;V!�a���]t�]�Q�wejG�!�y����ͭ�_����rsiI������*�}��r_�\z��تO�S]��c��3�����bR��*�{��'�h��ѯ.�$�97~���f��Fy����k���ޯ�k=/���=5)���I�M�vSp"*l�M�T�Zٵaa�]�����hϮ��_��t����/��s�6-)�)��SI��F��J���x�VS��j��;yI��t���ڼ�P��
֑����)����(g}))��oZ\,�I�q^�-=��c��-ӝM��U�2�&��~�(/=�Gᎍ�Zo�Eo���4U�Sn=��j��5���`�j�-������(g}i�ކ�̏�7nb�[k� ���T�R���3�whڄ��q����+�S`��4:#��N%�e|<;K@z���7ᩴ�ĈGn��Wͫ�����:,�������"-.�-|_���&��'8��
���>�~�_N��K�ĸ&��ʠ�ߦ����Ag0|���*\�$�'�\�5����-���n3���q����NWjR=�q�ic�Ko�Si) ���#����Թ$??Eyyj�g�I������C7$(� �O�I��,93^yi��FUG �2��od?])_�HsWX�>19t�n��<�Ҳ��ߞ�l�S�SA���� K',�̯~Pvn���Xs;�杁�5~���B�n�_�N�U$\���@��2�A�\�8Gf����ǃ���B��z���[Bԛ�+��H-xR{��Ag0hg&�����i��o���9LJ����(X�WS'�@u�ћo_�ٜ�����ȓ�dZr|��f)��1;���h��^�3�i$[�ɮI��;���� �y[�{�Χ��斕��Y�?�
�r��LtB<.�0J�r���+��!;A#�!ﯸ�ыKs>^ػ�7����V|��IRQ�i�٭4P�f���aGq���KM^b�s�Nx���v�Ê��%z���|!��\;���{}�e�ċ{>��es��m��{=vNUJ����[�VGO��lJ�*#G��T�˨,~.�vR<��B5d�T���Ns��Se
�E��-�TY*��M~�\�뇬�Q�gz�x�9{ݚ���&"�S�j�G���ի)�D�a�{�И};,���l��ߤ~K�O��S�^�!DR�'c4���2#�V����X{
w.�<���3aA%џ����֙��]��癿���8��H3��>p�Y�g�Υ�����Ӗ�}��
Q1X�%� q',�� A+ 3����2.���\%�״ҁ$-����?�>��7&Y��pz7�"����:g�۬��),=)6�������$��������Ҿz�kՇ�YjI)鲂�U���N���~��G����iuo�y��p�n��I@��M��
y����I�z�XEE���ُ�8��T6}��D��'���;���V0lމ�z���գB�%�]�oI���=S���O�W/m�o�w������7��t�!,�$�gl@xPX�H'p�?�~�襫'ywo{�y'��Ә1F����@�.����:Y�����RN���a�~����Y"b�$>����(O�ҋ��D%eq7**�A�Lap�2?����m6L��I�Q�*/��8� �\d2Y�*/'NJ�~yf�˪�9&o��$�%P��A/((�{+��C�0�-7|hY��o�**�ET'�*4\�Z�\�|/;�hrb`L�jwk���**�e�ϯ���|rH���G�HAy�`��x.3̐���5�!��kQ��⯖���IMd3�:�����VA1\gk�@��n�'Ǔ�����6�Ů9����7k�A �&�������g�o`�1�F��{f�4���?�T�.Ev����������0�i]�=Y2�~�@��n��#v�'�H��z��&h�5�r��~k�W��r$��N!��j
dr��x}�H�������1�f[G7������f�����+o|w��`�o�]k����l`�*�L�9�Q^^��-T=He���B��� Lf
��`m ;�c���Ω�u��(��2��@-J�X�:��SS����{cvu��%m�z�g��! 9�R�&�@�n5G��u�!s�͚Q�$�xWg� @�����U{fu�ѯ�E�g?�ҫ�M�q?��w�S��?}�y�镼����~L�1��\���z;���W�H
�rݵ�N\9�䭱��-�� >[&3gȢ��u.�t6?� ��$��.�VQ�Ӗ��*%t�::��KJ�_D��T�@�3�_s�uy�I���,_0�`�|?��T�{��F�&�Ȃ���K��:����yUW��
Z�nę�o�r��B�0��{}̊
��ů�t��p��O�('�+���2f�<��iBE��a�ۦ�ha
���T���c�,
��Hu���v����qlv�ߕ�������8?}- �?��7���<`���L.�i��b�D�1����
3L5����xS�7��������jvW~a�U�b)//�Fᯍ�dV@YYYM (N�O���1������l���b�~�+��D�#�$4!�6�Ҡ.�����w����y9�8�V}U���zm�y�Bu��E�����0]@0�,�#a�"̳�қ��8t�,o�ow�t�䇄>_U�-&��k-.�U�d��+G�[���Hr^*ߠ��D�
`���<�ả�JOݜ��? ��KC61���8L"��u���.��l~~>��LcW7 d�����>�yw[|���rM����'��t|]s^��8L�1�b��W|�s�Xp���A�mv�[�#���
=���`�Vqq1�M^o�.N(1M���m�� nb�t��EC2"?1�#%E���[����-5��I� 1�v��e{N\8�䂾M� �U��3�Fc�������@RT���ѽ���-q����Nʺ�� -�9���[�Lφ%G��S�Zv�]M��QM������O�Q���N�uȘ��D��>Xn��4F^����خV葕W�7>��L��iIs�t!
�ϭݑiy�Cb��K_��[�p��e�_e�����q_�N��vݵl���������ݯ�=�u�h�m��Ÿo��P'��VEֶA��G��������c-)=��da݀G
��}|��Ov+a���s6��� `&ܳ���X�g��hI-�U���A'��:�{,�.C�{i��o���D��8O�қ ����{݄] b�@��Fct.6#����s�B9Ļ���k�d��eǷ��*�O~���=��b�u)��ֱ���k���9�X�9���0���щ��2�� #������{��7�&]��t����eq�!�5�8j����L�ggN����Q�{�mR�m5����}�����J�����
��!+�C�"��3���(S���Ӟ��0½�{uY�fնʟ�\]�Bm����n�ʾEx������ �j'm6w֢:�U�ui�;Pk��u���%�7;�p�B�m�@!�B�I�y��cKJXz'|Rj'��(]ze�*=�P�V�K7]�i��yeA���_.�Jj�4�N<�=�fԤ�$m�g3R��xla�-O�m�k�:y��÷��Uk�U�o��!�B!^u��Y^�ʕ6&�xC7B!�}'B�N�}��dzt��`dfľ��<^��|�);O��vȺỎ��.3�'�e[� Ԋd�֜� M�JK��ws�8�j��!�ϐ���ꕶ��Ύ�z�!�6*�՚��x6��}�h���z�z�`��T=�|�=��E��n��3�c�x8��QE[�%�]�|�۸���Л+��4+ �,����,�&�������k�(�
�3��\��z���d) ?j��~Us�K�̝1��p�JC�Ft��ځ��Ԗ��g������y{j��#7���؞98�ZH;7_g�h� ���@P��x�c�t
��S'n%Rǭ;�:{x�>=�c�ӎ+a�پ'w�p����x:�);Z@c���J����j�=�������~�[�VҲ�n0u�F�F˳%�f��@���F��LI�p����.m�n�Ļk�1_0�@���N ��#�r�_�p�nX����r��K�M����{�/�F�5�����n���i]�v:`��z���
��d���VoPY��Ag�ą��\]^{���2i��X-6x琺��Z~'��yf�LS�������M�:������,顶�߄��R#���/@�;��ŧxz>����ˣ3��%N.�������o��ޜ_��
��2��]��N���/��xe��V��>BүlY���qͩ1ڈ��= �C+�'T�7t�WtVr��
���UN������'�?�f�x?~��Ͱ��_RG�|����k�@A�&�^z�JKI��uxf����t2�n|Π%F�