pax_global_header00006660000000000000000000000064146261723530014523gustar00rootroot0000000000000052 comment=86bf7bbc156bf38a0ca8be08804c1a4cc99cffa5 tuigreet-0.9.1/000077500000000000000000000000001462617235300133625ustar00rootroot00000000000000tuigreet-0.9.1/.github/000077500000000000000000000000001462617235300147225ustar00rootroot00000000000000tuigreet-0.9.1/.github/FUNDING.yml000066400000000000000000000001021462617235300165300ustar00rootroot00000000000000github: [ "apognu" ] custom: [ "https://www.paypal.me/apognu" ] tuigreet-0.9.1/.github/ISSUE_TEMPLATE/000077500000000000000000000000001462617235300171055ustar00rootroot00000000000000tuigreet-0.9.1/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000013661462617235300216050ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **System information:** - Distribution: - `greetd` version: - `tuigreet` version: - Installation method (from source, package, binary, etc.): - `tuigreet` command line: **Additional context** Add any other context about the problem here. **Debug log** Run `tuigreet` with the `-d [FILE]` option to log tracing information into the specified file, to append here. tuigreet-0.9.1/.github/workflows/000077500000000000000000000000001462617235300167575ustar00rootroot00000000000000tuigreet-0.9.1/.github/workflows/dev.yml000066400000000000000000000032731462617235300202650ustar00rootroot00000000000000name: Development build on: push: branches: - "dev/*" jobs: clippy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Lint run: | cargo clippy cargo clippy --release test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - run: | sudo apt update && sudo apt install -y libnss-wrapper - uses: Swatinem/rust-cache@v2 - name: Test env: NSS_WRAPPER_PASSWD: contrib/fixtures/passwd NSS_WRAPPER_GROUP: contrib/fixtures/group run: | cargo test LD_PRELOAD=libnss_wrapper.so cargo test --features nsswrapper nsswrapper_ build: strategy: matrix: arch: - { name: "x86_64", os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu", cross: false } runs-on: ${{ matrix.arch.os }} steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: shared-key: cargo-cache-${{ matrix.arch.target }} - name: Build run: | cargo build --release --target=${{ matrix.arch.target }} - name: Rename artifact run: mv target/${{ matrix.arch.target }}/release/tuigreet target/${{ matrix.arch.target }}/release/tuigreet-dev-${{ matrix.arch.name }} - name: Upload artifact uses: actions/upload-artifact@v4 with: name: tuigreet-dev-${{ matrix.arch.name }} path: target/${{ matrix.arch.target }}/release/tuigreet-dev-${{ matrix.arch.name }} tuigreet-0.9.1/.github/workflows/pr.yml000066400000000000000000000024551462617235300201310ustar00rootroot00000000000000name: Pull request build on: pull_request: branches: - master jobs: clippy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Lint run: | cargo clippy cargo clippy --release test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - run: | sudo apt update && sudo apt install -y libnss-wrapper - uses: Swatinem/rust-cache@v2 - name: Test env: NSS_WRAPPER_PASSWD: contrib/fixtures/passwd NSS_WRAPPER_GROUP: contrib/fixtures/group run: | cargo test LD_PRELOAD=libnss_wrapper.so cargo test --features nsswrapper nsswrapper_ build: strategy: matrix: arch: - { name: "x86_64", os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu", cross: false } runs-on: ${{ matrix.arch.os }} steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: shared-key: cargo-cache-${{ matrix.arch.target }} - name: Build run: | cargo build --release --target=${{ matrix.arch.target }} tuigreet-0.9.1/.github/workflows/release.yml000066400000000000000000000050041462617235300211210ustar00rootroot00000000000000name: Release build on: push: tags: - "[0-9]+.[0-9]+.[0-9]+" jobs: clippy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Lint run: | cargo clippy cargo clippy --release test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - run: | sudo apt update && sudo apt install -y libnss-wrapper - uses: Swatinem/rust-cache@v2 - name: Test env: NSS_WRAPPER_PASSWD: contrib/fixtures/passwd NSS_WRAPPER_GROUP: contrib/fixtures/group run: | cargo test LD_PRELOAD=libnss_wrapper.so cargo test --features nsswrapper nsswrapper_ build: strategy: matrix: arch: - { name: "x86_64", os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu", cross: false } runs-on: ${{ matrix.arch.os }} steps: - name: Get the version id: version run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: shared-key: cargo-cache-${{ matrix.arch.target }} - run: rm -rf .git/ - name: Build run: | cargo build --release --target=${{ matrix.arch.target }} - name: Rename artifact run: mv target/${{ matrix.arch.target }}/release/tuigreet target/${{ matrix.arch.target }}/release/tuigreet-${{ steps.version.outputs.VERSION }}-${{ matrix.arch.name }} - name: Upload artifact uses: actions/upload-artifact@v4 with: name: tuigreet-${{ steps.version.outputs.VERSION }}-${{ matrix.arch.name }} path: target/${{ matrix.arch.target }}/release/tuigreet-${{ steps.version.outputs.VERSION }}-${{ matrix.arch.name }} release: runs-on: ubuntu-latest needs: build steps: - name: Get the version id: version run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} - name: Download artifacts uses: actions/download-artifact@v4 with: path: target/out - name: Create release uses: ncipollo/release-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} name: ${{ steps.version.outputs.VERSION }} prerelease: false tag: ${{ github.ref }} artifacts: target/out/*/* tuigreet-0.9.1/.github/workflows/tip.yml000066400000000000000000000043001462617235300202730ustar00rootroot00000000000000name: Continuous master build on: push: branches: - master jobs: clippy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Lint run: | cargo clippy cargo clippy --release test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - run: | sudo apt update && sudo apt install -y libnss-wrapper - uses: Swatinem/rust-cache@v2 - name: Test env: NSS_WRAPPER_PASSWD: contrib/fixtures/passwd NSS_WRAPPER_GROUP: contrib/fixtures/group run: | cargo test LD_PRELOAD=libnss_wrapper.so cargo test --features nsswrapper nsswrapper_ build: strategy: matrix: arch: - { name: "x86_64", os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu", cross: false } runs-on: ${{ matrix.arch.os }} steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: shared-key: cargo-cache-${{ matrix.arch.target }} - name: Build run: | cargo build --release --target=${{ matrix.arch.target }} - name: Rename artifact run: mv target/${{ matrix.arch.target }}/release/tuigreet target/${{ matrix.arch.target }}/release/tuigreet-dev-${{ matrix.arch.name }} - name: Upload artifact uses: actions/upload-artifact@v4 with: name: tuigreet-dev-${{ matrix.arch.name }} path: target/${{ matrix.arch.target }}/release/tuigreet-dev-${{ matrix.arch.name }} package: runs-on: ubuntu-latest needs: build steps: - name: Download artifacts uses: actions/download-artifact@v4 with: path: target/out - name: Create release uses: ncipollo/release-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} name: tip prerelease: true tag: tip commit: ${{ github.sha }} artifacts: target/out/*/* allowUpdates: true removeArtifacts: true tuigreet-0.9.1/.gitignore000066400000000000000000000000461462617235300153520ustar00rootroot00000000000000/target /contrib/man/*.roff .vscode/ tuigreet-0.9.1/.rustfmt.toml000066400000000000000000000001231462617235300160350ustar00rootroot00000000000000fn_args_density = "Compressed" merge_imports = true max_width = 200 tab_spaces = 2 tuigreet-0.9.1/Cargo.lock000066400000000000000000001460371462617235300153020ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "addr2line" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "once_cell", "version_check", "zerocopy", ] [[package]] name = "aho-corasick" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" [[package]] name = "android_system_properties" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ "libc", ] [[package]] name = "arc-swap" version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-trait" version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "autocfg" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "backtrace" version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", ] [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bumpalo" version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytes" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cassowary" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" [[package]] name = "castaway" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a17ed5635fc8536268e5d4de1e22e81ac34419e5f052d4d51f4e01dcc263fcc" dependencies = [ "rustversion", ] [[package]] name = "cc" version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "pure-rust-locales", "wasm-bindgen", "windows-targets 0.52.5", ] [[package]] name = "compact_str" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" dependencies = [ "castaway", "cfg-if", "itoa", "ryu", "static_assertions", ] [[package]] name = "const-random" version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ "const-random-macro", ] [[package]] name = "const-random-macro" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ "getrandom", "once_cell", "tiny-keccak", ] [[package]] name = "core-foundation-sys" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crossbeam-channel" version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crossterm" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ "bitflags 2.5.0", "crossterm_winapi", "futures-core", "libc", "mio", "parking_lot", "signal-hook", "signal-hook-mio", "winapi", ] [[package]] name = "crossterm_winapi" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" dependencies = [ "winapi", ] [[package]] name = "crunchy" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "dashmap" version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", "hashbrown", "lock_api", "once_cell", "parking_lot_core", ] [[package]] name = "deranged" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", ] [[package]] name = "displaydoc" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "dlv-list" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" dependencies = [ "const-random", ] [[package]] name = "either" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "find-crate" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2" dependencies = [ "toml 0.5.11", ] [[package]] name = "fluent" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61f69378194459db76abd2ce3952b790db103ceb003008d3d50d97c41ff847a7" dependencies = [ "fluent-bundle", "unic-langid", ] [[package]] name = "fluent-bundle" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e242c601dec9711505f6d5bbff5bedd4b61b2469f2e8bb8e57ee7c9747a87ffd" dependencies = [ "fluent-langneg", "fluent-syntax", "intl-memoizer", "intl_pluralrules", "rustc-hash", "self_cell 0.10.3", "smallvec", "unic-langid", ] [[package]] name = "fluent-langneg" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" dependencies = [ "unic-langid", ] [[package]] name = "fluent-syntax" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78" dependencies = [ "thiserror", ] [[package]] name = "futures" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", "futures-executor", "futures-io", "futures-sink", "futures-task", "futures-util", ] [[package]] name = "futures-channel" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", ] [[package]] name = "futures-core" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", "futures-util", ] [[package]] name = "futures-io" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "futures-sink" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-macro", "futures-sink", "futures-task", "memchr", "pin-project-lite", "pin-utils", "slab", ] [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "getopts" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" dependencies = [ "unicode-width", ] [[package]] name = "getrandom" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "greetd_ipc" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1600ad23798daf53f5c336ebca8a7c603696ef4455103e9c713fab574131eb35" dependencies = [ "async-trait", "serde", "serde_json", "thiserror", "tokio", ] [[package]] name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ "ahash", "allocator-api2", ] [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "i18n-config" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c9ce3c48cbc21fd5b22b9331f32b5b51f6ad85d969b99e793427332e76e7640" dependencies = [ "log", "serde", "serde_derive", "thiserror", "toml 0.8.12", "unic-langid", ] [[package]] name = "i18n-embed" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94205d95764f5bb9db9ea98fa77f89653365ca748e27161f5bbea2ffd50e459c" dependencies = [ "arc-swap", "fluent", "fluent-langneg", "fluent-syntax", "i18n-embed-impl", "intl-memoizer", "lazy_static", "locale_config", "log", "parking_lot", "rust-embed", "thiserror", "unic-langid", "walkdir", ] [[package]] name = "i18n-embed-fl" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8241a781f49e923415e106fcd1f89c3fab92cc9f699a521c56e95dee273903d3" dependencies = [ "dashmap", "find-crate", "fluent", "fluent-syntax", "i18n-config", "i18n-embed", "lazy_static", "proc-macro-error", "proc-macro2", "quote", "strsim", "syn 2.0.60", "unic-langid", ] [[package]] name = "i18n-embed-impl" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81093c4701672f59416582fe3145676126fd23ba5db910acad0793c1108aaa58" dependencies = [ "find-crate", "i18n-config", "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "iana-time-zone" version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", "windows-core", ] [[package]] name = "iana-time-zone-haiku" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ "cc", ] [[package]] name = "indexmap" version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", ] [[package]] name = "indoc" version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" [[package]] name = "intl-memoizer" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c310433e4a310918d6ed9243542a6b83ec1183df95dff8f23f87bb88a264a66f" dependencies = [ "type-map", "unic-langid", ] [[package]] name = "intl_pluralrules" version = "7.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" dependencies = [ "unic-langid", ] [[package]] name = "itertools" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "locale_config" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" dependencies = [ "lazy_static", "objc", "objc-foundation", "regex", "winapi", ] [[package]] name = "lock_api" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", ] [[package]] name = "log" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lru" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ "hashbrown", ] [[package]] name = "malloc_buf" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" dependencies = [ "libc", ] [[package]] name = "memchr" version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "miniz_oxide" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] [[package]] name = "mio" version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", "wasi", "windows-sys 0.48.0", ] [[package]] name = "nix" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ "bitflags 2.5.0", "cfg-if", "cfg_aliases", "libc", ] [[package]] name = "nu-ansi-term" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", "winapi", ] [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-traits" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", ] [[package]] name = "objc" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", ] [[package]] name = "objc-foundation" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" dependencies = [ "block", "objc", "objc_id", ] [[package]] name = "objc_id" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" dependencies = [ "objc", ] [[package]] name = "object" version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "ordered-multimap" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" dependencies = [ "dlv-list", "hashbrown", ] [[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking_lot" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", "windows-targets 0.48.5", ] [[package]] name = "paste" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pin-project-lite" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[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", "syn 1.0.109", "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", "version_check", ] [[package]] name = "proc-macro2" version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] [[package]] name = "pure-rust-locales" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1190fd18ae6ce9e137184f207593877e70f39b015040156b1e05081cdfe3733a" [[package]] name = "quote" version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] name = "ratatui" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a564a852040e82671dc50a37d88f3aa83bbc690dfc6844cfe7a2591620206a80" dependencies = [ "bitflags 2.5.0", "cassowary", "compact_str", "crossterm", "indoc", "itertools", "lru", "paste", "stability", "strum", "unicode-segmentation", "unicode-width", ] [[package]] name = "redox_syscall" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "regex" version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rust-embed" version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb78f46d0066053d16d4ca7b898e9343bc3530f71c61d5ad84cd404ada068745" dependencies = [ "rust-embed-impl", "rust-embed-utils", "walkdir", ] [[package]] name = "rust-embed-impl" version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91ac2a3c6c0520a3fb3dd89321177c3c692937c4eb21893378219da10c44fc8" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", "syn 2.0.60", "walkdir", ] [[package]] name = "rust-embed-utils" version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86f69089032567ffff4eada41c573fc43ff466c7db7c5688b2e7969584345581" dependencies = [ "sha2", "walkdir", ] [[package]] name = "rust-ini" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d625ed57d8f49af6cfa514c42e1a71fadcff60eb0b1c517ff82fe41aa025b41" dependencies = [ "cfg-if", "ordered-multimap", "trim-in-place", ] [[package]] name = "rustc-demangle" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustversion" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" [[package]] name = "ryu" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "self_cell" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" dependencies = [ "self_cell 1.0.3", ] [[package]] name = "self_cell" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba" [[package]] name = "serde" version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "serde_json" version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "serde_spanned" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] [[package]] name = "sha2" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "sharded-slab" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[package]] name = "signal-hook" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", ] [[package]] name = "signal-hook-mio" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" dependencies = [ "libc", "mio", "signal-hook", ] [[package]] name = "signal-hook-registry" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] [[package]] name = "slab" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smart-default" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "smawk" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "socket2" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", "windows-sys 0.52.0", ] [[package]] name = "stability" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ff9eaf853dec4c8802325d8b6d3dffa86cc707fd7a1a4cdbf416e13b061787a" dependencies = [ "quote", "syn 2.0.60", ] [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strum" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", "syn 2.0.60", ] [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "unicode-ident", ] [[package]] name = "syn" version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "textwrap" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", "unicode-linebreak", "unicode-width", ] [[package]] name = "thiserror" version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "thread_local" version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", ] [[package]] name = "time" version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", "serde", "time-core", "time-macros", ] [[package]] name = "time-core" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", ] [[package]] name = "tiny-keccak" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" dependencies = [ "crunchy", ] [[package]] name = "tinystr" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece" dependencies = [ "displaydoc", ] [[package]] name = "tokio" version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", "libc", "mio", "num_cpus", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "toml" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "toml" version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ "serde", "serde_spanned", "toml_datetime", "toml_edit", ] [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" version = "0.22.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", "winnow", ] [[package]] name = "tracing" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-appender" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", "thiserror", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "tracing-core" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", ] [[package]] name = "tracing-log" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "nu-ansi-term", "sharded-slab", "smallvec", "thread_local", "tracing-core", "tracing-log", ] [[package]] name = "trim-in-place" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" [[package]] name = "tuigreet" version = "0.9.1" dependencies = [ "chrono", "crossterm", "futures", "getopts", "greetd_ipc", "i18n-embed", "i18n-embed-fl", "lazy_static", "nix", "rand", "ratatui", "rust-embed", "rust-ini", "smart-default", "textwrap", "tokio", "tracing", "tracing-appender", "tracing-subscriber", "unic-langid", "uzers", "zeroize", ] [[package]] name = "type-map" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6d3364c5e96cb2ad1603037ab253ddd34d7fb72a58bdddf4b7350760fc69a46" dependencies = [ "rustc-hash", ] [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unic-langid" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "238722e6d794ed130f91f4ea33e01fcff4f188d92337a21297892521c72df516" dependencies = [ "unic-langid-impl", ] [[package]] name = "unic-langid-impl" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bd55a2063fdea4ef1f8633243a7b0524cbeef1905ae04c31a1c9b9775c55bc6" dependencies = [ "serde", "tinystr", ] [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-linebreak" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-segmentation" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "uzers" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d85875e16d59b3b1549efce83ff8251a64923b03bef94add0a1862847448de4" dependencies = [ "libc", "log", ] [[package]] name = "valuable" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", "syn 2.0.60", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "134306a13c5647ad6453e8deaec55d3a44d6021970129e6188735e74bf546697" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ "windows-targets 0.52.5", ] [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets 0.48.5", ] [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets 0.52.5", ] [[package]] name = "windows-targets" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm 0.48.5", "windows_aarch64_msvc 0.48.5", "windows_i686_gnu 0.48.5", "windows_i686_msvc 0.48.5", "windows_x86_64_gnu 0.48.5", "windows_x86_64_gnullvm 0.48.5", "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ "windows_aarch64_gnullvm 0.52.5", "windows_aarch64_msvc 0.52.5", "windows_i686_gnu 0.52.5", "windows_i686_gnullvm", "windows_i686_msvc 0.52.5", "windows_x86_64_gnu 0.52.5", "windows_x86_64_gnullvm 0.52.5", "windows_x86_64_msvc 0.52.5", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" [[package]] name = "windows_i686_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" dependencies = [ "memchr", ] [[package]] name = "zerocopy" version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", "syn 2.0.60", ] [[package]] name = "zeroize" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" tuigreet-0.9.1/Cargo.toml000066400000000000000000000021261462617235300153130ustar00rootroot00000000000000[package] name = "tuigreet" version = "0.9.1" authors = ["Antoine POPINEAU "] edition = "2018" build = "build.rs" [features] default = [] nsswrapper = [] [dependencies] chrono = { version = "^0.4", features = ["unstable-locales"] } crossterm = { version = "^0.27", features = ["event-stream"] } futures = "0.3" getopts = "^0.2" greetd_ipc = { version = "^0.10", features = ["tokio-codec"] } i18n-embed = { version = "^0.14", features = [ "desktop-requester", "fluent-system", ] } i18n-embed-fl = "^0.8" lazy_static = "^1.4" nix = { version = "^0.28", features = ["feature"] } tui = { package = "ratatui", version = "^0.26", default-features = false, features = [ "crossterm", ] } rust-embed = "^8.0" rust-ini = "^0.21" smart-default = "^0.7" textwrap = "^0.16" tokio = { version = "^1.2", default-features = false, features = [ "macros", "rt-multi-thread", "net", "sync", "time", "process", ] } unic-langid = "^0.9" zeroize = "^1.3" uzers = "0.12" rand = "0.8.5" tracing-appender = "0.2.3" tracing-subscriber = "0.3.18" tracing = "0.1.40" [profile.release] lto = true tuigreet-0.9.1/LICENSE000066400000000000000000001045151462617235300143750ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . tuigreet-0.9.1/README.md000066400000000000000000000323551462617235300146510ustar00rootroot00000000000000# tuigreet Graphical console greeter for [greetd](https://git.sr.ht/~kennylevinsen/greetd). ![Screenshot of tuigreet](https://github.com/apognu/tuigreet/blob/master/contrib/screenshot.png) ``` Usage: tuigreet [OPTIONS] Options: -h, --help show this usage information -v, --version print version information -d, --debug [FILE] enable debug logging to the provided file, or to /tmp/tuigreet.log -c, --cmd COMMAND command to run -s, --sessions DIRS colon-separated list of Wayland session paths --session-wrapper 'CMD [ARGS]...' wrapper command to initialize the non-X11 session -x, --xsessions DIRS colon-separated list of X11 session paths --xsession-wrapper 'CMD [ARGS]...' wrapper command to initialize X server and launch X11 sessions (default: startx /usr/bin/env) --no-xsession-wrapper do not wrap commands for X11 sessions -w, --width WIDTH width of the main prompt (default: 80) -i, --issue show the host's issue file -g, --greeting GREETING show custom text above login prompt -t, --time display the current date and time --time-format FORMAT custom strftime format for displaying date and time -r, --remember remember last logged-in username --remember-session remember last selected session --remember-user-session remember last selected session for each user --user-menu allow graphical selection of users from a menu --user-menu-min-uid UID minimum UID to display in the user selection menu --user-menu-max-uid UID maximum UID to display in the user selection menu --theme SPEC Add visual feedback when typing secrets, as one asterisk character for every keystroke. By default, no feedback is given at all. --asterisks display asterisks when a secret is typed --asterisks-char CHARS characters to be used to redact secrets (default: *) --window-padding PADDING padding inside the terminal area (default: 0) --container-padding PADDING padding inside the main prompt container (default: 1) --prompt-padding PADDING padding between prompt rows (default: 1) --power-shutdown 'CMD [ARGS]...' command to run to shut down the system --power-reboot 'CMD [ARGS]...' command to run to reboot the system --power-no-setsid do not prefix power commands with setsid --kb-[command|sessions|power] [1-12] change the default F-key keybindings to access the command, sessions and power menus. ``` ## Usage The default configuration tends to be as minimal as possible, visually speaking, only showing the authentication prompts and some minor information in the status bar. You may print your system's `/etc/issue` at the top of the prompt with `--issue` and the current date and time with `--time` (and possibly customize it with `--time-format`). You may include a custom one-line greeting message instead of `/etc/issue` with `--greeting`. The initial prompt container will be 80 column wide. You may change this with `--width` in case you need more space (for example, to account for large PAM challenge messages). Please refer to usage information (`--help`) for more customization options. Various padding settings are available through the `*-padding` options. You can instruct `tuigreet` to remember the last username that successfully opened a session with the `--remember` option (that way, the username field will be pre-filled). Similarly, the command and session configuration can be retained between runs with the `--remember-session` option (when using this, the `--cmd` value is overridden by manual selections). You can also remember the selected session per user with the `--remember-user-session` flag. In this case, the selected session will only be saved on successful authentication. You may change the command that will be executed after opening a session by hitting `F2` and amending the command. Alternatively, you can list the system-declared sessions (or custom ones) by hitting `F3`. Power options are available through `F12`. ## Install ### From source Building from source requires an installation of Rust's `stable` toolchain, including `cargo`. ``` $ git clone https://github.com/apognu/tuigreet && cd tuigreet $ cargo build --release # mv target/release/tuigreet /usr/local/bin/tuigreet ``` Cache directory must be created for `--remember*` features to work. The directory must be owned by the user running the greeter. ``` # mkdir /var/cache/tuigreet # chown greeter:greeter /var/cache/tuigreet # chmod 0755 /var/cache/tuigreet ``` ### From Arch Linux On ArchLinux, `tuigreet` is available from the [extra](https://archlinux.org/packages/extra/x86_64/greetd-tuigreet/) repo and is installable through pacman: ``` $ pacman -S greetd-tuigreet ``` Two more distributions are available from the [AUR](https://aur.archlinux.org/packages?O=0&K=tuigreet): `greetd-tuigreet-bin` is the precompiled release for the latest tagged release of `tuigreet` and `greetd-tuigreet-git` is a rolling release always following the `master` branch of this repository. Those can be installed via your preferred AUR helper. ### From Gentoo On Gentoo, `tuigreet` is available as a package `gui-apps/tuigreet`: ``` $ emerge --ask --verbose gui-apps/tuigreet ``` ### From NixOS On NixOS `greetd` and `tuigreet` both available via `` main repository. Please refer to the snippet below for the minimal `tuigreet` configuration: ```nix { pkgs, ... }: { services.greetd = { enable = true; settings = { default_session = { command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd sway"; user = "greeter"; }; }; }; } ``` [More details](https://search.nixos.org/options?channel=unstable&show=services.greetd.settings&from=0&size=50&sort=relevance&query=greetd) ### Pre-built binaries Pre-built binaries of `tuigreet` for several architectures can be found in the [releases](https://github.com/apognu/tuigreet/releases) section of this repository. The [tip prerelease](https://github.com/apognu/tuigreet/releases/tag/tip) is continuously built and kept in sync with the `master` branch. ## Running the tests Tests from the default features should run without any special consideration by running `cargo test`. If you intend to run the whole test suite, you will need to perform some setup. One of our features uses NSS to list and filter existing users on the system, and in order not to rely on actual users being created on the host, we use [libnss_wrapper](https://cwrap.org/nss_wrapper.html) to mock responses from NSS. Without this, the tests would use the real user list from your system and probably fail because it cannot find the one it looks for. After installing `libnss_wrapper` on your system (or compiling it to get the `.so`), you can run those specific tests as such: ``` $ export NSS_WRAPPER_PASSWD=contrib/fixtures/passwd $ export NSS_WRAPPER_GROUP=contrib/fixtures/group $ LD_PRELOAD=/path/to/libnss_wrapper.so cargo test --features nsswrapper nsswrapper_ # To run those tests specifically $ LD_PRELOAD=/path/to/libnss_wrapper.so cargo test --all-features # To run the whole test suite ``` ## Configuration Edit `/etc/greetd/config.toml` and set the `command` setting to use `tuigreet`: ``` [terminal] vt = 1 [default_session] command = "tuigreet --cmd sway" user = "greeter" ``` Please refer to [greetd's wiki](https://man.sr.ht/~kennylevinsen/greetd/) for more information on setting up `greetd`. ### Sessions The available sessions are fetched from `desktop` files in `/usr/share/xsessions` and `/usr/share/wayland-sessions`. If you want to provide custom directories, you can set the `--sessions` arguments with a colon-separated list of directories for `tuigreet` to fetch session definitions some other place. #### Desktop environments `greetd` only accepts environment-less commands to be used to start a session. Therefore, if your desktop environment requires either arguments or environment variables, you will need to create a wrapper script and refer to it in an appropriate desktop file. For example, to run X11 Gnome, you may need to start it through `startx` and configure your `~/.xinitrc` (or an external `xinitrc` with a wrapper script): ``` exec gnome-session ``` To run Wayland Gnome, you would need to create a wrapper script akin to the following: ``` XDG_SESSION_TYPE=wayland dbus-run-session gnome-session ``` Then refer to your wrapper script in a custom desktop file (in a directory declared with the `-s/--sessions` option): ``` Name=Wayland Gnome Exec=/path/to/my/wrapper.sh ``` #### Common wrappers Two options allows you to automatically wrap run commands around sessions started from desktop files, depending on whether they come `/usr/share/wayland-sessions` or `/usr/share/xsessions`: `--sessions-wrapper` and `--xsessions-wrapper`. With this, you can prepend another command on front of the sessions you run to set up the required environment to run these kinds of sessions. By default, unless you change it, all X11 sessions (those picked up from `/usr/share/xsessions`) are prepended with `startx /usr/bin/env`, so the X11 server is started properly. ### Power management Two power actions are possible from `tuigreet`, shutting down (through `shutdown -h now`) and rebooting (with `shutdown -r now`) the machine. This requires that those commands be executable by regular users, which is not the case on some distros. To alleviate this, there are two options that can be used to customize the commands that are run: `--power-shutdown` and `--power-reboot`. The provided commands must be non-interactive, meaning they will not be able to print anything or prompt for anything. If you need to use `sudo` or `doas`, they will need to be configured to run passwordless for those specific commands. An example for `/etc/greetd/config.toml`: ``` [default_session] command = "tuigreet --power-shutdown 'sudo systemctl poweroff'" ``` Note that, by default, all commands are prefixed with `setsid` to completely detach the command from our TTY. If you would prefer to run the commands as is, or if `setsid` does not exist on your system, you can use `--power-no-setsid`. ### User menu Optionally, a user can be selected from a menu instead of typing out their name, with the `--user-menu` option, this will present all users returned by NSS at the time `tuigreet` was run, with a UID within the acceptable range. The values for the minimum and maximum UIDs are selected as follows, for each value: * A user-provided value, through `--user-menu-min-uid` or `--user-menu-max-uid`; * **Or**, the available values for `UID_MIN` or `UID_MAX` from `/etc/login.defs`; * **Or**, hardcoded `1000` for minimum UID and `60000` for maximum UID. ### Theming A theme specification can be given through the `--theme` argument to control some of the colors used to draw the UI. This specification string must have the following format: `component1=color;component2=color[;...]` where the component is one of the value listed in the table below, and the color is a valid ANSI color name as listed [here](https://github.com/ratatui-org/ratatui/blob/main/src/style/color.rs#L15). Please note that we can only render colors as supported by the running terminal. In the case of the Linux virtual console, those colors might not look as good as one may think. Your mileage may vary. | Component name | Description | | -------------- | ---------------------------------------------------------------------------------- | | text | Base text color other than those specified below | | time | Color of the date and time. If unspecified, falls back to `text` | | container | Background color for the centered containers used throughout the app | | border | Color of the borders of those containers | | title | Color of the containers' titles. If unspecified, falls back to `border` | | greet | Color of the issue of greeting message. If unspecified, falls back to `text` | | prompt | Color of the prompt ("Username:", etc.) | | input | Color of user input feedback | | action | Color of the actions displayed at the bottom of the screen | | button | Color of the keybindings for those actions. If unspecified, falls back to `action` | Below is a screenshot of the greeter with the following theme applied: `border=magenta;text=cyan;prompt=green;time=red;action=blue;button=yellow;container=black;input=red`: ![Screenshot of tuigreet](https://github.com/apognu/tuigreet/blob/master/contrib/screenshot-themed.png) tuigreet-0.9.1/build.rs000066400000000000000000000007771462617235300150420ustar00rootroot00000000000000use std::{env, error::Error, path::Path, process::Command}; fn main() { let version = if Path::new(".git").exists() { get_git_version().unwrap_or_else(|_| String::from("unknown")) } else { env!("CARGO_PKG_VERSION").to_string() }; println!("cargo:rustc-env=VERSION={version}"); println!("cargo:rustc-env=TARGET={}", env::var("TARGET").unwrap()); } fn get_git_version() -> Result> { Ok(String::from_utf8(Command::new("./contrib/git-version.sh").output()?.stdout)?) } tuigreet-0.9.1/contrib/000077500000000000000000000000001462617235300150225ustar00rootroot00000000000000tuigreet-0.9.1/contrib/fixtures/000077500000000000000000000000001462617235300166735ustar00rootroot00000000000000tuigreet-0.9.1/contrib/fixtures/group000066400000000000000000000000001462617235300177400ustar00rootroot00000000000000tuigreet-0.9.1/contrib/fixtures/passwd000066400000000000000000000002371462617235300201210ustar00rootroot00000000000000root:x:0:0::/root:/bin/bash joe:x:1000:1000:Joe:/home/joe:/bin/bash bob:x:1500:1500::/home/bob:/bin/zsh postgres:x:2100:2100::/srv/postgresql:/usr/bin/nologin tuigreet-0.9.1/contrib/git-version.sh000077500000000000000000000000661462617235300176310ustar00rootroot00000000000000#!/bin/sh git describe --long | sed 's/-/.r/;s/-/./' tuigreet-0.9.1/contrib/locales/000077500000000000000000000000001462617235300164445ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/ca-ES/000077500000000000000000000000001462617235300173345ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/ca-ES/tuigreet.ftl000066400000000000000000000007741462617235300217030ustar00rootroot00000000000000title_authenticate = Autenticació a {$hostname} title_command = Canvi d'ordre de sessió title_power = Opcions d'engegada title_session = Canvi de sessió action_reset = Reinicialitza action_command = Canvia l'ordre action_session = Tria una sessió action_power = Engegada date = %a %d %h %Y - %H:%M username = Nom d'usuari: wait = Espereu... failed = Error d'autenticació, torneu-ho a provar. new_command = Ordre nova: shutdown = Atura reboot = Reinicia status_command = CMD status_caps = BLOQ MAJ tuigreet-0.9.1/contrib/locales/de-DE/000077500000000000000000000000001462617235300173225ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/de-DE/tuigreet.ftl000066400000000000000000000010561462617235300216630ustar00rootroot00000000000000title_authenticate = Bei {$hostname} authentifizieren title_command = Sitzungsbefehl ändern title_power = Energieeinstellungen title_session = Sitzung ändern action_reset = Zurücksetzen action_command = Befehl ändern action_session = Sitzung auswählen action_power = Energie date = %a, %d %h %Y - %H:%M username = Benutzername: wait = Bitte warten... failed = Authentifizierung fehlgeschlagen. Bitte versuchen Sie es erneut. new_command = Neuer Befehl: shutdown = Herunterfahren reboot = Neustart status_command = CMD status_caps = FESTSTELLTASTE tuigreet-0.9.1/contrib/locales/en-US/000077500000000000000000000000001462617235300173735ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/en-US/tuigreet.ftl000066400000000000000000000012631462617235300217340ustar00rootroot00000000000000title_authenticate = Authenticate into {$hostname} title_command = Change session command title_power = Power options title_session = Change session title_users = Select a user action_reset = Reset action_command = Change command action_session = Choose session action_power = Power date = %a, %d %h %Y - %H:%M select_user = Press Enter to select a user or start typing... username = Username: wait = Please wait... failed = Authentication failed, please try again. new_command = New command: shutdown = Shut down reboot = Reboot command_missing = No command configured command_exited = Command exited with command_failed = Command failed status_command = CMD status_caps = CAPS LOCK tuigreet-0.9.1/contrib/locales/es-CL/000077500000000000000000000000001462617235300173475ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/es-CL/tuigreet.ftl000066400000000000000000000013321462617235300217050ustar00rootroot00000000000000title_authenticate = Autenticación en {$hostname} title_command = Cambiar el comando de sesión title_power = Opciones de energía title_session = Cambiar sesión title_users = Seleccionar usuario action_reset = Reiniciar action_command = Cambiar comando action_session = Escoger sesión action_power = Energía date = %a, %d %h %Y - %H:%M select_user = Presiona Intro para seleccionar un usuario o comenzar a escribir... username = Usuario: wait = Por favor espera... failed = Autenticación fallida, por favor vuelve a intentarlo. new_command = Nuevo comando: shutdown = Apagar reboot = Reiniciar command_exited = El comando terminó con command_failed = El comando falló status_command = CMD status_caps = BLOQ MAYÚS tuigreet-0.9.1/contrib/locales/fr-FR/000077500000000000000000000000001462617235300173605ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/fr-FR/tuigreet.ftl000066400000000000000000000014601462617235300217200ustar00rootroot00000000000000title_authenticate = Se connecter à {$hostname} title_command = Changer la commande de session title_power = Options d'alimentation title_session = Changer la session title_users = Choisissez un utilisateur action_reset = Réinitialiser action_command = Changer la commande action_session = Choisir la session action_power = Alimentation date = %a %d %h %Y - %H:%M select_user = Appuyez sur Entrée pour choisir un utilisateur ou tapez son nom... username = Nom d'utilisateur : wait = Veuillez patienter... failed = Erreur d'authentification, veuillez réessayer. command = Nouvelle commande : shutdown = Éteindre reboot = Redémarrer command_missing = Aucune commande configurée command_exited = La commande a retourné command_failed = Échec de la commande status_command = CMD status_caps = VERR. MAJ. tuigreet-0.9.1/contrib/locales/it-IT/000077500000000000000000000000001462617235300173725ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/it-IT/tuigreet.ftl000066400000000000000000000007571462617235300217420ustar00rootroot00000000000000title_authenticate = Accedi a {$hostname} title_command = Cambia comando sessione title_power = Opzioni alimentazione title_session = Cambia sessione action_reset = Reset action_command = Cambia comando action_session = Scegli sessione action_power = Alimentazione date = %a, %d %h %Y - %H:%M username = Nome utente: wait = Attendere... failed = Autenticazione fallita, riprova. new_command = Nuovo comando: shutdown = Spegni reboot = Riavvia status_command = CMD status_caps = BLC MAIUSC tuigreet-0.9.1/contrib/locales/pl-PL/000077500000000000000000000000001462617235300173705ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/pl-PL/tuigreet.ftl000066400000000000000000000014021462617235300217240ustar00rootroot00000000000000title_authenticate = Uwierzytelnianie dla urzÄ…dzenia {$hostname} title_command = Zmiana polecenia dla sesji title_power = Opcje zasilania title_session = Zmiana sesji title_users = Wybór użytkownika action_reset = Reset action_command = Zmiana polecenia action_session = Wybór sesji action_power = Zasilanie date = %a, %d %h %Y - %H:%M select_user = NaciÅ›nij Enter, by wybrać użytkownika, lub zacznij pisać... username = Nazwa użytkownika: wait = ProszÄ™ czekać... failed = Uwierzytelnianie nie powiodÅ‚o siÄ™. Spróbuj ponownie. new_command = Nowe polecenie: shutdown = Wyłącz reboot = Uruchom ponownie command_exited = Polecenie zakoÅ„czone z kodem command_failed = Polecenie zakoÅ„czone niepowodzeniem status_command = CMD status_caps = CAPS LOCK tuigreet-0.9.1/contrib/locales/pt-BR/000077500000000000000000000000001462617235300173705ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/pt-BR/tuigreet.ftl000066400000000000000000000007211462617235300217270ustar00rootroot00000000000000title_authenticate = Autenticar em {$hostname} title_command = Mudar comando da sessão title_power = Opções de energia title_session = Mudar sessão action_reset = Reset action_command = Mudar comando action_session = Escolher sessão action_power = Energia date = %a, %d %h %Y - %H:%M username = Nome de usuário: wait = Por favor, aguarde... new_command = Novo comando: shutdown = Desligar reboot = Reiniciar status_command = CMD status_caps = CAPS LOCK tuigreet-0.9.1/contrib/locales/ru-RU/000077500000000000000000000000001462617235300174165ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/ru-RU/tuigreet.ftl000066400000000000000000000017761462617235300217700ustar00rootroot00000000000000title_authenticate = ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð² {$hostname} title_command = Изменить команду ÑеанÑа title_power = Опции Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ title_session = Изменить ÑÐµÐ°Ð½Ñ title_users = Выбрать Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ action_reset = Перезагрузка action_command = Изменить команду action_session = Выбрать ÑÐµÐ°Ð½Ñ action_power = Питание date = %a, %d %h %Y - %H:%M select_user = Ðажмите Enter Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ начните печатать... username = Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: wait = ПожалуйÑта подождите... failed = Ошибка аутентификации, попробуйте Ñнова. new_command = ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°: shutdown = Выключение reboot = Перезагрузка command_exited = Команда завершилаÑÑŒ Ñ command_failed = Команда не выполнена status_command = CMD status_caps = CAPS LOCK tuigreet-0.9.1/contrib/locales/uk-UA/000077500000000000000000000000001462617235300173665ustar00rootroot00000000000000tuigreet-0.9.1/contrib/locales/uk-UA/tuigreet.ftl000066400000000000000000000020641462617235300217270ustar00rootroot00000000000000title_authenticate = Вхід до {$hostname} title_command = Змінити команду Ð´Ð»Ñ ÑеÑÑ–Ñ— title_power = Ð–Ð¸Ð²Ð»ÐµÐ½Ð½Ñ title_session = ВиберіÑть ÑеÑÑ–ÑŽ title_users = Виберіть кориÑтувача action_reset = Скинути action_command = Змінити команду action_session = Вибрати ÑеÑÑ–ÑŽ action_power = Ð–Ð¸Ð²Ð»ÐµÐ½Ð½Ñ date = %a, %d %h %Y - %H:%M select_user = ÐатиÑніть Enter щоб вибрати кориÑтувача або введіть його ім'Ñ... username = Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: wait = Будь лаÑка, зачекайте... failed = Помилка входу, будь лаÑка, Ñпробуйте знову. new_command = Ðова команда: shutdown = Завершити роботу reboot = Перезавантажити command_exited = Команда завершила роботу з кодом command_failed = Під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ виникла помилка status_command = CMD status_caps = CAPS LOCK tuigreet-0.9.1/contrib/man/000077500000000000000000000000001462617235300155755ustar00rootroot00000000000000tuigreet-0.9.1/contrib/man/tuigreet-1.scd000066400000000000000000000100031462617235300202500ustar00rootroot00000000000000tuigreet(1) # NAME tuigreet - A graphical console greeter for greetd # SYNOPSIS *tuigreet* [OPTIONS]... # OPTIONS *-h, --help* Show usage and exit. *-v, --version* Print program version and exit. *-d, --debug [FILE]* Enables debug logging to the provided FILE path, or to /tmp/tuigreet.log if no file is specified. *-c, --cmd CMD* Specify which command to run on successful authentication. This can be overridden by manual selection within *tuigreet*. *-s, --sessions DIR1[:DIR2]...* Location of desktop-files to be used as Wayland session definitions. By default, Wayland sessions are fetched from */usr/share/wayland-sessions*. *--session-wrapper 'CMD [ARGS]...'* Specify a wrapper command to execute instead of the session for non-X11 sessions. This command will receive the session command as its arguments. *-x, --xsessions DIR1[:DIR2]...* Location of desktop-files to be used as X11 session definitions. By default, X11 sessions are fetched from */usr/share/xsessions*. *--xsession-wrapper 'CMD [ARGS]...'* Specify a wrapper command to initialize X server and launch X11 sessions. By default, *startx /usr/bin/env* will be prepended to all X11 session commands. *--no-xsession-wrapper* Do not wrap commands for X11 sessions. *-w, --width COLS* Number of columns the main prompt area should take on the screen. *-i, --issue* Print the content of */etc/issue* at the top of the prompt area. This option is mutually exclusive with *--greeting*. *-g, --greeting GREETING* Specify the text to be displayed at the top of the prompt area. This option is mutually exclusive with *--issue*. *-t, --time* Print the current date and time at the top of the screen. *--time-format FORMAT* Configure a custom strftime-compliant format string for the current date and time. *--user-menu* Allow selecting a user from a graphical menu. *--user-menu-min-uid* Minimum UID of the users to display in the selection menu. *--user-menu-max-uid* Maximum UID of the users to display in the selection menu. *-r, --remember* Remember the username of the last successfully opened session, so the username field will be pre-filled on the next run. *--remember-session* Remember the last selected session, effectively overriding the given *--cmd* option on subsequent runs. *--remember-user-session* Remember the last opened session, per user (requires *--remember*). *--theme SPEC* Define colors to be used to draw the UI components. You can find the proper syntax in the project's README. *--asterisks* Add visual feedback when typing secrets, as one asterisk character for every keystroke. By default, no feedback is given at all. *--asterisks-char CHARS* Change the default feedback character from an asterisk to a random distribution of the provided characters. *--window-padding COLS* Add spacing between the edge of the screen area the drawing area. *--container-padding COLS* Add spacing between the border of the main prompt area and its contents. *--prompt-padding ROWS* Add spacing between form fields. *--greet-align [left|center|right]* Alignment of the greeting text in the main prompt container (default: 'center'). *--power-shutdown CMD [ARGS]...* Customize the command run when instructed to shut down the machine. This must be a non-interactive command (sudo cannot prompt for a password, for example). *--power-reboot CMD [ARGS]...* Customize the command run when instructed to reboot the machine. This must be a non-interactive command (sudo cannot prompt for a password, for example). *--power-no-setsid* Do not prefix power commands with *setsid*, which is used to detach it from current TTY. *--kb-[command|sessions|power] [1-12]* change the default F-key keybindings to access the command, sessions and power menus. # AUTHORS Maintained by Antoine POPINEAU . Contributed to by great people at https://github.com/apognu/tuigreet/graphs/contributors. # DEVELOPMENT Issue reporting and development discussion should happen at https://github.com/apognu/tuigreet. # SEE ALSO *greetd*(1) tuigreet-0.9.1/contrib/screenshot-themed.png000066400000000000000000006076531462617235300211720ustar00rootroot00000000000000‰PNG  IHDR§¸.² ^ IDATxœì½[ÌmYv4FÓuívß»º«ºc·]£`c0ˆ{ŠcÛˆ‹@Ü$”^@Bð„„xD<$$xÉCx@a +ä.¢XÁÙò=îvùÒíꪮS·3yØ{ÍõÍïûÆÜûÿÏÙûÿ×ÐÑÖžkÌ1Çœs\¾±×ÚkåK_úJl´Q§Œˆˆ¶·å/24wLü(9ñ Šã&£tªÎåOäXš+¯#óŽ£µˆˆÌˆ-"siÁQ[!.á@§T-·ž­–‰Æj…2º»Äf»¨žm´ÑFmtºT¡’Ir éÒ®ò-²0*Š–I®rùFçG;И€'é쮽cKj_$<ŒˆO}öåPx£“¦”˜c;È<éh +ÐF¦y‘9ÔTÊS.N‚ñʶóÌQ£ 803Åt!lÒ¡cÛWÊ%rÁ|ŸæyT™ÆAS½},C­Û¥gQrÐÝÕç39{›f±Ñ)“Ñ¡_a ˆéí)j´½bƒÀ5ÚÐáTGª/åªé#Í=Í­•‘抭D˜’ †“ð‡6¹‚GŽ®}Ù®m?ï I§Áð[ßxõ©ÛPm££ƒx-GæÊ@¹„þZ~ÌIý_¥pqW»Ì EjO—àHŸE[t&µ÷]2"£EDÌ»Ÿ²VÃ$…Vzë$ñ£¶OöR ·“¤‰þV«!…+'EŸ˜¨«— ì6×íŒ4GS¨Üº3Ó©­äÛÈU ‡{ì f÷O+±Ý¿XàŽ–|k—Ã.2£®‡mˆ½æs¡YX¿M9kkEõM…Z[ 'ù$ŽØÄUæ½wÔIŽTCÐÀJ P98°Y@Ò¨C´Á”™îý~ž-í‚OGô[b •=úõ’O"ØÃk×{£Ó'û}aO…D/e‹èab›|g¥ L¡%WñU'2©åšH¥ ¡r Ãmç„‹E[.ô-·qî$îÿï—'q5Vh óÔUÐ)ª·ƒjž¢Ž)CN¦¸vAxIëQµ»ë#u”ÊÆ»n1NÁþ%”·›]™p¸}j²jÖPÎÄ:7ÚÈXö´œã*ˆÑ{™ˆKAÅê¹´íz|ú[|Ýd„”c ÞèN”ïÔ…ªlÒ¨B¢õ¼ÇTm‚]Û2)m_ÌP …è£M¨”emá÷Œ /Öa(ë5ž^ÓëQ«¸ t»ÖwI“ÄA¬c¸ªÒO¸F „1™QIN$Š¢F`¿ ØV'—¢õJ/öbÞ"rÑ0#ðÎO*:Ó(R©’¹’î_ŽË‡šèÄRúvfÔ$ǾéÔ¾F";Ò\{ó%©Q¡8r‹ÞØd›ã‚ë¨.¢ê)"µ § ­úP@™÷CnT™uTB<ôì—«|øå7A"¥ÔcdÇO4P,5ÞÐ=‡Cti´{­¯°"1y]k¢­¿MÒ7S¬ÙHpGsQ1`uí&Û4tÑnk9e‹Â¬lËFçAÍv‡»ÊGsà{Ρ¤›#¶k}÷‹*WUJUfªn§Ÿ‰üNU 5iã±AÇM‚"Jàímí×9Ö! Œ@ÀÄ]Rã³Í/tl'ÖÜ$¡E¡|«åbÔ#^B™c)]Ðáñuc²n²túX´pvwQ`†øc…µ…(mµ=Y!s_Ùh£’0êîÏ Mã`ÐFËhå,Á é©>ö2m9G(îX†¡†ƒÎ†þI¢&±œâ4¶`$ Z"м.ZšÜi¢ü2I„}ˆ‡d†p¶q ¨{Ua\‡«Øè<¨ºG½úÑrÕKïðÜ®õÝGÒª,Æ–„xö˜bD ÓOHÊAL{9†C«ª-”0Ó¼,35RÝà3nÑ}÷ 1‚‚6.%-q6Cи²UpCÑ~%|>bˆ(å'ù¶ä¹Æj«kf§ÔR^+醅[&›Ú ³õ–VðO(¶b«ò’ƒ:úܪ#*ÛFEhDɈX¯³ùKsÉ»ãÝm™».vÕÅýC‰¸ ×s màÃáÜ FO°ÇäZ—N×KµS àÁ¼Is¡(Ü´{IšÖµ²2“žtœÕ“Ñ©êãDÚFçMÃÛþÀ²õºŽ®öù»]ë»»„@oG0ª”g+<ÕÆäctœKKÇlÃj}窒2šŒµ,²á–"wëN%7Rï` ]5þkn·Àµ¨ê´~ÐF-íØ·CXdA›„ØA§£ÆwŤ*¦¨r“U‡ÝÆ%°.Fø‰Ò&+ª8u3*ã›o›ú“Zžµ†6bZm~ ²žÎñ¬g–êng}ëS:÷‘9¢-µeö*QŸ„.Æ; –­ß"ƒ='Üæ#Öá„`» .DX†0BŒ›²Ò(j2²;ls°îž*`wĶmòSuáÎÞØIѲº¸ØíZß%MQÃ(bÙê($Ìè(áb„Ó!´WTœÕDi’íæÇZ %­Iw¹Œï–ÎX@jÑH˜At2=#äx²FmÜ[°Å8y> çd!R4WÛš$²k$²kZËÖ*É·pG›˜H?h²÷“‰(ꛣDU¸* ›kÄ.Ú¢Hx£˜¸nY,"ú»VhkZLµ-<™ƒïþËð_÷k†áw5¸‰åÙ¾ÄÜOm°c£í{1{c§~‡¯pŸ¤5HÈý(¹Œ×"B~Å7¡ª¦R§Õ¸N)p†d çƒ¢Š²Î†6ÀÛ.÷Þ]1Yè©”cåÔø©™²I»%)v Ò'œ©nt6„¯¢A²÷;èÍœs!#ÏVõÝiBØØ\Ä:,–´‡…º½ÝæŒX¶âŠQg¬­Hȼڊñ \l¶]öð"Ö«|+hÈEŽÍýÇa4Ï·qhžZXN‹; þU­Dg)7MoT‰&Z^+)¨£]±LÔЕã*´ËqÖG®Emï:W¸1œÅ3ôF÷šìãÅ‘ôùœäôÈòµzl‹Gá=آʬRÍGV Lœ2IˆË–UéUŸ&~¨ hˆlâó÷ÛQçe{“˜ŽG¥Å˜³QZ±¶º HºŠMR6S£÷Fg@™\ªÑ ÷b‰Wô¤«Þ8õe3tEk[Õw×IÑY¸´„íZivIˆ=Q„ª\, VCÒ’ÅÂ$Vÿb°¬*¦ýTw»ÿr]‚I•¢6qèÌsЄyîð"’Y…öþ‘ˆÖ¥Ä|¿}µÊÓ}m,`Á.XžaЦcE[X´ø CXرÑ9QõüªùG=Õ_0£Õ£Üê¹U}w´XH9@fKŠ µô±:2=X8¨púØ@¡à&½l-¦’µ&ìüku·»ˆj$…ÖDºšZnVõHŠf˜,&x5³Ø¢®‚Ê+l¡¤cnˆ&©NÍ䔳ùx²Uél%œÙâqµ (Gq,Y5"ŽmÎÎ"’6þÓ^m´ÐbzÃRyý-÷Þþãøö\wÂ×p›k÷Up²]bR°ù‚R[Œ¾àf1zšfœËù†:-þíÔÄ3S|’dê\î%Íc5²Ù Å2SQ§ÇU€µƒªðJÏΆR^7Z±ÙÛ;é9Xý˜ž2ˆÌ™ÑÚö Ï»HQR"qRµFÒ´Àî$–¨fPüXÙc"\“PJZ­Ä߿¹µ²ãŒªÌ£õª´RTE‘Ò„,wLI$ŽI TÓ6Y»y-ÂpùíK ŠnžR–5Ü:FÝ¢r°EyÔ5‰Íºšn¹:Z*ýM'v£jûµúÂU€ÃÙENöÏ`¼ýÒß®e‰Æˆ„?}iJÈKñ–8ôQ“Ññ„½4]Ð 71NÓ:ù=&­ cÜöƒ5 j¦$;:Æ"ª,»Ñ!*̰~ëg«ëÁð<ùج,Þ·n×úî"Q£õˆÅž¶$ëDßG‘À&¡.ÆbAµŠ1ñhG­§ˆZ´Øi‰§Z]‹fØ`H¬q½¨:¢¿±&-ÿ¨l£( 5 ÙB΂…6²‘ð8N‡ë"ÜmÛnÉÍÚ{Œ«r\y[Žf¡žZ)"Eµ© ¶ÕŽ*š‰[Zí·ÄXôG,½ŸÚðhÍ.„óÎx¯ƒ¤Œå–]—ÆZ4q˽.GW°h¢®>Y†Kxˆ†aM£¨ƒÆûà%œ)yÿ¨Z ¤ý£¢:Çíö0ï/áwOøb~°0^ø¹HX¼­‘s¼ís«úîiX×ý~i‚𩬠(Ò$ßôª2‡U1”â+aÞ½„\.ܵp­ìåÚô˜ãH¤½V‰ZIçØ¨xÁ9ëÌ5­´¢Ýªjí ¹ö~ʦ¿&B®‹&ÐE÷ ݪ]ŸV1n'CÓñØ u±nDÇdømä·¶›2t:}* Ùlz£€(g¬øcÀ:½qý¸ëÚV1XøåRËõ¾‰æ™ƒ@ÿ8PQS©ªè0`kðkΣâ‰=dâc”øð¯æëcÊ‘ûD´`6Ò†Ä:Í5ÄyUØD»Ñ}!}ïÞ´I±qGøh Œmz "zi×–ÆÄ>T#Yøšã)[°YÔŠäµÀ£Aie´“¯G±Z˜ádi1®r—c»‡[úkÉb´Cý¸*®Â­é5­Ž¹¬nÉd«ý DB›m÷L‘­u%ÊnHr£‚¤TÂWHÍT°³E@-;Qkà„—ò _u·}Àï÷êÓWãÖ–~Þ-5…òê9ž}ª$Ï#]ÊÁF#µqŸÕì„”w(U“Ùø¼Ñ=¢õ®yÖ~½½_Ö‹Ófd¬½èBâr¹o«úî"ÙJ [&I_L¶”Ð*®J?3ÛŠ»weRÁ…ü-ö‰¿Åø} -JUãÍ1y‹!òSåv¹¢.du(éz¥‡NY)-U1:@þ&SÎq®7‘ÑlÛ¸vìȬÖ8ìúR &÷6¡}µ$Sû¦ÝB!¤)„̂췣„ŽsÇÖÛs¸X·ÚY[ Åeà5}ýËo¬ñ7{Oséx©LVSI8„^uo£ù™>µÂ9'á¼Ro£‘Úq„är›‰C$4dzÑF+a…V½§aGÕn’žPµtÔ'y.—þ¶ªï®æªÞNløT'*4Ôa÷pˆ!„ÓVkVìE®*DI¥áí »Sòô¶A];ÒV†öTgH9ÖìЩüQ¬²dw½§ŽIm!]ÈTÕÝu%µcŠ"ªíßëSOóºE‰{ï½ìºW0ÕnyU¬a—‹¡c+s1Õ„n Ѳ—jK6>“Suª'ÅRËa)¸HH” …œývƒË¤`›TL“%¨ßz)å"ëÀ¨áFH¡ðksvH˜m® × d¥Î€Ö÷Ç,õ-i¸S½ ‘Øè aÄv­ï1­°Ž²à?Fþ;䕬£EŠ¢Z­¡,O2nŒñ˜‚¤í-{Q ¼§ÒNS±0ϺèDé"eù´±j‰b}UOÍ2ª¡NS÷,ë7"Èpl~[¤†O:©Áz{9jXÕ· Ueˆ[K%±õW;#õ–Û«Im´8„挅aWžµÎ–kêOÛÚašÕ¯ze¸Øu—ÐFÉ]>׎ ¼Jñ&µ£ª¯&#›þ®„h"wrªÿFGåÅpûI2¥]·ÅÊÙè^~½±ÿãvLá¹¾Ëô"´U}w‚0ÒX°5BÔZg«:Æ­>ª’N-SI± ÏÊ–à$¹Ô~¬ž9ÞI:Fi[1ÚµËiÇ^ò Æëº(x±ÝIÕ µB™ªÆ³Ê_W.CÛ±fU/¢¯ëK´…£Õ–Wþã¦Vž£MXÎÊŒ”™T¥õ§UݰåFU¶{cĽÿK¶æÌjÛ‡ØE~z:W é›Ð]ÜɆMFVµ*ERÅ =!õqipôkUàŽRÿN*=„Äc¶Æ³[áw¯©z,'žÂ§¶¬¿ÊƒËz»/³Æìñþ™UÛžwƒèk¥€8¤™¬—$ 6)cµ1¯h/ýº±2„hŠÕÊ«:©Ššç0 ­pºv4“„yV3Bµ ÍÐêP‰ ´SÊ_lï{?I1mdÃî1.ˆ®Œµªk¡j&VÕøº¡Žn’¶§hK>„~†ÿle˜"G½¶S“.!gc´-5wÛõÜèNSd&Õ†¦–ÝyxA‹ý5ºáåÂcRÛ\ƒèø0ƒX8}5ûèmƒÙ vù[%MûÑ ¹B"ÇÆRe’‘†V=…Õ:)ˆm+6Ú‘­Óú©9éƒ^Ö»ÛÜóUøv‡çÝ'ilaEmÒŠ¤E©´*vl¥“ åh®÷b "C'lqdQ‡'SÂÜnõë#j Fsnc´OßD%ˆ äÓ@Õ_-Þtkµú È2´„QÓ¹JÒ©j{ŒcU¹ÖDk§ÝD+Z;üXÁd„£d——Eqôji§Ö_ÑÕï÷F'G¾ôkb³eGúxÂѮ×å€Y¾Ê‹À}í7¦z¼A¿¨H³±Åº º_ްÊ" 1ú††§+!ul]r«ÏF5)VBÛ¥d©æC@ÁfÇæFÙè~] ëÿ°ŠÃ§wê[gô"ö:T:>øØÇ?ýÜ ßsSÙèL(%2i§c¬Pæ2©¯ògq6u¸%Ó+WKÇ)Ò'•kg°&žJ‚~T”2u¨Q?Ƹaª-NœVµM¦©ëÐ@=Ý¿6v¿2šÛŽÝrTôƨ ý£ÖÓ´Ù!VòQ[&^«Vk{í>~þáƒ?ûʼøð©_~û»ÿÂÇ?ö|ïùðý÷¿öî{±(¦óºô~ÿ±çžýw¿øÒŸøì§ÿ©O~üñï¿úÞûñƒÏ>óïéåÿÜgþéO|üÁ㿺 ]Iø_ùòÓÿæ;.¥ÂQ*ýÑgŸù÷¾øÒ¿ø™Oÿ3ŸøDo´œ;úáçŸû3ßû¥¿ÿí7Þ» Ë{*âßxñ3ÿÖ_ú̃§~ùíïN¯£;ÐÄ«ïa¬iŒ½rù‘½=¯ßÅÔÃ~?µöÚrƒfOðÀÏUø¨*‹¾gCµÎFcm5õìe¹¶MIÛ%$L"mLOmtïHïóœ<¥S»´Æe!‰‚‡v®<™ï¼ýæÃ'U}£Û¥9ÂE$pœÅå¨ðMÛEEa*EÉs÷cu“Õ‚ûXü.ÓÔ[¿Âž4=¨¥^T&aw]”t<a´dhnÄ…()›Vtóï ®—èKíwTRø¯Š¬¥wÓ±Zõ,QU»—4"òÏ…c£JÀAß|ÿýŸ}."^ùèG¿õèšÎAC¹ýé/¼øw¿õú_{ãÍ}ṟxé¥_|û7=ŽŸ~ù ÿïëßþ¹×¾ý¾ðÜO½üÒWßyôU(¨ˆ¾òÂóß|ôè‹Ï?¯}ûR*¥ÒŸúüç~é7þõ7þáçžýW¾øÒ/¾ý[{Έx*âO¾øÙÿû›ßúÎ㫱µÿðK/íWÞxó`ãut²aG6 Úâi÷PÍ I0qp õ­ÄãàA&Û -¢‹Ê9#àÎ$*Ó)Š—:û*«@ZžI—'¡¹äj—6:‚Ȉì‚j,¡ÉFwŸè¥|úúubÆF{q~×W *[Õwæ4)OÚý1UÈßêÊ¢RDÔµºiWíw¶'âR ÔX¥t«è1òðÕ·Þþ‹_ÿÃãUúÕGï~üé§þõ7"â—Þyôã|ðågžýµG,gDüÄg>ùÞ‡ÿê·/TPÍè—ß|ó¯¿ñóÅÏlŒˆyṟzù¥¿ûÍoýܲhêd!k¤–*,/-ø:|^¿â#ƒF”æ@R,µ_QûþãÎèspë)sÕõ¨Â0u±U üj«ÉF5iB0Øt£!š¶÷jÛûHmŒ‡UH÷·Oª;=Eï÷Ó÷=dÆö ϳ'[/Xük£Ž2£œù¥@+§J™1ÆÎ\>·X³ø¾ ¡²J¯ÎVÚØ’©ÂÒ: TšŠŽžö'yÞâ'º‰¨¤Ve•pÕ<Š]×éãˆÍmmÂÙkÉ_ºI1n¶‚7ÅoW®œot6`h*ða²‹ºý—V/d_sTÏ>ñ›o½õã/~ö›ï>z*rÇü§>ÿÙß|ëíÿú×ë¯|ý?ö…»À×Þ{ÿ/|õÕÿíwÿ¿øÙ iøa‹ÿù÷¾¾;þ̃Ïø‘O~òg¿þ=•ÿØ Ï»Súëo˜ZÚ6FÄw?|üÖ{ï¿õÁsΪûHâ«’¯G‘~"6ÐÆû-ûóVGE|ûB®‚ÁAû!Իʰ;Ž‚^‘£ŸT;‹ ØÝÛH|…„»ÔƵbFÕ¤V`K¸æŽ{K7n¿ùèÝñ/}êñ#/<÷égŸùÿÞ~»êõCÏ?÷μþøñ>zôƒ{¡·ÿÚÛ߈ß~ïýñù‡v¿ÿèQD÷ òùú7#âqÄÿúêïýø‹ŸûáO|üáSOýÚoL~÷/<ÿG"â÷ßyô¥çŸx}×þTz¸¨ÔÿûßùÝ ©´£w[ü¥ßyõW=ú5çK¾ôüóÿíoüÖ1³þ›o¾õ7/_›]9á× Q˜LÕ Éºf%¹tZ®àáЭ¨ÉØ™s)êb,ÿ’¯î¶y|ÂÚô摲TgyP‡Ke¼”S[…qˆ,lé§z£ÍAšÝQˆ3ëm[î+áí—tíoùú_zY–pú¤«Nø¸{ýé`fDlUßÙÖQ—.êÂE¾¨¡ž%¶*¢ÂD-†o5rlÄa£µ p0üváJšBI“ sŽç!U«ö‰¶\`I’ÂÙq¹æµ"åµë-ùŽÙZ¯ªÐºB•t9šðĨOoŸ¨GÛ£Û©£5×_= iíéå®»§2=~\‹¿ýëŸûô§ž~úüW»¸_yôî¯|õw^þÈÃûK_ü?¾ùÚ¤ïKÏ=÷‰gžù™Wž*â\fì•ÞS™|åÑ*íè—Þy´“ùþ"“8>•"ÿÓW¾?"2â?¼èзA {®!BMÛš!ž•.+ÊÁKv»rcƾÄç¸$£~ÇG.±¨“’oöðƒå  ZUÐ9&?\wGcáÖU TÙï¾’­Íbš_:µº1¤‘ò.%ÝëËP.af~äÜNd³—þ¨‹ý±¾Ðtت¾3¦ã‹:j¤ŽTkh„£Š.\R©$ IDATôRe43…d¬5.¶}^_™jË•NJàœmµ¦9S‡˜©†£ƒ T«ÚØdu´rÓl¯ZÖz¶‚³÷ºHËÓjálN½&å*¸P¥pë—v§'¥3n€"Ìc6—.„_}C%¼öèÝöSŸøß¿ùÚ¾ð\Dünýs»ýGä‹ÿÏëßþÛß™]ÎúÉÏ|êåçŸÿŸ¾öê#)!òó/þý×_ÿn}¡ï#ŸzöÙÿá·þÁ|ðaDüç¯|ù=÷ì/¿ó("~ècýw_ûáçŸËˆÝÙãɪôÆ{ïýÉO~|÷ Ïç>üï>²œ_{ïýÝÒˆø£Ï>óÓ/áBC_ }åÙgþôç_ü…×^«oò$çm`G5ÆÈ¯á±ƒðEõR°u+ë±}/²Ã£ˆÐ»@s­ û%ĵ£óë•WE6vÎ*ç’M !SÐ@sï ?4\E;¢Ô«Ø'ÜÙšfVKÛ7º³D—æv„p—þÒÕ‡ú•µÓ…Ali-¶ªïŒ‰âІ" ]šêlybÁ)ñ„K-6XFÑ8èŸãßIª$ÕiÈjR´×ö Áö˜µK?®ª¯NH3‚J£ °uõêœ[bìE}­Å„Sò’D †¦JL ÿjIíCMMW¶ÁâÏKPeíèv{›£p¤Ÿýú7~ê¥Ïÿ—ŸüÄ»>þùßÿú\±g3>÷ܳ¿ûïÎÙ~ôSŸjÿÉ+ß¿ûøýÁ×wµÊÿž½ððáÿùú“¾ÿÈóÏ¿õþ{½¨û½ï¾ó•žßU}yê©ÿì¾ïAæßø†VçEUúÙ?øÆO|þsÿø§?õáãöWþàë»2¯RþÊéÏ~ÿ÷=ûðÁƒÈˆø‡>ññ_|íõ¿üÍ×lcD<ÿà©ïyú#}øpÚýõ±ñ¿øÚëù›ßZzhØÄíªÂÕ‘°ðÛñ¯{ÇþÎ¥rT[tH,w/rÈý;në–³­Ýk$Žqf6”¢-ÿ(Ö>!ÙAIC RÕ #$Ñà)›n·‘c Šöm£{Dx‹¦½uÓ~–ìs;é ‚Æ›Bó¥/}åSŸ}ùš&»Ñ5’Q“Q‡±ˆZI@ÎyF¡ŠqRÚ jà…>úN¢MÔ!ü“n2ÏùâÆ¨F8M¢kµbk¼ °¯¦?GøQ3WK]É/€ÝP:¡U¨½n†¬E[›h««ÖŽ;5qDd¦– ›e¾ýÐóÏýôË_øo~ý¨_¸]-ýÌ+_þ‹_{uòŠ¿ûGÖˆÁÄßCF‡l1ë¾þÊyÇ0’ãõºè%5öBޱÐÑ 4õLâ_?ÖÙØ*!UŒ¿*:˜4TûZd‰€làUM“sÏ™€˜« ¹Ñ;´ü£ÆÎ<ùÍÒuOؘ8n-È´—®»bÒA©É±Ú 5Ó'\Ì—Ÿ}æ[\è»>ºßà‰Lƒœ)¤ÝœíZA)Š­ '÷å\ïªà2J†ß±U_˜Ñ¾Q,tßÐÆÅT£ê§BáYUÒ”£³Qº¤=¹’ÀI©FOQV½–h}6¤¦ß`[hç1ïЦQ’¶H²Å^H¯'¹.ínËÄ›3ñcUîõÍ DU§¯‚ Ÿ. Ûµ¾ó§CQíæ9€à§¦+;ŠèÐv;P† ¬¨Ø¶ *Tt’V]ËV}D ­Vªê£ÊÛL¡)ãÒiœ€Œ¶X=UÂ5–Zº¯¶ýºÁÌÜðI¥¨ åS˜ïJÕN`e:Mfd7~£ó¤Ièï;šDÂÎ@6{ ŸË}Õ·ïÝ"àý颽ù’¼Ãsà[•ìw‡j9‡4×HóÒ~Rùð¥¥U ÔòÜWª’´6†XJÈæO$Ø}˜¬ýýÞ–{@ôäÌùÇI_¼‚1\ÔëôOíÞ…dn×úΙlðÀh¤I<á,²…K£Éº¤ÈGMއR’ÑÆÔ¦KÁ¿Ä™Ëð–l÷¨?V:eMÎZ¢éàŒìX*6ëcýãzNj :@É æxõeW‚ô<Ô~MY=FÀ%ë$Ç¢cëyT46Ye’``>—Ω X!á·ÔZuW»íÐ)ŠàUÔ²%_+€a5»\Ĉ¡íÇÁ¨‚u½—Ñ+:œà$[òi$V²ëDA]ýpŸõmÅž\ˆ*wÕ(Niä~“ÃcâžîaQ:ÇÖšXJma«ýî&UÏŒàZŽ®ãÙ:dRÇŠ_™ÛðÆö»^õeñªƒs!Í…ÕGª£ÎvJjZ q”,2 ¨F’®–l%ZiF³EÍ,Æ9rªRãˆð1æ«zmd&­¢ÖФY!!l*9mõXmóÄb®Œì–',Ð5 L«¯F…•„kÔì郒)©öö‰?T1o£“¡9®·ü6HÎQ®EûR°NבJ(ðìÔ–R-—W®¯–º\Žã´´ý©}GWN®Ž*ñp¨ƒUÔÄ+P/ëQê~s¶'$*PIOË¿½ -$Ì‚ºÿ6_†«ßšlKUÝ؈ËVøÝ5¢;-õÅ z¯æî£íØÏö¿xªª÷à% FHæ]¯ú,е9€\üôãfUYì(ë 4—Ù¨|ЈØä €Ûx€• ßbÜ•E“®(®Š¥´ ºÍm¿D*¡b.rlÑ¡£Ð”-´¢Dˆ*VaÁ6vG¤–…ž<½J²àWsíêawNW ]q?-Á]=؉'e÷¯ü]½õ6:"»ÓÝÓH‚NPÅ u”4ŠJÓ í-‚®Åö›1ÞÊÑß°'>KwcÐ ]úÌFP•²rÐëÈi±…€ƒžvRó µ_ˆhÒ\TÃy_‰v‰6v&\6¥€bÃÒAm`'ÚöêîVnDú´ü¨—±º£×9àMžz5OëÃq {ó¾>Å_ßuæËÅè#œø)t·³&ø‰ í©—KWUQG.=Í„tR]iT’Y4²Ä´@Ô¢jÛUÀî42XL¡³ˆ©tÖ¶ë”cœšÅ‚W“ª4õVD–ø„ë—W厇VÊnªeP#«ä#U CotòDvÔ-‘R4'ë³ÇªCˆõʼn£J Z2¢Ác]Ö·2,ú¬°ê½¶ ±Î¯¨‹¶ëÒ@‰‚ü¨«BŽWÅøF’@ÂuOžÄ?{–¤¨Lš„Û·{Oê!äW´óI”Gå‡äà7Dsy<9lt4yP§Öcú<úu Ä—ªÁ&ïyÏŒÌ;ZõiXÔFsÙúYl€ Æ&žp0eÚ¤b—1d…;á@ÕÚ\ÈÒP•ý°å ¥GÜNUK39ÍìCÅÒ4¨—E 6)Ĩ'-JÀŽ*x §ÏÁÙŸ8J“!®,aévj%†œ*}¡¡íž©b–¬šÑiSí Î!ùt¥À†!Îl³±XÃW.©íýl5noÔ˜‰ÍãƒÕ¤Eä`ô/å£û9÷l¹ªß¢ð›ÀZ´e¤á‰v#¯Î¦JssÕõ°‹aÓKÈ(s?†HN†¯j¸³%Ý´(¶QM*Æ–(ìˆÔJ׎ïýŽÝ!¢KsJz×%Vwz?çåF×+„8ÜòñÌ«>òñ¹¤šœ )þÕJAùíÔhT`JXÂP§qQW8då«•Jën©¢Õ©ji&Óž'|ZTà`~®RI É–(¹Lj jWLT ïjÌ™/OºLüRÛ%Ü´¹îöÚSjÝ*?Ü’ªŒQÂA”HÞ³…ó! ¦QàŽ¬VDÁlcý¢ˆ®“ÄÞx-×~ø:‡Xj¶EB»õ7ûµÞ1­óæª`,/xÈ<àH8²BbÐ.]²Ê‰©WúÌɦ‹*ÕÄ¥†¸‹¤ÙaôÈÊm²·v­ˆF~uvÛ¨»@xíÎ>3sr–äèKÕ­<…/lèõG€òDÐóü]Æ_¶h?ˆÞ-spÐ6†+ 6õIè“¥£pµ[\)ˆV!·†%ënÑA8é½TŸì"Í9ÄžHr5ÛJÕ¤…H§ƒ*Ù„G—‡#óív ZITéêiîÁĦ+Kò˜ªî92…VÊ„¬]ˆ9#PDN5&Ýໟ~4Úh$ë­!–ËǶcì]];¥ËÜ©) kø&%Û0PÆÚ¸×Z'ŽÞbÿÎ\4lËÿ"Ç¥Z”Ïåg„ü[—ô‹¤!°D]Røiê“ à±N­îr )hÁÆ”ÝW"ð‡¼…Œ2=¶#?YŠúÅí$Æí:ˆK6:]Ò{2[J,}: Uez (þBoËÄêNìg+½þ×]9<·ªÏbC$‹·ão) ®âþéi«ox4öÈD°D³UF)g«‚Åò—Jë¨ó2©BèBqU¡¡4;n×Q±@JcµZ•‘ª9Î"Æ=S!Twè,Âõ½bÉ Pµ&slÍ6×'ÆœoFæíi²”•ªYD GO3 mTSåPZYY¯W9sð©Qx2ª‘‡|…$P]Ës;×ñUÚˆ‡s4ô\ʌؓ ØÛ"'5g…²ØBOaª¯¨@cŠ¢¾—óÛ¬û69{ÿBn`s«®Èˆ¼±Â5ØKX÷D}5¤EqÐFgIútªméÕä5¤(~ч-1F¼ùoüV~?Ô¹U}²^ÛCU3Š ;ÇŒ7I6fØYà± lˆIÓµcY¤Ñ37õ²‰–äÐpžšì"‡z3¤N{ž/H ¢w ò¨’&” è1Ú®µÚIæ"ÇH׎BšŒ~Ťû¡›zPÂDÅ `%¡Õ›-ÖtÐ4QUksØ«4¢ÃéD£¦DfBEy¨ ¬áì…J²K-UJ8Æ áxÿmtrÊ®%cxùÞ~Øå¥ê»Znî†âÇÙµø)`ÂŒ†oÇs]]ZòFmœ„!uÂùûúg•ޤjŸ5–ݿРÉ{?5‘l,ù¤&ŒÏÖ:bl§¬ÿöê‘Ö`zÙmòØ•€‚~àWngÛ83÷³ªúR¼Y3šE¶ô±r¸ªãé`.ŒþT€DQ Dpâ¡b¤…Ž{h¯ ¤Ó¸ý£&Ý’Ï16ñ49Y2¥*ÂW˜¬ÉÜH=:Pœ¯S¶r¢^²ÿÔôu_ÉnÂÐÕ«" ù°Y±ø±ÚZkȺ6T(NXnÍñ:´B4 Òöô½Ñ‰Ú íd“=§€3 Já\ÄÂΓÔôb†ÇDäÆ:¬Y)a|1» zm1¨¹48Ghðl˜¶}Ñ¿-½ÔÙHý>‰¬WâˆþUyÉš+ì¢Jì#„6‹+C€]¦loÈA…ƒÔmH«IÒœ•…½lt~Dï`¨^±@ ÕÓYª'öŸíÑ…>"­9ñ‰VjÕgá†ÚIwò<ëg V9㶨±NY¼ 3%$:KœÕ:OÊ„I Óu®²iIvHÝT›Û'øi²Á)l­°*;¯YTf“.“ST5àÆˆ´‹Ò~ ÆÝÜæáÙ8B­œîDŒkA;­Éž°3B‹ ´ mLˆ|»sjU!-–g£“$E’IZlp ~Š˜6“Q<ÕŽ$¿ \•KéÇñï:ïŽBv';¸Y®×% ·;ÞÝÏÂË÷ú1]èKœxX½¨Dó#õ±=‹eØÒþ·J”è«Õ‚]”š(|§© §QÏ~²*êxs”Pí*2£u¨¡’- œ•]ŒôZ•Ñ£\T‚Ý&ŠWùø+°±×p1#ÊŸóu:ɪSù ÆD¹”’šc¦øn¨…1 *7C9þ‹ðÇÒ’E¯BáV)d¦Íµ4F!šðè e³.ü4~V0ˆ´lc» æQ/„ö áLYÍÞÞàߦœ¢µ¦Åµl¤‰Åˆ·`Ó4[ò6]»t3ŒqG£@n8„Å ºå)*!C“5­lÈ‚4E˜)QìJeX‘…fal*AãµÍdj¶dBŒ¥ŠÈ!Æ5Ixjôà!¿´ˆ^ÑíÎfÄòUt ó¼Ö`yÚZf ‡ÙéP¹Áj—Ì#æzöŽ2e»ž„ìNÚM>g²¶¥éprLÒ"iÖ¯úÚd¬2˜Áont6d¼‰„èúY|¶'‘^ñÓz’ž £ U‹Oqq¢U¡6\J¬!.H¤ +™¶[€Ç‡ˆ¦ 8M] ZUª\læÃ^¶ÁeœÀg;îǦ‰‘éÐ2áŽj!EK;$?E%›³ŽaSRºÅ­Š:ˆZŸk'ż½ÏâµQ]ëå$Çîk»ØÍ¦]ìÔÕÐýST©ÇVO˳!ƒ3'2ØI1–ƒ}-ŒTK§Ô…üª•†¯IzP±:b?\¾~^°õ«pë×á¹ïÕ@ç6B¨¶”|øÃ•}PïEà"'Äs\`õguo›7'!|žÈžB¨ÿœ3Y¬·#›ól7ä,›&5†+´Išøvsœ%õXD¿Ð£l"ƒÞ´Û sÇ@?N¦ÇàÌá®Ñ‹YÖIV};"Gœø«õò(v…§4ÛÆÔão€HU ]´>z 9PgŽbq”&Ç1.uŒò©Š‘-…Ae^€r\‚D°on$]‚ùö+ö¢!*tè&cѤªªÇ&GL=ÍýÓIÝ4n©ü;‹µ饖K< [¢á:Ú5j²•Ú·§²<‹N6:BÐXU 6 Ùª¡Ó¢Sì¥öh#[Œœ›qFµ7¬ã´å/ܺ±þl¯óç2qºè×=i…5mTa\±ý! .œSç¥Dg«ÙWõ„åÔ¼Ùdµ.M6‡Vzž!Y¤–nÉÃY¡e@37¦ëºÇè9ÙuL7=ìb‘Œ®» BYHšT[]°9%†"ÂÎb£³¥‰‡ªá£¿kbÂ!&“ !Üж¸¡`E41üª0jm””Ë}G º/]r÷ÙÒOõ¥Èq\|ÔAô—¶ã»€6,[Œ L Kƒ´Å´êº¨\h±SÖò 霣†‹kú1­}µºUæ³™Õ¦óæÚ›˜ ¯RòFgLtn×¢?É#f½6H·kÒC>•ènÏ}#ŽußGÆ«úº·59Žãp,úeùm:Öê9)ÜQŠ Ù`L3!l<#þ*Ýk$†p+¦ˆxòQãô-ïuUÚû&ŠN2mÓ5ª*I”SÁ2tI¥oˆ/…ÌÿÒ´šRŽÑ«NƒA€é©¶f{ßÊŠ›è€C§ÛTì <`£Ó¢&VæFè‘`$U*)Þ`‹:24µVê[hÀÑØ…òÉŸé„öÂÆ›9÷òàù.½Cëÿ%Ô„pv|©q\·QìJPŽÃ´o´‡ºO˜¦&[wžd±LÀÂ+v 1Mý‡ûN¬u$ à)l džvQuÙèœëºþ¼ùƒ4‡7Ó´õ¬½tªŽ—µ'´Õ“©ú(V†Ë,±´a–Áb+L¯)Â)œ´ñìí’jE1†"\¸¨ƒË•#2èÐUÐMa ¨iGªræÖH8Y[?U•S3JY»71n°.œÊ¹}BÑä—µ±T“Ÿx§M®šãC¶Ö ä@Ä£cYæ@ŠmtG‰rO'²šn,6:+UW¸ÎÐrìbÏ¢g¨É;Ÿ ›. ÿâN¿ón:tÀÓ;;*Šåq 8âò¾‡¾J8š‡ú¤.Uæ1ëâM³ÑÙ]µ›¿d¯óØ/¿ô7{tMo×B€¹6ºÕªoú”ÓG=ˆÊX+R¤Fý«tóГoo± 4©g!GŽÁ,Ç…mãYêN:œËÑ|ýorj4 ªbi'!´Ž”¼•¤lO%9Npɲ^#ä XPÊÚ× ‚äîÔ¥ÉÊ6ÙiQ#Üö @’€°]åoáîS:e¨Ad +¦ª,Fw¡ƒ("†Ì1 ß“:&Ä~Ûz½.#¢?—¼s-7vîήoóKY§z Æk ?Æ2/û¼Æ—ø‘ûÙZ•dǸ¥ulÍÈ8ú“DnMO’vo¨$Ó¥¢U´·^D? —Íë¤:IÖzZ…Ó5ntötÌÓ5õù.–ß>ö³·_Ûõ½aÌåàV«>ýª¤D7Jq¾ÁéÇÎ ¼¼¹0£‘Cë‡_QƲóÕÚìI"ÄM¡n’¥r\Õ6ò‡ËL§ièS! þ!*Ú²‚•v×'Ű,Ô£õº1[¼‘u´qã°¯p+Kðlb;:rÎ\%*GQU—‰OfdÏnto¨[VJ ¤Z%žæøQx•(4“VhÂU€²–;ª×Y—_€sÿ[¾åz`âOõÚÂKɸ¹ÞÖx’ÞJAçàÂ(ØÇÅÀÍ¡M@ð d)*]š¬JçI¶¦¢ii˜­˜ÕsBÎL½ä`­ø;Yþ-¤ßAÂg·ì¨zý„Ï>ÊeB׉M÷öª¾” ’ïK¯~€Òª0£… ¡ÔÛ¥6F#JiM­÷ŠbõšôÂ$~pÍj[‘îµ6Þ>Mʰm+FN‚n!3Ìq­C6Ie¶±Ë).Y•)Ñb{ÓÃS§´f£Å²È”ä4YA«9jK¸NÝ ¦lUµ"6úwZÛ¹Ñu–UZjD1€´º]+±ÿØ`Œl]CŠcM$”±<гÓj˰ÉCíG¸n ¼þÐ¥[¿54“ýÇÕ`Œ3Yœá»B“ÅP™Wèä$êI2õM‘fÁp@£ L–ÐîpÔòic)«_U©÷–£+¢ù…8û„ÏÉÛkz•Hï¼~ê#Ý^Õ‡HÍâGEŽöX£…Z:4%Á D=ÂD‚(k«!iC™Š%ºZ} [XMàÚÊ9 ¢Zɼ=™€]â'¤e‹Ž“2Ä=åø—J *·¬h²GX£êÒF›%ëSË%™óÕ´>A’„¨Úávnâ.ݲTrdÖ䤎…î¢6hcHUI¨yÚij;lË3W–Ñ÷ž“Ës\Ƨ¹¤N9—S904œ)©Ù†e¨ňìGœ®Üv+ºB'G8trÙÀ“Mf¸c±´h0onº)Bt=4k„ù¨Ïr’q¥Û»Ñm=\Š*1¼jGon¨8ñ¸_ý£.7[ò¡%ŸÀïúˆ4ÓÍñàÅS& IDATšP mÊ‹1BPj»©“)³Å “û%t¦uÖ¤XaƒÉòÚ`ŒÇù _Ù•UüO¹f2»vÖÔb4DRc>Ê­QŸ?âÊW-ÆF¤ÞhÏâQ¬WGéíºí´£XMª¢Îêt;ªZmt_‰L@3AŽŠ“­!Sub랟£ ‡£41sT)#r´æåE|±ü¢/sPyº ´ÿÞîòÝ¢ ½Ý8ð9mmŸø*NˆFq–Ú ÙšÌ~‚ú¯Û·süwÚ„V;G¸ØVHÈÒâžØ<{µãD`ŒºÃòota vä˜xçþÅm`°¤7yÞ`½·j±<¼ù±Y MFÕ,MÂ@¸üHNŸc\™à>…ý×Mš?ÚxL-¹:E{RÈáÇW¦ªÖHHŒü:¨Åò”>O¥ðÓjbÛqj|“Ù±¢èuÒÕAÊf*. gj;´ˆöXØ¢¬6òh»EçÁƒ¹íÇtû[ÁI6ºdÍJm6Ò©††œØH®¦ƒÚÀ]ù@ëþë¾C³“Z×ï¿#"×»=ñgÙÑUÅ=Öå§²ù4 ¿%UnÒÆÍ·%ꪕ4áìD–Zå? ûšhªŽ]™ ’èÎãß Îlt2¤&f¹–ÈÓÿâAÿhß©@gûmœýÒßÁËwÈp…ߎnéZ_ŽžMX‰Ølxˆàð½¢FE‚ ¹»&7¹S"\m®+iáÔÿUc0vO9ÛC%-&é Ï3åd:º³s¸}”°–š³ ‚÷_hKÊúF1.‰=šäWµ ÍÓóíU³íBªíÁ´Màc“ö¡/$ùF]æöîðŒ1Z49‹d=»Ÿ ‰ã•+ÓXH°¤¹y¢üt¡ŽŠX-æmn‘›ì ×X«dJ_:î[‹#T/ÜÆMRõi#j˜#¡¥i2Ê_:½K˜ÂõR‚¢˜2£¨ýækQMïÒEµÜ>V:6‹HT‚µÕP¡·†“ë²âî,aŽD—šàÛ‰oU…QÖ­´`©HÐNôYU†J¯ßºÙb€V õéüð¢?RÔÆp+D”17ªÉÆOÌÍPµ¨ I(TRr­º#i¡h‹C#!l<‰±ìâLÄZéÔ{z¥N¯Èéƒ:-éÝ¡U=©cí?ÞŽ‘¡‹ÝÒÓ\*¬Di‹@¥f4ä´)!›â²6WðZÉ"JZ„¹b4‹€Y‡œŠ‘‡úNƲ)³‰†šƒsÜAœéÅ^_}z>~§Ñ¶ìÜìŠÓ4&µ/J8!"¤©I4Æ<­¦t°Rê„Òæö¥ÂCìËd±¢naŒ“µªâRTúG-a£ šXÍ‘eᔘ+¤M-Ëp{1 N.öÏ_GY¯ÝU¿ý ù¾|ÄUšÈñцjnêØdk0[ïi·ÐÌœüišhÃX­RÄn¶pD>ÞÃa²²ï7ÞêIWäª×ë‘,)^Ñ@ôcÂ^Þž…uw¸Õ77ì(§é,\Pi.Ø 4üØ$¨äØ«Iظ1¢ …6¬N*§Å× ÒCþÃú­sâj+–@Q¤¤¢f„Ò ÿž”p’93©NFƒlz*Æ5šÿÕò¤ª†nÒÍШmÚiÐNÚµPÛAÉïGjr*ÝÖÆq{€F#ŒVbqÆ&6ºåh‰m´Aõä¤c2ÿ(\$ ïT•DïTh±‡bÙß¿×"–wú!ºÊþSÀ®NN©:䬣Fqv£š£)Κ¤‰Îb|U 1îÉÖUIÄâT]h³…3!B¢æúþ¨OïáÔgrê] (pÇfæG£¾¤¡ÕU…ê!4þ[ºÖ—â”zvÒÑÊÙQ+Ú‘&À톷ĖOØ®UFsØ®¡W ªpAÎ.]µÚtÖbä*ã¦¨Š‹@Ç8èÕf5»OiBAØd«›‰©YÕ+Trr È.“žB¢%£mŸ¸oÅI¶@£¤ü­”<¸CЦ­ªMæHCj¶œmtÍM[#i¸á>vRÿ³éÇQ¥=´Úrøíx _xïÊBžÍ"sò t[òi™ÓZl$4 _˜#°Šÿh…4nÙŸÅú±RòÊÅF×E…ßêã4õ"]ú£î¶ÓòOÇÒ‹~özàžy™DÜš©á°·ú4ÝÇ,÷wV9æ(Á‚mŠ(m¬—nxKlÂ¥êN3,Z®UiZbQåFB46“´¼àïý¨P¤v¼HH£Û’.žÆ…¾ôöÞÒž²¶Ø¨"~wë6vÔãêlHûÍoI§9™rùc\ŠªHQ9Q¬Æ¼Ü°«Ú?†lœ£æéÚm0V|}5qŽbŒ[‚¥iO†ØÉ&8…›ô=Ejn-,6#†”ÕA6’LlÕ 5Ðu¡C䤌«Û‰–8Ù4¤ð‰îèFg@6o¥ó?llb†ÇGy{ªlŠDTË“W†o[Ñuiû^ëcZ–î8ü·ï«ÁÅ’kmžV“µ$›{(lÚÈfñšf; ãZæ) PÛ¥8¯Ý³Ð¿‚$-{H?äÛŸ„–\^ì¹ S»£D~¹ÕIˆcÙÛD©Ì³ºk¤ºYê^pïëÛ¡³pe[Eè¶EWÿceg `s€‰<´tgí©@8Iœ L–bp,œn›ª±RvY?Ƹ—Ù&­¾h&xÐÆQÛØ®`>DxµâM4?êñ­‘Ö0&Û’ò—zQ;``U ¹!ÇØX­#úÍÄiBöž¶?Ç^:;»mt4)^Åö ÍRFé]°» PjÑâ"kä‡G³ì‘PGH;Îþ4Î5…W2ì.úí¿_êF}ñƒÕtó« RŠ}ÐY›Þª,@}£Ng1zSaÙÙ\Ð(Ê„³³95¥ûfG'Mú_½…rå„Æá¼¼œŸ¶2Ê×+Šö·úÐNº9Üà0™äMP7ûÛ«úh„OPqƒE<˜ hòõI ºJ‰óRÎÆÈCuMŽK®Nѻ˱Qƒ±Åøv BèvÇQÝtÅà#ÜÝÊÈ*áI/3ÒG~¾K×ð¸Y_5%üÛÑí½¯¯Z EX!±…`yC?%PGÌ’·HŠmeeӮϼÊPlŽ™[-¡'KGY¢Šô1î—-HóV ŠÑ¼-OÊ_ÍkJX¸eªÈÄ ²Ý‘*ºFšÓí¡æc<žäu²,»(MÆÒ.ª0Ž«˜š0"˜”©Ñ 9е¡k£Ž ²>Ê‹)Uþ ¬`9µ^Ëßp–BeZŒ]®íËo]r0aEt¸m,uv¤F0I? (,bª°› Ý(Y1Hެ†1šuujÒ2‘¼Ñiþ¬®Ýf¹o¹x$©_²‹X…£(zÎgsoóÓÇ{š'v‚!WÐý¦¨®·ü4[x”£à^áy ˜¸Y`¨OcR¦¶¥T [Ê”U vÒ>§.2)ÅšÛ0O š|ö« ÃUE E-héÚ+æÄ ©*Ý>ŠIY‘IavN2ñõƒvÐQc\Sõ d#ÍUŽJ¨¤©Å¨ü6º )º¦ƒ ‡Ç´¢×~»kƒ&†'öF‰Çv6D«¥1—v^bð£J{XÑÍkntjéjköUsP­”¿b7:E:¦¾®¿-Q ­Ý>c,ê„…>»¥RFïê´×úèG€1Â×Û³6 â]‹Û»Ö^Í1'šõ°»†=ŠmU¢¼yª&^͈9µüÑZIÆS´P˜’B`ÅïV˜6<÷¯‡íÖj#’-uxKÕ7ºÿb<¶:“V§`‹nÃ-CÀ̳àì„“ÔÁ˜À¼6.wˆy"!€,–¸*,…¨åÚ)ÂmtqRË"¬n°5·Þ…¥ÉÇ&¢‡J»ˆè(×jm“ðú¾Õÿ3 Å.0FÌ„ê¢;•0yº¤Å†AÅ_1‡~ g } L„UN¶ÇØ2Ÿ6 +*ÉCr6º}Âû-±à t;6{ů-q‡~Y§ÏeÁ³Øh_½`_í€ggEã!„|„4–ã]ã­þ®óW 4÷uQ~Û£øx+¤Õ²ø·cÛIÒײª¤t¯À¶K¨0¯M&:4Rж”@BV ‹ÓbÔÕÚ¥-%TKEÀ²¢ºmœ3+àÇõ¥‚Å*v*X†Ð—n»m$iQ`Ø6.žP—’̓ƒz’JÓ VšT;§+¦ z£.HéþÚPÖ¹Bsæ'ÑoI±Tq;^ˆÆ­×rýw2‹7´ÎJSÒˆ›G]Œª…Çj@!aMùc4MÝ"2sM¬ÚdýU%‰Ç6Ý*ßè"T=Ÿ³uœ¢ç¾ôGq’@û—êºÖ¢Z êÓ\, ºY:hä·ôæú)©B[¶ê ¿9~ 9F™6 Þ.iŽŽHÎ++ÅÎ8Íy I¦¤Y‚ !ßy)‹céÜW A3Q,Ðê%µ5)%ËÖ}þYÌ?‚7õT¬pî…jÚ±â1%j}Ú21ÒÊB @T¦GÌáxB¶³‰5XwÙh£‹FÀXŽ‘*+³–ØÜÇp%"%xèùúˆÎ±¼¹apȄޣƒî[’Åû1†ÕÑ$]ã*v›H9kÛ¦}ýx0õ¦ T)‰†8ßLº1N°3l¶sû¤Üúèèš}À&‰ÚÅ"•‰Wí9W m(íP޶WõçªÒdæWOÖO5‚Ãí½¯oGŠ"ÑÅ) ̧¢@ÑëPBü·Ks}4TãG2„ e‹L)²NR•rtåélóUg†áÖBZl*±TM‰ô£,iuE!Í©‡öã©fe-·Za&1~TE±(„T¦Ú¸•s jNÏjvب»nÃØFMCV•ð˜\¤‚Ù1ŠBj|˜K™—±šùuµ¥T’B¥³ºc´½äò¹cŒ´9k#GêGÊO!±«ªñlp¦ÑõTÕ±WešìQ¦Fc›þ·8|ËÔ«»~¬4¹Ä·ûkBÄxΖŽiigk¼É3?o–æX«â!÷¹½;¶hΰ‰va¨àNŽ:dìï¼ZÃA¿¸‡Ñ“`_¸‹Áð‚îƒë­¾¹ÁPÈ¡ŠÂ–+4-M«N‹i¸b¾Mꎪ DjÓU XgÚ͸TÔ©ò“²æÅÇ­àŸ„}šIŒŠ†› ѺF³$/­bLRvki”S!š§îªÝdd¦œ…ÛU Q¿”E9M4±ðEg‡ÂZ.N¼:¨¶]ÎiíîF'Mú•H§NÊÈMÕ-TšúS“±V€Kˆ,†Û1vÇÃof@0GEH©¶ÁöC”òH³ZH”ËÑò.aéElB«¯úGJ Ö*Û­ UÊ0¦´YÐu‘^ëÿvdƒi -|¤ cö^Pó›ºôí:¨òè³^p ·TìÙ@hqWˆ…çè­Øñö®õÍ—QÃOH¼Qø†Ìøq„N„zÈÌq¯((júDNÝÿƒYÞVÔˆ4¨cGT¾÷ÕÂg¢•±„äY3UX§Âù:=4¦‰µiE CÏkaZC\JÒ¹µZQâ ÷W™Â&þtü¸ˆÙT›Aën1µ2+ƒÚuï’nkí"l´ÑBÁæ; ×4c ¾šd‹]©–ËÇýšðU}ì^µ—Àã°;æE~‚+äTð;{TAcÇÉEÇ"[ QÆBò‘Mci:KÒ¡{wý8WU³i%gЃÊãÁoošèÊ]I‹Ê'Kö*–Ç–‚ôàb  €]¾½8yrÌÍ|„M žz@‚ùÿö®õÙ€®^Ž<¸Ô¥ T œÊž:²e’=¦%Ò½=­çÙô˜Ô[ ‘²wU¡`“Ï )P„ŽAƒ©ÐjZˆŽ®¡&Bé Go2I;%š|ºF;Á[&ÚC =„$«Æ¸²Õö#…­9YðkOE±!d™U¬Â5#Û¾ÑF#¡ÆèmUÞêø™¥r $|´Í֡϶‹Ét­¯`½½×ö·4¢µ…'{¡ÊnnsѾ*²…ÍCd|MZ4ÿ‡´hŒ=¸#¿Í/¨°бÎuÓ….‚aÝ5ïŽå¢½©R 9ˆ~+HC`Y¨÷vÞê œHˆâ+ Dé¡*Õ#nõ}}!EiZ)3&fj6—5ï×÷iz•+ª_ÐdÒ5"Ùª …«íØFfH÷)ÆS§hš„sgç]æ6Ù¹ù1†”!Jé2YnuޏÈL+mç¡ö¼âÐF7B))2æhû±´7q2õ?džŒ;ÞEŸ±Â~¼:·~…?²*ÛøÔª)ý˜T Û;Q»Í[ R` ¹^TZ×6n¶[“²…¢×êLöjS1LrdÞ$p³šk'û›:ºV†Õ”>©¥º:‡lö‡öÞQz" IÓZ.á Rª)|„A_ñ‰"?èÑ„yâ6ïð´ñ¦Ân½Ú3ŽÄkgAvYÂm`g¿&Ën‰ú2Rð&‹£K¸˜I¬%Æ8"N¶ßPTŽ1ÑC—LS@ê…4m§2ÒŠµ©qG-êö 3(åT"&´jŒx*Å"ÔÖ T¶yp"Ö'gR…ª‹Ñ^Zˆm—±:ÞèþQ­M[ ¼ r²ÉX£É·X%¬ÖœË8 ¢J}pW7æþ „q¥1:ÔçvÆèl4 YQ¤Ûņ,‹¶z/Šº”Õæ •öÁ‚êlC•_Ô¶ˆz½DWòõwqzŠº·þx§ŒD7¿Ð×OÑe½>n?hã êôõÓmWwÒ¯<’!Q ¤ã8¡§¹¨7ã1+‚™qWü»ª‘ŽéE6‚±P«gØœ@’F]lÈ‘G»£Ø\:¯áÿCV-™ª ÊNÏ*]ulãd.‡uÕΓ7t<1LÝgüXùe:É/TlYhŒ6AÇj(¡•:bæE8 QC²ŒÓ5ˆ®‘4 NÀ|Œ¨¶ŒVy06îšÇÒn/©íã°¹ªs[™×?j/„›¯úB +aÆnÒ¾#MÚM¬!Æ–æ ¥í12ÓèVBŒœyÄö"rÑc2O¨P&{¦>¬?R¹¥WçúþìãIñz½êWyøÄΔ`Eµ^W<áJ¯Sˆ ,'lš£œÝÁ-½¥] Å\á<˜Ô¿KD›fW¦:ŽCÇH'2éÔÓ,q°…5ÌÈæ6XÕ¢ ¢à9dzöTÂY[ÈLÔ¥ìCChǹJ'JsS¸ª³Âú'eeíǵÃ!2è-᎕ìÙJ ÝK$2ÿ æ¨NYãëOÚD6zRÒŒLÇ.Î'š0TEA BÖkn#Bj À€Õ–uîÖ»=—wñE†»“ãÁò—~u£þ³ÑB„ °[&Yb¬M¨$G“<óIŽ iœ€5Êܪ*޽ ÛYoô¤T=ãÄÞœ©OfŠ1öpª¿ Æ]ÔkwXàUÅ[/5éBß9TzHOiÑŽtÆã[½Ö§yª-ÿÂÌA x7'K1,¤v’ÓÆãæαjº6cû¤¢!ÝF ±\îÏÜG„Róv bœd¿9¶Û¾m‚zÙ¤Z”%‹³X2T¿ij×Dºâߪ—UÛjØœ„]`ÛØe¢FuJAXŽKt6æ²ÑÅÈZô$Ô¤3“~ÜFÎEœ$‡¥ÚÎb¸5«1¿jQ©ÃÓ>ûßþSíþ }¿Ê×DB8—»¯D ($yöF›ºµSÒ¸}0i¥˜Ý1Ò Z«8ß³x‘Áf¨.CÕ/ëzcŒ;î©»+º– ó+•g½W` ™¨ÉŽôŸþŠï|HáA51W€ ÿv︽§¹ìÈzsU9œÓö]–¨ªât«ˆÈŽ,¿µ&ÍÇmØwé•ñìr¼¸ï˜ÃÌHw›tî=Ñ iB¢dc϶ѤlÇpMàR ÔŽ5'Í‚8º*ÖFµ»>J)œ]ñ›p•¾Ÿ­îÌD²WéyNÚX= ¥3ëE¿Þ~VõÞŽ&ù€È"±cR§Û~_ߎ´'Ä›ûãÇŠv'ç7FIh!à” ´Q˜&õRìo+©-‡P2`Û"œ°v׿v½æàI+:=®j„ƒ°ì´H3¨®ZŸÎÏÒqºŽUþVH¬Π­[eM O©>*D7˜„ÐD*Ò]yð<lt†ÔÀò°§m´š&^bCórªÅ`q훽¨C Øî‡Êˆþ :ãe¸ÀWÁØõršn&¾# GZøi;Å:ê¢ñªFƒí”È?Ä\TÒG7V•A m@W IDAT4ýù@1ê¼Ñ•‘ýEþ¬ïÉÜý¥*1b` !*Ñ ý~#‰½ˆ5ªÞ z’d͵‰µ+(R`*¥[½Ã“âMU·Æ½Iéµ0³ÕÅcDÁ6•R/KOsgS¶OUæ°Üä=ÜöMµ™¢*í&0ab=)˧Ç!kšn3ˆ4mÙZà ¬™r6n@Œ;…¥¨sÛLO]g ë!bslW%uj“ýPçkE;5긊âXb³þ´ÑYQå óLM;®ÐF ÊÁ6-%G!£øUŸå`apDo¹¨š³PFïe‚Ëoah[àJÜc䎋Ea*à#eA…šumɤEÆ.ìeåBÔ{Í…]j S£°xä›Ì5]‹³¿âCKö¢œ¤wlj:«WÏêÞNë/”?PøœçŠnµêÓZE½ü<¶ïŠh^wØãIqQ­¡ÆûÅøÕß.„j´V˜ð~¯—g ì:ärº…DŠRÊÀŒ@ª+È'¨O ºÉÇpëKšhºL§­Í€'G6‰Òª5g´—#êÌËmWÜ.4቉9‡lFÖ½*"¸CûÚ§*îT¥ƒšøFçFÍm#F›ƒKa´[.I4(+ÇÆ£þñ^,+†\΢ìÄŽX,´ýÕ—îÚí,ïa®¢¨UåÂ8"Eð¾…¬½+ÇÂŽ¨¤†;Z£"%Î&#¦›] f·ÑUþè®_gÓg®à33U2ìŽéfQ[¼ÑEBË>Óe¸kì„H]CºCê³1zè¥é¶¯õÑ)Þ>¹¼Â@‹ 'PQAò`XµÃõ5À[Pb ‹©5•í¾<îc… 5k„Ì_“Qõ›èާšN#ÛΆt±ŽÉúr[%à sîBñ¾¨«f“ËY”Ðoþ¤Ç{ÊJ°´ij»gDÙ¦#Ѐ¬Bl`¬âps§9o¯ì,l  ^:eJ.*Ù6ºÂÝUE­Ç:ãÜ•wA#ƒ/èÑG,õZ¢6NUºJ±j=ç&꼄SùÛE”b<77쨊÷„¨´AÄE±ãǃvA[ßFPm{Öv½‘k‡þÛü•ÿêÕËë\bù‚¹µQè *}½,–9HYˆj”'lÑþ$‘©Â8ú)’–½=ŠÅê{€“?ØÚhÅuoÐÒÈ.h…?úAÊìÔh´‹Ê$ŽÇ®6+¤Œ¨zêñF'OÖÒYJ†S€î –ÃìWööqµÿoTòÇ!·‹£æ[0F•ÖÞÛÚÀLÒHi=öž…‘„p—®±“ÕzÙò2ÆÝÓjë±;NŠœÁBž á¸] ií„?ç3ßFÞ£†XÄâS[ìõ:*ꨴ;™’/ ôÈÁze…÷‘ÿRÑ‘ÜwpÛU_'õÚûæÇhžmèñ·±‹¢x*jš£Zß:4¾| ãÖ_Ö¹;#ëß+§joK;Ïj”´¡…¨f« °FáÂéºdË¡×ÅÎ'Ç £v rCä¸èsÜãÆ4·…ŸÕ9Ɖ[`d%4Y+»ý¤dŽ<“zÒÝé¾EÇ3¤tžQt ªÉ4FÃOé˜ £¥)êfî»ô¿À+ž½»p|Øò¤nLY€kÞÐz!4ZFíµï<"ÑÐvsÚh”ó4l£¥âàJHWrñ”⣳ɲ'Kø@N½«“.ýwnc…qÔŽTÏ€Á‡»àˆú±ºôÆ©ò2ÄÑ92TÉO]ʶ‹Ë®œLÕ·YBÅyh´YÃ0Õr9ŽEHV M¯ aù¡?~ãÛ–ñºg O„ ¸éˆg£SXx|Lu€3·²äz´Q/wŒË~ÅNœ:Ù Š´j6ܧ66Ærj²ÊCÖQá0mb:4–]•Ž8… •÷Ô׎¥vFÐJj5G{©É„ØZŠ… \à"ûýxCØ)Ƴý û]XÎX¿;_oÇh0>*¿¼Ì=øko¬(å ß?kÖh£]Œu‘* IA•š†î h ÆŽÚ¢ ¯Ç¨žF9ÔD‘ˆMŠžïŸù\Ù§³à3Wè:ÛHÖ>/6.ЧðooÇë„·D蕉ÆÂe‹>Ÿ@#ø4zìîÿ­ê;¢x\m8ÙŽÉVômµIR¨VSØÀ§u/=S_È;¾•!qì>(ͤŸ¨"Wª9 CŒg¶2á–#ÆÅ´8A§E˜Å«³“ví¥+«;éØÜvÆTˆÂçM„v1ŠùêÎᦪϑª*­ *ŠåµvÖél k£Áˆðmè@³3ö¾Þ%wRôÚ,´DÝÑâ:OH¯î8r±ßê›õ&Ö¬Ø?F‡ÙŒ8"$+ò£È£1DÃN sƒáÎj­ã*fm @õ¯É4kœ, §ÌJ:o¶seD5ÞÁÇ`®âÜ},¸ŽÙ£É‹浜Þzd½FíV³ü¨„xÁ!Â0kÛx®7lUß-…ê&c<žCZ‹=+‹³Êhw’l„Œ›ß-ÿåù‡GÀÅê/Væzœ.ìWçÓ@“˰éç£é‡ÖU³{vŠ”²Öv¹‘l£<öcŽÇÊŒû§]iÕdãU7;ŠEØ¢X¤K°‹fφEO)¾‰ºe£S¢IŠÇ”l•Ƙ¾‹®«!ŠihìÝÿÙ…ßnÄmøÞ>t‘«5±ÑÂ[m 箑â(Í;F›îjñ÷‰š[D6bØ‚µ\Žg1¸Ù-²Ë¯‘h`ƒ ×Ç@ 1Ô:*ÎjèŽ%Z¾ÉÏêÖµrß‚[…v¨#Öƒî,ÕÉØG}Þ8¥¸§=P" ªÉ=F ¿HhĵbmCnõžw˜G‡;Î1"ZìKKŽBi6¥hí8é‹í+ÃúB ioßóÇ8…÷ ßd&l­ø‹’-ØÖ¹)N!™ª›‚š%OšªòlGjËÕ)‚/“îºdV>ª2ŠÖróãešì¨šcÔÓl‡ìI¥ÙO‡SCßèšÉFRÔc7“ÏC`lâ«M,[ÿµ^îÅ÷àÖºÀ\í¬?À9q”6ÆäuK¯]A{×­å°¼ƒF¯Ç¶Ë=#Ønm®ÊóI£Ì•!É“ÐMš§XÅÉÊ^•V*y£+ 5{aÍÃÂ9,½V¼WJ=LC l{áú^>z¶ç¾ñ‰¬a‚ÛÇž²#ÛðÎõº=S¬‚åq4ðºåI<Ü®õ]5¥ƒél!Äš3“„SÝ´‘ò¡E ÕýßAóG3L5#Ú¾„kË%»þb¨ÈáË¡\ö"eUN笄‡m þ‹qáH‡€.VIýØFáç—¡&`Ì&l¹Ð²&«ÜŠEĵëBÈêCìÃ"‰°>RŒIq˜Î¥:Õp4Ç€9Ò’ª_ž±y¡ ¨ÝÅhΕ€®Hàgâ-#î/èAG†Q ÞJÑg¸Ü×öœk‹(h¾2,2}]'Áƒž¬Ì÷4ÔTPùÖ•b‚^¥ Þ¶*ÿ¥³£&lý£ tÖ(Ú8Sh£Ë&§½dD •žþŽÎÞH9Üá5œ¹À Ö_ß®I¡òŠîê´¡ ©Ê¹è#›¦sµ!§HòE&™ë`>ÞCkFl¿ë»JRŒã>Ǹß)59‹‘›`æ$”NŒ”Žáö±ö·SGD¿ (Émù¿˜É~P©Hk¡€{)QíUìd¸pKSMÖš˜Î“ëºï¨‰ÙvJÒº"dXi¨ˆ0ªxª¾¥¸GµJa£Ñé¬:}1DÿUÝè*H÷ÐÆkíÕÜÞJW}ä€^åëÑÕÆº\ä¬gúï÷úcTÈXrøÊ—< lÚê’¨‘22S/ë¨)^q–‘òÊcîב´îÊ#DiÁ cGÅ©V¸MØ}X‹1(›§/…7² )b¸‚GOmÁïM~Ê{…„×»&ô}Ù”|óÔÆrô/BuÈÙ —ÑÀ­îc]‡£ŽGOË~×Ì5ÉÄVõ]ÙPf†w 3ª‚%¡‘‚·¦v5= ¥ +µˆ€WúîEi,É•@Í阑TÝ ]‚TèT•t¨¥K¬ò•&5ÂÙZÊ•é©y²Ë-ØÖ@ZVêe­UÁ†{k+v äUŽ-³ÝQ1uYkß§òŠ®ˆªÀb/ÔKãx˜¯Ï÷'¾´XoyX¡þšâá€{–AMc×–ë×jÍÙ:ªy$¦ 9Šý»&èdDu†ûDm€â’Ð1íC…_iˆ*¤ØcUo¢|Œ¶ÐX¬–¢Ô—ݽ4–« 5ûvˆN½²Â/§†çµ´µ…K¾4­n·‰ zK "ÃÖxFí¤×AŒÑFƒŸç TIáÍÑ]“þEsí°kݪ¾'#‚rz¶ÉV‡nާ,îÃv8”@)G4C/߯¿‘!2"à Qx—f[ZÖƒ~W’ù8g S!%«ÍM‰–OÅjßÉñÜi‚gFmœa*“‚„(X#.ÜÆTP€ÒS¨0e2ä&ö¤bC,B÷RU™Ší·‘'à6Üs=„›°º Û£½¤Ùê]•E(ªc)}è9ZUF|‹÷DìøvÁyÇÑbC;9 /ÓÞ¸0†qœ‡ô1’7¦¬M?‹ ÓåØ0¡¢ÔçïÙ€3™=EJT [³XNÚC;"A3j+jr¬QzÄŽ û÷((aãqÙ@=´Å”"Öû ”5òÉí—Wþ<•Œ5p aj¼g!Ž:Ò¤ g–ÒZÁF¾S¡rÚ3æõ Z,@·E¯>/2¶ßõ=©!Z,Ü&‹qÑI‚"*YSŠ•LbÛ´~Ùƒ’õñ¸Ëéá¥Oxv¯ã•¡#z‡jc ¦*tÉe}gðÄ~p0S#! 3#MÏQìPeb1níÁøLõá’„G–U1nieqLù¨ºKåÍ9²©d×Ö(ÃÜŒî=zrR^>…B»Ú,׿s0DÐ ïb¢]í%b¿o3ûǶŸÁУKv Ð}â?بf=éÅ)rã—Ó}çH¯å‰±„‹1ÏÙe 9¶±È2äÈ€CëVSÃØˆJN¦‚½Ç‡Á;Mhd:t2Ðòð›ýùÏùr¼k “}¨æ•o©]åÈ#Äó7ÅMbô òÁ¶*â¢úÊ£ž¨lÈãÍD%F–ýîçv‡ç%©Ú+hP7éÒFC °,eÑ·u B©x¢á´|_u°#F ƒ%À÷4pê‰q9ô,M€GÂzÅ8yZGZÍ ž§ZÂÉbe†¢ÜR™*™¤6ãBÏWJó}¬°NaÕÕÏH*Ø^:åà °žÉèm\Ib;&…œ¥© YÀ©Ël£D?K `¢¢Îþ…Û–±Öçg’§eD¿fÑ ³ ijNºeP¤rVSMæ èºw× i–ŠöŽÁˆáxè¸ V¸oº!1Q%0Æîz*e¦ÌqDÌÄæ`pʽ&…)-Á!Ã¥ú(šJT#n½²ízÆ G¤'tÇújéN]¼].Ý®çåùWo ÁW9-%‰…yŽËš$6åyyR­?QçyêÌ)ÜA¸õµkT°+¶Õ$ÖÓ±[ª¬ uc¾‰ÐÒDÿja‹H#nð”baÏ)àÙ…&‚J«“…l6j‚£Oôu³»dyªÕ-ÿHÈR>£SÂ4YzðYK¤jÕ¯ãÿº]¨{]f¿®¥Ç‡sÖQ>y&tEk‹dë:?[Bõ‘7Ñ2+‚(9RD·ÎÿžB“³Ô0Ý©Í[±šNÙMž¶Qá1]…I²‚r;|ËÇ¥ÄRÊ•ªëÓëÌéJ„vYVhö8kž>…ý:ÿ&“›„¸¤m;(ú 6I˜>“¢ÿ¯Î¥0M€ŸýÞ<ëSúi·wÕÜc¤FÙ=N[Ö Àëû©¶¶Äõ„7xÌæºý:W ]¤¤º=&+v¬á@®ëh:¬š/ËJøý8ÜJ¬xÊYå®f)†›š8””ÄGvñÍÄ2e­C¤Žê§T³¤¬2¡¤rb$ÖlSú±±&Ý2¨Õ”U“›ôüuÙ›ÏC0%ª¡‰GÃaðªõ¨•„~šÝÔÕj•WjÄÌP˶(¢¨FÖ™ƒ½bÔ{…›So6’œÍ¾`„ú!ˆÒÉ»ëÄçÈžRV1úñÖ¨Á,)PRB¨>EM‹„4ÇéXƒè»mã—Ü„ÉE‰ÉzÓÏqxß^œ'|—*œ=hóöÄ—…]Ѿ€l¼€ ážB…­v>a:21¨ V? ­YÅAêOȇ,ñ¾¾ŒÌoq__öMÃå•ZØtõØŠvBR8l 7# Ç[§s¹qµ|,Ïk,ìXŸ„³Â³av/èÃv]‹|­#Q€%äb¯ŽjÓ<ójF4uSTÍ~@ý[Ñõ%0¢­ÂÊ)­°]b’É·¢¼P+¤l?©m¦:¥²â¾Îîû›ËW…`…5ɽ©R·PmݵRç©:+×9Üuµçyì¯ÿ\蚺®Î³ëHÔ'§Çjúê7™ÎnÂ(Å!Z ž—²-«üW+,·0¥Û¸ŽÕÚ0-<¦tX]‡pK«è‚[dÑ;¥ò-Ÿ'ᆄœzüoÁª®’5DÆõ×ùËøªµjÆ]ÑE¡ü@‡/'ª`ñ={}ËcžÐD' ±¹ÿÞg9ë¶fG9Ò<ÿ`~üÝï}Ÿæ²_* Ÿd¡Œ«ŸUØ&­ÈâR*k8ÇS:|Å™ÂãµÞ^7›òõŸ0tžå׈pý÷õ¸—å4%‰D6le:5Å)Ñè`j¾Z¥kõ&4äW¹ˆõ ¬6™ðFˆæéÙ”>Õ_í@ÖDД7ä“(Žèaløæ¶òådòñ˜)·b½6윉?±ÏGgýàÑUÓ¨§›(£ 0V=¥_‡ _iBÚn,xòHÑ„ f3Ü;ø.œ®wHD<ÅÛiUö;o!.zŸ„™1o]Àî©nooù<±œ5d@[èG9}>g®&uâ½Q¹õòõß{ïžüÙšz@b]R'Á*R« >qs}Uy{Vžíꛎßó OåŒt–\Ÿ%€Ø–>©Ûp§P+’MjÓöÝǾßüh S~\É™ð¨·õp—뇻¸*ë‰eÖÚÁ ¦N A«u%7ÎÞf)ÆéêØ`jÃ(V£ Ó&épÔyõü÷#¤[Àl˜rö£C„lIuz±»ÒÂèû‡CäÐD©L|cM*§)Üò·„ŒE7$ŦÂíjH86SÓrìt]¶ÒL³Lg‹~m.¸¢?σ OhHu{UÄR‹Ôňa!­lˆ’nÂ&Á¥«wr¡¤=—pµp »úÄõÐ!èkZ²Ha›~C@£—PW Ñ6XÜòKb-eö‡ ÃÄl]ár<¸F,O&¹hÞp‘'¡S&§Ž4 >E"þ¥A ëm8œ¥ë@IÑ­FÌ$»›ÛôÁ5ËëWÑqÓ@U]x«Ý¼aÖg—™ä•p2Å'=›²ó„²D ò±O5è)\kxŽ·™QžN~èyÒ‘ãÄ„æ0ttÏk¹rÑ:{¶€¥e³ÄêMÄ_ˆoÓuEuˆ±/…)ž>Ňo%J/–ì#º² Z9|ƼèL¤Ïc%={ÇBQC©Á’¦nµÎž“ßòç¥nÄp½šRî.â穬=ÖÖê ’¼‚/°±8WÓ<‚b BÖÔÐ÷ì̈Ml¼}B¥‚ËI·ÃJ£ð?':ö5lå’ͱ®–.†F&]`êŠB©=Ù…j¨5ÉI´ÿ­ò–_Å«è\åüÔ¿Å 2™-¤;t¿]<뼩¸Vµà~h¬UïôûnK€·tÑx½ñµè5§A„#ú›â_X^ÃÙJÙCó½*¢J¨ð†YŸá-´F‘r}g”chĵcÑVsU»ÖU×ðÛÝ1"ý}%Í9Êëî‘Xž|ΰʳµy§G´®¹škhÀ Ev^²Êëlö…ÃVºˆÖgñì:xê_´÷6¾7™ÖN õ†F`% Äiâl®LuÏöS ­T™UNÙˆª½úLéá;[ÉÛˆ}±ŽÇߪ®ì.΃l;ZøgµnVíoÞuöߌ~pu³^Зðõìfbú°H)üªÀYòÕvøºù"ß±øj½ÂV,±ŒéCн ÓZÚ t`‰ 5T.`i(5ÙÏØn#ÆH…5Elå2JCuÚö–?#Ù÷ç,£K1ñ‚L+¼¼“~ ŒàÂG×Ó•œt _Ƀ°Úʵþ° 1#uÙX2y·%%u¢O ¡²„KÊõM8ã LöØÀ*2ž£ý›Þ×÷z¨P‡4P!“ Ʋø·áÅÚÕªŸ½FÖY“µÛ­wÙ5Û¨,­%±. ND§²Wîª+°ô©wÐT®¾¼á;V=]¢ï#zˆn¡]ú©w¥Ä( ŠpÏ& ÞL˜äFCÚ`õueBXó)Ðßòg„4fk’ ¯B#z·â¦¼ý2, œ` Œ…ò°»ÛšâKˆmMiUtë¤BíÁ"÷‡Ž0G!µs;Ê4¯}ý%Ñ܆\‘m•Øhà0%Z4hô•PpSЛЌ µN¸²á-Ü åžîá-¿-ËÖ`Óô¢ÊÇ©fµøj¾ˆ8ü«B÷Û[‹ñ†@úÁÐþ~xüâ·E€¿.6¾Ûâ5ñìëW’ ¸ëau%~ç³7*–]·öe¼åo}áPv“˜a8™x+uUR“r¨”± ‘ÇK4×á7Ïöhc°`/ûÖ\tŽƒè^c#fôÊ!õSzFÅT%܃)†ÒÐÙ[ÑÁþ¬eU€w|aÑy¢¹(éQ0Õ®ˆs®Oò• ±ÐSJ5É¡³kÒ$¤¾£Úñ±õÆ[~IRöD1J·k]ï°®D¢  IDATêu% ^ðŒ«ã˜:ï‹&«¤û-£ßO¥Ä¸qüê–M‘hêV5ù(‘VT^¢V^°¦bÄäo¿$ÓºÒmt´ñÒð§°¦K‚õW2kK(ì*V?(± :r-‹„ñ™rKHX;×>OÈ¢ßÓhs¡SÕòÑF¨~²^æÇC ¢®g·X&ø/dä;1à“6ùÂÂÓM9l§É÷ùÑï~o•õM€J\/Ò4^ÇYl̼uJ|¢ûiI¡7+ &ú\–õè„ú¾# }nkÙ„.ĆPLÕt½ôó•þUt¶Ý]Ý«Æ+4íûH9CyHöc4-'x¥…¶¶Xn KÚZ}(èc¥+Œn:¨¿ÊÄ CfzË–S ÙØèÄ(#w­¬?Q×Q%ú×°8Ú£$Ñä‘ôœýG\ŒŠîЋn— =¿-êiˆÐÎÔÕâÕ1^Š_¶|µüt¸),|\”È^š’^%VEA4eímÏáÖiЬ–¡XM¢+CêéA‚½`'Ñ;ǵÏ>úŠ‚I¬‡À2c–Õ®á<·ñij¼úó ÝW¬—hÒU˜ nºÝcðßKHâ,±4Q)AõÙL|àËÈÚ/úk*PÒqèØð3÷«z«¬ï!¯UK zƒ§áÉ܈ÛÚ€‡ŒQ¼©·^„°nœ|G‚ mvbºžV'êJ–6w9¾Ø·ƒêÙšúDš€›s™¨Ž2-Ý÷‘”=X&Üxå:´Žx {O%!ÈK!{¦gµ;»W ÃÍ…™ÕÕøž&òµ„Xô†«Çñ™±Ò0ºØ’.›?7ÿìg Ø1ä2¹\ -FõkˆA£9b¬Á¶{@%òÝš?*K‡råá\]µ¦&¿M" è-†Ô ”¶*ׂ.JÝítº©-Ð); µS'pÓí.Ýò{’/íž¿ž àë@¶£6?&ª5rOæÔ+6ihüð:8Fc¥þ] Lñ5ZYD_ëh«&ñŸw²zÕÃP¿÷Õ›Ý×§Û[Χ¢×±B§”ÕR5%¤Kê“R 0*åáÌm¾qÞøw L*RÚD*jˆ¦ƒØ®lÀJ颠k¡tÚÊ'=É (b¦ÔT…ßÇ÷?"ºÁÑ´f@]n:Ææ¸Ð:„Ú•SŸºÔ¿ 9œêL%S¹ì÷´¯( ¦Ñ]8®cúÙm=3ÏØ×®½Ä'W=ð6ÏV¨Cô¿…‡ù¡o)h-Õ=RkmtÖö<ÁyHÍß—§Äcã†tR¿!J÷Õ´æPTG;Ñ>u¢8œ¥ !ëñŠ>SˆÕ:Ó×èMn”ûM:cst*µé[þŠèvaù’HFD­7 Ÿ]µ'²¬‡»¸Fn×ßΫÿ$¨ˆ…_nCê·( ‹u¨ÿ îZP]4ŒìûT=)(MîúIž¦q[W×úµ Wz6Üb+¾M -(–„Ƽ·ÑçB^1Nª =d×ð–ÏŽÓÍu«ähå—yõ-¥®xXØ@}ü&ëà˜&E]Òdãß·üÙ8à„-çƒË(ÔQÿQ}]ïDxYëévëÏmëeǼ=a¤¢)¶.ŽÊn=ì?6T‰ŽWMäÝ3Ùó²F´~õ!±CÓÜ69a@sòç ®+e/´!dIƒÀ¶ˆ„*V¦'°Ul´›}cuƒÃUTUå·ü¢Ðó3%zpÁKÉþFe¾´1|ýù³7~Ñõe_X4|?eœä#ß% Wûæû½wñ&YŸÅ¶ê@˜Î8äƒ`!…:£š&PWÔF¿zÓ?«tßËlðX6 SÔ#f^½2ve½ý•@©mmФ—®ò*QNTÒpÕ,9Y,‹ Õg‡ê})9¦uŸìפìÓD;¬>j=J›WM»÷Ñ·|ÒmJuV®öÕ#áwË„Ë:7gó'êÎÐý$ôoeÞsL,½Òtœ%Y¢€•P¾:Ùˆ¢ì†}TrPU½HÝ›úù“ükÓwõ cdRØ'î†  'Ñ罟´Ý4„¾§]ÙrìÖrt*EÚ[~W¦¤ëÊ× ÷N4£jvG_¼†;·÷'¿ƒoSQJƒæý6ó|]̬ÀÑ Ñ+Þ&ë£<Šd‘Âã€uAÓPj© Ñ”) O†fõÏÓ“ñV½ë—÷8ÿ,}~Æ¢5ËOÙ)Òi¢Ö’ó²ÚÎcÞ mKš`MúŠuªï™j¨sIÐŠŽ‰Чvþ®2Ñ”§%«9qNe%›‡Ý¢©)DzÞ6©½¦º¯N Ñ+k¡jûMLám„öÓÂ(2ÛºUÈ£×à â:h ºuñ°us`¿‘ïú ½à:†Zä+bMsšúÞ:?…àh@ñWÕP.fb>¿$çSõ‘ùávÙ>i78Pùd¬ÕëOB ¦¡Z¡Œ’4ÔYË1  · ßÿ+±¿¡á5–çe\Ó{âW·DÓÅ£PÞÇðB?ºµ+pZ‚ÿl;õP6³†òKÞ!ëÓÜ3öt@Xb&–ük‡Þ(ØÄÄǶ•ï|"êJñbõPL°ÛL)Üä_‰´šÑYZŒ¶6öaMÒCîŠnLH?õ´­nÌF¦)¿“вN„WÄZ®£e›¸¾« ukm‚¶6熪³K õ«×YÊ[·uò{˜Âû‰"©â l,>âát] µ:Xm^ÅUç(@{„0R΃º«½ÚI'gÛRe {$Ÿn»4:_ò+ò®pÞø©bƒÇ÷5t)šÅÙ•æ~³]_Õ¨L»­ãjå)¦›Î^ ­y˫Ҷ¾èO|üÃÚ¢|öµ =1û¨ã\ý=îR>m'Ï·@¿x½è?•‰MZҢͿ‘mƒü3Õ°üÌÏ›¾dÖg÷ÜÆ¿ _±ÉdA1ÎéÓÚ©ò¡ÃùqLí"!˜È_”kNà¶Û9ìëL>²Éë´&v…ËDšìÝ*UŒ"/e;‹‚O;…ý¸ï!é-D$,ÖÞ~'ÿȾÄkÚƒ¾2©›„¨j7>»zX~Ë–)Å!®K!»"N¾RÑ.‹8ºÌã`µ2¹îÜC–'2×ÅŠÖˆ«Se1”Xx£Ù[bn»š-Yùs‚CLþcÙêߢZš#Ð¥L+¤ë{›Ç:K–âY™¬«FÍ”¡C*¯¯›ÅV|¶jÜÐ÷aiÞz~±?ôáKô ô.‡„ùV¯¯ïQv#ÇQ¿°à¼'מà'Î:D:¿ü¤?$2›yzëÆvZ°¯—õé^4Ú³˜h‚³a*ÈXKLO•±‘˜ô9XEDàÅHg××ßcÖ(gKä+­T'œCô _&±~§žæ<­i…áŒf¼¢¤¡upÊÚ5$ÝÞR,oˆ¾47¬°§{ºRsRö@™“UƒÀ}2¸½Z™,õ{…„¯/ÖÇ·Ô4шNx̳UÅõÈêÐØ%~ªë-Ä‹þ.NÇ4h=Yºñ!ŒI×ù¾Îç :­úÉŠ*6(=ä{×—6GÑwEW@†ÄU…V=!u(|OM©ŒÊc¥:¸ ÝgÌZ½eoù°Lï@ß'Óû’ àà3»Å¼›¬IXšhˆH÷Nú©¸Pg<¹Uƒ›ú*¾bÖ‡6šXMAݦÕÿ…œÂ¶ ¨É4JJ‰¥ÛøŠ'"1l·qQ“Õ¶]§„V½­£ò¢#hä²±ŒfÛf×kìC™Bód%!«}Wlµw‡®P,V¹Õ-JN©®0±rºm$¡>vbõ´>šb^¯ð³[þŒl‹E*8…·©`v×÷|.Âe‘}³»ÀÙÞf3ÇEì§JLŸØ˜Î;Ü)âmDìþ´(œ/5p' ïÿ Ñ$»¡BZ áNáBbôãê ¯Ê„#&Xßî^õ†zÖÖÚ ­àyãÞ¯= Eïß[·cFGø¤ÍýÃ6qä×kX›øòBTÕŸÜk¾+¥û˜´øAÏëéR×ÇU᫽¥8ÀfŸñ¬„ý&¨™(«]¢qÀAS8ü¿NnqÖ¡ »Kà©â¬–Uˆ„ê¤+ßHõeÝwe‡ÞŒµzxEO=z¥ÕJRöôf(±Ü}ã„›Ø0‡²,‡ÆµCØÉuYk»VùNÑÙY¨o°ßßPˆ©F‡µìÎ;˜^Oõ@Ôëí½<òêrut<ìzañ òGÍe‚áÕ禉ÆAÒçïËSÿ™üó³ÅÆ$[²ï!â`y²š¡ìJçæ`(¶Û*dzBÛÃ^[^}È“¾{}n~ñÃNìc<U~m§,¦¾ƒ`àÞv›_à¸o+~®ûgZØ×—ü­/ÖF|vJù,üS¾€æ×¿5J V6uµïuq”Ÿx³ÊóÔqå纜IÇX_mØÚÐæ§2MRƒŽKK¡Ç.%í¨®Ý¤Ø:žëZ[?@7;ô•’ÍÞ¸KÿXÇØ\¹…5rާëEôuÊEµ ÎËZ@I¹õÚ[¾†ì:g뺚–P«Î™×åzßéb`ðw´¿¿ü¡ÿÝXsI9Öœ|C£ –ëÔ'÷ø‘‚‹A‚%»²Ÿ ©Vrç×rõ©¦M 7úSçZ'º¹…³‘¥ƒ…îèš[¢pËoÉ"ˆ_¯äÍ'{Á{HoVX…î œ¿˜²mXñ——½GX|%¶÷VÓý1ð0üé r¾RÖG Ã~µü·œi`CŠÖXÈÄ,¹žbÄ>ܯÞγҡÌIPŽ„ü¤9ਓ*Böþ¥ãÚÕ Ø âSš˜”Y“«m¹ÎCV‰ämâ ®µe$º{¨×:–=‹LÔjݧ}Mü´ãܧ´pC¿où»’òU1é(X%Þt—qý WZòë!éç“´^Ñ´]¯5äle–F%§š’2¨¢Ý-§P`Ø {™ío­žîÆ´d9k2êÄVIÃn³÷ƒlðÍr™ ]èù+–\Ó~ôh–‰‹ÙW†Î[õ1J‡ÖóÛOð¹„ÜGŸ~’4êgrY©Ä—Êú¢ƒ÷D-%è·j–3ÒY‹T¢®B–¨é þc N8ÖCH×:Ÿ"  òHöòl^%“®ŸnùäY!“¤A³k¥ÁK=7¥êG7¿R€³ðØ<ä=€ÄÆò£¶Û°á1«+»—莖ÊÚæáö›6†À]]çp*ݼ”´¾{Ë_uÒéñÞ<þ¬7M™Pv–d4³Ê¸läqj= ëzJ§<ë¥]j%Êb\ÀcU‡ÐHÙJº¿+,ýÑ5 þIá= ²“!*† ¿¨Þ\C½Ý.ÛpÚØI’«œ*—Œ~ÛÔo‰&x6ñ£Ÿï°=¬…~ß»~9t¯Ú{´ûùL9‡Õ(bS)æÏÆÂg·ˆqðkd}´i{GÂX½IIµèg-£T—š j»áÎgÏßýËŽ´êôƒö–ö8yL½]ýظ“ó)_õµZØkc+mX@}¬ƒ k0=À¯ÁUfîøµ³¦Í®Û&´›ÌÊšŽ¦[Ñ7ÕfbÑw+{Íèý„œ]%]S=ïdïkH‚©FËÇQ°0í•Å!fÿƒ×f踮¤8¬ç|J^»ÔÂqf|ן" bQÄô*¡&„s·€hÈÝgMdg<¦ìâÒ̉\ê>“¶O÷SÕK™ µ—”ɪŅ˜ê-¿%Ó#X¨?„ó¼ T¯áÄÊXXå wÕú‰ M0Ź,ÇÐj?L̼÷úwYŸ…ɉ“kôU´Nð ;g¬¬¾Bþ7Ù µ¸cÄ’Qª8ügQ“G'/rx¢ÙóÉ ˆ¼à-ê}äzû¸¬ƒP}%üªÎNãæ~MèÀná—2g€®iÌ%Hb,7"&nç¦,KsK«vK ®þõ–7¥Ö«iÿì<Îj Д›Ð6·ØWLê´[MJ>5 Ñh§¿Vè$m˜¾6©Ýw^²1l§%(¶„¼MÙþÂêÄ·¼lpÓòínÝ Ï+3ëéfµÂGÍG¥ë+†åKeþÖnß½Ak J¢µ uË)éV·oa+$j@YYD£Άì¶EWÚIË/lCœì:¥0Ž¢,CÃ'hãÅ-Ÿ)t¾ªá`w°x:ÁÎú\ׂeÛ_´À xÞw£‰mal‡8ô «Y‡†X;#kSSì!þªCh,ôDãÏ_ûËž-oâNÑååkDý V}7'¨Ø/+)SSƆ%䪖ÞršÏe™|kü_Ìú²o憇Ôyjø«•"}ÎÆC¹Eñi,‹ÊW³q{PÀW¸“³0ìÕžYy¾:# |¬6·H9…áL£’’ K²h. ñTÍúP>¢¦öARmSü%x ìqÚÐ)rË¡Ê8ŠíKö{©„)dâÚg 3ºå¯ˆu==V;!ˆ+b€¡åÊÁ*"N\íJ:8Ÿ¥|üºë Ï–uÂæã_ümÛÂ×pfª4$÷³á†ìÇKÁúéNRü|È„òHš'ZŒ•-XaÍ}°ÑSS} ïS5TÏ–è¿[~Q6ÁÀåðÝ ö?¤|öŠP½ÇïúzÄ«®30% ÿ KÈkÒ®cb–Æ•ØóDÌ÷ôãÇ Áäq° ¶þFÖ§¡Ôn RÚU¨&cóŒ!!gW‡Ø•iöš%m§‰Pµk.ç½×mÁâðQ‚,ÝÖûúž{6:f\cK=1bÓ9MÖW„&Já4ÊÓþeð.âˆô±Ü²lU}”¿$’iCæIub mÖ„£ÛAtãȾX«þä|´Ù“l <Üf£òê£ñ7wè–&dÊ¥Wù!ê_Š'sºüõÜö£ G#<ê¨;Åì$e¶ÚéWšý*|Ű²ÆŽøÑ&¾áˆÑñ:¥Å …zú,ÈFø‰ƒ*‹>èó¸}Ë?”ýïo«è‚¿ìÙÛüVMûã!=‘:L †ÕMôêÃÙö?A !Ü‹_™ŒºFÊU¨ü#è^À"V,͈?žõé¶ ·n&é y“z§Cã†vE©Äë¡}²¾æç/{×ÅHüáÀðåjX ²ßŸ&vª“:1å.ÄoSÎR5ëmvk1ô•ÜÑê¶¡eZòŠ¿Þò‡…HE ¦Jž®…Ø[Š@Ûuuúa1§!/úàáðl";êŠ ¯nî({.ƒ­²—§¬èϻկúzW/g»!›€¨H ÑX7XDæ®f‚&®,æ–7zÆfõ'®³)h Çºhêø(ׄðªræ~Çcö›Mv•`Ãä,«ÂçŠ:‚*£„ïEüC:s“J[®%ücY"®Íî°N8`¦®(‹!FÛá²ëƒ}NGбOùÉ刎Ø †•ÀÏ8¦[øJ5›¢êïˆÒA%|%ŸS¶ÑðJi…û)j×¶Û?.“§j(Ä!‘Á`“ì“OY,rIê;‡jè.ê~bE•`ñõ¼r8 æ>´?íêÕT#KÈÌÔë¬`|ÙèüSEXR!>` µíYÑ’lZ#ÊTg™ ±sªË—}ö&=Õ~Õ¡³zSu«o¡üJ2«j¦Õ¨‚-zý&ölr òbÙñÌ)ÈïˆÕ¨3> W·¼. ëS¦}{ºuÙPF©)‰%­“A…4 0^ ÖôöÓ¹=Ÿ/&uU×'†žŒëÕUM3rÛÿ+²áY–ö+æ„€@€ÂSĘ6—Û$ÕùÝßC å–:[+4+äÑ'=ÅVµV:åÛD¤Ñ9²·ÕY†¹íá–?/´!V¦ÿBjf7º-IȈ(¶ª8¯}¨8l!ÏRÖâJ€E*P)8kå Õ¡ɵ¦?õØ/6¡Â%Ü€5ÁWn nu5Åjê¡z·¤’Z?ö¢Û-o ö¹Ç>–3áºtüM~¾£¤Q_Û°:?Ó¼<{ž?Áš IDATx$~¯Š¹¬û`Õá~!÷Ư£×ÞÕËöýØãJ?Wþ÷GzUª?må°›D€Újý”Þ´çpúÔÜ!žU¢á.få¢F­S‹ a,8Q#ëdNgãæ÷Êáti´ü± BöS$›„3å8Üv­õë^í€dqH7°¸ï$ú¢`«©¦-QÝbX#»Á–â[ìy[<[Š[þ˜ílìHq ›ì #O+ȸþJU úòd¡bI—{?ÞÀL ’² u%¶®1eõoéÉmåƒØ²Þ1/.¬ÚôÄjª½Øè¢^ñkÄú–&öÙ*t›ÝwGg§'vffWiFff>Ž/£ªÊÌVµóxÕ9ïy>†°@lMN‘rªÁ>¸÷”8O¢^ùúÙxvö–_–Ïþ­ØŸ¥œº·SR€]á@ÕÚ›à”Ï讃±‰Hˆ‹LÁ$¢ÿR—p›ß¡óºÙoÕ_ø7¢.bD\ç°‘zVúÔ…KY¸µ›¥G„Y‹« Šƒfï!¤aô¹(¯ý«X¡t&`hµ^'ûÌC˜jõæp< í M's©>eªOv¦f÷¢Þò’²·á¶KÔ}Ô$‘'«oæõDâËp×ß°ˈóñÅdú¨—z‘‚s9«â‚¢ù-Æ‚^÷®[`ë²o#}]R}KC¶7¤>¤t5µŽ [R,Ü,ny3Á_êð·¾õÙ˜X¿©þ=𯑳=~²;ó·#Ù‹8Ùô}¤ˆòQ$½?4¶*²b=¨­M?¶q<çútL´škà±r»Ø§Ëgg}\ÑjJNE4Ð 8rÖ†j×r›p¦Zý,(W™&e޳Ù'žgç ý–†y½®eõ[qÕÔ6p"?²Ëzi0Ìj?ɱ­o×WY}M1šihlN+å¬P”XÆ©„’²S:™’zõ}Éhq—†´úÑëS²§½£¶Ž'Ìtc·üIA›Rž²?dP¸‰iÈ©Âæøzâ<¸Íºv½N0Ô.iÙ‰¬3ûüª7¤•°‘»Â>WCÅ-,¿ÍzÂÃéxU±ʵt“©2R‚ è÷”pßòMd=T“îâ£×3Ðý~ý‚ÏÃZÎì®Îjˆ@ë½5DU=JóQ9Ó’£² ͈šêêSÔüšÜÀ.°Âë¢ gò;%|ˆ¦·ßý ù3Wx†X.’>Kx ¡c0*×1¤ÛQ“ª¤3MmêÓÔ©ëóZóêMúYÇJxü],$Òñ4–EkÕ¾Nx0göf‰–g/œ² Í l'j.:å+È ÈdìªÑ¢X¦ýTô%ÀÊÖ¨7ü=d‡ÚoÐY5™ÄšÅÓV·üI± ;UX2A¡Úתß©ê%ˆÕx±Cæe‹ÖòÔcøª€2Xô)î VrÛô _XNû®ßôÀ£§çà‘Ñ+gA/"G”³Ù†+y£iÙ!p› · ’ò9-Ù™‰¡ÒîiŠÒÙëÔY%÷ö~qˆ^®=£ŸûŽG¬v·nK®ˆÇS:3óñê…%çÎ÷14°êL/×-|{’Ô%§˜²)+ŠÔ'¸FŠ”R?MÝ\÷nN«KÚ&·|º|RÖ§ÆE¢ÔbÊžj>¢Ûv®£k"7®6®yci“ÃÛÛY²ÿÄ×œì¼æóšËÙoÆ ¢j6M~9»&T)+¢uV'J—&þO ?Õ_Ë-AûB‚ G™"©5ŸUNYÁ袟lá^·dÏú7h«Û`[½ÒÕ-El¼^§¢ÛCIaÈ=¥rºÂU×UV“î!&¨$‚4J©Eí&Äp'( ¨²XSÉêÐòëW–‰ÊÕT² Ü{d¿Ö¤n õõÄB¤Z¨RkŠã²WDô§ £}ôâ=.õ¬nm ŸáÆQ¼^٢њ1 ¤åB¼E?oùˆT‡ŽUBàI°iãG¹>£c/Žk5‰›n¾µÐívÇñã?HáèzN¼©®ù\/’9~ÓæÑÒ¶³<%wý¡iUU¾²o4cëk–]£³ âÑË©žµ$ÔË®³í-ú*-¡†J~oùsò©÷õ)µL9•²ù)¦´Ê×Y ÏDZr6%ÂJ{Ô®i"–§ãŒüÐýÏKÇüÎîë‚Ï6åŒÀ÷³Ûð”}&¸@¯$E5SPÚ¥Ë4-4õ€»>aZÈZ¿‡”˜CÌÖA…á@Ðsë »ð©ÀMZéAônõ¬Šõ ={Ë?Ú‡×]o„Ó ¬³€Ë¯n@ÆÖáè aM®\¬`^ë+>)êa”[¶BÝfn(„oø9ñűrÛNƒN€yË› eq¶Âú¤Âš`¥¡ÙafÇk×sÝ–—΢®+<MÖKüªè²Ï\½Ÿÿ= âÑmÞÂXt_³)™R”×{ê4kòÇiˆÍW9âëí†G>ãžé¬ŒÐ—"tJ[‚jíÊb¼lŒ…ÆÂOQ:ßšä‚uBRž½O ÆÙeD]•y0¢!º@80­…] •þL¼fbU6¼R‡t »Úì͈îVÈ4ÚVCá‡d³:êLzJZá5ƒ˜P#{Ë-üæBp¶1@"0Ñåµ2àE|g·Õu¨ÄM*­ݾ±!ÖÁ¶„ØvD ·­¿&´·$S9¶ÕíRÛÁ®,!¦æ«>µºwõ« ½Ga}âAÄõ§vü­3=Û*â iëÔùÞôþò­\g±&Ÿoð‹Àu>Æ0SRªPbÆ{´U¶œzø§®lµp}ª Q™&õQ^tËïÈoÿÖ7ϘY¤Et<[r¼z[Ãe?¥!9Ý@ªØÄܳ«’Ñkjÿ.¥#Ñ”êÊ ›Zz°j–Èà •^)o²Ô ›l4ÙÄJ]/[ù-£m9Ã)øÝKVÁ"õƒU²Aü_ž‚F—˜g§jl¼ÿ–/#›tGÁ—:H9žH 4¬;ÇÅ‹¡lxG 0JÒW}ÆN"å“°Å—É&K¸mý5I·9´É1j埂SJå6M÷ö–¯+ö¢M}¹_±Ù ±2÷ýCž–×m{ðz|'=廯>b‰mN¿Ð.¥¹Ri3¥ÆÑKR¼‰G$eHÊ©4‰F£[þŽü^Ö—}“C¬•ÊC‚÷Û$ÕbJ…Ð-ªJŸ4ÐDuhtÛµj¾•ÙÖ„/9¨“<-Çzê\: Z€¯Õ«E?Ãbi„Õ"eá>W‡ºÍ?EF*Ûœ–Fq–¬ž ?ú)‹ã´[:JŠMD?KS¸å :5%슡Š_d)u:_À“bë’‡:Î*‘™NŽÕ+§ØýÆIìЫªØ-/îŽBÊÓ¨[n[¨^Π6]½BOoùg‚|IŸ¹²¼ùY,+‹ƒûúââ0u¥hÁ… ý>½uÅ&–¬ÛþÖÙ8.Å® ñ…¥„FXÅ¡ ·£þ˹[<3û) ›’C"3x@ÁFÉâòý}ù¥¬/åÓV@!Ž–˜Î6Ã{åÕDGÄL‡â‰ýD¶ O^µ¡ÕD°YÆu‘gûëøY­Ö½æêΕ—´ i¢Î¥Lަa—X{Ñpw^hpé]%á_ÌJó·{SîìÓÕÁÍ+Ø`ì6{eŽlˆ4§ˆ‚SÐ@rË)rU Ó!u¨D‘_K#/å»ZÔYsÖÍËú‰mˆg)ŽLNE^aeƒ[·lÅ®½¦vûH àCM4>á¶kT³þ[߯èö†©.Àr*Tb«e•[Ò=>Ž«àäŽëëdË”àÑõç’NCt"UwúÄ¢k #˜æQ2I Üd¤dÈ}+Þ”}QrXe¬¯ tÉíÑ\{Pªtƒé-é À‡)˱0J'ÍZ×m^×®ŸW1d\÷û]Ï©ÊÖߟ‚8 NW±ZÌê–DmH­+Œ^ÒPƒ?o¢…hMíTm ¢V«[þª`v·„óÀhQôJÿ =¹X ¼ËáÊÅαd·ó(‡‡²Äñà–Š#+<ìdÕŸ¨¦Ns§×4%i¶‰í { ­,ËÆÞÐÅ(~ìó¥1·ü}ùxÖGyQH­þ[a'J6z±ÃiÜè57`ÿ"+·g5”Y›e{?ÿ.Þnê xŽy\O·3 :ŵìÿ& ho¬ãÒSŸäø¤áª ‰¢ërKü¥E%ݤ[ è…Øœ<êPm?dÕjî<Þn•où|)‡ †Lub° ÓÖk£0;ìÛ=«óiÌŸÈÎ/‹ºœuWj¢ÇŸ«Õ÷•SÓS!›0-–X®ŒÇå,~C:¨ótÿ´‡[þž\ZË ÚÍ{QÎæÐ¯Å^æÕCêO U~hëÇ@¼$ §œ!Y@Ü‹Ìu²LíbájZbº®Ý1'"Œ4FÇÂánùWò«÷õi×ÜŒ~Ê»È:²›ªÍÇÒY«Z™z†MöÑó/Í0Õ/[ ¨ÂEYO{:îuÁfäO²9.&Ú­:¦n‰ÝNLp¨«·ñt Lº¬jt²kVF^Bvd9Mô¨B »rËMk+svyE £+ñ;_ÀpŒœlU„Tœ„x½åDŸ"Ó-ò¬uê&þ¿*åÖ^W}}EI×<œÚÀ[îk¹†tÛzË_|ÃõD–U²ê­g"ÄY§§ ž¼ë¿uUBôLrØÁÌð¦¾Gýõâõ\ã®·;È-|¸)A”6œ}*™Ó¯T'/ :–¨Y¾fC´ušOµ½å/˯¾¯ö —hêAIÛÔ@²e5t&eéÌvc¼ñŒb—tbè@Õ…MÑþàÔP©Ïêjg…¾lÁäiÎ2±┤¡ÕùëŠò=JÌB¾ÒÄ´:T6½WƒÆ]F­JÞòóDÑCφÔAL脉ë¬ãŒ8q oÛ[—}Æ q—÷ ®ñçlç§ž39Ûé}\(qÞdMé !z‰†%²ÚìCX®AF¿zÆÐsX½­àH{:Tûé ~‹¸ò½yˆŠ4#;ÿVõ0„Œ »V·«&jr^Ì™]±ã1-ëÁžçeŸJ ÇÊÙÆV„(²[¥†èeØCEîhóJþ&ƒO© s´³Sx‘ÝòGåå¬í±†½]vWb•Ñ¿ªµâ)›ÑL1dcA›|'„Ýkÿ긨ª2ôÖCF¬+ê`B2”qÝsUFU½íl1~i[ì™*èl§lš},ˆçdÏ‹fˆìAÑ9dáìÒ(æZ•Ö­ø[où’ÎÓ«{zu«$›R¨U¤;{[×m^ðÏnÝŸOK×î¥ òDi":KëzËË¢ÔÀ† ¡K÷ ?Q ì-?X¨üøÞü¿$˜æEðgû+9ü¾‡Mn–ÉóÅÈ-dž¶yåëy{ô†­£~>>Ïl³ÎŸ+à-ÇØ±¾V7$¬–ÃgœÇåìS™‰%Èk¬‰A¢‘£J“be«[Ì%ÊM‰;ßò嵬̊„² »½dõhwѰñ\5yk‰xÿ…ص²rT2ºÍRLP»¦±ñ²„@¹úÁÅ"¥îªëºšOóÁVÖ©«·¢y*FéêXÊøÞb틌”øÁâ’” Ãú„øº1–ÊLŒê–)Cñ«zèj^÷wW#Âäùõ0G`cR ]È8þ¾“ª_ÅY~ËeŠSжQ {SVŠQ­úˆ(ä V‹¨ùšÝò»"/¸3 ž–WßO½ò3W}üSûú<šÞiDr3Þ£Ã:u¨8žã²2Àˆëž1›ŸZ~uÛC.1~›#)jÖðu¢½x`ý.€¨LL4úRbWDg'zË¿’²¾  @U‹Àý_²ÏjøÔä*»g¨ÓXý­'Ѥ”ÂÛšá YQÓyý- J|” ™ V°«Y2ÿèK¯OÇJøg÷r¿ªÛˆn\ˆrM=åiÄKˆñZY¦G*©•X;½å'É´óÖj´ñ:Všøœªã #οµ+ü„€‡‚Ö_-E¸¢Ø;‹%‘åÊRI=V\]Ø›°ES`£É•/عdo{Ë爾‚.­Ôú×­1'Â࿊ë¼£O<&Òu–d\—¦ÇªÛms=ßåarçemj÷ à¨~Œæ­ul!~2TËaT±)=ÃQJšØ9Z_Óú·ü+y!ë›vlf—¤˜[ÊYêjÊS¦ÔöC¼ŠŽ5oš2úZ.Bàdë:ò¸§7%iÖCm–…ir.Íßì|TTuÿÍn½‡l– f{ —›ÅÀJ*l4±›Gcal¸ÉOýË@vß,9KõÕ‹S¢[e-жž²ð(‡ƒ€,·_ÿ¦(°@im½ô–A(©Óȹÿ @À1–[*9 KCÉÐ?´±ïϾ¸LÐ\©>ºÖowÄ’Ö•œÙ½'&ì~ô«`sXmëè O…?1¦è¯¦`ºë«&ZÙ ’f†2á×€úä527V«©kXäÖ-A¢ÊõË?”gYŸÝ72–è-—Œ‚¨È_5„ø Th¥/ŒÁùh\õiê< 1(S‰¤,A::줢~%Cg/o“‘©^¿Ö_Zˆþí ÄyZ¨öµö‹…£(%ÇÞˆÝòSEC?‘D%ÒÔ§DêŽß€g‘íL W] è ÿ(S[2ÿ-σVô¨Ýæ&ÞI|7à,!ê‹æC±‚j¢ôýæ©Jú33üJ‚•¯[þÎÌ•­õ抅ë ›[oœ9a¬ÎëŽ<ñ‘ûZD~-‹²lÑ»6oè »Êî±"y!Õ´E†g:¹9MÓúþ-_Dže}åìT±YÅ+}’‹hú£•£Wx1[ q»ì£`ð™rŸVãêÆXð°¼Öç~&ä³ZŽýL¬Žœe[Õ‚5Üœzo×NÙÞ˜W„–Áίhµ÷iÝ7ÝÞòÝeJ\(X#´-!HÑS!¨7ÉÅ‹ugéuLøôy‘î?ï%œ¯Þ¾ôKBä’Ê£ïâ§° ÞüQ¬,Á\éÌ-Ÿ&)w¢74è)|O]Ãy5¨+9`MeÍãß«…çUë ÏÚ|OµPÝ€;ö9a=¹¡ €­Ïư–ª'Ñj]“[þ¹üïyµÜ§ ¨ÀLÙ”fwZ8%o%Ǝͱ­­LÕTOŠ`”©T?Zö.¸‘¯µ-èW'6e éšëÆ®%ÃQõ3°ËVÀÎßÌ»«/–ÓÁCtz–Žèj”Á-œø»ÕÓv~Ë—Œñ!!§Âý‘AZ5@:YÒê¡%Sà‡ C~»ƒm_·S½,)¦Cv`7|Ú>¬ùJ„Çq-±Æ¶7›ü“oy.ø®sºy.ã\u0ý;Ž1ñ[»rÚÔÓ4]3@¥Žjg}L*qØè¦nÙnÌFnkâ7™äfë/Dþ,¿|¡É•¨Ã‰eNQç–(y__ ;În´ç˜Aa‰æSN¥©9Ù&… ç –æO '«îǤúcÍוeÛã¬Ãjͧb³rI,'ý°¹Óê_Õ¼Ÿw+æÒY]‹êF„ *”†[VÝi‰AãžÝòÝe©ÖFÈý i-Éfô­ÊzPgÕÈ%ÖñogV¹ýú[bcÓ-…)Má^_`ìDmg g¹–õ°xŽäÕY,Ô„[Ýh?þÓÃ9×YÊ©ÎR2®½}𫊈ºW´+@W¶– BÀ«C/Õ«uÓ.`‡Œr™ 8âé/X -¢®)"¨ôÔ#ß³›÷¤ÒDZÎmÌHùz£é“k‹æ¬O­Ä&Ó_rnB• P{ÛÓÕlÖ‚z9»Þ,vuÍháJ]ež6Ã4¦é©`}]}{œÒP§šÒ|¿de¿(uP|´–«…´šÔùdïÅ”9ßÔä'‰‚Ñ+!• ÍÆú;"ûuÕ£'’׎Ž4–Ú|†ß^ðo…€N‚uC%—<"ÝÄ8ú!!C¶>vKDôå!Ä ã3‹Šh?Ùá/xt;ßã¸?Eózé #´=/4Èh¿¾4Ÿ£éÑm•‡±€¿Ûc‰ ˜%™huóž O嵸&ËÚ3 j8¸)…Ó’Sª6ÜòOÅÀªËúÐN«Û¬šŒEý,]›ÛüEs“p_7¬»ÕžÑS&X]aË‚šþ žêÈô°þEjÍ‹§aź¼íëÓ „B)»µÚ~·PøûY¬Ân9#Šy#uoªÚ=ÛÛÍ-ßB&N[b5%Ç”iÙ®&tÛP‘Y…"MêÈ>h¾æonñåwðG ‚eŠ~ˆ®È5²w¥ÖWn  I¹eeˆ-Hz7qâ IDAT†Wubøø´¯m¸ ,ü¯âàW÷§GDUùdϾ ‚n<ˆ[ÂÄ*â¼yðº:Öb颦¢LÓÖL™[öE$ìœ7Ù­% Z2Ñjµù“:]{4‘[¾†ðV¸¬OsžÕVQv5Ájš(\”«®É¨yÚ›ÍCÜÅžÕ+_~y¾™ªâ¸°3NPlB]þmµ‚½UŸÌ&œ²KOýëXßJÔ^VÁf_äÑO4 éŠH:­é´Ä–Ýò­%Ã*gˆî¤ØœÊª”ò uC®²Ï7I¾-½­PHŒ­|îÞQÍá”mµTµsËØ9ÚÊ­ôì{ëSŸÕ©OõŒ³ùz 0\‚YU¹26èRJÄ® ôÌèêœJ¡Ã™_óØ"ã/’%¹Z¢ ’èÇÒó©>MêÊu»IínoúJÂIÇp…gŠùP:bfHe‚‹Õ r01T,»>”˜XÚ¡Íɇ´¡ÊBü¾AšÖÒº³Í¾O)¨Y™çD“ –϶¥NT‡o"Óò”W_J{P¢+ýx²Í5¦Í³ë–÷”œ.ĈÊU&ãݘõíË–5¡‹ú††§ú¾6æmÿ_A(±…õ™RN«}n8¬eœÖËÔ‘ÉÁéøFã/)ú+Æ+<-`+@Zë®Ád,±)±eͬTïVH§ÎT¹3뼺ÊóÞâ:Á`U]//ÎtDWT ]šKƒae•2ÒM…:Ê$ß< *Þ¡uŸð´œ)Ñdbª†ÒY›†;{Ë[‰Íë1Ú|V·J ÓÔUˆI®BìgO$œîØ“Ö 1÷ 7ÿ Ldë–¿ ”¼¥XÛëÍ˹Aˆ}ÄN ¢Ñ­<ÄôRô´ÊÜsvçögºÏ\F™×±Ó=ëå±Ïl[×WUDN¯X_)÷\*àû ŽÙ(9;ß×7¶¥nÑM”D×q•ëº[Êl‡Öþ7I]ÊpDWpÉ­ïìCÔ-_Iˆ$Ò³>4 ,Ô]Udˆá,õÎÆµóK·EŸ”å9è[V·‰źbsĸ ªÎ{Š“B©t%fTwJwE¥dt"—´ý%KCýLdíJuë°æó´‡'[ӽdžº»´7ÄÑ7ì–·ÝLññ ¤É*Qƒ²öýSÈr·Blúé˜Ñáä¶ã÷”Ɖ{œ °z1¿JiKõiDíjÁ¬íÇššáŠpOD—Jw˜~bCÁ‹^Ø ?ñ]?Ï%ëàêÿ¤[‘gÎfLL£§ôUðí*Ôs´c¶}ËÕÿ4ÖG4_¨Á #šµÛ±b†æW˜¸2wåàä è èæêì:Ó[¾† N·€ý_«ÇÔ¯XyÊG6]³¥:– Sœ!£SJQÎf'Å®ÅɈ€ßîÎN«ëZç~ÍGh’êÑD°¬Qö¡zë4h ¢/ V ×–PK~g™ì× 6!X·–5™³­CÊT7[ç–· ºÉ{«Aë+&«çÊÖ²Ÿ¨pÓßÓørË—” ‹ÖY È2l4ëÔPGÒÕ¡°¯JRÔ¹ÜñÏä kÇÈQÏ ‰^©·dýjG¿ïé¿UyÕ¿´8\ãë5è§A¬‚…ö/­Ëºò:†4—HF§3W6T ^Åæfñì çS¤ª¶"oZÇè\S<¸QüëIŠA]{û¿«>u'¼1›¢&Õ}C‡µç )Š^mcn›³Ô<é\õjç׎> ZÖÔ‹4#¯©ÞvªÂéý”&jMËàü¢|{™°›*Ÿˆ!HRÖœé3:z¦³Tï–÷Üáê¾Ld‹¤ÄñÃy«ri²/ÕÇvþZø&ØSÓÜÓml2)xËW2DEKk8‹PÿJµšz…ržŸžú©BÐäˆÞ}Gv®ªƒgqZeÄy_Ì¥öId,àAÒ‚Rzž(Žš=f»òSÓª®ÐKIZHë4[b«FôæáNéÐ1w«ÄC‰àž€ÞòÅÄ&T‡iÈž¯wh©Ëúgsн±$´Íîè {%5ŒlÎ’ò—ÒÇrP‘çgÓ5º¢qNuUÓk°›ðÇBŠ*†ãN(áÂåþ¡Ž¼¡ÆôUWŸìÝ6ÔÈ¡„¹¤ÿýNßò&B£€.ÑF,lMP¸ÙÐÑà#³A+G”F½ªW3>0ì-S²ïpJyômnU«‚ýŠÙ¥+ ®Z+#“¤‰ÐªõQ8šB_¡M.‡uô—¸«¿„tŽ[ž€€¯W¿2¹Œ8næ#µòRj|DèãÉ x1é9ãZjfĺ…ï$zkiˆØnD¡Îš¢FÅzüjq?÷ˆîh„ íŸ,à–¯-ЉKÈÙÉC¼’hCȱv«d›:Œd'˜vãl²NÄe+vËÚ.„Ä€ƒê5•n‚?¢ŸÚåRÇ 1\Š„“š^Æ`ª?Ož1%3ϣ䨜­ž¢³v X™YKóqßñÄÎ D޼ž¨@Ú­ì.áEâòðQ©)³–©Ü–Nm˜ÙdŠ §jx6fÅH*Ñãp[¹è  Àá ÿåX'†<²<(;Do•½‚=»SXFÄ ²B%¯®ò|v Vº†¦»–5&¨«ƒa«½ïà¬&B†Ž¯«f#c¹:´:?WÖæYëS(Tšb[!m"n´!Ìá¶ü–w%ÃÑ !„KG¯¦X³—P4®ª½9AçÇgr<Íì–w=sÕ×NfšR_û!»Äšá̇âÙqôVJˆ°l¼4àÔ£nµß÷ðV=zdË£ònØ:?®¡\Ì*ÛÏzëà¼{ïÚÙÌ•ž]0Ú `œJiRw |w¶ž¼ Qè×¼«•˜b8>`ɯb"×Óˆ“ÚåNQº½æ eJ®Ö'Þ×§Dß[Éö¶ñ€|Eåªù€¡ÕuoÊ 1Ë9LT® •‚ÊíŽ=ˆyáì´—2º ÚV»RèÐ~tÅ?Bõ¾µ %é)µâ€m^¢K²©4‰Ýª[¾’(kµ9àÖ±ˇO&ôt…׫e!©Ï ‘q2ˆqØ1yÑ-"ŠKÙícÓJ·H«Å°Kìèvßl ššÛyÙúÚù*-ëùñVFK»îu£t+úÃÉûÁzuÝz¦ ¾B½ºásWVå:OM âxÇÍv—Ru6­hV‚©Ý”~êcGé>ÄÕ¥‚»â–êä>H¢-DG pmú댆¯/Zþ¾Ü:Ñ-ï#»ÈúßatjnhªhPÕéÇ*_cE¯l-B ™XõÏ… vá)a¤}¸Êå¨<úäQE¥P:Ķ7UOÕ°!{B­}Su.?ZÖB¤ûúÜ%CÕ+$”P?dåöõ–¯-dd%ûR3ÀR¬@­L¿êp„× Øe[ÊÁ^KÉ£Ïõ*QYyÓ BÏÄâ;…Ymb(딆¢ey›ÝÐøAÖ<}Ò@ô9QÕÛ@>Iªí¦d”ƒÙ”ö¬0=;KÇtöù8à_èD®Ä.W÷ør…r6tüjHÆ~Š8¿K©ÙÞ6^3} q«=@þð”Ü´á–„,è2@÷–v­©9ž¦9Ñ Ÿx u¸eˆ÷©••faïŠO4Ò¤º09c8OWe(q 4¡†¶v!HIÚ˜’ÎiFÚÛC›F+eQ6k ßX¡ÍP{½åëI Èh\Þa¨"b¢æŠŠKXz°ž\5ã w±X势d}VAÅËqèø6}'È)8Ù|y6u¯èïäÔv©²ÛóÕ©å ytã¾ÕgKÈ &]öxÝbý3OVgµãÓ>(“T î¶@ÎP»U}äYˆ(˜ý™ øæE•¶º2À³þ+VhÑH'}NÞR®ò-"då6ž¾Ú$m JmjªmiÃp[º‘‰ïN9á-¿$Do ©3OdqI]ÄõKÙ#»[Ÿ† Öê0¢c‚…?Æ™Š­Çxž½²2šÖJzØ–˜þÕ˜lât „,¤ªÍëñŠþ ñÑCÈbr^¤•·Ü2‹µ©CþÇæ¯a;‡2É ÑëòÕëÔÔ-^fàN©5Ö™tÚp2Õ•ºÂœM§­•­«¦,„²$J”ª&)Í'Ån14œ›n LÁ¥eà 9ÎÓ}½åË‹ú2zÉq„ÿïhbý3Á!ÕÆ‰ å0\ˆÕO\À„î\ÝGhžšb*aRþô"è$g,9ÃBÍ)ªRMmµé §£ëûsÅ.â2 W3¤fÈ~(Üë>ÝóBüaã­J6ˆoz á¨«=]ÐX×>¹¼²0ÙëNÐ.3*}JU ]»ß¥ú•Jßm~xËÛÊ+öõbÒñ ãðG÷†èu2®+Ý>ðÄ­{*CÕoyÙP ¢äŸ"êŠj\ÕÿE÷õM)  %†¸Ž¸@\ãÃqJ_CþÝ›Bæ`™@H!MÆÒ–Ú.1ŽŽ}’æV¬A¤[Pêê禴Cº¾º4h.ÊZõÓžµÄø–7Eí)1Zg‰[:m}S)}€§§ëßÊð†ã9 qþÞa˜UM)ºJö S€¨>•Ÿ‹O¯ŠÍ¬J6¶+¤°îè¶…‚Yé2M6¢½¡&÷>žÈ`I´•Æç6åÙ¶Ö©:;8-âzAµ¦+<­ r$xé§:á×þ‰Á˜ß†ØÑPÑuÿCB¤žÐT/{…[ÞS5/ TJð¡ýWC?´š„ØZÆñ[©…öÕ9Y±Æu›m‘\.’rõ¹ŸíÆs'bsjd¹}¹MšVSiâ‹ë®Á”tPÖX})-ÖþPô(g\ôUC•Ö´jS2)³ú¡ûñf¢~Gå¯4OuVÝ|ýSb@`ZRŸr)±²§×…^øGýÕUk‘IY˜4‘š|®3|ÇÜ"3²sµÖ6U޾Ÿd@v¦Cà§­½D7ÿ–_…)oÕ<Ëì¯áÌãüõLÍc¼m…N¡Fh»„R›™Õu«àeÒÙ@EÍÒ2Í¥#:üQúLË@Z}G$ûQB0Ys!ÕWðÊ@˜„xV¶aáªüßå+ØÉs4ÆO”‰Ò?îó,ÍœBEÕw,!·˜dùVW'úšjå©aÍ[¨,0·«l“ºÕJñÅßM¬i§œÕjš=g7Lb6ûÑ­3mF¿å KuC(9µibY! $à«íáE{±Ì¼úáúÅ_±õ$›‰/hŠÖÄ7^§¬STúMùvn¶vc³ö–ÑRSk7 _Öè­cØÐxËçIE ç®ÄžÐÛ~ «ˆä+§òtÔŒvIçJÿŽý2"!{Œf/.ÕG”¢t ¾f××&oÓh(dŠ–™þ±Iq?—[ÞGl&Îô þYQ&¿Ï¢ûì²Áÿ¸dÒö¥Þz}ë»×Ѻö`=ø² ç ¯Ç²‰üëš”µZ_Óuû4Òé*`yI5T‰Tsý”§ï[ç—ÙõœpAÁa«!Њ‰æEg¡hOÔ-vHVý,š|Õ¬XÝÌTˆ¨©¾TÐé–>)ÇŠø·¼¡”ج""a³&X“pÚF\Mu¬èkÝ(‚Ÿá9i¾šä? Aªó•øEÄùÈÞŠë‘Sëñƒ Ùìî*Ï>ñܪú­„Œ ÍÑ\Q^ zÈy¹¶ŠL‡ì÷æ7ï/J•±œ `8ê»)'èTµè¬€‹H’';¬hqYS¨î4Ù´VÖU¨m un™ö[C¨-±ñ|"çvh©“n¶³çÐ?%,ý!¡W¥?J0Á£ƒÖ0ÚÆæYí¢‘³¯¨ŒÈ¦codÔ±H¢‚ú§Õqp?U²#É$¢,Sˆ¾{XMÃõ!ʱ‰7ºí·ü¢¬Çi¶—¡uÖçC¿ì%|¥‡s^me›³–_µ&å[M­ÅœX5 «ù›¥MZY§……ÙPSìñí>o%hôº(O¡qãEdÚS”Ø€}ê±>ÿ™|ÒZ«V°5IÕ+Áƒz‡>ÌBT*î³ Ü¬òøLD‘3å{<­øú—ðOõCÕÓ}6[][—غÿ<»‘dá}i¬ ¼þ]m–¥CD_ŽõYn™ö™[É©”ætêKïÁ-Ïe‚ª£°ÈnMÀ²‹Ù»èUήP'TBÃúë(TÇиMB«áÁì6=ÿx±‹T‘MãÅ%k ëÀÒo Z1à¤å¾’ÐÞÒ„nÒ»þêÝO¼qáú̈‚÷òåUóQ!qÇ@pû•ûX‹ÙPPª`FÑB²ù²‡ì„òÙµ7={ƒÐ-¿-'~ª)ƒEh²hŠ—6%‰ùëä·a]ô¿v*ÁÃ4i‡O¿3ZXöÀ©8_Œ&EÄúãô¹XíÁSuµZK¶®ÎÙË711úvú„uØŒ¾‚N:ô*¡µÃmøÒéFvu÷ Û^,çÐ<[ дîJ±qóR:|%ÀÝò¶’Ⳙh¡Q¨¡EOµPQ{ÆB›ŠMœœÌöÔ­`"Õ'Uà{Œ>Ñ‚TÇ’=GüÁBádCjiû'[QQ»yjˆ¿ŸÔݙޯHöˆÒ9~ƒB]Ÿqæu&³Q釣 ô&0ƒ„d§,²Ñ›œÿHD4ÙÚž¢mÊø$·YÞò{b zS!œÿL½fv·$oÀpŽå&£sŽÍ§þk#ÚüÅv;ñzfý§Ç×ÙþèÌÙÚsÆfmõÂIo%F¢³@Ôš¦²)ëh³ ÊAh,MÔJ: ¶–FyøBíizÙëiæÊÖiáÚ¶y IDATçpP $´èÔUˆÎÖ,nyOQ›¢ »Õ=qYrWR¢”ædøÖ]º$”×wõ'°úY×Ò‰N8Gšbµ Õ‹Ûa¡€ë²äˆ`ÑÍK›J,E'hâÓ’)©£n­òZá–à%”þéõ™úYû3:V[ÏD€QáMiÎ5"|®’ÉÙW(-1/ô)‰¡ˆMõÉ•h6O¹Ç-·<²/")V†¹UCÙ&ziÀ1Å]¥"!u¨æ%ð–ve»1;[<^ÚD<\KfaDC­  (˜Ýèþ½59¬8Åè§aúù0Ôû4€¶²táéXEÀ³:+‹ò{þAÈnýC›§h‚–1MößEŽÉüÑ‚Jì+Ä|ˆºo2'ERR)$ ÐïXFeú#þtfDŽÉtÀ’>-"nºýÖ¢ JÑX‰É&öÄÞÁ2¸Ÿ ¯”%? uª¤ª·ñ[ˆ0Sh]eîrÆÐ;Û39£Ý°§ Þa^ÃpøWr5y6 Ûð\î Ì©ëGJRMÙ@dˆ™¥SßtËÏ w{…ÜQøTöJ~B¼M˜>7D{+x“_Qù~¤?¹åú­/ºþ%‹ #ZrÀÚdÓ?¢ýYúh[ÑÅõ“]ßî@ƒUDå˜òQŒÓQ¨É>y,×Ï)‚+¸)MüÛ’·” ùš "‡«¿ú¤¥Q®hÇÕA…ô!J^n•µa‰z{®sË7Üv‹ÈdV„Å ÅÎO<Ènã© z°NFMîUz5={Hñš·~†3}Œq¢Ÿ}Ê¿¯hl ó%P´‚>»™Æ`Oª•Åy²cÅO[ß–+=ù¦bÍÚ’°Šˆ+ï:^’Ù·ˆ®á\i¡}ùå~«äq°XÐu~ÐCeÚ…TޤY¬@†‚ˆk È7çù¸ÎÉY”f¡¾6@F£vw@ÿ©¢´AŽÂ½å­“h'z*Ä*K”¡Achkëh?6°`o“ogìÞÜ@TÚ¦*Sp°r,D¥ €nȸ”nK—ðG/X—Âñpøê+²ºE p)iª:ÉdѺèîÚÕüL±æ†‚{K&©k¤+9Üè°zÖæt*dW°<{'Ôá¢JÖ³ *·ü±æƒg•ݘ¤5XµåtÖšÝ0 Ô×[mÎ;Ÿg¿òMRX¢—N‚àÙz¢…‰àQÓŠ’­|EQ*ùZb4të­Ô«¡§ 4ñ—è­~Ì—+¤ãŒˆóÁrPe¦Íz˜œú¹Ê{o×/vЮõD7a2Àb°Û9cˆÂ×lɲ˥)Z©5fj‚ªÝòÃDqÔÖÑø§Ð݈ÔP±‚Ò;h ž‰ S¡–“÷(¨cáæ Oõu&Û¤"‚žËrÖzIƒÀ_Ýeòr_¹ßÙm»¿®ôœéÖ”BªegHÁ=æýÛKºÏ?Jé”Ù^TÕÚTÂ’‘s¨OLÄE™ÐžÖ(_±vèU§ä3†Aoù¢ôgï•)6h«‘-«¿¯¡ ê“Jýkv«Î)P‰WÂo`IÉæ›¶vBY”²}G±!=ð!¡0cwÌBœíD-É¢±ª§AAm#ÂD:¾¯¨×£7’g.ö‚ªBì%øW>ÊÐÕèçú ñØÙ º.4@AKÛ2Œ)˜Ì”µ®òäz4 *Eã(~¤è•]©FúæÞnù²aæôÕL6¶Ž¨ŽåÚëš'õŽg;±Ñôÿì½Û×wWU&8çû} 1"‡ DÃÁS·¢8ª¨ÆQ­WÞô =ºÊûŸñÖÑuÕ5ª«º[û¢í²µìk()„D¢$B᤾¼«/ö^s=óyæÚ¿÷;¿‡=Ç7ÞoÿÖžk®Ó<<* 'X¢@G·¶uÄg±'¥/Ðñ†´ˆ4쥙µìò<äã¼åÏ-û[køx¸Åm€§Ö¿WÓâ¥v qµ\çÎ&1±Œ¶$‡Ü$¦*7—¼:Ö,‡GPënà Á¹W16 @qPö¿”àyP¥‘ä=$ì$Šc6s†ƒ¬æ¤Kïif(_|¨ ^3øMÚ–_óPB'«T|Cõ Êzæ§XF7 þüšÙ,*Í"Äl‰érp†³ ¤ÔzfËB ¨é:édÈŽI¯Ô=nèµü²¥8[nïDiéÁ¨²ª`—9öæ’Gèi) é\‰Z‘J/XŽ£[êK(‚ ÖMªït±I·Ôø¼‰ì]}v 9•G!ªƒò’|—Q˜4A¨œHG§áb¥œõ5‘‰%”Âp* ï­jétÝÏHêžÖ3½©íý¾xsYþ¢C7L‹ff€…Ba¹ÀúSC³U½ÅFo" Çî8£PŽœÄÓ„­å³F&…­—½*mQõK…¨ª¾c·gaè`üØé\¹Ë–õ]¸èøÌ¿;ö+Sø°Í,ÉÙÝ€önß­Y]k+T¼Œ ØAÍ'p4¥{£—³ÚÜ@^¥3Ñ€Q®­Ué©‚y£Qôɨdzõ±jýUþ…w’¥Oð¦d­q†ÖÀ¢•“îÅÍÒ<<=¤ôáŽ*—ì²R92Ë*e¢Uó¤šY¿ © F {± a“…!o~áµ÷¢‘Fõ¯¨©³\º^Eøe]e> h=¿Ñ»+¢oÛLýËÉY^NÝ(LjÙ’ð„]–jãù:7‹'úz'ÊT(õ°Asm@·”ï­-tߺt&œÐ€åYSGDÎG7 ÑD,‰º¹Tj½B8«†Ìª¿¤¹ª 3åjÕ™œ%!6Y€²:¤ÚN›JHLØÛEOgxmÝ_éY gëÖƒåG³Qkm9ÛMTM5k½Êào©«L ¤ÖF¦¥ÆO lÀËy:G4óQ&…eð$@¡žŠ~jC­«ƒ%Ö!hÇ´õ Iºn¥Óœ£·ì4ýãFÚ`Ã;ÊŒwù°Ÿãó”pÒÛ_hfÉÞidÊ0‹£352€Zsx0#-¥6ªùìñýB’"Êc–ʈá­ôÖÛíÎhœ7ëÆ)¨aA3” !^ •9q"ƒ† j.5_”ʺþŠ'U²g\ØÜ:0ê[=1m‹¯åï}ß—ÝâÚï2m`²§¤ŠR¥²Ölo ‘[4qòʉ?@XÕéR}ˆACL)„ÚÚæ÷\…ä`gh°{HØÉÌN€qL4K+*„Îú²xüÌÃ;8[õ^<2·žòÅ)œÈ6¥#õ=±S¥7™ý”)9DsSÆCËå:må"¨.#Ó¬EËK‡Ím€sÔy\±N¥~ª¢¦ÉZÌ-¿……Äé^M½‰§™ázx¦?‡BÙÊO áÃ¥xÁBh+¸eõ¢…§Â™ò™L§_ØNIÚŽ+ü_7³Ó iÃAj#M,£¼þ4QÌ ÕÜÒT(\hUøQZfÉò´¢Äëõ¡¾Ã“€M«fO½gp.A¤õD«QšòÛHÞÐR³‘›µ(ï“”§ãfR¼ŠŒ&.ñã8Ó€­/¤ ¹Y¤ëO«MÊRV±jµ ¬ 'Nꬂ\ )‚A&K§¦à´¶@çÍì4%ÏjhùX‘9µ™LËÊ®ÞÜÌ|8ºœ ÑèKÈ>¼{ÂÖk.÷5’žð™#3røJhuè0JljC8w4›H ×6÷þÁƒÁÃò_ä4Kzƒª©\$Á ê <·äÕ\ã¤4\çô)Žc¯flÑäý“mpÆæruʇ½’'£d©^î-ߣ)_隨/År˳7£¬î%V=Heˆ×îhÄ/•|§óNäÑ—ÞQÏj‰¢cECÉúXV±ªiØr'[B=' º4(5cböhõˆ«S£^u%ñ½¸Øi°ý)®?5ø»JŽ»vø™uͤ8IÃ!ÝMŽ\ÇlH³¬Ð†þš)¤ºñ„mÐjÓ¨LÖsC åYÆÕÖ&tjÚ„Óª9µê´RL£Ác§ FjÈÖ ´¯e­Üˆ &¶Üa\¸¾åoø®q­6º—F–n,àJ{Øz͸þE¡„¼Ž MeæÌL,Š$Ñ…D[¥cÑP¼Q½ÉB))UÇŠK§ÂKr>‰€EZ€r›¥¾eåwÎè°¤|²nd_xà€”ZµÓcAX^>:H–‘ž â7¬2ó-r¬pÊ2„ò<ñÚ#uT&ëÖlË{ítÞIq¢6òm3WŠÕ5 ¶zUðÐ2?5TÚ¡e3+#îÌm·¹LËGE«ê÷úšðÏTbëß`ˆú+4éo«³ðƒý›ÖßS7’ÀÖý`@~ëÈÉ`‹T'b¯ÎËKQz¸r¥X¡/˜¾#oá0ʸ^BZJ–HëKj¹Dµ¥•M{U&‹}£n—º¿Ó#Ä,A ÈË«•¸˜Q©\ÙËÅŽ†q¾ëu@½»»C×·´5 gîËû60ü·zT頔ʭšž:³ŽmXïy!u56Q5ƒùP7«l(œ¼k;Tk&ê¢{B—ÙÄS 10Ë|üö·Ý0Cf,Y› â´¶¶‚œdq^TÇ»I¦YêOºÈC©)´–âzœ)bt¿àžO)Hš!Võ¿Ø¿à~¡ ãMé5éÚH´´œl@¥…Lr4ê³á–m•í6°ê|™Dø¤¼åƒñÞnfv”¬"ÌVÚÒ+8dY1_ Ó˜<¤ä³zuzYÑ›‡(Öá“Í: »m~Öä§ÎŽJØXò›Häam{­ª©¿v©NzÒÔâ”å.)RÕ]Qòþ!vº¨ä¢ò&ÈÁà§`]9ÔP~kÁxƒB×eŸ˜Bl|ˆç“öãë:ûÏ´»¬³–æ1K´ûX>sdÀdZrîH]ÍL]¬šE(Å‚ËÙžPŃ«Mþùœ“[GN±m-Ô$&Ï(f\˜Î•¤».e¹¥k7ø–v1áÄSx#1’½&ÀiÃ6É3’Zf°èê©ì‹‹+\Õ…=§þf§«¢Vénœ2±ÿ&läVK5ŒºMª¨d¯¶lÚ¤'¥ŸizéÔ S+ð`9™¿Ü 5( =Á[JôÓÂáWø`ŸRë½A•v¢çu›Ö®ç+[ž]j4‡ž~Xixº<l6—cÂpÔÉñÄLµÉ½ÎÐrÖ(¢%ª;C›%ÂÄîÙ¤Ý.áúSŽbY J‚¿„‡KÙS¾Ö —cú»ÔZ; 7qEÝAx¯/äg~¯,\—žU×í¹.Žx#üS $¿§ñ9U]¶cu ¤KXQ†Ò£–¡ËEÎ9¡J+ºcÖåÿÅ6azt_e\yAfʲøÎž%dbøšƒÆÒhK'en'!º$ÄgóÌ”úGÌq€ŽbÞ)µò.DŠmKt§0ÜŸG³ÓA"•±ìwKŒYVÔ@ˆ.£„´- ÙJ„ä,é¬*~IàMÄšX˜Ëü`¯ÜúöK‡!qkyRoóïÀ.ãi:ò\ž¡Oé…EÐÌâ:wÇRюkáðþOï ø€_ -v–¹7á´<#Á¦.î¶y'Î& hs  ¾Ø…y†!.¢Ê7áTÍÒ•(–Ml§ F¤•¤kä¾KHˆQ·„EÙ,âZRlÚD¬¦Ðme÷TkÔÅA…gŽî´qŒ=jyÜa4¦Ò¤ËéQ#œ¬ÒáÒ£ç¡iËО]I›$Œ½Š;´é QÛ:WÔò¬¡u(£Gø¶ß•‚Ñ›-;r7¼ÀÖܺ‰buéÁí£F2«enYlSšÌ^Œ¦"õ.!¦D6q%°=Iwº¤ŽÖ d¥"›Mš>j"zz‚3L¾v¦¹šÔ©|´Ã–¬²6A½e´Ð#qíy³á°ÜF–eð¦ò1­WÏîÒåCUr¼ê·Áƒß)&oîX MÆV& :¹4§Ô\›/Æ-¢™*•˜°¬kÀŒJѪZ³CsQ6×rÇNB³ ²Ó…¡Ò¨•šè~™Ü´Ê8špö§ŽùZRGoDæW »õ{w­»)ܵwöºØ8|$™%Q,@»%;¡Dá`T¢¿*ð<š_é²ÔÅ•KB®R+:hÛ†c,a‹F™ \ ÷HK}/á’.b6<öîBÛB%¼ìF4§ûH×cA°¶B“*œ“!Ç™‡-Ù°Ô‹ó¯Æ; ꥿T¸®ðÞÅBʦͩ2–ZI®š˜¥3\g1f·l1e+ÜÉ2ÏññO—¾¡®/\ñ,¼%“58À& O‡×±† !€‡pãSŒ&öv&xÔd f­ôQå’Ó,бeQ­Èí 2üy^u<8Øc“hj:ô¯lbcÆqÊõÛi'!õÑXŽ?[¶ :n¬¤q)ÜÚ¸ŠßkÅnÏna¸Ùü²ƒj·ÎÙ vbz]:&Î2ô”)ˆKáÌ’ÏÑPN2¦" ×§+Cå-ËÁ5™… Šð6qãºV‚ù”§XbBãEÝôh»&ÝL÷ââsÁý²ÎX~OMà1ÝÇÓ=ô aùÐ` 6†i¢L¤'<µIèKrY A‘ÙvwºÀ¤ÐÄÚKœlê,-sz>‹ *¤å¿-K³ªºŸÀt¬jZíÉÍÌÝÝ׃\Ε“¹u”q”Z´Üî<ô`‹ËÛ-±¤}ñ…âþv»ð•–3CÜ:.né#‚øõx7z|uZu6Lü:±òoœ¥lèQ©×3¿ŒT΋zçƒiØŒ–©"Nñ©›ån¹è&zIµh èvÛ\C i÷×Sµž˜yæ¤ÇŒ yøí™n‹áôÏÇmË…ºFÔ’ŒzL.§pòè'ÍÁÙ'rÜQh0Á¤L¸60DÃ5á²>M昺ª ¢aÇÅ%ŒF儜 ´m=›¿Ë—$oÎ+a^‰ØÙ}¼º´”rQ»u˯jLó­ªNÊ9ÃÔ;íDÎØE¡ÔÚ[ÅfÙkj45`+a¦‚å–»G )’%¯Oá*­²!rùf6|ÃIœí÷âË IŠzƒ}vë:!-MG˸æÝ¥¬³J}EHi]€s0‚%éÚ—jDNý–³§Î••À%~RwgØR]¼âe‚AŠNP~éôK,JÑü”ÎòN·”Ð}X6CdPìQbrMhPél˜‹«°þ qƒÎ8IæÑ¸Öè~ïp³q@¹ˆån–ð߸Ë59qL1NCÞ$r&Ûé“ꓺJ»á 6p0òX>FÉ–Ò@H;/.á¼+¬j2³q‡mvc õ‰¾oñ©ªÀ9mºtËî éÒòö#f‰·JJ‹%¤ù3ÕÝi§“‘goÔ&.Ù¬W3°Ùä@IãeÊrì§Kš!ÇoR«ÙêHR+É8—£ A†6žësšØ\pdùOî5Lçèt½«kƒãEýì˜ø˜s §Y+–näähEÑEÏ?©yjñTû4Õ2››TY…ˆLaÃãoØŠbí›T<Õ³¼ÓM$Ô8¯Ð*½#Ût9;‹Yn:@w4¼–úFð~,öVîn‹N}ÈãS…ÇdBè½gU»¥y¥ ;›¤yWiF9s $–X®2óoÔ+«D•n™ªlƒšóL-42›SRÚbž0ÙzKm0©Á$ð·üÅvM8§;Èöá’¾Þâ»…Ô²®º±“Ø€A'Ac;í4'u‡37ILëÎ"~ é7r,Q¯¿^µW¦Á6ΔȅG gƒž=^Èò±ÃsDÅüâÍd"µëÿ Î|ÅkÍ#Ùƒ¡º12|½´>¡éå céQ!ª…ÆÖr õ¸ÑTñú´“çÅTèC“5óΊqZ›èòLN‰u›owf§ C ÎKUU¢æ?ËgPn“?“…Åk„{¯Òž.§C69Cˆ:±»J½CçTZ|LÆL uZ9GDi‚õã ¥Á*tlC 6ŸÎÒýÚ–¦¶."áDk0#Óo? Rš=ì‡&–¾mz›ÛÅT’IêC䄘¢ÌS@Š£g0 U({§Q™Ñ™„@õ© Îgù9‘ÒŸí—¸#4¨l‘xRÝHùð"RÏü³/è~Ð¥å ì½iýuÁ‰®p<ª×úvXo+ö'U¼O«÷&¯j¯…ÓìëO<ðü¯UËc,ål$‡å©SJ¤J¤nê—)¶Z?Pˆíù/Æ\5ÜÙRía§ QöCùžjŸƒBmd0dd žJ8Ã1||oi}xT7ƒ‡Ÿ½÷Ð{Åè3^VÓ.—¡­nørGxˆfîàÌ’æ`ÊÉ&6  hâ[%ƒM©‹ä]]œù‘Ï çˆ;®{oIöðc‘è]ÃE¹Â4zªš³* ¤+öZåfi£†xäá¹ï?ýªëN×N.ñ³„ŸEŽ´y¬ÂUg-ŸU ÚNÖºztbSO¶5hÓ€Ùð%xßo••Ýù¡…ŽÒb#S$rɱB¸Ä’xH°ÅÙ.Gl_pˆ4Vš¢b‚LV«f<3Pô/õã,ew 'ŽænæÁ glØʤH­y&þ¥ù='s½ÓõÒ x,¤šÔŠ˜=«'U)±}HêhËaÇÑ#°6‡.-NÒmÝ Š÷÷¨ØY:¦¡[e·Ä£§Uü.y6) 9±CëÍBï¢Ì¡¨œ–ݯœrÖ½Z·‹E¤¢¥†¯:OÝ7«…ç,+UñÕº±-½Ø^^žFiQN૸¢“Õòéœ[E-k&™IélJœ»ÓN›DŽY3Ÿ2Ñ"׫>8ÿA΃b)q˜!â<–+"O<ä-(Ç£ JáHèþž:?÷ú°°˜+ ÝvK,vcÊèÌ’'ÝØóÀ“BÇ„äf+4+$UžÂnIu‘Î$©²ÏÒ<ÿ†A¸L®ÖBèã©wº¨äÙÖr`0 ·@QDÿž$©Ë«¬»Ï%=‹tÎó—ô¼Fi-«xÿ¡qmiYÙʼÎ$˜*\n•Õq;,’‚ì¦L\”© éž9qŽKwJmYæ´ŠzuÉOlk x/tÉóÿL=§rM;fN«–°X“r ¥Ù_7‚#“G¿¡ ž²YÏg[ž¬&Mhæ†ÿ °çº,–{»ÑÉÝ× ò ¶çGKðÁ$MÆB&ŠÕZuz¹¬YnˆRÄzÇi´ECƒÂ™–\7QºUzCíUT96·A¨{.H ÊVÎ •Vhs5ן4¡ Ïö¨°Óa" Bºcs/m¶#Ôk±y!þJ‘<¾Ö/wa˜¤‚-»mïÏ RÚiñJÏø„L%I4ÄI¦HuMlOÓ&%7Žhµª¥*|‹†<>¡ÿÕ15´*ŸUSNg9»; ò’5¾mEÌŠ\î`ÔVl%Ça_9©+ÙžÛš©éƹJòÊ@¼²ò¥é©“0©BQ[15ºÓÅ ™f•l&<êDˈ5«XJ8ØÕògH£´BÓêêUãYÌôÉrK²a9§=—6r¼àü0²~¯ÏÙØéî½×­I9^œÛ˜ˆ2Pb6f°ÌD¢n¹^5G%”Q[TΞ¯›áäöÂÌ ‘ÉäžD3vÚÉÌ*\]Ô` ËUÛ·5³ò¼kÞú5¬ÅùµÀ”Ë©ì8 ÕJª·¬ãÌt½.ä´ls8Ä(œYŽgëÅäó72ø–*Óë ÏÿL~FG‚ßÒ$rfÞÃ/1—JcÂI^ÎeJ(Æh?©ó;]Í’«(ÜØÃ„ÿá±òk-Ú–‰·â©?á:ÜvQÖ. ¡f•.ð Ž8˜ÄŒí$AY—p5¡áP;¯…W­ïe}Ú–ŽN¡ „WÛÞ?ÐRL-mì„W•»­ÐãhtFˆ’Æ“ÓØp(HS5Ï˃­o;Q”©pB—œ*R”'B؃üçÙ&Z9,´‹×J-ÿmRH“o);[žE™$œ´G;¢õu4CŠ]xvº8Hwf–I " òîÜì¡™òi˜§ggºèâIÀщ©MŒbÐ}S±ÆQ/-íh§ L¨K<ÛÆkŃD0€„SD5WÝj¢õeJ’:éZd+Ј,ŽnÖÑ:ºü–}’Û¨ëð$rÑ¡¼eÞ-œf¶f}´4Ñ‚Åë ’@0 ÍÒö‚”#³ª*~!U;I2‹ò©£ ÃY%² …;ˆ‡hºK,JÒж‚s;ÍIµC²îÿJ—ZXíÀL‚áíš«ÇÅ/tåZnÝ¡ö6Fûà‰­K³î¿C F“ÆÊÒù•DiVɯïÑÌÆJb×h |¨¿È¦ ž"W>QŽÛ5˜+ðÝàN×Hšmܵ›]åFiôP_‰ž’]OÒŲo馽r˪ƒœŠK¯‰P“gfÌÄYþD±îQ,¹(íÕNƒtµK©ÐàX´, yLì@…k[³Q3EMM.‚-â^‡’6÷.X¨nŒ«ôùHlÖ÷\Â\zgF葆>ÊÇσ¤Uó_ZO[“‘–¤ë‡åØLËšAäiÒJ Ónœ„Äq“±œ=*gÍæzM«EA‚xÔ.í¬Ï×N74ıåSª•–†'…õþ _1—­àoe¨Ÿ¼uKÕÑ›n­¨(’ÀÒshH"gƒ„4ª’Å–‘ Kf¡ðFØê,h+ÅPÂ#(ChÔ¥:öŠŽËIÝ=Ø$Â5å=· rÇfœÒÇðhC&–Ìh{7érÀûBÅx=+4©`_%•éÖ†".mº7¶Yhb 3¶Î5i!ÅT«ÀŠUPI7¹‹ÿ¤û i[æÁŠªÑd[jsňJ¨œÆàì¥ÂáÎOìÖ˜¬%[ë'’ûq!ÁצÓĉ›Yz®O— ôƒk7u® "&ö<ʇ\8{ÐGiÉU9TtÕš"n 8P>{´1›–U›lWѦbÝ ÛÝi§ )Š £3Ð>Ï>*i÷­—¸­®Ñ;óPñ|›ÎçAˆêqlÝ¡|ðÛ7\~4åiÄP¢¼&Ãu™$MªÔò¯(ͳ¼ÊŒJ6BÀ‘‚"`Ñt€?i:wº‘¤¶”)­Îl‹¦2ã#,éÎoù,åöÎRøZ=Ã-™Á„k212VŸXY}Þ@¢Û¦„% ŠgÞe§ @¤ƒŠþ˜ÇXN•»Pž¶!A£$ÒK½äNX‹6yšè4Z."IªubÒ˜M‘ƒ!RH¤Ø«„8êU¯ ¤ïtލLu(.«â¨š¨mP!ž*¡¾æ(\±­¶Žb©Ÿ%ºØ²ÞQ³éU#òazÓÏÈ!-ÍôŸ˜Š-÷5» r¢%âò("Š")@é4¼k|/ ­šh•YJ.Cv0”ÅòÊþ”…gxõ„è¬çù³4é^-Òy˜¯n.×dÅ&†‰zZgƒ—ö­»Ï¥åðÐ'Ϊì‘݉Ï):Ú`¯5S1™ŒÒÀ4>údRË0wõD]+ÇŠ“UÂÇÂR Læ’$à$™  Æžn$ÑfNËy”¾ôïþQÆEUhÿ'ÞÊÛ¾öŽ%å¿ÍŸ3bרC¤™$›xÈÖfvd™Om8u6t°Ó…$‚{–n€Ç (™Ì85¨ë¢¤ÔùþYêa¥VákÏÝ ŸåH–Ý•‘㕤·ÇttÑÜoøÔÔ¨Õ'O-åå•YþÁò5³ÈIcŒžþ®½¢ˆ\ÎfpõØ2ýlp°­3(·ÁƒºÜsâîÔ׫g·\RLMûà ít!‰ÂF™ Ùħ{vÈF$sJZBV?æI•Çe4‡¿]N<éOš§'t-ÿÕxÁ«œ¤ÿ,3Ìd–)ÎõQÙ œlM±JdIUHZ9ÒMõ –`£ÊÅ¢& Ó eFE#'f\³…§9ÞžõZÑ·&%Xk§FåUn¼>{Õ UǺ!AóCdž>7#`²5OC`…§ŠÜO i¡D7CÙÐ;:°\oÁ8·0Øfþ‰ZÑ’™kÙ-åS©)É+B,óóÛ±â>eh¥a‘|²mQF2å½ÔSÌ‚ýétKŸñ+w*8ޯקûš%ëÅç—¯„§˜ä^GR¦Ó’°³ê´V¹ÀZXê ŠmUáFõ J¥¶f*-Éò:µùêbàSUØé,SrP¤a ÌÐZÖŽ² µeƒÂYIÝÐL„b’H=g† ΢†ŽÏ…-RfíucÓ$æv:V\˜rèA ]¼fƒ&-'›&²ìªòïtƒIº[ˆnÁÑ3~È_>VGÊ&Šrl¥+àšæþà1=p T×áÉÉ©=ØZ¸ Å&ÀË­ΕhlCŸ)¥,m‡\­Cá†ÏÛéÂzâY–¥ŽÕí$1¬ÒÐ.™ØÁÁ$ZÑ8ªxcœ…\bͰىGYëzå<(ýk2ªH1Ûz·ƒŽ„°§ˆÑÖVv7îe@f õ,¶4!̆3K¢H]J9. (¹¤íÅÞ©@Ü3­K2½Q½4ÇÎ ¹(‹ƒyZ•¦XVªŽü*|ÖRFÍîíÌÑldT¢ƒÆì•|¡ò›ÌöôÔà/Z0ô$³r:PШ4ýÌ©Z¸°š)Þ*fËšXæe:€=ÿ£ºe0)3Fm1R»u¤a8¾y£hc§B³‘à¦pÄß7‡+Wúá¼2yŠftйäHNb_Ò¤ÀÙJ{DÍܰºW̨põÂä¿''¥í™*Óh]N{À8_´‘j¼Ô¢w4œhª„^ÂÍÂÚšòM{EŽþĪ,«j!‚5 X.…ØœºÛÛjZºŠt\xˆ ùc¬-×jóÔĬ]«k§I”wá ºÙ>O‹ŒG’@½Õ¦Éá,…â½£}ýIÿÊ­¤ÔÉr‹)Ý´YÃVe†¤.žl’ù–€—ðri)£³:RÞà¥í´EÉÙ‰²V‰í=ëoY‘Ž›Ø‰þn§m”œ–¥mãÖfæÍš§‘´Ò›_)²*¯#†ÍîzO /NÚƒ§³qú¥ˆ|†[``—{™Î,xîI)8Ø6r<“³¤CžOm€¯[åU+£|{‚ÒâI•[I±0:³jˆº$³@µÓ9"¯IœZh†ÆñT™»sè ïHn< zêý|ÍÌÚú3x¼—_¡‘Ìfb£. Ùð[3ÚN8o!5™ Ë`01äÖ|¾êž‰&„–Ë-/Å6Ýî9;wDØé®¦íºÈ¢4ûÒ&‚wcr ݰ¡)¤A0/%DÖåø3Sëà•6J ~7nNКªCò ê™Jssù;ãÜé"E)Ë ¥èÏý½ Ô<År•Y6Ñ„J¸JIC®Zë}½³÷ô 3sxNÎ{›‹ôxô8ð‹…ËþºufµZ›t=uåé%GU±&úQv›T)ûer–Ö˜äG-·ˆíê4šxð–'ÕöVºZmë ÓÇQÌ–ü¶Œe§›IÝbéÙŸlX}›giÝ¥-(©\ïgÔÌ¥»×Ðuˆ¼²XEG©¾)[]T9©êÒN+¡±—Ž[6ùKZUaæÙ·'{§›HøH"ší ž +w=ê“1!GïÅÑžL³¡DÉo‰¦lo(Í®ºý/JlP#Gñ^÷ sʇvDòÉýP ¶Ü4ÆSï?v:%D.¶¼¶€:ˆg"ÇY[¤È•sɬ<úÓ¤óšAôž÷õ_ü:ôÐHœÚ¾ä5ü¢à—µ7½:MDë[:=¾5Óò¦|3â2ëólé²—Pß`6fp†hh,×*–4[û[çëtÀV ÔÐ)Ûd²n8)Bor–`þ,»Ó5Þع&ÒŒ.Ь ¢ÚAÒ°|ñ«þÜ0ÁU=N޽°6Fp£íLí'Ž‘‡FYúK£QTUNQÔ@’U,#,'WÙ–¬wǵ·fwùè)¾Zøˆ„o”ÏÚ9x¤&Iݬ?å®Ô%ßs·ÖÚò7ËÙðƒ£S!8¿uÝ]…UX]…X,Üíb§¹d«~–€Oűª³þ$‹)‘<ž"½Þ®Ô 5L›°Q7’+ñþO[_éiÍš¯p¥ö1ô×ôaä2QDç%qŒ…ÍàAÃkóÀ€;<ÿSOuË”œ.?Õ¦KþçÍ"—[UÌVa¬x‹i¥ùdt )¢WL¶Ó¹ …1êK3×BÅ©lb¹Õ²Q¯¸ia Ðû<¡bZìùô«SÐRûËS8â6ýIš³ÛèÏSiãe7Õ“”Ì” y,ÏF…n5Íöa–È•[%µ.¥^-"ÝÉr¶ÛMÛ>«¤Nïïõr÷¾•˭н!ÊþÆgšÇ”øšl®²£SÐÍòæâ ¤¹œEËÚ¶¦vš©Ï !j™øÕxë&Ø 2š²k™I›%Cjp VXN,õy ,8£T.= ÷f¹e×½2íp<Pã_¡P|¼¡„] !Êé¤Sf–¿Ü@ˆ†…´ÇòÙ&‰#κ6K@ ØnzÞ¡}òÜVÏzVN™u™×ïÁ=/’e™dR¥MÌ Wmè¦OýN·‡`X¥%‰;D ÞKâž^‹*KùÑU¹zÕÞLˆ“Z<ÔYâÙVh4Qr~T¾(7²¨å®ƒÈ è”P„ðQ<·ÜerÓä[‚Çç¥Ù"µ»}ãÞ©"ÝÆY>чüJ˜¶•I]Ùî,W 5láp:B[%A÷fó@渷sIê–³¹JkË‹ûÆ»F}eK=jÆöΩ$BBꟚüÜmd§«'ʈÒÐ_*9梖i³2¾–? #ðÔP\æ‰ eEÍŸ®znðâ·~‹/£è•ydj]LCø-ŠÞÄ, Üõ> Ѻ¿çÐ'Íœ :0¹ÂHx¯¯Ä‚8Š Ufðo˽ %,õÏÞ,78“ër`“.RŽDfG°°ôø'u §Û5ˆf¤KbpÊoå¤ït«‰\³ ÚG"µ5 ¤µ`¯aÍÝ"Oca•wzU<[Ãè²´~´áí©AÏ*¾˜tè<–ªŠ¶H’·Ó-¤í€L§(Ó[¨tt'HÏÐïë ÜŽiØÉÌ:fÁ$mV‚t¤ë–{ËŠ ­¿¡![5hìïÂãn!ôfÁÞ³ÁØÒ¹${ÖKZ? àüÖžŒ13¤‡ý_E­Çð³ÑYxc& ìM8 ÇÝ[¬ø¬£ÀÖ–;{ Cëƒm6¶y†ŠMwbˆÜATä …¡n··Øé”E¸…He0º%7ÌMÊKQ3å¥&§–À?‚€s1¼#׸7ŸÀÔ ÃtëŸ_W³`•¥¤×o¶>”‡O ™¸ûÁt,¤ t“ÆÙ­Ýmô1ÍìäÏøá ð I¡fCôt¹â^M\©4”­X^*·Œ iMذï%Џ4ŠãîÎ IDAT~åOEä¾Ë5¢ê*|c:ˆÕÜda,ŸU‹T”fP.vuÀ|w:›„®Â³ »èRxÈåWu¾Í»(ï®qqã >iìU+«iµTÛ; ^Ù⃻v*ê®àƒn&Na-²=eVÃ3™fª8ëùuÙ²NÆãòÉP‚Ÿ4†ä£“™õj¯§ˆpgIu&æu¶¶ˆϯ4–€OÒÝB”6’ƒ¾ mÑm½Fž½So¢õmœ#w‹€øØ^Ï÷–Ÿqp9•ö–—vy‚µÔâè˜XÓ ì´S§ ? 0ððŸo:o*tøWv©ÌN䈇ë"ñëW‹­…†²äe(!¤A3qì]öwbº¥üV·â03K7ÆHb&~¯e‘ Oëáä.E#žvL4ü"Îwô‹"%®’@2ñøÏ–‘È•• –Êi©mÑ1¡­ë%ÂiÛÛd Ø?ú‰#o™ÇeH8GüXè'è˜Î¸ŽúÚJv:kDmY+U|htR£î`.^¥‡—}uÝÕ44³6ªS§‚Pe¾ ÏÇ¢¬hb- ¯Ô{êLàñFÀÅQ”Ý §p}´1&dПŠºòÒÛPᆓÙéÔîäÄçúè¥BEÂéÀ4Ï:Ê2»öÕW¬B •Ë×.x?ãhøBNC¶•q­{A×*ñ&O×Q%'d>ºSÚàÌ ÈNSŸ7ÑØN;IøQ0¸¡;ЍK5œ !À€¹…埥ŒXÑó=ú•gA—ÿ¶ü— ¥ËÚµÜ4u˜†ƒÀn»‡å؉'d§SO¸ÔHä…vã hFŸÛ’W€ÒÈè”&œžÒ±’4k¡¶J省Ü8—¶á°Ë­áè7¦Íª1Qù,BÌ‚×N§Žô&ifœËá^PÌ5Ã}zÇO…#OÚûǵ¶nÒ‹ö–‡ôvÃàF_—2̶wF®·Úz[qVŽ]^hèE«Z'×rJP·ÓNÁ!ð6«Ý¶Ï"VÄ®µšü-›ÐZÜ(|/X½‡ù#ñf „'4µõs –D™K†®ŒQ¿¯ £ÚÃÛ¼Æ R¼7ÏNti¾„ÈDYå)¤ê³Å—…:êµ)‹! D¹Ã fбMzªÀÇ'§JtvíöAnw»ŠÁ¨È>ð‡ê2wÑ\i1.Ý(—V§St—Áe,3k7hÔ;YrÐýRéÔÐ<ÕýZéê ÝÌRúW> ´ˆHWвgJ§z“͆4Ô+¶nvh8ÕoUñÒD­²•oy.Ìñ†•p}43ÌÒQlôN§G'‰ê’££þìõL&iz+/]m~½%¸qŒeÝÅ„ÛP²åÞ’»õãdý¸uÇ[@Ý×/­=Ÿ¹‘ ®Ìð*—Ø·îdà¶v­U?1+OyL@ÂòÁ‚w2³Ê³’r)ta#f rJ5øi[”5DI*‡sž;×¢ÐåÀú÷ô:=ÒŒs¹<Í wæ¯2Å×^áiÆéÙz³®ÏVëˆfµ_|žôîÞ<†·/u}ðïÌ#¨ Ъö¬”Vº\cõKžyÊ(äÙðcM~ÎĦr¹ÍÌÂ2~j™mæ”ég¹@.KIUfÙVå?(Ö„akw:³¤ =Ê­²kƒx!'>\g°Ç7yšOË?=•¶{u/ÎÕsÇ8dëUÜäÕˆ-3“Æ«Åúä/Q˽mÙ~4,^m Æò”Ã(Éí3«°9júÚ}ôN·—ºM°íÞ¤Ë:ÛU¬'Š%C¹Ô¬@†ë5%‡³cAHíšõœ ®^?¼¹k[xz'—lpɇ2{r-Ë9<Yü¬V qf¹âN˜64hƒÁÅCëÕ ËQjJ1ž”AÀ$$úý0r¼8ëâ\p0ÍÖ\Î@´QÑÌ aŸBÙ˜vQCÝ£»|Ø¿Õ)-u`b\WÂÍp/h“nnd THò†¡ÈúJy pf·t®Lsf …hÞ¯ÝãéD•9Ø EQ5´\¸=•ÛÝP„¹=³h&Çêên zJ GžWÁ¡Mjzœ1·ª ÝþKK_Nܬ‡%–ï¨î´Ñ]wÝs•5¼R®ÍSqgϪ+qÅÙÊŸá“?SNd6³–„ã_êéÁýK6¡wþ0…Á|*}è™°µo}ë…ÛÝ…sI¥'ÆS§ÎÛ²bn@HiVá\ÒGm:dÑ-’´þu„fé=.8ÀuK'ô ìí Ÿ‚>ßùb“ÑÌŇ"ðoië£z]Ä:¹èD—Jt­ åPáI"kÉ£!_Ñ!ƒþ½¾VaÁ¢ 1­n–/`OMºs‹ !µV;p€¼ªÐD–¶ØK«°ç¢UÍÑ`h¨ ¬ZjTµÑ'C+© 0¸¨6™ÆÎ‘J–Z$ºLc9›Ù㜠Wgô~—.p<½cПvXÆ4ð Ù…>Æ*+*M½t©]©KžB] ºæë¶"ìéÌ®Ûäg¹ü*Š”ƒf½uÛÏìt‰¶kÒ­¼|¬ØÆIÙXÚ°MðGnÆžÏ8¦›~ý¦mm­¹[cK[JR•έˆiIãà $¤Ôç&~Ìb…f0zr*ð`ÔÞéb!MËý`r©EÒ,ë¬U¢ÊZæ®æzøñ½omY›4‹9˜‡4|Hφœ0çœk[}RðæV…[Åñ ½%“=Þqcpؾ®@á•TœŠU-C»I¹Ë ÷SGUöA"±k³µ?!vSœ ¨TËo¤¯óÉA ã§v¥tÐ-ÏNèÌÕpÕˆQH«:L,! Öä`fñ;MRs#oY錳(ïU¸åðçXÏAq’RƳÌÍZ7zá[MúOé`¡Ü¥º+sþRÚÌåxž¼ÃM¶" ìe_f½›9_<[Æ Ò+îãL=zg6²/Ü9ÛÆ†©i^¹t’Ú ¼oÍüàãèkÝõ§ø"_]oñA'Ó÷BK{s«g,ïgvTçýeŨó¡ójM#ä7«}R ­2ØÎ,)Fgßà_í Ø,G8“ã(QXrâ  –lxS.eA{ÞH,bµYG@¡ƺu®­ÃÔ´h·6Ø®™FäÞùÝ›-Ïý¶! Úì~dè –J7‰*§‰§)1—ÁÜÌIùQ¥&n—\–­èàF­ËA¼1Ë•Jpw€¨Ç?±¯Š…©‹&}*]p› Õ&‹¦€fÁdêiMgVkÕè¨ÄóßÎ/á"o;ž2®˜|yµûÈôœMaÕª¶º÷HöŸ»ÎÞÔÝÌ~ö‡쯺7õÂz[x`½]Š;dºŠ•ԇňÜ~ö‡xã=¯®AKn+°"wTúÙ…Zž=°<=åäÑ?ËÚmžŒ®f÷îð^Ýå+ouaÂÇôœÝÓ£ŸxËq¹úÓ:>ëÌãS fô¶•¦ùj÷f<é×zÿ[tÓÚhÝ ¿ã·F ?K" ½*3Q晡©ïÑü\ÐLkx+ŠW´Œµ|¢D ‡£\¹V´ íƒ{q©0:˜ Ê{øp<¾È¸Á:¼@3¥‘÷׺D£©pA$­?¼þlÍÍ[³Ôípf.“Ûoþ›†xzÛ›ü,èÃÍ }‡'6H~È¥¿¨ Uòã`¦vmCUHæ²±.d „!OBhˆ¢h·ûày6q1hh4§ Ý¢"ÎÀ$Î;q0¸ÿU?ø[¿òë?÷–ªD ™íßþÐ|¦vù'zÝ]?Ð/«cÈÀ¯àôÒUvÀA3³>øÐßþ§îï¼ÿG~äµ?´òµž:&ßà¬÷½ïüq©Ž¼–Kz¯ÞùæÞzéù:}ðí}ðÁ‡ê(yˆ>ò¾½î®»¯¶Ö¿úÅßqù2z­Òê[þÝ×qR©m•U6ÅN§ôÝ’gûîíÅŠÄOò©$6[Ja¿«7’Éñ ½xñ¦™õ÷sºft}Ž=9ðÅö$pB„Çnëß«E.f»ÑË‘ý ÙîtZ !´eà¦y gžÙY« ·âPle&ý=Jè¹[OÆð¯™ÁŽHÃËHñNÞh´?QkÎfnq'§]ž]L‹>`Ê9ÞzÜï®=lƒ­u¬Ôb«(ÞÙƒï?X¦¡d*s ]R¤[Í/O A%˜å åhPkQ«¨¡Vqj’ruDØR˱½Y]«ÆO–êh-ŸB~µ°râ,W¤®’-F$ž.•Jêfíþ{_÷ü7¿~ß=¯1{Ô̶¼Ž÷D+x¨OP×àdž/A!¤¹YóîJÝÌ~çOþïÞht|¹¶æi”ahÒ9p)46ÎßùèïS*ä„…7Jã¥>¡Kų–¶¼ŠŠ5Ë™¾P»Ó)%Läp+&Ý—ÓZt–î¼€#§ÌÖËû‹FÅËT–3ÐEÏõK ½Ï­KZdÐÙÔ™è'›QÊGÁWµ½Ä4ýON„¬2ÆÒ®[ž±Ý$Ï IÜ\5à!³ [œÝÀ§*Ð*…¥Eˆwùfz¤^”ƒ­Òá:R(òbªýæ½÷LoíÉò„mw$-y/:—…9ñ³¾iÜÛx¶°‰£r|ë\£¥YÁ¤¬e Ø•1›Öù–ÐåI9.¿*ù"ñŒY’s+˯Åiä( ¥L–4eRÔ08³b(Cób“‰@±4¡žÿÒK$·Ó9¥R7›™½þU÷>úÌ“?uÿƉÿñ}ÿüÿúË?yîþÁÌþåûÿ»ûð|ûëßôÐ?péÒ%3ÛëÞhnð‰=ñüW¬ÙOÝÿ¶zõküÒ_~îÓŸxê sÝ]?ðËïxï/¹ãøÅ+þ÷Ÿ~ô+ÏX³¼ïCO}õ˯ºë•/{éK?þ¹Ï|âé/üì?ðÐý\ºtdîo{ý›Ìì>ñ±'¾öܯ=ôó¯½çÞKG—yâoÿì±Ï.=ýÁWÜùÁúî;ï¼r|üÈãŸýë'³f÷½òž_zû»_öÒ—ÿÅç>ý©gžì2/™ÙÛ^÷F3ûƒÿú±'¾öÜë~àî_~û{î¸ãŽã_üó¿ûÔ£Ï>“æÌà×úo^ûÊW_º|ù‘Ç>óg}v)ÿÈû>ôÔs½óýí'žþüÏÞÿÀCoÉ }biè•|Ç{î¼ãåß{ñÊŸ?úÉÏ>ûôÆ’üÔ›ßöC÷¾îÈþòï?ý‰§?ÿÚ;ïúïúÿõŸþþ÷_<6³ßø™|öé'>þÅÇøU?ø‹ïxÏ¥£K_zþ+Q÷_<ôs­ÙË^ú²—ßqÇÓÏ?ûÿþÍÇ›Ùî¾ç—|÷/}Y;>þ‹Ï}ú“Ï<¹á%5î –ôK%ŠÝQ榃éÜö)p¤r¶óÀ úâsow‘öd¬EÓÆ÷–Sãíù–]gÚÇöQ5‰ã“II 7Êf Ä*ˆr’¾ítZI¡¥âÓÆZ.,3=jH›+a¯UMsŠèðåt:ˆSƒÇÍÆ·ZÜÌúR¼µÔPÿRæÚ¸‚Cê©3EʇigÜÜYGг;ë{Œò{8ãA“¾'µ³iš§’¦’ Z“[K—¡G QOg9›Á8ʬÄd4¹ð,Ó¹–ù(£aË?-ólˆÚhŽlËó)œ/ÞòŒ+óvXv„ïtžè·~å×Ñ»üöþni¡nöª;ïþý/ý—wÞÿ¶7¼òUOýk chúÃO<úð~ðÁwY³?úÌÇ‘ç»ßýÞ¿þÓÿðc¯yÃûßñîO<õ„™½ÿÇzìÙ§>öØ£oyõk>ðï}ôÙ§ýúú?|ë>ý×ozÕ«ÿÙOþü'žþÂÃ?úðã~ð홵?úÌ'V·jö»ü¹µö/úyDcïÿñ‡žûö×þí_ü§7¼òž¿ëþþ¹§¿ñÿøO~ì'ÿþË_|ø‰Gßöê×~à'Þû©/=ùð>üø£|ð!köGŸy$&àý?þÐc_yêc÷.}å™1‚lr¿ûÈŸY³ñ®ŸKÖzçïyõ?{èç?ñÔçþü£~é¼ýÑgÁ~~þ+_úÏŸû›{Í}¿ðöwmg}ßýÞ÷ÿõŸþ‡{Í}ïðÝŸxúóÏ~û[_ÿö·~ò ?üWO>öÊ—½üî—¿â“OÞÌ~îGßùÙ§ÿØã>xß›Þòú7F—Ííû‹ÿô’KGÿÃûOßðÊ{žþú ÿäÇ~òï¿ôŇŸxô­÷¾öïxï§žy×2lüþ•_×pSºà™o)ÚîFÎ4i¦…å­9}Šo–ÎZÁ³f$Ù!³žŽÝ›¶Þޝ|6màÅ”öÎG–¨&`ð3ˆÊ 2_§QÌä(0 "ðd“Ÿ7•~ûÿÏ[ÕÔy%ÍÖH+)+›ùoËúhù¶¥9ž2|Nc3§>D‡‰Vÿàfø€¶$rKðäžõ»|8ëÁzs.Z¶ð}À'#ÎÞ饭4bôm->Hܲ¤xl¹œ³ÒiY,/1ßZŠçú(ÁsI…ÔáìuËÿH•åÏ#Ê ¨ì_™ŒRNå0Ê€Å5%Cly•ÑÂt èoéÖ-¯‡ú€bÛ¤·;V;§¤«äfí­÷¾æ;ßÿÞ·¾ûç¿ñÂ[~ðuÂ0«;xþî¹§Ìì³_yÆÍîzÙˬÙ=¯¸û¯¿ð9s{üùg[k÷¾âÎEG?ÿü³æöäמ?:ò»î¸cHFÈþ½w 53{åwò‹O˜µ§¿þŸ?úˆ77ó÷_>úðãZ³Ï}õÙËG—^ré(Y Ã=¯ø¿þÂçÌìñ¯~¥·{_q'†gC2#Qkç_xþÈý®—Ý1›Ž{^q×#_üÜ2!fvï+îœOýÝW¾¸N¯òw_úÂrÛó?ô–g¾öÜ•ãc3û—½üÓÏ|ÁÌ>ýÌ“/¾x%âÿW¾ñ53»òâñ7¿ýÍ{ï¼ÛÍþÝ_|ôá'mf}õÙË—.]¾4žÍVâ<Ä1è‚Ô7–Z¥Îp§3FeFÛ; ¬5¢®òàÞ¬h¼Zsyp¯s¶¨¾¢Àõ^@ÚûµŽ¾e{XG‘é_y“píÀfÊG`‘-[Ö%²ÐÎ/)Þ¶¬•ªtñHûÈ‘;h´V!'‹2Šôñ9„é_~]ç¶›¸‡õw‹i<ÂÞ¨ám랦_ÙI}€®7ë;9[÷ëAÂcpñä>)hh}ò~Î"OÀ)ÄEPïp lûrïHÙ„åÔUÝÂ*eŽ3ã± Ïa"ˆƒÔªŸØ›–G‚œŠ¥šü¥X%DS;2M“*Úвª:Ù÷lÆw:7ôÛø»fV€uýß|ï}_ýÆ föì7ž¿ïU¯©d€‚´n>ÐÒ‹W^´ÞÆ‘™¹ýÆÏ|`©xÉýòÑåÅ„Ž_<^9V勼®«óZbÝoÛâ}/™½xåû Ï'Ÿ~rþî7¿õÁ7¼åèèÈÌ._º|äGæÇÐÛaÀGGG¿ñ³¿´”\ò£ËG— wULÏ8{||lk_ÚѶšÙÑÑÑ÷_\'丿ôòKfœföbLH—ù_Ÿzâ=o}û«_~çý¯yý_üý§—öÝýøø¸­2c ì¸Ç¢ÿý¯þó2Ü÷¼é­þÐ:!/Y&ÄŽM|Èr¦‡}ˆMÜKLÑÆ©Î•÷ñ¶ä›Ý©Ãkã¾¹}4ÝsƒGïÜú»êV^=-ÃZ]ÎaÓ¿*£S{™…æN%üØ(ŸuæÖàÉßú•_¿ù\(jù¸ÌÓìd ·ôôTÝD³”Y+6Jêèí)X2ޜٿ~ٟٳJgGßâ)>È ×w®[p÷ÄØb:.B™·õY>ï÷¼nù/A€ìØ”pâOAËrý-'ÚáéyLA'ñtd~t´|¢³·véÒ¥ð³ßëįޓ1s[µ,òÀfÇÇÇÿæc|åøÅØká`ñ¦xuBz8žØŽ=þ¢Û¥K/13sç}oúÂóÏ5k?ó¶wüûÿòÇ_ýö·Íí_½ÿÃC…6·ãããóçÿñÊñqÒõm0uMt||ü’K—¾{劙ùÑ÷®|ÿªª_9>þâW¿ü3oûñ—¾ä¥>÷å¥wÇ­­=õ£è£å¾òŽ—ýô¼ãß?üÇ_ý‡o›Ùoþâ‡gQÝ'.W%ç¼|„v7rV ïÔiÊ·Q…2C•“6H¥†U~æCW}Er±-³áãy‘(öæÒfN¹²Œ²áaÏ'Ž”°вMo¡˜úš‰ÃFsÚP˶´[è!ÐZ‚PËÊŽüT¨?ËNQ°þ Nª;²;çx»Ê- v½Ä³±YXç8kf9¡[3ºþ$ÞÚ0/Ÿ[hfýÕ,ð„𚎄pà.FIÓ6s‡:%–“NÍ&þÐ/' [kÐßɰjdQ=¶†Â’“’ª'¹f²-—fÊ P'‚lŪ¨A“º&ÐòTv5°—š,2¨2Ÿ}Ûéæ‘¤Aæfvéèèž»îþwÿÿËGÿŸßùèïßÿª{Íìëßþæƒ÷Ýofï¸ïMß{ñÊw¾¿Üdó+WŽï¼ãåI‰VõÀçöÂ?|óÝo~«™ßw÷=¿ñ³8:ʦl©]¹òâw¼|li–L¤Ù⛿þ­o¾ó÷›µ7Ü}ÏÏ?ðSmÙ½ÕE=ðƒ÷]¾|9¬èÊ•ï¼ãe£Í¶témævßÝ÷üÆÏ|àµçÆ®ÎÇpCf/üÃ7êo5³^óz3[°«¢O~ñ±·½þMOö'ÝìÛßùÇ·¿þÍÍì'î{ÓK.]Ò*KÇûܹÙ¯¹ïòåËäp,» ËÞ`6hEÒ%”ØÝÈY%ÚI7ô¢$¶zF¹Þýƒ}˜ÿá†ÌåoëüÃãë|q €käŒñTPÿªW”xo ÁƒANýñ8Z©ò,±ÔBå<9•iõG±?Ö½žÖwºÝ´«Ku#—LÔA#6´Æ*(ªÞ ÄKüHC*ï»±ñ•-ýÖ_ÏÙ<,þ®UÜÖ§/0¡õ;ýΞ»Ç÷÷PZ Ä=æú_üöQ”PÎÙiŠ—') ¦j-óXæÑ,cöÓªùv˜°YZt€JMùkj‡ITËʿͬ ­#!s'62ƒ *ý„C7ôÔNç”ÊhÁÐåGî}ý·¿û/|çÛ ÿ—_xþþ{_÷ù¯=÷§Ÿ}äW~â§ÿ§÷ýóï½xå£óñUšÛ§žú܇ßý ¿ùK¿ÚŽï¯þôËßüúêÕ½SÁÝšýÉß~ü—|ïOÞÿÀ±µGÿìº72Ô0ùSÿÔÓøÝ¿ð›¿ø«­µßûë~ùßøÈû>ô’K—.]ºü†W¿ö÷?ðäs_úýOþåGÿö‘_þ‰Ÿþ—ïÿð;þ«Ï}æßùŽ5ûôç?÷k?ýþŸùÚW®\¹ýÔS}ø]¿ð›øÕfí÷þê£_þæ7þäoùåßó“÷ÿèqk<þÙcD«cö‘÷}è%G½õ7ÿè“Ï}é÷?õ—³YþÔS}øÝ¿ð›øÕÖ°¡÷¾ãoýÞ‹Wþóß>2«¸AO½ðµ+W®|ê‹G¿>öwŸüÅw¼çoþ‘gžöûýæ¡.ð·¾ûÝ¿ùÂç~í½ïñøø™¾råÊõÝD”nàWõ0MTj÷'g’6¶qÒszʉüÈLÏûa’÷ëÌÆ]¸å9½¶<×!ZÜÐkÙãé>³HñV¾—e=Æ7‚Æû?óC<°q0K´ˆnˆ9 dìeRê•ÁntòæÐžu^?)–´ ´â_;1¢F I~½Ð¸™3~V;½?r;.Èà“ºAcÇf°J©b¤|ø1Ïñ”Š-ó«h#pnÏ„¢s졦§ü o~àÕ¯ù!)Wßh‡<ÌFvSn7qî‹Ä]©J ],`C[fºa¢å\ÌR¸SUv:t×]÷X‡çoÿáÿaf¢°6/TÊʸúÍ\Ÿç1‘:̃@¤%Ý\[PÃBþÃ<§ôìi²_ÿÆwÝÿÀÿúðÏ–çªzJsЫ˜±¯Ø† z¼Ó™$º)g9UC¶ ²\6c­ÿçÖð);ÎÙ0s „WÕ§²]Òx=NN°2ÊfÀ IDATðò8ú¯“ú¶QlXëM&_žëë¡Ç¾õ­nQËç–T+BÚ/Êr›¨³òŒB|[&pp!|Ï#ÓƒçñÜàÑ»PôAÄx$m)Áíø¡ˆõTëÞl¿ú6mO¤‰}nË9Å)ßs_~wxÆ(—Ž»œš ¢R,”Œü'É·¨LÕfÇ«¬H M ñ_Ô-áö<¸W=ŒÑá?BuØîË.©‚“qYVR*,uV"GÊgëßfýa¿Öåi|6ð磺1é Ô]1Ñöõçm¥î{óãÏ>Uλ’zOƒ™ “ paÆrƒi#ßµq¼ÓY¢|n=*ß›¢7ñÂBóÓq+[k}ÿeWª~#nôA¶_zÿÙlÝÚoöŒ=¢øFþºzP…EÊø‹¥'¥°~H\-EX'ò9ð'[+¾e)_ü¹ óqa©„Ê molˆüŠÌõg wËÇöôEë)7úÐm¬›Â=¥|CÀ’×­à­3›YßêiÞŒùÒ¾ÇïÝò"åC”LÇ´-K£rô§•â+íä:NžÒ–¾”ÒƒY,3CÍYN4g¥‰(2+OÙµ?—¿Èà™ g³`›SØ“I à.ÜзžÝ¼øˆrߺÙ)Ý34åБRÂDÒÛÒ@š˜•eƒR=w9¸DƤf«övØæ Òc•nCÎ-•Z gÀDƒ º±›§p{@–Ä,nîÅ}?|…fºAÛ£/áQ¬uöÅ+¬©ÝìÕ îc8–¶¦|dØb7à~«Ì ƒ¨¢ó3¨þq¯5#ˆ ËÌ«WªÝ ²Íæ ¥h.öÎ~3unæô ¢µÌßæ=n2k&Ú¤ÿ¯6ê´¼;Y:¸†MÔð„(Y~á—¸¢ª§®€}ÖOÁì,ÖÃN7)2i•]”þ K½‹ÌÐ å³þ²Mk«'_[ 6Ö \°8Ê.ÓA¸wÍC-+4?ì)Í:§Ç"„º‘Ñ„f¾šÚ…òely^1äíøl“ŸØôm.a¼føŠ”•ÝÖTÏçõlpÉëÚŠçÖ”mÍ{Sx°¸™‘&jCñ~O'ʺóLlM+j0Ýi§S@ äÉøksϽ}UÄbedwKaƒõñ>̱Ϻ‹‹÷÷vÎx$/®'EÝñ_±Ü \¿ðœá,Ö&V0ÂUü-áÆZÌoôò\_pÇ8šS˜h•ç¹l•ÚÍÒœ -ôPUö»¢ù!(y5lJí6ØI" i2áaúi7|Nwº¹´ügˆ½TõdMätiÞ9“ê+ëªVÙ <í“$T]­Uv‚Èñ”~çƒÒ¿ÒñÜn¢(CÔò(•Ùól¹Lj0`ìCù³)ÁZ&‘g§3F'Ï÷Ì(Á[ò-A¶HHíÆÇúÏÖ«÷÷²äŸñônAï,Øšò¥—óåþ–ÞMщ‰Q(›ÝÙi§[OaÝòÁÁŠTØÀÙãYî‘Ýé£})a[o»Û’ãÙúÁ½ž¢-{;ûÃ{ÝrÇFÐ8èïìÅ—p. £Å>H2¡ã±IalC¨€ó1Öƒ.ç¡“®l'¿šGiÞDHí{Z‚MÔ¡ƒY&!nµ3…Ò-ÿµgƒ/îƒW!6ÒX¶‰F?³"ÒæÙ¸=ë4ÃIòžÛJj¤³åA~ÍÇf#+Ã\YQóL=…å;>“DÏìa2Væ–3=Ì—W³äWç -ê)[!¦‹Q%u)¬”öžâ)·ÁÓ:æÃ$°KbÚ¸Þ? ßì´Óm¥YRåxJ#ëvx¡òõ3 QH¯ué·øàq;ø@ŸYò$+˜ˆç;f»æ‡‘wþ¾á³2WšŠ^ØÄ]lß볉ƨR¶<ßȉ`üLð,×´Ü-ëg›œR›¡òY˜)yùÄÒ1´<4Ÿs§3Bej€ŠiPhù§U+u„±ŸZ†ìN呲õ£UzIã ,6Cd–ÙôgT?•*N¾/ éÀªød±Åb€Ã >èÉ)©–PÝéf‘nÂŒ¬lƒgvJëµ™MdBN8ô ÞÂÒlÝ›ÅojéÕ<Îg®ïgo+®sK;9[ïiàÐäu|­e“x7Æš£yðÜ" ²Ó£™FƒuONä¿­òë–wè²zt—cj 4Êî¢|¼ß%¬Cº*ÏñöÝqCÏâ^`3³e¨¥mÚöãqø[š+eÇHž'Œ‡»[þ z®®1Ì.$l;ám;¹)„jNȪ‘•ðE)G«@¯fž-—e9!?u·a®wºvòj-/cègE3Q«´" ÏM¯eÍÌÖ—'8²µÁîYv)~ÃÌè§ŽéÄ0õ y5æ›Gy²Øoà´yeÔHË6-^6»j –ïäæ=DùÒøkQÅñþ¤–„Ð[7± ”7ôðñ¸…âU.¹dhuOób¾É3öh9§Í/Ò¹Ñß1®ð žá8òSÖg šž­ n‚wºð„žÒÄSR-}¤Æ¿kîƒI74p!Ûì*RºšOΖåÃO2Ä»[Ìâa½6ƒÐÞ]G7Ãc§Y]‡Û3ѽøäîÌV5¤„s' ÌúZ…P+ÔXg‰·Á»¢Ž{.' ¦!m‹ÒS%?µesåt)T㦔i“ãN%ÍMÕÁò²ÛD©­Rá ð³b´žÔ59x)¹sã-ÿÓNaG¨Z‹BØuÓÆ\lGÈë!½4£ñ¹UœZ…TR:"M gk¢þgæä©æN×N‘ÝÑ¥jåÓw(²Ç’¡µZ>ÞêW îãö]Oðð…œý¥ 4\NÆc9ãm.-·²xoÿ5ÙÉ Ý¡Ò{£Rgiè<+B–=Vî4OêÊ4¢Íý4J»*?Š>åžúDl€ÄÇf,ŒßÉ©[: xp?ç8Xº‡ c}G©Þ{±öz‰ù%Š 8i¸Ñ¶èrþI3‡Ó‰Ù ¢‹2ϺuTÚMY²íýÛÄ­²È (G±ù†ãOíO©Þ-7´Ói%J€l~ 9ž*5åaª/Ч|Ô^ÎâC6ÖƒB3V%4ý’´Ë4¦:™¢b·ëSâYpV·p3h¶¨è1ÉZI'ÔW”­hVIÑÐ'¢HÉv§qs‰nÜé}<Ë©²i9þäamZ‘çÃêðHÞhÁÆ«Yâ¦_‹BycgÔZ]š"pÀÙå¨6¼|8ØPZ©±h83•.=ÐNŒfI]œÅ$ ™]ØL¬b(ÕâŒAu¹D¦mÒ%ëwío߬”Ò->ï9¾7v.N`üì ¶>°×ÿ4ðN£¿žJx÷A57Åi2öHvbZîõQF¤ˆ¢òl –Uf#[2Ñš™ÚZF"ªŠ”/öw9zäjmÒ5ü¹‘c•9ºq4výÌrª’²SÅYö¨Ì–›ˆekÂc'ÅN×B´g²|ônöü^ÚéTewÖ ™îâU,3ªÎYkf†K%és¼ñ%êk»@Ì=c‡gkÉ t‡ikö›©ð· 3h”š4Þ(Ó˜D!EY.oò—8©˜ûÏúÍø‰-õ™nâE ~¯Ër|À`ó,å“q­u]Íz[¿{¤• œÛèbKR(d"¦÷ ÏN'¦#Q)D¨䢂3{+ˆ§ÚDmi‡†‚V4˜,fÔCšDí’¦:¢àT¯°½<;"-#LÞ²z"ÏÌg)CvמZ~&$G»î½ÐoËfŠHT&{”÷ÄÈf1ëFKZ¯6j ¬l•LZõ xV{®YÜÌ¡i[åi%˦wº‘¤{,ñ[™ ngwÄ ›fÏâÏà_nåõkùTßÚ—ô*g•ñN?ëq-l­ßeË;<‰Ê¬gMÈЂf¾r§ O¥›,1Æ?«`]‰{g‘2Ä¢j«^koõ”WÿV!ú¦úT:–£¸Öm?® ¹Y8ë>a­÷MœØbüžýíoÌá—ªÏböžò]e¨ ®Òä¬eØCl·šl¼D"LK aˆ¤]%ˆ$±-›ý4˜Ö²{ñL%˜ü,]ÎN§€6 >9}ÛÌèѽé)Ì[*F½X[ërðá=ŠbZ¥É[þšè´Wg©Ò5‘šFiàVM¢‰}m4ÑÍÚoéRZž5“É5‘+SÊÙÏnáû 4Ç£ëÇ}\Ü’ËÈʤÕ*»Æƒ K‰cõm;]$šEU«2: KX±UüvI59¤òpOØ€ÆâÐâèr—7úð•-q*žÐK·ïàBÙð ýd~Sð-x62:,)ïøÑX ”9ÇNWOG¢¥“T©ã­&D<–;º)K¨ø¬ì3ie>‰U4Daq³|¯<»[Á©$%XnyK[ÓØc•öU”¶qF¥Àgñ ´©”6TÚýÕær7"å£Ïæv±r·M ºt;jÎ¥ä}hÿMtÈ*Ëþg6— Lv¿qSˆög"¢GòèáÞ ±QIc¶‰ ˆ™Xkÿ?{ïýe×q‰~u; t72‘`s¦(ŠT"):˲åYãç<ÖóزÇ~ï/yóìY~^ö/ϲ4N’%K–(É¢Ì$ A"0 çœ:ßz?œª]»öÞuºA ¾Ýç[XºuªêÔ©³kïýU:ˆ+0=9pÎíäá_`'xš»@€¬VàåƒEp[zMÉÓS'ùA±;ÑË`ɼH/ÜósN½s¯®jÇMp*‘Ý%oÝ«†×‰êiß“‡E9š¬qO,ãŒEäk8Ù1-ñ&u»|…ZHs}ÞWÖ‹ ÉnCQ©DKqÕ§»t©ñ|X´¬V$éÕ_á‡h±¾ z57+Y¼I5+Óå ï[(?¹Y,/­Tg°†&h1Yh«/¸¦ÌPhOÞ©"qü¦¸«ÇÛ4|sT¾…¸Ä‚¥Ô½L¼´}’u“Á˜æRÿE.úõdjpìÉ©‚5$°†›é’kÒó…Í×ÏÄs9–«TIä¥MÚHâñu!%ÿ¸Áå„Ã6ǹy‚lCK¾Ó,?†Ø_áB¥$Ý}óÖÜs—rÔ×}\!2@ú+ý¿0wç¹s°òö[ç-WãZ/*3°;ÄÏq‘úQëLÓ£‹5b°„VKx½ª%7 ‘ÿÙˆ’×<ÊTáZÊJ¤k*w¯/ êîH_´Œa—TaIáØ-«4Ußrœìñ¿ÙRϪDš¥à‚Ä ºaý6Ý(ÅìÐNW‘> ¡»ÄŠt±â@¬{Ïš„µÐUà³ü+í°#w¸O¥é•™}!z°ËëaVNÄÀJVºWÉ #‡Yø|NÝ×Y­i(âµ÷Ùô…N€ÉœHq‚GÃó>ž¹rš”ûè¹è» Ø…ÓT•“ -ð•Ñ”˜l)¹l, Õ±¶e>bä…ërϼð;8öÓ,›÷VÓ¬ðÒ(Fü4‹wáÞ‘õOSçr•Zãøò—¬_©S5ÔOq¹°á‘‡¯[{¹Kí(h?†C:±þ“—@i¨4^rå¡qþ”ý ïxé†õþöo/¹öÚT2›î#8q;Ä…šlŒ?Y4òüœsÀÂÅ‹?òŸÿõÜëˆ;&.ïä>^üsæ7æm0ÓfzÙ^I¸Ï㯜kÒà ¡ÆqEJšç—JF@§š˜_ÕyEdÅ–|üí²/¤ÃQ TYÄÌ% /4˜_`ò¹»Ø³ ^¬¦£\|º:»#O¦fyÖ0L­ÑO€PÇæ>tÓ/ºsçNø€³KðŸW‡†haÐÌìÐ&ã‰]áùEbJYÓ@ÂÖUÕ¾ ~.!üõÚ®ÁU…ùVy¼OZ2xCñ’Pˆ”1­ÝBHïãçc7‰¶ E1MjJ6¯5,ùW»+ ¢Sò]’éKƒx^¯’(¹fÃðΨ‰_MǾ¦¨˜nN°@é™é)Ë’ ëîÿÜ/¿÷â <ÿ¢hu¨÷#~>þ{_Øüõ¯=tÔºm†›>þøüEƒ[þå›úÒu÷Ü3oÁ‚S{÷OZÈ%âÞÏ}öüÉ“;~ø£š4 —/½ëg~f^ÿøèØÎž;üÖ;¥”OüÉVá®®žCïîÜú­û5ÓëšØÍã¿÷…Í_ûgÑÈι[Ÿzbí¦Ûö¿³õï±vÓ¦ýÛÞ~çÛß‹üIl’ ²Ó=¿ïΟúéíÏ>{hëÛTÔ¦Ï<`Ûw¾[9}Uá·>õ$œ{ç;ß%Zè@ 6ÓLà’ ë6}â“=󌎾ûÒ‹‡ßzÀûϽxìýîûì/ž>|äô¾ô¤Y½² 27¯4š/÷Hê!ÒLª~t2LOM+N­GM-«Ý(_ø+rÁ’©’óHWS<Ÿ‹ãG­ˆo-˜ŸÚãñ¬ô,_ÕÉFdàt‹¬\Œ”‡9Ñž‘2ñ E™sw¬ÜÉcDóè@ƒË„îÉhJB?…ïq¥ ©uÓWã `ÕOxE¼LäÝ,yZ÷8†j¾R“•]ûmM˜yÐb’Àˆ°(‹iïDä\ ˆ|ÑGºOEÿª,¹婨)ÔLΜ’9XR®9„.Ð$4°~^&ˆ›ë¾¯éŸY‚0õBQ˜z£ô4Z]B5IÉûÐy…,,ßxýùãÇ–¬YûÊÈŸeênôÅâGþÓPªÄÒë,^üú×þ¥>Ù?õÓÇvïÞùïÏ®¼ýÖÛ>ñ©£Ûw´Ç&Ì”~¢ýïÿãÏ«ðG~ý×N:ð!kÆöÆÈÖ2òÄÎÝÿŸ>ßn·íÜ)/eþ˜pÿ¯|¾=1~èÝwcïf_ÕKC`Ü=v4P>Jì=ˆÈUìŽ}uÝÇ…áËž Øô©'öly}ß+›¯¹å¦ÛžxòØÎããÎ<¼Û;|ðõ}_ @-8õuL k•£Ñsµ"1-»¸ÚÊÙñn½¥Pµª–L«^Q”9h }=.¹™!Yôt_¢©)Ÿà{ä.˜§qf¥Å^Ç^ªb*VGô¯¢sé*Õ;ÏjΗ „ .å]Ýèü<’5U|Óàò¡»À) ä–4FךFh…¥÷ÍÞÏ=9Ý‘?€éŠâ^”RÜ¢Ô:ÚuùMu} 7˜pÖÎ%Ôå:.¼Bö…J·BÝ(ÄmÓ`>%ò/1@T$æB.è\Ú8 0EÜÔ <æ"5Ï4£¢ƒëꛥ ¾(PÿEžÞ«\°¬F3@µ“þ)Prm)¼xÕêƒÛ¶_wß}sßç>ë=z,è?ÿÄþ}oÿÛw,\¾ìŽÏ|fþ¢Eí‰ñ]¯½ºçåתBÖÝ{ß²k×·ºZï¾ôâþÍo¨û×á¾ÏÿÒ¢kVuuw½ÿê+ïÿÇóUäã¿÷…ã{÷ö/YÖ3¿ïƒW_©Êüøý½WþéŸÎ;à_üýþöoLJ†ùÍßz÷…½µuáŠåþÊç_ýÊWÎ:Rº×ýØŽÿØ·ÛõUêØÿæ›oݶéãŸì¼pü¤™rßÛoUÁ5+ûú¼ñf©ÌÁ5«nòÉÞùó'&Úï½øÂÁ7·¸÷—~Ñ·}jäoÞ/\¾ìާŸž?8ù•ÍÕpøº{î]ö³ë[]­wòRÕ ‡vîØ÷ê뛞þL"f|IgxÚ¹}ß«olzú)€yY­ ¯Ô Ó+VœØ· Ùðè#ソÕÕå€Õ7Þä7þõƒkÖT‘ð~å79ào}säüùùóÏþÕ_NŒŽ{ïþµ_;¸më¾Í[Î;º÷å×Þ¶ã¦Ç>>°rå©=ûªÒ¾÷ÞÊ'žˆU ºÅ+ÎX-3a^u7#/ûkÆku¢”ÆbÎ./Œ,@Iß‹‚ðµK(Ê7%—g/¹³ß³¸ IDATŠÕ¯£K¥Ï©ó¹>}^‹Á Ù]ψ\Eá苚á1ä„_*…HxÎ1LäË{jH+ìái¸/dú²M_Nt+ V/Aw+÷–&ó¯í4ˆWEO-•o’.^H©pžÅ´I–_ŸÝEXD°”%ã×àªB8üÚüX ìÍ©9ú‹HöBØ)ɦôl«¯ƒwRRJDµÊ×0:[IÐu—¦3Í3{´ËŸØ[—4oüДOtdϽS3ðöÐòRï¼:çú—.{ãßXÏ݃kWŸÙ0Æã'_úrWo÷£¿ýÛUü­Ÿúä™cG_úÒ—×®¾ÿ³¿xxÇΑÓgŒÿø/ÿrå­7oúÔ§/–õ½ö_pïç>+â/œ:µõ[ß^¼þÚ{~öçJeNŒŽïxöG·|üGwî¸õÓŸÜÿöÛ5”oÍ]w,X´è¦}ì¦}ìý—_9ôÖÖRÊÓ‡­¿ïÞíÏüpÍÝwŽ —(€íßÿaXwϽGwínOùä-ÿøÁ;w=ÿâò¯¿ýɧ*ÖïÃO¾ü¿»z»ý­ß\³êÌþƒ·~úSgŽyéK_\³êþ_ü\jä‘‘ÿÕ_…F~íuû^cÍ’´³å߀‹)½r¶`¸V=óŒœ=K‘»ž{a×s/Üöôg<°í;ß­"O|°{×ó/núÌSð~Ûw¿rNŸ^{×{_Ù ûåCb-bZt¨^\Ž¡„•×ΤJ:\JÖ¼Jy ÐkÒ!}Co=„V¦•žî[òGÍŽ/ÃYéEå'UµËnØ8:<4zîüÙcÇWÜp=±¾ÓGŽ˜?úTÿòågö\¸déÎ? àÌþƒÛü,YÞC;v8¼mÇmŸ~²·áè¹ó…[]ŽïÚàÔž}ιš2lß¹ê–[îûÜ/õÌ›÷î¿?[Sàu÷Þ»kók»^xiÅÍ7ÞñäS§÷ï:yÊLùîsÏÝû Ÿ]ûGwøv{ë÷¿;iU]«µbÆ׾–)®½ç®›ùh>´sǶg~àåÿý÷U̱wßïú©î®y=#c¨Ùû‰‘±ÐÈ-\¼dç³?‚÷gÚþì\¤>‡¶opøí·}ê‰Ô jEèÚ{îºé‘G«×~hçöêî!¼¾ŠÃýˆJƒVl£?ÅŽð“X9ÉÝ Ú±mÕM·ìyùµuwÝsrÿ¾öØDÚäÜö™§îÜ>64²…z„£;=9xU}¹˜Ën›WÓ‘…ÝwÈ:fÞ.Åòt8´™áúÕç1>¡¹ÍÄâæ}ybQOìYj²ýžs9žÀ$~`ÏYm~3]¶‹˜ñcÑù”’­ ô­3…bÎê¹~äMØôÕ+…j__½;6#ÞÙ¥J6C4îÄ _ª”Ýôܵ&ÐÞ!ïý¦¯+˜ù ^¥Dùy\%h¥¬Zv¥WjU¨tr¥N½O.±Åì\â²Òø$@%1OXOØLyÕñ°úÔ’ª×xüK‚è_Hí^¼I‰éé«PíáUû]5oÄ¥A(Íú¶á%sÔ¨» Ë6\wöØQ§\²öZЧ•¯þÝ?VV«5w¸ØòVJ91ïÞv]­Ú N¾=ËôõeîÞ¼ù¡ÏÿÊÎ_(.7æ-è™×·ë…—Ýñî™{îYyóM»^zY§t­ÖÝ?ûó¼úòÞW6/»aÃíOÇ’>ÐBõV?A:#ÝÎeÕ¬Ù¤'W§«Op:ë%4ø ¢²ÄBv}þ·¦ˆž6]LLWÈôЏãÅ=<í:«4‘†àóöây5‹3霾‘Ïkhª¦_\&ˆ—ÃE@»ñ:¥¾”ó=qC}¢æ¹îs©˜,Wî. %n žŽEWUÕ4åÕì%±ãÅŠ®ÅÕºîE^Å_ð'à.€¸UÖìõ>ï†i¢$("£¸£nÑäP‘úª‰Å+W/»vÝã¿÷…uwÜ5¸|EMÊv»ÝÕÓU…×ÜuGßâÚ‚/3Úív«;ÜÝ¡Õ ‡gÞòØãûßy{ÝwöÌŸWÊ;pP¾ÂëX¹¼Õåö¾²Àñ÷v?ybÙÆõ[}˦C;wÖ$˜7ØãClù×o>÷?ÿú¹ÿù×c$ýÝû¶÷F#ëÅN<’S8êþ!Müëâ¥ÌsbŠ"VcìÂùy즨wF¶ç£oG~^Ø46q|Ïîëy¤»wÞÑïVusÎmzê‰þ¥K_ÿêWy. —-æ]nÕ KTmRë¦ÔôÁÆVÎRLª#µq1¦'($×YêY[†“4fäô—ôˆÈÅO¸8}@‹ØÑWýõðÇgFšG9ÝJÈÂac^ÕÓé9Ù<Èëõþö||mBºä2ˆüµW‚:40@㯼K§H»F(¸ŠÓ ÞÉ´Àˆ^ eo´[‹¼Ó|Œ'ÖÕÐí¥+I൪±5œ»Á”Qzùâ=›bå”Ì#ÿ›kÀòdE&2tú‚§0«¤ç,ÎÇ%S>]uQp< ¹3û¥àü™ ºŠ.D3@X^rî.MšÍöå>¥Ð¦žuÔ•DæUry‹ê4—ÝÞµºZ —.}ñË_zö/þòGÿß_´'&–lXWJ|þÔɵwÝ `pÍê[{¼NZ§çOžXsûíVÝqûøèHµPpÃGjuu½ýoß9upÿ­O>QÊ{zÿÁV«uÝCX~ãõƒ+®9²sGuiù ?ùÅ/nxäáp—'»º{VÝq;€Á5«–¯8s虲‚eKú—.Û·ysMÍi¤À5·ÞÔÕÝ•M¿ç´íüÉ¡‘×®¹åcyÏÔ‚éŸoÌ8¤$“Y.ýæX}Î;¶tõ’*Öë[¸ÀçbI_W¯ï{ãÕ7ÝttÏ.Da¾áñÇ–¬YóêWþ©ZÔʱâúëϟ̶Mj JE¸á LaÃ@4Æ_®Ö¡’µ©#7Àå1¼V…ï+Ä Ùä-Úä'yr¨OjI6ŧŇŽ—ª0}Ô”‹*ËÇy «7©5ŸþŠå <¥¬—yR ®8h…'÷I„›ÆC“¶L/¨ž„_%º,T(×Í«^«SšÕ€å2–r‰«žµµð)5ç¬iú˜n¹nZo¥1ÜœˆrÔ«Hï’¹n´ØÒ…¯K÷aÃ|iÕ»“E¥]=>*¡Zö©ÉŠ®µhnËJ¢&z‹In´d£PÚÅC÷Ö¬ /ÏåÉ(£È¢õZI'èâ­(R4­¾×eÁŠ›n9wvèäéêç©C—o¼þ䮽fâm?øáŸùÌ'¾øûíññ÷~òRuÊÈEáš×ò‹_¬ÂÇö|ðæ7¾õøïýŸ]Ý=]Ý]K¯]wÝÝ÷V‘fÞíÿþ£;Ÿ~ú¿ÿ_ÇFGßùáÌ_²hÃ}÷mþ—°íû?xä×cÅÍ7Ýñ®ÎëÛí7¿ûíMŸøäõ><>6ºýÇÏÒ#»®®VW«Z{ `bdìíé^ÅêèjÊ蓟‘H]^–sÖÒM0¿Åå: .•8ÃÙ`àØá½ú+í.ˆ®âYü•ƒ¶¾?W ¹Lú<™pë=E¯Ú *^ߪ›~q àŠGèúë&ÓþN T•]{`<žtbU¤ó“æ!–« ZÃÉÆò¹\VK=)¥–¤R÷Ð,¦øþÌô¦'ZÓÇE­JSŸŒšåælÐ1»V2×'j½S és( ¦ô)PCóDF^7ïOìÚóüßüÍŠ[n¡U[YGˆ÷’¾ `í­›½÷žË{¶6üN|ñË_>%§‹…¾)9éMhð¡àÕOa©…)Òj¾%“‰°‹~gifÇð9izƒ]=,e»øÄx8ÀD©ºbNäºËy¥²ÒÚud‹‰BqчÑê£nàÌ@ÅúÌW§õüԻ͕ƒðë‘×RsV°ô%oÏçi´Ã'ìV‰UNż Ÿ¼éÞü¼!Mÿ_sšÏV!,^{xPž™§æù .Å Lšä³yN”†È÷b6_]âúWI6—?³‘j8þ9õdÓ#ÊSQ@Âòëô:²D`Ù+¡"y úÖæÛhЩÐ4Ì$fâ§&u5%›…‹¢·,LññøñáÑjf8„“Îqaà2Õå«ÿæpLâî ÞºMd¬é8º5hpÉ0]<Ÿ_½XǵÄ“o(öïéƒXÌHñ¥>Î ÷cÔNÏÆS~( ut ‘ÚQQ`f¿Êå|<ÏÓl›Ðc™Ë!z-µ‡¦¢o›6¸ÁUEuš‹pK¾ÊUp`´ÅA¥®i:d“–ÕÑyqÓ©·‹W5÷ê*g†9¼Hh…®}ï’âÎŒ.u$Bü‡ëäq/—L Kªbƒ"\T»V­ø/á”MšÀ[M8˜¼Ê—ïuiðyÙf7áñÞ’o 7^.{–±¦büÖZìšîÜñàœO¬™Ó}&»3ùž÷Ù¿E$§ÿꥂCVŽc%ñ“}>þ µP|,äf‹ “ëS‘x•rÒb4¨…6èEÃù¡l›@F FâPDRg®öŸa¨Yà NÛâÕêà¥Ð££Ò¨zºË5÷-ƒ&q.Œ9‡êÃ+dð"Xã¥^5 7“P* F•4Ý~Æ ¥Üñ~J„kÚ!\rŸ‹™b๜Uo!‡¥;š¥ ¯Â¢ èdÜ›œ¢öj`¿¨s×jI7p‰Ñ{;}(RíÒ Wãîg06èdðìæÑ•¬æîª¼ž¼:–Æñ°KÏghzXxšpÕd¾S„ËÃÓ#ÁºcšõÏÁZKTJ­a̧ñ¬>º £éų™¨åœS>"lbæßdeB˜<­”Ø®¤“ë¦ô%.z2m3Ç6FÒUÞ)j¼Ñ#„n:EƒË„ÐÁøÐ0†>ÌÃ9cjÇÿof‡¶eåÈŸlõ¦¦|!Ò{¹/&àù$ââOx]ŽÜþ¥EI|6Z2º`FQx·Eœ‘èV]E;ÈW¥aH~µDŸ?†™`R–×l!Ø%\”ï¦np1´¹'# |ñz'srÒ´2Ù$¾G‹6ùô]XêYÝŸTBüº:•©<£¨5,QG¤§È©ô©`šeWTÓ©WÎm·â‘´y‚º*ÔK©©´¬Ó4è0œF9Aü›ªq–(&ôx!FXJ¾Â“Š }Üe¢©êÀk¡€Ë…\›!­`PN†Fà\ixõV¿½\7Ê çŸÑã3xôW¤deyQBv5_œ Þ­¬óZù[è§|1gÔ6ÞGªI‰„“`<ñCx,ÝÅ­8©8L¸ÁÕF+ï9.ÿË…b:zÔäðVÍ»w‚†ñÈšá qvª@qS]‚)Û]œN?D07Òtݽ’¦Â•cýÂ1áŽWpïÊô1L J:µœiá«—ðº»üq5 B|uzöä0{D§ÚÀâ´½ÓzÆ#o5¡PM :5ïO¯º¬ yê¿U@6ÊÈçôÄ*q$¿MRJÞjlU¼"ú‹~â£ÆW©5h0K! ˆ˜©3·ðñïìUiÄ¥êŸUBò‘ :R |_•&ßîèØBS MåÑ sÄW}¬QUMc–O¸üaR½ËOÕà*¾Ò®¥Îçoõ*¼=>Ö(A £8m྇k¢ôÈߨ+ò–(yYšg®­Ø÷PeFíIådÒɼ7Á=aÝ*c 5ìÑÌ˳Ï<½\rF}~I0@­+øËóùC›<ÍlKá7#ÿ«å¬AçA hLe6OÐ?±üRPAs3° Š<»¨í¬q‰¤™Ý½T·}Â€Ö ©4hÐùžøü…‹‰Œï³óñMv¾¯öéñuœU<ŸÓóùŠMÏi^<‰7äŠlò:z´ÉÔfüˆÜjWÁÔBæjƒ†nå{ òêôR%~%¼1Ó—6‹Õü äÏiWÏô¢gž;=û i“ˆ7Ç  †ÊÅà¹N¨ 5#+&%‰çvŠuYÙÊO¥.MýhvDýXúÍbaº{&Atm%ƒÂ žÙB¥ô›½X”àÊuhÐaÐÖÏE—H¬ç)ÞÜ×gžé"vRâ¤éļÂ5)¹ i(+Ñw„3‡N4˜õÇ·ˆÏ-ˆ%šS,0e‹ª.©—w…ä<ÛH¸]ü;'{éà&Æâd=j/E~¨]W«,LÅÑ`†Á\á9ƒÀÇè؈§i¥J–Q;Æ|8S'ã DJmPExÆ5å,„©p]þ®\.&sOx€/‡ˆåTª“æiüLlðs11¿éÔeEKžÐª%$ØÉÅ™§«ƒšÎõè^½3¨‡6Û†LÎo§Çq|& f2‘ÊOU©§gúH±Fø‘0"¸)_AêrI²u©2ÒšC¹pó×X´s Ù"g£Y>ýéóK@ù._>­WMô麈Õj\)­öôQcx–×ûL¹ñ'îUƒ‘½úÑSm_uâFeÌH´ oJÿ_9˜ÖMHW‰ªšDŽÛ01$áÔ“óŸ:±‰Í›g3j=‡Ïÿ–ˆ@î9E¹C–ô<òÈ*mÎ}<ŸÓ9[ y-øUÍC5廄|Îä~# ‚|óxMß={P°ñS‰Fu)Û9ÍÙ€ÅòE/Fdh¯Òç©ÐßšÍ{`DNïâ‹5Jñt_ú[ *™†Mbš*g¥Aaà’÷>¦ÔÈyƒ¹„È ø,5g´Pd¶Œ3­ÝØ{„O£ ~V¡"…©Ç»j{ª¿±D6㇠.\ˆG,Ÿ;'Ñ<RÉ!ïð(èV÷‹ïlFFgZìhspuà-ƒ4iœúË/yë9yÉšŠÄ>ï 9!hp…áØ[ÕÌ,¬éTJ°”ùrý¤(“¦¨<ŸÂ|ùÈjDa©é[Â)ó쟖ãáàžj…xÆ£†àAõVýŽu7wLD„µòyùÚ¨Õ èÔ“Ã3¢ ¤wŸŽ…{K:žÇð™½úu›ŒÔ9Š©Ü6M2éÖ´R `iH¶].½¦*4aÄš Ì^¸HŒìÕ›:²ôµ†Ò\~ìJ2ODü€jѦX·™­eš'N*5Ev+-4È”Üàqe¡M#ʺHîU! fZêÅÒk¿:c|Ú³õ,Þ±pÉër*–‘³;N F=ÌŠyUXúF¼¯jÞ×["€ÂÏ ´‰™D'zuž ˜e!R±•ÎçÔÑ#yo¥‡GÍd5e1!òŠ[t‚€ê‡F®•L_rsÍf+½®^¿ NhË9„> eØb5&…5ãë¬8ÇÓ)ù0EêÒ)`'7ƒE›Tê#°€.†gwª›tˆ¶hÐà2B÷3çlÙ·×ùq/"ÀWXVOLëUñžsB¾a/Žydç¸H3†§‰÷Nm)µâà.r/™+ý¹~ÑvºÁ á)þUƒÉÄøU(ó*^Õ40ÇADá¼b¥, ®8œÒ[fšèT»K–ÄÚª˜Å³Ní@ë6ÙM»ó€‹—J¬¡XGCdÅUäÉøÝ‘Kjçh^m‰Lv®5€`ƒo:Áȳ—ª!wBû5˜\²ANáRÅ»ÄÄ¿ªé"/P­ågîÉ‘ŸîÎ}ÉêÎÃò’ÉÕ•„o†¼³ˆ{5h0§p‰Ç´ 8ÙUäÎ“Š¨¦õªžH§´Ä¿ žUG•̳…ájêù±O'O†4`úÞÒ Úúš•ô‹&~¥Û5¸Rp*¶ÂÓ©¿Wšï‰§âµÝ¢Ä5Ž`}F ó4©n„ùꡞæ9õn}кb'´gJ.kw±5¦Ïî æöùX~º#~5¬Á$OH¼è NõÊ.$UßnCõ¸¼k ìRC‡‘À[í¬Ò™4µDƒYk,R'":ŸÈ&îôY,ºÚ‰_r¦‹¼·VxÆÄNUJVµDÞA„vqj@³1g æ<*Îäø1-¦rL‹Î’Í2%€|õfõ_fç#»ËtJd/Y%ZÌi:|wŸËÐÚñÖ×çÿt.áŽ7C§W ¦»Â›¿Å^Q=švÔxW¼KxKD}!%•ÌËw*±/(úˆ¸;/§Á•…©x»Ä^)_‡ dÞUØ_MCba•ŽRH…×ÔÈg2äˆ.–¨ ¥VÏN¤wyÀçÉD!fá3  åñÝé×<>ËÈÂ<½ð¡9-¤EäŽr£\®4—^S…î2 ¿¢Þ¢0?¼®%K”ޝ÷ÿ´#ïT@Ç—JnäùŠƒs„_ˆ‡›mª«Q!‚¸ŸˆGˆ÷.¸è¸€w©Ê“„Xuº™FYòf!‚qºØ!Ò©Ÿ¬dDDXDšÜÌL?i5 7-oã3¥³Uè*§mzѦËj*-øÄ_ ŠÄ§@µ«‡»t¬A´âÜ€ pº”̼WRj²ÁF†Ìqèo¬#Ò?ñ™uºD‘ºñÓ1âãÏd˜ªžL98ÞsãùH·¤í™vŠ‹fzÃ…eõËÒ›A+a‘Ç‹°ÖG ¦&ÁÓÎOÚ×' ©ÞSúðà¶Ê[&|×[U’7}U{–|Ôê*OÖíŒù*Øë¥e™S/É‘‡ß¿—IÑR™´j!mÒ¿Õ_JÓsJ¦¹\ ¯?œVâ"#/­£äÕ¤mÈÛ@w[ä—Jî¯(ybÞƒÉw¹ó &ßä%þÓdwfNÅJQµhÓÅØ)¥ç7¢5]Êr™Ê–„û\C˜)5lРá`XÄ‹-"e1¿µ@š5Ÿ¢ž74šá¯vFµàâÚoÚÂ7þ†œüoJ“‰Ç„v8›˜6Óܪ6ÊP2Ïž©*^c//+êÝáñ,­‚¸<—¦‹—§ÆõôLȽ°g¥jq§Z93¯v"ù¾wƒ« “î ½p1ôž–CÄ”bâ«KÙû'è3?¯¦¾’]zý õüÍT¸“qýÔÊK´DÆÙ-4Ùòã‘(´ŸàéS1— ®&â†:™*Óä<™=Ú<ëEäâdOÓÅjõ&*—MnÝá)½Õ¼ ¤|µ>•Ð4.ïG5%4hÐ!à.«éëN¥ˆl¦N7þõ½æ³&oÌÎç ÛzWïxOa® \üßÑØï³ùhR>˜åSÅ‘¤å@™ ØMŒ¡#ÑÞÂf#W=²Ú > LJb^EþBø{às}Ú4è.‘O7d IDATtéúƦÔ]09ä%Ô<’VÂÍšµjpõPrΫ‹ùÕ´éÎz‡.–Æ7øŽÝr@\>AüÐqWÒË^•dËK5ÕzÙôþêÅÎY%t Ìå‘¢ÍL’V¢v¦–„Ò¼ùEzo½À3>ÿ^‚˜‹Ó "Å”ÔîsV_õ—»Ïf]rð‚Gè‚‹Ë.»g5¶w“Ú AÂ$1ègæ'êl9­Þ$vÇ|Öæi® M· õÛUצ®NcÇñË ºêži†JK¤O5Àg½:¥¢Â˦®ÞjÚF¹+¢Ý⒇ݘÌˇҋrê¥UðêU»YW >—³Ò%såØí½Ê¢¡ëÇ á—„ÿ,Ü;”-+”07B;ƒAC\l~Ï8 !.û¬ñ€ôUêÌîæŠWA.¦KbW’$Öc¦]ÙKFpÆCP8ä?k™½ŒôÖßí!z½H¯5Œf†ü¾ fJÓwú¨‘&Q¸”’m*–( 'yxA¨x¨yŠÏ4Wå(ñ3$KH8%ÖrØp¼³Ú¿CŒ1u¿tëøÄÍ鉹;sGŸÞÅÇ·ùeÆ»i\‡:>S2U‚°Ù/~ˆÏ±¯ùU:…­3rÙyò@òæ1°Ükh£4‹H¦=§ré” .fjÉ$P&ø\ï-&u¼¸*j*:¨€Yc.Ã<»S‚múd(?†ðü\ÖyéyÈ_çú”Vx&öå‚–&’Þtœ¬#„ºd‡|VÅr˜\Àüx.o(1=âó5()ÜÎ`Pˆ?uJÍôqÅ_a•ÄM“›^°†¼>Z/9V¥ÓÓÛà?3}­¾–.ÔBV²Ëþò¥àl0^&VNU',ßÊ'ÃQ|Zzó5Ÿ1„1®#•dxn¦Äj«'Œfƒ 4¤¦ |*Ã0¢4³Çcj|NOlíã"‡rL'ÎÔ9ÕŠv©ƒëµâUFO ¼PS>1½™;µ¤8„a3ͪøkšIáCû¼L°Ä“z2 j!Õ³W õf{oÚùAd}Üéªñv&yuÚ>‰ûi«£k®hʪ¸£éØiÙÓµmxÝ,G66F+3?/÷ “(ð#Áã΢ø›æXn!îÈ{žˆq…¾¨»rg ®6C5M¥-‹³¯^ÙñK‚> CÚC49‡¾{ƒ‹€ m%u¬_þW÷ùØ ؼA µ3 k# fH˜órâs ò{ µ:h™×]IóÆ :z?"ûëÄéšaþ-îߣB4¬ùNƒÏÆb²ÒDÅ€¸\“Ñ<1û—w Ù°ýCQy[ÄôLO’öÒ3Õ›^;wK|®“J&Ö4Ø`y5íhP·oZ{›šß©7*±Õ“Ò\Ÿ~'Z.ló¡­¯™ ªNUѬ:—L!rZöDÉ5”—w‡š” f.ûWA“½l‘‰{ù!Ëîjd€:–]‡3§PÕY¸f¾ ¬:’×¥Ä; ÚîÔ«a‰À® µE%k÷×T^ü’Ï#Em‘«#úÙÉïáŠÃ|©špëNAdÊ%ü¯Ø¤ôbJ°´ûWÅGE§éè[ qÖγ\ôQ>ïÕ¤bµµ•JŽiù°Slê Ù¢*ÌiDú‹w⯠±†³´+‡+}£Ol䳂ˆ}?˜Ïÿ§Ó›ÐǼO{ÿø°µØ<ÂWqŸÛÔ®Úù.ù¾\ÝèŒ"¥éÒð¬4&š %vƒ¼ÕÍ—£|Þ;²éñî‚3ƒÂ«N…Öp~Q?³tQŽ@iºb¢~ŽÝÑåKÖ  Þ«!|ù—”>Ÿ "ø~hV–çggá$Ç/U®ÖˆÉ¡jC‰ Éoj„Ò©ÀåÀý¯¾ñökæÍëß½óø ßÛ `ý÷?vÝÂyÃCco½²Ûæã>ÿ…»ÎŸîîéXÔwòØùgþygßü®ÏþæÝûvX~Í@WOëƒmG_üþ>k7.|àñëúûÆF&vn=´ù¹Ã}jíúë—›º0ºìš…ÏïýÝ;ÎèUí¸éþå÷~týÛ>ÿݽPjŽþ®ëi=½dѼ®Ö„÷/>·yhÔ¸zÙî¡áå==óºZ¯ž>÷òÐ(€µ=­ŸZ2¸°»{´Ý~öÔÙ­Ãc¸y^÷§— v9wpxdýü¾¿8x|Èû?X½lßððÒîž¾®Ö+§Ï½24 à¿­^ö÷GOo{à×,ÿ›C'N·Û-û(1=XdÊrðÀTú# 'ú‰Üy¢Ÿ|ˆÚ«ïìÑ©ëœã!øq©Êq´žNm¡ã¢/h»]Lm!‘µVÚ9pVâ :º«ÓÓzü'¼¢Óë”<Ò<®Slê3g«swy÷ñ(¾ “èÍþ‘rpì°_©ˆŒ…K¬s-á·ä'‘eR˜>º™L;-J*CÐ%h;‚4¦×à²Ü@EVppv™;±¯Ïô© ÃËí2ø²[΋ã>œ†à{Ü+ÖTXäâ)}Aüt„  qôÚ­,µè¾]vGå&w Í@šI`«:õ#hØOa]ªéK ºn¿w퉣žýöŽý»Nn¸yùÚë¶Zî#Ÿ¾¾Ýn¿øƒ÷OŸ¸ðÀÇ®[¼¼·J¿héÂ÷ß9²sëáå+îzxUŒ\ðú‹{O?ó«–¯îðð'7¶Z­×žßsöÌÐ\»lU€y}Ý/þðýÅKæÚsjøÂøM·¯0oT=noO«»«ÕÓÛ%]´Ó§ l¿0ôgÿðä™- ÄgÆÛ}ôÔ×úè’*Ë“‹>ùïŽ={êì§— V‘-êßröŸ<¾mh¤·Eo'Ç&þúè©oŸ8ýh,Lú„^BCù¦Ý…a5œÏß7·„žõS³Ûš«:‘‰¥ž|ƒçb)¦ gëQùñû íã‹$бJ‡/:yˆô0 Ñ\AÐ2ôÜìøxc¸S9“·kƒ>z*fÕX‚t©P‚ýSLÐé9C¾4TO÷•îbqqœ(Ù¦+()¢&ñ*í!ÔšØ`s)íWð‘ÿäcB\µRF¡uQ./“é£FM %ŸQu&€jñˆCö&=˜èVÑi¤¯´ Ãaz£\F'7£‰^U½ÆÕH”kÒYóÓt›uâ¯ô‘9®À½·à´ ®#Žt¸ø—ybÕ„”W—ybR±FîE³«ˆ>õtÓ :[-çá{{Zý½l?þ÷þúþ÷Ï/_Õ×7¿çÝ·¼ûÖÉÍÏïkuµÖn¬ÒŸ>qþ­—ýäûÇÆ&÷U‘vŸÚ±åĶ7ÃaÙ5 ¼ñ“}Ï~ëÝw^=¶}Ëç\9>1±ï½sNŸku·V¬êë›ßó^~£ê‰_ñÈ?üÕæg¿¹Ks-Þ sìô³ç†lï‚ë‰Ó/ïŒ8ààxÀÒ®€E½=/Ÿ°ux¬ ¬ènèïîz{xÔ[‡ÇÆâÔÞðÁ脃hµ„ šô=7°Á5¸pêsiNÈnK‘z–È"ÅÂlN#Å’NæZ9Jؤ%3Z˜ü(¶òâT(å5½àƒKš¢„r‡Ílž :¹Ã&·Ò‰Y;68"?¨@ÙÅî>~ÕÜ%¨&«Œw¤úT özåIÖÞ{Ò0žÑâIèm#B/‰AgAÛPV%_Ê÷/q9mù„‚hP€¦[(¼¥<žÙ£Ä½Bre>2ÀDã»JÝG|¯Ïå/Ü«R~§ëÊI D¥ÊÉ'3¥NdtyÊ©ˆY#Š1œ EJ»ŒÆHTŽÙÀ˜OE¥ÿ|Êð,¯^VaN&hQæÞ™;Ù[­înô¹ËŒs§Çw¼uøú[WÜ÷è€ógG¾õwo·zZî~hÝ^[%ëî_v™˜Ÿùçm#CãU¸=ÑÐohu9‹–οû¡u½}]Õ¸f«•îÈ[¨ÕÓrÀÝ­»ãÁk«˜îîµÜð¹ žËl‡Ì»£A·ƒººQÀñõ¶=ºÐÆ* ´á{]¦[Dá¬jB« „{]§h¸¼w1C].§gtÕÜžGÉt/–k³UááJpiÉeš¤kÊ K¼B®°nÁ_L¢Äô¹¡€Õ`.—:§’5ÒØ Aœ ³ãÄO/°D$o…Ù€¢órˆx½ŒSL6F:1C‡¨©‹+à^<âêM®2²jK§eëò¢b2Ç$T±pÊPfÔ ·siÐÕÕ Z99>ỺÜÖW½ò£ýýƒ=nY|÷Ãëo¾sÙÁ=g¼½ùÀ®'«¼΋Ҏ0¸¤Gßhõ†…wÜ·vÇ›‡¶¿ytÕºÛÀŸ‰«Ÿ‰±¶g7òùúú»†ÎMðŽ,¨ô¢V룋¾täÄáñ¶þ¯5Ë)oóíÇ=<ÐzœöÞ-¸Qœ›¸kþ¼º»¯·‹ B,‡q¾;†‰@¢Q,Aü´¿ÂÉžéy@´©·ç‰x°ËÝ&qIäŠt.-ÇÊ]¢s1ès­ä³Ää…‡,Ùœ¡ÏêI'÷¦¯§¡r‡©‚ûúß«Òç.v÷QðáînØ(AøÉX«GÍ =·^¦”šä¹Œ q4…’t LG5 jÔÈý<‘ÑNR¾*ÄÒ»€œRRW-9ÎNf†ž<:2<<¶ñ–å~í†%í¶?´çìà²ÞŸûÕ;ì>¹k牾½FÇÚÇ­¿qÙØØÄŠÕ+V<óµí£Ã#S¼Qoo€þE}k®XÃRŠÏi4ûéÅ›úçïkt¸÷ìâ¿S£ãw.ì;pú½}½#íöyþ¥“Â4x‰ÄhÆCÔÉ{ƒ¼’û =Pš«7K`ápóð•ätɳ”tZ-æô$ÖyMòá,h#kzb” AƒŽXAæ"—gÇZÀ«›ɳ‹p¹.«$íàòŒ¼†pptÅErH”/- "í«/æôôä]ÍTYj©"—3›˜Hr¥t8¸nÔÍ$N(ˆ©ãèŒòŸË¹h{þ ù»1M„A­J¬O€Üaðe*ä!i#®š®Ô¤}! /Ö´¬dv´o¾Åʧgüª šÎeâu¡QzN ‹™ì)f¼ÇK?øàÞG×mº{õÈðøævŸ82`ëkûo¸íš5×-›Ø·ëÄöÍÇÛmÿâ÷ß¿ÿ±ëî}äºÑáñí[ž<:UÊ`÷Ž3{n=¾fý’å«ú÷}pbŪ°'+¤ ãáF÷=rÝÈðøö-OŵÛíj~’·4×gÚí-ç.üêÊ%£mp$ж*ý¼–ûâê¥-¸çO­ÿÔÙ§—þñÀ‘vû‡'ÏTuØ=:ñ?œªüß æs¾'ðÌés?»tð¿­™?Òö?8yfê­ÑPtßä~NÅ’fÏ]J`íÎå>“žÜE8¨„t.‹c¥…K$Ò4³·ñpÊH Xòµ dOxhZ2g̘Rƒ—ŠzI6÷æE; ò˜¡he×{³•™’OfƒŒ…}‘×QvOŠ"¡qˆ†Ðr)u2g¸™5¼c–Þ–§íh°;“é•”K£q¦)®j®K¢|0S3W<‹8Ezñ‚ìA%0êÀ­YÓÒ׿±¦Èÿ‹™0ââ¯(WR‘E£¦ÀÆ v$ô˜…~ÁZtÍÅ]zÌL®C25ËÃx™bæPk^@&˜fô÷/ðGO~ÀŸ~ï«Ó~¿Ë„’ÒàW¡Ò@Å›ò‡«—}åèÉCãmóÖ¦ ºu^÷ÓËÿ÷ÇJBgò]«Îê/%âÇsÁŒW_ÕÓ Gjj"cQNŸÑoD<гd<½+ùm Z™Á’pmÞK*§Aƒ«azÎ;õ¡‹Òš@­ÀÌÔ3yÌ–h|´Ê¬ÙH7) Α.qâÖ")œ˜Õ–*-D‡õÌ(è…)zÞ5‘ .¦· !6>~nïÐ#Ó+xõöLiÒ ¢}ôð¾î<51È0®òR Q·ª&Uü5韾ªŸ»A'AM‰Ó›" ¹ŸðØx—I#),’Ö‚úØï„k(¦ LïLh£=D‹{EÄ+5I—Ð'B(`©^”Xy`žs°z€qø—N¥x§²ˆ)Ibƒ BSWðì/ŘiR9Öö\~ .‡ÁŽ” ~z–¯àoÑ×´<Ý*½– 탑`—tC)—ëökРã =FÎÊrr•õq±?ŠL{ÞY<ÈIš où_vF;EÅÌ£e¶=TŸj`uq±vIsp+¤Ô‘n.õsm µK-½‚eÕSÄÈ+A·ò”LÇ)ep¡–Ž—d( </X¦ö¡®–r5è0˜´+À’™ .©);NÞ<’ÐñND)©L±d´ZÉ_êkõZx‹&«ö ¬%uõa]ÈŸ<.¤¦”kÄûÿçÀ1î‹ ½äsIä5™Û¯w2ÔèzX½›ÿ-¾iÖIé§Nã\Ö‘é'/Ro„þÊ]àu4'÷œ³{ÜSÐóÉLcΛ'R=©jÐ`†£¤¥ùA)ôðq†$øŸZòý‰·ØÂ§Ïád+?y·M¾¸pÄ…ŸÎ›ñ¡äpÕ¹DE³«ª‚< uåZ‹bt{i†‚\‰šÆ×º‚ò ê9m±ô%‘!‰–>mˆÄ¯$?BüøUe´bVI¼ÿÉo™A—!ÛaK)©Oé:‹§›+º²MäœRZZ¿ÒUñOgñy3k5)Sáfz—ë™znÒ(ôÞp‚i˜+0EX¤¯_`Y% ¹¾üFé[êÿª2*ŽÇÎk©‘"ဉxÓ§p–#6è/™k0[Q?«†ôÔ-˜m&';ÅMzAqÈ€|û_ºW)1÷Ýi!…Cvòó«Îüµ@0šl¡\þ·ž×†6æý” œàœˆˆK¾·rPÀ9Õˆ"e¾ •Û /óÉŸ“¾“`Ñ¥ð•vóD½…ÕµÞìðÜÒxít•éfÂìñ†Ûo]š[Â9 À…¦~H)“ŒÂ)íb±–Ïu›÷)`ìÐó™Ì'…kñ ®K¬Â”湇©/y®¦wË}_j]—'0_”¸;W‚³ éÓÉ´žóï¶ ÍT}qJLÓFÞæ~)eÎÜôˆÏ¥£c:€Ž`‰™RÝŘ‘s>ÙGY}ÖcZÆJZÐìhLƒÎ‡ðâôÉ+ñjÆÁ*VÆ—€Šg>ÓÜDà ç;¿iš\Ó§nÐÌy®*>é.¯LÕ‹/YOëC]…¥DXÁ“:‘»(bJdœ[vžšÉÇáƒDðÄd¯µô7~U °¶Sx=ÜAÕ´‰×\?E &Ü¿N¯REþxì²»™Þ•¸­Wχ\>M j:m : YoÊ#µX%ÑSC_0ü99T¦gü‚O—Ý2-µ¿ªodÖÁç“@·#uÝSÌF—Ùc"AçÈIÒÃ=býg$s™àyï+¦ÆðØàQ ´‹Ï'‚ç‚ÕóÿŒ'r.4‡Ùú* žVH t4LÁ®©šz;u&>¯âYb«G$#ú±!Ñ­åI£Sïrp‰Ú9ç<9ÈzgÖ{ÙØNÐZ¼P—…¹6‡Q9—©*U¹F;`6gjUžñ©ÛÃ1›ì­&NÅÕ¾~?‘ËýÍß(òr /‰d˜¾Ü­†éæaÆÏÃ!säéIñ›—¦H៉æÏ³¢÷¸\!B:vpì¨ #„.îŸö^‰ËëI™ª1¶Ò(šÉZ4åÓC 3ƒKz>û›wWá±±ñC{OÿøßvÙŸ7¸t”:²h!ú¹ñÖÁÇž¾ù'ÿþþ¶×O”ô‰p—K Ì_‹W?!d­PC^ÉÆóž|þFy<¸Âð^z+¬G§«¹'”ƒF¾ÞÛG¯Î ‹’ÑQ.Q„ròS[sÄT€V ZüL8–¸„I iРa²¥9†üÀº”–NR$i ¶-äŠÝ°úkïñ~Î¥ÓÚB!áNž.…c9ƒæðÄÐþB±Ñô¸U™Q9’“5Š'k’—†ï‘{mŠ |ƒ(w´[§i‹ÖØEŽ®0Züq¢¦Èe™Ó_±ŸLy3 b+šÌ©†žÔoÐaHošó®8_§QKç²äN~X‡EâJQÜ/VÈ:±)v"F“›™Ù¿#í;ýæË{í;½îúe}rítÜ‚¼z¡û´Ê¨—ÝY(¯„/®^Öß’:ú‹«— ´E)«H^±?X½l •E\¥ŒÙ½Ê.î~Ù#;.°¬‚³º`¨òÒÐ;ßÃWtGzFûóèSéÕÈ|̧ìÞg5Š >«p•‰¦¢²àë²õL2MËez"â!yiº‘4˜ˆâ-z“'–;ͬHÓ,žþ‚˜š¼QúCZ¶Wõs¦a<Ñ=Zô OâÇZÒ^ßì˜(¸ÜeVÌ,i<åÌ6Ë|Ëd6|¯SƒR<ù!ßA*T·€f‚Îi/’¿º™ùºº-? ¼¶•`Æñ ムÈÛÎ$»Ž%3BÄ ÈÌÌvlP§¤ÉRšòÒÍE_r̬à,zv©röDÔœCæóúkYׂ;ópòØùÍÏðË¿;°tÅBk7.|àñëúûÆF&vn=T]½ÿñÕ7Þ~ͼy=££ã»wá{{ÍÈŸûõMGöŸÙñÖ±ŸÿÕ;_ù]çÏŽ~ô‰¾ü?6¯»¡ÿþÇ®[80odhüíÍÞ~õ€Ïᮠ熻{ºõ8vþ™Þ9:ܾíåw>¸Ö9·÷½ã`m¹éþå÷}týÛ>÷ݽTy¡Fú[n¸íÇÄøE­Vž"«yÌÁ9Î^Ý@«Õ†iûq–½J9ÔöãLÖ¤¾Ü‘gÚÓ5õ:½p¬½8ñã&QÛ‰’¥-usv•œ³¶ÜÄ9:b€1hONîÅ«ìiZ0’F.;.BvnMðDõT2pÈ[¨Aƒ+m÷Pv…/ú°ûêísR凕<üDÊmG¶WVÛå&Rg>d¸Ÿî«’;šAôi%`: .8rH. ÿ+Û§À4B£&Gfi\.?Lß’¯h^ŒmíòâjT·Àz33Ÿ§tG‹Z*M¯à—cNœšÛ}X­&H FÉ4šf²A'A8y™¥ŽåÔ'YñÕ˜¡À|‘g–%êYPÙ ê»B‚…äé!aXf|GïéíZ¼¼wÕµý}ó{N;àáOnô¯=¿gÃMKïxàÚ=ï:?vû½kî?½ó­Ãë®_²áæå{Þ;qòè°Ž¼pv´pÞŠU GÇ&-ßÝÓºpaÔ9|ô‰&Ú~Û×®_|ßG×¢ÞF IDATÚ{öä‘‹–.Üò“½ æÝz×ê»^µù?ÞýðºÑáñv½vÃ’ª†U÷ö´ººZ=½]B±pÜ5Þý‹îžðþ‘þù7-ì;0töäÈGŸ¸šüõìxëø…s® @<ðüùáíã÷ÏìîZÚÝõ­c§wMØ1<úPŒü×c§wMx`[L¹¸»ë_ÞS>Ø? »kiw×7Þ=6á€mãõÏèîZ³ØËœîÈŽuí¶ÑëÔã‰æ#8ˆ‘¡ÆÐ¢Q0ºi¬xç|$‡™¿T%d.Wª²sÜ _!”—'>˜ùèÚœ u2i|ƒÓ —÷Qä£4`1"òRn'6ä»øè†Œ`…HNü\J&êè-CínŠjn¿:äÉÓ0§|NkÊuCÚ!oë¢2¨™ÙƒÅýxbA8À^L£#‚r¶fi‹Ëà ÖÎD=£|æmy™êºb}|d…ž“úŒc;n&ew5 ¸›ÃK¼äÓPòÆòé;òÏjþóK$O¹›)4,ÉŸ–ËšQóT‚™Müöí:±ÿƒSÃÆö¾w®Ýö-÷Cëzûº*ØjáÜéño¾þÖ÷=:àüÙ‘oýÝÛ:òßþîíÓ'‡Öß°lpñØ¡ýg6Þ¸ çÏ ÷Îë0>6`bÔèíipÀxä5Ïüó¶Ñ¡ñ¾…=o{`lBrî<C¤]¢Æ>š<^K§žC?è¤ÔѼڠÁ•÷Ätz ³‰d\øØÖAxØßÞIŠZž$Â&t‚I³t"ºU¿¦fàÅ1{‚³Õ0·–Ìm*Xb쳫¹çô‹ ?sÏO¬ðŒá±TˆK¹’sI}¸ç,¿)5ùÉ##£co^á<ÖnXÂòî\sÏGÖïz÷سßÜåÊ­»åÂÈ– #¾sêüµ½]³ rf@tb@UtÎÐt‡¥d5Sôb7/e§\ž¬Ou1.ÚŒßTHöBlíc5 U÷tgÜ¿G“q­WM+ðæ(5 ò©I`CóÌ4×Ë_Ë”R < X‘źuÕ1‰rRgã2Êçè•*™K1â6éÐ&Ò0iúÎÁúr[¼f®-+PÖ5./Ï¢Y…h¸Fk°÷ä•2f­•1ó¼eX^ÛlænjÞÓ˜p¦QÑ|<àò«¼…šà—Dz‘lN½†Yn@\¾šûvö².ò]âu5#3)+3 ¤Ð¡D–ÝÄ6t¢.Z¬;æ TÏ·{Ǚݷ_³~ɲUýû>8qͪA'Œl}mÿ ·]³æº%ccûvؾùx»í·¾¶ÿƹ׉›O´ýÈÐø„÷í ?t~¤pÞ‘CÞã…gÞ»ÿ±ën»{õÈÐø«Ïï9ud–º˜˜ð[^Ú{çƒkoºkÕîÇ/_HM;6ÖŸhNÔ+cáÐËq`×èÄ,ˆ¼ÚA¹jb{­˜¸37âšq¢(–Ì!÷Ò9`$h¾\ˆçEùüëò>©í¶ }CB¨-÷߸ èpmÑ`¶A°5íûò^æUŒî 5C'Ì?ÌŽfáË)YLÕljé9í»çüÒ£°”‰ûÑd å__ "™Ÿs¦¿ÈãñC¡{k=š­ ¦n005›ñãò•Àà&囃ííÖ¬¿i銵ª‰ÒJÙ.Ϧ½ñRSÖ7qésóet<¤‰ÈGôuX¨ G>œu‹ìj,áC`*¤Î±¸ÚÚß¿À=ù9ú½¯N1—0ùSÏ‹8kŸ æ^ÚÉЮƒnæWꕚǮ@õhŽÉ§îÙgóñó1¥•üÏTc“Ý©,¦àÑÏs3Õ€N†)¤lÐà ÃÔá°x‡ÆÓT¦çÿýÞW«ŸgÏ2K~‹½ –æ¾…äd'PDÓþÞ³4.Ë-–¥g.¯Oë„Ñ:¢D¯§¨G(°?Ç[–î-½9Ž£‡÷¶âðBráâ@K‚é‹HjÙ’¨–è58u©y7ööˆ¡é]Ë€ W ³[21ªfÞ¯¹”8~„Lø<`=(Å 󛊌ñ âYE¯ä ¨‘œÊèò,Ûâ…ºhìÝUE) ˆó h~O/é¤È¦Œïe²Æ?ÒP9nIZh©gÔR˜ã)/™€QºG|f“æ‰4¦þð*Õ#4˜ ¾–0§ÎZÏr‰¿>¿*†ÿb<9èágú^Bêÿ,q¼;›¯ƒãi‰=Žcþjöý¤4QÃd©ü é.½ú[¬WwȬ—°‹È½dÓÖÆVâ ì #ý ¼SÕÏMt#´‘;ÃÓå^Äh˜ ªeµ_íTïÐÉÌx¸ô¿¹>À/ËP|r/uhMã4Ý—m%²*[#[æÕÙ(ˆ“öMX}³äÔŠ0T+šíªUG3Ðóñ_ù]ù£ø«+rsöÌ­zz;DÞ¯õòN Æoî}:¢“æé”N>;—}|/Þα\)c|>(¯´øØ²#hW­ÆŠÍµÑ ³aʤÔp*Þ,Gó@Ÿ'@${£Åx™…Ÿà£‚sš%6ûeŽ=}^/ÒÁ¤LBÊÊIHßw(LôÑ0 TñI󈚲FÔ1Ú(ŠÖ„zsX‰h¡b—‚hMêc`N7áäèFèi(ES>ˆnZðäôø…Iy!¥Ñ`#¾Ã «_4椛HÚ“œ¿-$©óLíúÈ0¹â —¢* !-Œ\Ô„»çgæuJúü)u© ©¹—öŒ‘7£ 5®Á` Û±ãp'çždy¶å6†cÒF¢xÎ¥“ÕÓÒ,‰ÂA,ÎL=;_ºéÙŠ.ÏÒ ©ö–ÐFMÜ‹§Zd¶(Œ³ ¦övª/7ç5É‹™1ƺ¥'úxÁùŽ>1Ü[ÅçîøÚJžFk+ä'¸ èvHÄÁ\‹îu˜Ÿ×cÅOÓÜ £(ˆÄsUpúÀ'ŠI Ø”oÖŽÚÇhPêË Ž›1Þù´jO¹üóœšÆ²A§Á^¾¿ŠÑ ׇ Ï@aÈV"’.Q¾pCf]LÏë[åJŸsHù²ÇÕˆ¬ká,>ZÍŠJÚÏ`—y[?„»Î²B锆¯ä 9ò½ üÈä-‡Zw¥@XáÉ1©ß¦]xSby¤v"9ï(pu…L?öxXÈç2Iþ_–ÅGýŸ—«àŒ©DŒ¬ ª`H†rX´Y$ˆÉ®¬µàŨí§È[T˜¾R÷/)ŠYÔÌ·-‡£Oq/.ô@r¹EdÉd¢ÐÜSñ›—Ô9(=Ò¯—{QJ»à2u”[þT]Ä ÖÚ¡3•µòŽ™S A‘÷wÞZâªfšV›ª “r–BôMîߟ /Ðç`¬½s‰ø)òz'ÛiCFðÒ]âfL½Ñ.|Ò#Î;®i¹ónÍ—bŠa!ÐRïÂiæ†déÒXÏ\Ò)¢ùê ªYøÜ€Ë%q €O[t „F{_Z( :èÁÞÿœ’|-ó¦Ó9‹|ìYø2Åræ„6ø•véìvbG$#áÃŽ œS\z ¬ÃES»¼R«êAäƒ8ZëôúªÎÛ±­8«!ÏVAKðÑ™ä•U»ï\ÌâõzG‘<&:Uél©§'Ê—&÷B!B‘da'펷þj«Dò)Æ/´EkР£Q²5NÇ Y¦01ìãUW:Æ“}€¡DL/²L•øèU+妕¦#Ê‘ÅÆ’ô±pK¬zeU.a+î{@¶±G8p羦¼`YæpC^4Â\_Þ®õ. ö“…ÊÐ}´y+3£«`¬²¾#‘½˜¾T‚˜Ó·sNêP1ð ŒRI«ÖË«v;Vg”¸ txR®í½¾$t4¿uƒ+þnY¤Ø‘"X”(!Û;ã"sh¡BÙÓ’NŸNͬn‘:·g‹<ÓþÀjf2DmåÍ!xþ¨"à•Ђuñ’œC]jÐ`€K¾áæ@›>þWÓaAÌA“˜Œ¶®ÐT^<¥Ã„ÉUyÀº;ýâÕ¤óÞâmay&zýBšîsòþ(7é:Kªb±ê$W¬3/#\BêWÂÿŠA‡Ù‰4×Õè¥Q !·¦‰mìk§A ºžKœiÏÄè¬B̉…º9@«^5NœgºU›8Ýyù˜DÊ¥I½ègÍqeÆ›M›3í.ðmÈDÅ\)pQfï„VKñµ—b \,­òà~’>%-Ëô¾¢y´2³‚§Þ¯7ËðúæÊ@P½¤3òDbŒC[œF&Ì)ˆ Ò (rOÏ„iW‘™ GºÆÇ›W=ÅWÝ“)³ƒêNì­K^&àl­Jàxá±=Äæd±¾],Y,@>J^käMïU=K0û9Åäp–PÑ%î™0Öžé©ò]ÔÍõO=¬1›Q}¯Ïèm¢“i9§Ä¢wêÌhˆE_öÑð#3.G¯?Ï+v ß J¤´†Ð†C(Én‡€“4­ð„ï/žXÄø¼½ë›P4•/HcÓͯ„,äŸÇ$h‚å)q °/æ‰o߉[fÇuÒœy÷EŒD<øÓ±N¾Œ J6Ȍה¯Aƒ¹NÒÄP†°ŠÂkªbÚVBü gºêXÿ¦Ó8èˆNmjœº?¬Û*cè™rÉ1cez,ü§\a5™ˆ•¢ª™´,Y£¡ØçøhP€Õ»ïãð¤ã‰/цkÖ#Ìõ ‡RÈö¤Zƒû‚%½Ð`ÆAïÁÓ›ªWš®ºàÍ™r! áƒpæÚN“ò±Û&ãS¢/ªu‡H§i/DÝE³™¹&;Ø€¦øçØK0+Ö!­8+Qèzi–ùàÂK¦Abz1@E'èYâ°gÏg÷Ñ>•#µ¡*…\IdëLsP»¤€Ô 405³Ù;´«[3Š‹¥â«®ïf`?£çcəΊç÷7­¸³t€7H]o.q:糡gŠÃdÆ>ļ Lj}mûÎ ɳȒcç‘$&[$|™šsêÆÄ„ð冩·ì(ýl0½0=}¾^Š^f)×3DâçY^J@£eüÞi€M3–2ùˆêj…ID^Q›1*õM<©•«PF+DV`o×S åðÁŒýKrå3CáÅ8€’´IUHàÔ+×iDúÿÁDŠ™=JqvÀ±—ä£Rã{ðÄÄšXléÙ¸—c:É#nØc‰:Qr¸ èHq˜fæüŒ€/ÆMû#œÑ‰¢&u‘Åp,ìó€H¬“5˜6ˆ×®±Ü\9d½Þ‚÷Þ…„.Ü Z¢é=+(­ÛL,1g`žªV?íØp)5½I—gK/ÊitFƒiç5<²ƒ!ºŒÐÎR1°º§céY¹Œ“¾ÁPýÍ Kþ1W¨îåúðj²¿ruãW+Ý!kÊÍûOÂ^v¶4]f8K„@²pH%Žo¡KlC) Þ¤ÍMò£¹©‚©8²ÜY®™cÂÇÿñr®¦KÕâ!MÑ`!˜*µ~²t<¦éò9@écšî³>í%Jã¾wP5² zVN¦³˜¾q¹ššÊ å7àÕk侸Öa ¦œò#†kRV/É Ç%ÎË…, ž³ŠfL9]²xï,…Ñ’Hh¦ç-áDžL˜Äšò4¸d˜î­'rêKô³d€(2‘ _é£ÿz£=|ä·Õ|Ï+5(´«¬ØNRÅ'Uj}î3»›SîÍEºâ&‡Õ—PC,ü] ûÇß+€¸x8]B’4”¥…ÿåC°è§pa*ÌóÒ7Òr%b˜ãjŠHËŒílå7û dþZJª–­ÓO~)et*Òw¯zÞŸÖÆWüb†ÂìâƒC¯X ¦/¶ÃêZqw±F°Á%£Æð¸äÓèlÎÕ4C8× ?Ž…vz_º£=mfI¯›½um§MIºòO¯26F§Á´A¨7ÑÝLŠÒ0k¯L1¶B†Æ©þȬ¾cƒÊœûÑïPXÓ07˜6hæ ‘`;fØá+æy²(ë¾)¯«|Ä,¯=GÝBX>íì_v©óø¼N%§N[rÇþWß;¯Š¢ÝzR¹ÅfäæŽßÊ ëç µWž%¨0d ©zQžýö"½&y.Ñýn”×dÄÈ)6„ ø/L8V¼l‹?Êr&u»te Ãkysâ.P—é(ëé. r®¯Ýi·渂Fásçú¯KG2D]ïÂÕð—°+Þ4›úS•-Y Ü#æj”µš›y+1OV¢Ò\!5c4WÜ~/Ëz4ùNÖçLDvñÓq‚.±I%z .&@IœðZ•Ðhe¤=µFÒt\2ui “'ðû9ú«?'»øá\û¼÷\é^RõÓG+&o\•³v ƒ[Ør;­âjœƒREíÀ)oU@¬JT=z>º J¤1òÓ!|l B€ô‹ú+: We”ê%ˆ·~¢(¯êîóÈšñƒz÷@PG]š¸ã%Á^áÙà²B¼<¯¤Ðû_`iœÂŠDþ¹…d¿ ]dådÕ~Ÿÿç \þO@˜R=LÄ…Àl?‘Ì©W!^ˆYÓ9òª{èÎwÏòéz}Ü.;|Å9 LÔ…¢ÒGˆË-é¤ý{|»/b…g€’ØÆ jй ²Æ÷Ø‹çswŽ­ã Pü¤¿^*cÎRP°ïÓ 1:£ ‡ÐJ¦áÈÛÈ-•d-ã4}‚ÏÛ[­ÇÁ©gÏÄ\s£w…è…¢H¦Ïœ“¯¨T‘—ÅÔÓOŸ D™Üg–H—S{s—Ë¡ d¦^c÷j.i—ÀôàÌ\Âsœ‚ð_²¤6¬oZQz=ÚŸ÷!¹^~À÷%ë]||~îèˆ"æ{­ÅrP±¾ÄåDü\õùͤmÀÍ­œ¡BJj¾S‡6¸RpJM»¼o¸üÅæ}šOm‡îï’/”›>Ï*jòWß Á ŸÙc_ ɈœþË!âKq‹[Ê0å=-˜Ô »ƒ6n(¼WíL‰á ÍÇô=kºiᘕ)ÉŸYœ2|(4¬ïò‹ßSóz‹*ŒÔ]ÊÛs@8®!Íd7Ÿ.ˆ"—Ú!«a^AÝÕtLú€N`=N)åÒ¯S.g¥‡kj4Á¤Õn0=oÑ»ƒ¡gCBÏþ!%Ö{eS6„^œÅ¨x\öžãD}9Ý{Tfˆ]8ò|\Ô°IX6a¾Dš ¸jÂgó8ò³Ò‘>~n.íÜciø.>TýÀ4ÑÇ·´ÅÎâÄe5/?xÏÕ¶Œ*8nÞyï†ü¤ž`áhSãRèòJ´YR–^*i±VBßÄz“p4˜ ºu•ɦÀº„A-?!Rüªzu&AÒ?}A>9¡ª©¾É»Ì.`úÓÎj!Ѣܩpª —pÑhXßåCz#.› ‹Ï¸Òñ³œ p—1 kÈî%¶)ÓB¶¸Ëª!ÿ9¦×É ÆUs‰«!§F(“Œ‰2kâëЗ4†Óà’`¾™ü[Îåô ·bÝf(³*’ú£ãAä^’§êÓÝi·^5ãǧû<")d”O×%^1aj´ÁnÈ^ƒ)À•UÝe¿çTž£Ó—DDÈ“!?* ™þ§]|B'8šòò¡ßúh³½YXŸ\F˜&ù i“^t1»Êá ÿDñÚ½çµÐ.¬¾‹¶«\–„·ï³¬¡ ìóÂô®àÒ_ò‹øaÚWÏœ®E¸ü¯é0j6£…ÀåYè/Y»jâu‰H“3M3´ÁäÐ=Ò¤«¢o…yz°6ÖLõâа¾Ë ¶´5NÕÀwq×ýÌÍ IDATH¶ƒDúËÏ\©nãÌ.ÅrÉï‹ÿŸ½o»Ž%Ö•î:©9çáhœ‡pRþ¸ÿðG7ÁBÈië1’ˆµ—v›Ä«šlöà'ùü3€£ÕEÒ-´Q58¬)«à0k ¿Gê¨õS´=?>è ‰<Œ½.›Uͽλ´2Å]޵Áw2ì :‡jŽe¹OPÈ­ç)W´7åøN镺ØÙ³õ:4 žŠÌGÆÑx ¯‚kt6™àÉ+Y„*̲”Xû•·ÀÛÔO(žEUp#ñ\¶CŸL.“lfðôä]Ãož­d|íܵehye!îr÷ º×E†ÉQ\ó(—Ù‡Á)bRU©VÕ8tèiÚX/ ]þ¶×ÏÑÑ(¾S—˃c[£Ãç°½ëI ¾× mbÍ£YÄ Ö«þÝÿdqD°u€ø­ßwkåPð/ÅÄI&Sæ¥DÉãÝünÂÄUTÀ™·Ð‘FM.ÿQÑÕ5†Ù-àx†ë¿GÞÍÕ¹A¡¡ˆr/À+D§SÚÚŽï¦v lñPÁE;ô±Õl‹p+¤"o›ÿ¼µÀ!¦ˆEÿËŠŸß`ÏÌÌgŠ¥‹9s“æi÷’¥)´ÊÃE^ebB¼^üZÄìU9Bòk/J¹äÇj©Qõ8Ú„ŽîÇŽñÿúÿóCëû“¤Pðg&b†ùh&ì¡éøü‚]9‡¢ß™§˜ÓYîü\a˜!Ü+6@¥7ªTÛTñC¯I^­%¶)«týˆº3QÜæç𔉬l¹Ç`¤fp[Î…ñ˜NÁMf +ER†aþ’ƒ]™%ŒqÕ°MS:Qí½ÛañN³¶ü°¿‘ڨ陟4a”è"%­ %E7Á*Æ&é¯7-+1Âp˜=éˆ> 9ß?0g‡çäÀÁ3ØiiV L²Ý&zȹÏu5ªÓ¬›ÓèX—ÜëÁ0:ò…áÆÞ›(‡ÅƒVy|1-ÿ6Œy­g?¯g†=O+ÉÂ, ÈD´ØînóËé‰ÔüD®-p4˽ÃÓ "°¿ W¤ç÷–ÐÙm)ÐÇ -ä;ØïÐGSB5–×­¹Ü”g¢ÈËx ÖB,D;*+KH™ÀÒc¦’¹/Ð ×èëy…=ägõ"¢¢Ç+§€N¿‰¸G¨°N(ª0¨Z¨)ÿeŒþQäy((Á».¥\˜%/íÂjõê5çy‡ybñÖ´»ÜR™}èò2鸷}m¡LT¹ÁÌ("z·‘« ý@òÚuL7è¥#­¼±/®±]¥m³¦ƒúž v6Uš}•€Ê¦ÍÆWЯüÎp%æKÉ×ö°Ù6ï늙H¯ùD¨hçÕŸÄ»…ç)R‹¼à¢ ²õµšHù¦HwãDÕ)úTU55—Þë3㔪qn¹ñòÚÀYmA&].îóX†ö‡ú#7oÏ7þÂTwÖ‚¨qÓ¯Žd½…ØÝ)tx8!¬ÒÅ4ç¯#X¾ÎGp+ÈC> Ïw3juƒ%ü˜EæGÿ’ dÕ¾`NüY*1vq^Š'ÊÔ9&ò`!·6Qw¥¿4¤PfKØyèÖ°·V1ž"ÞØÖ‘kJþûäè WçØá/‰Þ2Cýùäȱøy„K˜×D¤i¼iÈW5µã¾s,ê{š(°Âwb”¿å,˜§4¼s±NÚp+BCg·Ìì2ëܨUúLElõ#)€šxdÀm­[Ýýyê&uŠÏK‘. ƒóëynð±õ\¥¿Ïn±ÌTk‹±Ðçyj˨ßÌS=7Daý»g8t¨¡6b40䌔è„T£dÉf1"$è…~7¡àÈvÿP¾ãgé‚a›S…ÔÄ™‚C£+„Y‘×Vr0a4 æ¤Ð²ƒnêÖУR?C)‹JHÌ¥• zôEz˪uÌéº*°o×)À¤;8Yîþd,²"€Õ ëx½k («úW5cÊcT;‚pú€#‰tG)ä"¶Ï!VÊõf:¨ï9BkÒê-ôåKªdnbXø»ÔL»:qŸ¶ÞF±Íþ4BƒBêÒºë‰.\xWu´EÿT)Ç?ÖTj ü!ºKagxÚÔž uVu,{1Ûhcçõ7?З‰ºyœžÄøÈí¡Ï$ënÂM¸S_Š£µ2ÜØI5H%ˆ…ŠùÇWÈWãÚàˆã2s`+ÈLBP›•ðÐõA/EGœ]teÓƒÌ5À™G\ê*¤×Ø1K«{ô:`^ÛŒÅ-ërBÛpÙ¹Ô N½\Ï· Ô¦0¶ˆ:Xj1 9Ì„C¿ †Aÿ™Ì:…º:¯Q§¼xää¡|¼<Ñð¸ 6vWq]¢®”ù&’}3Ó\>‚¼††>Ú €Á[È1ŠOß4*ÍlæM…˜Ò.JàÏ]ÌúYÔšv²ýVó©ÒÚÚIj³Zf|‘ùÐ/%0²´ÉêIs!§Û\ËcZ`Kføýùu·9¿ã”[Ì@yïâdfå ûáŠ@ŠìÆõ:ôe¤"G iõŒÞ‹[­¡!:i'sÚÄc‘`)õϹ«Üj*Û„ôZö¬¶ãA©úcXX÷áA ¡'er»˜RCÏLoPBmñÖÙ*úX9duïãnе—`„á…KÏ´+?Š(LÚÏ"Š!qiC#¼û—H»Ûj‡æÇÁs¹KØ9jÕšŒRê{ŽZãÂfp„Œ÷/Äx1/f@ ïïÍ:´¶Ší]²Z៼24·•¶žâ#heNC†0ó+#-üSŸƒ–O”-:~ ý÷ÿ¿ïfáwÐ=ÒMÒIĘp ‚<ål~™ÝÆmMÌôüP;.ôÍ<«¶tžeúvRŒD˜ŠvKRÁva6=抇\QŽå 1ïÅgÇúêM»\©«‚÷¯ZvE]T]Ägw8†olçE5mQV‹ZGmµÈ3ýÍÚVñ±¶ ½ÈÅ=4ª!5e–§U¬âðŸF«ùk {ou¬5Û¦•?F­Ðª‰Àl4À-ʶÅT¨˜"}˜3?;<ßB+¼B@Úc]21ª|8ܵáŒÐ¹X]4•CYcD˜G«X±XrXú~ZA¾¬{/¹YǸu2ÑAÄL·Z*¤ž†º‡~"Á3ÔMÕ#3ܱI߃Úî5@ϺNJ߽isTîvïí,r>vx^õu¾Õ‚SÙC‡þ•œpè+|Ö¡A¢ú>›g©ºÖw{€ôã_ÔüN.à2ùYðìZ¹ÕÚð8:Ó¥Ûáù %/bš\Ö»^PLt7¸òd»ÃudKÐ7*.@×GS/$…šÔMÅm­¤ £G§[pCY6È¿F?Êý·Ãd] „v‘Œ äSàì?l>œTòó'VRÇBø¢ ëJSÞ}Ô÷vBÔFÿîô‡}p‚I÷†õ‘9ä*÷ˆrÕ³þs¸v«'½³„|ZàÖ„\,ÉôÆ(î2jÔQó«ákÝ—ò®•ÈwÈÌ ð3”à˜‰f©;´åRSÊÝêéÑœÝbã‚„0aåõg À8ùG V×tèÐ×˵ßPjb¶áñç,’îÍ JqGx•\z{ehÊJ|%œëôÍÕI³öàTÙÏi[—ÒÜRœU¢;± 4!:ºÊi~2Ù8˜òíØœË_µLØVe¦øx¶m[½Ì}¹hûjëzaÒH'ƪ:ÐQ©•˜ºùíÔjç&ÀÄq]yZœ~ú³uãšùŸè ¾/ -¾ ÅÜÆIq‚É®†éÅà *BYð*K lÓþ0G”›Qî÷ž<@½¬jþTÿf5§uØÒêO—"‡1MhÄ„\¹®/ÂÀk—&­×ÁÛz©šðkËJð O\ T®Ñ™\:ô©ÔùV!Œ¤ó”ü›p}åÖ”ßñ›h­: ‡u<¬Ùmf^žR3œº; ³Ÿ$R\«×-ÀS”£c]~ÊIÐŽH}25­¡ƒÇÑFÚÒû/t5¢-ö$^\®_Þ8¶:o©át®†û¢ù‹Èåz% môJ¨é.¥BÔ¤–•‚·<Ô÷©¤no×.ÁµïºF¢ÓŽzhT·}æÅtv‰ïä#K©u©ž…ž0™äÕë¨ã¥¾Eý òØ©©ù§÷oèÑKG¥ª0ÃÃþ 9<â…Z·iç§²ŒÞmȰI»YXõyå¶U#énÈ-ë.B.ˆñC‡zR÷¸—™¢ Wð õŽW¾ë G¹`Aú”_VžK‚^UóС/&ÕÏßZ[ƒÉ ƒÆ\Ô4F[ã•¿û_˜YÝöye‡ÓA±¶ÀCe* aSï¶ùWÎU;½¶GÜi,NךY[QlchFUÎ[‡L¡°›97ˆ¼c³{XÚvKcõ¶9ˆÉuÔA¤i ^¢ Pu°—îúgP;Zû ±ÕÓüIµ)ÀÓ Áz6-êŒÙ‡O×A}_OQíÞà‰^Û£ý™ˆ£û0CT!ãW ­TŽí:8;µ+‹>¥'Ìð¨êuØú@ ôlåÕ³QÁƒý½ÆDYõ?ÚŠwéK ê®7³f:6&äÓíY°Y ¼òÈõ¡CŸM«Goè(’Ws½‰ÈèÅ\&µ=Á°§ƒÊc•Ï >Éf¹+¦¶L¸„bužÊ8¹¬Ve½û‡ùÛ"J!c†ÿ²#:{³ºŒ÷ÊÆP„_‚ÙÔ€€†Ãc¬Ìe°iÔc1´/Fí4˜L§BÁ63 äßÃ{IQ…ÖA L²©Ž˜ˆcÞÕP´…Žª°Ú´føø;¨ï»Mÿøwëú˜fÄcí5¦Ðz ~3´ €L’Ìy~âIDÀ»ð“”`ï%ÖÕ³=7MQS¨ÙZRg®Ý ºÓu¿Õq,´óS¯µ«“š ùØCÖÙFS‡}mŒj€ám‘[kç5z"舡>ùB'•É€( üî›é8s¯!l:$ØAL!°ñu¬VBqþ*@ iźü^ëÁÊ zAuZåA['þuMD]´ÏÑÍ1$íâžüéÝàazê¿ µ0Ååg;Ð/Ü­o!²4^ ÅŽ$¦UI«e­æ±NLC&ʺ»{ÀþñtPß·STÑ4Ë·}Ú…¸¼¾H÷yêÑY3V…K…†Xßý+e;éµ)ö‘°ÔÍbäu®¦úÙê+Ùí6’ âêŸ`çÐ! 6¨´­áò}†!Ë´G¼ä5‚:]Äk¿¸ç“J˜àЧRkW)¤"CM˜à­¹Fõisà2îfésQ×ýò¯—š0bÓÀEŸÔã–ÔMµ9uÀÔN©ÛD[¼@Ѧ‰½RÔhmâŽ@ÌM?9ýÊ&%²‰îÂõW²ƒÚ«p§Ókÿ|QüPgiL¤TM‘„âåÂ:½p‘ª¥ ÆÈbØ×ÏäùJû‹‰ÈµÕw³œœùÁ™iİB*â6]áÊV§ŽGpáq3P~‹ˆN½ RLMŠ„Õ\e>tèY‚÷W£~áï"Âlí œ„åø À‘Üb?}Á¯ýª;½ØžùyèÐÇ=hÓtÍCðlS‰°…º÷öaßpxÈCÀ§¾‡>omY#Þ•#—<]'—e]ðê]«ýC E™µõ–áv8†¼mW©NNÆš½eŸRtð¨”Ë]¬êe¬àCFÚ½b}e¢)oeE3g²R*޶VRµFjä°éVã>—ê{)ZûÅ{f%êÄ ”^¤²øÚ^©Œ8--N$3C %Kÿ?¨ïw‘>•À€Ïëûs!§º—Âü¸©"F=ÁÐ}þ¾v¤¹ûÂæëF72‘+FÊ}[Wùp‰Q}sV›•·ÞúÅTðÐÏ#Dçu÷¨¢.º]Ø€v´$˜ÏMêI-©Lõ­×ÔéæO'Èç³Xz¯#<ðïгD¸PÈ7´èŽä2·abTMžp0FíÅKJ?a­ôr:.ݲ:BÕ¾jx‹ÑMEÖapVgð )ƒ&£Oý£[Ä…ŽÇ7ÑJxZÞ“eÌæ/*_O(¨ä¶ÈhÁ•# ÏV´x;i”è,ù3Û+E îõýv" D»4éi\Ùÿ÷âZ⵨y0s\‘GJÀbÅÜö©V¢Ugf›0˜l¡L«¡¨Ù­;thO+)®ZÖ¨ÇòvZs¼ž‡¯ÐúàT–°¢ a¶Yî3|Á¯ À ò…jFóés£C‡zÂÐÅËýC‚ðäG ø$(y&B$fÚPñ[‰`ýtI±zK} Ž+Á^…_&­[„_¢ÔdëqG{öüÔÆúî7Mž‹ št½ÅåÖ]¿˜~©‡jåï®d•h#1Û°’vrZ64Û—SkmÍì ¾ßL(ÿ×O:ô%`;K%Q¯[\¾':„½÷ϱN‘÷|”-§:ë -FΫBäýlñóСwS*Æ;†þ»{uà¸ñÈc%ùnLÑáõýbÒ§$fBánO³ÿh#~Ø[Ès@ìIÇR8(Y`æ±>R|ØüîÖ »G@è;Lôï5´ðÐ  %­ú;¥>?¹ËNõrÄ~™â°)—þb¼€W?ö`ºÙyÅ–UAŠÏÉÕièFÙ2‘4Oš¨æ¡_H-̳NÈôÑÛ*.Óô¬S#æ–|4£‘´× +N~ަt[ '·¶2«lÈC­6#Ë{ušzî„™iR_Ư«`+hc’°/Eí8áÝ'Ÿá¸HoÈ_zä@fc_Vä§“žüÖ³x]P˜ïç Ï_KQŵødXAˇø3)í5ŠTw¼&.ñh« í×Ìs>ó¨Š!©=#[˜h9ŽC‡ž$r/é(ƒ‰báã”;ƒH}I±\‘Ux¼‘'¸àG`áÛë³QM m¬–Œoz¶ò.zæUí¨Ý! š¬b$@-£Ú¬ªƒ×RÞÙëDP[¡çXFÛ˜@3è4zÍãu–jq‰˜ÃÖ1‡0e ÖZtE)_E+ÜÜvQ*àÈ i §$öàPk£¿„ Éä`ë*í-òü Y”ó4d]$šX;ÿýç X<ô=Ô[RÀþº<±YúËãV­ÁJÝ%tqý½ô`\$Ø›/ûÕš£¾(è%ôQ.hÙ|ÔíOl IDAT¼X(â¡C+"‰ÒÐÆ*Òg)³lÚzkV<àý¤cØì¸¯\_áËç!w\j4ÿ/e6ÅDx> ÃiOLôo‡±¡£…¿œ43QЧ孕NµA©!ÐVÿRýʳýEÍ!! U/jõçJ£i€Gæp³tëy+ݹ¤5Òÿ¯¿k4cü0‹ó^ßï&Uœ Q BË Ty}-ŠXÑ;vù]>ù ¼˜4AÔé˜_¿[)¹ÐWZ‹C‡þ‘ÈIëã;uð33~r`?8vÅÊMxJBGnÂçà,¢+}F?ÁzÚ?æD~±OêÕ¨¯”óDÍìRäoG׿Ž.D èÁ@’f#9³.¤V€¢òׂ˜zŽãjA`;Bš1Š{zÜLŸ™>ß"ÃwbŒ¶Új±×—I¦‰Ô‘àÇ ÿ@¤¯ä}¢ê½^‘¬àtáš\·†­m ¡ãÛH],2Š:F+2×sa<²åNi™p³s†çï$²‰½HÃá>ØoVâ%3,aØmƒÂÖ3žûÙ’#¯ëzô½2³C{UV¤Mx{èГD†_]…Œô¨ž½á{²³~üœ‰Yѵy¦KiDTêZõ‹?9XýÉé3}mÃ5ëRöuR±Ð‰®é\–½{fÀaüBÑ(Ë[QÍE^7,µ‘Ó|[zHiG]úˆ}/¨–oïäÜåb<ÉšÚ7fl;.ض~5µhqpp£üŸ å9RŸ¬ìáXVÄjÙ“/ҵ¶•<ËÜóÙ¦öŒ—ûàP ©+„Fö4)DÆûHùX£œN1þz¾Ú7báë›ì1ë°|µ¡x# µ°¨¦Ç‹zixŠOçZPž½Ï»Ä\<'©ÕÔ÷»ˆl†pÝ`Þfó‰šUp˜Àn†šw«mænÎ;€Å­žWf<Äbîm»‚aË¿¶µ'<ôVêŵsÖ™QKëœòy=›˜/˜b¨Ø<®3×´Óâ»›E®æÊxaöf1_ƒA7ºÆ®D1¬Õüäw0˜Q_kµHÞZ¡B‡~i˜¯BkµÒ"Ztbäµ~[HðêÑÌ#‚o'TaÀvàÕ˜€€8¤DÔúÑŒ‚ûÇçÔ-d¢¶g ×G5«ÝFÉoÃñöúЖ¢ Uˆ¢ÛâBM™.º¶…åÛX²÷º^å#žÜÇâfðî`HÝlš».|¾:„ñ„UÝ:tèyÒ@ó¾v|af™Ü°Ëfùr ;]ö]Žºpqûþ;ô"æVñ‘O°›gdeUÿjà@oÑHX§Iê«¶Qq û1ÿÃ'6‡þ‰V&q5ÁŠÇÚ:iF R´TŠ Á‚MAlô$c%OYœBm“Ö}4µÑ3Bë&°Š@uP|ëÆÖ 6ºgN-[˜ÿ`¡ tk (çjRW(äÐGš «×ûRDd]Ò[ÑR@hÞs›6sØ­y¥ÛêFFèÀØ~)޹š>_©ý>¨ïg‘JÛ ÜgF†ôh;¬ÝñÛÒØòÓ ãVX½ÁP‚:ær¬I‡Ô?—»Nêõ¡C)í&þ³¼îv7<}ÎÓR,ÀnòrK;nëê)øq£;tgdÚ,:€ÅÚ½ô£_ ^š±ËX¡8òLØ6Fïm»Qó£úâðÝýjƒkš*M·:»!95ƒ6Jé8ˆÖ‚²%“^bþªTy½eÒǼ{€ß'…¦dˆÆ­r>[}ä¶ù›O¢mlnÇgÓù’-XCYBôNî>€TžU&ÍXÈpúLŠzM¦…DWÅdÿl”²©©ëÄÂéûñ–ùæzèi`kŒï™’m`·¯Ñõƒú~.ÅŒRgZ°aÅD|$¦§……<¨ó‘íºÈØvzeY,ða}Èä“Ú=Áã¡7ÑÊ›¶3_”Áý —GذÍÕ;† a6w‡4\NR[”w¼Äú×½üßjx“µQ Ý…ÂU@>’P,}+„Q³¨æ›(Ä2y•“•Ó3%¯3I.O/.71Þ™PîʬV®T[ ÚÏh$ßñÚÅѹÿ<3B‡¾”ÐlDµ’såhcÚÀ™)™a±oóΩaé0»>BXÄrî¹; j xðæùsÀ<=u…äÓD)zžÚX™°ÍlŠ•€ë^ôÃ|  ½ÝóH\B_ s6ˆ5kmÃ#¸W³¿ Œ[jU*ë!Gáµ÷¬«“n!þ¥ŸGe?€pÜI˜B&Õºlšn""¬&Ño|*¨l“ˆX'O&9©TH†U£‡¾ö˜]fCƒ“¤4ô¦ =†¾Óã6ÜwYo¤>hçD;³Qç0‰{÷0qJ¨³€³Ì+ùZ}éT¬Rö椕’C£Ÿn>ž';ܸßÎ Ü䉖pi 8ˆ¬d#Oõ½2ÉÌ¡…Z:½ ¢JïÕ…‰„|6 ¦\ùéKën°–—ñCíVEYݶ†,‡mí "¤ b଻`-6Ÿ®4UŒF/šX1-ûýÛ9©on#œABwzAÓ!ìè3±nëVu\¨©'ê˜ðâ3ÿDð6Ñ¡Š=^Pl¢×¤>*OsîM™èbK|¼Þã5±ÀuÌ<h°ÅGbQˆA ³]äô“Ì/ë:° ƒ)Z&°WþbôŒÔ÷2ä*Q—ÍZtù<¨Ãï+ªë{wʵý¾*V _†´>ž8DäEŒ wõ•áUðHAÀ3Áì¡C&ÁnqÔàÖmØ×|æÆ=FPá‹S'eY‘a°û÷{)~ÿ-/_Ç̃o§ÌÞ`fJ·…¢±ç´Íºœ”Y+\å_Ý=ô˜¼HÈ ló* TÊåVÛŠ^X'4V%@ñ¤/2¯ìy ê´ šßº.o˜?ôº´Âîå½>ÈiüšÇ#~.æ¥ ÑÐåļ;ß$ÔÄq¥f%O^ËzŽ–9ôÚD†g&ˆdᮓŽáƒ/WEáU^]îÚŒ˜›[B>y|qÞëû"?æ’bã³ íð ½6@‰Gª]£ ÊÑýnS\›9¯üóM%w뚯CëÇ'Çà€Ïñ}jŠFSÆþRLzèІPrZ*ãO ™:4Žî¼ \ M (X6Ê›ô É!âHõ˜:&Ìˬ7ht À/ØB‚ÝÛ‹®¼qÖú>‡à &^”.ºõÕ}…ãâvM/iõj²bEºö¹ºpw‚ºÊ}©o"Àë½\¬<`á`ã(åС‹Zy@9É(³•«;ÏÌ×½Ô¦MÍÁ-XÔèµ=3L)”grÖÃÇoÎà`Päµ<ý ÎiTÀ=†Ì¨däbh<µ‚”ûQ8ôfzÇð­p6a3«´ï&>ºë×j½ß¡C=…HX€à"ù›¶0?á)™£¦Ú0mÁˆ`¹æ»Š<Ç“ÂD†cA2bFl£½ˆû\þ<¿Ñð–ZùgbÃC?VAÔLïåÏÕë&ÕP=ØXÄ+fæõ}Åz¢Mž—FM1Áo„Ðp{Ãj(å×l¸xeËÁ ÝF†ñœì˜Ý[@¯M1ðáÈUVü².Mâƒcì%=#ŠZJŒ›oÕ ä•gM‹A‚& Ÿ5R™‰øiõ«¬OîÈÙ¸NFw½Ç'$„ñ(ñŠDæf ÛøŸÞÑÔ!¯ƒKbhu¾7€Jˆžƒ´ÒÙ(f&= "TO›~èг”HMš›>OÊ­sÅû]<ÀîÏÚFKóM«Eì”0oÖƒ½4=´ç˜>^ÏŸ}¿ýª0/È ãEܰ°”õYC ¡š8ä ¾ u«ˆËêtéEñ®êwü¹"ÊÙ^_Ø,ëìÆm«Àâ~w/?Ú>ðg"Ã{Á0"ÿNØØõ8d¢ÑCôñÔ[ MÈ25HäÛÔ‰ŠŽ—˜#þ(^¶qÀDwÃGê&¾…K^1­o„Ó­Íèú"n÷:j¼Ž¦þ+­,Øb2¢*‚"4ü»`õV€Dý—yÚ°Ã@dúW"ÉFj0¥Û™p™íÎÚ£º=J…›´Òù{²á3ã\Z¼Ðá…ÿ&„@|†ìC¹<ˆîë¿¿L{1 ²ÆV-9Ý:¨ïŸIc0 ®èiyËÖØ­^À£å‚ë/28O¥}juïÆÄ£YN»Ògx8áìÁX蛫‚£äÕ'¿_ ŠB0vqÂ:üARÌÑZ:rôdÑbà)go£:<¢µÜÒ¹‚•ª¡¨ªm<Î %œ÷²½ ÊBëPìmÀËÏ ¶Ê1±‹õhæ¶Ú½];ôj§D!¸É µþ¥„<½IUÄ€¶•A.¹©è.öÏ'z©mmÞm~fhéøšLY ³ÊK 0/wZ%|3ð%à ´OÏE·ÆÁýy8G‰æ}d¨ÕáhM7&üøÃ¨9f´Æ6.Úé ¾#ò­I²:ü&Þr…°ÑQ.+X¶ùÛwùÆv²°˜h åËM‹¼ˆñ²_ŒŸ³àØöiÓ* \”@d3x‡þµ6«•g¨DùàtÚò¤’+§¹ xQüËˣ̂xê2Åó^SZnZCƒ¡;Åí]dSR¨à¡£•æ|Ô ¢ ?£ªmµCSrÑq•¥\®ú0jíS{aUO¨ ‰MÍ‹Œtðú}xT—uáËø¾Ÿ>°É^ N"ÁŒ¿b”ðÅÓñåÀ:Tê8|«ÄG_!­ÜD#òç Ï÷“‹g¦»V](–Ú_Û ¹Ìlš¤Rùø¹z÷/_ä#d¨ p} ©iÝØÅùõE"IpV2kó ðf=rô 6ª|ºÔŒ=Œyâ]øn#dº–ø®p ßôóüKK‚WzÌ‚í'£Q‡L­ÅÊòwðê¤!“uŽÿº>k}ï%õŠVUê6ÄNƒ±Ü‰¶&—òt¡oµ“7|âA,€÷nëc·iËM›xËØ Ô„¯±ßïü‰ GM¼~LË!¡ÖŸ6y._—ŠS Ân·éXÀĘÒç5-+yåR>ógþåjŸQÅ+¢Ž¡©jÃ"™šáÐû‰ ¶U‰³:[XJ±¢Ë-¼«@fphE/”a•uh‡}¥u°{¸‹”AËîAÊ¡$ôƒúÞK _ˆÐ¾‰ªk&ö‚íè­Ý­^ð[-f‘ë u«gùxú8Ç%?ÀЬ4Ú½<èsU­2¶d½íD—›Èí®Ôócz/Š|Þ·Çø—<`«˜$ ­ÏR#­Ù—îÍpa¥· ´ dƶ†˜&ï‹EZØz4òÔV$ù¾½XHqi¥¤å %´cC¤çС/"µa^͘Wé*î-*k%X!e,Ò j%Ù–*Þ@æP§#ÇÜý†ܨܽYo #É‚óF ‹ã(‡‘E¹TÖߦ=¬Õ”ú :¨ï]´Bw÷ámæ!Eh¼½ÏÕ¿ö}¿Ì¶¢{Éno1cܺjŽñ-üØúÒtóF™š;ÎÇÅ4¾6ÇüVj¡ŒuŽ…Ðm}h¦Äx,[åÎGøàý %5œ±…ò­øFvÑßõzí …3Ø*¥ ß6k›L¸dVnZø ÐVszŠ4D²-HÓQn/¨Ø¶ÑSTa²N TÑ4ÉÓ‘†C_Gd“lüÜà¯z²zR¢š©(†‚ DApI›ôãë<—{²ñ*KÇàtE‘¹Ã3мîãj¢ßõŒ7xn~VnÛÁ¿ÉºeÌ¿²pT3ãX©M/°”7%z–Îi.o$ QÑ·¦$µÂIÊØÖø]׫ÃZò4es÷‚™7‰Ç¡R‘ŸYÇë9¤Œi“ò€Œ°ùµ™ðFÕ'‘ÖzÕûXüV"ñ'ï5‘œŒbaðÁj ZAµ¶më˜Cn¼ 4‡Òò–kÙhRÛQ†•;\©¡znò÷«víÈE†m1Ž=¶e­N•‚´ÿq6[¤,}Kå¹:tèKiÉ6>‰/&Rå.êd¢u­ÖÌXÄžSønÐä »è÷³L¨Òk/߀~“6ã³ú€š`Á1:Ã< i]îª \!“Ìûá;6éÃè ¾ç(›¢@+’HrNÁ"eÛ$ê"Õ™H/îŒ ç.¸Ž—UÅ猈ÏOˆæ'×c9Ÿw b[8ºsØ‘ {UÝBÿtÚXw[ã¬Uh«)^%ÇÆS·ëAÆ(B(“ZjqgK´H—͈ée'6µ O™ÅÊèÆ7t~ã¤WׇÓ_›½žcºðN|VCžç!nÄ&š†äoƒµC‡>‘VúÓ>n{kU™¢œ”H…j.uÚBÃ[m´YÛRýÓ‹FE‹¯¿Wè÷b°&Q.ÌxýÀàÓ²ëi£UÍ¿“¡YeÓš}1ÈÞ†ÏcØê{’TÀʳ s[!ˆu(Pžð‰Ë€ÀصÊ]¸¹Ý; "‹ÜíRø™¾+£*ÃgD#íʹúîbçúD‘î Ó´Ûª.bõΧ–zÔÂ3½Ð*±KÊÛ:>ñ]…×eñ‘ZÚˆÿÆÃmŠPB Eþ‡ÞF­`»HœuÃÝ^o„à™<&y$@\F¡ÏÔ|èÐ'RJm„’÷a„šO}òLå¸h†üiÕ€«šèód†a&Ø,À†­6d"–W\Ü?1*TX´ Ųóäi’ZŸjõÚ·Ô[­z¶òÊ«>PgN°yÓy¯ï¥ØÓÞµ…Ú™dVô“ùUq4æUÁ;~å[y~_Ô6¯ò(»–ãœ[ ¬áZ¼rnM¼7ßìξKþtjE>ª%nó££Ä\-¤FVØG€º!»*vm,ìRJ}Š'èx«3ž®´Bq¤ö+ðš¡e´E%måo“šÆŸ(ní°†d&¯²*¸‰ö0CÔ bOeVEäС/%J_˜ÆþE:0PúX]sôP¤…y+7AUÁ]ü¶Ð •äw†ò‘Êk§”§Åà‡š}–ѤA´: «Ji˜hà F™bcPuhèW|Ú‚Oº‹oGÚ:ö4æXñÿtPß‚4.Â)ö.óJ–4¦ÔÌ.´ZÓÓ>éu>›_Ï›‡_9ÍÃàùÒ8–3q)Ík1˜õzp0rôSƒMÒéUx{èÅi5ƒÑ`«ó¾Â\QKaÙë½õ[Z¶âÙ¥X¡ 5ÚÚ(N'¢ÌÞþÕqšrL·( ¹KcÖ)âõ(ßcòn>[i5‚bZ[ }+nyójUÛú7ñ—&G}©Ä¯ÔLK­,ÜÃ&ò§ªJëÌ\سªŸøWJù~ñ€<1:é‰÷˜«ö»]d”¢5Ñ@ÇÉÆÃ^3EÄ=”Ò‰¤JÚ[ÚªË-~bÌä§µýÈx+(Õj]zá‹â„ð tPß‚RîWïaœÖFt.â¡Æ"àB+I€‡K|xQ-Ä<µe´5>ÛpÙ—¸°ÝýöðÝÔd"kœ7ç÷@q‚ýò‚b‘M|~èÇ9¼ØÇĘðo{â&«ïIâZ:3Níaµ­Âê]ƒz˜_ðJÊo’Áêp*++‰?7þrr¹ [«ˆ/PD7Å5ÆÑÖUÐl1 $1 º¤¬bå.ú""¯ay+ëV݃¢/±5šJÇQHoâ™Í¤,.— Ƽ2é5$Ê1|‡õ—¼`ë!çt•ñg¼Ôê«Ù™'mycº°º6VvhýšÔÚuΖ²BªìºVN!3ÜZ} ZÛõ®ïŽJ[9]Å‘°…ïµ­ÓVϯmy) œµ­ûî°Oå‘nï4GÁÀíÍ—÷êGø0Þ¬ä–/‡M¥‘†Wö„ßɱ?)‡^€Hr[ÔCv=ïÆ}‘§\r³Á]ðn jºÕÈ}%£›.¡j£:¿GÖ[‡L®‡<ºt^Ñ„µ^í·‘w2É+ñÓ'' ÃGu¶Áêè“·w™Zâ'j§(ý—Ï衟N¤Nd½4›ºUÔ«•ú¿å˜üÎ]M¼•°_Ó‰Dz#)[+¾È#~ÿ¼‡@²°q$ºócü›/໎!©º¼2Vx·ó R{ŠÈhYãv¦k‰•Í}3äÛ[¿a]þ6j7e“<êµÛ†H¸5ç*ÎЧaïl6 IDATÚêk¬¯çšäG#KÍœùÉZµM[UŠ–U|¯ßµ%ÆËyã³{ó•÷ð£êøs0~'Â÷a,³å]lquˆ šú£¼¡ôi|iÔ¨Ô«B &m"Z[i:¡–!¤6ƒæ\y²6ìX1ƒ¥6&×1_ @Jníê¿wìjµ.5´QAÃܯ$™6<¢³* 4+E¬J„Ëë¸+Þ]«rµq‡F1¿|FýD"7`¾©ŽåO=Ì™žwA¯E3ÏwäžRHÐý‹obÄ‹ëÖdl6©~ñ6L=àn|ovGj0¸kÐ×ÉÆÂÐ9UBö‹Ò½V¤ÎîÍÆ…KÖ² jK9mýŸ yÃÖǺÛQGÍdÔmq+¶)êB~®"ùð:m-À˜ƒðçQŸÊºZ«bl5Ýë_̦“HÔ Rt·pƒ¬‹åã#7#Œw]\çÏ[Å.XÎá4°NçŠáÂïòíÚÒVõ}/¡9 ±&æ‡Ð9eÒj‚š[RTEP¥h«Óª[kOµ=/Žy´úËÆœº®v\Ç&‡³8ôÅ0Óœ ÚŒào —¿m¡npeª­yT ¢´¬æÏcë(À»[Xÿ¯ÔC?”Ô6Ò <ª0øs(ªÛoVOöš…ÆÖÊû W#_Ækü†OÜx¥ÒQ a 겕 Êæ;x£ÞŒ™ðÅB„dª¿¸¹ñ´òø‘!SE¶IÝN믞"²š«H·šL2ÜŠÛ»™Ñv‘O2ê” ¿î­“yÈ@þ|kp"‰ rVÉpÓ©?ú’P$Ô`5z)¶Ì$…ô•L§T¿×Ú {ü¢q.å]¥ò t™1£ÕíV¤¾Ûå'õB;êK»ÿ£ G¤uÔmÄâ5]gØ@R¼æ'‡àÒ4Ö@bå‹"­´òh5ç¡C¯EꤩSsµÒ@ª 4œB³ë?·© ³‘D€Q4·J†¬ò!/Ø ´$óüX ÃsîoÉBŠùÔÖ€ÎN<ž¸ãn­åçõ*·Èê Â>+ÍÝÃüŸGäÜ¿Ž™¿-½Ž &&7~£dþÏ'±ócHm Y.“ŸM›dng‡5a¢fóIÁÂâú ßù°›x‹×ógíqÞ½®°`É€u¤÷ ÔŠ*‰¼Æ©¶ž±¶Ìü, [I²’:!ì…ä+÷°bu »Jêv?ÜàheÃ7õ¡ ):QL'Úó§PéËR;Wm'­³©*½«9ÇüVÑPsm=±È¿r/t­~£-{èÐG’‹ò<ô!òÝß‹Ô":'âÖÍ„R3©ÁÊ]p›×÷KwÎר,ue8ã›4¡y—Rî&3VŒÇ{ŽÁAwGôk°±# õ-ôjüLzÒû==Ä«7ýÕµ>õ´±ø—·0d¨¨è&ôóÏ{iŠ4$Ášó§%Ø5r}²o˜Ü×qü3sõ=Ör˜M'ÐH/ûwiÕÛCŸHn"JJ"·Ûê„Á-R«šñòaN’ËErÖ:½6bh}cÔncýZ*jÔgdæ«1·Ý#Ù†Q“Ž!i·­j uéåã?Rt²ê2Õd†7¶FGç]ÕSAä*„=RŸ–ÛC‡^ˆ(˜YaŽV1LÀž*5„ð °¾ê6yÁš! Ëà…päRÕª»ÚÑòZઆ˜¸W3S’ÜωŒy=<&·Hý6ã~è»é¯¢> ø¼š¶•žaP ·¼3jØýlÃDЉ9¿Kݱ‰dVï¼#muW'Â6ȯ} Ìœw̃u,ØW:=£È & ²…èeÓx`9µŠq°%[€ÈÌ áE‹µž=´Z*À½çí{-=_ä_u‰Èe¨ö N™[e þvÎ_t,r¶ó¯”Ì™¤¦oi"¦´ãµzœá"GÄŒ†’8[Çz-Z™¢Ömž©¨ÅV{+ à‰vì,°¶Ë ;`ª;Ýy=œF+N8ªýöUYúGú ¹6Hߨ¢­¡Zó:ôô‡wxz5L˜¨V -Ë­Uh5ƒÚj½% Uй¼âœxM?ŸPßï3{;}ÚØÌ_nåÝË )öÃ#[ôí¾ÚO ÞŽIûÒpS˜zd*BA0^¬bîÔ>ò@E[…ÏD LúcõböË/gä9ß-ÓZ‹r L,Û^˜!̦MD—Áªø1І‚ŠÝ£Dë$¼•#¨V˜‘ÈÄšL¤Jþ›…ægLÉ¡?B­íÕˆÈj`¢3ëmF‘ Dè“Øož¼’/bF'%Ž9ã•·ï“Ϙf¶¹µ ~§avQ–¶7é‡}8ýÕµ>«¦j¥i}aA½Ö²d(]"…°¬‚ƨ9ìæ{ ùÆë#a8ó@»·†Å»ÞmJ¸y1®sµPG„bÙcÕ>‘ZÙ$ g t§£àc•³!_LxêUݶjUïZü¦ÛÌZ¿ ÞóQE^\u¥àÏÚ½ ÔÌöBIQ6±ä{a›ÂÎ×"íƒÎ›¯g•ÆNqÞ¢ íÑ@Sm •ŸÕd<«8‡} ©í½ˆž#á:€VšIÊëÊ[IÉjeÆ‚¦¬ÄWÒÜ9pÊPA¹¢¤¨Å©¡jFˆÚéð'­7R—uUðС¥|r áŸD}äÿCL›ËÝg ⪭Öx(Ò£`Ī5Üòºëó ãh`õú:_.ô‘ t^»Ãï1½¬T?Á~0Yâ£>`g}0µÀÌXjJþ…Wyñ~ÈC^UÉMRŒ¿A¥mÁ…aµÅùõ`PGå•pWXNY±šø¤Ö˜LB[ÛŠ“¥6À"pU£GNQ¹m³eæfþ»Ìj†±f-¢áñ 4:ôZ´L$ã4~²ü "Jxƒxi¢µŠýpYofƒ÷÷²EMzœ¦u¶Å«or&W¼­TzŠÝlI—ä;ô¤aTÊíŸD}èùQÅ5Ítߦc©¶¡–50xפ~¡~–ŸëËJð¬Î(Õ]¯œ¼2 ÜÌP£Çõ=oŒdÎSøt¬ÚÇ“âƒU%:ImA[¤¼™•åS DL+¸i ÕÐh½ÕÙÌàROù¹umƒÎ(7ÊAN¯ÃapÝN ñƒó¹Â?C¿¼öÇ:V³‚Åm=ôÞ±úˆÀj {ñ™×U‘ÖÌÈwèµèM!Š–Z @òl7®5î»J ðYÆFû«ÄŠì`sÔÄà ’wB»DÿVmù®z áho3‡} • 6æý1Ô·7^mztJ¯¨g_›Ælžo#4¦h™‡Ä~~8·°e¾YßX¬£KžËÞÖ¦îÿb¶|7¡ð¡$ v“µ¥Zœµ ¯Ož/®QÈÛh1‘†Ò­2¨UvWe³†hoo:ÚFÜ#C-*Õ>k…›8 ±"ŽCdDuþúf‡~%CfR aqëæ˜ie­5Ø.Íý°‰9ô»©5ÔdºZ¨òµãÕ6ŽRlyë†v£ ‡O[ÌGÈR‚®Œhóï}N&pm¢˜Ú?ÅÒ7x[Qr,M®dAò`¿CŸD)´óHØ!l õÑÓBqQ3 ®S`ÒÆi«¶ÚŒ†}»û¦Ï\>R&³#5?¼ž×øA4}£µ€újó….\‡T·AšÕq¤¼ºˆCD€Lf³Î¥‘€[' 9°nz)¥uª­¼P=&¢ô.¥ä]j÷Êw Šñ¶¢Gt j`…ÀW²Š_²9ë8ùR‰ZFH•BÆÝjW©B_çÁ:³NÌC~¨r´‡à›óС¯'ˆp¼‚feÅÌbþœ¯¢ðÑ °Yý«Ø¦Ý©wùõ¿ÁƒÍÆ<]0UKê:V¤êßQû€½˜ÙdµsµþyèÐ'QŒÕrzÎòÇPEV›G\tMaˆ!¡Zföšî\T‰b=HQÖñ¢~L/ Þ‘ÍÓ›Ò•¹M8D™1º÷®7µý+E}šٺ»ïŸ#›ôUN½VÐh5OûäeÙ¶ÓŠ¯V ó+âP£Ó‹.´ðsàP•wœ|©Ãþk?ÑLªi ±Ó!³zM¦r?.Çú+´0Ï44Lü†gl®@‹Ã· p§%^Ø B f@Ʋx[–½ÎùTc-½?tè·-¡ÏD7óûÐ:ûs¨Ï%Fx·%ØÄl¾°7ëÇQš±œáîä;1žæ M¤iÕW cʂՂ ð¼Y}Á¸Ä~Fã¾B+eïSÒ ½Òê†R ¾–>_ˆw`Š6z¸á¸E›1kµ±K†,Ø¢Sq5.ßL-ÒµqA€§— ' vÞe  ¼Ž”V{èЯ%|¦bfÝù"êÚ-ˆzø î`¤¯á­–ÝèCªÀžV’Ürñi·˜ˆC‡~%Ý®u0nTpßMøcßëÃx¬ {îj`‚±†[ ÒÚMf.Ÿ•…g¬©…VŸ×Ó¿•Q¼{Õ3Ïð”Ï-PŸ[jC¯U„×§z?µBšS’¤ñ±ÊÕÛHeds¡LcÛÈ~L鋬˜Óð¢R=O5&ÅõnìÛRm ÚbI¯¿‡ûz¶­NF‹¾¬Î„Õ±PÑX¶zë;tè¯ÐH3¡Â6NzËl‚ÀÕ.JZ$Ôj3ÕŒÔÊ æmÖ)ñ<Ü9ô§¨øSˆ;sŒl­/‰b§¨«½PÄØ‚ƒlÔœ—3—×k⨘n0¡¸Êç³îûoBD "½œÑÒ"ÍU|MCCQß*ü£Èû`ï$’)ºPHe"æVÓßI±˜j_‰µ>XPùZÅ髦¹–ˆB&¢fÖª“FŽš@}¥»”…˜¡l«úŠŽoår#o4XùpTX°5Ì-D<çЯ§i˜5%0#ÔD›'ûÓ5ë÷ð,M«€í`FœãÐ܈èæÏv±Žòd»“¥Úg÷™²yuè[i+ú'ÊX¿èÅ:jø½¨OÐLÄ[m€‡?1&ô.„ÁpVy°]Ä]9ýIÑ~;wl^*¥+´ù½¾d0sæ¹Hõ  `ÛÖ¡·‘w3‹U®MFÿ_ǽÕ)«­è I7„V•]KÚ€“jÊk©-BÙ³Aí®ŒŽ Ïm ßÏ(¯ùyÒkï.¼f‹šèòתÑu;¬:šÇâú•TÜp:õŠåò¢ß ·V/ËåO=šò:åÅ3èT9>2Æ‹uíšmà,ÇÉ@Ý­5<w^ž6÷¡wÒTt·èq+*ø¨¯…a˜¶E¼û‰Å,9Û0Ü̺·åZ¦V,cJ=ìÓô;é>ºÝ #ƒçq/µz¾°AÂ&C@P0ÇÂe\ž‰•õD3a5øvÉCѰ‚À74œ¤åqJ}¢ÚÑêÑ ¬½™o…+FWW ¥Ur¯Mh¶U6£iµÂßK4-xwù§Fl”)?^žŠ&Rø#Jú{ßëó.BÉt#" C¬Ž#FÙ^MN½ÈÖÚ §…Ÿú(Ëëe=¾å®ûj Þî›=Ô¯R^ÄÚ®"×+Û°8/4ø>ô€H`U<¢Žþ a¼y¸Wu¡L‡È…B8­g&´j" O±Nc`ОªwÛ"˜t¤-¢àH‡†jhy˾|§šUnÂÈ­”H±2U‹é4%¾È|èÐ/&Góá^J…y™Ž)f\$/ô¨¬'ÿfCt>¸¥Ö÷ôöoôQ ç\Ä%ä:½µ‘¯­½…ÀúxȲ ý"ÔGQ¦â:îLdr2¬€bÝæJÌØš­¶J쩾­W¿â#@J&]…Î+½Ë£×™­þ< ÿ,m¦¡äãêù3Ì.§k÷ÅE¾þvÎCQ¢Ál·qõs/‘êÕ—Ô"Åè³ÕàU#¤·ï†Õ<íty÷Óµ¹Gšº¥‰Ò]J_%ZgáÈÄzw¡bud­ö™8´G?µÑöç¡¿H¤pš®JŸZYeØë6Úê€6fÜÍ:xVxñ‚¾r)l6[McŒïû$ã£P|^hý<Î8nÝ íàV¤J:üÕô¿Jê&I(­“<ákS>ŠJü‰ßE0®ncyç úE¨Ï:Ë»’¨¼µ7Ù¨#^¥ë‹6â‹®JÄæµÍ7úr¢ó~ë’¦å¯ò@qõ¤VЧè@X,¢g*?ÄÔŽcÞšs C¾QÒIÛp'ºŸÊA{k5É$Ömñ 4•ô¤þL^¥Tý‚•ð=VR¢[šSÌǼxƒ‚ÐÈiÿÛA.'±’¨Œ‚lwÕË(»°×Ú×C‡þ‰HAQj£“N-nUÛœãA¢ö–ü'ð6úÈŒ«p“ÇÕ‡ FUhö³•ÂÚ(µÚfImµë„ˆôôÌOËøGƒ†å(|Oê×èîÆ•’7$뻲Á­7øGjùÜ3è)š*‰í¹±üùïõ¡Y_ÉÙV[ÜÚ×ou|í¾/§€i?QUÍ‘-l6”¯ê])™k'|X`Ô|Œ¸2…|TC®,…Z‰£ä‰‰&†òeLà)༳¬·"µj^ÑÇИԌ¶µ‡niÖùi«fÀk[­#3ñÃåÝSµ‡h Ô>Bë:l~¼ËÆÙ--€ÜÔ¯‹„ô–´EzÖü!³u8k ï‹Ùp¬)BÕ¸ƒW­¼›PÊ]ØhÑ¡7Ð}FÿÝçÏG}ïX'`«‚j˜ðš@†”PJe™j¢FÈ ­Ì#<ö™‹Dt Xù[=ytk8§A uh5Ä4.«¿‡zR|¤w-rÌ£®G¾r ¶Zuò)­‹iÓ)„ò*8Ô‡®qè$y+mbG Cü™Œ(2J)-†Ôæ¬æß¤P£TᛕbeF¬v5ä.¶½ª3óû:3 GkDW³¢?Q8ô‘Dþª zÕ$ìsâµØV/Z‡IwEUèµ·³Kæ§æÂù™YÐêµ¾˜·ÚC_V;0±#óBç®e[É%ï$£Í׫h-½Þ㵦:>tn\8Aw¬®éÐ#Ši+d!6‡ÐOÞáIš-L0ÝB5¡ëX«Éªò…Ž<»cdû‘¸Óç´íw>/î‚ÂÅ3Q¿Ž¬YÕL}ÒŽ*DC™ƒH‰˜ßFp/õÝ[:ufVÎXÞÜ% ·(O€›…w•ÜzŠZÏÑv¾um -„QO©yV)-­*ÜÕEC¥]jµÑj' ˵š©ÀL'³eO‡¬­°M9ôשõ'›»{Ž*¸D›”U0 ZAk«ãUò…·°~©M—ΆaJ³KÓÆâá^%Ç@•Õ?L§n:+9ƒÀÑÄCfk߯ƒ”gcû1À¤¶4lU7¼WÅ'©eþÐ?Là|6ôƉúQk}j8VѪ—•Áú9¬®ÙТÕÌd뢊¹wú‡\·¡«‰â^föh¸6˜_lÏQè^™6(ekî(~ßrò/QgåSÈPa¬Ÿ9*ÎX‚ž–(²ÙÈýTå²:ÃÔ´æ¤ ÷à`G+/ˆâ+êäˆéï'Tl >WCîõŸ-zëë ´:döÚ!Ó9?tè=¤ò§^SCGx¼*†jÎC¯¬^®åÁ»Ÿ—Wùé}<fåü•šs"ÿô.®.O@‘Ýݵ­ÂÄg@õ‡À¿KêÊ™O"c¼rê$Ç4gª±Î 5μ•V®VÝô¡7Ðâ[ðý“ô£PßE(9­É¦ EEîaüòLÐ<î¢ñQ/Bt¤Oª‹´²1Ý*´ƒD~³(ðój†LåhÒŪˆvýhxCš·rMß®½SÆ$Ü#K®Ý9øU(Т5¼n!Íp+/ª•Úâh¥±ªgmxhá=Í*­ÂË膮ÜuÀ$´E°-œ+“áÃ!{­Q;ôãhÁ¢Ö’O'¥!´ÖlåQ±v‘þ¨j@­8dv3Âx‰ÍÌìÚŠ¬î÷U÷‚‘ôÝ¿æp¼&ëøÐò‘†¿¢¥üY´Ó½Šu냀b­ÕßȺUØ Í»°EñáW‡¶rùveü!¨U@SÈèÛ6ó*f.wMäÐ;}qõ.‹‰²R}›ðKue8hwçô;ýÊ¡¼ÃÔô–wt}äô(öÇ"Âò,u¨!êý0¹Á‚žbDwª=²Ò+ó¾ |èü‡\Ç6¿*ò;-åQ¨¨.Çäú…¼ôC\׿oÓÉo© Rí½¦¬ÄçС·ÙA[H¶ºÉÖ_[ͦµ¹ÜÕ¦‰½ÌŽÃ´ì²Ò„Ür×}ÜwKW*óxÌòêc YPSÉJÜê°P´úðÏà/õ”œÿ¡7…­«»&Ó‰(‚m¤kRª À4CHžÛï›{tÓ«øãÐ#Ç\î·÷Œâ‹½×§€ã ô 1¤Øoµñ±K6¬„ÞËͶ^õ²Æ©q °k3Ô¿Þëó¨ïø »êÁÈynðEåû^ZÍ©tE! ”µ9g#’@×~§_yðͱòÛÀ?𽡭e» Ó4ã$¸­»ÙHÊ;$ªH· gpñ1­~y×ë8&­Þä_°‡«³·RõÁC/E­Ïë‹Zm¢ÇmºU+d"«(ÔÀmî´4°¨×]~ΆAÖ^ ;£Ga¥f¬Êéy¹ËG±Ûä°tfx‚‘x8s~³ggíÞa߬꫰asËù¿—žéÈ&uÖ2‡ôÝé˜ßŒõÁêàœÁ–ËR¹ iÝÛ+(fÙ+ÏK?]¿ºNØoü¼ÇúzyûÆ{h–u[§Á½„U[ýÜ£ˆï+(¼A©Ú«‰×$g„õ[M§j•l ¶kµ6L7)…­h @£Ñæ+XñßhÌÒ|Tôo:þ}¨O¥H%|åWÚÚVj²…P¸BK5¼Ë„„>+Ce¥xRƒ¾f êü í[Uø‡è]e{—BÚ‰ ßLdÑM®›"c]Q_R>ć˜í¡¥õŽÖ¼»äA"qÿRÑð*–˜nU™Ô | «$)^ö:®Qs>ÙJ6ÕÊC‡–’G‚¥ÖCCýö'e^eÈlÚ®‰B×PV-Eá±Z‚ÌŒxlº[7³ñ¡¤aŸ=¿‡î×™•GxY•×<³ Ëôˆ‹¨¥GKåÂgÉWqÊdäÚQWk§5|1¡%NÚ@Èà:*ì»F¥Ty‹ÙBZ¡¶¬+…ºÂö“Ž™ü#:ÍgBŠ}Í×whAQ'a¤ýãl|ê#armU’­Æ2gŸ IDAT^«Åhm`AÅ>ª¤nªƒãVD£T}Ë)Eo. ’£®Ä¢7ÒìJ½‰S5:&] I×ò“(G™o[§HùW|b¥S°‡:Þ1l‡Œ¥l†•ŠþjP µïØ;ƒlïpェ¿ï; J_ŽúZ-XIÅÈOö¹UØVÈ©ÎjZ‹ËJÝ~üN¹kÏUHgµÒTb°VF£É˜¢zf“lÖ5˜‰Úø‰ßLjÂ-ýøu ñ‡ ÃÑL‹[~¬3þ*s([&"CrA"ØÊ"‰Ï¦õ/¢Uài‹~~.‘ %]ÚðÑ_ÜÚWuèÐH%‰\á^Ȱ´‚NæOÍ…ëÚ„Ë]Dz×Mø:Âe-oueÆn×èµã* SófûÝ‚"²Ü<8sSu4‚ß›Š/ š¡UL‚¶ºêfd¢Ã-Lš›Ãa¡ø8_qh(] JíÊmâQMµk-ymû¨ÂЊ¡Öï2«qˆÅ úhIKµ“‹çè«Pß*l!)Òþ¨õП¤zªàQ톉̓­ 5›#¼Ö}2ÐŒ¨]¤–ÛÞ“=“YåY)§ô:F.)‡ÞF*D÷hæ^ Ìéóiq /üMY¹j¸Û”ȹÔàÈ}­Ö«ˆ}¹ôßeŒÔý¡Ö›8çÕ˜µž_kþtîýYÚ‡pä[U^Õ±aºåµ¹6ÄE»Ô®# šïº˜Ù0›·¢ãN ;5‚-»+ÍL>{PÀ¤—tý²B;B<çP1òÎjhD(øvÛ ¨ÃðƒÈ;9h%¬ªÍ¼cèA[¡¤k¯¥²QïæÂ]¦š÷1ö¥ÃÖ÷kå«h{ÓÜ*¿Æ&]ûvÁû½äfx`Óôç£>Â]Hj] Ò­Özœ"isZÕ\5U°Ñ¾—½ã=ä§uÙâ*_0þÑ´h¤•µ:ô€ZØqݸ…Ág¼r¿¯î)FLld›”B-04ç­sÑêC[¸Š»ëx•ƒ µ-ôÏà–­kPjxì¸kn›¢]±N{4Åe„ôâ]ôÓ ‰‡ž%ô óæ]Ô¹aãƒWûÔè¤YjïÒõ®†ˆD:òŸ|6ùuŒCu Þ)Ûj$Va{›ÆÈW?Œ;brQ…}žLy&[ë¸[¨•\¸k,ï°:Óz­d¾ª6þ¹Í"Ì ”¾à§ð.P§vÁ†á¥€¢Ý—aV sxÈ Úb˜·„0€Ò±¾Õˆ±µ@ŸFø¡%"x£5¬ 1É9¡øn¢6å'SZ嘆0jj#8ŠYÛ.(“š²aïºPUqΑ-†å*b¦P÷ŠŸCi¯ìÃú웿ҞR§d%o­ûq¹»2€±U½ÊZn‰4ý—‚™ ;DíÛ#…PÛØÛvœ¾‰Ô¤¢UZ±sè1µ˜#!_ùÈ^æ%óäIÕ‹ÖÚ“²¨À¥´Çvò­»õÒ„ÃŒ^Í)Hoë!5CU´­nªÂRêáßÃß¡?K¤Ñ+É#Ám³‘ñZí*o½ Ø½ægmm~Šbæún°i«†Œê´ß áp_(î¢o¯ñƒ ø¶ °×ÿF:Uèð'Zí ~ )?x‹dÈ»ZM×lh,÷6RTk’q$Õ}zm œ´¹¿Êd{­ÎxuѦ+l³.}U¡/F›¨-xè#dð3÷sÖúR‰V˜FÑÌi Dˆ¨ÊR ä5³Añ½ˆBzb¼çÖ¨>Êì@YaÿY½Þ„èûlo$ëóZ¼-2j'¨˜üó‡Fó±|Hþ)½­C‰*Ž.)¶(hp‹dî'‘ö=\Ôïé^«•ØXòÑtQ¬DfìС%¡#iýÐ;*Ôˆº­Ö¡]ƒ"£Ò]Iô¢ÄUÄÇ­´Šî4'©T%œ5¡p›Jå#Sÿ‰»…¦!ä[åÁ~;˜ˆ%uÄ«i¦àé‹Mˆ²ô0rq6“á4èBëü´,ÒÖCÍ©û¤˜REëD7·@-Úv¬”•÷¤b£2֟׫±më<ôÏ„ñ9Jüo¨O5k%%‘\Q_ˆ4…Emplµ|vâZÊÑO¯£6gG¯]:Š6 º<Ú¡ò%4vQ™Õ̪ê‡jMé-E­€yCË€&ƒŒg ©J!&®ÐCëÎ(þ0BI&îÑ»ã¿÷·DÑ#¹XµªuŸláý:B-&,à„QY'ÛÒ&§‡'#‘Î;áó¨F"n¶t¼È¿k5½Þ óÁ•Vñ;x–ÏÔFðÆ+u1³Ñ7ô²B]Ä~Ûçê/…2s¿q_އÈÇ&~ˆú×;!ÆX©•BòXų²ÖØʱAÍVk³nÕÑ"óšú¾š¾U%¯ãrk5ò«èÕºª¨­Öèü¼pᥠæ-6ÓøÏôk}ÑýUe\EeV5‘¬Gfp©lE&RúJJIͳÍŸÍÌ^¨‚~‡h¡v‚úJÊ÷OQ*“j¸Ú/‰_K.×:­m ^Dw÷žîd\TÞû’n˜¨˜ k Í[l¥Š5Iu"l=ÖÆ9µ‘Áƒö¨m“¢Íl$™òô3fàÐ7R€zµèp÷"E‚Šh$_-¢£L)©‹yí^zp·ð!\Ðé¨ÇlZ‚Éà³Ý¼°„H¯Uë~{,»Bƒˆ ¿0ÚÕ`¬üÊè‹!iæI®(Ù ¦6¸´*Ó YÍC¾}ƒd¨~5ùm“¯ü«°•*Qæ­¶¾©-º[ZfÖ9ÎêSh¾\¶ø£w½×× ›‰¼‘<¯Òñ§×lI±Ön¬SUR+Áv)±H+#Ô¸˜6§²ü°GmÅ!ìÿÚL«×™µ*D쯜ƒ†$þâÊšèyä¤ZÿõЮt{…Ù~Œ¨¿·­ªQYŸØS,m ýÍŸÖÍ!åìСǤA¬ú¤‘Ugâɼ¸h[Íà&‡šl…_Þ»+Ë×öj…nÐ:5~åoÖ߀‡öݼžãR»j©G_¤¶8—û`(ùúJj›SyÒG¥ÐjÎUf,¢âk]ÓÆÌÈ*1³ |UIV-j@‘y”[ò*m5ºM×Þjk³:ÔvSñ/–±ßN+;òÑÃüAïõùV 1‰œÉOq[»aÒ"Ö¿2Amµ­»‚˜?´éÙ …ÓØš*1fnƒóO áSZ¥¿‡öNÒe6W£¦õÐsbj4ŸO–Ï×Gm¡ Qÿ)ß+¥3‘à#Åù1D3 šç’³™((eãz)óª¼.w7†¢l_\:ô,µaÿÆýµ2ª‘6&R èÙtéÃèá2®§‘=,ç©ØDté|¯ªãJ¶p\‚C6ZäF<\é¹Z¨ÈPùÿB­ÔNy*[HÀ—…zµ¼¡7Rç‡Ý´*‹¢|ïM«!¤B«àÒj+JmÓê˜öÑŸN(r®î\û5%jšŸšÐzLXýÍ!â·Ó§îQŸ:álC˜WTïÄÞÖ’¦rk][«ªf·ªàŠˆ';Ù'_p½òËŸIdŸ1…¿‡Ô\¹üÅ»û²ô3F°‚¯—ÌÈ$—<1h.¶NŠÝøµ•W.óOÂêt³W^N•Üê-r™Ã1+!©pï¨#ç•9lL;ðL'zŠ4*Ît«¦`%X^3gUê@q):݉?‘rûå’©ë@cŸùïo*Œ/=܆4w„Žô\”k_Ï›UYÉF](|â÷¿ÓG¢ùi§íeÝ·zÚ´ÞJ&©Y¦<ÃPYëÂÍW+œcŸm€9½2rË¥ 'æÛæÚ¾èOLÄQu)²¹EúPÒqýÌa†ž(&BK„ÀAE·Eb«[mzûSE”*±±Wdlqƒ“ ¡kxBtž í#Ük#6öˆw’6§ªò3®ù㨵°8ë{[󳉺­†ïšLJkG9}„2åI3×9â w‰{T¶Ésµ­®üÈsü¼¹m=±†>V3äÏÖ‚:ˆzàÏ1WXlΊ›Gïf _´Kš~èÐr°_jö–N­ÊÊ¿c[èÔ•g[Æ e¼Dæ ¸•úÕ£Sƾ';ÚŠN…ÚãCÛ5Àd»}ÿ°d(ð]šû…áá;©åp%pm(¹¯ ¯Wa«Öï][ê)µ‰MÍ>U!é–-jß(±ú ã“¥Ú”ž)Û¡Ï¡Öl~Úµ¾M+ùLg@®[xDD1õÊšÂÍ2ΞíÈ^|˧zp|óÅ¿mUùmÙDk¡}¢N.â?ªÕ¨|(Q³-¤ åÿmä]ß(R*ïI:¡+š |ðÃÐéeÄCq¹¡Õ<¨\ZRë´ò÷ŠîÞfѵÂbrŠhT2Út3Aéù¢ "V f xÖ¥:ô6j=²Š×J?\ò´‚˜õ§!™Û#OôpæZ2LÓG‚׿ªR9£ö8Ù¼Xؾ°×. Ÿl8=AØY9ìß‚œ–Ö S½åÂÞÇRkïIi5#ÿ½ŠO5n©nS¾0ÔcúhªãZÌݧ ¹œæ²šª2/g‘½±î–u’6¢*4ýåýìºõ‚ͷùl*¬üÌ鬂Øû–SÒ§¨™µAÄè*ÿ/B¸Ug×e~iÏ/R/ÔZJƒm2¿6¢‡Ÿù×ê©â½'j9³…ôäÔmDö‡Ñ O)Þm‡oŸ 3—@®:äð;¶´ö®»y]¦Q«¶Åldß~ÃDúFZÅ.æ\}›¢õ§CÇš£*Ì#Œ§g{bz¶øñã00néÊãZ–Úú‚Eš ã‹Ck¢GÓ? eQi2]ÄÀ'Mæ>†¦ÇÈÒŠŸKYÁ<-²‰úÒû 3\ˆZMÎÇÑÝUgt?)F¥ÇQÿY—¹½0³¨­Ñ›Ù>þÔá˜Z>â©Ùl°¼[nïô^Þ)~\ÙL$´€5è¬}Sp¾òó…~ެ}!ù"°V ‡ž1±AJ[Í» Ñʽ@1þ‹(­úJÔ¢›¢vu‡l¿$i5F§E¢Ñ;Q­–Z:Ôqn|ŒÀ2fIϹ LHœ[Aöò·Íҡ磊‘¡º×ÕƒëÔK³åkuÐ4‹bvÊlºŒ†Æw:zéÚôøð¾_Œzb¬ fýù7Ïhiß6Ôí©ºôǢÌÚ¡=­ØOH¯ÒB†.ÖÿÔ†~×gfdIY5¸nËbýV]†ÀÏ>-P;<)*ÑÔ e%k;¤àÖ饠×âäNnD›6 l÷dÎê{›á¾ŒN`'¿g–}/9Èo¦X•ñVÚÐäQ¶6z„ŸxV§d¢}žºÿï'·še0<¸ÁÙdæÊ–0Ï­ÀHm”ömâz苾ԧ?u`=G_ì^ÊD¯ÿöžâ“¨ 6S!)È6¸•Ôâ7ƒþ®z„)¾ÏŸ›0åç’b¼õ„!õçá¿Ìžu’>,£tÑ“—¤¡¤nÅyx^8”Å#˜ŸËy$h¾’òp,B¾ Õ…úçõ)ºôðñ_ÍÖÖü9´1™‹"?ŒZôäÐU¯N‰€XÖ@Œëv1v­NB›9ÅûðS§è!­TDCZœ+21­ë­2裢öxˆ¬%3GF­ùïâÏWñ0‡~ a´FqìJÔ 6¸è TØVA"%ÝcI+„x8ŠÁÕ#ÜàÓóEÛGu¹/[Ï‹7íÿÌðã×ÚÚ¿B)=$I_ÌCT5³N¸Ú(R«ÒkX«qßÖ/¦ÕŒ«NŽp—;Ýú¼É/7¬@>P¯@!¶FVTm ‰ÐŠ·‚6 ;êÞìÎP69á­¡£ÖÐ?Ø(sÔZJ5›ÃÌ/%Å;2ó⛃U`Ób_o&µõ7ÍQ´ñŽ FUR¶4îùÁS´¡èËdrtÔ ŒÝòãÂݸ=ßâÓ‰„O…9b¼±Öç1Å¡ìq{ÜõC‡ž$?h¼&¶žæ¡3¶-zʬ`ñ´Tæ7Dqv«J*RæÁ'³¹Êg.ҦͶEÝ«Ù2ßîö¼ï@=ô“¨¾q&ñaÌE!)^Ù&¿¶ÍHÿWy¨~{Tä÷ûj©€¤¼O>sNà4Œ”YQºf3È¿Š²ÈÓ8dt¹°iâÔž7 ú|‹/÷W%{@-sŸã‹ý°’«!µB¢ç…Ž~‹p¹Ì“ÕI͹l‘ÎÏóq.ã’A‹$iŸ]„Zo•‚ÙÞF˜¨¢¦ɼ)þ ‰úLðÜe8(QWK•lˆÜÀbÝÒ¸Žê‘]:Á?R¿½¡!§DënÙöÖ#ñ¤¥¼ývJ„aášz†g¿t,ý5"®Œ ’U…”íû„îŒ éh™¶žÉ|›C?–6>âëy¸ˆ¼[æÑà‚i äòbsËjXä÷Ñÿgï ·cgU(|ë¾ÿ+{$âfopÒžN;Ó†Õ3ÇETvb ÜÊ€Àï¢9EÃÄŠ†4cÓó¥þo±†WâQÜ¢‰Ö?­ÝTa)1ȹ/‘ñbáq¸&lý&ôÒ›®àb¹üf ~Ô[<ìGäüRsXžúº³fQmj”BtãíYçh5¥š¶•“€Ô!zä@…ÉÙ³×ìà\†‚>_ÝyÎ2­}ž‘ÎB:ˆÝ˜›nú uÈTÞs×úóøÂ­@#}GËzt¹3gù€ñI‰ì¦Ñ_cºd¢ØkÆ+ŸT9m uÓM_He¢‡Šâ†(Ãw #È þb*1žAû¸â)r-Ì"”óüTáÆù\_/S¬‚ƒæÀ ¨ >t㱑cVŒ½p>=Ûå$Œ­;{ÙÌN ¹bìn'dޱzŒÐÊÈ=Ké øiR §L0NÓ]õ—#Ò¾Òvv4 ÊC´ñ€F¯%-AÝæý*Ñwçð¨­]]ÄÚÊIx›ïׄ«óËLÇ‚. ¡Ñý»S{Óªðæ:ƒs÷¬ûcjü`XEwÃL ¥Gá“u,²i„ˆJ´ý2r¼aë˜_â=ív\¡ìM7}ÑÂâ¤ðÊ`yçá¥Ã*Ì_‡{ßú;Hm-ƒ-uÙÏmÎíyþu6>-H©eù_:g2bºwŒ³1¶Uk1›8m„i†v<"³ú0 )o=v‰tC„{÷W• ûÇ)ý ùd¥ø4©úRly:]:­cðº„æ°¹Dð˜C·ú?Æ‚¢hÌe ™¨WÕ­o' ÂÓjŒFwJ$&nï¬G|NÝ) 8„Õ.ݬZDñnºé 4òr•©ñâJ½ìï•é5¼i¦·àhÃgw‡ÐæGÜ:âýCÌñïEZÁ*=ïGwé–¦âØ›núRÅR4“`—Urºë¡ä­bõ»ýQ•q&<JƒòOíà^]½Z-+ä¸(X —ÿ+*lTBbÏwxU>È“ú’c¶Åu,eØbËfýljºŸòm”ØËQõå…‰æVñ‡Í£êS·^‘h¢Æþ <4œ—HGº+c2åœØ¨×·PŒi73”¯×aJwNØ 8GìØÄ·°Ìú§*® øŽß¸Ñ¾¤ôè7ÝôARã³Q¨ê”Þ=ÃÄAž¿_§Û>wB±ðïèOuk(¹éòžay#Nwu’ß×[šåMË+ýºé¦ ºpipˆ‰N à m.2j¤£.òS72%xRTDù_Kd×­2ç[-ën‚áayÿ ý¸Â-Ì?˃\ÈA/Ô"sBwˆß¨JyË‘núŒ@N9 ߮؛nú z¶£Ž*T#χʟ2Ëü§’ÆÎO]cŠÓb bHq0Ø×Á¡ü¯ lv6{Ñ1“åZ§ûv4¿@ù^Ÿ£¥_!à4üLÇæxrˆž 1X:¯¡™ÞÂÈj‡Œ';˜\H>Õ½&íÁH똺L'åóê¤=´¬ªeˆýù¾y5ÌV­+Å„º”nj‰”žå³&–oX¾§åxòñ•-ž¡àÜÛ9ÀÌ$ÊxoãwU3ÖÞtÓ§ˆürwi)˜Þh¢Ý,}¥½#…DÄÔÌòwÕ#Ú:‚/â¿2.¤CÅ£D„cGõÔ~|È¡›®#â&O K`Äâ½(¡ì%Ò£ž)ºY­é²À[ÇD+=»‚Zšñϯ6c•Qa•²C¢7íG²ÎªÛyMßpÓ¦ç7pâ¯Þo8~ó¢a땞>Á!®t'dwKÿ1$禛>H¸ê€ßñ?œÕÇØâ0µÝ(9VÜö‰{2-°Èé±CººÅ·¢vµ g S0ôÎí¦_Lè¶®\xÐÈÛò¯ûòÊÁũȷ¯U×6áalwTC½)oÙ§ÿ›˜–Œg'E·­wJš¤Aêµ…ÁÖÀ Ûy¯¯ŒC0>9!i 1ò(¹ • ùB`4°êöcé¨ÊÛ:ÂoA.¿Vi° d¡q¤5ðó´Ys¥uÁÃÏC-BdD LÇXò¦šuJàÙtsÀ^¼»á 5ð;ËŒ(0…HHܘç´5^n}ÝôêÔê½&â*£nÂ4p‹ú |j*ûhzŽö#iãÉV(nó»ß†J;€Š±*#çÛßôÃTÆÖ^ë¥ ¤2~û~îÀž^‰‰òZñ_hTFPÛŠ„J2ò°‡5¡Àã ¤ÅÛwc†ž±™>~…£ÊœÂ_y: #¶ð\Ÿ¢eÄl¯£á…áæ§p“Í£p>$K–}_DO{AÁålž@X#Ń“ßÖþã$a(¼ñlºÌØ„…†³Z ¥§)vWàå–ÛMßGeœVjYw›+]CQ†û+¤üLqرNyúK’üË.žn-’`x‡0tè `ÿÜÒƒà&ßí1JËŽ ‡ýJ‹½•¨§ I ô˜êFu‚ø„K~~Fî…=”³…„æ«‹ØÃšmÖ>hoÁʃþ};¡&×wuÒ—÷(å2˪A±0^MaçŸÔå<Ô¤›~#ye¹JC‹6[¬Ø¡»t‡nÐáãº'sƒC(ä–NÁû0‘'fjX^ï7Öµ4üÓh䦛މ(ÔPuW’À³›ü§’Fž{‡À£Mé Ò!Á3*¶›xK=8µò•Þ¹Ü71â$ÙÍqŒ§ŒËm#l©³)> C[tÍÎÌþ7OB8k]O¦ˆìH机™yr?QÀiŒaÇ•Ïgö úv@Áa€åç„]óûoN>( Æk&ª é‚)Ó õ¤/ѪÂ^ÐÜGmÓ¨”¸ WY— 1yEüFÒÁ:ÁÞ<‘, 6¦ü43Çí>uó(fw{⬤ûuÓ/¥1q1‘/iÝíC7ÐÐÛ–0rÌÄ/ƒKu¹´¼d©N…`šˆ³JÅY´ãÑñ}ô{ÓM¿ô: i¤SF€_HeÀEFoà¨nÒoç¬7ÁªÆ´&¨Í•„V†ZüäØêu®t%ÎN\c˜€í§ùí˜)PÉ‚‚Ø^±ºßæ¢Ã>곞ãé>Ë÷mÞÇ Ü¢Ÿ6߉îø½yc0ø¸%ƒN /|ÒEP³Ö½'QÜYF™Š€(Rp+sós4D8«L-ôO’7 ÆRÅ h8Õâ•ÍýUüâÑŒ«Fø©½þcë‡Mao¦^ÿge IDATQ î'ä³”OÜtFqÉŒFUKV7ývÒ°çJp»§ªUO1è=·Í~NuŽ^e&Aš««ØÉ 7ú0Ír>ºæÝöó¦w%Ђè G‡y“X²Ï0¡¼JG.` Q,ŠDùž9o–ý¨UÐBä™ÒC†7ò?3°K iqObÚÓvøG">›a>káE=Ë™tj6çãò¿3‡fF;ë•çSÖF´ãæP ýÇrXXáÐtXYËЕÈ_÷p:H1$…U_K .uý[‰ºJ§à¨˜UµPŸ# ‘ŠHÅhü:«rÓ'éTæ°%¸Wó~c}NÝâQ=šŒxáq>ËëŪµVκAáÒU`™²îM¿—ª-<À«ëõQ¦¨xäCf*«Ì h•«´ì™X0Úá9ßô켘B_Ø™ª§D€Ç“þ[ ¬šD–ýÅ¢8¼¾Åèj¹Oû/t¼»Ø‡·ðÕ³åذ?z!3rtãÊþ*æ› Ï&‡]Å%2ŠC`—†áŸiƒ~-£ÆQµAöA'GšÆû þÍ{¼  À[[ŽòÇ$¤‰9Lާ…Ó™xÏ ÏåM´jÀŸeõÒÛ~#é„“AèBŽP£ìÑè à¡ÞgÓ»%C¢¨E×±9B•‘YÜôÃ0õC+€lõM7ýÒË<žÏ’ÓÁ’‘.ÝÊ×ú—"¢¸§ÅH›ý8ØŒ¾²;y  Ê+â˺é3N¹wÑ…R6—° ï&úÃ-f ±ÐÚN*[V…_±óž{ Œ&¸ŠrÈ츃éóS~i~&Ÿ ‘¯Ò¡œr¼ÞŸT½È4:R¸™ŠK¥Ö盨©hö†§Aú%®—znUÚÞÆPÝñÊ?ÓÃ!ŒL„e÷ÓOœ (Bž¡£R=,£ág¢/ìLôM¿”Ê€gd %ÕwÊx«t3Ow7¯ ŒÓ™‡ÑFvÊ$¦û™ãü-GãÍ.QÞtÓçHã\hŒC K±¢esó螺¤M‘Tª×uä1Š•¯OjHÓRùM¦þ=¥äeÛò %7zhĦ«-AàæNà 7Ô•Æš¢˜ÎœÞtÓ»Æ:(u¶ƒÐK1´)©`úC“Ø ¤^•_>.Ų$„åðÒ-CDŒð|~ Ë#öCæóvâÆÓÅ'ê#ŽÒg¼9F'ñkÙ¢®üÍë j¢0Cuf) <ׇÒi” ¾Šl½&ô‚¢ÏFCýMžÁÄnN-wª”Ps}]âYÃr–ÊwÚ–À5djÀJÀ*€þÓI#_ ´Ï6ó#†à^yÕ{\¶^D™—C4€­ç±,õì…•ïÉóø•ÚŒ^EX4ÎOíÙ|¿‹ÇÛ8m+:ë›âÐ+Õ!—Pæ(V§7ýF"–Ó™1 ¬@&EV]ŽºÈ ð•;ÖvNkLÙòàPìHîžüL:לÚT¹é¦·$‚ mÔ „òKæ ´àìUpN–Ÿ»ƒ‹§V%Œž¥G†òœÞ9óá‹v¥Õ™EGtg0 }ÅG£hã4^,G2N}(,_¬r|’ …5wZÿ2•ÁhÞÌìD}!9VÑñ‰÷¯d¡¸|¯ø›TFA –±4^;ì÷JTO‹8&¨D&:Wª¦å¹Ü„³O¤‡°Õ¦Œ¶ ˱P9Tqj3~{¸©ü71ü†^Tý~˜Ë´ATUu4ßë‚Úªñv¼7 DRSºëöä7ý"R[V¸q¼ò©‡î6´Ç{YàåÕtIØ*ÄXºQÅX^/§žbcOõÅœ7ÝtÓŽÊíÅ•¨oïG(¸/ÝbB›eÊtæ^ƒºrÓfN`Ïæ³O6¾Îšå=™PÒgäP·Í9݉½0͂ƛÖª}g4•CƇÅhöëiÊQŠf^I3И_i/¬å'œÓxw{ž¡Øáx26#8Gé(ƒ0O¡·£)Ê9:ýJDA¯å)×yð‡åQ±ºˆ–š2ñXåé®[—‚BUÌ_ÂáV^ëÐ j¼M:Z–±^Ün%ŽªÖM@S¤nªª¾J‰¾.5¿”PßP®…ßG½*Щ¶úò›~ u‘C†X´Ó‡Õm:µ`/xv„DEtˆ´_”®¥¢>Uøáeƒõq+õM7íÈ+1*¯aâ;¯X:& ß \UÔr?Cªbó n•¤=wGL««Fèu¾:N¯>ÎÎx”,7væÒá€æð¶a ÕÞuFmJj¼½)‰–áwùJÒ.Ô0ÂêÿVujÈ!=Uq)Ë8‡3=¿W9'rf´GEA A¸û!2¤Ž_ üyÚD:I–ç -׊mT¡ÙE….+â}ý8yþ³,¡6GuSÓÊ6üj`=.)Wé?-X›rë`ßÁP&Òcôf¤ÜœæA]Ëq4à”¯F¨)ý%/KÓFV„–’k/­ö­¿‹J÷ºÙiYÝRÓG,»?ns$Z¢»¨^ÞKä2d6É/Y.`Uú¦›nbB¯d0ƒFI‘¯ˆB"V÷ªbTO¸Î2º›yO Ô_ÏâÖf:npÒo<¡—ñÄÎÐÐÃ~x]¸*lP#¹ÒÀ!Q(^ò/#N,VUbœ"&)…Q—CÁ?©]äï¶PŸAy’-"²ùN·±bËgÄñé;z0!\”×t!ü<[:Ç׈½Q±†äLa©8.uå[.9š„eTZ‡Ç½¢…¢Æiä„'}U^|cYCw«”Ÿš™-a6d¢ƒ¡Ë§”Zí^‡pDUÉ;͹:-8þβ@Ý|¢ 6káÃ’XÀ3Ÿ «®,ËHÔÅnøÍÏ2˜-wV>³Gû-χâl9GŸ q3Ëj꺋³Š-×r+Í`‰ñ6ó¦›nªÉ‡’œ”Og§_;œÝ*ìóTÓÆ29ŽÁŠ#ç¨@1Ø!R~¨Ï§-˜Mç¿ÆPÛ„ˆ#A÷q4ªÝ›Kx¼ëˆ÷!d†|ZcåÍSl‚…±£j»X“Âo’D«P¼Œ–¢*ÜÅð¦ ðå’'‡ck£‹‡Ošã;-}%p/J¹e…*’ç+ƒ/VüšÙw‹e|ëRÌ…tnTü-O9²È§“íÃÚíù° xMæˆâq\OÃNà4Z({Õk¢“†ˆ–¶Á\éŒbeœôj÷ Döò ÒcúÝLN˜“°àðܶU3¡-„$jŠ¦Ë¤4²tVõæ¦ßBžþW`¶ úÊÇÄùDK6šåA½=H§hƒL\HågùtYŽ|ʪESêþmènº©&Œ¤Ë…´Vš<üVäT 8–ïàP”ŒÂˆÙªVÎKRÓo¹ˆ´å°l¹f­‘['\‡»uð-/7/oSùõ….ð6|E 1¥0–fm˜3:¤@C!ŠkþÅY $4ê0‘X)¸8Ëÿ—jQlÕc˜Û|Ð\<n;)$(I[pHO&Ì_*•2èü rQ¦È7™­.6e–èä“#¤Pò!—nš°EÖK©L¦³¶} ¢u»è‡réY5äeù¿MCþpÇšt7Ùòa`ßgÝõÊ/;ùœpfDqkPæoô©,<„§*ÁôþUZ£Ïá­*ë.œe¨V=ã°'ºrj–0^jƒ4’ ˜({jOüî­à7Ýô€º ƒ€“V+6@b¾nh,Ò³ ¨âqWF†Ö ?{dÑKÑâvõçW6Ñ ‰8±×°Ÿ3A¸rã¨ö«ËÉ{>c”â±ÂZdÚ@U&r" Јº ¿ÑìŽbäRÎIhB5t¡È„d³ªübû?îlEnÙQ…ï‘ '¸Ÿ32Í–7*©|<½ÝäY‰·ÿÛHgÝfZÃG…dÝ©Q%ÐE—Z‹Ô•ü¡Lü4"f#·_+n6&ªoÒ{kz@ý•”Ï´]en°¦^@ó^„TY‘²þÐkmðõ?|HïHù¬¾¾À. –‹È b¾‚·ÚšèÁç×M¯N‡Ê÷ÖèiS7–úvÏ2àszÊ_‹QõB¶[èâ%¿Uû¦›®Æ;‰ÐÁ•7¯,£šýstáÒNHÙJz¬ìÓu†Wõy^¥—6Rb€¥ŽîéÑ>ÌÀŸz:Rò!<Œ²Ù÷åêåQ6Ï.2›ÚhZ®h`LѪjaŠ&M1¡‡%¦ þ–;¨M¸%ÔG4+º¥ËŠËåÌc2$hGNˆœY õÔËÓ••Pk)d/ðQü:ä噿gmxÜ1Ë¢¶š0à®+{Íï¬3&ö«›§ ðfÕP&´å„õùE7dqÙõ¡ý=¤ƒÑÅœp$Ç‘¯“aW–ŸfýtÎã^ñ扱\¾4”VñÔå©Õ5}Ó‹Y Éy]Ïâ^@;}`/µ‰±òq˜Æƒ(Efæï¤¹ù ÃÒ‘D' +6‰(‡·‚ßô,¢õù þe(_Ælû…±iÃm:/Â9³±Ae@ŽA%K&ejZ9«x&·ûb8à³rËÓ@y.Cq¦Ak×(ˆqD|W Š"=šKÀ‡ÔíÁD¢ßÇ~©6n<¾ÈB²×±wœP…j©51!Úîâœwxê€ ðO~j„ƒ'øögc>R!z¸Ø²‚§;l+¡ÎôóŒÄR·Y*ÁžÔÖh¨‡¥aB'ïP’¤2Q”š/…óê¥,…6(Ü¡ äóÇ¢"RwÕ]š([JB“ïè1ò@[…›3çyÜÙ!AæÞ`tâ[íôM/Iw&‹6àïÈhGù¸Ç’;·éõ^¯¤[|ƒ0[™PCL6G•#Rg\–jÊðTY榛þ‰¼Ñ­'険ç!kì¡U§X„†·¼JlF‡hEr3©ð‘ ¶QŸˆ£gçºÛ€¸årÀœÙ ¹¬÷dO1>sÉ>K¥×Ïó7š‰ e#ñ°Á‘•7" ˆÊzT]!©й(›ÐÂgâ¿|Èã³)žšMЦÝåRæ#|<}ÉëIزsþ/ºóDÓãëù¬‰ÿ, uÑi°su57#k‰ƒH$À>ð]¼†”ÖžM-·Oõð™uVŸiŸ§êq0–(܇f}ä¡5áIÒS‚f˜æ¤¬øÛIÇ@ÈlÉÎ’iqÈO•s•¤Éh‘P&WªiB&4 SØø‹?@’Xžt8u<ê=p°£Èø5ýÓ„ŒY’ý–4‚ ñБã!iRYË«né©›^†È̛ٙú8ùìÙÊYUól×oO™^®onÞaöøõ-¥3ñJ¶Ea,P2/-¤Ýj~Ó¿SAìCš§JiÊÑð©”Çá¿uŸ j¶÷îô^Ö²Ócµ±OœÍÒ˜y²a¥â•‘ƒA_Ôj›e1—?“zˆíR”ޱ¶2D³îÀÇòØÔ`¤› ¼µ¥›>}Â!òËýœôCéñF…ô…øßGdÔ"l`›ªÔȳ…%uáy®Û1ì´êÒ˜©î`3:ø%_ªîYÆ1C{®‹Ã0r}²3–¥R·h#¢Á!Ú7<‰Wø½I‡¹´šÆó¾Êø·œ”ó)Òó©ô‡ù%kHÐz«ap¶tšÏ¥Òs[eÒE?¾ ¨®FÄ{*#Î+‚í›(«ï}†Y}¯B¹^Í&D‡>¶}.Æ9ÝðÉÅÎçE䮸gªÓE‡L9y|Ϻ.‰ b•ŽNº¤—ÄÚ²D¾tjÏWÊŸ½9oüN.,èhz¦ÚPÚ™Ò¿<\\Ý2¯LÈrÃð·Ã´C¤µwžyÙ8è^ïôl!ðþMä‹L‡´.Hç\:÷°O7½¡šNí\ó7A]ù”¾FÅicKEoÓÑÛ_ð"í¢#Ü’ 7my’íGÃMݵUžºé¦O†=èã1˜qc#¤@ñJsžUŸÄ°¼j½§}› ÐÀà½h.žÖ[6p67ç“Õâ/-;‚îÅ ‘á,ŒÃE&#Ëž ¥Ky÷‰F„œº†ac™™=UòW ÿÌrO!r§gö޳ñ¤a?z; eb¢¼Îj…½À$NÐ )i•îéjwá‰F^?äÉÕ®Ef)XA]°ìÀHQ˜K1êÿR¢~q}luÈY•.ƒ'Þ;#fyð(Ô/ÌòŸCèŸ-ûd9(àXѦˌD¾Djê¦c£ˆ5h³¦¨Ì>:¦žifÉöÌÏMJdD³ŽèþÉðSzJß%f–")Jë…Ëò0ë©fËV™B&ÒîR1UÑ{˜ðDAî‚¢hvn}¿éË•¾tÉ&þD«—µÊV¬âPb 0ÓúA/\ч÷š‡ë“üšMôI'`k*F»!_øVÏû3-ËP¨4&4Ú:h¥·-ý¿R7ÅO$íÿG¨?¿œÒ;<——:Ø™ »S¬iXX²ô¦Z÷¬õrÃïðW" òº–5©tÚ–W.QâUb¡ŽŠ ðx»ERBªn5—áǰ”O=sçJkƒé+Áy7`a£å©M+TñÅôkIÇfãKñ!ßyò$¼„iç«8Ãiáó~…=¤öu•Yž—bdЇð¤¶:eºéÅ(¦+«†¾,~™Aÿ΂púì_ ÇònaTY‚©$ 6*å-»ì² ÔZ–Q_i¸ö‡7Ýôaòlom&J¼7Dã‡(®ådÞ=¯(˶­}&1þÙ<›wœ¥§éÀµN->Z@-q_Ü¢ õvAA”*˜W#S.`´Äb&yLGƒ’þ š~º¹«ÿÐ^Bÿrú_(”ÙRaŸ_áÃm*Çãí»+°Å{ø¾~[kë•f@mJZ4.¥ñê|,.$ª^¾X¦­«£8äפm”À¤o*ıµ‹¹ïáœ6VËòÈQâ ç’hìzû£!sÚ¨/õxŽúò¸ræ#FîJöto<4[K§¦ý{xøK§öMÉ«éKœüÔ¨ó‰­—<¨{º/ˆž ¬_TFjD¦]¼¼à T® “U²)y…óM7ýuv˜ðCö­»5Y<]ôÁva"®1áÓ˜ øP#9ðè Æ;üZ°ȸàvÑšQeð”X‡¶.Œj`I£QEäÜS¯;¤l˹ÀSÏ¥ÒÎ}¿?AÿÌìœÁÓ…³ÌËbé 79‰f+/<àÝРñˆE5yesj¿ºÀ·”°3 Wi#%ZèAE7BtH®£2Ÿ ì‘Ô•öª3‰ù¿3Qð¹?ëgÞºô pà$M×é(°wN%ÜÇ™xèç^Ú²Üô€pJÿa òuÛLÊçýʳúÊ–øuRI“ÃÞ®³·ÚÞôÞäb“»«5Š^,×ÝÄdIÒk* nʵpŽ–‹Šq½2‚߃ÄV7ª5¬Ý42‡8”ÁWé´»ðRÓ{‹Cñ–†M·µz?úÏÂÃá;Íà7V@pÅo‰÷Ê÷¾,.…?¼<ñ$qÑ20(Ó- Ä4»íýr¢[â¡ÇKQð‡S¼+QŸ—>N©2”u a;ò)õ Šh±­~EåüzÚê‘ÆcMFâË6óÐŽÌÀd^K»@ Òê–z£17½y^ž#¯_]¹G©|Ûͦ÷I/ã³@ÃO•{5­ªBÕÏ+˜´„ÊCº|C¾›Þž:ÒÅ'”¯î—åÓª[ué“tÝ÷lâ:¯¾bGïÕŒV¦›¡xeH¤L£Q^þy¸à5º K¡Cw‘'ZU—)£V¢J4ôñº…—è}žë›»:Šô±ÖÑŽ¥}àuóLºžª8ò½WKËéZ“ /¬â¶ÇÁ—pg7 z…SPözÈ…‚y'•oê,w@ÇU­ Cö™ÎþF"OK “ñgCr—7˜ùË=Š Vª( ó¢€NöMïO&Y£>3JaÄe ùè½ü—ÑÛÅâÒäøáK_¨õZK¼GuHüR;sÓ ‚^™qô²ž7Ñûfñ =TŒ§›9é{%<þGÖÇ™¹ @˜–蘯N‘«¢‘AOGÑt¤qGf[¢»ÇQ_ÿ€ÂÑ—üIºã€ÏщúR0•/L,ï8Ë {¢ÃÖ•W†®úÿ¢ÓEý3YleªhR^™Œ\qä|Å.Ú"U)Ûåjdz•iYëÃsE†Ë«L$²üäÔ–ÝÅ1#ËFSú*†ë‡IW·4«®xúï¬ða8LzŽå»Zê{>£›7½9,I ±XV(z&ÒÚx™í(:8ªBð•üáýÃâ;d[MSWßæè¦_F2m@ÝK¼Àõ uC”“_›¹àŸT 7 äù4qƒû†fa·â¡»Î1QØõ0Û”yœ?G9G0ÇîZö†K¶3z£¸iOnöß±8¢K%ø­"&Wl_ðÇëpäÊöÊ3Ö]ÿ œFåËK8 \Ê*ŠcFÅP㈑w¤a5™aâBê*©iØ»U/¨Få÷rPÊ )«.qéo!4—¤m¹C·Ó.`ˆ¯&Ã{*“ƒpÚEÁÝ…ˆNüruÜô†4dJé:„-½\Ï äÏÃâ½uÿ­ŠR"ê{›'é:¦S †°_j±k7Ýô¨[ŸŠ^È¡¨ã”7´rô³ åÑ!¨Ó7Æ+1#NÁhÀrÅÐ8Y6«#ÔM œÝ[´†jDÔjø×Ç+#÷CG ˉ-ÑF¬¼ŒZoºBÇðÿg¨52„§—­*[¥¶)3ôd%^×Ïa'Hg©ÇÑZ^ –í¦-倃º goOÐ[3qe}@„£Xà!Z&l†¤$óTšš¥Mèö»ˆ µ:«¸OŠÄO(.×=­ ògAÖ5_ËåsÓ;Ð&.²BcÇ0¢» âžÛ:·Ê˜íÀ^œ-_÷Â{>ǺÎO ¥¥e•ØD†7Ýô–„V]C«rxµÃ‹R†þact×Nwo–9ñ‡@ ú ^TŒ³ˆô|"žh e&[¬rŠJO+ĶÒÅ8ªÖîéa¸ÔÁ£ Q æëJØ æù+9Ò‹¸ÑlNâ¥_,£é‘ÜÁ ±¨$â\,\2ïi¬¿ …´e†šG hJµJJÏå1f¡˜º1Àó^_’O°ßeþúä¢ÅÖ  —´‚s±9‰›FÀOW™¹~=bˆLƒÑ¡ýðPÅQÃFMÚÅ&,—ù- ½'uhŒÔ Ì’hUÊñµÜΫ ûä¦ßCÝÃu½Jd¨ ºÃF²xîGPb‰ßJ YR½wô¦›nª(`^ùО=òû[y6_¬‚ŽÑ€ÛYþtI³Ði<ñ1(¿Èã'ÅÕèKP‚ ÅÕsRIŒôJ”-ºÍg«ä!« ÙÕÍã©!%Õic•”ÂÞ2¤ÐÑ*%GHøM€W‘çÄe´ø\òü‡ù–£Ñ’†T'Ô¡maÅ£ÜÉ$7†lÿ;¥Õ“q¾'‘vQŠB6¨"Î*4Ù,ªnW5½'Z.ùÖ ñÅ8Z Î¥G‹@jW"‹ÒFtí*½¹B—Dà ¯0µ-MõúÒŽr–xJÑåY,Źé-©Ü©§ÌB£;leIj¥C€ú˯ñ0Iéh®l⦛nª(íÛ¤sã|&ccùa¼‰ A[(C&"Ê gEq#3,ƒ=Ì'Ls-(ÀâeÌóS„8ͪ Õf>zT÷<6ÈVUílÈ×Y ?h2G@ÿ™ÃñﺳjFtœ±@™i”Ì£ç¶bìiuÒ’ú§‘.u…ìuÏD«¾ŒJ«ab\P2ºš;Cf9Ÿ˜ ‘á×Qi¥É›(.–É 2\¥]¢‘%í£F"ßšY¼é-IŸˆ£w¥P>ÖÂÌÏà)ÔGÍÍVÉÃUá @³„ý°Ej4øìQèM7ýRÚàƒHyó›&ÊzQàXm\⾈°yEç¬áî€mëÖt#ÞÔ¢¡`GplœZé-—Ù;>x™”,Å|èéËp°Ä£b…k>¢ê±:|”gH>„]¤W5nÕp •“m²`FíXç±0“¢Ç"Wå&£0¦Bix7×;<ƒÝ…‘ ÂH˜"WÞ¤Œ@äÖ¥UU§OŽ4éâyUÅŒþ+aŸh <yiJºS¥í謮¶Hù¿‘Pí´Ó:®jË _uD±Ÿ®#ü%?ð¬ 7ý<ò΂‚X‘˜D1²Ý?_7Žb•TGŽ>+Ì1qßÜ»ézШ©±ù¼êʶ2GÜ ‡•oÙqèêç'ÑW•{•î?"£ÒCu+_ÑŒzÑ!¾Cª.ìŠFá—®„ù¬¨®ÆŽ»KX´Æ/ÖR]¼ÆV ’ÁSaåï2‡Èeža¿K}¢Àv4ciUïiU™ðÐ)MÓTF¼eýfhþ3[Þú¼ìZ—|#*­Ã ¤E …JláÕŸå’¦w±÷ÕŽu¶ìpɤ\Ο§Ò t¬KcáY­½ï¶b²,ΗõðåH;W®qÔ«ôø#„vÝdЇ4rÓo#܉Ô=MGø_¿©·×€Qsøî¯*âÈF~¹óó¦›~;‘C s®÷èð<*¾Ó*çà Ç3G œØÿyŠîB²Q7Õ=–|4Ýj€‚œ1¤"t€‰è®¥°3^=ÓyÑR"‡nQ›jÖt0L© ™èP@M!œŠD8¦ŒÊFæÖ“Nÿ'ã骮K‡† §O9*” ê:WÅ ºm$è2›A>wxê“îïL8z8}ÖkôfŽlV¤µÒM®É¤}ìÑÂ1 åUCFSàYQ¹W2©EèTY¹mÄÝã‹'vòUH5Oý‚ξçCqÿ¸LH Naƒ]•覷$ÜI7ôºß Dwú¾BtØ"% n ê¶R’O9¼ÏS{tÓM†Ð¡ÖÞ7nåé;|Y }nA^Ç‚UÝ-(wüN7Ïõáƒk"»* 8¢ËÑY­ÒÑC ×Éýi[TÌçÑ|èüTì‚{õÒ27¡aÙ!yK”¨-Z#ž¡; 1J ²Îè€k³{*QÒ!Ìó·ÒDVNõ¢# O³?ò|•B›´ZÅÉÿ;+þrÿ·u:`Ý’RC`0û]£Ÿ\’ƒ„si ¸hH=>I„Ü0³T8¤RY1¡Mèz2È÷mùßEسr P[«Gˆ¦¥-Ù(Ñ ö^‚ÊÇí6ïºì ”0s³Rå)7b[ú¬ ”«Y)ÔÄX妛ޑ$qÂQ–qa0ÂlP>Á¹¨[1éc ôÑ<‡ïµ:4ŠïeëÅ*OßÅ¢ V–>Tº2Š}ƒU§ Ë ÝÌÐN‘(ã’Éß•A}ÂÑïZZ füäó0>ÓQÑN”¡‘‚“!é8tÝÒÃB•¤Öí‰:ZÆÙ Qõ‘õ@­̤À›F¥ëP}Ò£ÁÑ­<$RåMþÏgü»ˆfGAžÚã· zžµAŸ¡Q1Etžá½"¶¤àÊðj‰P“Ī´Õ4 ZW?1ü½ LÎJO©ÁRçiíy?£&Ó¹q&8‘7ýí·/–興òò•ˆ±Ä„(‰n¿¤÷¾¼TD§eJDú:ÞtÓ».匾¬LãÝ6}ÕŠ¾HkmØZ2ý¹CáÀ4ù`#hZS#eü ‘íU ·:ý˨ª Ïóî¢ÇVÓcßUÑyú3ñT¾Å,´Íst–±™n§|ˆ*Ë}žØ\¼´EZO•W§hó'É }ÿí¦¿N9”ˆëÊ×/T÷嘈 Þý£ÏëÅ/&ìt Ãκ–/ÓLw2bÕBÏ0ŠÉ2ÖQ¥‹ö) Vedn™m©l&¦pžpl]‚¨.¢$ry4Ò;·A˜˜3ª7â]!Wc,f$—å‘pé+ÃIrùµ¦.Á êGþùHHÇ\GNkHG3¸×«òË ïIº\½šb…HŠ÷,¶ËÔ—M{þû•ÆlÓŒJSâ¯ÏÀ"U¦r1©báÒ%YUˆÒ¾”Cî¹?¨ƒÈÎT:‘˜´ÏrU•î±äMßNåqA 7o[Ñ2ûW\˜¤¶ð,‘P©@ñ lCž%ó›nz_òd‚„áñÂLzôŽž¦+Ÿ¾#þÕ´Lœ…Wtšåý¢vJ²…ÂÌ®˜¤7ñކRäîÊ€—Š’‚ŒŠ­ŠG~b¼1}=à´zñžQç,ãÖýHtÑeGW \9xŠœH6-ö9Òed1¾“?–@Òs 0ªˆ‚)“aèÐ#òÄüÏxžrêËp7$.ñ.ÌnèQ_ú`Ã|-i0Ú„WÚ¢¬¾&Ð(uH©|ñÛ^».rt ÕÔòÊŸF«»Z²l?á¿‹hÆuû#‡™K’îènŒ›ƒsýKSò„w½³•à'n£^ *ï%õ19½Ë‡Àoÿ¤íùŒ•Ôw]™/ˆNnºé'¨ ¹­ŽW§Íòn vXóÝsDwQåH ´ÓôÓ¦Í%ÔôGE³õ•¼Ó/óù»wVeôŽé26ÃSã@ª‹¿Ó»9ºÊÁ¥”wü·Œf޵[%CUÑåS0K§H¤!£5ä, ƒÅ4ûßÞɰI4lŠã3R‘àCÊeð6mQÅÕ‰ùÕ ÒÉ¢³%¾FÿûˆÈ?NØ{Ï üµ<Å–õ¹¡’Öëòõ¦äç;3ªÆÔlóKBÐ)GÊôJçÔ ]g´RGÓ¥?Œt®Ú\]PEÜŽqÒIÒLš6¿R䛾›ŒéÆN,£ù”.yj݇ïuìE&æSŽî;힤ے³Ä­’7½i¬ Àa½d…Þ°‚gé%.oóNÝ‚jÑ,Ü©; cãvÞå;XqQÜú+¤æ0‚rLº«Ñ ÅÞc—î¶BUB®ŒgÑ:­Ì<{†70QžþÛLáGÃq¦õÞ$1XÀR­gÅã^Ÿá+0 –;_Ag¿’T»0›ZeV>޽ê+‘›UÆÓ*+¹•u­Ò E²QŠÇÉÔiÛå²Ý5ï¹  -´\räLË#ŠŲŽ5^7uÓb½Në©´Ì6-lVÄ=…/D›˜%H×å{Vðþ[y 3ËÖ÷×uïeј.wŸºúó›nzmRUU˜gÅ䳉è°$ðG@3lîÏœ6Rfp>Å6œ™7²'×Dñ’†-ebKíÃø¨$­58,9/ ³¿ñ:¨ëüD„a@y Z18ìbØ‡èŽ oNmÀ &¾Ùf–hó2䣱¹R¯‹“5æ}VdZΚ†å$ÉTÎ/ÎàÇå~ñžý¦.ŽfüÊ5D -ç?6lò/Г衪2)‰.ê«Ü‰#òÒSqX6C+F͇Žw$†LÎM“hiwË9ò¯é9¯rÔ½ÜÓó¢D°é+Uè=¿×½ì„6pQa½§RmHo3¢#÷86É_EºéÝ#‰¢³ÞŒL`•ðƒ×«˜M˜bŒØÕIÜ Qƒ—»ØH<öaAжŒJ´dâ€OêøS^åÏôPkä7²œVÆÒpm«!‚´c "£³ % ‚®b˜uÃÓÓ§*5ŒB~AìÁpb°‚½/뤙žýúˆÇEîh eÅò:û¶íágéQŸjjŠe%K@mÍD—sMH’âðÏ7Í­\b²3“V2&@Š…ù¨¦ÈlV”$YKͶ¦E«„ÿ½DÚÓ©xg±~ût—I*âM˺ânz:•¯$Ñ7 (Þ‹S”ÐS”Æ'ñÊ=™ŠÐPN„aúì_¹í3î×ÑFÍ¥—×-Ã_²!7=ŸÔ0—¾êó Ÿ“‡®-–Ô´Èëþ›€íÌ,CŸuÕ£[ŽuãÙ¼1¹9þJ°]ºJ  d:t‡ú2ŠzÂ`i½‹eš›ug/€3"ŒiãÊpkdæ$>Åi¥û×1ëÔŠ•ƒDÐûƒÞ»ôý ™T®¤èÔV¤M\¤Ê‡ŒCʼn‰6±8+£ºÜ…LjËŒ¼Ä-kmðãô"¨O—¦T¸„5H8–£ªh2 ÖLæ?‘‚#lOå8N¸‰`oöKP­+™´qX2špù³ÌÁrImº“íÏŽ}g®i -—Ï¥Ô¡ê4xÎ4™i½8BÚ@‹å¦ï …Ix¨`rºÛnåûWʺ›[mñô¾²…`$ºrKgs¸UqþÞ×núVr°~&Q"jd‚•h 6››OáÅË9Œ±Î„|ž=ûfŒyœÒˆ¨9p-µ,j~GÅmU/÷Váï)Y9ùT6„ü’Y-T4²+$`ç»nú*_¤Ix©{"®Û$ùe‚šØ ÎÍ}EE•´µ#]Cs~ëÝMßAjË2MoF1tì¿G‚¾» Åâ›Þ™%#}Âh€â)'½è%·Ž%q½é’£hE;NPm3‡.ëb¿ÁÅ ‘ ÑhǘMQŪb.Õé,ýRŒä9„>|‰i¬ÅJ`°5§C”aªË iŒ~•ºÒÞ–Ò©+g¬Œ”û‘†Ê‘rxÎyÖ êRp¾™Qõ¯*¡G}ÞŒ\Gè×Äv[5×›Aêâ×.¡ s*}¦‡¹ÍçŠá …àhiï rºæuqÐ Oò}ÚåÿWC·rq¢Èa‘m©†Í¥’‰Zh™ÒPm\¯zË›¾‰º=›w¥è¶É‡MÐÝBiWîR•‡š²´·ÆÝô­„¶Y]e+ª-{8äSx>Âxñd™9Xæq²Z/V±Óˆ¯€sØ´é Sʙ枀öˆX ¤±¿®–)b^Fæ4’©³\^£<…áÐÆ•éü#O¬RúoäPgÙtžÔ"´ÓÖ±Q<&—ƒìsMÀ;T>ãçÐz~8e[2ÃGó4>(GC©Òh*mÓf@4&Âh7Þ¨ =ËCâŒaÔÂP]ÏùT±t#7· É\ÆÕ„³V·ªð&ž° ùMÙ‡!ʇȫ™Þ *§iž)g)x¨’}Tƒ“ ¸ØpBQ`ÔnƒZćΪ.•¶§T¹Ÿ¡oF}ÑWšêRaF{«–Å‘ð*ók(›à$ÄÈúPb17ýŽÙR!,ë»W*⹘ɩ2¡}ùO»Gm©¨Ô=vFL«D™FGI³LµNL·¾Ô•1Ío¡è±Úèƒ{£©Äf{;ëÜ÷ íÃc©oX! §Ðnç Ñ#=z§-‡ØÇÕ[/s(7pî_³Il£nÊüzwÓËÅWÊ·¦òÀ{å—Ó³‘˜/Û4x-çù;Mv`¼ø-CK Š4jÒP -à&R"û¥@ʪ.bPÌv%ü†bnf~¾-ÓçPô¢¸KMÊȧJŸi¹g£âcÍ[5œ#JC« )‡"+_G"|•%.ƒÇ¶¨-ã‘Qm¶¬^Cf¸m½;õËѦP~dáK†Ø B0”ƒªBKê¢üŸ¢oF}ݸҬa«øTkä³öÅ#”[R[»™ß%®Ok«Þá’–õ»³hSÊ"V›> qÔ>سõˆ<äÆÁR&僗^KÓêÈeÅÚ’Ò`–Ào!2ߥµz+#Q÷ªL½A·Úú¨°ž~µ•òUœå_¨ðæÅ›˜^æ~t÷‰OÙÊcŒz54¸é¦¯"·Âx[Жk\vâ½üùÓÏ©KÛ+È‹ðND»sÉäšmâgE!CNmFlÅ[nšd@7<)4¢~H‡b(CËÅ´—:B(ÃFSâpd9U×h~p¨ºV¾Ž¨MU‹/áÿ˜ÝàY¯©dép%ÑÐ>ß ½©VÑá€q2øõG*;‹•z{=‡Üj©–˘tëm§“:Q)§ÛZ€TÐæ«’Ö–ÅyŽvE–û<ÍÈ9·A]ÚTIX¨„FZ {HO9tw±<ýQCñô¿ ¨«ïCŽBõ&㦛¾‰öÚFÖ²3žc–®ïÞ4Ä{Çá8Kž‡øUôƒmàT«%Ù$,/< <ѯ¤5u©ÕËJjq%ŒÀëI«Ô´¤cfu!ÆÊ{Gà¹Óžëb§;|¸O«EÛ[¿/Н®3èFñËÉehwÔÁø)®Ç¥T¢M7B‹)b+‹‘¶–AµC~·¤¬êv9é/à¿ õ¹ün®'Rñ/-šÙÒÎÕås†–ÞFºbåଠù÷Ji ú:–7ùháKï¶™‡?Fåe;]Ë4:ð^ðˆzÔ‚ªæèJÙÌ®mUø ‰Œ)ä\Sf W 21ß/r0Áêo[Cä-ï8¡[aôРâ:zë‰ œ“ðé<¬H]Ö£0õqƒT‰mõw©ÛM¿ˆH5K‡oÙl&ð†iÜÆ©[:£Œ »0]§I1¤¨–C]º|¢n›¢Tícn¼`BUF%’gIÊ@éòúWï4ªLkؓ姜².eRÑg—nùHçûJ•½B\n@Ï? _éÜ‘HtÞUº²:sÑeÐZè £5qQŒW¢ïA}ž×\ŸÆ²ÿ¦O!ZûÜ*UÅÔc5õ ƒ¤¡— °áÈ,hé­°°rÆ´Ö¿u€_ˆJmÃíœa”rXzl`S¦5z ÓLÊÖT ^ƒ>ªf¥‹ñ(pHÆH‹_~ȨÁ6½'FœõÞ rÐ{wX›Ðç¨9“Z…nÜ)‚ÝàØà£æ)[¢ÏÄ7Ýô\¢ØMýnaWq§Á9ØÁÐŽÓHó» + ö üà“ Wúf:¦°sJQŒÀåò#ã[nGzØ&·†CZ—"’"æ¨ P±²­7´Z¤ ‘Zxžr»:‘µeóqE QÆ„WºO|H£»¸š´[±,\ªPöÕÜ^ƒ¾õ‘ ¦„å°Ù>¤-×%p™åò¬ê˜Ïsë¹×|Μ ùŠ»ÚŒõ!=P,Òu«tz\¶ûÇ'äaKšj2´ÈMüº:=jŠæ’<áÆ¤wL^Pi¯øø½_j¾,G÷ÄxÑDvƒ±¡Ý·Y`Â,^¨è.nF±dyûîá.н z÷OÑ,Ž!ÝÙ‹¦–[y–Ù¾é¦ë¤Q®¿€™wÜÇäu xý¦Ç;£€&†ÙqCo~€áàéó6 IÓ]˜©](b“\½¾Ž FÈsÃvÁ²?^óä2÷Æ¡‹UºZG•9ÈAïitzü‘œËM¹{(¹AìvâI‹ôÊúÀ`Sœ@ú«1ѨêâÙ!*ADzR–ј\™¼•Oü¶·¹à…¥Ò qùÔ^ïÑX¿ñl© ÄG¹Ui—ùÓà'¬Ô0uƒ$ jÌOO-õ©$Vêå#×tÖƒîžO…œÞ©º½6RD·Š F\(p:e©€d¢;c&<÷Éù(JÂusB)¤nM»1i[,tÐfá…ë@ SY›ŸV½›þ©•!o—ìðDk˜FÞmàŒÏ-oì™CpFa*àÙmàU>ÙGê;…4D@è¸)“2†Ý¨DÞQtÞÅ-–sʨƚC“¶6Ôo!sF¯Eˆ{¡…éþœ§ÆçK yû[l‚.gyf»ÏmDYž hðg¬V°£ïÙáÙ™­'ÈZ-LàŠÓ~*ÞH·Ñ((&°U´eCŠáÑ€Z¶B<õëì]G¥/ 1"e(óM†¼'Ô¦nbÔ/¹(v¥›9Ô³oœZ‡Ñé¼µUe4ä(Ç=w¥|Î o—Y6Ñî\oâ½ñ а/‡åY"´FW|N£‘•fµXuðkw`Þ;ÅVµŽÎ’ÞœŠD=ÞtÓÓ‰t×ó©V#»tPùðázOï\è`ˆ±Iòë(›C¾•è£Ê¸] ­6gð«q4UG±;xaÁ—V´ääY(«$;ãU?Ô R¯ÚzI*§Fêu)]öõSәה˘ÓP³ìÄêuñ3ÉÓÚ!=bØy=d‹‹”ðwÑ7 > +ì©QƒZÓò G—£·YµÝ žÖ+à E ¥«ÂÅ=šY)Él,Ú;»¯¥ÒeÑh ɱ R1€¨ÌyC%U&.7B^ Š?KªWì˜úÏ!]yC¢NBt’&ž][{9¯ .Ÿ|i߼׎»¯¼z: ÿÛ=¦p]>Ißôˆž}¯Ï+ÍÿJîeºÔì¢a´Òzå K¨U·¼šÕ°ã©‹xò& ßú…Ê®YúÿÐÆŽ|ˆTÆõ¤ÈÇóz1ѭ梁”ÊAMïYúYëx,Ö=­·´]Ó·DžÅänÞ(¡¡R¨¦ÜtÓ·’…vTÒ(ˆµÌ—É6¿H¯Ü~‰ M?–@÷ôº}bÍËZLÂŽM¬raOâvx³€ ˜éYω,W²¶ÚÎÅÞ×ú"¢A"A‚ÔÅmb*ûbŸM´Z4sïà•M¥Iâ)jýºüû€ê(KQTÊ}:`¿ÀªÙö9 úWkÀ[iÔ÷Ó³Qß{¤Ñâ?q·Š×Æy{^v^UK[.Ä×Y憎/n€ß­¯ ±§V9O@Üñ<&“_±xdQü¦rY.C&e/ÁÓFEžOåZ AÅ(Fšý —žŒÎ+B”×ovWÆK\º›?O4“ÿ¨}7Ýô5T®X*à²ì/ªoq×ÎéáÆKÚWe⽚øÝ¼£˜îá$` }8/1 ÃÏ‹Æ}Ù–±1§| æã°ÃT~džØ ÊCLÈw¨œ_D(]ˆÞÈX^OxCòæ× ëÝ%¯O£Ë¡Â¿.æYo®ª£òÏí¤ps3Ï`m­,ºçÓ³éI;<Õv™ÿÔ†e ö¼®ÜÖZt¥RŠþŽ%7ËË]Cz5ìÚô_%ur¼š:ØÀ%ÝVÎñÕdl T?ªÅÊ`ȤvúOZåM±£²¥,eÿª;³çÎ3¶ê[Oº„]U•úÝ'cq2{a˜§ôF¢Þôȳ•S@2ò‚è!½øºÝÀÌ™¿ZB‡4|afw×`ùð‚@É Vàº>£]YŽË;dË‹8ä{li8øu ŠÔkh[ÏU?§6Ï~(©…ÔÔu$˲¿v´£slUÿ¬I».•2L%4¨U(³ãCô°bš¢2T8Õm®Öì ‹ "<>1X¿Cuê¦/§'ÝëS{3ZÅù8y6;eŒÌoÚÄ2´²rÃ>iô^ÚvUá7Á¿š#[…œæÄÆUõ‡.à—ÓLг÷QQ¥›¼Òn£®¶Z¥F&| Yšäˆ Yù×£°#Í׊­Fâçó³u[ámºHà¾8·Ï›núÓ¤«Ý£#¬UñZÍ’5=Ä&¦©8T,\|âŽ^å’?€naô‘¿üJ¼EÏE™°R‘dcÀÕåïÑ Â3¬L(bï~±­Ã2bðTÍòñáuÃÂR程שsn¥H&£øò„s¶ÜÖ<;¤¯¹EŲühtå5ÈËd]4•õóƒîe—êæ`–nouQ÷íè©os!£i_¥áz©C­5oúRÓ:dqcá‘™¢Áï°"vÅ"gá½=¸©1¸y&ÝæSøÇ|äWi[£ 4=8©JeþÃò¥ÂQC£Ÿøç(~˜©½éú—u{ÌUàF¶øzŽO¢ |…¾xŽ îËM7Ý”HWòÊ$øDï;Ñkúƒ!| Ý2«]¨›ûx v–eÌÔsÂB¿ŽxTfÀ,­˜¶1à¯WRÆr&½T­ÿšaømD‰S4§ÎÇ1ø<AŒr²í´• ‡Ì²2´¥d-‘©×ß2ÎøjrhAÍ-1®%Å#çûâqVrf OålÊW^ÇWzFÎò¦›n*¨ º |qž……Ü”kûN ãkáYºq‡¯|wKw{0ŒÜʃ³ë² ŒZo2ø{kˆÖ»„|h+‰-.þ­#Xæ:ƒ~Ú̼†“(æªaa•H½%ñy[[ÝÅk¿–…U{l;¯ýµJ8Ìl,ÿ\ºïuŸÝ&›ü"—"lB#E¹6|~a妯¥g ¾Öý‹U(OXž+"8¾zˆ,¿ê¶FòéyM—è‘ "A€›²Õ…íu™,2ºpv´ñ‡%Ó ~(>3bý:¦Ek.Ž€ ™zšýuýO Ì[YD·"¼ÐÙ%Hf9ŸæL}Wç‡L*bH—æh¦ú¦kDžjˆB’’,©Kfé?+“ î8qh¼–ó8ƒT:fÖþi,nºéÅé£`\¥†,n¾mÜ?ÆFœ&4?gº‹rs»íË⪣ý÷Åíb0Êëh.¶¯ æËœ‡Q Srî,¼Wẩ§¤«—ä‘ÐtS/I"rt›©ÇÃ|rÆê2<×zá —x©”4ª”’4@ã5Ë=Æ&4ÐsÉ/½ñËú»)­—¹Ey>uœu Ÿ§mž(]zWä¸ãuÈ{•´ÆD(–X)z_1]­£KxÝkõ—vËϻׇ±ò´]½Gä{^9º¶ø­¢j  ª© ê4Å×ÍëMB4•i˜®ØÒ©Î¥ÄrÖÏ"’7k•Œ¹:R*¬ !¸R<"[¬gŸlmò‘'hõu‘-F¬µ“·[S°ð‚³7Ýô6DkŒ.QLX1x³ ËÐþÉýëÎK/©|ÊÛ†žï(MnGs$y<8×vç+{ƒqнÉ)¡—‰ PP  ˶ôl’7q3[W£Ë¨¥4 .m'85ØéH‰—)AÐo$ Ÿu‚е댲úJëä~,1BôœY†œ/E~þ´ªˆq—Œ­[¾-¿îJ׬Å~SŽªÞ™Ý±üFÚG•Q@×*ŽÙ£öJnË· ‘£^•Ó |Ÿw¯Ï²}@áË…§†à÷„ÓŽ}ýXÊ¥{ž/´ÕÀÓ_tkáß±­éAö‡5N§Â’G.R©udŠ-ÏhGž§¹äáÝQÉ‚‘&᥊ÒšÙÜbf5î&„Ù4hpYO_‡i2„/ëönºéKI#n\‡È{µÎOÂh€vþèN8Åu5&¨ù‘¥*ûÒ…ÊVYŸçäó«®F ¸ºírX\˜S-ƒÄŠRÖ§=ß½™%õªêƉiW6nÂäv³ÆNϤR«&U«P×µŠK¢kÔzKa®KŽ–ü*zÚb[,GîöÐT†}$™»ØÏÓa·´'ÈÊ1/:æøß4kßM”*©eFþEaºté±jÅu”ƽz럠vyúH<é^ÚbTt‰ù¶`sãÅÅK½º€¼S’M|ÚÎTe`þ0=4¾]ar+Xj>³¡ö„¹; O‡Z —(放Ž$!Õ©zóQ"ÅÐÉÒ:õ葨Ðk ºnÊÎÆaqá[¼tËi½×ÊM¯Gõ*‹•ù›Õ˜ 0:,›Ó²nä[1mþÁÕ×PĸXº¾bš»pÅ`k±Íˆ}5¹e™é™ßÎöiù]{•ýšS|†› ˜É±øY8ŠÙŒT¤•²+ø‹¸K tc¡ÒgjEmÿi—óçÒ§ÑLU©mä§‘ÿØ5DùÚ: 'Õíø9•î§)Ëüˆëzn /øVK)c¿¢Ex'×/v{&!c{ô'žs+¡¶géâ °Ì>î‰Ó=,ßyÃîàè_˜¼š+M½¯‘Œ°y=óì n?ë^ÜÇD£®×N"Ó¦åÔòãâì¼N¨ ^Z½ïYâ¯MjpqF5Ø8ºê¶ú!T½ œ²5Ë“G`ȶ‡e·:UØkÆI•92)°,ë:T±”#ä^Ì}ufŒµ¦â¹¾Ï@/;ÏúÏqÓMO¥ÚÏH¸hyÉ¥P0+|RùªÅUXü³µ.WÝ(æ’_nÝ1JGü&‹²ŒëÑÊ´ý ùbO X­g¸™!+@Šúó›3Y̲Ä]¾a`F‘#_AšŠ£ýÓÎÑè•]ßc }x|b=³´¾å’Ô jïË DHUŠŠ…±-œ+«†“›§pòh(ÉYƘ?ÅÉóðÀ~ªïG,o>æJ+š1\FwUóûˆ‚ƒž®gç}6¼q(܋Ϝ’•.ÅÖ÷-GáìDt,–B¸·rŽbÏûrƒŠÔ¹ÓÈLéi*ÎÂøÐ‘ºZ—£AW¶zy’2,Zµa†6³0`¨<—Áu6 Vå`rVï肞!Up”MÀè'ûºÛê©4¥ãWO¬‘{)TÀ®ÄúÂgöbç§ŸåÓ7÷@4“¡¿é¦w ÒÈ`‚KÒúãe^Ì¿zâÂà=r¬®ß6Îú®K2 j©^ÌQuF/òÕð·æ†N¸˜È(Fr¥æxŽÉâÞå"Öû‹ÁtƼ-VÓ«ü–§qÓñ%€tÁžÎæ.#D~4¤Bo¦±öÆëÛvØ?EŸ”,9kèPN V$á½{mr>úÀ\¯ŽâzsÈõ÷1ö‹ÛM›^ ’tÔ§QU»º%Ïj(¡’ôŽ /î̤½”¸ÇR+â©8,ßÑ…H/»’¨îh^„qƒ×ígí9;<¡/ë·& º†î•*§â妛fÔ€ªk(•Ö«tàWYUAhþJo¢«M\bé³µeœÂÒÓ—<` I®ò,)Ê€¿™IîG$F#/¶‰ý#QØy¸„Î64ž§^ úÌï?Èc2"ö¯ý¿é¦o#\]vd[dú^5ËÞ]¯þ–P0<Û±"uÇ&½¢Mîãá T4%¿ªÝ "— !v;”ªi¹>9¨ÎM›˜$™ª‚fôä4Ö¤ÅK.â0½¦¦Fõn` ¶tnÚ§¾‹‹y'C«£õA"åP{˜äU§=çSsX±ôMåÜh£x¸Ïß©ä )Ñ¢ÌyäÒ3 xbœõL†kÙµcýT÷¹c¡±0Í¢Aö èÚ©µ.˜Rw £Ú¬Â·òôA»(@ØO½€%CŸª{å}¦yÂ﬚™ÿïÁÈ|ž0z­Éeµ'àçÀP1‡³…Q)§Z5Ñ ®Ú¯Ä/×ú®¿“0¾°j¨ÔÓR]ªe…[Áy-UyŽc^ž¨NÇ Ö^ËŠ"#òSÕe`2¾&:¬z.Vë|ÅÑ|ê5®D«¥>ÏÃWõJw¨9lÜô³ÔYù8kM 6æiþmÅiøú´´£Ëºúô…ççì©98{6B}1Ý,ûþLÚ8\4½PY5oM#VÚ®U2ÿcÏÄ,c¹ø–nHbJ ŽebèJL£ é‘U"ªØñÌÈ iHK'í2Yn&:vèe7¥Ú'*¦nMû× UÒ¨úÑù鋃ڕÜÄ…Æ` ÊkP²r·SŸ‹Óg‡Ï5梡q¿#Âð-ë<Â~æ—Ûî­~RáÈYv¾±ð#ŠÉáˆ;ctnÖLv^ùë%¿HGæï"Ò¡Þ$tèzn¢d>ìÉ;œ~Þ;<÷9Eî¹òU §EKï¥ît‹8¢‹*½*Yðo¶(ï@èRÑÒ~°»ÉÁ*÷Z©Œê¢€~!OÔ‰¯±ÉV3Ьo.” nË"BšY Þ³…÷÷Js©CópLoºé‡¨ÓÍÒ²c™QÂq(0‹.·qð\%‚Btš oM×qáþ^H»‹{¾•®K¡6«S‚~ÉÁ¸X¼°¢4ÛÁííÉ3ÂÃì;Ö¦vÏojA1fÝnœƒrºH¥n’¨Œ7\ \Q σi9ayô°Àä¯-|ÔYŇœ©{ÉS{ „lŸG{oˆõ½ú"²—ª`'¶˜Hh­4uúãq8U5p(Ð:äg¡L;ßE¤…#g¡}…5ðfz$xÖméÄË|ô0Þæa”Q7A ò,È OÍyA;E6ë)ÏõQcV.]<89ü½õ2ðÖv Ë`=TSø>÷E=ÎÈ o«<2% ÜS5Ì䎬÷œê=tI8ßêKÕKc rM'Ôé­@D¢Ë«Î+7‡Nˆ7»u |ùZÁ£p¼wȪ»ÄM?Aº=¯(ÏK‚C•zéæ›þ~–‰¦S@€µ²”…S§2±ÓÓÂR“õzK­´?Ö_D­²ï–âBšibžÑZ’lñ ÍóÓ4óÐt'‡´‚ü7–)*¦Ay—*&|L¨ßsIg‘Ô)'¬iVÃ.jü =t=ñÊ_@C Åx’ùÉf6Žv®þ{ísP<_;8Þßâüá¨>ÁâüG„k²w›BÔJ¼ZGÉM³å hï†V÷üÈ@TénbE,àò8ßæÒ$æ@ÇÑ\Rünöœ/7LIV¢î°ºt*~f–Ñp ±qZ£h$¼:|è™þ0‘Y× «› Ó. êcQ(åŠþ¹$Å5&Ê%Ñ9?¢Qé’‹°C†L#‰Q-[ ŸpN\â x@*¦rZïeñ7h³ˆÊÂWVs w-jÓ aj2Xièhë{wvºÒä¹ ªøõµAˆ˜PÅÔTΧ„§qÀ¶ŠYdÍ¿R’rԚѬ¢ÑÃ_«ú×)TW€¢ß’bj¼Ñ‹o(Ö&(d >#'¢$6¤C÷p¡èúPßuÍqzypDá[V:öeq’«;Eã§ á¢;}³WŠ®)¿6?¯H PFxÛ übícð3on–>õ¡º{·€ä»Y¼½£à<ï0V} +@ ˜L}°É5rËöÜ ÊÀZ“Šïë Ãš °è×fR×DãÌÙ©Hj•˜ÉSßáiÙp2© /žÀ´&&Þe JÃB^ÍJú‹Tú\“Q×ÀÀpm5Nùr*ë!–r9«>ȪeP:—²˜ú¦ËúáÀ@ƒ•R@TòΓŒ$×zäÄyXOÓ21ÞÜ~a6_MGF´ªr¼éWR9úè”^é ^L0Y!{ù’÷ížÐÐ|¹zzD2#Nmž” 2›+µÐ£%5£2#X`Éš˜ƒÒÿjùNq5}”FÖ,T7Ò8rQø¨ÞzBN«ôTÃHþiº‚‚9†³žûªƒªÜ¬ !6F佨´w싱 ¾Öƒ¹ŒV9Þº¶r.º2Â,¿ë0kmk×`a‰ô~ZgÞ»k‹’ ÕÐi: êy‘éR#ž¥e/cDzÊІ¾ám.ÅX”ÁûyÊçM‰XOÔ/ò.6Ï"÷ø™È²w‰ºá¡S´t*Ë(â³Bõ™…~`Œ£° ]Œþ³\å²È¥²—²h³Ô!â&íëÅ¢#ÁË"öyÚŠj;éð¿é·“ºFßjDg[•!æh~©ìiç$Sn— ¸Ñ7À° 3sØÆ9«8ôƒL Î²Á ÞôÛ‰œbä QhŒëµ–U Õ)FòF pÌã¿å½¾ÜÒª…Ü|Ö¢kB)[ —Ä NTÊðƒ2QhrÄ1Ïm©šü#E …†\ )ÅgÚÍÌ4µ,$:¼!Å<—ÿ¡ù/û‡§tzËJÃXÏ( “Yæö¾î+­œ)`é´ßˆö³ÐžüÚÎ ð›j8†[Úíé3P9B›êŽ_mŸ›Þ› Ë(Uk•i1•Ñžå2¸¼ºÅJÆ·4=#×"†ÚJiÏxêÏ.(ǘ‘ëÀIAOSNVØÇ)vƒÄ›žo¡‘ÕǶÁ )šKÝO5nÀÀ%§[iV-ÛjF'é5Ù‡Èx½ó.2bfÌ&ìŒmv·ËG§JA(~»hoú]¤¨T\ýë¨l^­‡ó,<Þ¬],JB_úÐ>a¿¹é§ÏëÓK\º½ SÂ8²¹%i¿‹4Tˆ|“‘.W2q†j²0ßeÎË ß ÿ$R³IVŸD]SçgÎØvá#„Òhã.‰ ‘”\0#†%^¦ºTN’6mj½#ÑšxëNuFí0—]I~ó-/ÌÊÝ( OgŠl [ìÀÌyw(2ëŸåérË÷•ú*i³^µÀ† .‘®ÊÃ5Ô(–ã“P_4Ék’=ŸÀA ŒjÒÙΜŒœRrÃäÏç?¥! ,¬aÆWŒ¢N¡*v^&~¹Ò±&é òºj7p*¥£¦PáËîN×[!ÿ¸¹·Ô\Dè©”zsÓß ]\ªyvŽOª¢érWvZ– nV7Ň.ëCEVƒ×!öh³˜ñðù´±FhyÊ´\áhKƒ3*á4¥¯g,¨³Ô RLõ|?çµåÒ“ÐZ¥©é®-œIrœZà¦= Q·w$‰Ü¸å­ñ( ÀŽ©¶7_r(Þ‚§Ž3ø¹ïtó±ÖjX¨ù…¾ážA®§ÉîµÃßx¶pQLãYj­&™ÕDø¿†JÿHÞ¼ L¢‹§Þ·¬îÏd7+œô`H•’aO¥Ó¦€5™j•–kNÇðƒS¼p†ÀqOç¹>Ìù‹VðÏ‘>_ªvZ¿è Ζ*°!†a£ÊìB—Ï©ûùýÜõzë{Ý“ðíÛȹl1[])=‰°=,CTbBËS‹¸Bï Jߦ¾‘JœŽ9êÛФ“×6¨Uz5ƒü!s®Sý÷¢Ñ/€|ùúysÑ`TG” ¯ö¤Ñ—|T,3㭞úÛ}Ejöêçj IDATËýoÓ³ßáÉ:@¹è„Íà…=ê{ÔD pZ–¢ DR»ÿÇÀó@vKiþY"¯£,¥·R¹JÅSñœžôB·T÷,)³K·:n9¯ß4[û6Ó:˜o?y>t»€ý­ýÖM$Òíþ骼¢å%Ïã4¿‡Soñém:º¨O÷Ñ‹¶Mà2”×a—>@{ô]ƒl¡z´ ½ùÆZJ„åÕ:u0ÿ½ÈýX×tR¼Sjg8ªÈ/a^ǪÔfjº„‹7!iò¾FÕ³r¥B5åû€ãÈjÌÅX•úxv¿é'ôŸØú é?AÏF}Aõ„œ¨ŒF;P¯ÑŨÖ"!åv-¶ÿe´Lû©–îÛmŸg©ûÌß‘«`B£§¨[¯[*ƒ$’Å@L’‹B:­ÛCê#^Î{¦â•HÚ¯VÃ4ßô{‰‚ýÈ$x¡*8àÔRzý²>YGïá^éœÞîóÅÊh7&nÕ ÿ"_}×îÐAÛò´HØó²¤ˆÞ¤ýÎ tL¬çæÒKäC òŽÖA-}7t_× ÂóÒêZ^H¥,ÞÔr v*Üýb-:ûŽSým¤_=ÿQØU°Ì• H5Ô‡šÝÁ8_­oƒþ7³=ð3È&ìwMÜÉ£x*Û׫ n;¶§g£>pGpp¦FW¶¼@á5ÜeTmùâå‡Ã¯tàó‡ ˜Vÿg*ý£åLËâDNé x)‘naëŒzJÝ+Ž æSÎàó‡=Ÿî›Fú¼éç5¤Ó›þ6© P5é£YórüP})a2 ç!²µø"ÉTcl(áÊ]Pö2’¡Lµÿ¶†\ÌR‰»´¬èbm°&pt¨R®:Ýt‘tZT‡6U,§={ØÒz«jÜô”ß­±\E9gë=fGÐôdµ¦¸nUÆÿáD¿eë Ú!ŠœEšÀ¯ª´Á ™²køžwxzn6Éz5ˆÁ'çRÆ*‰ÑîŸ×ržsÊ%Xz §‘Î}éFKLOÑ^É\ƒ¬㟃²i 8±€·6|¾‡sx°ôÄy¬ mÊï$ÔýòÝ”©¼Þ¡Ú¹gƒ÷ô{ ¯|óŠgD‡+¤ºÈV ¸Ñ e•óÊVhZ×sö"uAzΗ¨“'ЮwÞaÐÒáÙ`ír, §*m0É÷„¼2áô‘Q@ÚOâfÉFÀ³È<6«Ÿ™ôÞ(c‚è"h«y72VïÍÇöÃhÒgìÀ}Ð^C|6ÃÃÿž| |Sa¥ñïð Ï~£•Ù™äJ®[½dF.ÅÒJ cR¹JüFm’/S,§`öv|$œ‡Á|ÿ¢˜jç÷Þ‘4¤K4&‹O}q¾¢›Þ6¼X¾œÓ&ð³uƒîPÚHŸºOAsCk<&ËŒDHåɰÄÂY~PÇÛ+±T(O’°0&P¡FD…á!ñ‰L¬àè´`Úð4’+´Ö/±ÎœRDÃy{ Ô„¹*Ñ­âr¬rlB¶;2\Åb[mÜÃ’åû³¼—E[MHÔªÁö8bö*î“D·bñW*¡\ŠW­v zcÖÁxpo?ÓÚ ª€µºo4°øÄ»û}bM8(Aà\Š)¬Êæ®ë™)בŒú(é8×óÅ» ‡z¤p170âg}Ázâ&‚uFÜjuÓ±T€¥T G±É§rx2ZpÃ#ê•Zsíõ еt] ì³"`.²)¯Ñƒ;—+í¹e¬·KÉzè¡Ö&Ã?hnYä„X>ñucL9º>m¼Çí¥pWPJSë™À7©\…îúÞ¨íбüÍ C±$±cXÊŽX޽ãKCðvo‚ºàݵ€ÅXª¯Å 8 “¡“ ß,°á冹˜`ùENàºòšR~ŽO@&¥WçA7x©ÑTÁU|®«Ä¶Ëè³ÎÐ,õXâ6øZ_¡(¤Ó·ŒÅ¸CmS`“„²PÊ%@gûSm¼k­òWű r¾É¤†ÈeVk%Í÷úÈ„´ê… €ãºÁÍ2ˇ®²IüÉPÌfÎ1°™h*HR½:Zy…þƒPbIÐ*™Æ›ª®T•C8I ‘*õæÞ]N,ßÃŒ\åWL¦Ñ܆?eÐZ¥Ì"P$ÊGÕR/ì±À®n`ƒ‡²›éÚ^ÕöÍÚämEŸ+_Sísñ‰$í±KÙ5ŠU¾¡fƒþâ—y—XÖ/¶ó­Ìœei×ÀQ™f®3^È–0Ãd}+x?9ýRʨºÈ£òÍ€÷lõü=œJðÐ)`êÜý0®8|˜'44§Þ¨€ô_ ¼×÷U»ð>­ËG&íÚ¬K™òÝbdz¬{Ç%}—°Rw¡_œ“йŸ‡÷úœï>!+JÚ.i=]‰R} 6·¨›!ì€w»L K±ª<9ÙÉÃÝVî;›?…¸í!Õ ž8¹£‰Z_•ÅGÍ_ˆùVÒqšºÀ íA³н*iм›cLP¨ž ·T˜ÇÞ²F„ÌRŠ;°˜hX>à&r à´Èà-…jÄñý=OêÔp)PèòŠÊdÎU±â~©,ºò ¸iH|S%&œ÷Î)?ßKÏKàê®Ò]vGTl{á@‰«̽5[D‚ÏÐl–oëž§¢ŽbÕCg¨“pXkæN‘ËCë"¸žYM¥6`ʾ¿{¸¥§Ve%4sÐÔQÃÝ]¬Ù±ÔÐLTˆ€\‘](4ÿÛø©£¿ÕÞG ¤‰U®E´ˆœ™syÊm§dê3¢Ôb¼Õf{uSñ`T+ýÏ“û+kŽX#­‡Õ‹ pˆÁL:Å|·"AfÌ PB,Ñ©ˆ‚»j!ï–&7þUwÕ¢€+W(6\±­çE¬¥¹žr7{ØÃ† ¥ÀÞ1Ükt›Z®`L±ä;×F«’X[ &3] fká@ॊvP!_"›+@iW¤FÐÃWö-þ¦+Ù:ŒÐÄ}cNÂØ .@PÍQÛQ~[‡­› kuq”Ýý”%–ß‚¹å²œâ2e*°äÇö0ZpÍ]Åy±s‹`õ™bœ µDÍwÆ*Ø «‹T¿Š7Jn# Mr¨Øeº (ËdÈ oKí[‡àÑ^6Ü¡‰T™cŠe‰¾ 4=‚¡»×„ŒM¢4›Ã‚7Ï.Ï*£‡…ôªjY>R]»&ƒ5©±± SŒh]P5i#Ûá™!:€è”LÁÒÕëV‡QÌI ¥Øä«Öæ Tl„ºè»ìO9“Y~µ€+e`˜ 3U#î¥ëV0Q€¯¨SqßÕ ®ðVŒR Xrê ä6&ø6]¼§™UåÀwíY.‰¶ë"—|%k­J–Kå¤L|V‰ŸÑ{“vY‰r±¶‰BËæ2Ui„~1a!l)Pu¤7Ž#¤ö¯àÔ²òR/≿„%m¶,¿¹‹ªÃæ×­2r“×C&‘.ÝÙCEZ œlŒbÕ$™ºåǦŒÒíöVŵ »Æ‰íNÆA¯ZI­kËT`kqLƒ"Ô Ør6§¤ªT+‰ê°±-§À° Ý0¸HË€A¢ÐzPt͈ƒd±$˜fEÒ9½ÏðÝ€Ÿn†}¹ØE. ‘Qtç$¿”3?;<Ó”¤=@Í =²¥®×-k³§Eê~áÜ€íµ*:ä1 ³-™¶]£;%3*ßÕºÈò¼oÅXR¨%JêJ:2©ÍüþŒDSÄ TÛ]™^ÀS;›œGˆ”C>µ#TOÚR¥ú­÷Ãæ.ÃÜ+?Cͽëí)r΢³²h!‘ÐØÐœP¥dSUqi¬ÌtVSêTáA‚¾­¥±’vµÕiõ\|d'ü‡æiqþµÈpVVLmø×”†=Ÿi_½ÕKÊð£÷PJtÈ#£òB°d4¹Ðqþ‹ã,jR6—¦®›Ö}ù-;ôË©Pv±Œø¼@²Ê®ì%PÌš2±ŠÕ™$Ù‚áЍ¢¿U­$Ë F¼Ã3º;Š¢ Mfvþ’µÌÁ’¦;tWs¹ˆPÌd“ˆe˜ò‰š>ûGù&é*ÙWßpÏ.Þ ^ÚѸÄòÈ Ú“dMˆ[Í­¶²§ ÷0rpµbdéÄ—ÙËIéX™Ép¹Jc]³Ï_•°æ2’‘;l!Ä -Ÿ…)RÕ¯)‰QÇæ ©Iš[’.k‰„uêÅ6R62QýGµ/¥Q².±P ˆ”p–9˜VÏ—÷tÆ¥è]õ¥Ò*G±‘åc’d¶ mË»”sÄfYgº–õ©õ…·½<ë:RJ·Rfh2 Lj­¼¡Á,€Ü&%&&Æ'è1ô#)kM_y½…Ûå—ØÇçp;ÖlßýÃKAŽL¼N$wMz‘+ù…RA\ 0¤ ¤—ôt“ަJáq¥0>PP+öjoçk4â/ËLëúÎØ)g¯€›éÞ­°K}¤õŽF #þrƒà„–]ênýBewRÿtogºƒVF®ŠÜ™’xàAˆ§  Ç¦ºRiÕUÁ­‡WÀ%r°W1uQð­dÈ*¢TUz˜oPFGñ‡•3°ñÇB¸+R9O€xͯꕬƒ•ŠŸ,‰E±"yBE²€êÔàˆq¥:+…Œ‘[B·R†C›Ð“ ñx̸gK]õ‚‚? ï+Õ]<dàš;böØŽ …”6­7«ºä0.iòëgÉ›ò¦77höu§9 ®FRû!ñ2ІY­akIû©FÚ0ô -*™€~éuZçÓ' ¥¤0¢ƒžH£]HÛÝýšE(Ìž+†i‹äÊmëT x FSž­SVùQ›qQ÷º.€ ò7*r×ëaÞa~Îðl¯Kfd¡BI©Û0G%ȸ(3„½vÖ¨Hc“Õ’zn°Ô^VÄQ¦•~1]‘åBË _YLyý® •¦NÔía¡‚²äý&ÐR Ü—è$‰Àò-B/Çîö„ÃT’iÊ~!ïvªÈ𝔤¾àA¦ìV|ÒqÑÉ KK<”ÑaalH¼İÖÛ'x©†®0UâoeÕVgSx©Hµå• é¤ ¦ktÐ$YåJ0'¥ˆÛV,Y.wŠ–HÿYÌl>Öb‚¬‹’tÁÖî$árkÜž'ŒZKrޱÒGú!^Š 1ÄB,CŒô`Ð,þËCÌL[ÏÝU Q¯`Œ§RBHÅTÔ†‚sÖá¡D»¢º¡Ó;µòEÞ¾q#ûô/`-a*}°šÄÕÄ*Ì[~ša!C~¡d¾Îð„ÝÛ‹5ÐK ’ãÉ(Wò]ƒ:dÿ®!a#k QEQTáÌÂ]ÃT«JɪòdÌ-E¾t— ez…^ª€B³‡…Ö\ïV¼©WSpã“J`¹o³ŽMÉ1î8ô+uS/®VRÏFÉ“®&™|˜™‹¤ŒE!âœBô?ÓwÒNoQÓÙïm]6“Ì0P ¥˜ciɰ²&µŠó]v>uaU‘LšÌ´¤2K”äÓ4~dÌó7õ IDATxºd‚I#Š!œñêícr³!oè©G‚J¿¹"¨nµ‰Ôzb¡ˆ¥‰IÉ¡+Àµþ†lÚebpLbŽøàË@u8À¦©¾\1‰ñ •Ô\GN“/mÜþkg†ÈÌ!ç ߨð/éò!ɤl¡ëºn]ópnQâ&ý³¾È<î3þùW¬Ž eÀ* ÊΣLÔª7*H“u—عBOŽŒß›·lyÍØYR¾F` =_TS¡ÔrR†à—ªÕ/½J—Ë:€ò$+ÅȈ‚ 7˜I¶‰å#;ëµ'ýò‰úúB<œ@±@öŸ²ØCiÐÖ³êö 'Z’,úe¹8¬ï69ée¼4tý¤.‹-àvî„ 0àß8Ö™DAm¬û‚ö×¶ló—ŠèZÝ­üÕù% ªfÃfZs3~‹“ÀÖVbB•t‘[ÌvAXÞ]Tj xA+AMµRûà!¤Ë$Õ±†ÑCEÄvÙ…t—yˆ Z<š €P‘•þdNEüKíp‹IK\kÎCuºT¾ëI`-×ÿ ²¼•F0UȬÝ1]ÉÛµ ]skØÚç±Äûš­¦&j?…è4F<Ь&zxTéa~A~µNIý³¾è°Ç/ ,—¬DBŸ½Âw½z$(õcõ*ž’®«â‘ÁB>ÜÔRe"‚ìÜt¥Ç¬Æ:< >/é¤ ©yhbz¨B*ªˆ¤7kgÃÎm»² o¸e+5k8^L>>ÐëðpóÿÖõvG†õ”à–@IðÑtiQã´üœ-fªåî|.eó MEç"ö½9u”eÛ‹Y‘*]åi4M%“üŠåJHJ|„¸ä_~4¶‚Z Ëh±,ØzïxÑž¬ëèy«Ø2,…J£¿ÒöêsÚ’ÊPH¹Ì”jY7Åbæ*r{wv-«@reÎ!§®©:lÒ¨ÖXgMáP?Ñ’´²:ÒÁQÝ:2/…Ç¢-Û4Ù!×ÅÚºÓßí©8Ö•¢F ÌÞ È¼Q¹¡A!=kœ}•1 l ‘¤;Qçé¤4Øh‰roÊò]q–õŒ–Á’î1gŸÙ2répØ|0ÃPƒÄF”&~NÙ CTo,í¬Ñtpé§Ö ÀòÈd¯5ÀuãÆdŸÒбˆ‡ 9ô \þ.å˜û\M¨Ñp9aÛ9͈­ƒSÀIÈ2·iÔ )ÀËkõ±xdžè4}×Né«{¨0dªÖIZÆ œ$EWKo×Ç®¦%Jc—çJcEÒ4EŠwÁ¾#`"a¸äS(Ž©/ÎùIvÉ|…±tJ ;µ(ã:¦Ë%J# Ø©rbÜ?’Uf >i˜”¬nªŠ‚J4ƒ&BÀ)Ÿd¦Rt”IêîHrFÅx‘Ð@Y‹ë<Þ²VTß,cÑ¥Ðð^*±ëЩˆ4&z˜ÈS¡ßïZñÏ…£;«Õ]ëçzV«Fª.èf))?Ò4SïG.›IrnètÎú37lÃf6™%]íÞêax°Ž¼ë²–ìΕæ$žFb[9¯µ¤c €8ý’Ì,vfWºL­à]¤ ›¶ 7àîMùà}ý$ 'I7”‚hü¬‚:ÏFÈçëü]¹NÃQ“¯ô]©‘e JË•‹¹JÔž—™•-%ÃÖÙÂ䱯k7t$á½Y׿¤» ÊA¢qáav³;ÚV˜¤ì”†Ø\‚)ýá c/óÂ^¦GýJP]6X’…•§šBï•P¡d+Œëñ,+¢·U+‘®´±)“ª—„Ÿ%;1眼šdŽ6g/-¶µÒyÍæ!¨§jG½|Ö`Qu¥Ëìtu⃒<Ø[äùä˜èH³“°ÁÒ /•î·Ô²6©õâ™)Ÿ˜PuÄÙjÞ…>SôV@drV#¹³nU ÉVqõŸR56hq3©J$[ضéÞÈ;Ö9_ú^‘`2i*Ä–qIÁù;?@C-Õ=F{ê%k iK>¬5$swkª Ÿ [ÇÞÔ0Œ‚õëa{–gdÆÛäÍé(wx&%JD¥‘sÿ¨ÊÙÖn°Ì 5 /u›*) ­rµVL9Ø>| §µ1 ôÖ{'‰E0—iŠLÊ~ c ØÑb¤Sb ɵtw(™@YYà[¯ó;ÚN·G•.%¬_4pm¦BËh“d¡†EBã1U92P»àNÌx~¾Ü0ûàšUœ®ôÇrY朄ÎŽER3Áä¸Èš£¥P6œ[¨)¡ Ó-É“Ã8³5-Q(¬èÉj$˨º=Ì6TT¤µ:V82·¹AúƒJ`±'%„h¯šm*„»°H Bâ¡è$–Ffc6;Ž“¡ïXr"‚u¤h¹zr ”[¡ô•QÙü.×]ê`]òÌL+ÀŸ§ÌR»%ù¯Å®”²ÖHœ×iÀt0ƒP b•å7Ó#Eþ¹ð \Þn/LxbP­7¯}øÂv‰³X]°ùÕ`+rÓ7R(*âe–Í(t¬¯ËÞ_*\ ±UksØö®|x‹ƒfS#u½pÛoÝáÀ²ïÔøFÍÞ(Vop–k•mëE2êúrNOs) ›+Õ2ÞÃØ«âÇy9Lä’"ù²éDŠæ²A- ´bNk„0äu{)Ý*€²zÖ¶+D0fSÒ6‚P¿ÛÃl@É;ÕAË%6¨C „û9Ó½TL¼sÎíÛ8¶…v33E1I ˜‘ ”?—_hÈø¢PZ7Á•Z7ÔUîàô ÔHÏÙó%¾’#ж+Ãá*4Z¾³ª BiŠw9íÆ„'⃔ù&O„ÌŠM'év­ÇõÓ”œ–¼Óå:Ù£×›®^M¸-\ /”Ý@/©óT7é" /8×èà%gî )G¶í3¾-¨ívT“ƒµ^–V:ÒAÐÃ]p}f·ú\ˆœR7uƒ­ìCI}( S'…ÒD>ÿÆFÇæšv¡ú?ë3ëñ³ú±Ôê²?"oÆ’9B tã)˵ÈA–A¤¸ ÛZÔ£„µi¦f©'¿³"®œÛP‰‚Èx.¦¬Ü„’& Ù¹²×ªŒjyÙûO£„J诔NR=¾Ò)=ñKwõ×ù˜ˆ›óõH¼tœ»åöÈ2ŽºŽ¤·˜W@²Us˜5n)Ïe~™¨HQó®P*KMšë›TDh€²"62Ã2ùP ¢ééÏmÃZš %´T2x9l!˜KëÎõ¦ha€uö\/Fqž’tw>]WÄí±’ÕGu²qp%Ƀ̡,þ+w¥'´ ÑU/"k-ë\Ã(•+z.¨éqù®´L•Zpm ÉŒ×É“Žm•\iä_nÔ8pÕgßC·›µ%¡Òó˜YZÔ²sü³Ü (u!g¨ß’çz;ca·Ý&1¡FP¼Õ’®Ÿ¤X[õ£”rÉ÷ƺ3˜”ºƒKc.O{•ŸÔ.ºç@ÌæÛ}‚!âWÅ…€0ô¹F1¨òç\(Š¡ñfzΞ `©RÈhü#S€Œ*³z KÚÐNéÀn>ÞÒëè$˜–N°4Ç Ægýµæmœ]JT 71öRÕ­°Nó¥8­T@¹¥ÉTÉ ¦:»y´Ýa'…—-\ן)R ò7"‹fnTú†Vóù’>702ñ³Þƒ[Æz©Mä–qy°q÷ÓC¡\+Ä=àXï'ŒGü円’ñ¨Ñ™-ž¡”ÚÀËPagÌGVE”å)~ˆüÐË’;Ëy›øxˆ#šZЍ„‹ *ãe«æUÛ$˰’ Ud-.L_sj&1“ä¬RÚ¥I2ƒwü2©¤HHÖI¯ö…£Çô¥òä¬07kæCÆ"ó,%fÉò÷02p—¹Èpp—F,ƒ(VZöÚÉÚOEfEln­[ÌË›9‘²díöÖÃò†{ ¯–iHæ“´Ê~ ÔÀ( ÉÃpO܈_k”N¦¥üß@µœ”{[dt|Ç -tˆPåëT¢ ëd°,—Ã3Ï77µëË„ÆG #Ö?90 äÆ/ÉKµ‹ cf…C¹a˜¾6Bù7-²à#ñì$ˆ±©ÞJຳxW]Êd©ùŠÁWwK˜ÚAXOa™è•ùƒÕd2°C“ÕFqãU¾¯ Üå u(˜Jäcñ„ZBw†äyÖ‹«QŸZ`ùà•ïa>ÀuÎê…K— ÐL°¹Uê®#Khf­+* g-& .瑱,Þ/µôÐc¡}b)Ñ YR9!ÈÁªý+~áΟcS\ÿH]GCj«Ô}ew :‡S~ òËïåJ(Ä”PÖõ<2 ÞU3«Òn±D6 â¬tƒe_œõž×]jÄb«> bSÑ©çmòY_@C×övkÂ]ÈqãkMfÀÄXµ´–¤ÈœÎkaxjÇ“¡¢©<ÇøÄƒ>ì$xTk¥nÔU »²áöR‘ºÌÐâÒµæF´œ2=Ì*ØÙp¹Šd1ýÔ·qæ-ÀÔáç×í] é›ZÓ§;C6wðå&ŠÖQã+&J‚Jbo…Ųoïw.`PA ¨ 2S¥ 9¸0¥vþLË4-1píÍ·â—ËÇ3˜äYôvb¦ë ô°ÌÁõ%Üs‰‚^2j¹]v‚Œïçƒ à*V;FédõMîÖ„æ ]8i‚kö]UZËUÎ2Zt'ëãöXÇëZsæÓYym¶¹:ÊŒ>꣄{(¾0Z{Ô-7 I¨j·˵ÿ縭½›òÅ£©Ò¡)lï„¶®Õ·U±R* œ`Õ *~u£Ë£%›ÏÐN…ø G³,Z¨8^È"8Vù4ÒtÀf7sf&iÞlÞ[OßWHŸ Eìˆð|mù´]9$3ÃLÚxIQ¶ìVÌ,2À£8ü2g-lÉy%)–å-·yCåHßä·!ZsïÎh‚{ ÊÅU·*ä·q`: 3ROnàt¿ÓÀÔìEŽß]HGó¶Ÿdh 1èÌócà)™²þ>EݵJ¶‡9ƒŠ±TÅ*A ´€J Úè±"2ä …|¼kíƒïCPó±à˜n¼Ïàìg¥‡%®?ÛxN‚¹ow¾EÙtW¹Ò%¸šòB¶à®L`ÙWH¾mðž ”âšÒ]6ÊŸJèM‰BÇÆÅo;Å öÇŽ¹jš¬3oÝõ0¨¼­>Z0ËnGü¬/ãAÃÇ®˜FNµ·flY ”¥LÑZL°d•ƒxе2¡†è*iË”=Ì68~üÙ¸¡g9‡4($G¤[ƒMõò´–ÖëéB$%K8²Bhbj‡³žr=‹H=,JPÞ“ðIk縸…Iô“þX@• m´×>Wp?ŧgÍO¦8ft÷®]R)ÔÛÁ¨§© 6ºŠ¤ÿ\n·n‰œŽÈQ™=2iÛbiX¶6ˆÑ«5:Ê÷úâÒA\J6,Ìá@Þ3þhÂ<ù£ 9''¹i0Ž¢®ÂY6a1uÓ¥2a;T±$f*ïÀ0z!(}X™Ë”Äj&äxÏ÷Úö8i£?¦üÞ”Ìøé…&‡suÆx™?â¬*`Èð}€7gPç¹R•’®PùÓÓ0\½ìÒÂ"–“@Þ<Ø[Ê,»f8–’6 nµBvwïê£9 ½„ö°ô@¯€P´¬ŒÌǩ)qÈCÌhЍO"¡ìçÝ9¨3»gòUè&„`¹¶:¿b‚Td.ÝÞP餷ݘdÖN¸Ý[DëxcwªL}ðˆ‰{éêà’Neu1 #Ö×8í9~ÃUUÜ3£•€"rdŒbtCÝOŸÈ!bˆ sДbÅôèFÃ’u²w0ÙCRO5O¹®µ-Üîù ÌÉ“ç ÿ ħv‰ù¢‰[:á{ç¡=”¥åú¶kê<ã"A[ žÎ—ûS߆_X2?•°îa¤Àé6 Ñ©EÆŠ©¦\íâ^ÃÀRׯÈÖ–)ƒ ‚^gÕüJB|½9´)žHÜÌ(òm¥¦¥@f²KHõÐÃâq¡êJn`[ªÖBL1\ç MC²Îê½zù¶PÈ?5YË}€DÆÛíWÃS(ï£ÞVêÝV5`Ù‚õ~UV«°WM úJGYDëØ+w¥y*ê¨`²c¤7˜£¼® u†~Ö÷?ùà°U ûpëm·7_‹›ùDy©&BeÁ`(dšßoüɱU2ó,àÖÛ~ øŒÓÇ‚X>QÇu¶? 1Š›S>yi’ÜÙ‘K €ƒTdtÙˆY÷ƺóÒ­·Ý>«=/F@UAUeCã:÷P"ú›?¹Á¯•vfâ¬7Éf£&3ºõ¶ÛóÒcn; h éH9¹99š)cÏ@/-cC¼Lòl««´0Ç6¥Ô[wK­õ`I«<ˆ`  $+ ˆÝš°˜&Þ|útû 0Dë&^Å•vœeó¾ÇÖC ÐøÙ_’‰àûÚÕæ³|”JZóØæ›@*à½x«€ÄT[nð" kuâ’†d)«§†èsØSZÖaªW70SæG5¦¼íNùÊC$ %{×µ¾Ý€Å~mž‡ž9¢k:4ÌÌv”ø–œ’Dîíõ6ì‚÷c6•/4.Z{à> l‹Éè.÷õ8‹I^³i–6òsÂÈG¨},‡õ®á¬‚k+U”M2“PÕ&¤­cÉXñ¨È* º5г´"ìZõMÙs¯‹S¶k*¢#xm“© 8­qÑ&¤ÐžÙ‹·ññ4ëâž™Yëz˜TÖ>¬»]R™Tˆ?8ÿ+w…òc$#y™.zæN¨\åö R*ÁÕvñ’U>ÅL .iSN* Â-ìóÙKcB~nu6M‘ך çÈ+S² à,zþzë…hs^ÎðdõÿÕºg“ðÓ›£ãÎ(!ÚÉ\ndÖՌ̸Nu0ýÈñ8å{X ìüw¾ç”³ÞFB9¤Ï¦‹ºê4›ã7õIÉvëfŠôB^ãˆ\¯¶n–¸DÙÊÅãé/%°+;(òÖà²`ªü‹í4‘KZKXG€Ì%RÑ› QSlÄʃ+ö´5k1kc²ö;é²½¸dÙ b™VÞ“IË;6ó±eñR=¹'JÄ­±é¥~C?9*^^’ÌÔô N*Š®ö*c¯Áÿ#üKæ8þáë}uE0j¡‹öfÖ)&(£¢5´=ª°¡bS6ÁКõ+ÜÈJ¹"HOeÕÔ@ÜtðXqoFn s‡L@¬6ƒá›é<ëûêß=úèóû_ÑFŒô»—¯_»úð[Ǿñý'^Øu蔓¿õC[O?õ$":üÖÄw~øÌãÏ¿¾æ„•¿yÓù›ÏZQa’©þÖ?Y±re !¼üìcÝu‡;*½ Õmïû=üãïÊ[0ÌÄü¥¯?ðòko®kœäÏÿæ%gvÒþ7Þúöž}éW‡Ö®Yù‰·n<} `!&|Í)®¸þë׬œ˜xî‘{Ÿÿå½Ätãoáÿå[ûw¿RÄÓ³¤}+Þ I&·b2GÆú–OÿÑþÃ_;ò–{÷Kó`¤<Ñçó’³N_óåoýrÇ®CDôÖ±©“O\qÛç¯.5®)ÿȽDtãï|áÿP ü¢äÒ–åιèŠÕ«NÜ»ó©BóÓþ7nÝxÚI"®ÏïÆO}a|l¼ù„߯^~áÁ~gö S«mŽ™øã?ýÙç~ýW^zæK»Þø?ÿê¡?þìå›6žü§_¾÷õƒG‰èÜMk~ãÆw¬]sü(ñœ#p «2|$¿d]㮬íRô]²¥[ ÐX€ ÊØuO&§tY )ºtrÒòûx¡5÷ÙwÌ\zY7ØyÍB„DæœÝx¸ŸcÑÊøöÐÃB…PýJˆùÎ9.œÛÔHY)QIv IDAT`Ñ}ŽÐ¬D¤wïE\0tTÂyJz˸”fpƒ.¼[‰îJT³8»£(µà†övD$yÁ½\Âh á2îÝ`žæÏÿé3WœºþÌùÛ;ž¹vÛ™ÿõÇ7ìÞ÷æÿó7ÿ¯ÿݵDô£{^8oóºO~èÂü_ÿïÿËï_¥' H×÷¿¹÷+kNÙpí‡kÏÎ_ÝñŒ žkœR29¸Pý‹Ï]¹æ¤ã¡ ý{O~äú·o>kÝž}‡þü«ÿ«/\“í›Xö¤‹¯ýàë{^ûÉ·ÿê”›ß}ãÇv=ÿä[d,ÔFÎÖó#ÃÒ6sd”oás¿qMLL~ã{O\wåÙ•º™ògn~÷?¶ëù'ß:t`nѰÑ%ˆþËWÿ ¾’‡ß=W§kâ .ÑÊäCŸ““÷/>wåš5ÇSÈ™ûƒ§[9öß~l+§Óú˜¿þ½'>rý9›Ï-šAßí*$-yÖ¨ê‚,ìµ)tq*iM2¡”›_Ž;.[lÖÎV¡ÉÔý$OФu=kïõ½²ûð–÷¯%¢ ëOøìG/jLÄÓ;ö_wåf"ZsÒñŸ¼å¼c“Ø¡ÅEm9°w÷}{NÞpÆ«;žY·áÌm×ß¼ò¸U““OÝÿ³Ï=ÁD[.¼bëå×ðØ½øô#OÞû"Z·á¬m×ß„%·¾ó½ç^ò.'¢3·œOD÷ÿ軯½ø\~û¨™Þ&Áøü³µ¦ŸwÊæMëˆèÔõ'œzʪ‡•Æ~ÒI랺ï§hï®w<õËãV­zëÐbzû¥ïÚ°q3?óà]Û»Ÿ˜ÖŸ¾é²ën>îøÕSS“O?xç‹O>LD7þÎvïÚ±fí)+_ýÜ#÷nì~":cËù—\{ÃØøŠ}¿Ú¹áÌÍÍã2KÊÔr·æ” —_ÿáÖ¬šœ|î‘ûžûå=D´î´3·]˪Nš8zôÉû~²óÙÇ7m½ô¼ËÞ=qäèÄäÑÉckÖo¸ÿŽo¯9å ›ùƞ׺#Úæs.{ÏMc+Vì{ååé±Óıɯ}÷ñ_»jó–öùpòkÖ=ußO‰$å‰Þ~‰¤¼û÷ýdç³—2 æSÞB÷ê^IÞrá[/¿šÇÆcæ‰èšߺîÔ3ÆV¬xþÑûžøÅ‰(PXwÚ™—¿ïCǯ>‘WÓñÂã•ÛÐBÜr?ÅížÌüÎ‹ÏØ¼qͽì"ÊžâÅç®ožÒŸºþ„Sׯ:ðæÑ¦Vj[oà­Ã‡ö½öòšu\"_þ¾ܿ﹇ïºå³ÿý·ÿ§co¾ô=7þìïþÚ¥ÒU·|‚¿jõq«NØóêKýŸÛ °ÚfŒé­cSO;îÍÃÇö½ñÖI«Wª*ç¿í”¯|çɉ‰ÉR›7~êïþþ7ìÝMD7úŸýä?ýÕáƒû]ž·Òá ×{^ëÎKÖ–2IZ+7°°FÜ ùª;¿`C 5\· 3¹ÕëR¹)[Ea…·Âç( ñ2[-ÑÓÉîL&Li[‚•[iß÷ø`P´¡NeïïuqT{èa1+×Jð±°¨›µ«6”VzˆHyÀ¡T̉nô§)îÉ"Â3íZt PZ§vçꦤÚëËLîZY=’¶m-. Y¹5B­è Qó_HÖc£¾k·ñw?|æ¦tÎúµ«’§~lbj|¬íþ¢óNl2½ÕVçõ7|ʆg¾‹ˆ.yÏv½ðìÓ÷ÿôŒ-ç_öÞ›v=÷¿íêGîºýÕž9qí)ï|ÿGžºÿ§a J¾mëeï½içsO<ýàÏŸ~ðçÛÞ÷a"zøGßˤ‹™`ò™®¿jKCÎcǦ^ÝsøÄU+}—ƒ‰ÇǦ&'›ô÷ü(oâÈ[·ÿÍ—Î:ï¢KßóÁÆ5¼èê_ÛõüSO?ð³oÛzÙu77zãõø÷§žµåÊ|´)yÁ•×íxê—ÏôæÁýTfobúéß~e|ÅÊ|òóë7n*-%XmsäÈÄäd¸øÜSô‹ÎÙ´öÕ=‡l­W¯˜œÚ2å‡oL9áre€ê¸Ï2 lûâ.žÌÔVÌ`{·]ýÁ`ÎùÌ—$mÝÃb†iÇKì‚N)jQ4É$Šõȧޠ•¤Ž±K_£¥‡{M^ÐeJêÄweÇ ¨HªÕImmÕ…Ò—$Y=`SÅ‚¬ÛqÀÊ ¢j_Tà­3Ø#uÚýøÓ<ÍåϾúÐÿâî/þÅÝßú‡'›œk.ßtù§}÷ÇÏþé—ï}q×UôˆÌL̺öCŸ¼å3ÿýÕ7}bûãî~i;¸ö”íü‚ˆ~µã™05µfý"šœœ9Ñ>fLyuÇ345uòú –¾Ü–\ÿ¢×_yùñ{ÒüÖ®þÑûš6)„†žÇŽÑäÄÄ‘C&Ž_YÊù“N~é©_Ñ‹OýrrbÂg„_ü·÷µ”ÿ‹»SæÖsNýâ?ÿG×]yö_çñzu,åOôÆîfz &(ŸXÑ…îÕcÉo¾±÷§ßþë053ÏUÕчK¡Ú‰k×oìþÂÎgg¢5ë74|¸çåˆiÏÎcc¼úÄ5-Z°35òÅ¿¼WS>yé’2Ïß~çöàœññšÒ¸æC¿yÓïþÓ÷|ä·^{yÇöGïs‰|`ïk«O:yýégí{mçšõ§ž´î”ƒû_¯ù=¿"¢É‰c‡Þx}ͺӊ}ûÓ¶œ¹ö{?ßyþ–õCU¬ƒåyW:\9ÈKV BJ9 ¦ÊFwÉxY;X‰ Dã@"džcI2ô ²ŠrUɱ*èý˜ŸžˆåxO¢'P“½ä+^2å' ék !UOZˆX2‹}Ì¡þæó ÌÍkÉíDÏ÷eCj9©zX"À[ÛU!w­,«Ž¼c¬,¾èÏÀŠb¼˜È"*>ÍdÝN’ªzRS¢¥A)¦A…Õ]tª-n*Z#O¥¹+á_%X]lÀNÊ;À'MûYß}êrõ^]pî† Îݰoÿ[ÿúëýñç®<þøRã!þ4Žh‹Ï]ßÿcããWÝøñgj}Pæ±÷~ôÓÍ@ÆÇÇÇÆWÑ£wß~þ¶k¯¼ác+;n׎gþñ÷ˆ™yì½ûL3̱ññ±+ó» ¢¯7QZgeºí÷Þ½vÍq™f‘Wî|ð¥#Ç&¯¼ôLÌÌerÌzÆTÜ9(0ѹ—]}ö;.ã1"_±‚ã)&SS©$5%)nÎA`»î£ŸnY}|œÇWz¦±±±ÉÉcMÎŽ'j3yl*Æ`ajjÅÊá±èŽ<3‡©ìÙÕc ·ýÞ•¥ã4Î9{Ý«{W6à•ÀRžylÒŒÝÍt X‘/ NçêüèÝ?8Û5WÞðѕǿkÇ3ÿø{)ªSôÒ%˜Ç&Žk¹09µò¸U˜œœ èɵ‡°Ç_"„pÛçß½vÍñy‡I>½6>®ºó„2Üýýoªst,‘÷½úÒ…WÿÚ‰ëN}eûÓo¿ø]ccãÍcü‘§¦Zºóï¿VïÝBa|ÅØÿ}Ûû†­XËó%é°Pá%Ô(hv•?Â5­£],°š+ÉÑ( #_¥¬•7 ©l¶}[Ò¢Ô²…§úH|‘É£Üa«e´ž†/²4c°*61aŠ ‰„Ü·ø™Wû² å ´‡9XÍ xúÇ]f’5ÈhSÊdAž«(æs&§ÛøÐk2%»b^¥ ¬f%  ËL6ܸ+tS2Iƒ–ª(èöÒ±¯… b¡¸‚¨]nœža*Üû讫.;‹ˆÖ¯]uñ¹ëöî?|æékV®›ŒÛcϼvÎÙ¸ÜÞæ‡ ¾ïÕ—½ñú¹Û®yúþŸQS?ùÖ¿Ÿœœ ˜”Ý/moŸž¼þº~æ¹õ÷Ü·'PøÉürSÒyå<­­æ%X ‹ÿf:у½òâ+>yó…eO B˜oÒ]óþ—Ÿy¬y:¡`Õ‰'o½üšŸÿý×ìÛMD·|úl™‡8{ë¥OÝ÷“³ßqÙøŠ‘VS?‚”Ü"šššZ1ÞîÄÛrá寽üÂᯇ05¾bű#DD<66ѤºÁPȇx,²VÙýuarrêÇ÷îøÀ5oO9\–È0)O5Ê‘;v7S2اŸ[êÁ}{ žØýÒ »_zˆNÖÊO;êë.\PkÉ•`Òìn­gÙH¡_b'x4Pò“HJŠJ[/Êu­°q¬ëÒ |& ªdˆµMÐEIFR|…n…×£r;ðêùyŠÁˆ(`L,Î_ˆ£lÇÅGvyWg¿¡ÎoK¶a4w-;g5Á3†zh¤GÜCK€Di ´Eó^ÏáD!pD ò/æ”Ç0#Å[,K£'O­Ô1SÔu‘.YA{«žÏå[ï.#(˜§xsv¾×Çcü“ûv¾´ë ":xèèCOí]·fmݲö©í{›Ìoþó+µwe¼L¢ž|hóù7éCû÷žsÙÕD´þôM×}ü³4Æè†[ÿàôÍçÑäÄѦ18ôúžs.»š˜×Ÿ¾éú}†ÇÇšF§&&Ž?á„V$mtç®1ÄüÇŸ{í‘gö|âæ xŒ5sÈq<ðúÙ[/#¢õglÚ¼õÒ£o.Ð)·‡+žuî…ã+jïG=z÷·œ{í°áÌÍSÇÚ§voîß{îeWÑ)§oºîãŸkuM’$Aoîß·ùÂË”.z÷õ-•öï}û%WÑ™ç\@̇Ú†@þ­ƒolÚz m¹`ÛxŒÊ:ÂøøØýíÞùê"zqçþV¯(rigÊûcw3%ƒ…DºÄŠ×ü³¤{Ééꡇe¨7”dX) ¦.7KGmAŠ¡cßÁ´ÛãÔ˜Ñ=ÁˆQÉU4…RÕ•®‡¹†©—ÊWašÏúþ/?°rE;½ÿãgÞyʺ՟ûø%ß¾ã™wZ½jü3¿~ÁêÕ+‰è×®~ÛßÞñôw~´}͉+?÷±‹V¬—b9 pzé©G¶^~í– ¶íxòáGï¼cÛõ7Ÿsñ³ÜGSˆžì¾m×ÝÂccD¼sûS_ßKDÞõÃm×ÝtÎÅï !<÷È}¡=,”_xâ«núD³ô~÷÷¿ùúî]òq‡C¢6ÿß}ëIfzò_ßÕä}áÖËJÔxüî\~ý‡oþô?›œ˜xæ¡»KxëÐO=üžüöäÄľ_½œÞÖsaï®ü­ߤ?ôÙÞ¸üÜyÇå×ßüö‹¯h‡9¥ÞÉ£yôîÛ”¦&'ŸyøžÃ÷Ñ£wÞ±íú[¶|ú²‰£G»ûŽJï3Dþ‰ûzÙ{nzû…Wì}õ¥Écµ’.ü7¿ø›ÿðÔ+»ßÚtÆêO}ä¢JÉŽ”§ÂØÝL`0Ê Y1RÛ(}±ú8Qعý©ƒû÷Q‘?¯DÍÄ•:ÚþøýÛ®»¥Ù™¹sûÓ‡öï%¢çÇÇÇÇV¬Ø°qó9]ñÚÎî»ýÛÞyÇåïûÐÛ.ØVœÍtTC:·Ýy¿W0пùÚ;wÞh‚ˆ¾õƒç>õ‘­wZwAèNùÃ4¯Ã>ôÆIkO’HäáL˜Õ6“GŠ ÿ·÷ ":gÓšßýÇWÚ|üî\ñ¾Üô»ÿtâè‘GïúA©XGéhÆóÈwl»þæs/¾b*„ç¹oj*°VˆÅ…No…´ ösñJ‚ B•Ë@à¨àÍK¥lV¬s†ƒ*ygT¬žöR2,…ä2æTRÚ&U„§ƒS* æLñû*!´UÙ)½²/-±ðÕ»õ/õˆ’×v[ç顇ånÜdDGd›DÖDV›w±ª´z7k:ÝêÛz0}+¥ko©Ö<õìçô0<(zpùŠyÓ–wœzú¦îÝ|ãO>84j·Þv{‹…dÛò»¬MiaÒ‰¨¼ØAÑÁ…›•ÇõI'$"?:`¢oÛºíú[þ¿¯üy¨*‚Å(DÝyiô”ŒŒáF|u´ú€Ӗ̸ˆ÷n‘:{SÓÇ‚¤üZÉ.ßøßgEŠÌ’^š°Zå¸ 7Ö“#ã*R¶KkZ3„’ƒàâ0I{×z8XF92!\ŽÐ a;âB?9S /¢æÎb–ÜŒN{Gên; ‚Iqù”¶R#k-.CÐCó%ŠŒFPi+^Í7rÁÚ“Ö4 ”´vÌ/ÅxÖÚ©FlfÃ; DiáM>1Ñ«»vÌÚ—:x¥Êú•Á¬;DîË/Ä«À1¿Ù`nA£Š_­ï‘2GΣÇwü ·þMNM>ýÐ=îB Iâ-X%³$ äº7¿*œSž9,Å‹À¯ ðÚw0‘"½>¯ru-¢Óükïa6 î)”b·®×,Û’ìÛL†²†°˜b][Ŧݖ‚ÀxŠ`Ñ”ïW”¦¨äÓÐññQ’ôö4R|U.ý‡hî%~ÜLˆW ÒÚæÞÅ”X+Xf¤ÒÈt”‡®Ì¼Ñ4=ôÐÃð T5Éí`‡Bûvnr·¹µ£tkÕeŵ±*¥äh²éÂ…^GÍ’Å­‡&zã“ÑG} ÀÒ™§néjÉ´T<ƒÇÇ¥$[„G-vGùÏ_ù3’òèzÊ_ëejn@-¨_"V,¾~ Þ*žb™Á¾›'9¼=Ú‡Ï ÷s?Z°ž‚5 6*"?ÍdžL•F×JWÂ<Õ›[¥ªá]¹@N²ÀœXé ­úOv7^âþL¤²]ÝÀüÒ-E†òŠNÊ—3b%&‰rˆŠ³•Ðn•«'Êjšñ½¬Z§zX t « IjÙ äÒHGó¾ ä³¤ t¾É£½tÍNsÖ fH‹¤¶@:ŸdØž³œqCƦRº|³&t‡¬wfÙÝ]ë9(Û<|ƒw«‡Ù†ª«­ömR¶âîMpvYñEðõdÑYʇN5÷Ó?Oà ©å•’ÀR¬n}SÛs± ï–º[Ò}ä%ÜKšÑŽI÷UFv×Z¤ì8läF’¦ÝÝ…©¿ãe¦ î)‘ÖJÝÂMÜâ½;òq³nÒ|ÛŸzX†àjq÷VEQsÐZ,Çž„Ï TõtÍ•´²Û‚[·‡á¡bi •÷ÌbD4j¯îÚ1;gx(½:O佉^é@"ÌSçs)xsr<œÑqš °D¤âm)5Ò»s–œ¬Ó6äË÷ÙYt€% ð’¡ &´k w3áÃ=NÛ6ûodÀ†ÆÖþ#Å$ut0-ÄLŽMq« óŸí™ŒªpÝ–¸ƒP d$Z§‚Œ`g¢x eú’@³Ê·YžŠ¬°ã`(©PS‘*ÁËÄö•øH'&¤O Skd˜ÄÚN{ìJœEûF-¡iòäÔ•Ý^ {èaö€ º‹¤Z!© ð–Šî\·«=77ŸôDPP†Ñ€²$£TêÔ5oäa[Z¦¢^m͸ ÂÒ|©Ë•½»óõ^sÎ~B…uäMð¦Jþo%(®¸R#á]”A¥ZÈd*ù*y)=t†’’‹7q±%ÇuàÊáóääâg"å÷5n/áD7/ï% šbÞúEW2¨ì9`f â17rKb¦Nqo~µÇ7¶ÍÇïÇ5¿¢¢´Ò¨ØèU’¤ Õ*î8lƒÔ3ô±$œÇDIµÃ[h/1»•áVÆ7 (›Y ¸ú8+Á™'”R–r&Á©eyוÓ2xÌÓC=$°š¤¾r—sl]×ÕÂòlir°m›dúmÕ[[¨‹Þ#Pq]—T¸Iu:@7±—Ù ²Ð›Mf6Ò-ë¨ø £ˆfé{}ÀŒ÷"–ÛP¸[`ð¹•u—cLC£å±”–Q&Øõ…F¹Z´¡0ŠìCRÒ(#2ê½4Ÿl&ßÀKèOâàðÉ^S 1z¥¹l·)óÚˆ "0¦ŒNnF %8\п ÑBrÈä8-3XZ°™9ªNO=ô0K0pŒ< ’ª0¨'»°cå[õ« ؘI äè%o™I´ThJ»¾ÿ@P®¤r†]KÖCýJ^Ë_ëÈ©FJöÅm|0t1K±³ÑïðLØÁŠò 8ͻɻ€­1ºŒ˜ø òÄv!lÑ;Êc¼öhYçnÓŒ8…(WÄòæ9¡z/y´ ì\÷“>[`W]­Ð)P!º±Fœò`6†Bóv=‡Íä—Vbñ®Bpº`={‰ ¼)Tp%¬I–—UÔŽ uJ»æVj9ȹ hR8÷f'ƒ…µÐ.Yž…顇% Öir-j)ðS…Ý[h¬¾·‘“Öâ[š¸ä u52«zêã©W[Óå-(²°"¾!3³0-¾Sl8Ìß—Bþß=ÿÂ)ÚkÊ#O×Cì¹ì*¡à:N–lìW*¿ì¡»¯.Ë`˜…±èœL¤æ2¨›"?½“Õ~g/½â”õ¼ë Ûèn&ê½e.-å±d„í‡ Ê€×7uŒÇšñ°ùŠÐ×Ç1è®z†¥lÑqÁj¨JP鯰èÐŒ© Æ<ܱp#—é2Ä1ak ™òñ—My,Her‡Â|Ø„[½‡z*úÈÞ²šÈšS›NuK"[ñ"Œ?€´†íû,K©¸„¥q¦æ Ô_pUXT8Ò: dHë†s£ãÁÈ̘¯3<‰ˆâh¢A^/à dǃà‚ùÉ$X=dzò.UùT¥—P–V×1Lknâ 8+6aƪéEÓ‚F§òµoéqì*EøˆŸÊt»-ÐÃ4 D:ÌW² dª$´7-9Gÿ€ ÓŽ¿IgOkJ ò¨ÐjÅ@v¨hRIDATÙ]‹aƒ$i{’¯Ã€F=Þtuc(ÐŽà.AU=ᥰV¤O™½ôõ°Ð`ž}ÊY”-×µN0Ð÷žV Þ¥«¼¬jAMgÕ€l9j wKPr(‚Ì×úÅmÞz4ëÅÌ \Ž,9šÊ$Õ#—¹…ÄjùT÷Ìg¾Dóü•öèbÕ?j$ªh·ÉS£Š÷‚Q0¨´T  õ®F7fÞp èÑün5VB§ “Ü¥™25’¿–ëpƒ>ˆPÞªMÌ>ê¡; ¹V bU^^2Åý™”'8·dw¢c'Á4lceê•n˜.(ɨFápT¬“ ²Ac¨‡D¤vŸ+Å4¶¦õt±°`ý¥’Rò ¸\¬‡°¾Å G 9æc;]âÆzV‘X…dùÕ9)º”³ï¼)LЬ`–B†e»,ë(VP&®nÏM¨áz‹äW1a;jd¡`Q×¾çᆂíoÈì¨G¬Rf‘^oFp-1Hˆ6“ Åæ,ÿeE…lÌš±w'yùN§…"ñwûâÀ¼~¥]o¬.eu].¬Cýg½,ÕŒZOW«n3[~›[@»2 Lì©[KË`~ãÝäx2Áîòü±X’ ;ؤ3ñn ÜŒXÓx[•æ·´¹`y`áAKWŽ[zOOúpùÍ=«J›’ßìlØx|¶A±ÆgOD‚©Ž8*]£š4+r˜ãÖ®Gz=ô0<}ÍÄÍ—=p•Ö=  B`³R‘ã‡Ø‡î«îœ—Ð%#5®´)cÅja­à’`h*À¤s?A¬a‹ÍsTrZg JJ%ÙŠÊû0ŘDyå“Y IÂsvŸ—(ìºÐÜy…ªãl¹Îb¸n¶5ÉàÎ…¿:C¤Ø;L¥Ý9Å«ùω_ »L7–puÎLâ‘yü^E_¿ÕWî›þÀ”×UÔ-Šɰ#&ØË\€`½MšO ¥ß]±•.:†vi -Ä|"´{ɉ–…AÐЗ`(¦â4L(H¤ [×CwàüDŽb¼×z$`ß“ïBÔMé³/…îäÌ`Æ”F¶k••7Ø †•ã¢D×S@JYa¢¢ëT蹺‡YÍ}­Ÿß¸GhÔ›ÖkŽTøsµ•LŽö¤šb ˆ… ðJNª·Óî1mrÔxAVg– •œÛS´@\l8ƒÑ]Î{"j`G2Z·ÛŸò]QOI‹WDéc‚£…OiŠ/:å7xÊßZJœpñ°.ùí”§AǤ$ÓÖÈôв ®øØ»nNª2+L“ìWšQ ܯ=ãÞߺÊ(aÑaÌJ0ëÄì }æ5êK„œ4Õ~²RZlRΑÑwÓÅçæ U´ÁË´ô3µÛâjFùù)˜K1žTôÙŠ¢©À~ v‘D,ïÞêABfõP.åÈ™Îþ |=¹eóÆ"8¡A‚*ÐÅyÄK–iƒ—뛦„]Ý /i³°Ñ¯’ÑJ{yê‘a«œÓm£öPn|ŠuÈ—ÒÊÐ[)·eê$HXS~æ–°¨gŠ`ÀQj2K?ìt ¸=FQ ‹qøLœÎ+QªjC:Dâ5¥¼±¸Ûä;ûà  áí’v6’Äêz`$gƒ=êêI.PS©n¯Œ5@®"P"6B{d¤3¾Š9X—½[ÔÃlD±sÈ•±ÅùŠú´žÉCõ-… «ú˜=¡¶•líÅèîϪÖÛLàÅ{øìÛyKšÀ*‘x7*±ðÀ<&ÓOÖf‹÷PÜ"šúYWç+×HA°^ú"jY7 Ù=œ³FvÄÔxg^ù ËW¼Bã×ÅTÚŽ“}¤Höl‡â6æv²\Yº‡Ù¥"Ѓ,6ã³ ¤d‘‘ĘàµnqTé¶,¥²( Ÿz@Gâ–èöš«»R<Þ_´|Lâ1‚‰fó€9¶-ÝКÆ@ÔšÃDj?UŽK¿ÆÌSð=te5Xò€rÐÕKÞ\É~Δ[oÝ‹åüdp&âËü10É—øøàñãoI}ýÇ?>;{öìfœ³{÷nÇèÑã+¿ýíï,X~þ†ŽÏÏÏ?õÔïôéÓ';;ûúëohÆ ÓÏÙØó6tüžž€/°Ï*.....!\|ñEÕÕÕÿõ_ÿ½×Nýï|çC¹þú‰Ä7ŽÛ´isª[† |衇^wÝõ!„Ñ£G÷»§?ñÄü4û,[¶ì¢‹.N}=räù™Í8d"‘6lØSO=õöÛoõ«_ýÉOnZ¾|ùûï¿ßÐüiŽO&“¥¥«233ûõë׌~îœ=oCÇïÑùø¢ñvP€Í;§cÇŽ©¯ü“ŸÜ”ú:‘H :têÔ»ï»ïÞqãn(**jÚþ'ô­G}´²²²¢¢bÞ¼ÇN:é[©õ¶K—¾SYYYYYùÚk¯µk×®yçŸ8qBÏž=ô£+f̘>uê݇zhšM’ÉäwܹdÉ’ºººwß}÷­·Þª?~—ó§9~ûöí/¿ürIIIÓ¾ôš|ÞñãÇ×_™ôÇïÑùø¢ü¯3Ï<ãë_ÿú-·Œ¿òÊ«–.}çÊ+Ô„M‰D§NV®üø´ÓNûö·O^±bÅú«—_~ù¸ã¾~òÉ'ççç2äÅ_lÖñCaôèË_xá…«¯¾æÝwß9räî?°S§JKKÓÏ¿Ëã÷²ÝOĨ¦¦¦°°pݺu!„úR*/////¿ãŽ;W®\ù/î¿lÙòÃ;ìõ×_!ôìÙsÙ²å!„¼¼¼¯}ík©þÙ°aÃÌ™3|pÚôéÓëêêÚ'33³¶¶6õu›6ùë×—¥™¿i:¨ë¸qãî½÷¾ßc¹ËùÓ¿4á¼ÉdrÛ¶m{t0¾t|& F¥¥¥C† ÎÍÍíÕ«×é§ŸV¿^\\üÃ^šz§b~~þᇾó£~üãOš4)3óóDçÿøÇsÎ9'///??ÿ¬³¾÷Ç?þ1„°cÇŽM›6 <8õ~Ë~ýŽ]¿~}š !Œ{Õi§š““sÐA{ì±õ?¹¤¡ù«G7ÝtÓý÷?°téÒÏ?Íñ{ZΛ™™9uêÝwÝõ Ÿ àSÜ ˆÑìÙ¿3fôÀßxã¯Ó§Ï8㌡©õ'ž˜¿cGÅøñ·dee•——ÿaçŸÙªU«ž=ëÖ­ÛG}”~ÿW^y¥C‡·ß>%„P\\œº¥B¸ýöŸyþ¹ç~¿¶¶vÕªU¿øÅ]é÷™5köe—]vÎ9çlÛ¶mþü'ß~ûíôó7Jffæøñ·$‰«¯›ºXYY9zô˜†æOsüUW]Ù«W¯ìììÖ­[O›ö@ášk®Mÿ+›eÎ4ç­­­---­®®Þù½£ ¿Gçà‹&qÔ±CZz¾4î¿ÿ¾É“o]½zuK4‘·ƒ°»N>ùäuëÖ)@øRì–Ã;ì˜cŽ¾ë®»[zà_âí q' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""¾‰D^^Þ§'Nœ0`À€=·J»vízèÁ~ýŽÝCû7V£æiÆó6V³\7€=AB˸ýö)“&MÜ̓۷o?yò¤=7LšýËËËß|ó­5kÖî¡ý«Qóìéë–F³\7€=¡UK1êÔ©SuuMnnn»ví6lØð¹ÇçççïÑyÒì_YY9mÚ´=·c5jž=}ÝÒh–ë°'$Ž:vHKÏÑ:thFFF^^îÆ›Š‹‹S‹sçÎ;öêuëÖ…ø „H$¾ûÝï~ó›C²²²–/_>cÆÌ7†&NœðÈ#s¾õ­{÷î]|šýo¾ùæƒêB(((¸óÎ_¼ñÆõó÷íÛçì³ÏîØ±ã–-[Š‹‹Ÿ}vA¡sçÎgœ1´gÏžï¾ûÞC=´eË–4û74gCš§±ßWNNÎðáÃû÷ï—L&_}õÕ¹s­ªªJsÞ†ŽoݺõÏ~û 7Œ»à‚‘}ûö­¬¬¼ñÆWVV64gCûìrþÝy4„pë­·>øà´Üܼ#†ÿìgR‹»ŒÀÔ_yä£FºþúvÞdâÄ 3fÌX¶lùÈ‘çwîÜeüøñ!„ï}ïÌþýÜvÛm[·n=ýôÓ{÷>fÒ¤ÉiŽohÿzS¦LyüñÇëc¦wïc®¸âŠ»ïžúÎ;ï´k×®ÿ~Ï}zšýšós}jžÆ~_cÆŒÉË˽ÿþ‰ÄرWmܸqúôiN×Ðñ­[·¾ÿþûÞ}÷ÝÅ‹_íµ×òòòÖ¬Y“fΆöI3?Àžàí Ð<23332þ÷C¶µµµuuu»<²}ûömV®ü8‘HpÀm۶ݼysÓNúÄóKJÞ!<ÿü 7Þ8.µxÚi§Ý{ゥÛ_O?ýôÙgŸ•——·cÇŽ†Žo¬¡C‡>öØãK—. !”••¥ 0„ðúëo„²²²ºté²jÕªcŽ9:ý>iæl¬Ýÿ¾²³³‡ ;;»þîk‡‰DYYYC;4öø=ºÏœ9sçÌ™ÛØSì†ÿAKû¿"öª¢¢¢nݺ½÷Þ? ª¤¤¤gÏÃR¡RZZ:dÈàÜÜÜ^½z~úi;?jõêÕmÚ´éÙó°Â~ûí·Ë÷Ö+..þá/-** !äçç~øáŸ;U£öæ™âsÏýþ¡‡BhÛ¶íyç kÕªU¡cÇŽ™™!„:|ï{ÿß «]îß„9ë³ç­¬¬|é¥?uaVVVvvöŒ|þùª««Ú¡±Çïé}þuîÂ^Õ¿¿’’’ú4TTT¼ÿþýû÷_¸páìÙ¿3fôÀßxã¯Ó§Ï8㌡õÚ²eËôé3ÆŽBذaÃ=÷ü2ÍM¤'ž˜¿cGÅøñ·dee•——ÿ¡¤¤$ýTÚÿ•W^iÕ*óòË/+,,ܶm[qñRßÎÃÏ:眳‡ºråÊgžyæ’K.I¿æl¬]žwæÌ™#FŒøå/ï !,Z´èsï­5öø=½À¿ÈO…æ1|øjkë|Vö¯³ÐŒ¼ "" "" "" "~:(47ÕÕÕµô°oò: ÍHBó(*Ú¯¶Ö‹ì^g¡y;(@DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DZµô°X¾|E]]]KOû&¯³ÐŒÜ „æÑ½{·nݺµô°oò: ÍHDDDDì=íÚµ{è¡ûõ;¶¥ !„D"‘——ר‡4jþ&ìŸrÜqÇ?~Ïíÿ/Úåy'Nœ0`À€æ:Eó>Ovóz~yeddüêWýêWÍ™óÈàÁƒ¿tûì}"ØÜ~û”I“&¶ôŸ¯¼¼üÍ7ßZ³fmKBíÛ·ŸûìŽ;nÙ²¥¸¸øÙg¤YO$ßýîw¿ùÍ!YYYË—/Ÿ1cæÆC—_~Ù!‡RSSóñÇ?þø~øašõ†Ü|óÍÔ5õÀ;ïüÅo¼‘Zoì>­[·þùÏo¿á†q\0²oß¾•••7ÞøãÊÊÊFÍ_PP0yò¤üüüüüü_ýê¡ÔΣG©««khÿ†æßåõL³Csæææ^tÑE}ûöÙ¸qã;3þŸxšýsrr†Þ¿¿d2ùꫯÎûhUUUš­:wî|ÆC{öìYPPðî»ï=ôÐC[¶l !Ì;gìØ«×­[B}úlݺõþûøàƒB ÍÓØë#ÍV]ºt^²¤äá‡gÕÖÖ^{íµÃ† ›>}zÎBøþ÷Ï™1cÆìÙ¿9òü‘#G¦>†—fžF]çyó›7ï±Â8qâ„ÿüÏ{›ñz¦œ|ò·ï»ï¾µk×^pÁÈ+¯üÑOzsšýš¿¡çsšë0zôå3f̘5köÎ×­¡õ4ó4Jæù¬U«V}øá‡ øóŸÿBèÕëk6lP€À—‚Ï_níÛ·/(h³råÇ|ðÁжmÛÔúСC{ìñ¥K—&“ɲ²²gž)N¿~Úi§=úèÜ­[·†ž~úé=z¤~øÇÆ=ôÐ^½zµjÕª¤¤dåÊ•©ãZo¬&쓟ŸÿÒKZ°`Á–-[Ö¬YÓ´ù»Cºž ÙåœÙÙÙÇüÌ™¿Þ±cGyyù«¯¾ú¹CîRvvö!ƒ~xVeeeEEÅìÙ¿9á„ZµJ÷Ÿ;_ý?ÿùÏuuu]ºtYµjÕa‡}µi§!<ñÄü’’·ËËËŸþ…®]üÜyuSZ·n}ããæÍ{léÒ¥©•f¼ž¿ûÝïV¯^][[»`Á‚Ã;¬M›6 íŸfþ]>ßÒ_‡Ï^·4ëiæÙ}M›g—žy¦ø¤“¾•úúøãá…; @‹p'ør0`@ûöí§M{ „PPPпÿgŸ}6„йsç+–öø]®ççç^zé¥Éd2µ²uëÖÖ­[ïØ±ã©§ž*//?ûì³>øà’’·çÍ›·bÅŠBCëÕ´}-Zô/ÎߨýÓhè:ïRCsæååUUU•••íæ> 騱cUUUýû×®]BèСCš›3………£F]XXXøÑGeddäää4ùì555©/6mÚ”••µ;óìþu!¤îY½ýöÒ?þñ©•=t=?þ¸´®®®   ™L6ô¼jhþ]>ßÒ_‡Ï^·”Ï®§yž7êlÚ<»ôæ›oŽua×®]׬YÓ§OŸÙ³Ó¨IZоÜ0yò­©#}ûö=õÔSS¸víÚ®]z÷Ý÷>uü.×ËËËËËËï¸ãÎÏÞ(K&“ .\¸pannîСßýñoüÑ®L³ÞXͲOæ!TUU4aæ5tw¹Csääääçç———ïþ©?»ÿúõë³³³Û¶m»yóæB‡‰Dúºêª+_yå/Ï=÷\¡gÏžõ¿•¡¦¦¦°°0õ™ÀO•Àî_·&̓ưaç¶iÓæ¿¸«~¥y¯g½ý÷ß?„°nÝºššš†žW Ùåó­¹®CšçyýÙ333?wŸ&ÏóÙý“ÉdqñN<ñÄwÞygÉ’%Û·oßùoS!½mÛ¶ÏÝ`/óvPàK¬¨¨¨[·nï½÷Ï)))éÙó°Ô¿ ?óLñ¹ç~ÿÐC !´mÛö¼ó†¥ÞîÕÐzqqñxiQQQ!??ÿðÃOí9bĈC9$‘HTTT¬Y³¦þDCëÕ\û4vþÂêÕ«Û´iÓ³ça!„ýöÛ/#£)¯ ]φößåœ[·n]ºôóΖ™™Ù¾}ûSNùöîœú³ûWVV¾ôÒŸFº0+++;;û‚ F>ÿü é?fÙ±cÇÌÌŒB‡¾÷½3ë×KKK‡ œ››Û«W¯ÓO?-ýyÚ¼ ó4dÀ€C† ùÅ/O•ÒŒ×óë_˜ŸŸŸ““sÁ#_|ñ¥Ô‰z^5d—Ï·f¼éçY³fMïÞÇdffÖ¿-|—š<Ï.÷á…ú÷ï7xð§ß š™™9uêÝwÝõ‹D"Ѹo`Ïs'øëß¿_IIImmmêï¿ÿAÿþý.\øÊ+¯´j•yùå—nÛ¶­¸ø©ÃZâ‰ù;vTŒKVVVyyyqñJJJBÿûßÏ=÷ûp@fffYÙ†©S§¦ÎÕÐzc5×>?„°eË–éÓgŒ;6„°aÆ{îùenÎ4t=Ú¿¡9ï»ï¾Ë/¿ìÁ§•––>ÿüóÇÿù¿’{—ûÏœ9sĈ¿üå=!„E‹Í™37ý&?<ëœsÎ:tèÊ•+Ÿyæ™K.¹$µ>{öoÆŒ=pàÀ7Þøëôé3Î8chÓ®[cçÙ¥ìììý芔)·Õ/^wÝõ;vìhÆë¹qã¦ñão)**zã¿Îš5+µØÐþ ièùÖ,×ásçyê©ÿ¹öÚk|pÚªU«&O¾5M×5mž]î¿cÇŽ×_}À€ÿûßw>¸¶¶¶´´´ºººÉÿe`ÏIuì–žöÇÿ ¶¶nÞ¼y-=@£Mœ8áé§Ÿ~õÕ×Zz/¥aÆed$æÎ}´¥ÙÇy…fäí @Á»›â«_ýêñÇÿûoû»– ¼ ÑZµjuï½ÿYUUõÐC¿úÔ„ø‚»[niðW¢Óššš1c®hé)šÂÛA"âN 4åËWÔÕÕµô°oò: ÍÈ@hÝ»wëÖ­[KOû&¯³ÐŒD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @DD @*¼Û. IDATDD @DD @DZµô°X¾|E]]]KOû&¯³ÐŒÜ „æÑ½{·nݺµô°oò: ÍHDDDDDDÂ^Õ¥K—Ç›7eÊ”Ô'NœðØcó:vìØ²S4EffffffKO@£ùðEѾ}ûQ£.ìÕ«WFFƲeËŸ}öÙ—_~9„}Î9g4¨uëÖï¼óίýðºuëBgœqƈÃÇ»±oß¾C† ÎÎΞ4iòúõëÿë¿~óâ‹/­YóÉ!C²³³yd΋/¾BèÝ»÷)§|ûàƒÎÉÉYºô™3g®_¿~äÈóO=õÔÇ{üÔS¿3gÎÜãÿ÷.]ºLœ8©´´´¡ó†ºwïöÓŸþ´®®n„‰«V­Jÿ}uîÜùŒ3†öìÙ³  àÝwß{衇¶lÙB˜8qÂÂ… ?~ðÁwÿøãÒiÓ¦}òÉ'!„œœœáÇ÷ïß/™L¾úê«sç>ZUUBÈÌ̼øâ‹Ž9æ˜víÚ%‰-[¶<õÔSO=õ?'Nxä‘9ßúÖ‰½{÷Þºuëý÷?ðÁ„æÎ3vìÕ©™)77wôèË÷Ûo¿¢¢¢þýû§?ï1ÇônÛ¶mQQÑÑGý¹ßW—.—,)ùÿ¸iôè1!„aÆÕÿÕÉ'{ÆŒ—]vù²e]yåR‹_|qQÑ~×\síu×]ß©S§ /¼ µ~Ê)§xà×^{ÝWühÇŽ&L|ê©ÿ©¿D/¼ðÂÕW_óî»ïŽ9²i× îÂE~~~!;;û½÷ÞŸ?ÿÉÔí¯¢¢¢o|ãÛ¶m{æ™âººÚNö?âˆ#<ðÀ•+W¦Õ£G›nºéÿø0õÇœœœÂöíÛ¯½öºíÛ·?ðÀý:tèСêU«fÍš½mÛ¶ÊÊÊý÷ßêÔ»8âðV­þùÿsæÌêÚõÀÒÒÒÔ>O<1¿¤äíÂóÏ¿pããšãŸÀ>KÂ^U[[BÈÌüç-µÔÇêR‹¿úÕô1cÆ 4hРAÕÕÕóç?ùä“OvêÔ)„ЦM›ë¯¿®~“6mòë¿^¸ð¹ú¬WUUµ}ûöBYYY‡²²²B………_|ÑQG• ÅÂ~ûí÷ÿޝ®«««ªªª««K­¤?ïš5k~ò“ŸÔOž^aaá¨Q~ôÑGõgßÙÇ—ÖÕÕdddTUUmܸ1µžº·Ù¡C‡O>ùäoûÛYgõÚk‹Úµ+êÞ½û{ï½_ÿðšššÔ›6mJ}³4DÂ^µaÆd2yàæääÔÕÕtÐAµµµ›6m !”••7®sçÎGuäùçŸÞyÃ^zé¥Ô²Í›7{õŽ;>»áöíåiN—L&S_dggÿìgã·oß~ûí·/[¶üÖ['wéÒ%‘H4ôÀôçM}&°¦¦f„‰©ò¥qÕUW¾òÊ_ž{î¹BÏž=ûõ;ö³Çì¿ÿþ!„uëÖefffgg·mÛvóæÍ!„:$‰²²²ÂêÕŸlÙ²åœsΩ­­¹í¶ÛêC±!555………©Ï*C€z"öªêêêÅ‹÷ë×ï?ÿó—uuu¹¹¹¯¼òJ]]]~~þwü|ãÆK–,©ªªJ&“[·n­¬¬|ñÅ¿ÿýïÓoÕ±cÇÔÏ:|ï{gîüW_ÿúÀ%K–ÔÔÔ\pÁÈ_|©¦¦¦¦¦æ¥—þ4jÔ…<0-‘H\pÁÈ矡ºº:„ðÍo~sñâÅO?ý9§«WZZ:dÈàÒÒÒ=zœ~úiõ˜ˆœ„½íÁªªª:òÈ#[µjõþÏË¿þõ¯C>:oÈ!'œpB"‘øÇ?>|ôÑGSŸ‹›>}ƺuëþýßÿý¤“¾µfÍš·Þz« '-++{ä‘G†:pàÀW_}mãÆ Ç|ú‡¤9ïk¯½öo|#™¬[¼xñçžúá‡gsÎÙC‡]¹rå3ÏüµµuóæÍkéA¾4&NœðôÓO¿úêk»yüÍ7ßüÈ#|øá‡!„‚‚‚ë®»öÍ7ßúío»'gà‹Âë,4#wÔà‡?}\"qà]Ú¶-ÌÎÎN$_ùÊWŠŠŠÞ|óÍ=:À>I_ÉdòÖ[o;ýôÓÏ:ëìššš+VÜyç/êE»O-ã–[Æ7êø•+WN›6m Œ–€½Ç@hË—¯¨ÿMë@óò: ÍÈ@hÝ»wëÖ­[KOû&¯³ÐŒD @DD @DD ðù~ø×=6/++«¥à_åÃÀ^•‘‘ñè£sS_WTT¬\¹ò±Çë­·Zv*âáN ´€ÚÚÚßÿþ÷K—.íÑ£Ç7ŽëÔ©SKOÔh™™™™™™-=æN ´€êêêY³f‡®¸bÌ!CzõêµfÍšÞ½{ŸrÊ·>øàœœœ¥Kß™9sæúõëCíÛ·5êÂ^½zedd,[¶üÙgŸ}ùå—Z¿ÿþûÚµk7bÄùõ?GûᇽmÛ¶«®Û¦M›#†{ì±uuu‹/ž3gnyyyáŒ3Î1bø¸q7öíÛwÈÁÙÙÙ“&M.--ÝÿýG¾üCY²dImmíÎówïÞí§?ýi]]Ý„ W­Zµ·/ÿw¡%eee‡ª««C'œðÍ=z,Y²¤¬¬¬oß>cÆŒIsÅc °xñâ äç·þ·ë™f}ÕªÕ™™™íÚµ›4iâÔ©wçæææçç¯^½:‘H\ýu'žxbiiéÚµkO:é¤k®¹fçI.ºhÔyç «¨¨(//_»vm"‘7î†#Ž8býúõ………;|Ì1½Û¶m[TTtôÑGï…«@3r'Z@VVÖÈ‘#»u;èÈ#,///)) !Ìš5{Û¶m•••ûï¿ÿÔ©wqÄá­Zµª©©ÉÏÏ!dgg¿÷Þûóç?YUU•Úd—ë«V•}ôQ:íßµk×ÜÜÜìBX½ú“îÝ»~øáëÖ­ûÙÏ&$‰œvôÑGtPו+?NíÖ£G›nºéÿø0õÇC9¤{÷î+W®¼á†qÉdrÖ¬‡[·n]?ÿ_þò—ãŽ;®®®nÑ¢E{ïªÐD ´€ÌÌÌï~÷ô;v””¼=wîÜ7† /¾ø¢£Ž:*'''uØ~ûí·~ýú_ýjú˜1c 4hРêêêùóŸ|òÉ'C»\O½9ók_ûÚöíÛ+++:êèÂ'Ÿ¬>à€BË–- !$“ÉåË—pÀõ¸pásõBØÿýC+V¬H&“©‡ì<ÿš5k~ò“Ÿ„>õ6Q¾øD ´€ŠŠŠ .¸pç•ìììŸýlüöíÛo¿ýöeË–ßzëä.]º$‰BYYÙ¸qã:wî|ÔQGžþùç7쥗^Z¿~ý.×KKSØ«¬¬,3³Õ×¾öo!„Õ«?Ù´iS¡{÷î!„D"‘úâ“O>©`ûöòçÙ¼ysá€:‡222>õ3`RŸ ¬©©™0aâΛðÅ'á ¡   ///™Löë×דּÎîÒ¥Kj=??ÿŽ;~¾qãÆ%K–TUU%“ÉŠŠŠ­[·6´žúy0‡öÕ—_~%33£ÿþ!„Õ«W¯]»¶¤äíÃïuóÍ7gddýíoûøãÒ†æyÿý÷7lØpÈ!=¦L™B277wç¿M}&0„ЧOŸßÿþ÷{ðºÐÜü`øB(++{ä‘GjkkøñÇ¿ôÒK©õŠŠŠGWYYu '|ç;ßùÇ?>¼õÖÛ*++Zß°aCEEENNΪU«>þ¸477·¶¶vݺuÉdò®»îzî¹çºu;¨k×,X0uê=Ÿz“çΪ««ï¼óÎüãÃÎX½zõßþö·ÿöµ×^[¾|ŲeË/^¼g¯ Í-qÔ±CZzØ þƒÚÚºyóæµô °ò: ÍÈ@€ˆˆ@€ˆøÁ0ÀôØc»~ßιçÛË“"=Hì|ш@hË—¯Hýz Ùy…fä3Ð<ºwïÖ­[·–žöM^g¡‰@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆˆ@€ˆ´jé`±|ùŠººº–žöM^g¡‰@hEEE^œ`ñ: ÍHBó(,,¨­õâ{„×YhF>¿"šMffFVVV!333™L~ö×Y·nݺuëÖ›¶ž™™éWD@sÐlÎ<óÌ3Ï<³¥§€}ÓüùO¶ô°Huì–ž€½Äg""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""þo{÷Uÿqü;3\LP ¤@ñ²myOÔUË_*˜š$šš ¢åe[mCó’þZ-×Ò7ó’ ¦[öÃV¬U)P×ÖKÞP @Ütpä"0¿?N¿ù±:gpuëûz>øƒùÌñ{¾ßóÎã¼=—‘!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"÷ÞÄgŸm¿÷F„#FŒlvнãúOë¿l˜¯_–†ÚoÜo|NÀ¯g@"„@!$B‰üšC ‡‡G|üÚnݺÖ-j4šGyäaué .èÑ£ÇÃîÅ/C¯^½æÏŸÿpû ç|Yý;À/W<TñùçŸïÜùWgggåe“&M>üð!DMMÍÖ­ÛRSS«««G~éñÇW–ÉÉÉIHHÈÉÉõððxî¹gŸ}öY퇇‡QYY©¼¼~ýú´iÓëí•Éd:vìxqñ•ºEOOϹsçÌš5ûNÆuîܹyóæ7nÜØRY¾|™§§g^^~bbBNNn£F† ëß¿½MµnÝ:22²uëVƒaïÞ¯¿þúë;éì¢6_ÙÙ9Û¶mËÏÏBGFŽÖjëùïæËÂêßQC±ºPöÔh4!!Á#GŽÔjµ•••cÆD½ôÒK/¼0L±cÇŽ;v&$l©­­µZwttTV1gÎ\GGÇE‹ZV:aÂÄÞ½{GEB\\²dÉš5 !f̘yíÚ5N׬™gÿþýûõëw?† ðÐ5LBO™2ù–bRRÒñãÇçÍ‹sww?vìØÉ“'•˜½xñ;cÇFÍž=Û`08RSSc»ý´´´>ZcW—*++׬¹õŸ¸¸¸ØÕˆ‡‡‡r€ha6›·oß>dÈ:œ?~É’¥~~~6iÓ¦Í[oýqÓ¦ÍË—/÷ððèÛ·N§«wȸ ·Ï—âŸÿü~ÈÁ¿ùÍoþõ¯-X°ðÑG0ÀVng¾ê²úwÔ ¬ît:ݦM›óóó/^T[[ûÁ$&n}ùåH!„^¯?|8] {™–´¯VB;::TTT K===}èÐ077·[º4{ö¬öíÛÿøã«V­6J_|qøý8ÀÃÕ`!Ъ‚‚‚€€€–-[ !zõêe©úé–aÆõéÓGѲeKåï.L:µ¼üÆ'ŸlB¼ür¤^節ÆÅÅ=ö˜¯B¯×/[¶üûï¿W~_¼x‘‹‹‹‹‹ËºuñJ 11“kkkíZ©F£yãß+¿=ùä“.\°ÇŒyy×®])))BˆK—.mÙ’`yK§ÓM™2¹sçÎeee«WtáÂ!„··÷СaAAAz½þܹ¬øøx£Ñ(„X¸pABBbÿþý:uêTwyN7~ü+O=õ”‡‡‡F£1IIIII»5Í!Cúöíãè蘗—÷ñÇëKKKm®K—ÎÍ›77ÉÉÉß|ów!„³³óèÑ£»wïf6›322¶nÝVUU^[[ãïï¿fÍÚ±c£„óæÍ÷õõµZ7™LöŽ«Q£F¯¼òJ—.KKKÏž=k×4Õ5|øÏ‡ò^^^:=uåJ='µì/«ÛÇF]¯×GGOjÓ¦MuuõÅ‹wìØ™““#„°w¾ìmGmyµºÕ¿#ãR›G5V÷eeeûöíSNá !¢££çÎ}3""\«Õêt:­VWXXXUUåææZ\\l™«u!DFFF—.]ÊË+233h©÷ìÙs÷îÝ‘‘Vö<¦U«V±±SçÍ›?hÐóönÿwß}711áøñŽŽŽ¦ªªª]»v‘‘‘qqqV?ÿ>>> .˜}ïíoܸ±[·níÛ·ó÷÷ïÙ³çæÍ›•ú¢E‹&MŠž4)úÇó, —••½öÚë+W®¼|ù²òî¤IÑö&ÀÛ))WV«mÛ¶mzúa«ï¾øâðo¿ýöµ×^?wîܘ1c”¢÷?œš3gnLÌd!ÄÈ‘ÿÿuÕ11Ñ)))·,?pàÀ–-[Θ1sÊ”©ååå ,LJÚ-„6lhÏž=çÍ›;íÌ™³±±Sm¥S§§bbb>ýtˤIÑK–,upøùÿÆïîÞôõ×gÌœ9ËËËKÉuBˆßþö‰/¾Ø•™yäÕW'.^üŽÙlîÔ©“º½ãš0a¼^ßdÚ´éo¿½ÀÕõÖ“6v1›ÍeeeœQw-¡¡!))ß–••©u¯U«V7¾té’!XÝn99Ù~~þBˆ)S&Ïš5Sáçç—››#T>ÿ—/_ÎÉɱÜkÚ¡C{ƒÁ@÷Uƒ…ÀÔÔÔ¨¨±Êå¤Í“O>ùî»ÿ}åÊ•iÓ¦Çǯ»~ýºâÚµkÕÕÕîîîvµ²yó&å§]»vJÑd2Åǯ‹ŽŽ~õÕ‰ë×b2™j8ƒá•WÆ+?III·¼{ðàA­V÷ÄOØhÁÍÍÍÁÁAí”ÎÎ=uê´Éd:p Å×÷ç0yôè÷iiiµµµ>>>—/_nÛ6Ðöò?þØñãÇ«ªªJKKsss-õAƒmÛ¶U9ÒýꫯZ·nmû¡8aaaŸ}¶ãÌ™3f³¹¤¤dÏžd!„““SŸ>½7lØXYYYQQ±iÓæßýîwJ>üé§Ÿ²²².^¼xâÄÉÒÒÒÂÂBåj[µº]ãrrr ]¿þ“òòr“É”‘‘a½ÓÿNm¾NŸ>=cÆÌµkãÇëããc£{çKmûØØn¥¥¥:tppp8uêTAAÒ¸½óeo;j˫խ²1.«ÛGÚ~àêÕ«®®úº½^o0” !nÞ¼|äÈ‘'NtíÚŲ€Z½¤¤¤¬ìúcù]»v­î(BCCvïþÊF]]]•õª±ºÝ²³süüB´hÑÂÛÛ[£Ñøûûçææ õÏ~ð‹;ÜIDATÿž=É–ë“CCCSR¾µ±R€{×`—ƒ†„„Ü~O ÂÇÇgöìY………7nŒ‹›÷þûï)ÙƒÁËËëÎÛOMMµzOàñãǵZ­£££åZµ†eõ3En[ß|s®F£±Ñ‚r°ëááQ÷*5‹êêjå—«W¯Zeáêê:nÜXWW×ÜÜ\­VkyâŽÚò'NœÏÌ<âááîçç—•u^áâââêê:qâD³Ù¬,VVVÖ¸qãòòrµ®z{{çççÝRlÞ¼¹/•—ʵ”Íš5Bü_Ëf!Ìu^ªÖíW‹-ªªªJJJÔzk•Ú|uìØñãÿRRR²vmüùóç#""ÔZ°w¾Ô¶N§³Z/**JJJ2™Láþþþ§NÞ¾}{~~þ]Ì—½íX]^­µ•ªW9yeõói•Ú~ÀÝÝÝhü·tF£Ñr;_Ó¦M›4Ñëõúº7þ©Õ322JJJ&Ož¢l„ÌÌÌXÞ ›=û÷=ztWëáÕ«WëÞFx;«Û-;;{àÀç” ªoÞ¼éçççïï—œœ,Ô?ÿÇŽ7n¬¯¯oqqqçÎ7mÚlc¥÷îþÞháííc4ÝÜÜ>±Sו+W|};w.«nñ§Ÿ~rrrrssSN¤4kÖL£Ñ”””ÜþP†×µkל]\\鈸ç AÏoÞü©hï|©m­Vkµ.„0›ÍûöíÛ·o_£F†üáoL{óeo;V—·Q·k¼wØg ­Vku?àëëk4 •+B .VTTøøx[˜8q‚åÄc]·×Îxë­?¶oß^qôèÑ¿ýíouC ››[pð3j;ìì쪪*Û'3­n·üüü-ZtèÐáìÙsMš¸´oßÎËËëâÅ‹Býóo6›““÷öë×ïìÙ³?üðÃ7lm8€{vï 4›ÍqqóöîÝ{õêÕ²²²ï¾ûÎÛÛ[I‘‘‘_|±+55µ²²²¸¸xÅŠõ>«Ã*__ßçŸÿ¯ 6®^½:**ªyóæõþ“ÂÂÂ&MšµB4mÚ´Þ¯ °*''géÒ¥S§NQŽ/ë•ð ÃBBBœ½¼¼f̘ѢE Ë7oÞ\§Ó !š5k¦<óж¾}ûþãÿX¹råªU«³³s,õäääW_¨\qçââÒ±cGÛíìÙ“wkBܸqã½÷ÞËËËS®qÝ¿ÿ€í§ø;çKmûØØn‘‘‘mÚ´Ñh4ÅÅÅ–SvöΗ½í¨-¯V·k¼¶»ªÖÿÛ÷z½¾ÿþññëJKKKJJÖ­‹8p`ÝËb½¼¼”gÆÜâ–ziii~~~Û¶m•—;v÷ØÄgŸmoˆžˆ#FÖ¿Ðdï¸bÿãââ,ûŸ9sƱcÇïüêÓ_‡_Ð|A4Ü~ã~{`Ÿ“‘#Gjµš­[·=˜Õ™Ý߯ˆÀ ÑhZ¶ôqssurrrvvnÕª•»»û±cÇv¿Ü©ÀÀÀÐÐ/¿üŸ‡Ý …ô`Ü?f³ùw– <8<<¢ºº:??Ù²å¶¿ß À‡?ü ªª*>~„!ð×   `Í[7%øÏT]]­|‰ÀÓ÷~)¸'$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"„@!$B‰@"ÿ “0†T´:ËIEND®B`‚tuigreet-0.9.1/i18n.toml000066400000000000000000000001051462617235300150320ustar00rootroot00000000000000fallback_language = "en-US" [fluent] assets_dir = "contrib/locales" tuigreet-0.9.1/src/000077500000000000000000000000001462617235300141515ustar00rootroot00000000000000tuigreet-0.9.1/src/event.rs000066400000000000000000000025541462617235300156460ustar00rootroot00000000000000use std::time::Duration; use crossterm::event::{Event as TermEvent, EventStream, KeyEvent}; use futures::{future::FutureExt, StreamExt}; use tokio::{ process::Command, sync::mpsc::{self, Sender}, }; use crate::AuthStatus; const FRAME_RATE: f64 = 2.0; pub enum Event { Key(KeyEvent), Render, PowerCommand(Command), Exit(AuthStatus), } pub struct Events { rx: mpsc::Receiver, tx: mpsc::Sender, } impl Events { pub async fn new() -> Events { let (tx, rx) = mpsc::channel(10); tokio::task::spawn({ let tx = tx.clone(); async move { let mut stream = EventStream::new(); let mut render_interval = tokio::time::interval(Duration::from_secs_f64(1.0 / FRAME_RATE)); loop { let render = render_interval.tick(); let event = stream.next().fuse(); tokio::select! { event = event => { if let Some(Ok(TermEvent::Key(event))) = event { let _ = tx.send(Event::Key(event)).await; let _ = tx.send(Event::Render).await; } } _ = render => { let _ = tx.send(Event::Render).await; }, } } } }); Events { rx, tx } } pub async fn next(&mut self) -> Option { self.rx.recv().await } pub fn sender(&self) -> Sender { self.tx.clone() } } tuigreet-0.9.1/src/greeter.rs000066400000000000000000000512261462617235300161620ustar00rootroot00000000000000use std::{ convert::TryInto, env, error::Error, fmt::{self, Display}, path::PathBuf, process, sync::Arc, }; use chrono::{ format::{Item, StrftimeItems}, Locale, }; use getopts::{Matches, Options}; use i18n_embed::DesktopLanguageRequester; use tokio::{ net::UnixStream, sync::{mpsc::Sender, RwLock, RwLockWriteGuard}, }; use zeroize::Zeroize; use crate::{ event::Event, info::{get_issue, get_last_command, get_last_session_path, get_last_user_command, get_last_user_name, get_last_user_session, get_last_user_username, get_min_max_uids, get_sessions, get_users}, power::PowerOption, ui::{ common::{masked::MaskedString, menu::Menu, style::Theme}, power::Power, sessions::{Session, SessionSource, SessionType}, users::User, }, }; const DEFAULT_LOG_FILE: &str = "/tmp/tuigreet.log"; const DEFAULT_LOCALE: Locale = Locale::en_US; const DEFAULT_ASTERISKS_CHARS: &str = "*"; // `startx` wants an absolute path to the executable as a first argument. // We don't want to resolve the session command in the greeter though, so it should be additionally wrapped with a known noop command (like `/usr/bin/env`). const DEFAULT_XSESSION_WRAPPER: &str = "startx /usr/bin/env"; #[derive(Debug, Copy, Clone)] pub enum AuthStatus { Success, Failure, Cancel, } impl Display for AuthStatus { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{:?}", self) } } impl Error for AuthStatus {} // A mode represents the large section of the software, usually screens to be // displayed, or the state of the application. #[derive(SmartDefault, Debug, Copy, Clone, PartialEq)] pub enum Mode { #[default] Username, Password, Action, Users, Command, Sessions, Power, Processing, } // This enum models how secret values should be displayed on terminal. #[derive(SmartDefault, Debug, Clone)] pub enum SecretDisplay { #[default] // All characters hidden. Hidden, // All characters are replaced by a placeholder character. Character(String), } impl SecretDisplay { pub fn show(&self) -> bool { match self { SecretDisplay::Hidden => false, SecretDisplay::Character(_) => true, } } } // This enum models text alignment options #[derive(SmartDefault, Debug, Clone)] pub enum GreetAlign { #[default] Center, Left, Right, } #[derive(SmartDefault)] pub struct Greeter { pub debug: bool, pub logfile: String, #[default(DEFAULT_LOCALE)] pub locale: Locale, pub config: Option, pub socket: String, pub stream: Option>>, pub events: Option>, // Current mode of the application, will define what actions are permitted. pub mode: Mode, // Mode the application will return to when exiting the current mode. pub previous_mode: Mode, // Offset the cursor should be at from its base position for the current mode. pub cursor_offset: i16, // Buffer to be used as a temporary editing zone for the various modes. // Previous buffer is saved when a transient screen has to use the buffer, to // be able to restore it when leaving the transient screen. pub previous_buffer: Option, pub buffer: String, // Define the selected session and how to resolve it. pub session_source: SessionSource, // List of session files found on disk. pub session_paths: Vec<(PathBuf, SessionType)>, // Menu for session selection. pub sessions: Menu, // Wrapper command to prepend to non-X11 sessions. pub session_wrapper: Option, // Wrapper command to prepend to X11 sessions. pub xsession_wrapper: Option, // Whether user menu is enabled. pub user_menu: bool, // Menu for user selection. pub users: Menu, // Current username. Masked to display the full name if available. pub username: MaskedString, // Prompt that should be displayed to ask for entry. pub prompt: Option, // Whether the current edition prompt should be hidden. pub asking_for_secret: bool, // How should secrets be displayed? pub secret_display: SecretDisplay, // Whether last logged-in user should be remembered. pub remember: bool, // Whether last launched session (regardless of user) should be remembered. pub remember_session: bool, // Whether last launched session for the current user should be remembered. pub remember_user_session: bool, // Style object for the terminal UI pub theme: Theme, // Greeting message (MOTD) to use to welcome the user. pub greeting: Option, // Transaction message to show to the user. pub message: Option, // Menu for power options. pub powers: Menu, // Whether to prefix the power commands with `setsid`. pub power_setsid: bool, #[default(2)] pub kb_command: u8, #[default(3)] pub kb_sessions: u8, #[default(12)] pub kb_power: u8, // The software is waiting for a response from `greetd`. pub working: bool, // We are done working. pub done: bool, // Should we exit? pub exit: Option, } impl Drop for Greeter { fn drop(&mut self) { self.scrub(true, false); } } impl Greeter { pub async fn new(events: Sender) -> Self { let mut greeter = Self::default(); greeter.events = Some(events); greeter.set_locale(); greeter.powers = Menu { title: fl!("title_power"), options: Default::default(), selected: 0, }; greeter.parse_options().await; let sessions = get_sessions(&greeter).unwrap_or_default(); if let SessionSource::None = greeter.session_source { if !sessions.is_empty() { greeter.session_source = SessionSource::Session(0); } } greeter.sessions = Menu { title: fl!("title_session"), options: sessions, selected: 0, }; // If we should remember the last logged-in user. if greeter.remember { if let Some(username) = get_last_user_username() { greeter.username = MaskedString::from(username, get_last_user_name()); // If, on top of that, we should remember their last session. if greeter.remember_user_session { // See if we have the last free-form command from the user. if let Ok(command) = get_last_user_command(greeter.username.get()) { greeter.session_source = SessionSource::Command(command); } // If a session was saved, use it and its name. if let Ok(ref session_path) = get_last_user_session(greeter.username.get()) { // Set the selected menu option and the session source. if let Some(index) = greeter.sessions.options.iter().position(|Session { path, .. }| path.as_deref() == Some(session_path)) { greeter.sessions.selected = index; greeter.session_source = SessionSource::Session(greeter.sessions.selected); } } } } } // Same thing, but not user specific. if greeter.remember_session { if let Ok(command) = get_last_command() { greeter.session_source = SessionSource::Command(command.trim().to_string()); } if let Ok(ref session_path) = get_last_session_path() { if let Some(index) = greeter.sessions.options.iter().position(|Session { path, .. }| path.as_deref() == Some(session_path)) { greeter.sessions.selected = index; greeter.session_source = SessionSource::Session(greeter.sessions.selected); } } } greeter } // Scrub memory of all data, unless `soft` is true, in which case, we will // keep the username (can happen if a wrong password was entered, we want to // give the user another chance, as PAM would). fn scrub(&mut self, scrub_message: bool, soft: bool) { self.buffer.zeroize(); self.prompt.zeroize(); if !soft { self.username.zeroize(); } if scrub_message { self.message.zeroize(); } } // Reset the software to its initial state. pub async fn reset(&mut self, soft: bool) { if soft { self.mode = Mode::Password; self.previous_mode = Mode::Password; } else { self.mode = Mode::Username; self.previous_mode = Mode::Username; } self.working = false; self.done = false; self.scrub(false, soft); self.connect().await; } // Connect to `greetd` and return a stream we can safely write to. pub async fn connect(&mut self) { match UnixStream::connect(&self.socket).await { Ok(stream) => self.stream = Some(Arc::new(RwLock::new(stream))), Err(err) => { eprintln!("{err}"); process::exit(1); } } } pub fn config(&self) -> &Matches { self.config.as_ref().unwrap() } pub async fn stream(&self) -> RwLockWriteGuard<'_, UnixStream> { self.stream.as_ref().unwrap().write().await } pub fn option(&self, name: &str) -> Option { self.config().opt_str(name) } // Returns the width of the main window where content is displayed from the // provided arguments. pub fn width(&self) -> u16 { if let Some(value) = self.option("width") { if let Ok(width) = value.parse::() { return width; } } 80 } // Returns the padding of the screen from the provided arguments. pub fn window_padding(&self) -> u16 { if let Some(value) = self.option("window-padding") { if let Ok(padding) = value.parse::() { return padding; } } 0 } // Returns the padding of the main window where content is displayed from the // provided arguments. pub fn container_padding(&self) -> u16 { if let Some(value) = self.option("container-padding") { if let Ok(padding) = value.parse::() { return padding + 1; } } 2 } // Returns the spacing between each prompt from the provided arguments. pub fn prompt_padding(&self) -> u16 { if let Some(value) = self.option("prompt-padding") { if let Ok(padding) = value.parse::() { return padding; } } 1 } pub fn greet_align(&self) -> GreetAlign { if let Some(value) = self.option("greet-align") { match value.as_str() { "left" => GreetAlign::Left, "right" => GreetAlign::Right, _ => GreetAlign::Center, } } else { GreetAlign::default() } } // Sets the locale that will be used for this invocation from environment. fn set_locale(&mut self) { let locale = DesktopLanguageRequester::requested_languages() .into_iter() .next() .and_then(|locale| locale.region.map(|region| format!("{}_{region}", locale.language))) .and_then(|id| id.as_str().try_into().ok()); if let Some(locale) = locale { self.locale = locale; } } pub fn options() -> Options { let mut opts = Options::new(); let xsession_wrapper_desc = format!("wrapper command to initialize X server and launch X11 sessions (default: {DEFAULT_XSESSION_WRAPPER})"); opts.optflag("h", "help", "show this usage information"); opts.optflag("v", "version", "print version information"); opts.optflagopt("d", "debug", "enable debug logging to the provided file, or to /tmp/tuigreet.log", "FILE"); opts.optopt("c", "cmd", "command to run", "COMMAND"); opts.optopt("s", "sessions", "colon-separated list of Wayland session paths", "DIRS"); opts.optopt("", "session-wrapper", "wrapper command to initialize the non-X11 session", "'CMD [ARGS]...'"); opts.optopt("x", "xsessions", "colon-separated list of X11 session paths", "DIRS"); opts.optopt("", "xsession-wrapper", xsession_wrapper_desc.as_str(), "'CMD [ARGS]...'"); opts.optflag("", "no-xsession-wrapper", "do not wrap commands for X11 sessions"); opts.optopt("w", "width", "width of the main prompt (default: 80)", "WIDTH"); opts.optflag("i", "issue", "show the host's issue file"); opts.optopt("g", "greeting", "show custom text above login prompt", "GREETING"); opts.optflag("t", "time", "display the current date and time"); opts.optopt("", "time-format", "custom strftime format for displaying date and time", "FORMAT"); opts.optflag("r", "remember", "remember last logged-in username"); opts.optflag("", "remember-session", "remember last selected session"); opts.optflag("", "remember-user-session", "remember last selected session for each user"); opts.optflag("", "user-menu", "allow graphical selection of users from a menu"); opts.optopt("", "user-menu-min-uid", "minimum UID to display in the user selection menu", "UID"); opts.optopt("", "user-menu-max-uid", "maximum UID to display in the user selection menu", "UID"); opts.optopt("", "theme", "define the application theme colors", "THEME"); opts.optflag("", "asterisks", "display asterisks when a secret is typed"); opts.optopt("", "asterisks-char", "characters to be used to redact secrets (default: *)", "CHARS"); opts.optopt("", "window-padding", "padding inside the terminal area (default: 0)", "PADDING"); opts.optopt("", "container-padding", "padding inside the main prompt container (default: 1)", "PADDING"); opts.optopt("", "prompt-padding", "padding between prompt rows (default: 1)", "PADDING"); opts.optopt( "", "greet-align", "alignment of the greeting text in the main prompt container (default: 'center')", "[left|center|right]", ); opts.optopt("", "power-shutdown", "command to run to shut down the system", "'CMD [ARGS]...'"); opts.optopt("", "power-reboot", "command to run to reboot the system", "'CMD [ARGS]...'"); opts.optflag("", "power-no-setsid", "do not prefix power commands with setsid"); opts.optopt("", "kb-command", "F-key to use to open the command menu", "[1-12]"); opts.optopt("", "kb-sessions", "F-key to use to open the sessions menu", "[1-12]"); opts.optopt("", "kb-power", "F-key to use to open the power menu", "[1-12]"); opts } // Parses command line arguments to configured the software accordingly. pub async fn parse_options(&mut self) { let opts = Greeter::options(); self.config = match opts.parse(env::args().collect::>()) { Ok(matches) => Some(matches), Err(err) => { eprintln!("{err}"); print_usage(opts); process::exit(1); } }; if self.config().opt_present("help") { print_usage(opts); process::exit(0); } if self.config().opt_present("version") { print_version(); process::exit(0); } match env::var("GREETD_SOCK") { Ok(socket) => self.socket = socket, Err(_) => { eprintln!("GREETD_SOCK must be defined"); process::exit(1); } } if self.config().opt_present("debug") { self.debug = true; self.logfile = match self.config().opt_str("debug") { Some(file) => file.to_string(), None => DEFAULT_LOG_FILE.to_string(), } } if self.config().opt_present("issue") && self.config().opt_present("greeting") { eprintln!("Only one of --issue and --greeting may be used at the same time"); print_usage(opts); process::exit(1); } if self.config().opt_present("theme") { if let Some(spec) = self.config().opt_str("theme") { self.theme = Theme::parse(spec.as_str()); } } if self.config().opt_present("asterisks") { let asterisk = if let Some(value) = self.config().opt_str("asterisks-char") { if value.chars().count() < 1 { eprintln!("--asterisks-char must have at least one character as its value"); print_usage(opts); process::exit(1); } value } else { DEFAULT_ASTERISKS_CHARS.to_string() }; self.secret_display = SecretDisplay::Character(asterisk); } if let Some(format) = self.config().opt_str("time-format") { if StrftimeItems::new(&format).any(|item| item == Item::Error) { eprintln!("Invalid strftime format provided in --time-format"); process::exit(1); } } if self.config().opt_present("user-menu") { self.user_menu = true; let min_uid = self.config().opt_str("user-menu-min-uid").and_then(|uid| uid.parse::().ok()); let max_uid = self.config().opt_str("user-menu-max-uid").and_then(|uid| uid.parse::().ok()); let (min_uid, max_uid) = get_min_max_uids(min_uid, max_uid); tracing::info!("min/max UIDs are {}/{}", min_uid, max_uid); if min_uid >= max_uid { eprintln!("Minimum UID ({min_uid}) must be less than maximum UID ({max_uid})"); process::exit(1); } self.users = Menu { title: fl!("title_users"), options: get_users(min_uid, max_uid), selected: 0, }; tracing::info!("found {} users", self.users.options.len()); } if self.config().opt_present("remember-session") && self.config().opt_present("remember-user-session") { eprintln!("Only one of --remember-session and --remember-user-session may be used at the same time"); print_usage(opts); process::exit(1); } if self.config().opt_present("remember-user-session") && !self.config().opt_present("remember") { eprintln!("--remember-session must be used with --remember"); print_usage(opts); process::exit(1); } self.remember = self.config().opt_present("remember"); self.remember_session = self.config().opt_present("remember-session"); self.remember_user_session = self.config().opt_present("remember-user-session"); self.greeting = self.option("greeting"); // If the `--cmd` argument is provided, it will override the selected session. if let Some(command) = self.option("cmd") { self.session_source = SessionSource::Command(command); } if let Some(dirs) = self.option("sessions") { self.session_paths.extend(env::split_paths(&dirs).map(|dir| (dir, SessionType::Wayland))); } if let Some(dirs) = self.option("xsessions") { self.session_paths.extend(env::split_paths(&dirs).map(|dir| (dir, SessionType::X11))); } if self.option("session-wrapper").is_some() { self.session_wrapper = self.option("session-wrapper"); } if !self.config().opt_present("no-xsession-wrapper") { self.xsession_wrapper = self.option("xsession-wrapper").or_else(|| Some(DEFAULT_XSESSION_WRAPPER.to_string())); } if self.config().opt_present("issue") { self.greeting = get_issue(); } self.powers.options.push(Power { action: PowerOption::Shutdown, label: fl!("shutdown"), command: self.config().opt_str("power-shutdown"), }); self.powers.options.push(Power { action: PowerOption::Reboot, label: fl!("reboot"), command: self.config().opt_str("power-reboot"), }); self.power_setsid = !self.config().opt_present("power-no-setsid"); self.kb_command = self.config().opt_str("kb-command").map(|i| i.parse::().unwrap_or_default()).unwrap_or(2); self.kb_sessions = self.config().opt_str("kb-sessions").map(|i| i.parse::().unwrap_or_default()).unwrap_or(3); self.kb_power = self.config().opt_str("kb-power").map(|i| i.parse::().unwrap_or_default()).unwrap_or(12); if self.kb_command == self.kb_sessions || self.kb_sessions == self.kb_power || self.kb_power == self.kb_command { eprintln!("keybindings must all be distinct"); print_usage(opts); process::exit(1); } self.connect().await; } pub fn set_prompt(&mut self, prompt: &str) { self.prompt = if prompt.ends_with(' ') { Some(prompt.into()) } else { Some(format!("{prompt} ")) }; } pub fn remove_prompt(&mut self) { self.prompt = None; } // Computes the size of the prompt to help determine where input should start. pub fn prompt_width(&self) -> usize { match &self.prompt { None => 0, Some(prompt) => prompt.chars().count(), } } } fn print_usage(opts: Options) { eprint!("{}", opts.usage("Usage: tuigreet [OPTIONS]")); } fn print_version() { println!("tuigreet {} ({})", env!("VERSION"), env!("TARGET")); println!("Copyright (C) 2020 Antoine POPINEAU ."); println!("Licensed under GPLv3+ (GNU GPL version 3 or later)."); println!(); println!("This is free software, you are welcome to redistribute it under some conditions."); println!("There is NO WARRANTY, to the extent provided by law."); } #[cfg(test)] mod test { use crate::Greeter; #[test] fn test_prompt_width() { let mut greeter = Greeter::default(); greeter.prompt = None; assert_eq!(greeter.prompt_width(), 0); greeter.prompt = Some("Hello:".into()); assert_eq!(greeter.prompt_width(), 6); } #[test] fn test_set_prompt() { let mut greeter = Greeter::default(); greeter.set_prompt("Hello:"); assert_eq!(greeter.prompt, Some("Hello: ".into())); greeter.set_prompt("Hello World: "); assert_eq!(greeter.prompt, Some("Hello World: ".into())); greeter.remove_prompt(); assert_eq!(greeter.prompt, None); } } tuigreet-0.9.1/src/info.rs000066400000000000000000000177001462617235300154570ustar00rootroot00000000000000use std::{ env, error::Error, fs::{self, File}, io::{self, BufRead, BufReader}, path::{Path, PathBuf}, process::Command, }; use ini::Ini; use lazy_static::lazy_static; use nix::sys::utsname; use uzers::os::unix::UserExt; use crate::{ ui::{ common::masked::MaskedString, sessions::{Session, SessionType}, users::User, }, Greeter, }; const LAST_USER_USERNAME: &str = "/var/cache/tuigreet/lastuser"; const LAST_USER_NAME: &str = "/var/cache/tuigreet/lastuser-name"; const LAST_COMMAND: &str = "/var/cache/tuigreet/lastsession"; const LAST_SESSION: &str = "/var/cache/tuigreet/lastsession-path"; const DEFAULT_MIN_UID: u16 = 1000; const DEFAULT_MAX_UID: u16 = 60000; lazy_static! { static ref XDG_DATA_DIRS: Vec = { let value = env::var("XDG_DATA_DIRS").unwrap_or("/usr/local/share:/usr/share".to_string()); env::split_paths(&value).filter(|p| p.is_absolute()).collect() }; static ref DEFAULT_SESSION_PATHS: Vec<(PathBuf, SessionType)> = XDG_DATA_DIRS .iter() .map(|p| (p.join("wayland-sessions"), SessionType::Wayland)) .chain(XDG_DATA_DIRS.iter().map(|p| (p.join("xsessions"), SessionType::X11))) .collect(); } pub fn get_hostname() -> String { match utsname::uname() { Ok(uts) => uts.nodename().to_str().unwrap_or("").to_string(), _ => String::new(), } } pub fn get_issue() -> Option { let vtnr: usize = env::var("XDG_VTNR").unwrap_or_else(|_| "0".to_string()).parse().expect("unable to parse VTNR"); let uts = utsname::uname(); if let Ok(issue) = fs::read_to_string("/etc/issue") { let issue = issue.replace("\\S", "Linux").replace("\\l", &format!("tty{vtnr}")); return match uts { Ok(uts) => Some( issue .replace("\\s", uts.sysname().to_str().unwrap_or("")) .replace("\\r", uts.release().to_str().unwrap_or("")) .replace("\\v", uts.version().to_str().unwrap_or("")) .replace("\\n", uts.nodename().to_str().unwrap_or("")) .replace("\\m", uts.machine().to_str().unwrap_or("")) .replace("\\\\", "\\"), ), _ => Some(issue), }; } None } pub fn get_last_user_username() -> Option { match fs::read_to_string(LAST_USER_USERNAME).ok() { None => None, Some(username) => { let username = username.trim(); if username.is_empty() { None } else { Some(username.to_string()) } } } } pub fn get_last_user_name() -> Option { match fs::read_to_string(LAST_USER_NAME).ok() { None => None, Some(name) => { let name = name.trim(); if name.is_empty() { None } else { Some(name.to_string()) } } } } pub fn write_last_username(username: &MaskedString) { let _ = fs::write(LAST_USER_USERNAME, &username.value); if let Some(ref name) = username.mask { let _ = fs::write(LAST_USER_NAME, name); } else { let _ = fs::remove_file(LAST_USER_NAME); } } pub fn get_last_session_path() -> Result { Ok(PathBuf::from(fs::read_to_string(LAST_SESSION)?.trim())) } pub fn get_last_command() -> Result { Ok(fs::read_to_string(LAST_COMMAND)?.trim().to_string()) } pub fn write_last_session_path

(session: &P) where P: AsRef, { let _ = fs::write(LAST_SESSION, session.as_ref().to_string_lossy().as_bytes()); } pub fn write_last_command(session: &str) { let _ = fs::write(LAST_COMMAND, session); } pub fn get_last_user_session(username: &str) -> Result { Ok(PathBuf::from(fs::read_to_string(format!("{LAST_SESSION}-{username}"))?.trim())) } pub fn get_last_user_command(username: &str) -> Result { Ok(fs::read_to_string(format!("{LAST_COMMAND}-{username}"))?.trim().to_string()) } pub fn write_last_user_session

(username: &str, session: P) where P: AsRef, { let _ = fs::write(format!("{LAST_SESSION}-{username}"), session.as_ref().to_string_lossy().as_bytes()); } pub fn delete_last_session() { let _ = fs::remove_file(LAST_SESSION); } pub fn write_last_user_command(username: &str, session: &str) { let _ = fs::write(format!("{LAST_COMMAND}-{username}"), session); } pub fn delete_last_user_session(username: &str) { let _ = fs::remove_file(format!("{LAST_SESSION}-{username}")); } pub fn delete_last_command() { let _ = fs::remove_file(LAST_COMMAND); } pub fn delete_last_user_command(username: &str) { let _ = fs::remove_file(format!("{LAST_COMMAND}-{username}")); } pub fn get_users(min_uid: u16, max_uid: u16) -> Vec { let users = unsafe { uzers::all_users() }; let users: Vec = users .filter(|user| user.uid() >= min_uid as u32 && user.uid() <= max_uid as u32) .map(|user| User { username: user.name().to_string_lossy().to_string(), name: match user.gecos() { name if name.is_empty() => None, name => Some(name.to_string_lossy().to_string()), }, }) .collect(); users } pub fn get_min_max_uids(min_uid: Option, max_uid: Option) -> (u16, u16) { if let (Some(min_uid), Some(max_uid)) = (min_uid, max_uid) { return (min_uid, max_uid); } let overrides = (min_uid, max_uid); let default = (min_uid.unwrap_or(DEFAULT_MIN_UID), max_uid.unwrap_or(DEFAULT_MAX_UID)); match File::open("/etc/login.defs") { Err(_) => default, Ok(file) => { let file = BufReader::new(file); let uids: (u16, u16) = file.lines().fold(default, |acc, line| { line .map(|line| { let mut tokens = line.split_whitespace(); match (overrides, tokens.next(), tokens.next()) { ((None, _), Some("UID_MIN"), Some(value)) => (value.parse::().unwrap_or(acc.0), acc.1), ((_, None), Some("UID_MAX"), Some(value)) => (acc.0, value.parse::().unwrap_or(acc.1)), _ => acc, } }) .unwrap_or(acc) }); uids } } } pub fn get_sessions(greeter: &Greeter) -> Result, Box> { let paths = if greeter.session_paths.is_empty() { DEFAULT_SESSION_PATHS.as_ref() } else { &greeter.session_paths }; let mut files = vec![]; for (path, session_type) in paths.iter() { if let Ok(entries) = fs::read_dir(path) { files.extend(entries.flat_map(|entry| entry.map(|entry| load_desktop_file(entry.path(), *session_type))).flatten().flatten()); } } files.sort_by(|a, b| a.name.cmp(&b.name)); tracing::info!("found {} sessions", files.len()); Ok(files) } fn load_desktop_file

(path: P, session_type: SessionType) -> Result, Box> where P: AsRef, { let desktop = Ini::load_from_file(path.as_ref())?; let section = desktop.section(Some("Desktop Entry")).ok_or("no Desktop Entry section in desktop file")?; if let Some("true") = section.get("Hidden") { return Ok(None); } if let Some("true") = section.get("NoDisplay") { return Ok(None); } let slug = path.as_ref().file_stem().map(|slug| slug.to_string_lossy().to_string()); let name = section.get("Name").ok_or("no Name property in desktop file")?; let exec = section.get("Exec").ok_or("no Exec property in desktop file")?; let xdg_desktop_names = section.get("DesktopNames").map(str::to_string); Ok(Some(Session { slug, name: name.to_string(), command: exec.to_string(), session_type, path: Some(path.as_ref().into()), xdg_desktop_names, })) } pub fn capslock_status() -> bool { let mut command = Command::new("kbdinfo"); command.args(["gkbled", "capslock"]); match command.output() { Ok(output) => output.status.code() == Some(0), Err(_) => false, } } #[cfg(feature = "nsswrapper")] #[cfg(test)] mod nsswrapper_tests { #[test] fn nsswrapper_get_users_from_nss() { use super::get_users; let users = get_users(1000, 2000); assert_eq!(users.len(), 2); assert_eq!(users[0].username, "joe"); assert_eq!(users[0].name, Some("Joe".to_string())); assert_eq!(users[1].username, "bob"); assert_eq!(users[1].name, None); } } tuigreet-0.9.1/src/ipc.rs000066400000000000000000000250601462617235300152750ustar00rootroot00000000000000use std::{borrow::Cow, error::Error, sync::Arc}; use greetd_ipc::{codec::TokioCodec, AuthMessageType, ErrorType, Request, Response}; use tokio::sync::{ mpsc::{Receiver, Sender}, Mutex, RwLock, }; use crate::{ event::Event, info::{delete_last_user_command, delete_last_user_session, write_last_user_command, write_last_user_session, write_last_username}, macros::SafeDebug, ui::sessions::{Session, SessionSource, SessionType}, AuthStatus, Greeter, Mode, }; #[derive(Clone)] pub struct Ipc(Arc); pub struct IpcHandle { tx: RwLock>, rx: Mutex>, } impl Ipc { pub fn new() -> Ipc { let (tx, rx) = tokio::sync::mpsc::channel::(10); Ipc(Arc::new(IpcHandle { tx: RwLock::new(tx), rx: Mutex::new(rx), })) } pub async fn send(&self, request: Request) { tracing::info!("sending request to greetd: {}", request.safe_repr()); let _ = self.0.tx.read().await.send(request).await; } pub async fn next(&mut self) -> Option { self.0.rx.lock().await.recv().await } pub async fn handle(&mut self, greeter: Arc>) -> Result<(), Box> { let request = self.next().await; if let Some(request) = request { let stream = { let greeter = greeter.read().await; greeter.stream.as_ref().unwrap().clone() }; let response = { request.write_to(&mut *stream.write().await).await?; let response = Response::read_from(&mut *stream.write().await).await?; greeter.write().await.working = false; response }; self.parse_response(&mut *greeter.write().await, response).await?; } Ok(()) } async fn parse_response(&mut self, greeter: &mut Greeter, response: Response) -> Result<(), Box> { // Do not display actual message from greetd, which may contain entered information, sometimes passwords. match response { Response::Error { ref error_type, .. } => tracing::info!("received greetd error message: {error_type:?}"), ref response => tracing::info!("received greetd message: {:?}", response), } match response { Response::AuthMessage { auth_message_type, auth_message } => match auth_message_type { AuthMessageType::Secret => { greeter.mode = Mode::Password; greeter.working = false; greeter.asking_for_secret = true; greeter.set_prompt(&auth_message); } AuthMessageType::Visible => { greeter.mode = Mode::Password; greeter.working = false; greeter.asking_for_secret = false; greeter.set_prompt(&auth_message); } AuthMessageType::Error => { greeter.message = Some(auth_message); self.send(Request::PostAuthMessageResponse { response: None }).await; } AuthMessageType::Info => { greeter.remove_prompt(); greeter.previous_mode = greeter.mode; greeter.mode = Mode::Action; if let Some(message) = &mut greeter.message { message.push('\n'); message.push_str(auth_message.trim_end()); } else { greeter.message = Some(auth_message.trim_end().to_string()); } self.send(Request::PostAuthMessageResponse { response: None }).await; } }, Response::Success => { if greeter.done { tracing::info!("greetd acknowledged session start, exiting"); if greeter.remember { tracing::info!("caching last successful username"); write_last_username(&greeter.username); if greeter.remember_user_session { match greeter.session_source { SessionSource::Command(ref command) => { tracing::info!("caching last user command: {command}"); write_last_user_command(&greeter.username.value, command); delete_last_user_session(&greeter.username.value); } SessionSource::Session(index) => { if let Some(Session { path: Some(session_path), .. }) = greeter.sessions.options.get(index) { tracing::info!("caching last user session: {session_path:?}"); write_last_user_session(&greeter.username.value, session_path); delete_last_user_command(&greeter.username.value); } } _ => {} } } } if let Some(ref sender) = greeter.events { let _ = sender.send(Event::Exit(AuthStatus::Success)).await; } } else { tracing::info!("authentication successful, starting session"); match greeter.session_source.command(greeter).map(str::to_string) { None => { Ipc::cancel(greeter).await; greeter.message = Some(fl!("command_missing")); greeter.reset(false).await; } Some(command) if command.is_empty() => { Ipc::cancel(greeter).await; greeter.message = Some(fl!("command_missing")); greeter.reset(false).await; } Some(command) => { greeter.done = true; greeter.mode = Mode::Processing; let session = Session::get_selected(greeter); let (command, env) = wrap_session_command(greeter, session, &command); #[cfg(not(debug_assertions))] self.send(Request::StartSession { cmd: vec![command.to_string()], env }).await; #[cfg(debug_assertions)] { let _ = command; let _ = env; self .send(Request::StartSession { cmd: vec!["true".to_string()], env: vec![], }) .await; } } } } } Response::Error { error_type, .. } => { // Do not display actual message from greetd, which may contain entered information, sometimes passwords. tracing::info!("received an error from greetd: {error_type:?}"); Ipc::cancel(greeter).await; match error_type { ErrorType::AuthError => { greeter.message = Some(fl!("failed")); self .send(Request::CreateSession { username: greeter.username.value.clone(), }) .await; greeter.reset(true).await; } ErrorType::Error => { // Do not display actual message from greetd, which may contain entered information, sometimes passwords. greeter.message = Some("An error was received from greetd".to_string()); greeter.reset(false).await; } } } } Ok(()) } pub async fn cancel(greeter: &mut Greeter) { tracing::info!("cancelling session"); let _ = Request::CancelSession.write_to(&mut *greeter.stream().await).await; } } fn desktop_names_to_xdg(names: &str) -> String { names.replace(';', ":").trim_end_matches(':').to_string() } fn wrap_session_command<'a>(greeter: &Greeter, session: Option<&Session>, command: &'a str) -> (Cow<'a, str>, Vec) { let mut env: Vec = vec![]; if let Some(Session { slug, session_type, xdg_desktop_names, .. }) = session { if let Some(slug) = slug { env.push(format!("XDG_SESSION_DESKTOP={slug}")); env.push(format!("DESKTOP_SESSION={slug}")); } if *session_type != SessionType::None { env.push(format!("XDG_SESSION_TYPE={}", session_type.as_xdg_session_type())); } if let Some(xdg_desktop_names) = xdg_desktop_names { env.push(format!("XDG_CURRENT_DESKTOP={}", desktop_names_to_xdg(xdg_desktop_names))); } if *session_type == SessionType::X11 { if let Some(ref wrap) = greeter.xsession_wrapper { return (Cow::Owned(format!("{} {}", wrap, command)), env); } } else if let Some(ref wrap) = greeter.session_wrapper { return (Cow::Owned(format!("{} {}", wrap, command)), env); } } else if let Some(ref wrap) = greeter.session_wrapper { return (Cow::Owned(format!("{} {}", wrap, command)), env); } (Cow::Borrowed(command), env) } #[cfg(test)] mod test { use std::path::PathBuf; use crate::{ ipc::desktop_names_to_xdg, ui::sessions::{Session, SessionType}, Greeter, }; use super::wrap_session_command; #[test] fn wayland_no_wrapper() { let greeter = Greeter::default(); let session = Session { name: "Session1".into(), session_type: SessionType::Wayland, command: "Session1Cmd".into(), path: Some(PathBuf::from("/Session1Path")), ..Default::default() }; let (command, env) = wrap_session_command(&greeter, Some(&session), &session.command); assert_eq!(command.as_ref(), "Session1Cmd"); assert_eq!(env, vec!["XDG_SESSION_TYPE=wayland"]); } #[test] fn wayland_wrapper() { let mut greeter = Greeter::default(); greeter.session_wrapper = Some("/wrapper.sh".into()); let session = Session { name: "Session1".into(), session_type: SessionType::Wayland, command: "Session1Cmd".into(), path: Some(PathBuf::from("/Session1Path")), ..Default::default() }; let (command, env) = wrap_session_command(&greeter, Some(&session), &session.command); assert_eq!(command.as_ref(), "/wrapper.sh Session1Cmd"); assert_eq!(env, vec!["XDG_SESSION_TYPE=wayland"]); } #[test] fn x11_wrapper() { let mut greeter = Greeter::default(); greeter.xsession_wrapper = Some("startx /usr/bin/env".into()); println!("{:?}", greeter.xsession_wrapper); let session = Session { slug: Some("thede".to_string()), name: "Session1".into(), session_type: SessionType::X11, command: "Session1Cmd".into(), path: Some(PathBuf::from("/Session1Path")), xdg_desktop_names: Some("one;two;three;".to_string()), ..Default::default() }; let (command, env) = wrap_session_command(&greeter, Some(&session), &session.command); assert_eq!(command.as_ref(), "startx /usr/bin/env Session1Cmd"); assert_eq!( env, vec!["XDG_SESSION_DESKTOP=thede", "DESKTOP_SESSION=thede", "XDG_SESSION_TYPE=x11", "XDG_CURRENT_DESKTOP=one:two:three"] ); } #[test] fn xdg_current_desktop() { assert_eq!(desktop_names_to_xdg("one;two;three four"), "one:two:three four"); assert_eq!(desktop_names_to_xdg("one;"), "one"); assert_eq!(desktop_names_to_xdg(""), ""); assert_eq!(desktop_names_to_xdg(";"), ""); } } tuigreet-0.9.1/src/keyboard.rs000066400000000000000000000474711462617235300163340ustar00rootroot00000000000000use std::{error::Error, sync::Arc}; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use greetd_ipc::Request; use tokio::sync::RwLock; use crate::{ info::{delete_last_command, delete_last_session, get_last_user_command, get_last_user_session, write_last_command, write_last_session_path}, ipc::Ipc, power::power, ui::{ common::masked::MaskedString, sessions::{Session, SessionSource}, users::User, }, Greeter, Mode, }; // Act on keyboard events. // // This function will be called whenever a keyboard event was captured by the // application. It takes a reference to the `Greeter` so it can be aware of the // current state of the application and act accordinly; It also receives the // `Ipc` interface so it is able to interact with `greetd` if necessary. pub async fn handle(greeter: Arc>, input: KeyEvent, ipc: Ipc) -> Result<(), Box> { let mut greeter = greeter.write().await; if greeter.working { return Ok(()); } match input { // ^U should erase the current buffer. KeyEvent { code: KeyCode::Char('u'), modifiers: KeyModifiers::CONTROL, .. } => match greeter.mode { Mode::Username => greeter.username = MaskedString::default(), Mode::Password => greeter.buffer = String::new(), Mode::Command => greeter.buffer = String::new(), _ => {} }, // In debug mode only, ^X will exit the application. #[cfg(debug_assertions)] KeyEvent { code: KeyCode::Char('x'), modifiers: KeyModifiers::CONTROL, .. } => { use crate::{AuthStatus, Event}; if let Some(ref sender) = greeter.events { let _ = sender.send(Event::Exit(AuthStatus::Cancel)).await; } } // Depending on the active screen, pressing Escape will either return to the // previous mode (close a popup, for example), or cancel the `greetd` // session. KeyEvent { code: KeyCode::Esc, .. } => match greeter.mode { Mode::Command => { greeter.mode = greeter.previous_mode; greeter.buffer = greeter.previous_buffer.take().unwrap_or_default(); greeter.cursor_offset = 0; } Mode::Users | Mode::Sessions | Mode::Power => { greeter.mode = greeter.previous_mode; } _ => { Ipc::cancel(&mut greeter).await; greeter.reset(false).await; } }, // Simple cursor directions in text fields. KeyEvent { code: KeyCode::Left, .. } => greeter.cursor_offset -= 1, KeyEvent { code: KeyCode::Right, .. } => greeter.cursor_offset += 1, // F2 will display the command entry prompt. If we are already in one of the // popup screens, we set the previous screen as being the current previous // screen. KeyEvent { code: KeyCode::F(i), .. } if i == greeter.kb_command => { greeter.previous_mode = match greeter.mode { Mode::Users | Mode::Command | Mode::Sessions | Mode::Power => greeter.previous_mode, _ => greeter.mode, }; // Set the edition buffer to the current command. greeter.previous_buffer = Some(greeter.buffer.clone()); greeter.buffer = greeter.session_source.command(&greeter).map(str::to_string).unwrap_or_default(); greeter.cursor_offset = 0; greeter.mode = Mode::Command; } // F3 will display the session selection menu. If we are already in one of // the popup screens, we set the previous screen as being the current // previous screen. KeyEvent { code: KeyCode::F(i), .. } if i == greeter.kb_sessions => { greeter.previous_mode = match greeter.mode { Mode::Users | Mode::Command | Mode::Sessions | Mode::Power => greeter.previous_mode, _ => greeter.mode, }; greeter.mode = Mode::Sessions; } // F12 will display the user selection menu. If we are already in one of the // popup screens, we set the previous screen as being the current previous // screen. KeyEvent { code: KeyCode::F(i), .. } if i == greeter.kb_power => { greeter.previous_mode = match greeter.mode { Mode::Users | Mode::Command | Mode::Sessions | Mode::Power => greeter.previous_mode, _ => greeter.mode, }; greeter.mode = Mode::Power; } // Handle moving up in menus. KeyEvent { code: KeyCode::Up, .. } => { if let Mode::Users = greeter.mode { if greeter.users.selected > 0 { greeter.users.selected -= 1; } } if let Mode::Sessions = greeter.mode { if greeter.sessions.selected > 0 { greeter.sessions.selected -= 1; } } if let Mode::Power = greeter.mode { if greeter.powers.selected > 0 { greeter.powers.selected -= 1; } } } // Handle moving down in menus. KeyEvent { code: KeyCode::Down, .. } => { if let Mode::Users = greeter.mode { if greeter.users.selected < greeter.users.options.len() - 1 { greeter.users.selected += 1; } } if let Mode::Sessions = greeter.mode { if greeter.sessions.selected < greeter.sessions.options.len() - 1 { greeter.sessions.selected += 1; } } if let Mode::Power = greeter.mode { if greeter.powers.selected < greeter.powers.options.len() - 1 { greeter.powers.selected += 1; } } } // ^A should go to the start of the current prompt KeyEvent { code: KeyCode::Char('a'), modifiers: KeyModifiers::CONTROL, .. } => { let value = { match greeter.mode { Mode::Username => &greeter.username.value, _ => &greeter.buffer, } }; greeter.cursor_offset = -(value.chars().count() as i16); } // ^A should go to the end of the current prompt KeyEvent { code: KeyCode::Char('e'), modifiers: KeyModifiers::CONTROL, .. } => greeter.cursor_offset = 0, // Tab should validate the username entry (same as Enter). KeyEvent { code: KeyCode::Tab, .. } => match greeter.mode { Mode::Username if !greeter.username.value.is_empty() => validate_username(&mut greeter, &ipc).await, _ => {} }, // Enter validates the current entry, depending on the active mode. KeyEvent { code: KeyCode::Enter, .. } => match greeter.mode { Mode::Username if !greeter.username.value.is_empty() => validate_username(&mut greeter, &ipc).await, Mode::Username if greeter.user_menu => { greeter.previous_mode = match greeter.mode { Mode::Users | Mode::Command | Mode::Sessions | Mode::Power => greeter.previous_mode, _ => greeter.mode, }; greeter.buffer = greeter.previous_buffer.take().unwrap_or_default(); greeter.mode = Mode::Users; } Mode::Username => {} Mode::Password => { greeter.working = true; greeter.message = None; ipc .send(Request::PostAuthMessageResponse { response: Some(greeter.buffer.clone()), }) .await; greeter.buffer = String::new(); } Mode::Command => { greeter.sessions.selected = 0; greeter.session_source = SessionSource::Command(greeter.buffer.clone()); if greeter.remember_session { write_last_command(&greeter.buffer); delete_last_session(); } greeter.buffer = greeter.previous_buffer.take().unwrap_or_default(); greeter.mode = greeter.previous_mode; } Mode::Users => { let username = greeter.users.options.get(greeter.users.selected).cloned(); if let Some(User { username, name }) = username { greeter.username = MaskedString::from(username, name); } greeter.mode = greeter.previous_mode; validate_username(&mut greeter, &ipc).await; } Mode::Sessions => { let session = greeter.sessions.options.get(greeter.sessions.selected).cloned(); if let Some(Session { path, .. }) = session { if greeter.remember_session { if let Some(ref path) = path { write_last_session_path(path); delete_last_command(); } } greeter.session_source = SessionSource::Session(greeter.sessions.selected); } greeter.mode = greeter.previous_mode; } Mode::Power => { let power_command = greeter.powers.options.get(greeter.powers.selected).cloned(); if let Some(command) = power_command { power(&mut greeter, command.action).await; } greeter.mode = greeter.previous_mode; } _ => {} }, // Do not handle any other controls keybindings KeyEvent { modifiers: KeyModifiers::CONTROL, .. } => {} // Handle free-form entry of characters. KeyEvent { code: KeyCode::Char(c), .. } => insert_key(&mut greeter, c).await, // Handle deletion of characters. KeyEvent { code: KeyCode::Backspace, .. } | KeyEvent { code: KeyCode::Delete, .. } => delete_key(&mut greeter, input.code).await, _ => {} } Ok(()) } // Handle insertion of characters into the proper buffer, depending on the // current mode and the position of the cursor. async fn insert_key(greeter: &mut Greeter, c: char) { let value = match greeter.mode { Mode::Username => &greeter.username.value, Mode::Password => &greeter.buffer, Mode::Command => &greeter.buffer, _ => return, }; let index = (value.chars().count() as i16 + greeter.cursor_offset) as usize; let left = value.chars().take(index); let right = value.chars().skip(index); let value = left.chain(vec![c].into_iter()).chain(right).collect(); let mode = greeter.mode; match mode { Mode::Username => greeter.username.value = value, Mode::Password => greeter.buffer = value, Mode::Command => greeter.buffer = value, _ => {} }; } // Handle deletion of characters from a prompt into the proper buffer, depending // on the current mode, whether Backspace or Delete was pressed and the position // of the cursor. async fn delete_key(greeter: &mut Greeter, key: KeyCode) { let value = match greeter.mode { Mode::Username => &greeter.username.value, Mode::Password => &greeter.buffer, Mode::Command => &greeter.buffer, _ => return, }; let index = match key { KeyCode::Backspace => (value.chars().count() as i16 + greeter.cursor_offset - 1) as usize, KeyCode::Delete => (value.chars().count() as i16 + greeter.cursor_offset) as usize, _ => 0, }; if value.chars().nth(index).is_some() { let left = value.chars().take(index); let right = value.chars().skip(index + 1); let value = left.chain(right).collect(); match greeter.mode { Mode::Username => greeter.username.value = value, Mode::Password => greeter.buffer = value, Mode::Command => greeter.buffer = value, _ => return, }; if let KeyCode::Delete = key { greeter.cursor_offset += 1; } } } // Creates a `greetd` session for the provided username. async fn validate_username(greeter: &mut Greeter, ipc: &Ipc) { greeter.working = true; greeter.message = None; ipc .send(Request::CreateSession { username: greeter.username.value.clone(), }) .await; greeter.buffer = String::new(); if greeter.remember_user_session { if let Ok(last_session) = get_last_user_session(&greeter.username.value) { if let Some(last_session) = Session::from_path(greeter, last_session).cloned() { tracing::info!("remembered user session is {}", last_session.name); greeter.sessions.selected = greeter.sessions.options.iter().position(|sess| sess.path == last_session.path).unwrap_or(0); greeter.session_source = SessionSource::Session(greeter.sessions.selected); } } if let Ok(command) = get_last_user_command(&greeter.username.value) { tracing::info!("remembered user command is {}", command); greeter.session_source = SessionSource::Command(command); } } } #[cfg(test)] mod test { use std::sync::Arc; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use tokio::sync::RwLock; use super::handle; use crate::{ ipc::Ipc, ui::{common::masked::MaskedString, sessions::SessionSource}, Greeter, Mode, }; #[tokio::test] async fn ctrl_u() { let greeter = Arc::new(RwLock::new(Greeter::default())); { let mut greeter = greeter.write().await; greeter.mode = Mode::Username; greeter.username = MaskedString::from("apognu".to_string(), None); } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::Char('u'), KeyModifiers::CONTROL), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.username.value, "".to_string()); } { let mut greeter = greeter.write().await; greeter.mode = Mode::Password; greeter.buffer = "password".to_string(); } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::Char('u'), KeyModifiers::CONTROL), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.buffer, "".to_string()); } { let mut greeter = greeter.write().await; greeter.mode = Mode::Command; greeter.buffer = "newcommand".to_string(); } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::Char('u'), KeyModifiers::CONTROL), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.buffer, "".to_string()); } } #[tokio::test] async fn escape() { let greeter = Arc::new(RwLock::new(Greeter::default())); { let mut greeter = greeter.write().await; greeter.previous_mode = Mode::Username; greeter.mode = Mode::Command; greeter.previous_buffer = Some("apognu".to_string()); greeter.buffer = "newcommand".to_string(); greeter.cursor_offset = 2; } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::Esc, KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.mode, Mode::Username); assert_eq!(status.buffer, "apognu".to_string()); assert!(matches!(status.previous_buffer, None)); assert_eq!(status.cursor_offset, 0); } for mode in [Mode::Users, Mode::Sessions, Mode::Power] { { let mut greeter = greeter.write().await; greeter.previous_mode = Mode::Username; greeter.mode = mode; } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::Esc, KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.mode, Mode::Username); } } } #[tokio::test] async fn left_right() { let greeter = Arc::new(RwLock::new(Greeter::default())); let result = handle(greeter.clone(), KeyEvent::new(KeyCode::Left, KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.cursor_offset, -1); } let _ = handle(greeter.clone(), KeyEvent::new(KeyCode::Right, KeyModifiers::empty()), Ipc::new()).await; let result = handle(greeter.clone(), KeyEvent::new(KeyCode::Right, KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.cursor_offset, 1); } } #[tokio::test] async fn f2() { let greeter = Arc::new(RwLock::new(Greeter::default())); { let mut greeter = greeter.write().await; greeter.mode = Mode::Username; greeter.buffer = "apognu".to_string(); greeter.session_source = SessionSource::Command("thecommand".to_string()); } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::F(2), KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.mode, Mode::Command); assert_eq!(status.previous_buffer, Some("apognu".to_string())); assert_eq!(status.buffer, "thecommand".to_string()); } for mode in [Mode::Users, Mode::Sessions, Mode::Power] { { let mut greeter = greeter.write().await; greeter.previous_mode = Mode::Username; greeter.mode = mode; } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::F(2), KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.mode, Mode::Command); assert_eq!(status.previous_mode, Mode::Username); } } } #[tokio::test] async fn f_menu() { let greeter = Arc::new(RwLock::new(Greeter::default())); for (key, mode) in [(KeyCode::F(3), Mode::Sessions), (KeyCode::F(12), Mode::Power)] { { let mut greeter = greeter.write().await; greeter.mode = Mode::Username; greeter.buffer = "apognu".to_string(); } let result = handle(greeter.clone(), KeyEvent::new(key, KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.mode, mode); assert_eq!(status.buffer, "apognu".to_string()); } for mode in [Mode::Users, Mode::Sessions, Mode::Power] { { let mut greeter = greeter.write().await; greeter.previous_mode = Mode::Username; greeter.mode = mode; } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::F(2), KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.mode, Mode::Command); assert_eq!(status.previous_mode, Mode::Username); } } } } #[tokio::test] async fn f_menu_rebinded() { let greeter = Arc::new(RwLock::new(Greeter::default())); for (key, mode) in [(KeyCode::F(1), Mode::Sessions), (KeyCode::F(11), Mode::Power)] { { let mut greeter = greeter.write().await; greeter.kb_command = 3; greeter.kb_sessions = 1; greeter.kb_power = 11; greeter.mode = Mode::Username; greeter.buffer = "apognu".to_string(); } let result = handle(greeter.clone(), KeyEvent::new(key, KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.mode, mode); assert_eq!(status.buffer, "apognu".to_string()); } for mode in [Mode::Users, Mode::Sessions, Mode::Power] { { let mut greeter = greeter.write().await; greeter.previous_mode = Mode::Username; greeter.mode = mode; } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::F(3), KeyModifiers::empty()), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.mode, Mode::Command); assert_eq!(status.previous_mode, Mode::Username); } } } } #[tokio::test] async fn ctrl_a_e() { let greeter = Arc::new(RwLock::new(Greeter::default())); { let mut greeter = greeter.write().await; greeter.mode = Mode::Command; greeter.buffer = "123456789".to_string(); } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::Char('a'), KeyModifiers::CONTROL), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.cursor_offset, -9); } let result = handle(greeter.clone(), KeyEvent::new(KeyCode::Char('e'), KeyModifiers::CONTROL), Ipc::new()).await; { let status = greeter.read().await; assert!(matches!(result, Ok(_))); assert_eq!(status.cursor_offset, 0); } } } tuigreet-0.9.1/src/macros.rs000066400000000000000000000012741462617235300160070ustar00rootroot00000000000000use greetd_ipc::Request; pub trait SafeDebug { fn safe_repr(&self) -> String; } impl SafeDebug for Request { fn safe_repr(&self) -> String { match self { msg @ &Request::CancelSession => format!("{:?}", msg), msg @ &Request::CreateSession { .. } => format!("{:?}", msg), &Request::PostAuthMessageResponse { .. } => "PostAuthMessageResponse".to_string(), msg @ &Request::StartSession { .. } => format!("{:?}", msg), } } } macro_rules! fl { ($message_id:literal) => {{ i18n_embed_fl::fl!($crate::ui::MESSAGES, $message_id) }}; ($message_id:literal, $($args:expr),*) => {{ i18n_embed_fl::fl!($crate::ui::MESSAGES, $message_id, $($args),*) }}; } tuigreet-0.9.1/src/main.rs000066400000000000000000000101131462617235300154370ustar00rootroot00000000000000#[macro_use] extern crate smart_default; #[macro_use] mod macros; mod event; mod greeter; mod info; mod ipc; mod keyboard; mod power; mod ui; use std::{error::Error, fs::OpenOptions, io, process, sync::Arc}; use crossterm::{ execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, }; use event::Event; use greetd_ipc::Request; use power::PowerPostAction; use tokio::sync::RwLock; use tracing_appender::non_blocking::WorkerGuard; use tui::{backend::CrosstermBackend, Terminal}; pub use self::greeter::*; use self::{event::Events, ipc::Ipc}; #[tokio::main] async fn main() { if let Err(error) = run().await { if let Some(AuthStatus::Success) = error.downcast_ref::() { return; } process::exit(1); } } async fn run() -> Result<(), Box> { let mut events = Events::new().await; let mut greeter = Greeter::new(events.sender()).await; let mut stdout = io::stdout(); let _guard = init_logger(&greeter); tracing::info!("tuigreet started"); register_panic_handler(); enable_raw_mode()?; execute!(stdout, EnterAlternateScreen)?; let backend = CrosstermBackend::new(stdout); let mut terminal = Terminal::new(backend)?; terminal.clear()?; let ipc = Ipc::new(); if greeter.remember && !greeter.username.value.is_empty() { greeter.working = true; tracing::info!("creating remembered session for user {}", greeter.username.value); ipc .send(Request::CreateSession { username: greeter.username.value.clone(), }) .await; } let greeter = Arc::new(RwLock::new(greeter)); tokio::task::spawn({ let greeter = greeter.clone(); let mut ipc = ipc.clone(); async move { loop { let _ = ipc.handle(greeter.clone()).await; } } }); loop { if let Some(status) = greeter.read().await.exit { tracing::info!("exiting main loop"); return Err(status.into()); } match events.next().await { Some(Event::Render) => ui::draw(greeter.clone(), &mut terminal).await?, Some(Event::Key(key)) => keyboard::handle(greeter.clone(), key, ipc.clone()).await?, Some(Event::Exit(status)) => { crate::exit(&mut *greeter.write().await, status).await; } Some(Event::PowerCommand(command)) => { if let PowerPostAction::ClearScreen = power::run(&greeter, command).await { execute!(io::stdout(), LeaveAlternateScreen)?; terminal.set_cursor(1, 1)?; terminal.clear()?; disable_raw_mode()?; break; } } _ => {} } } Ok(()) } async fn exit(greeter: &mut Greeter, status: AuthStatus) { tracing::info!("preparing exit with status {}", status); match status { AuthStatus::Success => {} AuthStatus::Cancel | AuthStatus::Failure => Ipc::cancel(greeter).await, } clear_screen(); let _ = execute!(io::stdout(), LeaveAlternateScreen); let _ = disable_raw_mode(); greeter.exit = Some(status); } fn register_panic_handler() { let hook = std::panic::take_hook(); std::panic::set_hook(Box::new(move |info| { clear_screen(); let _ = execute!(io::stdout(), LeaveAlternateScreen); let _ = disable_raw_mode(); hook(info); })); } pub fn clear_screen() { let backend = CrosstermBackend::new(io::stdout()); if let Ok(mut terminal) = Terminal::new(backend) { let _ = terminal.hide_cursor(); let _ = terminal.clear(); } } fn init_logger(greeter: &Greeter) -> Option { use tracing_subscriber::filter::{LevelFilter, Targets}; use tracing_subscriber::prelude::*; let logfile = OpenOptions::new().write(true).create(true).append(true).clone(); match (greeter.debug, logfile.open(&greeter.logfile)) { (true, Ok(file)) => { let (appender, guard) = tracing_appender::non_blocking(file); let target = Targets::new().with_target("tuigreet", LevelFilter::DEBUG); tracing_subscriber::registry() .with(tracing_subscriber::fmt::layer().with_writer(appender).with_line_number(true)) .with(target) .init(); Some(guard) } _ => None, } } tuigreet-0.9.1/src/power.rs000066400000000000000000000046251462617235300156620ustar00rootroot00000000000000use std::{process::Stdio, sync::Arc}; use tokio::{process::Command, sync::RwLock}; use crate::{event::Event, ui::power::Power, Greeter, Mode}; #[derive(SmartDefault, Clone, Copy, PartialEq, Eq, Hash)] pub enum PowerOption { #[default] Shutdown, Reboot, } pub async fn power(greeter: &mut Greeter, option: PowerOption) { let command = match greeter.powers.options.iter().find(|opt| opt.action == option) { None => None, Some(Power { command: Some(args), .. }) => { let command = match greeter.power_setsid { true => { let mut command = Command::new("setsid"); command.args(args.split(' ')); command } false => { let mut args = args.split(' '); let mut command = Command::new(args.next().unwrap_or_default()); command.args(args); command } }; Some(command) } Some(_) => { let mut command = Command::new("shutdown"); match option { PowerOption::Shutdown => command.arg("-h"), PowerOption::Reboot => command.arg("-r"), }; command.arg("now"); Some(command) } }; if let Some(mut command) = command { command.stdin(Stdio::null()); command.stdout(Stdio::null()); command.stderr(Stdio::null()); if let Some(ref sender) = greeter.events { let _ = sender.send(Event::PowerCommand(command)).await; } } } pub enum PowerPostAction { Noop, ClearScreen, } pub async fn run(greeter: &Arc>, mut command: Command) -> PowerPostAction { tracing::info!("executing power command: {:?}", command); greeter.write().await.mode = Mode::Processing; let message = match command.output().await { Ok(result) => match (result.status, result.stderr) { (status, _) if status.success() => None, (status, output) => { let status = format!("{} {status}", fl!("command_exited")); let output = String::from_utf8(output).unwrap_or_default(); Some(format!("{status}\n{output}")) } }, Err(err) => Some(format!("{}: {err}", fl!("command_failed"))), }; tracing::info!("power command exited with: {:?}", message); let mode = greeter.read().await.previous_mode; let mut greeter = greeter.write().await; if message.is_none() { PowerPostAction::ClearScreen } else { greeter.mode = mode; greeter.message = message; PowerPostAction::Noop } } tuigreet-0.9.1/src/ui/000077500000000000000000000000001462617235300145665ustar00rootroot00000000000000tuigreet-0.9.1/src/ui/command.rs000066400000000000000000000037511462617235300165600ustar00rootroot00000000000000use std::error::Error; use tui::{ layout::{Constraint, Direction, Layout, Rect}, text::Span, widgets::{Block, BorderType, Borders, Paragraph}, }; use crate::{ ui::util::*, ui::{prompt_value, Frame}, Greeter, }; use super::common::style::Themed; pub fn draw(greeter: &mut Greeter, f: &mut Frame) -> Result<(u16, u16), Box> { let theme = &greeter.theme; let size = f.size(); let (x, y, width, height) = get_rect_bounds(greeter, size, 0); let container_padding = greeter.container_padding(); let container = Rect::new(x, y, width, height); let frame = Rect::new(x + container_padding, y + container_padding, width - container_padding, height - container_padding); let block = Block::default() .title(titleize(&fl!("title_command"))) .title_style(theme.of(&[Themed::Title])) .style(theme.of(&[Themed::Container])) .borders(Borders::ALL) .border_type(BorderType::Plain) .border_style(theme.of(&[Themed::Border])); f.render_widget(block, container); let constraints = [ Constraint::Length(1), // Username ]; let chunks = Layout::default().direction(Direction::Vertical).constraints(constraints.as_ref()).split(frame); let cursor = chunks[0]; let command_label_text = prompt_value(theme, Some(fl!("new_command"))); let command_label = Paragraph::new(command_label_text).style(theme.of(&[Themed::Prompt])); let command_value_text = Span::from(&greeter.buffer); let command_value = Paragraph::new(command_value_text).style(theme.of(&[Themed::Input])); f.render_widget(command_label, chunks[0]); f.render_widget( command_value, Rect::new( 1 + chunks[0].x + fl!("new_command").chars().count() as u16, chunks[0].y, get_input_width(greeter, width, &Some(fl!("new_command"))), 1, ), ); let new_command = greeter.buffer.clone(); let offset = get_cursor_offset(greeter, new_command.chars().count()); Ok((2 + cursor.x + fl!("new_command").chars().count() as u16 + offset as u16, cursor.y + 1)) } tuigreet-0.9.1/src/ui/common/000077500000000000000000000000001462617235300160565ustar00rootroot00000000000000tuigreet-0.9.1/src/ui/common/masked.rs000066400000000000000000000016041462617235300176710ustar00rootroot00000000000000use zeroize::Zeroize; #[derive(Default)] pub struct MaskedString { pub value: String, pub mask: Option, } impl MaskedString { pub fn from(value: String, mask: Option) -> MaskedString { MaskedString { value, mask } } pub fn get(&self) -> &str { match self.mask { Some(ref mask) => mask, None => &self.value, } } pub fn zeroize(&mut self) { self.value.zeroize(); if let Some(ref mut mask) = self.mask { mask.zeroize(); } self.mask = None; } } #[cfg(test)] mod tests { use super::MaskedString; #[test] fn get_value_when_unmasked() { let masked = MaskedString::from("value".to_string(), None); assert_eq!(masked.get(), "value"); } #[test] fn get_mask_when_masked() { let masked = MaskedString::from("value".to_string(), Some("mask".to_string())); assert_eq!(masked.get(), "mask"); } } tuigreet-0.9.1/src/ui/common/menu.rs000066400000000000000000000034511462617235300173730ustar00rootroot00000000000000use std::{borrow::Cow, error::Error}; use tui::{ prelude::Rect, style::{Modifier, Style}, text::Span, widgets::{Block, BorderType, Borders, Paragraph}, }; use crate::{ ui::{ util::{get_rect_bounds, titleize}, Frame, }, Greeter, }; use super::style::Themed; pub trait MenuItem { fn format(&self) -> Cow<'_, str>; } #[derive(Default)] pub struct Menu where T: MenuItem, { pub title: String, pub options: Vec, pub selected: usize, } impl Menu where T: MenuItem, { pub fn draw(&self, greeter: &Greeter, f: &mut Frame) -> Result<(u16, u16), Box> { let theme = &greeter.theme; let size = f.size(); let (x, y, width, height) = get_rect_bounds(greeter, size, self.options.len()); let container = Rect::new(x, y, width, height); let title = Span::from(titleize(&self.title)); let block = Block::default() .title(title) .title_style(theme.of(&[Themed::Title])) .style(theme.of(&[Themed::Container])) .borders(Borders::ALL) .border_type(BorderType::Plain) .border_style(theme.of(&[Themed::Border])); for (index, option) in self.options.iter().enumerate() { let name = option.format(); let name = format!("{:1$}", name, greeter.width() as usize - 4); let frame = Rect::new(x + 2, y + 2 + index as u16, width - 4, 1); let option_text = self.get_option(name, index); let option = Paragraph::new(option_text); f.render_widget(option, frame); } f.render_widget(block, container); Ok((1, 1)) } fn get_option<'g, S>(&self, name: S, index: usize) -> Span<'g> where S: Into, { if self.selected == index { Span::styled(name.into(), Style::default().add_modifier(Modifier::REVERSED)) } else { Span::from(name.into()) } } } tuigreet-0.9.1/src/ui/common/mod.rs000066400000000000000000000000551462617235300172030ustar00rootroot00000000000000pub mod masked; pub mod menu; pub mod style; tuigreet-0.9.1/src/ui/common/style.rs000066400000000000000000000051111462617235300175620ustar00rootroot00000000000000use std::str::FromStr; use tui::style::{Color, Style}; #[derive(Clone)] enum Component { Bg, Fg, } pub enum Themed { Container, Time, Text, Border, Title, Greet, Prompt, Input, Action, ActionButton, } #[derive(Default)] pub struct Theme { container: Option<(Component, Color)>, time: Option<(Component, Color)>, text: Option<(Component, Color)>, border: Option<(Component, Color)>, title: Option<(Component, Color)>, greet: Option<(Component, Color)>, prompt: Option<(Component, Color)>, input: Option<(Component, Color)>, action: Option<(Component, Color)>, button: Option<(Component, Color)>, } impl Theme { pub fn parse(spec: &str) -> Theme { use Component::*; let directives = spec.split(';').filter_map(|directive| directive.split_once('=')); let mut style = Theme::default(); for (key, value) in directives { if let Ok(color) = Color::from_str(value) { match key { "container" => style.container = Some((Bg, color)), "time" => style.time = Some((Fg, color)), "text" => style.text = Some((Fg, color)), "border" => style.border = Some((Fg, color)), "title" => style.title = Some((Fg, color)), "greet" => style.greet = Some((Fg, color)), "prompt" => style.prompt = Some((Fg, color)), "input" => style.input = Some((Fg, color)), "action" => style.action = Some((Fg, color)), "button" => style.button = Some((Fg, color)), _ => {} } } } if style.time.is_none() { style.time = style.text.clone(); } if style.greet.is_none() { style.greet = style.text.clone(); } if style.title.is_none() { style.title = style.border.clone(); } if style.button.is_none() { style.button = style.action.clone(); } style } pub fn of(&self, targets: &[Themed]) -> Style { targets.iter().fold(Style::default(), |style, target| self.apply(style, target)) } fn apply(&self, style: Style, target: &Themed) -> Style { use Themed::*; let color = match target { Container => &self.container, Time => &self.time, Text => &self.text, Border => &self.border, Title => &self.title, Greet => &self.greet, Prompt => &self.prompt, Input => &self.input, Action => &self.action, ActionButton => &self.button, }; match color { Some((component, color)) => match component { Component::Fg => style.fg(*color), Component::Bg => style.bg(*color), }, None => style, } } } tuigreet-0.9.1/src/ui/i18n.rs000066400000000000000000000011251462617235300157120ustar00rootroot00000000000000use i18n_embed::{ fluent::{fluent_language_loader, FluentLanguageLoader}, DesktopLanguageRequester, LanguageLoader, }; use lazy_static::lazy_static; use rust_embed::RustEmbed; #[derive(RustEmbed)] #[folder = "contrib/locales"] struct Localizations; lazy_static! { pub static ref MESSAGES: FluentLanguageLoader = { let locales = Localizations; let loader = fluent_language_loader!(); loader.load_languages(&locales, &[loader.fallback_language()]).unwrap(); let _ = i18n_embed::select(&loader, &locales, &DesktopLanguageRequester::requested_languages()); loader }; } tuigreet-0.9.1/src/ui/mod.rs000066400000000000000000000114771462617235300157250ustar00rootroot00000000000000mod command; pub mod common; mod i18n; pub mod power; mod processing; mod prompt; pub mod sessions; pub mod users; mod util; use std::{ error::Error, io::{self, Write}, sync::Arc, }; use chrono::prelude::*; use tokio::sync::RwLock; use tui::{ backend::CrosstermBackend, layout::{Alignment, Constraint, Direction, Layout}, style::Modifier, text::{Line, Span}, widgets::Paragraph, Frame as CrosstermFrame, Terminal, }; use crate::{ info::capslock_status, ui::util::{should_hide_cursor, titleize}, Greeter, Mode, }; use self::common::style::{Theme, Themed}; pub use self::i18n::MESSAGES; const TITLEBAR_INDEX: usize = 1; const STATUSBAR_INDEX: usize = 3; const STATUSBAR_LEFT_INDEX: usize = 1; const STATUSBAR_RIGHT_INDEX: usize = 2; pub(super) type Backend = CrosstermBackend; pub(super) type Term = Terminal; pub(super) type Frame<'a> = CrosstermFrame<'a>; pub async fn draw(greeter: Arc>, terminal: &mut Term) -> Result<(), Box> { let mut greeter = greeter.write().await; let hide_cursor = should_hide_cursor(&greeter); terminal.draw(|f| { let theme = &greeter.theme; let size = f.size(); let chunks = Layout::default() .constraints( [ Constraint::Length(greeter.window_padding()), // Top vertical padding Constraint::Length(1), // Date and time Constraint::Min(1), // Main area Constraint::Length(1), // Status line Constraint::Length(greeter.window_padding()), // Bottom vertical padding ] .as_ref(), ) .split(size); if greeter.config().opt_present("time") { let time_text = Span::from(get_time(&greeter)); let time = Paragraph::new(time_text).alignment(Alignment::Center).style(theme.of(&[Themed::Time])); f.render_widget(time, chunks[TITLEBAR_INDEX]); } let status_block_size_right = 1 + greeter.window_padding() + fl!("status_caps").chars().count() as u16; let status_block_size_left = (size.width - greeter.window_padding()) - status_block_size_right; let status_chunks = Layout::default() .direction(Direction::Horizontal) .constraints( [ Constraint::Length(greeter.window_padding()), Constraint::Length(status_block_size_left), Constraint::Length(status_block_size_right), Constraint::Length(greeter.window_padding()), ] .as_ref(), ) .split(chunks[STATUSBAR_INDEX]); let command = greeter.session_source.label(&greeter).unwrap_or("-"); let status_left_text = Line::from(vec![ status_label(theme, "ESC"), status_value(theme, fl!("action_reset")), status_label(theme, "F2"), status_value(theme, fl!("action_command")), status_label(theme, "F3"), status_value(theme, fl!("action_session")), status_label(theme, "F12"), status_value(theme, fl!("action_power")), status_label(theme, fl!("status_command")), status_value(theme, command), ]); let status_left = Paragraph::new(status_left_text); f.render_widget(status_left, status_chunks[STATUSBAR_LEFT_INDEX]); if capslock_status() { let status_right_text = status_label(theme, fl!("status_caps")); let status_right = Paragraph::new(status_right_text).alignment(Alignment::Right); f.render_widget(status_right, status_chunks[STATUSBAR_RIGHT_INDEX]); } let cursor = match greeter.mode { Mode::Command => self::command::draw(&mut greeter, f).ok(), Mode::Sessions => greeter.sessions.draw(&greeter, f).ok(), Mode::Power => greeter.powers.draw(&greeter, f).ok(), Mode::Users => greeter.users.draw(&greeter, f).ok(), Mode::Processing => self::processing::draw(&mut greeter, f).ok(), _ => self::prompt::draw(&mut greeter, f).ok(), }; if !hide_cursor { if let Some(cursor) = cursor { f.set_cursor(cursor.0 - 1, cursor.1 - 1); } } })?; io::stdout().flush()?; Ok(()) } fn get_time(greeter: &Greeter) -> String { let format = match greeter.config().opt_str("time-format") { Some(format) => format, None => fl!("date"), }; Local::now().format_localized(&format, greeter.locale).to_string() } fn status_label<'s, S>(theme: &Theme, text: S) -> Span<'s> where S: Into, { Span::styled(text.into(), theme.of(&[Themed::ActionButton]).add_modifier(Modifier::REVERSED)) } fn status_value<'s, S>(theme: &Theme, text: S) -> Span<'s> where S: Into, { Span::from(titleize(&text.into())).style(theme.of(&[Themed::Action])) } fn prompt_value<'s, S>(theme: &Theme, text: Option) -> Span<'s> where S: Into, { match text { Some(text) => Span::styled(text.into(), theme.of(&[Themed::Prompt]).add_modifier(Modifier::BOLD)), None => Span::from(""), } } tuigreet-0.9.1/src/ui/power.rs000066400000000000000000000004751462617235300162760ustar00rootroot00000000000000use std::borrow::Cow; use crate::{power::PowerOption, ui::common::menu::MenuItem}; #[derive(SmartDefault, Clone)] pub struct Power { pub action: PowerOption, pub label: String, pub command: Option, } impl MenuItem for Power { fn format(&self) -> Cow<'_, str> { Cow::Borrowed(&self.label) } } tuigreet-0.9.1/src/ui/processing.rs000066400000000000000000000022241462617235300173100ustar00rootroot00000000000000use std::error::Error; use tui::{ layout::{Alignment, Constraint, Direction, Layout, Rect}, text::Span, widgets::{Block, BorderType, Borders, Paragraph}, }; use crate::{ ui::{util::*, Frame}, Greeter, }; pub fn draw(greeter: &mut Greeter, f: &mut Frame) -> Result<(u16, u16), Box> { let size = f.size(); let width = greeter.width(); let height: u16 = get_height(greeter) + 1; let x = (size.width - width) / 2; let y = (size.height - height) / 2; let container = Rect::new(x, y, width, height); let container_padding = greeter.container_padding(); let frame = Rect::new(x + container_padding, y + container_padding, width - (2 * container_padding), height - (2 * container_padding)); let block = Block::default().borders(Borders::ALL).border_type(BorderType::Plain); let constraints = [Constraint::Length(1)]; let chunks = Layout::default().direction(Direction::Vertical).constraints(constraints.as_ref()).split(frame); let text = Span::from(fl!("wait")); let paragraph = Paragraph::new(text).alignment(Alignment::Center); f.render_widget(paragraph, chunks[0]); f.render_widget(block, container); Ok((1, 1)) } tuigreet-0.9.1/src/ui/prompt.rs000066400000000000000000000137701462617235300164650ustar00rootroot00000000000000use std::error::Error; use rand::{prelude::StdRng, Rng, SeedableRng}; use tui::{ layout::{Alignment, Constraint, Direction, Layout, Rect}, text::{Span, Text}, widgets::{Block, BorderType, Borders, Paragraph}, }; use crate::{ info::get_hostname, ui::{prompt_value, util::*, Frame}, Greeter, Mode, SecretDisplay, GreetAlign }; use super::common::style::Themed; const GREETING_INDEX: usize = 0; const USERNAME_INDEX: usize = 1; const ANSWER_INDEX: usize = 3; pub fn draw(greeter: &mut Greeter, f: &mut Frame) -> Result<(u16, u16), Box> { let theme = &greeter.theme; let size = f.size(); let (x, y, width, height) = get_rect_bounds(greeter, size, 0); let container_padding = greeter.container_padding(); let prompt_padding = greeter.prompt_padding(); let greeting_alignment = match greeter.greet_align() { GreetAlign::Center => Alignment::Center, GreetAlign::Left => Alignment::Left, GreetAlign::Right => Alignment::Right }; let container = Rect::new(x, y, width, height); let frame = Rect::new(x + container_padding, y + container_padding, width - (2 * container_padding), height - (2 * container_padding)); let hostname = Span::from(titleize(&fl!("title_authenticate", hostname = get_hostname()))); let block = Block::default() .title(hostname) .title_style(theme.of(&[Themed::Title])) .style(theme.of(&[Themed::Container])) .borders(Borders::ALL) .border_type(BorderType::Plain) .border_style(theme.of(&[Themed::Border])); f.render_widget(block, container); let (message, message_height) = get_message_height(greeter, container_padding, 1); let (greeting, greeting_height) = get_greeting_height(greeter, container_padding, 0); let should_display_answer = greeter.mode == Mode::Password; let constraints = [ Constraint::Length(greeting_height), // Greeting Constraint::Length(1), // Username Constraint::Length(if should_display_answer { prompt_padding } else { 0 }), // Prompt padding Constraint::Length(if should_display_answer { 1 } else { 0 }), // Answer ]; let chunks = Layout::default().direction(Direction::Vertical).constraints(constraints.as_ref()).split(frame); let cursor = chunks[USERNAME_INDEX]; if let Some(greeting) = &greeting { let greeting_text = greeting.trim_end(); let greeting_label = Paragraph::new(greeting_text).alignment(greeting_alignment).style(theme.of(&[Themed::Greet])); f.render_widget(greeting_label, chunks[GREETING_INDEX]); } let username_label = if greeter.user_menu && greeter.username.value.is_empty() { let prompt_text = Span::from(fl!("select_user")); Paragraph::new(prompt_text).alignment(Alignment::Center) } else { let username_text = prompt_value(theme, Some(fl!("username"))); Paragraph::new(username_text) }; let username = greeter.username.get(); let username_value_text = Span::from(username); let username_value = Paragraph::new(username_value_text).style(theme.of(&[Themed::Input])); match greeter.mode { Mode::Username | Mode::Password | Mode::Action => { f.render_widget(username_label, chunks[USERNAME_INDEX]); if !greeter.user_menu || !greeter.username.value.is_empty() { f.render_widget( username_value, Rect::new( 1 + chunks[USERNAME_INDEX].x + fl!("username").chars().count() as u16, chunks[USERNAME_INDEX].y, get_input_width(greeter, width, &Some(fl!("username"))), 1, ), ); } let answer_text = if greeter.working { Span::from(fl!("wait")) } else { prompt_value(theme, greeter.prompt.as_ref()) }; let answer_label = Paragraph::new(answer_text); if greeter.mode == Mode::Password || greeter.previous_mode == Mode::Password { f.render_widget(answer_label, chunks[ANSWER_INDEX]); if !greeter.asking_for_secret || greeter.secret_display.show() { let value = match (greeter.asking_for_secret, &greeter.secret_display) { (true, SecretDisplay::Character(pool)) => { if pool.chars().count() == 1 { pool.repeat(greeter.buffer.chars().count()) } else { let mut rng = StdRng::seed_from_u64(0); greeter.buffer.chars().map(|_| pool.chars().nth(rng.gen_range(0..pool.chars().count())).unwrap()).collect() } } _ => greeter.buffer.clone(), }; let answer_value_text = Span::from(value); let answer_value = Paragraph::new(answer_value_text).style(theme.of(&[Themed::Input])); f.render_widget( answer_value, Rect::new( chunks[ANSWER_INDEX].x + greeter.prompt_width() as u16, chunks[ANSWER_INDEX].y, get_input_width(greeter, width, &greeter.prompt), 1, ), ); } } if let Some(message) = message { let message_text = Text::from(message); let message = Paragraph::new(message_text).alignment(Alignment::Center); f.render_widget(message, Rect::new(x, y + height, width, message_height)); } } _ => {} } match greeter.mode { Mode::Username => { let username_length = greeter.username.get().chars().count(); let offset = get_cursor_offset(greeter, username_length); Ok((2 + cursor.x + fl!("username").chars().count() as u16 + offset as u16, USERNAME_INDEX as u16 + cursor.y)) } Mode::Password => { let answer_length = greeter.buffer.chars().count(); let offset = get_cursor_offset(greeter, answer_length); if greeter.asking_for_secret && !greeter.secret_display.show() { Ok((1 + cursor.x + greeter.prompt_width() as u16, ANSWER_INDEX as u16 + prompt_padding + cursor.y - 1)) } else { Ok((1 + cursor.x + greeter.prompt_width() as u16 + offset as u16, ANSWER_INDEX as u16 + prompt_padding + cursor.y - 1)) } } _ => Ok((1, 1)), } } tuigreet-0.9.1/src/ui/sessions.rs000066400000000000000000000165441462617235300170140ustar00rootroot00000000000000use std::{ borrow::Cow, path::{Path, PathBuf}, }; use crate::Greeter; use super::common::menu::MenuItem; // SessionSource models the selected session and where it comes from. // // A session can either come from a free-form command or an XDG-defined session // file. Each variant contains a reference to the data required to create a // session, either the String of the command or the index of the session in the // session list. #[derive(SmartDefault)] pub enum SessionSource { #[default] None, Command(String), Session(usize), } impl SessionSource { // Returns a human-readable label for the selected session. // // For free-form commands, this is the command itself. For session files, it // is the value of the `Name` attribute in that file. pub fn label<'g, 'ss: 'g>(&'ss self, greeter: &'g Greeter) -> Option<&'g str> { match self { SessionSource::None => None, SessionSource::Command(command) => Some(command), SessionSource::Session(index) => greeter.sessions.options.get(*index).map(|session| session.name.as_str()), } } // Returns the command that should be spawned when the selected session is // started. pub fn command<'g, 'ss: 'g>(&'ss self, greeter: &'g Greeter) -> Option<&'g str> { match self { SessionSource::None => None, SessionSource::Command(command) => Some(command.as_str()), SessionSource::Session(index) => greeter.sessions.options.get(*index).map(|session| session.command.as_str()), } } } // Represents the XDG type of the selected session. #[derive(SmartDefault, Debug, Copy, Clone, PartialEq)] pub enum SessionType { X11, Wayland, Tty, #[default] None, } impl SessionType { // Returns the value that should be set in `XDG_SESSION_TYPE` when the session // is started. pub fn as_xdg_session_type(&self) -> &'static str { match self { SessionType::X11 => "x11", SessionType::Wayland => "wayland", SessionType::Tty => "tty", SessionType::None => "unspecified", } } } // A session, as defined by an XDG session file. #[derive(SmartDefault, Clone)] pub struct Session { // Slug of the session, being the name of the desktop file without its // extension. pub slug: Option, // Human-friendly name for the session, maps to the `Name` attribute. pub name: String, // Command used to start the session, maps to the `Exec` attribute. pub command: String, // XDG session type for the session, detected from the location of the session // file. pub session_type: SessionType, // Path to the session file. Used to uniquely identify sessions, since names // and commands can be identital between two different sessions. pub path: Option, // Desktop names as defined with the `DesktopNames` desktop file property pub xdg_desktop_names: Option, } impl MenuItem for Session { fn format(&self) -> Cow<'_, str> { Cow::Borrowed(&self.name) } } impl Session { // Get a `Session` from the path of a session file. // // If the path maps to a valid session file, will return the associated // session. Otherwise, will return `None`. pub fn from_path

(greeter: &Greeter, path: P) -> Option<&Session> where P: AsRef, { greeter.sessions.options.iter().find(|session| session.path.as_deref() == Some(path.as_ref())) } // Retrieves the `Session` that is currently selected. // // Note that this does not indicate which menu item is "highlighted", but the // session that was selected. pub fn get_selected(greeter: &Greeter) -> Option<&Session> { match greeter.session_source { SessionSource::Session(index) => greeter.sessions.options.get(index), _ => None, } } } #[cfg(test)] mod test { use crate::{ ui::{ common::menu::Menu, sessions::{Session, SessionSource, SessionType}, }, Greeter, }; #[test] fn from_path_existing() { let mut greeter = Greeter::default(); greeter.session_source = SessionSource::Session(1); greeter.sessions = Menu:: { title: "Sessions".into(), selected: 1, options: vec![ Session { name: "Session1".into(), command: "Session1Cmd".into(), session_type: super::SessionType::Wayland, path: Some("/Session1Path".into()), ..Default::default() }, Session { name: "Session2".into(), command: "Session2Cmd".into(), session_type: super::SessionType::X11, path: Some("/Session2Path".into()), ..Default::default() }, ], }; let session = Session::from_path(&greeter, "/Session2Path"); assert!(matches!(session, Some(_))); assert_eq!(session.unwrap().name, "Session2"); assert_eq!(session.unwrap().session_type, SessionType::X11); } #[test] fn from_path_non_existing() { let mut greeter = Greeter::default(); greeter.session_source = SessionSource::Session(1); greeter.sessions = Menu:: { title: "Sessions".into(), selected: 1, options: vec![Session { name: "Session1".into(), command: "Session1Cmd".into(), session_type: super::SessionType::Wayland, path: Some("/Session1Path".into()), ..Default::default() }], }; let session = Session::from_path(&greeter, "/Session2Path"); assert!(matches!(session, None)); } #[test] fn no_session() { let greeter = Greeter::default(); assert!(matches!(Session::get_selected(&greeter), None)); } #[test] fn distinct_session() { let mut greeter = Greeter::default(); greeter.session_source = SessionSource::Session(1); greeter.sessions = Menu:: { title: "Sessions".into(), selected: 1, options: vec![ Session { name: "Session1".into(), command: "Session1Cmd".into(), session_type: super::SessionType::Wayland, path: Some("/Session1Path".into()), ..Default::default() }, Session { name: "Session2".into(), command: "Session2Cmd".into(), session_type: super::SessionType::X11, path: Some("/Session2Path".into()), ..Default::default() }, ], }; let session = Session::get_selected(&greeter); assert!(matches!(session, Some(_))); assert_eq!(session.unwrap().name, "Session2"); assert_eq!(session.unwrap().session_type, SessionType::X11); } #[test] fn same_name_session() { let mut greeter = Greeter::default(); greeter.session_source = SessionSource::Session(1); greeter.sessions = Menu:: { title: "Sessions".into(), selected: 1, options: vec![ Session { name: "Session".into(), command: "Session1Cmd".into(), session_type: super::SessionType::Wayland, path: Some("/Session1Path".into()), ..Default::default() }, Session { name: "Session".into(), command: "Session2Cmd".into(), session_type: super::SessionType::X11, path: Some("/Session2Path".into()), ..Default::default() }, ], }; let session = Session::get_selected(&greeter); assert!(matches!(session, Some(_))); assert_eq!(session.unwrap().name, "Session"); assert_eq!(session.unwrap().session_type, SessionType::X11); assert_eq!(session.unwrap().command, "Session2Cmd"); } } tuigreet-0.9.1/src/ui/users.rs000066400000000000000000000005631462617235300163010ustar00rootroot00000000000000use std::borrow::Cow; use super::common::menu::MenuItem; #[derive(Default, Clone)] pub struct User { pub username: String, pub name: Option, } impl MenuItem for User { fn format(&self) -> Cow<'_, str> { match &self.name { Some(name) => Cow::Owned(format!("{name} ({})", self.username)), None => Cow::Borrowed(&self.username), } } } tuigreet-0.9.1/src/ui/util.rs000066400000000000000000000200471462617235300161140ustar00rootroot00000000000000use tui::prelude::Rect; use crate::{Greeter, Mode}; pub fn titleize(message: &str) -> String { format!(" {message} ") } // Determinew whether the cursor should be shown or hidden from the current // mode and configuration. Usually, we will show the cursor only when expecting // text entries from the user. pub fn should_hide_cursor(greeter: &Greeter) -> bool { greeter.working || greeter.done || (greeter.user_menu && greeter.mode == Mode::Username && greeter.username.value.is_empty()) || (greeter.mode == Mode::Password && greeter.prompt.is_none()) || greeter.mode == Mode::Users || greeter.mode == Mode::Sessions || greeter.mode == Mode::Power || greeter.mode == Mode::Processing || greeter.mode == Mode::Action } // Computes the height of the main window where we display content, depending on // the mode and spacing configuration. // // +------------------------+ // | | <- container padding // | Greeting | <- greeting height // | | <- auto-padding if greeting // | Username: | <- username // | Password: | <- password if prompt == Some(_) // | | <- container padding // +------------------------+ pub fn get_height(greeter: &Greeter) -> u16 { let (_, greeting_height) = get_greeting_height(greeter, 1, 0); let container_padding = greeter.container_padding(); let prompt_padding = greeter.prompt_padding(); let initial = match greeter.mode { Mode::Username | Mode::Action | Mode::Command => (2 * container_padding) + 1, Mode::Password => match greeter.prompt { Some(_) => (2 * container_padding) + prompt_padding + 2, None => (2 * container_padding) + 1, }, Mode::Users | Mode::Sessions | Mode::Power | Mode::Processing => 2 * container_padding, }; match greeter.mode { Mode::Command | Mode::Sessions | Mode::Power | Mode::Processing => initial, _ => initial + greeting_height, } } // Get the coordinates and size of the main window area, from the terminal size, // and the content we need to display. pub fn get_rect_bounds(greeter: &Greeter, area: Rect, items: usize) -> (u16, u16, u16, u16) { let width = greeter.width(); let height: u16 = get_height(greeter) + items as u16; let x = if width < area.width { (area.width - width) / 2 } else { 0 }; let y = if height < area.height { (area.height - height) / 2 } else { 0 }; let (x, width) = if (x + width) >= area.width { (0, area.width) } else { (x, width) }; let (y, height) = if (y + height) >= area.height { (0, area.height) } else { (y, height) }; (x, y, width, height) } // Computes the size of a text entry, from the container width and, if // applicable, the prompt length. pub fn get_input_width(greeter: &Greeter, width: u16, label: &Option) -> u16 { let width = std::cmp::min(greeter.width(), width); let label_width = match label { None => 0, Some(label) => label.chars().count(), }; width - label_width as u16 - 4 - 1 } pub fn get_cursor_offset(greeter: &mut Greeter, length: usize) -> i16 { let mut offset = length as i16 + greeter.cursor_offset; if offset < 0 { offset = 0; greeter.cursor_offset = -(length as i16); } if offset > length as i16 { offset = length as i16; greeter.cursor_offset = 0; } offset } pub fn get_greeting_height(greeter: &Greeter, padding: u16, fallback: u16) -> (Option, u16) { if let Some(greeting) = &greeter.greeting { let width = greeter.width(); let wrapped = textwrap::fill(greeting, (width - (2 * padding)) as usize); let height = wrapped.trim_end().matches('\n').count(); (Some(wrapped), height as u16 + 2) } else { (None, fallback) } } pub fn get_message_height(greeter: &Greeter, padding: u16, fallback: u16) -> (Option, u16) { if let Some(message) = &greeter.message { let width = greeter.width(); let wrapped = textwrap::fill(message.trim_end(), width as usize - 4); let height = wrapped.trim_end().matches('\n').count(); (Some(wrapped), height as u16 + padding) } else { (None, fallback) } } #[cfg(test)] mod test { use tui::prelude::Rect; use crate::{ ui::util::{get_greeting_height, get_height}, Greeter, Mode, }; use super::{get_input_width, get_rect_bounds}; // +-----------+ // | Username: | // +-----------+ #[test] fn test_container_height_username_padding_zero() { let mut greeter = Greeter::default(); greeter.config = Greeter::options().parse(&["--container-padding", "0"]).ok(); greeter.mode = Mode::Username; assert_eq!(get_height(&greeter), 3); } // +-----------+ // | | // | Username: | // | | // +-----------+ #[test] fn test_container_height_username_padding_one() { let mut greeter = Greeter::default(); greeter.config = Greeter::options().parse(&["--container-padding", "1"]).ok(); greeter.mode = Mode::Username; assert_eq!(get_height(&greeter), 5); } // +-----------+ // | | // | Greeting | // | | // | Username: | // | | // +-----------+ #[test] fn test_container_height_username_greeting_padding_one() { let mut greeter = Greeter::default(); greeter.config = Greeter::options().parse(&["--container-padding", "1"]).ok(); greeter.greeting = Some("Hello".into()); greeter.mode = Mode::Username; assert_eq!(get_height(&greeter), 7); } // +-----------+ // | | // | Greeting | // | | // | Username: | // | | // | Password: | // | | // +-----------+ #[test] fn test_container_height_password_greeting_padding_one_prompt_padding_1() { let mut greeter = Greeter::default(); greeter.config = Greeter::options().parse(&["--container-padding", "1"]).ok(); greeter.greeting = Some("Hello".into()); greeter.mode = Mode::Password; greeter.prompt = Some("Password:".into()); assert_eq!(get_height(&greeter), 9); } // +-----------+ // | | // | Greeting | // | | // | Username: | // | Password: | // | | // +-----------+ #[test] fn test_container_height_password_greeting_padding_one_prompt_padding_0() { let mut greeter = Greeter::default(); greeter.config = Greeter::options().parse(&["--container-padding", "1", "--prompt-padding", "0"]).ok(); greeter.greeting = Some("Hello".into()); greeter.mode = Mode::Password; greeter.prompt = Some("Password:".into()); assert_eq!(get_height(&greeter), 8); } #[test] fn test_rect_bounds() { let mut greeter = Greeter::default(); greeter.config = Greeter::options().parse(&["--width", "50"]).ok(); let (x, y, width, height) = get_rect_bounds(&greeter, Rect::new(0, 0, 100, 100), 1); assert_eq!(x, 25); assert_eq!(y, 47); assert_eq!(width, 50); assert_eq!(height, 6); } // | Username: __________________________ | // <--------------------------------------> width 40 (padding 1) // <-------> prompt width 9 // <------------------------> input width 26 #[test] fn input_width() { let mut greeter = Greeter::default(); greeter.config = Greeter::options().parse(&["--width", "40", "--container-padding", "1"]).ok(); let input_width = get_input_width(&greeter, 40, &Some("Username:".into())); assert_eq!(input_width, 26); } #[test] fn greeting_height_one_line() { let mut greeter = Greeter::default(); greeter.config = Greeter::options().parse(&["--width", "10", "--container-padding", "1"]).ok(); greeter.greeting = Some("Hello".into()); let (text, width) = get_greeting_height(&greeter, 1, 0); assert!(matches!(text.as_deref(), Some("Hello"))); assert_eq!(width, 2); } #[test] fn greeting_height_two_lines() { let mut greeter = Greeter::default(); greeter.config = Greeter::options().parse(&["--width", "10", "--container-padding", "1"]).ok(); greeter.greeting = Some("Hello World".into()); let (text, width) = get_greeting_height(&greeter, 1, 0); assert!(matches!(text.as_deref(), Some("Hello\nWorld"))); assert_eq!(width, 3); } }