orc-format-1.1.0/000755 000765 000024 00000000000 14777360722 014561 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/.asf.yaml000644 000765 000024 00000002404 14777360722 016274 0ustar00dongjoonstaff000000 000000 # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # https://cwiki.apache.org/confluence/display/INFRA/git+-+.asf.yaml+features --- github: description: "Apache ORC - the smallest, fastest columnar storage for Hadoop workloads" homepage: https://orc.apache.org/ features: issues: true enabled_merge_buttons: merge: false squash: true rebase: true labels: - apache - orc - java - cpp - big-data notifications: pullrequests: issues@orc.apache.org issues: issues@orc.apache.org commits: commits@orc.apache.org orc-format-1.1.0/LICENSE000644 000765 000024 00000045761 14777360722 015603 0ustar00dongjoonstaff000000 000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability contains incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. APACHE ORC SUBCOMPONENTS: The Apache ORC project contains subcomponents with separate copyright notices and license terms. Your use of the source code for the these subcomponents is subject to the terms and conditions of the following licenses. For protobuf: Copyright 2008 Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Code generated by the Protocol Buffer compiler is owned by the owner of the input file used when generating it. This code is not standalone and requires a support library to be linked with it. This support library is itself covered by the above license. For the site: Parts of the site formatting includes software developed by Tom Preston-Werner that are licensed under the MIT License (MIT): (c) Copyright [2008-2015] Tom Preston-Werner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For snappy: Copyright 2011, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For zlib: (C) 1995-2017 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup Gailly and Mark Adler; it does not include third-party code. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. Please read the FAQ for more information on the distribution of modified source versions. For orc.threeten: /* * Copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * * Neither the name of JSR-310 nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */orc-format-1.1.0/pom.xml000644 000765 000024 00000032265 14777360722 016106 0ustar00dongjoonstaff000000 000000 4.0.0 org.apache apache 29 org.apache.orc orc-format 1.1.0 jar Apache ORC Format ORC is a self-describing type-aware columnar file format designed for Hadoop workloads. It is optimized for large streaming reads, but with integrated support for finding required rows quickly. Storing data in a columnar format lets the reader read, decompress, and process only the values that are required for the current query. https://orc.apache.org 2013 ORC User List user-subscribe@orc.apache.org user-unsubscribe@orc.apache.org user@orc.apache.org https://mail-archives.apache.org/mod_mbox/orc-user/ ORC Developer List dev-subscribe@orc.apache.org dev-unsubscribe@orc.apache.org dev@orc.apache.org https://mail-archives.apache.org/mod_mbox/orc-dev/ 17 3.6.0 3.6.0 3.5.1 17 false 3.9.6 3.17.3 ${project.build.directory}/testing-tmp com.google.protobuf protobuf-java 3.25.5 true false gcs-maven-central-mirror GCS Maven Central mirror https://maven-central.storage-download.googleapis.com/maven2/ true false central Maven Repository https://repo.maven.apache.org/maven2 com.github.os72 protoc-jar-maven-plugin 3.11.4 generate-sources run ${protoc.version} com.google.protobuf:protoc:${protoc.version} none src/main/proto/ org.apache.maven.plugins maven-enforcer-plugin 3.4.0 org.codehaus.mojo extra-enforcer-rules 1.7.0 enforce-maven enforce ${maven.version} ${java.version} ${java.version} org.apache.maven.plugins maven-compiler-plugin 3.10.1 org.apache.maven.plugins maven-javadoc-plugin **/OrcProto.java ${project.artifactId} org.apache.maven.plugins maven-shade-plugin ${maven-shade-plugin.version} shaded-protobuf shade package com.google.protobuf:protobuf-java true shaded-protobuf com.google.protobuf org.apache.orc.protobuf *:* module-info.class META-INF/MANIFEST.MF META-INF/DEPENDENCIES META-INF/LICENSE META-INF/NOTICE google/protobuf/** nohive shade package com.google.protobuf:protobuf-java org.apache.hive:hive-storage-api true nohive com.google.protobuf org.apache.orc.protobuf org.apache.hadoop.hive org.apache.orc.storage org.apache.hive org.apache.orc.storage *:* module-info.class META-INF/MANIFEST.MF META-INF/DEPENDENCIES META-INF/LICENSE META-INF/NOTICE google/protobuf/** org.codehaus.mojo build-helper-maven-plugin 3.4.0 add-source add-source generate-sources ${project.build.directory}/generated-sources org.cyclonedx cyclonedx-maven-plugin 2.7.6 makeBom package orc-format-1.1.0/specification/000755 000765 000024 00000000000 14777360722 017401 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/NOTICE000644 000765 000024 00000000456 14777360722 015472 0ustar00dongjoonstaff000000 000000 Apache ORC Copyright 2013 and onwards The Apache Software Foundation. This product includes software developed by The Apache Software Foundation (http://www.apache.org/). This product includes software developed by Hewlett-Packard: (c) Copyright [2014-2015] Hewlett-Packard Development Company, L.P orc-format-1.1.0/README.md000644 000765 000024 00000005233 14777360722 016043 0ustar00dongjoonstaff000000 000000 # [Apache ORC](https://orc.apache.org/) ORC is a self-describing type-aware columnar file format designed for Hadoop workloads. It is optimized for large streaming reads, but with integrated support for finding required rows quickly. Storing data in a columnar format lets the reader read, decompress, and process only the values that are required for the current query. Because ORC files are type-aware, the writer chooses the most appropriate encoding for the type and builds an internal index as the file is written. Predicate pushdown uses those indexes to determine which stripes in a file need to be read for a particular query and the row indexes can narrow the search to a particular set of 10,000 rows. ORC supports the complete set of types in Hive, including the complex types: structs, lists, maps, and unions. ## ORC Format This project includes ORC specifications and the protobuf definition. `Apache ORC Format 1.0.0` is designed to be used for `Apache ORC 2.0+`. Releases: * Maven Central: ![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.orc/orc/badge.svg) * Downloads: Apache ORC downloads * Release tags: Apache ORC Format releases * Plan: Apache ORC Format future release plan The current build status: * Main branch ![main build status](https://github.com/apache/orc-format/actions/workflows/build_and_test.yml/badge.svg?branch=main) Bug tracking: Apache ORC Format Issues ## Building ``` ./mvnw install ``` orc-format-1.1.0/.gitignore000644 000765 000024 00000000172 14777360722 016551 0ustar00dongjoonstaff000000 000000 target .classpath* .project .settings *~ *.iml dependency-reduced-pom.xml *.ipr *.iws .idea .DS_Store .java-version *.swp orc-format-1.1.0/.github/000755 000765 000024 00000000000 14777360722 016121 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/mvnw000755 000765 000024 00000007753 14777360722 015512 0ustar00dongjoonstaff000000 000000 #!/usr/bin/env bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Determine the current working directory _DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Preserve the calling directory _CALLING_DIR="$(pwd)" # Options used during compilation _COMPILE_JVM_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=1g" # Installs any application tarball given a URL, the expected tarball name, # and, optionally, a checkable binary path to determine if the binary has # already been installed ## Arg1 - URL ## Arg2 - Tarball Name ## Arg3 - Checkable Binary install_app() { local remote_tarball="$1/$2" local local_tarball="${_DIR}/build/$2" local binary="${_DIR}/build/$3" local curl_opts="--silent --show-error -L" local wget_opts="--no-verbose" if [ -z "$3" -o ! -f "$binary" ]; then # check if we already have the tarball # check if we have curl installed # download application [ ! -f "${local_tarball}" ] && [ $(command -v curl) ] && \ echo "exec: curl ${curl_opts} ${remote_tarball}" 1>&2 && \ curl ${curl_opts} "${remote_tarball}" > "${local_tarball}" # if the file still doesn't exist, lets try `wget` and cross our fingers [ ! -f "${local_tarball}" ] && [ $(command -v wget) ] && \ echo "exec: wget ${wget_opts} ${remote_tarball}" 1>&2 && \ wget ${wget_opts} -O "${local_tarball}" "${remote_tarball}" # if both were unsuccessful, exit [ ! -f "${local_tarball}" ] && \ echo -n "ERROR: Cannot download $2 with cURL or wget; " && \ echo "please install manually and try again." && \ exit 2 cd "${_DIR}/build" && tar -xzf "$2" fi } # See simple version normalization: http://stackoverflow.com/questions/16989598/bash-comparing-version-numbers function version { echo "$@" | awk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }'; } # Determine the Maven version from the root pom.xml file and # install maven under the build/ folder if needed. install_mvn() { local MVN_VERSION=`grep "" "${_DIR}/pom.xml" | head -n1 | awk -F '[<>]' '{print $3}'` MVN_BIN="$(command -v mvn)" if [ "$MVN_BIN" ]; then local MVN_DETECTED_VERSION="$(mvn --version | head -n1 | awk '{print $3}')" fi if [ $(version $MVN_DETECTED_VERSION) -lt $(version $MVN_VERSION) ]; then local APACHE_MIRROR=${APACHE_MIRROR:-'https://www.apache.org/dyn/closer.lua?action=download&filename='} if [ $(command -v curl) ]; then local TEST_MIRROR_URL="${APACHE_MIRROR}/maven/maven-3/${MVN_VERSION}/binaries/apache-maven-${MVN_VERSION}-bin.tar.gz" if ! curl -L --output /dev/null --silent --head --fail "$TEST_MIRROR_URL" ; then # Fall back to archive.apache.org for older Maven echo "Falling back to archive.apache.org to download Maven" APACHE_MIRROR="https://archive.apache.org/dist" fi fi mkdir -p build install_app \ "${APACHE_MIRROR}/maven/maven-3/${MVN_VERSION}/binaries" \ "apache-maven-${MVN_VERSION}-bin.tar.gz" \ "build/apache-maven-${MVN_VERSION}/bin/mvn" MVN_BIN="${_DIR}/build/apache-maven-${MVN_VERSION}/bin/mvn" fi } install_mvn # Reset the current working directory cd "${_CALLING_DIR}" # Set any `mvn` options if not already present export MAVEN_OPTS=${MAVEN_OPTS:-"$_COMPILE_JVM_OPTS"} echo "Using \`mvn\` from path: $MVN_BIN" 1>&2 "${MVN_BIN}" "$@" orc-format-1.1.0/src/000755 000765 000024 00000000000 14777360722 015350 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/src/main/000755 000765 000024 00000000000 14777360722 016274 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/src/main/proto/000755 000765 000024 00000000000 14777360722 017437 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/src/main/proto/buf.yaml000644 000765 000024 00000001521 14777360722 021076 0ustar00dongjoonstaff000000 000000 # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # version: v1 breaking: use: - FILE lint: use: - BASIC orc-format-1.1.0/src/main/proto/orc/000755 000765 000024 00000000000 14777360722 020222 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/src/main/proto/orc/proto/000755 000765 000024 00000000000 14777360722 021365 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/src/main/proto/orc/proto/orc_proto.proto000644 000765 000024 00000034452 14777360722 024470 0ustar00dongjoonstaff000000 000000 /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ syntax = "proto2"; package orc.proto; option java_package = "org.apache.orc"; message IntegerStatistics { optional sint64 minimum = 1; optional sint64 maximum = 2; optional sint64 sum = 3; } message DoubleStatistics { optional double minimum = 1; optional double maximum = 2; optional double sum = 3; } message StringStatistics { optional string minimum = 1; optional string maximum = 2; // sum will store the total length of all strings in a stripe optional sint64 sum = 3; // If the minimum or maximum value was longer than 1024 bytes, store a lower or upper // bound instead of the minimum or maximum values above. optional string lower_bound = 4; optional string upper_bound = 5; } message BucketStatistics { repeated uint64 count = 1 [packed=true]; } message DecimalStatistics { optional string minimum = 1; optional string maximum = 2; optional string sum = 3; } message DateStatistics { // min,max values saved as days since epoch optional sint32 minimum = 1; optional sint32 maximum = 2; } message TimestampStatistics { // min,max values saved as milliseconds since epoch optional sint64 minimum = 1; optional sint64 maximum = 2; optional sint64 minimum_utc = 3; optional sint64 maximum_utc = 4; // store the lower 6 TS digits for min/max to achieve nanosecond precision optional int32 minimum_nanos = 5; optional int32 maximum_nanos = 6; } message BinaryStatistics { // sum will store the total binary blob length in a stripe optional sint64 sum = 1; } // Statistics for list and map message CollectionStatistics { optional uint64 min_children = 1; optional uint64 max_children = 2; optional uint64 total_children = 3; } // Bounding box for Geometry or Geography type in the representation of min/max // value pair of coordinates from each axis. message BoundingBox { optional double xmin = 1; optional double xmax = 2; optional double ymin = 3; optional double ymax = 4; optional double zmin = 5; optional double zmax = 6; optional double mmin = 7; optional double mmax = 8; } // Statistics specific to Geometry or Geography type message GeospatialStatistics { // A bounding box of geospatial instances optional BoundingBox bbox = 1; // Geospatial type codes of all instances, or an empty list if not known repeated int32 geospatial_types = 2; } message ColumnStatistics { optional uint64 number_of_values = 1; optional IntegerStatistics int_statistics = 2; optional DoubleStatistics double_statistics = 3; optional StringStatistics string_statistics = 4; optional BucketStatistics bucket_statistics = 5; optional DecimalStatistics decimal_statistics = 6; optional DateStatistics date_statistics = 7; optional BinaryStatistics binary_statistics = 8; optional TimestampStatistics timestamp_statistics = 9; optional bool has_null = 10; optional uint64 bytes_on_disk = 11; optional CollectionStatistics collection_statistics = 12; optional GeospatialStatistics geospatial_statistics = 13; } message RowIndexEntry { repeated uint64 positions = 1 [packed=true]; optional ColumnStatistics statistics = 2; } message RowIndex { repeated RowIndexEntry entry = 1; } message BloomFilter { optional uint32 num_hash_functions = 1; repeated fixed64 bitset = 2; optional bytes utf8bitset = 3; } message BloomFilterIndex { repeated BloomFilter bloom_filter = 1; } message Stream { // if you add new index stream kinds, you need to make sure to update // StreamName to ensure it is added to the stripe in the right area enum Kind { PRESENT = 0; DATA = 1; LENGTH = 2; DICTIONARY_DATA = 3; DICTIONARY_COUNT = 4; SECONDARY = 5; ROW_INDEX = 6; BLOOM_FILTER = 7; BLOOM_FILTER_UTF8 = 8; // Virtual stream kinds to allocate space for encrypted index and data. ENCRYPTED_INDEX = 9; ENCRYPTED_DATA = 10; // stripe statistics streams STRIPE_STATISTICS = 100; // A virtual stream kind that is used for setting the encryption IV. FILE_STATISTICS = 101; } optional Kind kind = 1; optional uint32 column = 2; optional uint64 length = 3; } message ColumnEncoding { enum Kind { DIRECT = 0; DICTIONARY = 1; DIRECT_V2 = 2; DICTIONARY_V2 = 3; } optional Kind kind = 1; optional uint32 dictionary_size = 2; // The encoding of the bloom filters for this column: // 0 or missing = none or original // 1 = ORC-135 (utc for timestamps) optional uint32 bloom_encoding = 3; } message StripeEncryptionVariant { repeated Stream streams = 1; repeated ColumnEncoding encoding = 2; } // each stripe looks like: // index streams // unencrypted // variant 1..N // data streams // unencrypted // variant 1..N // footer message StripeFooter { repeated Stream streams = 1; repeated ColumnEncoding columns = 2; optional string writer_timezone = 3; // one for each column encryption variant repeated StripeEncryptionVariant encryption = 4; } // the file tail looks like: // encrypted stripe statistics: ColumnarStripeStatistics (order by variant) // stripe statistics: Metadata // footer: Footer // postscript: PostScript // psLen: byte message StringPair { optional string key = 1; optional string value = 2; } message Type { enum Kind { BOOLEAN = 0; BYTE = 1; SHORT = 2; INT = 3; LONG = 4; FLOAT = 5; DOUBLE = 6; STRING = 7; BINARY = 8; TIMESTAMP = 9; LIST = 10; MAP = 11; STRUCT = 12; UNION = 13; DECIMAL = 14; DATE = 15; VARCHAR = 16; CHAR = 17; TIMESTAMP_INSTANT = 18; GEOMETRY = 19; GEOGRAPHY = 20; } optional Kind kind = 1; repeated uint32 subtypes = 2 [packed=true]; repeated string field_names = 3; optional uint32 maximum_length = 4; optional uint32 precision = 5; optional uint32 scale = 6; repeated StringPair attributes = 7; // Coordinate Reference System (CRS) for Geometry and Geography types optional string crs = 8; // Edge interpolation algorithm for Geography type enum EdgeInterpolationAlgorithm { SPHERICAL = 0; VINCENTY = 1; THOMAS = 2; ANDOYER = 3; KARNEY = 4; } optional EdgeInterpolationAlgorithm algorithm = 9; } message StripeInformation { // the global file offset of the start of the stripe optional uint64 offset = 1; // the number of bytes of index optional uint64 index_length = 2; // the number of bytes of data optional uint64 data_length = 3; // the number of bytes in the stripe footer optional uint64 footer_length = 4; // the number of rows in this stripe optional uint64 number_of_rows = 5; // If this is present, the reader should use this value for the encryption // stripe id for setting the encryption IV. Otherwise, the reader should // use one larger than the previous stripe's encryptStripeId. // For unmerged ORC files, the first stripe will use 1 and the rest of the // stripes won't have it set. For merged files, the stripe information // will be copied from their original files and thus the first stripe of // each of the input files will reset it to 1. // Note that 1 was choosen, because protobuf v3 doesn't serialize // primitive types that are the default (eg. 0). optional uint64 encrypt_stripe_id = 6; // For each encryption variant, the new encrypted local key to use // until we find a replacement. repeated bytes encrypted_local_keys = 7; } message UserMetadataItem { optional string name = 1; optional bytes value = 2; } // StripeStatistics (1 per a stripe), which each contain the // ColumnStatistics for each column. // This message type is only used in ORC v0 and v1. message StripeStatistics { repeated ColumnStatistics col_stats = 1; } // This message type is only used in ORC v0 and v1. message Metadata { repeated StripeStatistics stripe_stats = 1; } // In ORC v2 (and for encrypted columns in v1), each column has // their column statistics written separately. message ColumnarStripeStatistics { // one value for each stripe in the file repeated ColumnStatistics col_stats = 1; } enum EncryptionAlgorithm { UNKNOWN_ENCRYPTION = 0; // used for detecting future algorithms AES_CTR_128 = 1; AES_CTR_256 = 2; } message FileStatistics { repeated ColumnStatistics column = 1; } // How was the data masked? This isn't necessary for reading the file, but // is documentation about how the file was written. message DataMask { // the kind of masking, which may include third party masks optional string name = 1; // parameters for the mask repeated string mask_parameters = 2; // the unencrypted column roots this mask was applied to repeated uint32 columns = 3 [packed = true]; } // Information about the encryption keys. message EncryptionKey { optional string key_name = 1; optional uint32 key_version = 2; optional EncryptionAlgorithm algorithm = 3; } // The description of an encryption variant. // Each variant is a single subtype that is encrypted with a single key. message EncryptionVariant { // the column id of the root optional uint32 root = 1; // The master key that was used to encrypt the local key, referenced as // an index into the Encryption.key list. optional uint32 key = 2; // the encrypted key for the file footer optional bytes encrypted_key = 3; // the stripe statistics for this variant repeated Stream stripe_statistics = 4; // encrypted file statistics as a FileStatistics optional bytes file_statistics = 5; } // Which KeyProvider encrypted the local keys. enum KeyProviderKind { UNKNOWN = 0; HADOOP = 1; AWS = 2; GCP = 3; AZURE = 4; } message Encryption { // all of the masks used in this file repeated DataMask mask = 1; // all of the keys used in this file repeated EncryptionKey key = 2; // The encrypted variants. // Readers should prefer the first variant that the user has access to // the corresponding key. If they don't have access to any of the keys, // they should get the unencrypted masked data. repeated EncryptionVariant variants = 3; // How are the local keys encrypted? optional KeyProviderKind key_provider = 4; } enum CalendarKind { UNKNOWN_CALENDAR = 0; // A hybrid Julian/Gregorian calendar with a cutover point in October 1582. JULIAN_GREGORIAN = 1; // A calendar that extends the Gregorian calendar back forever. PROLEPTIC_GREGORIAN = 2; } message Footer { optional uint64 header_length = 1; optional uint64 content_length = 2; repeated StripeInformation stripes = 3; repeated Type types = 4; repeated UserMetadataItem metadata = 5; optional uint64 number_of_rows = 6; repeated ColumnStatistics statistics = 7; optional uint32 row_index_stride = 8; // Each implementation that writes ORC files should register for a code // 0 = ORC Java // 1 = ORC C++ // 2 = Presto // 3 = Scritchley Go from https://github.com/scritchley/orc // 4 = Trino // 5 = CUDF optional uint32 writer = 9; // information about the encryption in this file optional Encryption encryption = 10; optional CalendarKind calendar = 11; // informative description about the version of the software that wrote // the file. It is assumed to be within a given writer, so for example // ORC 1.7.2 = "1.7.2". It may include suffixes, such as "-SNAPSHOT". optional string software_version = 12; } enum CompressionKind { NONE = 0; ZLIB = 1; SNAPPY = 2; LZO = 3; LZ4 = 4; ZSTD = 5; BROTLI = 6; } // Serialized length must be less that 255 bytes message PostScript { optional uint64 footer_length = 1; optional CompressionKind compression = 2; optional uint64 compression_block_size = 3; // the version of the file format // [0, 11] = Hive 0.11 // [0, 12] = Hive 0.12 repeated uint32 version = 4 [packed = true]; optional uint64 metadata_length = 5; // The version of the writer that wrote the file. This number is // updated when we make fixes or large changes to the writer so that // readers can detect whether a given bug is present in the data. // // Only the Java ORC writer may use values under 6 (or missing) so that // readers that predate ORC-202 treat the new writers correctly. Each // writer should assign their own sequence of versions starting from 6. // // Version of the ORC Java writer: // 0 = original // 1 = HIVE-8732 fixed (fixed stripe/file maximum statistics & // string statistics use utf8 for min/max) // 2 = HIVE-4243 fixed (use real column names from Hive tables) // 3 = HIVE-12055 added (vectorized writer implementation) // 4 = HIVE-13083 fixed (decimals write present stream correctly) // 5 = ORC-101 fixed (bloom filters use utf8 consistently) // 6 = ORC-135 fixed (timestamp statistics use utc) // 7 = ORC-517 fixed (decimal64 min/max incorrect) // 8 = ORC-203 added (trim very long string statistics) // 9 = ORC-14 added (column encryption) // // Version of the ORC C++ writer: // 6 = original // // Version of the Presto writer: // 6 = original // // Version of the Scritchley Go writer: // 6 = original // // Version of the Trino writer: // 6 = original // // Version of the CUDF writer: // 6 = original // optional uint32 writer_version = 6; // the number of bytes in the encrypted stripe statistics optional uint64 stripe_statistics_length = 7; // Leave this last in the record optional string magic = 8000; } // The contents of the file tail that must be serialized. // This gets serialized as part of OrcSplit, also used by footer cache. message FileTail { optional PostScript postscript = 1; optional Footer footer = 2; optional uint64 file_length = 3; optional uint64 postscript_length = 4; } orc-format-1.1.0/.github/labeler.yml000644 000765 000024 00000001624 14777360722 020255 0ustar00dongjoonstaff000000 000000 # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # INFRA: - ".github/**/*" - ".asf.yaml" - ".gitignore" BUILD: - "**/*pom.xml" DOCS: - "**/*.md" PROTO: - "src/**/*" orc-format-1.1.0/.github/workflows/000755 000765 000024 00000000000 14777360722 020156 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/.github/PULL_REQUEST_TEMPLATE000644 000765 000024 00000003346 14777360722 021331 0ustar00dongjoonstaff000000 000000 ### What changes were proposed in this pull request? ### Why are the changes needed? ### How was this patch tested? orc-format-1.1.0/.github/workflows/labeler.yml000644 000765 000024 00000002126 14777360722 022310 0ustar00dongjoonstaff000000 000000 # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # name: "On pull requests" on: pull_request_target jobs: label: name: Label pull requests runs-on: ubuntu-latest permissions: contents: read pull-requests: write steps: - uses: actions/labeler@2.2.0 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" sync-labels: true orc-format-1.1.0/.github/workflows/stale.yml000644 000765 000024 00000002656 14777360722 022022 0ustar00dongjoonstaff000000 000000 # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # name: Close stale PRs on: schedule: - cron: "0 0 * * *" jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@c201d45ef4b0ccbd3bb0616f93bae13e73d0a080 # pin@v1.1.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: > We're closing this PR because it hasn't been updated in a while. This isn't a judgement on the merit of the PR in any way. It's just a way of keeping the PR queue manageable. If you'd like to revive this PR, please reopen it and ask a committer to remove the Stale tag! days-before-stale: 365 days-before-close: 0 orc-format-1.1.0/.github/workflows/build_and_test.yml000644 000765 000024 00000001110 14777360722 023652 0ustar00dongjoonstaff000000 000000 name: Build and test on: push: branches: - main pull_request: branches: - main jobs: build: if: github.repository == 'apache/orc-format' runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: actions/setup-java@v4 with: distribution: zulu java-version: 17 - uses: bufbuild/buf-setup-action@v1 with: github_token: ${{ secrets.GITHUB_TOKEN }} - uses: bufbuild/buf-lint-action@v1 with: input: "src/main/proto" - name: Install run: | ./mvnw install orc-format-1.1.0/.github/workflows/publish_snapshot.yml000644 000765 000024 00000001311 14777360722 024262 0ustar00dongjoonstaff000000 000000 name: Publish Snapshot on: push: branches: - main jobs: publish-snapshot: if: github.repository == 'apache/orc-format' runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: actions/setup-java@v4 with: distribution: zulu java-version: 17 - name: Publish snapshot env: ASF_USERNAME: ${{ secrets.NEXUS_USER }} ASF_PASSWORD: ${{ secrets.NEXUS_PW }} run: | echo "apache.snapshots.https$ASF_USERNAME$ASF_PASSWORD" > settings.xml ./mvnw --settings settings.xml -nsu -ntp -DskipTests deploy orc-format-1.1.0/specification/ORCv0.md000644 000765 000024 00000070763 14777360722 020631 0ustar00dongjoonstaff000000 000000 --- layout: page title: ORC Specification v0 --- This version of the file format was originally released as part of Hive 0.11. # Motivation Hive's RCFile was the standard format for storing tabular data in Hadoop for several years. However, RCFile has limitations because it treats each column as a binary blob without semantics. In Hive 0.11 we added a new file format named Optimized Row Columnar (ORC) file that uses and retains the type information from the table definition. ORC uses type specific readers and writers that provide light weight compression techniques such as dictionary encoding, bit packing, delta encoding, and run length encoding -- resulting in dramatically smaller files. Additionally, ORC can apply generic compression using zlib, or Snappy on top of the lightweight compression for even smaller files. However, storage savings are only part of the gain. ORC supports projection, which selects subsets of the columns for reading, so that queries reading only one column read only the required bytes. Furthermore, ORC files include light weight indexes that include the minimum and maximum values for each column in each set of 10,000 rows and the entire file. Using pushdown filters from Hive, the file reader can skip entire sets of rows that aren't important for this query. ![ORC file structure](./img/OrcFileLayout.png) # File Tail Since HDFS does not support changing the data in a file after it is written, ORC stores the top level index at the end of the file. The overall structure of the file is given in the figure above. The file's tail consists of 3 parts; the file metadata, file footer and postscript. The metadata for ORC is stored using [Protocol Buffers](https://s.apache.org/protobuf_encoding), which provides the ability to add new fields without breaking readers. This document incorporates the Protobuf definition from the [ORC source code](../src/main/proto/orc/proto/orc_proto.proto) and the reader is encouraged to review the Protobuf encoding if they need to understand the byte-level encoding ## Postscript The Postscript section provides the necessary information to interpret the rest of the file including the length of the file's Footer and Metadata sections, the version of the file, and the kind of general compression used (eg. none, zlib, or snappy). The Postscript is never compressed and ends one byte before the end of the file. The version stored in the Postscript is the lowest version of Hive that is guaranteed to be able to read the file and it stored as a sequence of the major and minor version. This version is stored as [0, 11]. The process of reading an ORC file works backwards through the file. Rather than making multiple short reads, the ORC reader reads the last 16k bytes of the file with the hope that it will contain both the Footer and Postscript sections. The final byte of the file contains the serialized length of the Postscript, which must be less than 256 bytes. Once the Postscript is parsed, the compressed serialized length of the Footer is known and it can be decompressed and parsed. ``` message PostScript { // the length of the footer section in bytes optional uint64 footerLength = 1; // the kind of generic compression used optional CompressionKind compression = 2; // the maximum size of each compression chunk optional uint64 compressionBlockSize = 3; // the version of the writer repeated uint32 version = 4 [packed = true]; // the length of the metadata section in bytes optional uint64 metadataLength = 5; // the fixed string "ORC" optional string magic = 8000; } ``` ``` enum CompressionKind { NONE = 0; ZLIB = 1; SNAPPY = 2; LZO = 3; LZ4 = 4; ZSTD = 5; } ``` ## Footer The Footer section contains the layout of the body of the file, the type schema information, the number of rows, and the statistics about each of the columns. The file is broken in to three parts- Header, Body, and Tail. The Header consists of the bytes "ORC'' to support tools that want to scan the front of the file to determine the type of the file. The Body contains the rows and indexes, and the Tail gives the file level information as described in this section. ``` message Footer { // the length of the file header in bytes (always 3) optional uint64 headerLength = 1; // the length of the file header and body in bytes optional uint64 contentLength = 2; // the information about the stripes repeated StripeInformation stripes = 3; // the schema information repeated Type types = 4; // the user metadata that was added repeated UserMetadataItem metadata = 5; // the total number of rows in the file optional uint64 numberOfRows = 6; // the statistics of each column across the file repeated ColumnStatistics statistics = 7; // the maximum number of rows in each index entry optional uint32 rowIndexStride = 8; } ``` ### Stripe Information The body of the file is divided into stripes. Each stripe is self contained and may be read using only its own bytes combined with the file's Footer and Postscript. Each stripe contains only entire rows so that rows never straddle stripe boundaries. Stripes have three sections: a set of indexes for the rows within the stripe, the data itself, and a stripe footer. Both the indexes and the data sections are divided by columns so that only the data for the required columns needs to be read. ``` message StripeInformation { // the start of the stripe within the file optional uint64 offset = 1; // the length of the indexes in bytes optional uint64 indexLength = 2; // the length of the data in bytes optional uint64 dataLength = 3; // the length of the footer in bytes optional uint64 footerLength = 4; // the number of rows in the stripe optional uint64 numberOfRows = 5; } ``` ### Type Information All of the rows in an ORC file must have the same schema. Logically the schema is expressed as a tree as in the figure below, where the compound types have subcolumns under them. ![ORC column structure](./img/TreeWriters.png) The equivalent Hive DDL would be: ``` create table Foobar ( myInt int, myMap map>, myTime timestamp ); ``` The type tree is flattened in to a list via a pre-order traversal where each type is assigned the next id. Clearly the root of the type tree is always type id 0. Compound types have a field named subtypes that contains the list of their children's type ids. ``` message Type { enum Kind { BOOLEAN = 0; BYTE = 1; SHORT = 2; INT = 3; LONG = 4; FLOAT = 5; DOUBLE = 6; STRING = 7; BINARY = 8; TIMESTAMP = 9; LIST = 10; MAP = 11; STRUCT = 12; UNION = 13; DECIMAL = 14; DATE = 15; VARCHAR = 16; CHAR = 17; } // the kind of this type required Kind kind = 1; // the type ids of any subcolumns for list, map, struct, or union repeated uint32 subtypes = 2 [packed=true]; // the list of field names for struct repeated string fieldNames = 3; // the maximum length of the type for varchar or char in UTF-8 characters optional uint32 maximumLength = 4; // the precision and scale for decimal optional uint32 precision = 5; optional uint32 scale = 6; } ``` ### Column Statistics The goal of the column statistics is that for each column, the writer records the count and depending on the type other useful fields. For most of the primitive types, it records the minimum and maximum values; and for numeric types it additionally stores the sum. From Hive 1.1.0 onwards, the column statistics will also record if there are any null values within the row group by setting the hasNull flag. The hasNull flag is used by ORC's predicate pushdown to better answer 'IS NULL' queries. ``` message ColumnStatistics { // the number of values optional uint64 numberOfValues = 1; // At most one of these has a value for any column optional IntegerStatistics intStatistics = 2; optional DoubleStatistics doubleStatistics = 3; optional StringStatistics stringStatistics = 4; optional BucketStatistics bucketStatistics = 5; optional DecimalStatistics decimalStatistics = 6; optional DateStatistics dateStatistics = 7; optional BinaryStatistics binaryStatistics = 8; optional TimestampStatistics timestampStatistics = 9; optional bool hasNull = 10; } ``` For integer types (tinyint, smallint, int, bigint), the column statistics includes the minimum, maximum, and sum. If the sum overflows long at any point during the calculation, no sum is recorded. ``` message IntegerStatistics { optional sint64 minimum = 1; optional sint64 maximum = 2; optional sint64 sum = 3; } ``` For floating point types (float, double), the column statistics include the minimum, maximum, and sum. If the sum overflows a double, no sum is recorded. ``` message DoubleStatistics { optional double minimum = 1; optional double maximum = 2; optional double sum = 3; } ``` For strings, the minimum value, maximum value, and the sum of the lengths of the values are recorded. ``` message StringStatistics { optional string minimum = 1; optional string maximum = 2; // sum will store the total length of all strings optional sint64 sum = 3; } ``` For booleans, the statistics include the count of false and true values. ``` message BucketStatistics { repeated uint64 count = 1 [packed=true]; } ``` For decimals, the minimum, maximum, and sum are stored. ``` message DecimalStatistics { optional string minimum = 1; optional string maximum = 2; optional string sum = 3; } ``` Date columns record the minimum and maximum values as the number of days since the UNIX epoch (1/1/1970 in UTC). ``` message DateStatistics { // min,max values saved as days since epoch optional sint32 minimum = 1; optional sint32 maximum = 2; } ``` Timestamp columns record the minimum and maximum values as the number of milliseconds since the epoch (1/1/2015). ``` message TimestampStatistics { // min,max values saved as milliseconds since epoch optional sint64 minimum = 1; optional sint64 maximum = 2; } ``` Binary columns store the aggregate number of bytes across all of the values. ``` message BinaryStatistics { // sum will store the total binary blob length optional sint64 sum = 1; } ``` ### User Metadata The user can add arbitrary key/value pairs to an ORC file as it is written. The contents of the keys and values are completely application defined, but the key is a string and the value is binary. Care should be taken by applications to make sure that their keys are unique and in general should be prefixed with an organization code. ``` message UserMetadataItem { // the user defined key required string name = 1; // the user defined binary value required bytes value = 2; } ``` ### File Metadata The file Metadata section contains column statistics at the stripe level granularity. These statistics enable input split elimination based on the predicate push-down evaluated per a stripe. ``` message StripeStatistics { repeated ColumnStatistics colStats = 1; } ``` ``` message Metadata { repeated StripeStatistics stripeStats = 1; } ``` # Compression If the ORC file writer selects a generic compression codec (zlib or snappy), every part of the ORC file except for the Postscript is compressed with that codec. However, one of the requirements for ORC is that the reader be able to skip over compressed bytes without decompressing the entire stream. To manage this, ORC writes compressed streams in chunks with headers as in the figure below. To handle uncompressable data, if the compressed data is larger than the original, the original is stored and the isOriginal flag is set. Each header is 3 bytes long with (compressedLength * 2 + isOriginal) stored as a little endian value. For example, the header for a chunk that compressed to 100,000 bytes would be [0x40, 0x0d, 0x03]. The header for 5 bytes that did not compress would be [0x0b, 0x00, 0x00]. Each compression chunk is compressed independently so that as long as a decompressor starts at the top of a header, it can start decompressing without the previous bytes. ![compression streams](./img/CompressionStream.png) The default compression chunk size is 256K, but writers can choose their own value. Larger chunks lead to better compression, but require more memory. The chunk size is recorded in the Postscript so that readers can allocate appropriately sized buffers. Readers are guaranteed that no chunk will expand to more than the compression chunk size. ORC files without generic compression write each stream directly with no headers. # Run Length Encoding ## Base 128 Varint Variable width integer encodings take advantage of the fact that most numbers are small and that having smaller encodings for small numbers shrinks the overall size of the data. ORC uses the varint format from Protocol Buffers, which writes data in little endian format using the low 7 bits of each byte. The high bit in each byte is set if the number continues into the next byte. Unsigned Original | Serialized :---------------- | :--------- 0 | 0x00 1 | 0x01 127 | 0x7f 128 | 0x80, 0x01 129 | 0x81, 0x01 16,383 | 0xff, 0x7f 16,384 | 0x80, 0x80, 0x01 16,385 | 0x81, 0x80, 0x01 For signed integer types, the number is converted into an unsigned number using a zigzag encoding. Zigzag encoding moves the sign bit to the least significant bit using the expression (val << 1) ^ (val >> 63) and derives its name from the fact that positive and negative numbers alternate once encoded. The unsigned number is then serialized as above. Signed Original | Unsigned :-------------- | :------- 0 | 0 -1 | 1 1 | 2 -2 | 3 2 | 4 ## Byte Run Length Encoding For byte streams, ORC uses a very light weight encoding of identical values. * Run - a sequence of at least 3 identical values * Literals - a sequence of non-identical values The first byte of each group of values is a header that determines whether it is a run (value between 0 to 127) or literal list (value between -128 to -1). For runs, the control byte is the length of the run minus the length of the minimal run (3) and the control byte for literal lists is the negative length of the list. For example, a hundred 0's is encoded as [0x61, 0x00] and the sequence 0x44, 0x45 would be encoded as [0xfe, 0x44, 0x45]. The next group can choose either of the encodings. ## Boolean Run Length Encoding For encoding boolean types, the bits are put in the bytes from most significant to least significant. The bytes are encoded using byte run length encoding as described in the previous section. For example, the byte sequence [0xff, 0x80] would be one true followed by seven false values. ## Integer Run Length Encoding, version 1 ORC v0 files use Run Length Encoding version 1 (RLEv1), which provides a lightweight compression of signed or unsigned integer sequences. RLEv1 has two sub-encodings: * Run - a sequence of values that differ by a small fixed delta * Literals - a sequence of varint encoded values Runs start with an initial byte of 0x00 to 0x7f, which encodes the length of the run - 3. A second byte provides the fixed delta in the range of -128 to 127. Finally, the first value of the run is encoded as a base 128 varint. For example, if the sequence is 100 instances of 7 the encoding would start with 100 - 3, followed by a delta of 0, and a varint of 7 for an encoding of [0x61, 0x00, 0x07]. To encode the sequence of numbers running from 100 to 1, the first byte is 100 - 3, the delta is -1, and the varint is 100 for an encoding of [0x61, 0xff, 0x64]. Literals start with an initial byte of 0x80 to 0xff, which corresponds to the negative of number of literals in the sequence. Following the header byte, the list of N varints is encoded. Thus, if there are no runs, the overhead is 1 byte for each 128 integers. Numbers [2, 3, 6, 7, 11] would be encoded as [0xfb, 0x02, 0x03, 0x06, 0x07, 0xb]. # Stripes The body of ORC files consists of a series of stripes. Stripes are large (typically ~200MB) and independent of each other and are often processed by different tasks. The defining characteristic for columnar storage formats is that the data for each column is stored separately and that reading data out of the file should be proportional to the number of columns read. In ORC files, each column is stored in several streams that are stored next to each other in the file. For example, an integer column is represented as two streams PRESENT, which uses one with a bit per value recording if the value is non-null, and DATA, which records the non-null values. If all of a column's values in a stripe are non-null, the PRESENT stream is omitted from the stripe. For binary data, ORC uses three streams PRESENT, DATA, and LENGTH, which stores the length of each value. The details of each type will be presented in the following subsections. There is a general order for index and data streams: * Index streams are always placed together in the beginning of the stripe. * Data streams are placed together after index streams (if any). * Inside index streams or data streams, the unencrypted streams should be placed first and then followed by streams grouped by each encryption variant. There is no fixed order within each unencrypted or encryption variant in the index and data streams: * Different stream kinds of the same column can be placed in any order. * Streams from different columns can even be placed in any order. To get the precise information (a.k.a stream kind, column id and location) of a stream within a stripe, the streams field in the StripeFooter described below is the single source of truth. In the example of the integer column mentioned above, the order of the PRESENT stream and the DATA stream cannot be determined in advance. We need to get the precise information by **StripeFooter**. ## Stripe Footer The stripe footer contains the encoding of each column and the directory of the streams including their location. ``` message StripeFooter { // the location of each stream repeated Stream streams = 1; // the encoding of each column repeated ColumnEncoding columns = 2; } ``` To describe each stream, ORC stores the kind of stream, the column id, and the stream's size in bytes. The details of what is stored in each stream depends on the type and encoding of the column. ``` message Stream { enum Kind { // boolean stream of whether the next value is non-null PRESENT = 0; // the primary data stream DATA = 1; // the length of each value for variable length data LENGTH = 2; // the dictionary blob DICTIONARY_DATA = 3; // deprecated prior to Hive 0.11 // It was used to store the number of instances of each value in the // dictionary DICTIONARY_COUNT = 4; // a secondary data stream SECONDARY = 5; // the index for seeking to particular row groups ROW_INDEX = 6; } required Kind kind = 1; // the column id optional uint32 column = 2; // the number of bytes in the file optional uint64 length = 3; } ``` Depending on their type several options for encoding are possible. The encodings are divided into direct or dictionary-based categories and further refined as to whether they use RLE v1 or v2. ``` message ColumnEncoding { enum Kind { // the encoding is mapped directly to the stream using RLE v1 DIRECT = 0; // the encoding uses a dictionary of unique values using RLE v1 DICTIONARY = 1; // the encoding is direct using RLE v2 } required Kind kind = 1; // for dictionary encodings, record the size of the dictionary optional uint32 dictionarySize = 2; } ``` # Column Encodings ## SmallInt, Int, and BigInt Columns All of the 16, 32, and 64 bit integer column types use the same set of potential encodings, which is basically whether they use RLE v1 or v2. If the PRESENT stream is not included, all of the values are present. For values that have false bits in the present stream, no values are included in the data stream. Encoding | Stream Kind | Optional | Contents :-------- | :---------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v1 > Note that the order of the Stream is not fixed. It also applies to other Column types. ## Float and Double Columns Floating point types are stored using IEEE 754 floating point bit layout. Float columns use 4 bytes per value and double columns use 8 bytes. Encoding | Stream Kind | Optional | Contents :-------- | :---------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | IEEE 754 floating point representation ## String, Char, and VarChar Columns String, char, and varchar columns may be encoded either using a dictionary encoding or a direct encoding. A direct encoding should be preferred when there are many distinct values. In all of the encodings, the PRESENT stream encodes whether the value is null. The Java ORC writer automatically picks the encoding after the first row group (10,000 rows). For direct encoding the UTF-8 bytes are saved in the DATA stream and the length of each value is written into the LENGTH stream. In direct encoding, if the values were ["Nevada", "California"]; the DATA would be "NevadaCalifornia" and the LENGTH would be [6, 10]. For dictionary encodings the dictionary is sorted (in lexicographical order of bytes in the UTF-8 encodings) and UTF-8 bytes of each unique value are placed into DICTIONARY_DATA. The length of each item in the dictionary is put into the LENGTH stream. The DATA stream consists of the sequence of references to the dictionary elements. In dictionary encoding, if the values were ["Nevada", "California", "Nevada", "California", and "Florida"]; the DICTIONARY_DATA would be "CaliforniaFloridaNevada" and LENGTH would be [10, 7, 6]. The DATA would be [2, 0, 2, 0, 1]. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v1 DICTIONARY | PRESENT | Yes | Boolean RLE | DATA | No | Unsigned Integer RLE v1 | DICTIONARY_DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v1 ## Boolean Columns Boolean columns are rare, but have a simple encoding. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Boolean RLE ## TinyInt Columns TinyInt (byte) columns use byte run length encoding. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Byte RLE ## Binary Columns Binary data is encoded with a PRESENT stream, a DATA stream that records the contents, and a LENGTH stream that records the number of bytes per a value. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v1 ## Decimal Columns Decimal was introduced in Hive 0.11 with infinite precision (the total number of digits). In Hive 0.13, the definition was change to limit the precision to a maximum of 38 digits, which conveniently uses 127 bits plus a sign bit. The current encoding of decimal columns stores the integer representation of the value as an unbounded length zigzag encoded base 128 varint. The scale is stored in the SECONDARY stream as a signed integer. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Unbounded base 128 varints | SECONDARY | No | Signed Integer RLE v1 ## Date Columns Date data is encoded with a PRESENT stream, a DATA stream that records the number of days after January 1, 1970 in UTC. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v1 ## Timestamp Columns Timestamp records times down to nanoseconds as a PRESENT stream that records non-null values, a DATA stream that records the number of seconds after 1 January 2015, and a SECONDARY stream that records the number of nanoseconds. Because the number of nanoseconds often has a large number of trailing zeros, the number has trailing decimal zero digits removed and the last three bits are used to record how many zeros were removed. if the trailing zeros are more than 2. Thus 1000 nanoseconds would be serialized as 0x0a and 100000 would be serialized as 0x0c. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v1 | SECONDARY | No | Unsigned Integer RLE v1 ## Struct Columns Structs have no data themselves and delegate everything to their child columns except for their PRESENT stream. They have a child column for each of the fields. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE ## List Columns Lists are encoded as the PRESENT stream and a length stream with number of items in each list. They have a single child column for the element values. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v1 ## Map Columns Maps are encoded as the PRESENT stream and a length stream with number of items in each map. They have a child column for the key and another child column for the value. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v1 ## Union Columns Unions are encoded as the PRESENT stream and a tag stream that controls which potential variant is used. They have a child column for each variant of the union. Currently ORC union types are limited to 256 variants, which matches the Hive type model. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DIRECT | No | Byte RLE # Indexes ## Row Group Index The row group indexes consist of a ROW_INDEX stream for each primitive column that has an entry for each row group. Row groups are controlled by the writer and default to 10,000 rows. Each RowIndexEntry gives the position of each stream for the column and the statistics for that row group. The index streams are placed at the front of the stripe, because in the default case of streaming they do not need to be read. They are only loaded when either predicate push down is being used or the reader seeks to a particular row. ``` message RowIndexEntry { repeated uint64 positions = 1 [packed=true]; optional ColumnStatistics statistics = 2; } ``` ``` message RowIndex { repeated RowIndexEntry entry = 1; } ``` To record positions, each stream needs a sequence of numbers. For uncompressed streams, the position is the byte offset of the RLE run's start location followed by the number of values that need to be consumed from the run. In compressed streams, the first number is the start of the compression chunk in the stream, followed by the number of decompressed bytes that need to be consumed, and finally the number of values consumed in the RLE. For columns with multiple streams, the sequences of positions in each stream are concatenated. That was an unfortunate decision on my part that we should fix at some point, because it makes code that uses the indexes error-prone. Because dictionaries are accessed randomly, there is not a position to record for the dictionary and the entire dictionary must be read even if only part of a stripe is being read. Note that for columns with multiple streams, the order of stream positions in the RowIndex is **fixed**, which may be different to the actual data stream placement, and it is the same as [Column Encodings](#column-encoding-section) section we described above. orc-format-1.1.0/specification/ORCv1.md000644 000765 000024 00000142421 14777360722 020621 0ustar00dongjoonstaff000000 000000 --- layout: page title: ORC Specification v1 --- This version of the file format was originally released as part of Hive 0.12. # Motivation Hive's RCFile was the standard format for storing tabular data in Hadoop for several years. However, RCFile has limitations because it treats each column as a binary blob without semantics. In Hive 0.11 we added a new file format named Optimized Row Columnar (ORC) file that uses and retains the type information from the table definition. ORC uses type specific readers and writers that provide light weight compression techniques such as dictionary encoding, bit packing, delta encoding, and run length encoding -- resulting in dramatically smaller files. Additionally, ORC can apply generic compression using zlib, or Snappy on top of the lightweight compression for even smaller files. However, storage savings are only part of the gain. ORC supports projection, which selects subsets of the columns for reading, so that queries reading only one column read only the required bytes. Furthermore, ORC files include light weight indexes that include the minimum and maximum values for each column in each set of 10,000 rows and the entire file. Using pushdown filters from Hive, the file reader can skip entire sets of rows that aren't important for this query. ![ORC file structure](./img/OrcFileLayout.png) # File Tail Since HDFS does not support changing the data in a file after it is written, ORC stores the top level index at the end of the file. The overall structure of the file is given in the figure above. The file's tail consists of 3 parts; the file metadata, file footer and postscript. The metadata for ORC is stored using [Protocol Buffers](https://s.apache.org/protobuf_encoding), which provides the ability to add new fields without breaking readers. This document incorporates the Protobuf definition from the [ORC source code](../src/main/proto/orc/proto/orc_proto.proto) and the reader is encouraged to review the Protobuf encoding if they need to understand the byte-level encoding The sections of the file tail are (and their protobuf message type): * encrypted stripe statistics: list of ColumnarStripeStatistics * stripe statistics: Metadata * footer: Footer * postscript: PostScript * psLen: byte ## Postscript The Postscript section provides the necessary information to interpret the rest of the file including the length of the file's Footer and Metadata sections, the version of the file, and the kind of general compression used (eg. none, zlib, or snappy). The Postscript is never compressed and ends one byte before the end of the file. The version stored in the Postscript is the lowest version of Hive that is guaranteed to be able to read the file and it stored as a sequence of the major and minor version. This file version is encoded as [0,12]. The process of reading an ORC file works backwards through the file. Rather than making multiple short reads, the ORC reader reads the last 16k bytes of the file with the hope that it will contain both the Footer and Postscript sections. The final byte of the file contains the serialized length of the Postscript, which must be less than 256 bytes. Once the Postscript is parsed, the compressed serialized length of the Footer is known and it can be decompressed and parsed. ``` message PostScript { // the length of the footer section in bytes optional uint64 footerLength = 1; // the kind of generic compression used optional CompressionKind compression = 2; // the maximum size of each compression chunk optional uint64 compressionBlockSize = 3; // the version of the writer repeated uint32 version = 4 [packed = true]; // the length of the metadata section in bytes optional uint64 metadataLength = 5; // the fixed string "ORC" optional string magic = 8000; } ``` ``` enum CompressionKind { NONE = 0; ZLIB = 1; SNAPPY = 2; LZO = 3; LZ4 = 4; ZSTD = 5; } ``` ## Footer The Footer section contains the layout of the body of the file, the type schema information, the number of rows, and the statistics about each of the columns. The file is broken in to three parts- Header, Body, and Tail. The Header consists of the bytes "ORC'' to support tools that want to scan the front of the file to determine the type of the file. The Body contains the rows and indexes, and the Tail gives the file level information as described in this section. ``` message Footer { // the length of the file header in bytes (always 3) optional uint64 headerLength = 1; // the length of the file header and body in bytes optional uint64 contentLength = 2; // the information about the stripes repeated StripeInformation stripes = 3; // the schema information repeated Type types = 4; // the user metadata that was added repeated UserMetadataItem metadata = 5; // the total number of rows in the file optional uint64 numberOfRows = 6; // the statistics of each column across the file repeated ColumnStatistics statistics = 7; // the maximum number of rows in each index entry optional uint32 rowIndexStride = 8; // Each implementation that writes ORC files should register for a code // 0 = ORC Java // 1 = ORC C++ // 2 = Presto // 3 = Scritchley Go from https://github.com/scritchley/orc // 4 = Trino optional uint32 writer = 9; // information about the encryption in this file optional Encryption encryption = 10; // the number of bytes in the encrypted stripe statistics optional uint64 stripeStatisticsLength = 11; } ``` ### Stripe Information The body of the file is divided into stripes. Each stripe is self contained and may be read using only its own bytes combined with the file's Footer and Postscript. Each stripe contains only entire rows so that rows never straddle stripe boundaries. Stripes have three sections: a set of indexes for the rows within the stripe, the data itself, and a stripe footer. Both the indexes and the data sections are divided by columns so that only the data for the required columns needs to be read. The encryptStripeId and encryptedLocalKeys support column encryption. They are set on the first stripe of each ORC file with column encryption and not set after that. For a stripe with the values set, the reader should use those values for that stripe. Subsequent stripes use the previous encryptStripeId + 1 and the same keys. The current ORC merging code merges entire files, and thus the reader will get the correct values on what was the first stripe and continue on. If we develop a merge tool that reorders stripes or does partial merges, these values will need to be set correctly by that tool. ``` message StripeInformation { // the start of the stripe within the file optional uint64 offset = 1; // the length of the indexes in bytes optional uint64 indexLength = 2; // the length of the data in bytes optional uint64 dataLength = 3; // the length of the footer in bytes optional uint64 footerLength = 4; // the number of rows in the stripe optional uint64 numberOfRows = 5; // If this is present, the reader should use this value for the encryption // stripe id for setting the encryption IV. Otherwise, the reader should // use one larger than the previous stripe's encryptStripeId. // For unmerged ORC files, the first stripe will use 1 and the rest of the // stripes won't have it set. For merged files, the stripe information // will be copied from their original files and thus the first stripe of // each of the input files will reset it to 1. // Note that 1 was choosen, because protobuf v3 doesn't serialize // primitive types that are the default (eg. 0). optional uint64 encryptStripeId = 6; // For each encryption variant, the new encrypted local key to use until we // find a replacement. repeated bytes encryptedLocalKeys = 7; } ``` ### Type Information All of the rows in an ORC file must have the same schema. Logically the schema is expressed as a tree as in the figure below, where the compound types have subcolumns under them. ![ORC column structure](./img/TreeWriters.png) The equivalent Hive DDL would be: ``` create table Foobar ( myInt int, myMap map>, myTime timestamp ); ``` The type tree is flattened in to a list via a pre-order traversal where each type is assigned the next id. Clearly the root of the type tree is always type id 0. Compound types have a field named subtypes that contains the list of their children's type ids. ``` message Type { enum Kind { BOOLEAN = 0; BYTE = 1; SHORT = 2; INT = 3; LONG = 4; FLOAT = 5; DOUBLE = 6; STRING = 7; BINARY = 8; TIMESTAMP = 9; LIST = 10; MAP = 11; STRUCT = 12; UNION = 13; DECIMAL = 14; DATE = 15; VARCHAR = 16; CHAR = 17; TIMESTAMP_INSTANT = 18; } // the kind of this type required Kind kind = 1; // the type ids of any subcolumns for list, map, struct, or union repeated uint32 subtypes = 2 [packed=true]; // the list of field names for struct repeated string fieldNames = 3; // the maximum length of the type for varchar or char in UTF-8 characters optional uint32 maximumLength = 4; // the precision and scale for decimal optional uint32 precision = 5; optional uint32 scale = 6; } ``` ### Column Statistics The goal of the column statistics is that for each column, the writer records the count and depending on the type other useful fields. For most of the primitive types, it records the minimum and maximum values; and for numeric types it additionally stores the sum. From Hive 1.1.0 onwards, the column statistics will also record if there are any null values within the row group by setting the hasNull flag. The hasNull flag is used by ORC's predicate pushdown to better answer 'IS NULL' queries. ``` message ColumnStatistics { // the number of values optional uint64 numberOfValues = 1; // At most one of these has a value for any column optional IntegerStatistics intStatistics = 2; optional DoubleStatistics doubleStatistics = 3; optional StringStatistics stringStatistics = 4; optional BucketStatistics bucketStatistics = 5; optional DecimalStatistics decimalStatistics = 6; optional DateStatistics dateStatistics = 7; optional BinaryStatistics binaryStatistics = 8; optional TimestampStatistics timestampStatistics = 9; optional bool hasNull = 10; optional uint64 bytes_on_disk = 11; optional CollectionStatistics collection_statistics = 12; } ``` For integer types (tinyint, smallint, int, bigint), the column statistics includes the minimum, maximum, and sum. If the sum overflows long at any point during the calculation, no sum is recorded. ``` message IntegerStatistics { optional sint64 minimum = 1; optional sint64 maximum = 2; optional sint64 sum = 3; } ``` For floating point types (float, double), the column statistics include the minimum, maximum, and sum. If the sum overflows a double, no sum is recorded. ``` message DoubleStatistics { optional double minimum = 1; optional double maximum = 2; optional double sum = 3; } ``` For strings, the minimum value, maximum value, and the sum of the lengths of the values are recorded. ``` message StringStatistics { optional string minimum = 1; optional string maximum = 2; // sum will store the total length of all strings optional sint64 sum = 3; } ``` For booleans, the statistics include the count of false and true values. ``` message BucketStatistics { repeated uint64 count = 1 [packed=true]; } ``` For decimals, the minimum, maximum, and sum are stored. ``` message DecimalStatistics { optional string minimum = 1; optional string maximum = 2; optional string sum = 3; } ``` Date columns record the minimum and maximum values as the number of days since the UNIX epoch (1/1/1970 in UTC). ``` message DateStatistics { // min,max values saved as days since epoch optional sint32 minimum = 1; optional sint32 maximum = 2; } ``` Timestamp columns record the minimum and maximum values as the number of milliseconds since the UNIX epoch (1/1/1970 00:00:00). Before ORC-135, the local timezone offset was included and they were stored as `minimum` and `maximum`. After ORC-135, the timestamp is adjusted to UTC before being converted to milliseconds and stored in `minimumUtc` and `maximumUtc`. ``` message TimestampStatistics { // min,max values saved as milliseconds since epoch optional sint64 minimum = 1; optional sint64 maximum = 2; // min,max values saved as milliseconds since UNIX epoch optional sint64 minimumUtc = 3; optional sint64 maximumUtc = 4; } ``` Binary columns store the aggregate number of bytes across all of the values. ``` message BinaryStatistics { // sum will store the total binary blob length optional sint64 sum = 1; } ``` ### User Metadata The user can add arbitrary key/value pairs to an ORC file as it is written. The contents of the keys and values are completely application defined, but the key is a string and the value is binary. Care should be taken by applications to make sure that their keys are unique and in general should be prefixed with an organization code. ``` message UserMetadataItem { // the user defined key required string name = 1; // the user defined binary value required bytes value = 2; } ``` ### File Metadata The file Metadata section contains column statistics at the stripe level granularity. These statistics enable input split elimination based on the predicate push-down evaluated per a stripe. ``` message StripeStatistics { repeated ColumnStatistics colStats = 1; } ``` ``` message Metadata { repeated StripeStatistics stripeStats = 1; } ``` # Column Encryption ORC as of Apache ORC 1.6 supports column encryption where the data and statistics of specific columns are encrypted on disk. Column encryption provides fine-grain column level security even when many users have access to the file itself. The encryption is transparent to the user and the writer only needs to define which columns and encryption keys to use. When reading an ORC file, if the user has access to the keys, they will get the real data. If they do not have the keys, they will get the masked data. ``` message Encryption { // all of the masks used in this file repeated DataMask mask = 1; // all of the keys used in this file repeated EncryptionKey key = 2; // The encrypted variants. // Readers should prefer the first variant that the user has access to // the corresponding key. If they don't have access to any of the keys, // they should get the unencrypted masked data. repeated EncryptionVariant variants = 3; // How are the local keys encrypted? optional KeyProviderKind keyProvider = 4; } ``` Each encrypted column in each file will have a random local key generated for it. Thus, even though all of the decryption happens locally in the reader, a malicious user that stores the key only enables access that column in that file. The local keys are encrypted by the Hadoop or Ranger Key Management Server (KMS). The encrypted local keys are stored in the file footer's StripeInformation. ``` enum KeyProviderKind { UNKNOWN = 0; HADOOP = 1; AWS = 2; GCP = 3; AZURE = 4; } ``` When ORC is using the Hadoop or Ranger KMS, it generates a random encrypted local key (16 or 32 bytes for 128 or 256 bit AES respectively). Using the first 16 bytes as the IV, it uses AES/CTR to decrypt the local key. With the AWS KMS, the GenerateDataKey method is used to create a new local key and the Decrypt method is used to decrypt it. ## Data Masks The user's data is statically masked before writing the unencrypted variant. Because the masking was done statically when the file was written, the information about the masking is just informational. The three standard masks are: * nullify - all values become null * redact - replace characters with constants such as X or 9 * sha256 - replace string with the SHA 256 of the value The default is nullify, but masks may be defined by the user. Masks are not allowed to change the type of the column, just the values. ``` message DataMask { // the kind of masking, which may include third party masks optional string name = 1; // parameters for the mask repeated string maskParameters = 2; // the unencrypted column roots this mask was applied to repeated uint32 columns = 3 [packed = true]; } ``` ## Encryption Keys In addition to the encrypted local keys, which are stored in the footer's StripeInformation, the file also needs to describe the master key that was used to encrypt the local keys. The master keys are described by name, their version, and the encryption algorithm. ``` message EncryptionKey { optional string keyName = 1; optional uint32 keyVersion = 2; optional EncryptionAlgorithm algorithm = 3; } ``` The encryption algorithm is stored using an enumeration and since ProtoBuf uses the 0 value as a default, we added an unused value. That ensures that if we add a new algorithm that old readers will get UNKNOWN_ENCRYPTION instead of a real value. ``` enum EncryptionAlgorithm { // used for detecting future algorithms UNKNOWN_ENCRYPTION = 0; // 128 bit AES/CTR AES_CTR_128 = 1; // 256 bit AES/CTR AES_CTR_256 = 2; } ``` ## Encryption Variants Each encrypted column is written as two variants: * encrypted unmasked - for users with access to the key * unencrypted masked - for all other users The changes to the format were done so that old ORC readers will read the masked unencrypted data. Encryption variants encrypt a subtree of columns and use a single local key. The initial version of encryption support only allows the two variants, but this may be extended later and thus readers should use the first variant of a column that the reader has access to. ``` message EncryptionVariant { // the column id of the root column that is encrypted in this variant optional uint32 root = 1; // the key that encrypted this variant optional uint32 key = 2; // The master key that was used to encrypt the local key, referenced as // an index into the Encryption.key list. optional bytes encryptedKey = 3; // the stripe statistics for this variant repeated Stream stripeStatistics = 4; // encrypted file statistics as a FileStatistics optional bytes fileStatistics = 5; } ``` Each variant stores stripe and file statistics separately. The file statistics are serialized as a FileStatistics, compressed, encrypted and stored in the EncryptionVariant.fileStatistics. ``` message FileStatistics { repeated ColumnStatistics column = 1; } ``` The stripe statistics for each column are serialized as ColumnarStripeStatistics, compressed, encrypted and stored in a stream of kind STRIPE_STATISTICS. By making the column stripe statistics independent of each other, the reader only reads and parses the columns contained in the SARG. ``` message ColumnarStripeStatistics { // one value for each stripe in the file repeated ColumnStatistics colStats = 1; } ``` ## Stream Encryption Our encryption is done using AES/CTR. CTR is a mode that has some very nice properties for us: * It is seeded so that identical data is encrypted differently. * It does not require padding the stream to the cipher length. * It allows readers to seek in to a stream. * The IV does not need to be randomly generated. To ensure that we don't reuse IV, we set the IV as: * bytes 0 to 2 - column id * bytes 3 to 4 - stream kind * bytes 5 to 7 - stripe id * bytes 8 to 15 - cipher block counter However, it is critical for CTR that we never reuse an initialization vector (IV) with the same local key. For data in the footer, use the number of stripes in the file as the stripe id. This guarantees when we write an intermediate footer in to a file that we don't use the same IV. Additionally, we never reuse a local key for new data. For example, when merging files, we don't reuse local key from the input files for the new file tail, but always generate a new local key. # Compression If the ORC file writer selects a generic compression codec (zlib or snappy), every part of the ORC file except for the Postscript is compressed with that codec. However, one of the requirements for ORC is that the reader be able to skip over compressed bytes without decompressing the entire stream. To manage this, ORC writes compressed streams in chunks with headers as in the figure below. To handle uncompressable data, if the compressed data is larger than the original, the original is stored and the isOriginal flag is set. Each header is 3 bytes long with (compressedLength * 2 + isOriginal) stored as a little endian value. For example, the header for a chunk that compressed to 100,000 bytes would be [0x40, 0x0d, 0x03]. The header for 5 bytes that did not compress would be [0x0b, 0x00, 0x00]. Each compression chunk is compressed independently so that as long as a decompressor starts at the top of a header, it can start decompressing without the previous bytes. ![compression streams](./img/CompressionStream.png) The default compression chunk size is 256K, but writers can choose their own value. Larger chunks lead to better compression, but require more memory. The chunk size is recorded in the Postscript so that readers can allocate appropriately sized buffers. Readers are guaranteed that no chunk will expand to more than the compression chunk size. ORC files without generic compression write each stream directly with no headers. # Run Length Encoding ## Base 128 Varint Variable width integer encodings take advantage of the fact that most numbers are small and that having smaller encodings for small numbers shrinks the overall size of the data. ORC uses the varint format from Protocol Buffers, which writes data in little endian format using the low 7 bits of each byte. The high bit in each byte is set if the number continues into the next byte. Unsigned Original | Serialized :---------------- | :--------- 0 | 0x00 1 | 0x01 127 | 0x7f 128 | 0x80, 0x01 129 | 0x81, 0x01 16,383 | 0xff, 0x7f 16,384 | 0x80, 0x80, 0x01 16,385 | 0x81, 0x80, 0x01 For signed integer types, the number is converted into an unsigned number using a zigzag encoding. Zigzag encoding moves the sign bit to the least significant bit using the expression (val << 1) ^ (val >> 63) and derives its name from the fact that positive and negative numbers alternate once encoded. The unsigned number is then serialized as above. Signed Original | Unsigned :-------------- | :------- 0 | 0 -1 | 1 1 | 2 -2 | 3 2 | 4 ## Byte Run Length Encoding For byte streams, ORC uses a very light weight encoding of identical values. * Run - a sequence of at least 3 identical values * Literals - a sequence of non-identical values The first byte of each group of values is a header that determines whether it is a run (value between 0 to 127) or literal list (value between -128 to -1). For runs, the control byte is the length of the run minus the length of the minimal run (3) and the control byte for literal lists is the negative length of the list. For example, a hundred 0's is encoded as [0x61, 0x00] and the sequence 0x44, 0x45 would be encoded as [0xfe, 0x44, 0x45]. The next group can choose either of the encodings. ## Boolean Run Length Encoding For encoding boolean types, the bits are put in the bytes from most significant to least significant. The bytes are encoded using byte run length encoding as described in the previous section. For example, the byte sequence [0xff, 0x80] would be one true followed by seven false values. ## Integer Run Length Encoding, version 1 In Hive 0.11 ORC files used Run Length Encoding version 1 (RLEv1), which provides a lightweight compression of signed or unsigned integer sequences. RLEv1 has two sub-encodings: * Run - a sequence of values that differ by a small fixed delta * Literals - a sequence of varint encoded values Runs start with an initial byte of 0x00 to 0x7f, which encodes the length of the run - 3. A second byte provides the fixed delta in the range of -128 to 127. Finally, the first value of the run is encoded as a base 128 varint. For example, if the sequence is 100 instances of 7 the encoding would start with 100 - 3, followed by a delta of 0, and a varint of 7 for an encoding of [0x61, 0x00, 0x07]. To encode the sequence of numbers running from 100 to 1, the first byte is 100 - 3, the delta is -1, and the varint is 100 for an encoding of [0x61, 0xff, 0x64]. Literals start with an initial byte of 0x80 to 0xff, which corresponds to the negative of number of literals in the sequence. Following the header byte, the list of N varints is encoded. Thus, if there are no runs, the overhead is 1 byte for each 128 integers. Numbers [2, 3, 6, 7, 11] would be encoded as [0xfb, 0x02, 0x03, 0x06, 0x07, 0xb]. ## Integer Run Length Encoding, version 2 In Hive 0.12, ORC introduced Run Length Encoding version 2 (RLEv2), which has improved compression and fixed bit width encodings for faster expansion. RLEv2 uses four sub-encodings based on the data: * Short Repeat - used for short sequences with repeated values * Direct - used for random sequences with a fixed bit width * Patched Base - used for random sequences with a variable bit width * Delta - used for monotonically increasing or decreasing sequences ### Short Repeat The short repeat encoding is used for short repeating integer sequences with the goal of minimizing the overhead of the header. All of the bits listed in the header are from the first byte to the last and from most significant bit to least significant bit. If the type is signed, the value is zigzag encoded. * 1 byte header * 2 bits for encoding type (0) * 3 bits for width (W) of repeating value (1 to 8 bytes) * 3 bits for repeat count (3 to 10 values) * W bytes in big endian format, which is zigzag encoded if they type is signed The unsigned sequence of [10000, 10000, 10000, 10000, 10000] would be serialized with short repeat encoding (0), a width of 2 bytes (1), and repeat count of 5 (2) as [0x0a, 0x27, 0x10]. ### Direct The direct encoding is used for integer sequences whose values have a relatively constant bit width. It encodes the values directly using a fixed width big endian encoding. The width of the values is encoded using the table below. The 5 bit width encoding table for RLEv2: Width in Bits | Encoded Value | Notes :------------ | :------------ | :---- 0 | 0 | for delta encoding 1 | 0 | for non-delta encoding 2 | 1 4 | 3 8 | 7 16 | 15 24 | 23 32 | 27 40 | 28 48 | 29 56 | 30 64 | 31 3 | 2 | deprecated 5 <= x <= 7 | x - 1 | deprecated 9 <= x <= 15 | x - 1 | deprecated 17 <= x <= 21 | x - 1 | deprecated 26 | 24 | deprecated 28 | 25 | deprecated 30 | 26 | deprecated * 2 bytes header * 2 bits for encoding type (1) * 5 bits for encoded width (W) of values (1 to 64 bits) using the 5 bit width encoding table * 9 bits for length (L) (1 to 512 values) * W * L bits (padded to the next byte) encoded in big endian format, which is zigzag encoding if the type is signed The unsigned sequence of [23713, 43806, 57005, 48879] would be serialized with direct encoding (1), a width of 16 bits (15), and length of 4 (3) as [0x5e, 0x03, 0x5c, 0xa1, 0xab, 0x1e, 0xde, 0xad, 0xbe, 0xef]. > Note: the run length(4) is one-off. We can get 4 by adding 1 to 3 (See [Hive-4123](https://github.com/apache/hive/commit/69deabeaac020ba60b0f2156579f53e9fe46157a#diff-c00fea1863eaf0d6f047535e874274199020ffed3eb00deb897f513aa86f6b59R232-R236)) ![Direct](./img/Direct.png) ### Patched Base The patched base encoding is used for integer sequences whose bit widths varies a lot. The minimum signed value of the sequence is found and subtracted from the other values. The bit width of those adjusted values is analyzed and the 90 percentile of the bit width is chosen as W. The 10\% of values larger than W use patches from a patch list to set the additional bits. Patches are encoded as a list of gaps in the index values and the additional value bits. * 4 bytes header * 2 bits for encoding type (2) * 5 bits for encoded width (W) of values (1 to 64 bits) using the 5 bit width encoding table * 9 bits for length (L) (1 to 512 values) * 3 bits for base value width (BW) (1 to 8 bytes) * 5 bits for patch width (PW) (1 to 64 bits) using the 5 bit width encoding table * 3 bits for patch gap width (PGW) (1 to 8 bits) * 5 bits for patch list length (PLL) (0 to 31 patches) * Base value (BW bytes) - The base value is stored as a big endian value with negative values marked by the most significant bit set. If it that bit is set, the entire value is negated. * Data values (W * L bits padded to the byte) - A sequence of W bit positive values that are added to the base value. * Patch list (PLL * (PGW + PW) bytes) - A list of patches for values that didn't fit within W bits. Each entry in the list consists of a gap, which is the number of elements skipped from the previous patch, and a patch value. Patches are applied by logically or'ing the data values with the relevant patch shifted W bits left. If a patch is 0, it was introduced to skip over more than 255 items. The combined length of each patch (PGW + PW) must be less or equal to 64. The unsigned sequence of [2030, 2000, 2020, 1000000, 2040, 2050, 2060, 2070, 2080, 2090, 2100, 2110, 2120, 2130, 2140, 2150, 2160, 2170, 2180, 2190] has a minimum of 2000, which makes the adjusted sequence [30, 0, 20, 998000, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190]. It has an encoding of patched base (2), a bit width of 8 (7), a length of 20 (19), a base value width of 2 bytes (1), a patch width of 12 bits (11), patch gap width of 2 bits (1), and a patch list length of 1 (1). The base value is 2000 and the combined result is [0x8e, 0x13, 0x2b, 0x21, 0x07, 0xd0, 0x1e, 0x00, 0x14, 0x70, 0x28, 0x32, 0x3c, 0x46, 0x50, 0x5a, 0x64, 0x6e, 0x78, 0x82, 0x8c, 0x96, 0xa0, 0xaa, 0xb4, 0xbe, 0xfc, 0xe8] ### Delta The Delta encoding is used for monotonically increasing or decreasing sequences. The first two numbers in the sequence can not be identical, because the encoding is using the sign of the first delta to determine if the series is increasing or decreasing. * 2 bytes header * 2 bits for encoding type (3) * 5 bits for encoded width (W) of deltas (0 to 64 bits) using the 5 bit width encoding table * 9 bits for run length (L) (1 to 512 values) * Base value - encoded as (signed or unsigned) varint * Delta base - encoded as signed varint * Delta values (W * (L - 2)) bytes - encode each delta after the first one. If the delta base is positive, the sequence is increasing and if it is negative the sequence is decreasing. The unsigned sequence of [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] would be serialized with delta encoding (3), a width of 4 bits (3), length of 10 (9), a base of 2 (2), and first delta of 1 (2). The resulting sequence is [0xc6, 0x09, 0x02, 0x02, 0x22, 0x42, 0x42, 0x46]. # Stripes The body of ORC files consists of a series of stripes. Stripes are large (typically ~200MB) and independent of each other and are often processed by different tasks. The defining characteristic for columnar storage formats is that the data for each column is stored separately and that reading data out of the file should be proportional to the number of columns read. In ORC files, each column is stored in several streams that are stored next to each other in the file. For example, an integer column is represented as two streams PRESENT, which uses one with a bit per value recording if the value is non-null, and DATA, which records the non-null values. If all of a column's values in a stripe are non-null, the PRESENT stream is omitted from the stripe. For binary data, ORC uses three streams PRESENT, DATA, and LENGTH, which stores the length of each value. The details of each type will be presented in the following subsections. The layout of each stripe looks like: * index streams * unencrypted * encryption variant 1..N * data streams * unencrypted * encryption variant 1..N * stripe footer There is a general order for index and data streams: * Index streams are always placed together in the beginning of the stripe. * Data streams are placed together after index streams (if any). * Inside index streams or data streams, the unencrypted streams should be placed first and then followed by streams grouped by each encryption variant. There is no fixed order within each unencrypted or encryption variant in the index and data streams: * Different stream kinds of the same column can be placed in any order. * Streams from different columns can even be placed in any order. To get the precise information (a.k.a stream kind, column id and location) of a stream within a stripe, the streams field in the StripeFooter described below is the single source of truth. In the example of the integer column mentioned above, the order of the PRESENT stream and the DATA stream cannot be determined in advance. We need to get the precise information by **StripeFooter**. ## Stripe Footer The stripe footer contains the encoding of each column and the directory of the streams including their location. ``` message StripeFooter { // the location of each stream repeated Stream streams = 1; // the encoding of each column repeated ColumnEncoding columns = 2; optional string writerTimezone = 3; // one for each column encryption variant repeated StripeEncryptionVariant encryption = 4; } ``` If the file includes encrypted columns, those streams and column encodings are stored separately in a StripeEncryptionVariant per an encryption variant. Additionally, the StripeFooter will contain two additional virtual streams ENCRYPTED_INDEX and ENCRYPTED_DATA that allocate the space that is used by the encryption variants to store the encrypted index and data streams. ``` message StripeEncryptionVariant { repeated Stream streams = 1; repeated ColumnEncoding encoding = 2; } ``` To describe each stream, ORC stores the kind of stream, the column id, and the stream's size in bytes. The details of what is stored in each stream depends on the type and encoding of the column. ``` message Stream { enum Kind { // boolean stream of whether the next value is non-null PRESENT = 0; // the primary data stream DATA = 1; // the length of each value for variable length data LENGTH = 2; // the dictionary blob DICTIONARY_DATA = 3; // deprecated prior to Hive 0.11 // It was used to store the number of instances of each value in the // dictionary DICTIONARY_COUNT = 4; // a secondary data stream SECONDARY = 5; // the index for seeking to particular row groups ROW_INDEX = 6; // original bloom filters used before ORC-101 BLOOM_FILTER = 7; // bloom filters that consistently use utf8 BLOOM_FILTER_UTF8 = 8; // Virtual stream kinds to allocate space for encrypted index and data. ENCRYPTED_INDEX = 9; ENCRYPTED_DATA = 10; // stripe statistics streams STRIPE_STATISTICS = 100; // A virtual stream kind that is used for setting the encryption IV. FILE_STATISTICS = 101; } required Kind kind = 1; // the column id optional uint32 column = 2; // the number of bytes in the file optional uint64 length = 3; } ``` Depending on their type several options for encoding are possible. The encodings are divided into direct or dictionary-based categories and further refined as to whether they use RLE v1 or v2. ``` message ColumnEncoding { enum Kind { // the encoding is mapped directly to the stream using RLE v1 DIRECT = 0; // the encoding uses a dictionary of unique values using RLE v1 DICTIONARY = 1; // the encoding is direct using RLE v2 DIRECT_V2 = 2; // the encoding is dictionary-based using RLE v2 DICTIONARY_V2 = 3; } required Kind kind = 1; // for dictionary encodings, record the size of the dictionary optional uint32 dictionarySize = 2; } ``` # Column Encodings ## SmallInt, Int, and BigInt Columns All of the 16, 32, and 64 bit integer column types use the same set of potential encodings, which is basically whether they use RLE v1 or v2. If the PRESENT stream is not included, all of the values are present. For values that have false bits in the present stream, no values are included in the data stream. Encoding | Stream Kind | Optional | Contents :-------- | :---------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v2 > Note that the order of the Stream is not fixed. It also applies to other Column types. ## Float and Double Columns Floating point types are stored using IEEE 754 floating point bit layout. Float columns use 4 bytes per value and double columns use 8 bytes. Encoding | Stream Kind | Optional | Contents :-------- | :---------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | IEEE 754 floating point representation ## String, Char, and VarChar Columns String, char, and varchar columns may be encoded either using a dictionary encoding or a direct encoding. A direct encoding should be preferred when there are many distinct values. In all of the encodings, the PRESENT stream encodes whether the value is null. The Java ORC writer automatically picks the encoding after the first row group (10,000 rows). For direct encoding the UTF-8 bytes are saved in the DATA stream and the length of each value is written into the LENGTH stream. In direct encoding, if the values were ["Nevada", "California"]; the DATA would be "NevadaCalifornia" and the LENGTH would be [6, 10]. For dictionary encodings the dictionary is sorted (in lexicographical order of bytes in the UTF-8 encodings) and UTF-8 bytes of each unique value are placed into DICTIONARY_DATA. The length of each item in the dictionary is put into the LENGTH stream. The DATA stream consists of the sequence of references to the dictionary elements. In dictionary encoding, if the values were ["Nevada", "California", "Nevada", "California", and "Florida"]; the DICTIONARY_DATA would be "CaliforniaFloridaNevada" and LENGTH would be [10, 7, 6]. The DATA would be [2, 0, 2, 0, 1]. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v1 DICTIONARY | PRESENT | Yes | Boolean RLE | DATA | No | Unsigned Integer RLE v1 | DICTIONARY_DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v2 DICTIONARY_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Unsigned Integer RLE v2 | DICTIONARY_DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v2 ## Boolean Columns Boolean columns are rare, but have a simple encoding. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Boolean RLE ## TinyInt Columns TinyInt (byte) columns use byte run length encoding. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Byte RLE ## Binary Columns Binary data is encoded with a PRESENT stream, a DATA stream that records the contents, and a LENGTH stream that records the number of bytes per a value. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v2 ## Decimal Columns Decimal was introduced in Hive 0.11 with infinite precision (the total number of digits). In Hive 0.13, the definition was change to limit the precision to a maximum of 38 digits, which conveniently uses 127 bits plus a sign bit. The current encoding of decimal columns stores the integer representation of the value as an unbounded length zigzag encoded base 128 varint. The scale is stored in the SECONDARY stream as a signed integer. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Unbounded base 128 varints | SECONDARY | No | Signed Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Unbounded base 128 varints | SECONDARY | No | Signed Integer RLE v2 ## Date Columns Date data is encoded with a PRESENT stream, a DATA stream that records the number of days after January 1, 1970 in UTC. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v2 ## Timestamp Columns Timestamp records times down to nanoseconds as a PRESENT stream that records non-null values, a DATA stream that records the number of seconds after 1 January 2015, and a SECONDARY stream that records the number of nanoseconds. Because the number of nanoseconds often has a large number of trailing zeros, the number has trailing decimal zero digits removed and the last three bits are used to record how many zeros were removed. if the trailing zeros are more than 2. Thus 1000 nanoseconds would be serialized as 0x0a and 100000 would be serialized as 0x0c. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v1 | SECONDARY | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v2 | SECONDARY | No | Unsigned Integer RLE v2 ## Struct Columns Structs have no data themselves and delegate everything to their child columns except for their PRESENT stream. They have a child column for each of the fields. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE ## List Columns Lists are encoded as the PRESENT stream and a length stream with number of items in each list. They have a single child column for the element values. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v2 ## Map Columns Maps are encoded as the PRESENT stream and a length stream with number of items in each map. They have a child column for the key and another child column for the value. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v2 ## Union Columns Unions are encoded as the PRESENT stream and a tag stream that controls which potential variant is used. They have a child column for each variant of the union. Currently ORC union types are limited to 256 variants, which matches the Hive type model. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DIRECT | No | Byte RLE # Indexes ## Row Group Index The row group indexes consist of a ROW_INDEX stream for each primitive column that has an entry for each row group. Row groups are controlled by the writer and default to 10,000 rows. Each RowIndexEntry gives the position of each stream for the column and the statistics for that row group. The index streams are placed at the front of the stripe, because in the default case of streaming they do not need to be read. They are only loaded when either predicate push down is being used or the reader seeks to a particular row. ``` message RowIndexEntry { repeated uint64 positions = 1 [packed=true]; optional ColumnStatistics statistics = 2; } ``` ``` message RowIndex { repeated RowIndexEntry entry = 1; } ``` To record positions, each stream needs a sequence of numbers. For uncompressed streams, the position is the byte offset of the RLE run's start location followed by the number of values that need to be consumed from the run. In compressed streams, the first number is the start of the compression chunk in the stream, followed by the number of decompressed bytes that need to be consumed, and finally the number of values consumed in the RLE. For columns with multiple streams, the sequences of positions in each stream are concatenated. That was an unfortunate decision on my part that we should fix at some point, because it makes code that uses the indexes error-prone. Because dictionaries are accessed randomly, there is not a position to record for the dictionary and the entire dictionary must be read even if only part of a stripe is being read. Note that for columns with multiple streams, the order of stream positions in the RowIndex is **fixed**, which may be different to the actual data stream placement, and it is the same as [Column Encodings](#column-encoding-section) section we described above. ## Bloom Filter Index Bloom Filters are added to ORC indexes from Hive 1.2.0 onwards. Predicate pushdown can make use of bloom filters to better prune the row groups that do not satisfy the filter condition. The bloom filter indexes consist of a BLOOM_FILTER stream for each column specified through 'orc.bloom.filter.columns' table properties. A BLOOM_FILTER stream records a bloom filter entry for each row group (default to 10,000 rows) in a column. Only the row groups that satisfy min/max row index evaluation will be evaluated against the bloom filter index. Each bloom filter entry stores the number of hash functions ('k') used and the bitset backing the bloom filter. The original encoding (pre ORC-101) of bloom filters used the bitset field encoded as a repeating sequence of longs in the bitset field with a little endian encoding (0x1 is bit 0 and 0x2 is bit 1.) After ORC-101, the encoding is a sequence of bytes with a little endian encoding in the utf8bitset field. ``` message BloomFilter { optional uint32 numHashFunctions = 1; repeated fixed64 bitset = 2; optional bytes utf8bitset = 3; } ``` ``` message BloomFilterIndex { repeated BloomFilter bloomFilter = 1; } ``` Bloom filter internally uses two different hash functions to map a key to a position in the bit set. For tinyint, smallint, int, bigint, float and double types, Thomas Wang's 64-bit integer hash function is used. Doubles are converted to IEEE-754 64 bit representation (using Java's Double.doubleToLongBits(double)). Floats are as converted to double (using Java's float to double cast). All these primitive types are cast to long base type before being passed on to the hash function. For strings and binary types, Murmur3 64 bit hash algorithm is used. The 64 bit variant of Murmur3 considers only the most significant 8 bytes of Murmur3 128-bit algorithm. The 64 bit hashcode generated from the above algorithms is used as a base to derive 'k' different hash functions. We use the idea mentioned in the paper "Less Hashing, Same Performance: Building a Better Bloom Filter" by Kirsch et. al. to quickly compute the k hashcodes. The algorithm for computing k hashcodes and setting the bit position in a bloom filter is as follows: 1. Get 64 bit base hash code from Murmur3 or Thomas Wang's hash algorithm. 2. Split the above hashcode into two 32-bit hashcodes (say hash1 and hash2). 3. k'th hashcode is obtained by (where k > 0): * combinedHash = hash1 + (k * hash2) 4. If combinedHash is negative flip all the bits: * combinedHash = ~combinedHash 5. Bit set position is obtained by performing modulo with m: * position = combinedHash % m 6. Set the position in bit set. The LSB 6 bits identifies the long index within bitset and bit position within the long uses little endian order. * bitset[position >>> 6] \|= (1L << position); Bloom filter streams are interlaced with row group indexes. This placement makes it convenient to read the bloom filter stream and row index stream together in single read operation. ![bloom filter](./img/BloomFilter.png) orc-format-1.1.0/specification/img/000755 000765 000024 00000000000 14777360722 020155 5ustar00dongjoonstaff000000 000000 orc-format-1.1.0/specification/index.md000644 000765 000024 00000001067 14777360722 021036 0ustar00dongjoonstaff000000 000000 --- layout: page title: ORC Specification --- There have been two released ORC file versions: * [ORC v0](ORCv0.md) was released in Hive 0.11. * [ORC v1](ORCv1.md) was released in Hive 0.12 and ORC 1.x. Each version of the library will detect the format version and use the appropriate reader. The library can also write the older versions of the file format to ensure that users can write files that all of their clusters can read correctly. We are working on a new version of the file format: * [ORC v2](ORCv2.md) is a work in progress and is rapidly evolving. orc-format-1.1.0/specification/ORCv2.md000644 000765 000024 00000162504 14777360722 020626 0ustar00dongjoonstaff000000 000000 --- layout: page title: Evolving Draft for ORC Specification v2 --- This specification is rapidly evolving and should only be used for developers on the project. # TO DO items The list of things that we plan to change: * Move decimal encoding to RLEv3 and remove variable length encoding. * Create a better float/double encoding that splits mantissa and exponent. * Create a dictionary encoding for float, double, and decimal. * Create RLEv3: * 64 and 128 bit variants * Zero suppression * Evaluate the rle subformats * Group stripe data into stripelets to enable Async IO for reads. * Reorder stripe data into (stripe metadata, index, dictionary, data) * Stop sorting dictionaries and record the sort order separately in the index. * Remove use of RLEv1 and RLEv2. * Remove non-utf8 bloom filter. * Use numeric value for decimal statistics and bloom filter. * Add Zstd with dictionary. # Motivation Hive's RCFile was the standard format for storing tabular data in Hadoop for several years. However, RCFile has limitations because it treats each column as a binary blob without semantics. In Hive 0.11 we added a new file format named Optimized Row Columnar (ORC) file that uses and retains the type information from the table definition. ORC uses type specific readers and writers that provide light weight compression techniques such as dictionary encoding, bit packing, delta encoding, and run length encoding -- resulting in dramatically smaller files. Additionally, ORC can apply generic compression using zlib, or Snappy on top of the lightweight compression for even smaller files. However, storage savings are only part of the gain. ORC supports projection, which selects subsets of the columns for reading, so that queries reading only one column read only the required bytes. Furthermore, ORC files include light weight indexes that include the minimum and maximum values for each column in each set of 10,000 rows and the entire file. Using pushdown filters from Hive, the file reader can skip entire sets of rows that aren't important for this query. ![ORC file structure](./img/OrcFileLayout.png) # File Tail Since HDFS does not support changing the data in a file after it is written, ORC stores the top level index at the end of the file. The overall structure of the file is given in the figure above. The file's tail consists of 3 parts; the file metadata, file footer and postscript. The metadata for ORC is stored using [Protocol Buffers](https://s.apache.org/protobuf_encoding), which provides the ability to add new fields without breaking readers. This document incorporates the Protobuf definition from the [ORC source code](../src/main/proto/orc/proto/orc_proto.proto) and the reader is encouraged to review the Protobuf encoding if they need to understand the byte-level encoding The sections of the file tail are (and their protobuf message type): * encrypted stripe statistics: list of ColumnarStripeStatistics * stripe statistics: Metadata * footer: Footer * postscript: PostScript * psLen: byte ## Postscript The Postscript section provides the necessary information to interpret the rest of the file including the length of the file's Footer and Metadata sections, the version of the file, and the kind of general compression used (eg. none, zlib, or snappy). The Postscript is never compressed and ends one byte before the end of the file. The version stored in the Postscript is the lowest version of Hive that is guaranteed to be able to read the file and it stored as a sequence of the major and minor version. This file version is encoded as [0,12]. The process of reading an ORC file works backwards through the file. Rather than making multiple short reads, the ORC reader reads the last 16k bytes of the file with the hope that it will contain both the Footer and Postscript sections. The final byte of the file contains the serialized length of the Postscript, which must be less than 256 bytes. Once the Postscript is parsed, the compressed serialized length of the Footer is known and it can be decompressed and parsed. ``` message PostScript { // the length of the footer section in bytes optional uint64 footerLength = 1; // the kind of generic compression used optional CompressionKind compression = 2; // the maximum size of each compression chunk optional uint64 compressionBlockSize = 3; // the version of the writer repeated uint32 version = 4 [packed = true]; // the length of the metadata section in bytes optional uint64 metadataLength = 5; // the fixed string "ORC" optional string magic = 8000; } ``` ``` enum CompressionKind { NONE = 0; ZLIB = 1; SNAPPY = 2; LZO = 3; LZ4 = 4; ZSTD = 5; } ``` ## Footer The Footer section contains the layout of the body of the file, the type schema information, the number of rows, and the statistics about each of the columns. The file is broken in to three parts- Header, Body, and Tail. The Header consists of the bytes "ORC'' to support tools that want to scan the front of the file to determine the type of the file. The Body contains the rows and indexes, and the Tail gives the file level information as described in this section. ``` message Footer { // the length of the file header in bytes (always 3) optional uint64 headerLength = 1; // the length of the file header and body in bytes optional uint64 contentLength = 2; // the information about the stripes repeated StripeInformation stripes = 3; // the schema information repeated Type types = 4; // the user metadata that was added repeated UserMetadataItem metadata = 5; // the total number of rows in the file optional uint64 numberOfRows = 6; // the statistics of each column across the file repeated ColumnStatistics statistics = 7; // the maximum number of rows in each index entry optional uint32 rowIndexStride = 8; // Each implementation that writes ORC files should register for a code // 0 = ORC Java // 1 = ORC C++ // 2 = Presto // 3 = Scritchley Go from https://github.com/scritchley/orc // 4 = Trino optional uint32 writer = 9; // information about the encryption in this file optional Encryption encryption = 10; // the number of bytes in the encrypted stripe statistics optional uint64 stripeStatisticsLength = 11; } ``` ### Stripe Information The body of the file is divided into stripes. Each stripe is self contained and may be read using only its own bytes combined with the file's Footer and Postscript. Each stripe contains only entire rows so that rows never straddle stripe boundaries. Stripes have three sections: a set of indexes for the rows within the stripe, the data itself, and a stripe footer. Both the indexes and the data sections are divided by columns so that only the data for the required columns needs to be read. The encryptStripeId and encryptedLocalKeys support column encryption. They are set on the first stripe of each ORC file with column encryption and not set after that. For a stripe with the values set, the reader should use those values for that stripe. Subsequent stripes use the previous encryptStripeId + 1 and the same keys. The current ORC merging code merges entire files, and thus the reader will get the correct values on what was the first stripe and continue on. If we develop a merge tool that reorders stripes or does partial merges, these values will need to be set correctly by that tool. ``` message StripeInformation { // the start of the stripe within the file optional uint64 offset = 1; // the length of the indexes in bytes optional uint64 indexLength = 2; // the length of the data in bytes optional uint64 dataLength = 3; // the length of the footer in bytes optional uint64 footerLength = 4; // the number of rows in the stripe optional uint64 numberOfRows = 5; // If this is present, the reader should use this value for the encryption // stripe id for setting the encryption IV. Otherwise, the reader should // use one larger than the previous stripe's encryptStripeId. // For unmerged ORC files, the first stripe will use 1 and the rest of the // stripes won't have it set. For merged files, the stripe information // will be copied from their original files and thus the first stripe of // each of the input files will reset it to 1. // Note that 1 was choosen, because protobuf v3 doesn't serialize // primitive types that are the default (eg. 0). optional uint64 encryptStripeId = 6; // For each encryption variant, the new encrypted local key to use until we // find a replacement. repeated bytes encryptedLocalKeys = 7; } ``` ### Type Information All of the rows in an ORC file must have the same schema. Logically the schema is expressed as a tree as in the figure below, where the compound types have subcolumns under them. ![ORC column structure](./img/TreeWriters.png) The equivalent Hive DDL would be: ``` create table Foobar ( myInt int, myMap map>, myTime timestamp ); ``` The type tree is flattened in to a list via a pre-order traversal where each type is assigned the next id. Clearly the root of the type tree is always type id 0. Compound types have a field named subtypes that contains the list of their children's type ids. ``` message Type { enum Kind { BOOLEAN = 0; BYTE = 1; SHORT = 2; INT = 3; LONG = 4; FLOAT = 5; DOUBLE = 6; STRING = 7; BINARY = 8; TIMESTAMP = 9; LIST = 10; MAP = 11; STRUCT = 12; UNION = 13; DECIMAL = 14; DATE = 15; VARCHAR = 16; CHAR = 17; TIMESTAMP_INSTANT = 18; GEOMETRY = 19; GEOGRAPHY = 20; } // the kind of this type required Kind kind = 1; // the type ids of any subcolumns for list, map, struct, or union repeated uint32 subtypes = 2 [packed=true]; // the list of field names for struct repeated string fieldNames = 3; // the maximum length of the type for varchar or char in UTF-8 characters optional uint32 maximumLength = 4; // the precision and scale for decimal optional uint32 precision = 5; optional uint32 scale = 6; repeated StringPair attributes = 7; // the attributes associated with the geometry type optional GeometryType geometry = 8; // Coordinate Reference System (CRS) for Geometry and Geography types optional string crs = 8; // Edge interpolation algorithm for Geography type enum EdgeInterpolationAlgorithm { SPHERICAL = 0; VINCENTY = 1; THOMAS = 2; ANDOYER = 3; KARNEY = 4; } optional EdgeInterpolationAlgorithm algorithm = 9; } ``` #### Geometry & Geography Types ##### Background The Geometry and Geography class hierarchy and its Well-Known Text (WKT) and Well-Known Binary (WKB) serializations (ISO variant supporting XY, XYZ, XYM, XYZM) are defined by [OpenGIS Implementation Specification for Geographic information - Simple feature access - Part 1: Common architecture][sfa-part1], from [OGC(Open Geospatial Consortium)][ogc]. The version of the OGC standard first used here is 1.2.1, but future versions may also be used if the WKB representation remains wire-compatible. [sfa-part1]: https://portal.ogc.org/files/?artifact_id=25355 [ogc]: https://www.ogc.org/standard/sfa/ ###### Coordinate Reference System Coordinate Reference System (CRS) is a mapping of how coordinates refer to locations on Earth. The default CRS `OGC:CRS84` means that the geospatial features must be stored in the order of longitude/latitude based on the WGS84 datum. Custom CRS can be specified by a string value. It is recommended to use an identifier-based approach like [Spatial reference identifier][srid]. For geographic CRS, longitudes are bound by [-180, 180] and latitudes are bound by [-90, 90]. [srid]: https://en.wikipedia.org/wiki/Spatial_reference_system#Identifier ###### Edge Interpolation Algorithm An algorithm for interpolating edges, and is one of the following values: * `spherical`: edges are interpolated as geodesics on a sphere. * `vincenty`: [https://en.wikipedia.org/wiki/Vincenty%27s_formulae](https://en.wikipedia.org/wiki/Vincenty%27s_formulae) * `thomas`: Thomas, Paul D. Spheroidal geodesics, reference systems, & local geometry. US Naval Oceanographic Office, 1970. * `andoyer`: Thomas, Paul D. Mathematical models for navigation systems. US Naval Oceanographic Office, 1965. * `karney`: [Karney, Charles FF. "Algorithms for geodesics." Journal of Geodesy 87 (2013): 43-55](https://link.springer.com/content/pdf/10.1007/s00190-012-0578-z.pdf), and [GeographicLib](https://geographiclib.sourceforge.io/) ###### CRS Customization CRS is represented as a string value. Writer and reader implementations are responsible for serializing and deserializing the CRS, respectively. As a convention to maximize the interoperability, custom CRS values can be specified by a string of the format `type:identifier`, where `type` is one of the following values: * `srid`: [Spatial reference identifier](https://en.wikipedia.org/wiki/Spatial_reference_system#Identifier), `identifier` is the SRID itself. * `projjson`: [PROJJSON](https://proj.org/en/stable/specifications/projjson.html), `identifier` is the name of a table property or a file property where the projjson string is stored. ###### Coordinate Axis Order The axis order of the coordinates in WKB and bounding box stored here follows the de facto standard for axis order in WKB and is therefore always (x, y) where x is easting or longitude and y is northing or latitude. This ordering explicitly overrides the axis order as specified in the CRS. ### Column Statistics The goal of the column statistics is that for each column, the writer records the count and depending on the type other useful fields. For most of the primitive types, it records the minimum and maximum values; and for numeric types it additionally stores the sum. From Hive 1.1.0 onwards, the column statistics will also record if there are any null values within the row group by setting the hasNull flag. The hasNull flag is used by ORC's predicate pushdown to better answer 'IS NULL' queries. ``` message ColumnStatistics { // the number of values optional uint64 numberOfValues = 1; // At most one of these has a value for any column optional IntegerStatistics intStatistics = 2; optional DoubleStatistics doubleStatistics = 3; optional StringStatistics stringStatistics = 4; optional BucketStatistics bucketStatistics = 5; optional DecimalStatistics decimalStatistics = 6; optional DateStatistics dateStatistics = 7; optional BinaryStatistics binaryStatistics = 8; optional TimestampStatistics timestampStatistics = 9; optional bool hasNull = 10; optional uint64 bytes_on_disk = 11; optional CollectionStatistics collection_statistics = 12; optional GeospatialStatistics geospatial_statistics = 13; } ``` For integer types (tinyint, smallint, int, bigint), the column statistics includes the minimum, maximum, and sum. If the sum overflows long at any point during the calculation, no sum is recorded. ``` message IntegerStatistics { optional sint64 minimum = 1; optional sint64 maximum = 2; optional sint64 sum = 3; } ``` For floating point types (float, double), the column statistics include the minimum, maximum, and sum. If the sum overflows a double, no sum is recorded. ``` message DoubleStatistics { optional double minimum = 1; optional double maximum = 2; optional double sum = 3; } ``` For strings, the minimum value, maximum value, and the sum of the lengths of the values are recorded. ``` message StringStatistics { optional string minimum = 1; optional string maximum = 2; // sum will store the total length of all strings optional sint64 sum = 3; } ``` For booleans, the statistics include the count of false and true values. ``` message BucketStatistics { repeated uint64 count = 1 [packed=true]; } ``` For decimals, the minimum, maximum, and sum are stored. ``` message DecimalStatistics { optional string minimum = 1; optional string maximum = 2; optional string sum = 3; } ``` Date columns record the minimum and maximum values as the number of days since the UNIX epoch (1/1/1970 in UTC). ``` message DateStatistics { // min,max values saved as days since epoch optional sint32 minimum = 1; optional sint32 maximum = 2; } ``` Timestamp columns record the minimum and maximum values as the number of milliseconds since the UNIX epoch (1/1/1970 00:00:00). The timestamp is adjusted to UTC before being converted to milliseconds and stored in `minimumUtc` and `maximumUtc`. ``` message TimestampStatistics { // min,max values saved as milliseconds since epoch optional sint64 minimum = 1; optional sint64 maximum = 2; // min,max values saved as milliseconds since UNIX epoch optional sint64 minimumUtc = 3; optional sint64 maximumUtc = 4; } ``` Binary columns store the aggregate number of bytes across all of the values. ``` message BinaryStatistics { // sum will store the total binary blob length optional sint64 sum = 1; } ``` Geometry and Geography columns store optional bounding boxes and list of geospatial type codes from all values. **Bounding Box** A geospatial instance has at least two coordinate dimensions: X and Y for 2D coordinates of each point. Please note that X is longitude/easting and Y is latitude/northing. A geospatial instance can optionally have Z and/or M values associated with each point. The Z values introduce the third dimension coordinate. Usually they are used to indicate the height, or elevation. M values are an opportunity for a geospatial instance to express a fourth dimension as a coordinate value. These values can be used as a linear reference value (e.g., highway milepost value), a timestamp, or some other value as defined by the CRS. Bounding box is defined as the thrift struct below in the representation of min/max value pair of coordinates from each axis. Note that X and Y Values are always present. Z and M are omitted for 2D geospatial instances. For the X values only, xmin may be greater than xmax. In this case, an object in this bounding box may match if it contains an X such that `x >= xmin` OR `x <= xmax`. This wraparound occurs only when the corresponding bounding box crosses the antimeridian line. In geographic terminology, the concepts of `xmin`, `xmax`, `ymin`, and `ymax` are also known as `westernmost`, `easternmost`, `southernmost` and `northernmost`, respectively. For Geography type, X and Y values are restricted to the canonical ranges of [-180, 180] for X and [-90, 90] for Y. **Geospatial Types** A list of geospatial types from all instances in the Geometry or Geography column, or an empty list if they are not known. This is borrowed from [geometry_types of GeoParquet][geometry-types] except that values in the list are [WKB (ISO-variant) integer codes][wkb-integer-code]. Table below shows the most common geospatial types and their codes: | Type | XY | XYZ | XYM | XYZM | | :----------------- | :--- | :--- | :--- | :--: | | Point | 0001 | 1001 | 2001 | 3001 | | LineString | 0002 | 1002 | 2002 | 3002 | | Polygon | 0003 | 1003 | 2003 | 3003 | | MultiPoint | 0004 | 1004 | 2004 | 3004 | | MultiLineString | 0005 | 1005 | 2005 | 3005 | | MultiPolygon | 0006 | 1006 | 2006 | 3006 | | GeometryCollection | 0007 | 1007 | 2007 | 3007 | In addition, the following rules are applied: - A list of multiple values indicates that multiple geospatial types are present (e.g. `[0003, 0006]`). - An empty array explicitly signals that the geospatial types are not known. - The geospatial types in the list must be unique (e.g. `[0001, 0001]` is not valid). [geometry-types]: https://github.com/opengeospatial/geoparquet/blob/v1.1.0/format-specs/geoparquet.md?plain=1#L159 [wkb-integer-code]: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary ```protobuf // Bounding box for Geometry or Geography type in the representation of min/max // value pair of coordinates from each axis. message BoundingBox { optional double xmin = 1; optional double xmax = 2; optional double ymin = 3; optional double ymax = 4; optional double zmin = 5; optional double zmax = 6; optional double mmin = 7; optional double mmax = 8; } // Statistics specific to Geometry or Geography type message GeospatialStatistics { // A bounding box of geospatial instances optional BoundingBox bbox = 1; // Geospatial type codes of all instances, or an empty list if not known repeated int32 geospatial_types = 2; } ``` ### User Metadata The user can add arbitrary key/value pairs to an ORC file as it is written. The contents of the keys and values are completely application defined, but the key is a string and the value is binary. Care should be taken by applications to make sure that their keys are unique and in general should be prefixed with an organization code. ``` message UserMetadataItem { // the user defined key required string name = 1; // the user defined binary value required bytes value = 2; } ``` ### File Metadata The file Metadata section contains column statistics at the stripe level granularity. These statistics enable input split elimination based on the predicate push-down evaluated per a stripe. ``` message StripeStatistics { repeated ColumnStatistics colStats = 1; } ``` ``` message Metadata { repeated StripeStatistics stripeStats = 1; } ``` # Column Encryption ORC as of Apache ORC 1.6 supports column encryption where the data and statistics of specific columns are encrypted on disk. Column encryption provides fine-grain column level security even when many users have access to the file itself. The encryption is transparent to the user and the writer only needs to define which columns and encryption keys to use. When reading an ORC file, if the user has access to the keys, they will get the real data. If they do not have the keys, they will get the masked data. ``` message Encryption { // all of the masks used in this file repeated DataMask mask = 1; // all of the keys used in this file repeated EncryptionKey key = 2; // The encrypted variants. // Readers should prefer the first variant that the user has access to // the corresponding key. If they don't have access to any of the keys, // they should get the unencrypted masked data. repeated EncryptionVariant variants = 3; // How are the local keys encrypted? optional KeyProviderKind keyProvider = 4; } ``` Each encrypted column in each file will have a random local key generated for it. Thus, even though all of the decryption happens locally in the reader, a malicious user that stores the key only enables access that column in that file. The local keys are encrypted by the Hadoop or Ranger Key Management Server (KMS). The encrypted local keys are stored in the file footer's StripeInformation. ``` enum KeyProviderKind { UNKNOWN = 0; HADOOP = 1; AWS = 2; GCP = 3; AZURE = 4; } ``` When ORC is using the Hadoop or Ranger KMS, it generates a random encrypted local key (16 or 32 bytes for 128 or 256 bit AES respectively). Using the first 16 bytes as the IV, it uses AES/CTR to decrypt the local key. With the AWS KMS, the GenerateDataKey method is used to create a new local key and the Decrypt method is used to decrypt it. ## Data Masks The user's data is statically masked before writing the unencrypted variant. Because the masking was done statically when the file was written, the information about the masking is just informational. The three standard masks are: * nullify - all values become null * redact - replace characters with constants such as X or 9 * sha256 - replace string with the SHA 256 of the value The default is nullify, but masks may be defined by the user. Masks are not allowed to change the type of the column, just the values. ``` message DataMask { // the kind of masking, which may include third party masks optional string name = 1; // parameters for the mask repeated string maskParameters = 2; // the unencrypted column roots this mask was applied to repeated uint32 columns = 3 [packed = true]; } ``` ## Encryption Keys In addition to the encrypted local keys, which are stored in the footer's StripeInformation, the file also needs to describe the master key that was used to encrypt the local keys. The master keys are described by name, their version, and the encryption algorithm. ``` message EncryptionKey { optional string keyName = 1; optional uint32 keyVersion = 2; optional EncryptionAlgorithm algorithm = 3; } ``` The encryption algorithm is stored using an enumeration and since ProtoBuf uses the 0 value as a default, we added an unused value. That ensures that if we add a new algorithm that old readers will get UNKNOWN_ENCRYPTION instead of a real value. ``` enum EncryptionAlgorithm { // used for detecting future algorithms UNKNOWN_ENCRYPTION = 0; // 128 bit AES/CTR AES_CTR_128 = 1; // 256 bit AES/CTR AES_CTR_256 = 2; } ``` ## Encryption Variants Each encrypted column is written as two variants: * encrypted unmasked - for users with access to the key * unencrypted masked - for all other users The changes to the format were done so that old ORC readers will read the masked unencrypted data. Encryption variants encrypt a subtree of columns and use a single local key. The initial version of encryption support only allows the two variants, but this may be extended later and thus readers should use the first variant of a column that the reader has access to. ``` message EncryptionVariant { // the column id of the root column that is encrypted in this variant optional uint32 root = 1; // the key that encrypted this variant optional uint32 key = 2; // The master key that was used to encrypt the local key, referenced as // an index into the Encryption.key list. optional bytes encryptedKey = 3; // the stripe statistics for this variant repeated Stream stripeStatistics = 4; // encrypted file statistics as a FileStatistics optional bytes fileStatistics = 5; } ``` Each variant stores stripe and file statistics separately. The file statistics are serialized as a FileStatistics, compressed, encrypted and stored in the EncryptionVariant.fileStatistics. ``` message FileStatistics { repeated ColumnStatistics column = 1; } ``` The stripe statistics for each column are serialized as ColumnarStripeStatistics, compressed, encrypted and stored in a stream of kind STRIPE_STATISTICS. By making the column stripe statistics independent of each other, the reader only reads and parses the columns contained in the SARG. ``` message ColumnarStripeStatistics { // one value for each stripe in the file repeated ColumnStatistics colStats = 1; } ``` ## Stream Encryption Our encryption is done using AES/CTR. CTR is a mode that has some very nice properties for us: * It is seeded so that identical data is encrypted differently. * It does not require padding the stream to the cipher length. * It allows readers to seek in to a stream. * The IV does not need to be randomly generated. To ensure that we don't reuse IV, we set the IV as: * bytes 0 to 2 - column id * bytes 3 to 4 - stream kind * bytes 5 to 7 - stripe id * bytes 8 to 15 - cipher block counter However, it is critical for CTR that we never reuse an initialization vector (IV) with the same local key. For data in the footer, use the number of stripes in the file as the stripe id. This guarantees when we write an intermediate footer in to a file that we don't use the same IV. Additionally, we never reuse a local key for new data. For example, when merging files, we don't reuse local key from the input files for the new file tail, but always generate a new local key. # Compression If the ORC file writer selects a generic compression codec (zlib or snappy), every part of the ORC file except for the Postscript is compressed with that codec. However, one of the requirements for ORC is that the reader be able to skip over compressed bytes without decompressing the entire stream. To manage this, ORC writes compressed streams in chunks with headers as in the figure below. To handle uncompressable data, if the compressed data is larger than the original, the original is stored and the isOriginal flag is set. Each header is 3 bytes long with (compressedLength * 2 + isOriginal) stored as a little endian value. For example, the header for a chunk that compressed to 100,000 bytes would be [0x40, 0x0d, 0x03]. The header for 5 bytes that did not compress would be [0x0b, 0x00, 0x00]. Each compression chunk is compressed independently so that as long as a decompressor starts at the top of a header, it can start decompressing without the previous bytes. ![compression streams](./img/CompressionStream.png) The default compression chunk size is 256K, but writers can choose their own value. Larger chunks lead to better compression, but require more memory. The chunk size is recorded in the Postscript so that readers can allocate appropriately sized buffers. Readers are guaranteed that no chunk will expand to more than the compression chunk size. ORC files without generic compression write each stream directly with no headers. # Run Length Encoding ## Base 128 Varint Variable width integer encodings take advantage of the fact that most numbers are small and that having smaller encodings for small numbers shrinks the overall size of the data. ORC uses the varint format from Protocol Buffers, which writes data in little endian format using the low 7 bits of each byte. The high bit in each byte is set if the number continues into the next byte. Unsigned Original | Serialized :---------------- | :--------- 0 | 0x00 1 | 0x01 127 | 0x7f 128 | 0x80, 0x01 129 | 0x81, 0x01 16,383 | 0xff, 0x7f 16,384 | 0x80, 0x80, 0x01 16,385 | 0x81, 0x80, 0x01 For signed integer types, the number is converted into an unsigned number using a zigzag encoding. Zigzag encoding moves the sign bit to the least significant bit using the expression (val << 1) ^ (val >> 63) and derives its name from the fact that positive and negative numbers alternate once encoded. The unsigned number is then serialized as above. Signed Original | Unsigned :-------------- | :------- 0 | 0 -1 | 1 1 | 2 -2 | 3 2 | 4 ## Byte Run Length Encoding For byte streams, ORC uses a very light weight encoding of identical values. * Run - a sequence of at least 3 identical values * Literals - a sequence of non-identical values The first byte of each group of values is a header that determines whether it is a run (value between 0 to 127) or literal list (value between -128 to -1). For runs, the control byte is the length of the run minus the length of the minimal run (3) and the control byte for literal lists is the negative length of the list. For example, a hundred 0's is encoded as [0x61, 0x00] and the sequence 0x44, 0x45 would be encoded as [0xfe, 0x44, 0x45]. The next group can choose either of the encodings. ## Boolean Run Length Encoding For encoding boolean types, the bits are put in the bytes from most significant to least significant. The bytes are encoded using byte run length encoding as described in the previous section. For example, the byte sequence [0xff, 0x80] would be one true followed by seven false values. ## Integer Run Length Encoding, version 1 In Hive 0.11 ORC files used Run Length Encoding version 1 (RLEv1), which provides a lightweight compression of signed or unsigned integer sequences. RLEv1 has two sub-encodings: * Run - a sequence of values that differ by a small fixed delta * Literals - a sequence of varint encoded values Runs start with an initial byte of 0x00 to 0x7f, which encodes the length of the run - 3. A second byte provides the fixed delta in the range of -128 to 127. Finally, the first value of the run is encoded as a base 128 varint. For example, if the sequence is 100 instances of 7 the encoding would start with 100 - 3, followed by a delta of 0, and a varint of 7 for an encoding of [0x61, 0x00, 0x07]. To encode the sequence of numbers running from 100 to 1, the first byte is 100 - 3, the delta is -1, and the varint is 100 for an encoding of [0x61, 0xff, 0x64]. Literals start with an initial byte of 0x80 to 0xff, which corresponds to the negative of number of literals in the sequence. Following the header byte, the list of N varints is encoded. Thus, if there are no runs, the overhead is 1 byte for each 128 integers. Numbers [2, 3, 6, 7, 11] would be encoded as [0xfb, 0x02, 0x03, 0x06, 0x07, 0xb]. ## Integer Run Length Encoding, version 2 In Hive 0.12, ORC introduced Run Length Encoding version 2 (RLEv2), which has improved compression and fixed bit width encodings for faster expansion. RLEv2 uses four sub-encodings based on the data: * Short Repeat - used for short sequences with repeated values * Direct - used for random sequences with a fixed bit width * Patched Base - used for random sequences with a variable bit width * Delta - used for monotonically increasing or decreasing sequences ### Short Repeat The short repeat encoding is used for short repeating integer sequences with the goal of minimizing the overhead of the header. All of the bits listed in the header are from the first byte to the last and from most significant bit to least significant bit. If the type is signed, the value is zigzag encoded. * 1 byte header * 2 bits for encoding type (0) * 3 bits for width (W) of repeating value (1 to 8 bytes) * 3 bits for repeat count (3 to 10 values) * W bytes in big endian format, which is zigzag encoded if they type is signed The unsigned sequence of [10000, 10000, 10000, 10000, 10000] would be serialized with short repeat encoding (0), a width of 2 bytes (1), and repeat count of 5 (2) as [0x0a, 0x27, 0x10]. ### Direct The direct encoding is used for integer sequences whose values have a relatively constant bit width. It encodes the values directly using a fixed width big endian encoding. The width of the values is encoded using the table below. The 5 bit width encoding table for RLEv2: Width in Bits | Encoded Value | Notes :------------ | :------------ | :---- 0 | 0 | for delta encoding 1 | 0 | for non-delta encoding 2 | 1 4 | 3 8 | 7 16 | 15 24 | 23 32 | 27 40 | 28 48 | 29 56 | 30 64 | 31 3 | 2 | deprecated 5 <= x <= 7 | x - 1 | deprecated 9 <= x <= 15 | x - 1 | deprecated 17 <= x <= 21 | x - 1 | deprecated 26 | 24 | deprecated 28 | 25 | deprecated 30 | 26 | deprecated * 2 bytes header * 2 bits for encoding type (1) * 5 bits for encoded width (W) of values (1 to 64 bits) using the 5 bit width encoding table * 9 bits for length (L) (1 to 512 values) * W * L bits (padded to the next byte) encoded in big endian format, which is zigzag encoding if the type is signed The unsigned sequence of [23713, 43806, 57005, 48879] would be serialized with direct encoding (1), a width of 16 bits (15), and length of 4 (3) as [0x5e, 0x03, 0x5c, 0xa1, 0xab, 0x1e, 0xde, 0xad, 0xbe, 0xef]. > Note: the run length(4) is one-off. We can get 4 by adding 1 to 3 (See [Hive-4123](https://github.com/apache/hive/commit/69deabeaac020ba60b0f2156579f53e9fe46157a#diff-c00fea1863eaf0d6f047535e874274199020ffed3eb00deb897f513aa86f6b59R232-R236)) ![Direct](./img/Direct.png) ### Patched Base The patched base encoding is used for integer sequences whose bit widths varies a lot. The minimum signed value of the sequence is found and subtracted from the other values. The bit width of those adjusted values is analyzed and the 90 percentile of the bit width is chosen as W. The 10\% of values larger than W use patches from a patch list to set the additional bits. Patches are encoded as a list of gaps in the index values and the additional value bits. * 4 bytes header * 2 bits for encoding type (2) * 5 bits for encoded width (W) of values (1 to 64 bits) using the 5 bit width encoding table * 9 bits for length (L) (1 to 512 values) * 3 bits for base value width (BW) (1 to 8 bytes) * 5 bits for patch width (PW) (1 to 64 bits) using the 5 bit width encoding table * 3 bits for patch gap width (PGW) (1 to 8 bits) * 5 bits for patch list length (PLL) (0 to 31 patches) * Base value (BW bytes) - The base value is stored as a big endian value with negative values marked by the most significant bit set. If it that bit is set, the entire value is negated. * Data values (W * L bits padded to the byte) - A sequence of W bit positive values that are added to the base value. * Patch list (PLL * (PGW + PW) bytes) - A list of patches for values that didn't fit within W bits. Each entry in the list consists of a gap, which is the number of elements skipped from the previous patch, and a patch value. Patches are applied by logically or'ing the data values with the relevant patch shifted W bits left. If a patch is 0, it was introduced to skip over more than 255 items. The combined length of each patch (PGW + PW) must be less or equal to 64. The unsigned sequence of [2030, 2000, 2020, 1000000, 2040, 2050, 2060, 2070, 2080, 2090, 2100, 2110, 2120, 2130, 2140, 2150, 2160, 2170, 2180, 2190] has a minimum of 2000, which makes the adjusted sequence [30, 0, 20, 998000, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190]. It has an encoding of patched base (2), a bit width of 8 (7), a length of 20 (19), a base value width of 2 bytes (1), a patch width of 12 bits (11), patch gap width of 2 bits (1), and a patch list length of 1 (1). The base value is 2000 and the combined result is [0x8e, 0x13, 0x2b, 0x21, 0x07, 0xd0, 0x1e, 0x00, 0x14, 0x70, 0x28, 0x32, 0x3c, 0x46, 0x50, 0x5a, 0x64, 0x6e, 0x78, 0x82, 0x8c, 0x96, 0xa0, 0xaa, 0xb4, 0xbe, 0xfc, 0xe8] ### Delta The Delta encoding is used for monotonically increasing or decreasing sequences. The first two numbers in the sequence can not be identical, because the encoding is using the sign of the first delta to determine if the series is increasing or decreasing. * 2 bytes header * 2 bits for encoding type (3) * 5 bits for encoded width (W) of deltas (0 to 64 bits) using the 5 bit width encoding table * 9 bits for run length (L) (1 to 512 values) * Base value - encoded as (signed or unsigned) varint * Delta base - encoded as signed varint * Delta values (W * (L - 2)) bytes - encode each delta after the first one. If the delta base is positive, the sequence is increasing and if it is negative the sequence is decreasing. The unsigned sequence of [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] would be serialized with delta encoding (3), a width of 4 bits (3), length of 10 (9), a base of 2 (2), and first delta of 1 (2). The resulting sequence is [0xc6, 0x09, 0x02, 0x02, 0x22, 0x42, 0x42, 0x46]. # Stripes The body of ORC files consists of a series of stripes. Stripes are large (typically ~200MB) and independent of each other and are often processed by different tasks. The defining characteristic for columnar storage formats is that the data for each column is stored separately and that reading data out of the file should be proportional to the number of columns read. In ORC files, each column is stored in several streams that are stored next to each other in the file. For example, an integer column is represented as two streams PRESENT, which uses one with a bit per value recording if the value is non-null, and DATA, which records the non-null values. If all of a column's values in a stripe are non-null, the PRESENT stream is omitted from the stripe. For binary data, ORC uses three streams PRESENT, DATA, and LENGTH, which stores the length of each value. The details of each type will be presented in the following subsections. The layout of each stripe looks like: * index streams * unencrypted * encryption variant 1..N * data streams * unencrypted * encryption variant 1..N * stripe footer There is a general order for index and data streams: * Index streams are always placed together in the beginning of the stripe. * Data streams are placed together after index streams (if any). * Inside index streams or data streams, the unencrypted streams should be placed first and then followed by streams grouped by each encryption variant. There is no fixed order within each unencrypted or encryption variant in the index and data streams: * Different stream kinds of the same column can be placed in any order. * Streams from different columns can even be placed in any order. To get the precise information (a.k.a stream kind, column id and location) of a stream within a stripe, the streams field in the StripeFooter described below is the single source of truth. In the example of the integer column mentioned above, the order of the PRESENT stream and the DATA stream cannot be determined in advance. We need to get the precise information by **StripeFooter**. ## Stripe Footer The stripe footer contains the encoding of each column and the directory of the streams including their location. ``` message StripeFooter { // the location of each stream repeated Stream streams = 1; // the encoding of each column repeated ColumnEncoding columns = 2; optional string writerTimezone = 3; // one for each column encryption variant repeated StripeEncryptionVariant encryption = 4; } ``` If the file includes encrypted columns, those streams and column encodings are stored separately in a StripeEncryptionVariant per an encryption variant. Additionally, the StripeFooter will contain two additional virtual streams ENCRYPTED_INDEX and ENCRYPTED_DATA that allocate the space that is used by the encryption variants to store the encrypted index and data streams. ``` message StripeEncryptionVariant { repeated Stream streams = 1; repeated ColumnEncoding encoding = 2; } ``` To describe each stream, ORC stores the kind of stream, the column id, and the stream's size in bytes. The details of what is stored in each stream depends on the type and encoding of the column. ``` message Stream { enum Kind { // boolean stream of whether the next value is non-null PRESENT = 0; // the primary data stream DATA = 1; // the length of each value for variable length data LENGTH = 2; // the dictionary blob DICTIONARY_DATA = 3; // deprecated prior to Hive 0.11 // It was used to store the number of instances of each value in the // dictionary DICTIONARY_COUNT = 4; // a secondary data stream SECONDARY = 5; // the index for seeking to particular row groups ROW_INDEX = 6; // original bloom filters used before ORC-101 BLOOM_FILTER = 7; // bloom filters that consistently use utf8 BLOOM_FILTER_UTF8 = 8; // Virtual stream kinds to allocate space for encrypted index and data. ENCRYPTED_INDEX = 9; ENCRYPTED_DATA = 10; // stripe statistics streams STRIPE_STATISTICS = 100; // A virtual stream kind that is used for setting the encryption IV. FILE_STATISTICS = 101; } required Kind kind = 1; // the column id optional uint32 column = 2; // the number of bytes in the file optional uint64 length = 3; } ``` Depending on their type several options for encoding are possible. The encodings are divided into direct or dictionary-based categories and further refined as to whether they use RLE v1 or v2. ``` message ColumnEncoding { enum Kind { // the encoding is mapped directly to the stream using RLE v1 DIRECT = 0; // the encoding uses a dictionary of unique values using RLE v1 DICTIONARY = 1; // the encoding is direct using RLE v2 DIRECT_V2 = 2; // the encoding is dictionary-based using RLE v2 DICTIONARY_V2 = 3; } required Kind kind = 1; // for dictionary encodings, record the size of the dictionary optional uint32 dictionarySize = 2; } ``` # Column Encodings ## SmallInt, Int, and BigInt Columns All of the 16, 32, and 64 bit integer column types use the same set of potential encodings, which is basically whether they use RLE v1 or v2. If the PRESENT stream is not included, all of the values are present. For values that have false bits in the present stream, no values are included in the data stream. Encoding | Stream Kind | Optional | Contents :-------- | :---------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v2 > Note that the order of the Stream is not fixed. It also applies to other Column types. ## Float and Double Columns Floating point types are stored using IEEE 754 floating point bit layout. Float columns use 4 bytes per value and double columns use 8 bytes. Encoding | Stream Kind | Optional | Contents :-------- | :---------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | IEEE 754 floating point representation ## String, Char, and VarChar Columns String, char, and varchar columns may be encoded either using a dictionary encoding or a direct encoding. A direct encoding should be preferred when there are many distinct values. In all of the encodings, the PRESENT stream encodes whether the value is null. The Java ORC writer automatically picks the encoding after the first row group (10,000 rows). For direct encoding the UTF-8 bytes are saved in the DATA stream and the length of each value is written into the LENGTH stream. In direct encoding, if the values were ["Nevada", "California"]; the DATA would be "NevadaCalifornia" and the LENGTH would be [6, 10]. For dictionary encodings the dictionary is sorted (in lexicographical order of bytes in the UTF-8 encodings) and UTF-8 bytes of each unique value are placed into DICTIONARY_DATA. The length of each item in the dictionary is put into the LENGTH stream. The DATA stream consists of the sequence of references to the dictionary elements. In dictionary encoding, if the values were ["Nevada", "California", "Nevada", "California", and "Florida"]; the DICTIONARY_DATA would be "CaliforniaFloridaNevada" and LENGTH would be [10, 7, 6]. The DATA would be [2, 0, 2, 0, 1]. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v1 DICTIONARY | PRESENT | Yes | Boolean RLE | DATA | No | Unsigned Integer RLE v1 | DICTIONARY_DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v2 DICTIONARY_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Unsigned Integer RLE v2 | DICTIONARY_DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v2 ## Boolean Columns Boolean columns are rare, but have a simple encoding. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Boolean RLE ## TinyInt Columns TinyInt (byte) columns use byte run length encoding. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Byte RLE ## Binary Columns Binary data is encoded with a PRESENT stream, a DATA stream that records the contents, and a LENGTH stream that records the number of bytes per a value. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | String contents | LENGTH | No | Unsigned Integer RLE v2 ## Decimal Columns Since Hive 0.13, all decimals have had fixed precision and scale. The goal is to use RLEv3 for the value and use the fixed scale from the type. As an interim solution, we are using RLE v2 for short decimals (precision <= 18) and the old encoding for long decimals. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v2 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Unbounded base 128 varints | SECONDARY | No | Signed Integer RLE v2 ## Date Columns Date data is encoded with a PRESENT stream, a DATA stream that records the number of days after January 1, 1970 in UTC. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v2 ## Timestamp Columns Timestamp records times down to nanoseconds as a PRESENT stream that records non-null values, a DATA stream that records the number of seconds after 1 January 2015, and a SECONDARY stream that records the number of nanoseconds. Because the number of nanoseconds often has a large number of trailing zeros, the number has trailing decimal zero digits removed and the last three bits are used to record how many zeros were removed. if the trailing zeros are more than 2. Thus 1000 nanoseconds would be serialized as 0x0a and 100000 would be serialized as 0x0c. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v1 | SECONDARY | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Signed Integer RLE v2 | SECONDARY | No | Unsigned Integer RLE v2 ## Struct Columns Structs have no data themselves and delegate everything to their child columns except for their PRESENT stream. They have a child column for each of the fields. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE ## List Columns Lists are encoded as the PRESENT stream and a length stream with number of items in each list. They have a single child column for the element values. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v2 ## Map Columns Maps are encoded as the PRESENT stream and a length stream with number of items in each map. They have a child column for the key and another child column for the value. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | LENGTH | No | Unsigned Integer RLE v2 ## Union Columns Unions are encoded as the PRESENT stream and a tag stream that controls which potential variant is used. They have a child column for each variant of the union. Currently ORC union types are limited to 256 variants, which matches the Hive type model. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DIRECT | No | Byte RLE ## Geometry & Geography Columns Geometry and Geography data are encoded with a PRESENT stream, a DATA stream that records the WKB-encoded geometry/geography data as binary, and a LENGTH stream that records the number of bytes per a value. Encoding | Stream Kind | Optional | Contents :------------ | :-------------- | :------- | :------- DIRECT | PRESENT | Yes | Boolean RLE | DATA | No | Binary contents | LENGTH | No | Unsigned Integer RLE v1 DIRECT_V2 | PRESENT | Yes | Boolean RLE | DATA | No | Binary contents | LENGTH | No | Unsigned Integer RLE v2 # Indexes ## Row Group Index The row group indexes consist of a ROW_INDEX stream for each primitive column that has an entry for each row group. Row groups are controlled by the writer and default to 10,000 rows. Each RowIndexEntry gives the position of each stream for the column and the statistics for that row group. The index streams are placed at the front of the stripe, because in the default case of streaming they do not need to be read. They are only loaded when either predicate push down is being used or the reader seeks to a particular row. ``` message RowIndexEntry { repeated uint64 positions = 1 [packed=true]; optional ColumnStatistics statistics = 2; } ``` ``` message RowIndex { repeated RowIndexEntry entry = 1; } ``` To record positions, each stream needs a sequence of numbers. For uncompressed streams, the position is the byte offset of the RLE run's start location followed by the number of values that need to be consumed from the run. In compressed streams, the first number is the start of the compression chunk in the stream, followed by the number of decompressed bytes that need to be consumed, and finally the number of values consumed in the RLE. For columns with multiple streams, the sequences of positions in each stream are concatenated. That was an unfortunate decision on my part that we should fix at some point, because it makes code that uses the indexes error-prone. Because dictionaries are accessed randomly, there is not a position to record for the dictionary and the entire dictionary must be read even if only part of a stripe is being read. Note that for columns with multiple streams, the order of stream positions in the RowIndex is **fixed**, which may be different to the actual data stream placement, and it is the same as [Column Encodings](#column-encoding-section) section we described above. ## Bloom Filter Index Bloom Filters are added to ORC indexes from Hive 1.2.0 onwards. Predicate pushdown can make use of bloom filters to better prune the row groups that do not satisfy the filter condition. The bloom filter indexes consist of a BLOOM_FILTER stream for each column specified through 'orc.bloom.filter.columns' table properties. A BLOOM_FILTER stream records a bloom filter entry for each row group (default to 10,000 rows) in a column. Only the row groups that satisfy min/max row index evaluation will be evaluated against the bloom filter index. Each bloom filter entry stores the number of hash functions ('k') used and the bitset backing the bloom filter. The original encoding (pre ORC-101) of bloom filters used the bitset field encoded as a repeating sequence of longs in the bitset field with a little endian encoding (0x1 is bit 0 and 0x2 is bit 1.) After ORC-101, the encoding is a sequence of bytes with a little endian encoding in the utf8bitset field. ``` message BloomFilter { optional uint32 numHashFunctions = 1; repeated fixed64 bitset = 2; optional bytes utf8bitset = 3; } ``` ``` message BloomFilterIndex { repeated BloomFilter bloomFilter = 1; } ``` Bloom filter internally uses two different hash functions to map a key to a position in the bit set. For tinyint, smallint, int, bigint, float and double types, Thomas Wang's 64-bit integer hash function is used. Doubles are converted to IEEE-754 64 bit representation (using Java's Double.doubleToLongBits(double)). Floats are as converted to double (using Java's float to double cast). All these primitive types are cast to long base type before being passed on to the hash function. For strings and binary types, Murmur3 64 bit hash algorithm is used. The 64 bit variant of Murmur3 considers only the most significant 8 bytes of Murmur3 128-bit algorithm. The 64 bit hashcode generated from the above algorithms is used as a base to derive 'k' different hash functions. We use the idea mentioned in the paper "Less Hashing, Same Performance: Building a Better Bloom Filter" by Kirsch et. al. to quickly compute the k hashcodes. The algorithm for computing k hashcodes and setting the bit position in a bloom filter is as follows: 1. Get 64 bit base hash code from Murmur3 or Thomas Wang's hash algorithm. 2. Split the above hashcode into two 32-bit hashcodes (say hash1 and hash2). 3. k'th hashcode is obtained by (where k > 0): * combinedHash = hash1 + (k * hash2) 4. If combinedHash is negative flip all the bits: * combinedHash = ~combinedHash 5. Bit set position is obtained by performing modulo with m: * position = combinedHash % m 6. Set the position in bit set. The LSB 6 bits identifies the long index within bitset and bit position within the long uses little endian order. * bitset[position >>> 6] \|= (1L << position); Bloom filter streams are interlaced with row group indexes. This placement makes it convenient to read the bloom filter stream and row index stream together in single read operation. ![bloom filter](./img/BloomFilter.png) orc-format-1.1.0/specification/img/TreeWriters.png000644 000765 000024 00000406501 14777360722 023150 0ustar00dongjoonstaff000000 000000 PNG  IHDROZ6ܣFiCCPICC Profile(c``RH,(a``+) rwRR` Š\\À|T uAfVp'?@\PTd+=@HR6.:bC'j ;`5!A@ / fŗa P{A@1%?)U{ CKK M@VhʢG`H*x%(20s 8< !6G)I/15C}}sKʠ0230I#2 pHYsgR@IDATx%EնkdI.A$DDAT*?` P`D AI .Y%,fSu\fwgvw̝=۷N:Uv[SH@ @ @破B)@ @!@ ! i`j @ Ab @ @ 0< P @ @ S@ @ @!@ @ y1@ 4B5@  O1@ @ AV@ @ )@ @ C@  @ @ <@ @`yX@ @@ @   OC+T@ @ c @ ! i`j @ Ab @ @ 0< P @ @ S@ @ @!@ @ y1@ 4B5@   3!/@ FymW$@ <=EsI>} F` 9ҩG: i(hGc?# D~M5VE O_D'WN|][~T$6(~*/2Qn=:@ 0X< S81⤜4˜LyМpfb3%94'Q340.!C4"N rsy=&1ը:'EĄz\O7(ʐqv]D.8!inD٘DI gy&~GwN}_M+bE"@`AFQ@-7&b׹ӹ;*#:54wߴ>ص8q͛=Pu^@ @9!1{D9s]vܸtՕ-.źөSqbcbKQd]qe\ur)b uW*USp! k'IJX2DptS0Uy=E759 6Q9)+˶EЮl=MySO7D]'E@I5B  @0 v)gϞm9' 5o$"d$Id By"NevPW6TɻNHH \Qi'i*i#.D ބ:hɂDQ D.>!E 9T%A 8:$i1БL.zTZl^oEt @~vUtg2;vmD̞"M9SysoFԚI;ujD@  Os& L1y'Oo&2"4JGDKiAr@vDdeT/cʋeć]f8A,g>vm2H :-N#Q"DlXC.@z0s u0ل-6:Ez!QxG$%?P` JF<<[R x: E܋GO$f> A]: c=}]'1K9>m.yј™@TtQKuq]dOhܶ:I׳  /P@`!qra52Ugp@84&fFB4y吂## .dIvE>(&h/EfzFA r! %*b$E됌5aE@O8>LA*!j-hx6țBG:'W\ES@ D^|fL O{`;q@YkGi:[ S5;.m6(r Qa* |2dBa2 FH##Ug;`&&R]4&=*7L$2V="HD^DU.ŀˈtP]! =d;EL>T }T6q`Ź}}E(aD kuRq_((lnXJb섩utl(>@ :AYh'I3:N&b"zrH 9i*P΁ H@GgKA ğm*]l2Iyۚ@dN@PtKŮ5l-; ڴL\Z؋2BwrP8Nlj' = "5^J]{+O}#٧>^QHQ-m$[t]ԅ`1m^"+Ff CVDEw=+0#{m4RէPv.1ۺPS7R5|Z>yrJw3>"@ 0T< o|btOCs D"Dsv<FJykd@4I8 raDHmM?DuɮG d+n#}m -drJ۹uB3f $OV7}Bz5 @$Fƫ$3H=S8R%jP1yR1N, lH;]Zru׊iTǺ+=e|R'G}J}ݬ}n>-l& "4XqT dFZ9[F %j?&o>~;*w y"e}n){T X0RQE݀u|+ef$[^V\YYnz\aӜR }bq-_N23@   O)T :q9 {o=&gq[`Hb-%$kГ'4wz)ëD@a9z2 vwt^O/K>^)ץN7]|zވz@YQcm īO'@G\цOB9iS֯k=6,ҁ@  G>IBfy0ӌ k0bbiM8M-n3@ 59ן@*yݶjb_IvXn$#R"T2k={(T'NkN=Pr8/~ڕYe" v wc4d|F!8vn !5_ʽE_"ӧl UUՇdU_{<||x@  y ZIL|lVYfh&B&x5 J\2>`rE(bQ^&L> $:u4Aս3و^tZJWyPZSRzuu-'wyo:˾~s͓'Z{]T5UZU\gbnׁ B`y2Ƀ:+Ʈvॿ(^MtW/idwTꂯ;\LlJFK?TT\SR5]7@  =^ 0Jz ؟c 6$cĀI7$HRK#CxoJʣStȶr=+eҳdSc[]O+ι"<4y`=t>s> bdH}o࠼ _ew+ Ou-#k4TW"D~) @`/Q@`"f,9ire4wI>#%Lf$ OR]/ $DX Xym A<,B.cB: L0Pې#b>.`VݜnuTq􄝑*c=UeeD; ?%99:@ 0T !XȓP&B5[+s>Gѵ$MXnFT(QU9D㔔Q^7ҙQ)/f^ƸZۺ4 <ک/K:e.AeuP,ўu4/oSLh5@|@ bx @&F>y/^( `ā A! HfL_8@r+7<)EĹnކtyqLGe<: 0>S9rG }M#M6O1ڴS (WlБK[xt晽<̶qʢ|/P帩}cѸb`a'=OM1e&&jfu!^o;5 ɐ{:3ӂMUfOY'꨽LfT [Y?EnkWJ]uۃWl`y[MJ1uP!Glt .Lf"^R[yeliuL-CD8_,ql+t Ks{ږp1>TQ1a_Ϛؒ˽NzYā@ 4#ȏ4Arel3u0Wgf4Y<ħaE\O{NTI[,$LX앴*;oeƻ$ eG]+LdOîWl'o喚aCf Uʸlk [;Ĺ۹EET!_zV#@ 7A8l%M򡄄LT ܍(/^&<4x`ta)&$$ڥz] ur?G.׵!+T`v}0]:k0(yuh }^gs,7}dQy\a[lJ~&oy-Eo#㥿`KFT0GYLr !f@+hⵢh#h  ILtV1҈Hx.N:ZȕHrOgl"KT:MC eKdfoW)QP_3ޒ.):j$5Fjz[ގ3S%#U?:*:(b*>ecV?(Pr[Q&BWid#aF@?=@ #d Pc;KFF̣c!] ?ġ:Vib٥ti;}RlM1N%Wx[rb'_;KO]dž]ܲ? M[oN%{]Hsn`YZ688Neʋ gX*u/E8ϕsD @_@ MU>OdmnT9FAY4RIxm̾l^ѡ"m┶*s?? ܔ}cwjқ_"wW a$2D`Lr+cspzqnK;tru-K[QU @yZhP1Ox;̫BI_fsFOS/ sDx`[u: ^B#UV?{%wPZrG]>%S>_:eޞƛSq!ZSĺΤXY[¯&'_YĹ,Xi.#ѧc(tePYsxUU 6_dgdp1#F|@ 'ME@!yI&N*GH( N^t((j N~JFZW2 N $+ʌHOu>+ >67nFGKnarUUx[%Gn$E$%mB}~+@ f4B ȽϏtɆ>%0.HH-Դ]Df-ZD %D&?W!&~x>p|z␏;7=gO+nhIo&L3DB!|L0B^ /^!ӥ69JP '[Vl㌪U̲Yq!-0ry4Yh(||@ <h(1S9" v"\6G1A^mrkjVL=Y'o]П@-[zմɖ*[[, xDcN 9,$ɶX+YҽMeǓسm0_镾2H ˸ct.o{\@ Z@-eNhܮd *r;SOd\D;y@j?+с1 <g n HSmdo%Hat&wk5j#)͞JUJ/ Lg*G #@=mس/dSr&]Qg'@ܨBfA/!C.\BZ%iJL$Iʺb-f6P !GV/IQKw[3&87OGDD%xA@ 07h@ p-\ `qs!Z- RJt(Eqd.i"-/{Ɣ`׾jӺа&|A?VӫV%>RT=kE yǼt<@xae `Dqm9sfnPHǫٺ:y?2(@)e8x6[cH(FbKo,yvWi1R!Sue)P\yLBH%/F*+k=ZMFH)J]-@ Zh#X$(ν ׫9M(W&1̸u5`XcytU=d m,Te)zeM6 a < -@GQ%\PojniQ'$d 0^yB,yT㑲6mSBP[ZUsMT|~678fZ  ̧PsYsU$@  <@n1J+3u d L)OPrWJu `(H3g&A&z"N ~Z 9zrkz>GT @@M@s4wV0Q9ySe!]N&ONlVۤ04Q+4bA>X̭F~\*]Wʤc$ P\yrԫ5ԫ5gH@ .yj+lD@,-Uj/ՇjGǬt?L/8{LI>sӻ^z&))Yu4iq)95+RvܶJg'T6kjhK6A,{Tzt8&j#SV&ɸiSN9mbZc2vc+Hhct/qi2W*e @`pp@yu=MW8mkCLo9Vttn㹿#+mg/Wd2(Q!^j-!K]t_U'=4ӝ]sפfنL Y #@xFh0:QH%k QK[yIh=3N=sRV8CG~yt?ι/s׿',!#T,9OM~לWqQt ۮґ̽iՃI౱b>(?JѺoTk$[AE2}oD'=\ [ 7QF+NVrY-AB]7ߺ,Ah$7!-5FsLuWMLf5ԳbJsKYl7F*V!P̵h'TDu&s!r(&ͫt-p6ۺWmɫd}> Z{v# .5?f%NgJҥǞzś޼igMH|p}7O>-GIw{jzoe5SR^:{U6~tOJO-yi䭢̈T_pU)w#eSSK05=vEsL/Le-vRtԎSt2Y-]E#R,@ /-m@}&,A+tJVVW[V'~}'~~ظ"b"M't۳/J|dYǟ*҆t>|%ۏ~A Ju᝻IKG#OSNZ^wzK侩?pV\f x^:*~HkW^I9_k>Jij6T躲CڳE@UyjN{ `2r9k#&';R':xʼn]5g-i_^2i4xR_jRZwqn'[1=q}{VKov(VJU|) '/k TwYLzfk]y;w=}Om{pz>|OOE:u]A{҅ȍ Z.U,ɕLXRn1hvr{@+h#hj;3w=Aq&!"U,M/MY:ac~k5ROo;o`u'u\5-%Ro:TKux~j ygT1J.dz+C-(7DMEz2qV( 8J8sTG/nv|tH73M\|pۤ{U.}Lkv$X4 N/c\KEq@ Z,6G8%1WJ،NEf9.~oSe~ aWvh:W'`;0Ci3iDzGv\)l`{F2yaLbbw}KTdP[7,lcª[?f~̞y.neQ޿V|@ Z@xZshFVBS6ǴZr9tB<:UDD,|,PadvoKMSKtmN9Uz0%~?niG~NQc!wQ.Oo9,n95-Q6w' 4*a#_g >L3Jk)W$6lqa ]tyKkL[@Ɗ%R ^GB+ឡ]MĔ b>ۇ(G@uyjR [r2c4I<S{%&͌nRcKUE\I;nՇl{ʭUv&I7ΚLztLϷ~n+0+` T g SnճtC#R@  A0ڮ7![cL<&xTtح+fkԌt(m#r{S"4 6^LxfϬnݭ7yŴi%\WޣY,?J3gg(LT;Kfg:SJ*7mi?xNvrVSs=T ឬ]7fgj;ULڋ@ Z@ ͍A*MLqr" RdG6 2EsMfl [B 'iWH0RbKѸڱ^5"&)]n署\1]PoVK[=/]_kLS鿤s$_ K^hY_2_?aW +CG˚US@yj!hG@<%ñ~HvhuCzeO^(%b)S?ؚݩ}8뿛?';?1-=5䓏iǽ-q_*7oJP鑗Rrٟϩz} kV CG%;TS$GtiO+y/v?}}ұ+U]޾f)Gޘ>uw5~U & צn~I-=9)D #D_[8E%$l@ ǤzUjr#@ iiXI{n0o 5{ӕ7N?}g^k-owǪzuޚj]FdT?X?xkog*]3ڋ_:#mga}gi]^{^S}ӱ;#(->NM}xA$m:ꁜF}!M@ hyjhG854!WGm$/&xNr]yXLJxd i1] ktWy9.fotGگ2iv aqmC:($уjɍӷ~4}t/ NT_׋Qq>wz}Hg7Nu6;z1fP02L%6 >' K)Q\N\@ Qg^ڎlH,ns-sϥӧO_җjK.N}eGǻ崇nyRg1*q &-ȷWtuYYW<,6}'=6Ck:4ĽJɫ[[:lƩkuvѝz?1u`L\|4;Y۴' :%Mhfz?񮴔iZu`%$cEe=iʃvO+8)(8XpoFzBU5tKMI[vW[*PǶu@m>-,Q[CXUvZW?#Hm]Zb%/nĉDŽ 8].aKxcE&B s@ n/z@xś6b)b1xI$gTQ&u{ 2 uFpiv% \jŴ+K,;: \ؒwA. ~;U'.-$ywaY'u~wZnIi=jOuԲ=9QQ̾T-bZm_<$b#J  줞$rAIV1"r O[yJ6̞]^>WڰrBګ+Q È@a7LL6](H'mvG"0&"@* Hʳ䨚TՂ*0j`WA#/لGYHV >Ax&Wن4 7YF: 0 <^H ĨAyΪRNX]C.)1]l!>@ h AZs&рIM0 <9(©DD{̈ق`dҫwܱƘa50PdHOn74ɺUW-tG(Z*&c9蟓҆TsDV乼܂CB^!t!=Ȩc6)+`$okd nF0Y9@ n< 7a}МƌagFyDk/!/P&2E_kAE"4}Zb⃺@Ӥ[o YB@AEg[-Bzi[ViL6ψG-yY?[n`e1DeUl̾'cە,ץ#b3B<|"0#imB& f@ssUI&t!(&uqNib=9ɡ@+.2beT8;gW~92rdLgٰ\rc׉b8z-#ĹZ^ib[$^!׎[ ![:^Q1~G&KݼK iHTu~;*@ <h}0ą I=}[s ވpQ!7BOȔ?9MRKxS SGv9YKkuԙxN^)v50=͜%o\vǻ"p(/2cOik.Q1uv)z)$QBK&$TۂLYNx$-Pܢ)FM^k)3{ؐKnY/r6)^>^*ڐSPFho9y_$nG @C=K7edGv]+/B0IfYաH[J^(Y8&^^D@ 0_y/آR;#P@iI.!2-\LHf逬J"J]zkfiq9gkxrK! .LvA؁ܞs2 (|k 7d4R/R 1e!L@?DA Ni_(ދ ddIg^H ϷC@άB;]/٠4q@ &A&ak!P@T)}5)4!I&jI*S o}\r .nYQnHB0ۖi ]:fd2j\č:@7JT1]%>Wb$ [G-gYOnG;TW_t},d @`4E6C'N&TOwyfHvuʔuḎinRӬO\oaM,6,"V5g^PRtr([KRXe3iHT0`]cig&JތdKVNP4T2,eěe:J+5gz衊@uF>4e@ *AXɲÔ9"^veMe;wO{Y=m>:-H@1q2~@ @IDATyD DG5k0ZW1sL;fȻ1}t?3nKic4a;ui,mD@`y,R4''PN 5m4#H>=%HyC(:uj+m^c5Ҷn۶-ܒnҗ4m6#v4-U'M 'Kċ/&ϥŦL QAFRGÁ@"E熀Ox|9$19'*-2l>o[EZk׿֯\jyzS3}ccɉ1e\'8ڭzOOg}vя~d?OK쳏6F@ y1΢ #qLu䤉r9q(9"׿&fʘwi&NkfO?ݚ\r%[>f` s"ODA'Puɓ]HG(q"dʉk=Ӆw=qD^5 D "@{!^y 'b'Ax=Pk|SL;ͲDl׏yt+<2x`cHi'C$ /eCe~ ωyl:CM7dnB@ h ):9X ӉNݎOu/nE@< d5tM<H,LO׏!?'@ hF %@`C "wvCLp"r9רּGY -<gӄbB=N￿1GmqN<_l>ذӄf2D:a":ͶPm#C &ѣaB੧J/zыo~׼$'G{w.~m祈@ٜ[/_?OBN@6lc^^{AMG@ y%x'lC<(/udMТH?o=oMg}vs"M#! \*_<}K_JGqDuKq$mC 2,Rw1vmv/E[W_}unn`8^i̙-"/"䩥pGc ֍O?`L^da"#<|ӦM[qk?viK_ 8ы@{mg@9'ؘwEX066{;Bo4/ڻ!@`t!it] `M;lt%%\rCm~uOL4)L?zyxYf,@`4lІBn햞}ٴ.[^axuOËoӣozӛ4}ӟNmY\Wt AFhvkyŞ{?4q3{x2G# /+R:gm@~F5~6P }X@yB ng8k˄ FK|?حOBA`7/c[w{lzի^x4B  AFhug?Koy[l!94nܸ!Z EOErhW\qt禟 [lylq!Z@?яk@<J任RTYPbӂ"`7y!x?-CB Ӑ V#~rUvd=kF<]wu>?ݶf}^8ƚ'c-]hvC fE[Jy{Rooo:#ҷ6h{ɯy揋;^r7pϢ@`#i_N8!yv 'Χ3F%{ uOlIF_gG@ cXя~Nlat!랮ձE7).BR6/1^E|l/|:t[o ]^ /}n= Jnx4uOlTz]w_ CD=~ SuK<|-@ i1 >"NrJp?~1X4\(/]Ďj{1һ`֣v y10|CJ't-׿#ާuOsgH;U0xSr-W(Ѯyj+7C=Ԟ)38#~c)aV7 <$Mf[uYeWZ($yD?F q1W`bb-DixO#~7t%X"=Si]v/yKpXzw{O$;{iMhyHk!@xQh 3f-2uYgZS^ ~)9D'&?qЏ2otXvggihZ d*B  Os'J駟;0[WqW'~/4 ҄ @uH2&^g&d6rZ.r>uT{hۭ_ӒK.ڎDk@! br+O.>ivHe^7шb-fq QXve6t0nj7^.֩/OW\qŠ;+vm@Wp[uw_@=C'zs>袋;\Fbt#뮻wC/V\q! C// 5y3A$yUxy B ( ܂sdo-iVH_}Zjl>!ވ7qn}^f/NN @"{54#djN!b Y 0X#t.b<q;)鷿r?y7Ժ?:ͧz;s 77|Qо\{G3<3דHW]uUe(Ea"vr߃Y4P7٭zJH=8溆-q]y/GeJU1u{5yMv|P= 8n.w:u[:AR~ys/okUVt}y7e'HV/h6^VV^ejʿ/ yʻ^CC3ΰ3&S'48.ncHᙂPtMuOva_phlo#պxq,eA)2sJS֮a@_2QybH{=ˑEXp O]=Sݺt;QG_"~m~{_$Gbtj nie/#z%:%.| squiٺ@vǤ?e\sK/I۔^sxxǺqSN5l(~Xm>biN_,`AM>6D/u$crzMj.ǻO"؟NzS'(dfȳ [Y~ ^zhL91=cv}!N920?|\{;Zy$TW3-M 6Z'Њa;|ܖ}#ٔ [zy& 'k&)h"+r0bKSӫQZ9lc>~Q/J[5T14RϏ%}m?;Oc !p1>ob/P:]JOŒac|wy {uff]&.FG2-eþ3ʙ ;BW(_^@F!c#T*/ؐr!.2"A?ص+%Wi)̇?:=Iҵ:2J563J]ꨀ6͖QTkON3[~Gy/_*~hc-dZimw1X_1, $/6Yŀ/ _ncÿhFLv5 i&[E`!_PHgAOF9<e/N&-V7/+#K_ٚCЙR/Gс$(6sV=\"5].M.֥:gr*PKRr͉8D-ve`zd43 Ml7+țn)w6mr lJD=k?.dO٩P]uq㬜دL?8'γ7=~$ ݂peuiqtƙDFxLwB b`O^<؆dap];SKG*!:9' 2m@Zq!i7`#O2N{:s]vD;BDYY-gbU~x0ҌYݮE}_/ ˀl aUf?nd| bC_M\rzU2u˕Pd}91r\x@騮LLKHx65] ۔Vb8wV_\K?H!M4թ /!t9}.8,5 pEsM|^S~:2Npm EҖ^(_\he$]M+HK GIT2[JY냉˗DqJ&2 :h NDPa5-+ŝ6ְJ>뙪>!C`z1dw~w=v}SC_Q9`dqfCO|> 8$F~d#g8 ڰrU%!-Lr9,d4\u?,?KQdFy1Fg(ڸby; `֣&k K%CDb-CozSe+ (?`ͤQq2[NzLڿH's0Fm@C/tĤ-ŧɱnKNl|(D)݆:ާ܆U`t\_b6씆1{m1W(Ւs1])Wy&$UD(ٷ~E>Iyڲ|_0ɯ!1/|3]G豏sϳ扴vN>xˠ5Ȓ%OP V6Kv !510rҒY&# (:U}CAwv>+|% n#I%e`vJ_܁ <(>l뜥^,@[Rf3;YlPL48u٤yǓ~aǤ}{h牄'Ol`ƍZn/(/2ܪi>׳]n'ۤb#F}dt@"k V3s1LU JeWXl=G#7) ̄Ҝ vQLn(jUšjS0331Wl0p}:SFHcUF;^6UեeVle1S =~bȔbo祛F߯x78WꖘrO[A~yBq /9{ȃRBW.]Ba_~JܿrK\d;j <6 ]DUQ_Djrtɹî/tΣ_/r:%Wb:T`٦2V!9`p 19{v9x'9T "$۠2]J[2@JQa@ "i6JfVW}B1#T63 %k +c8]E?k٭5#t`s`!Я?g%yS1OW'+cN;圹\O!M̵evͬ9r:i+qkDچy|i?{g5}Ȅj411\WcjFkRT#TCBdBԗJL_kwsϽ7{>yk{~~}_#,]̢ɋ)b\4"99אM WP-B2C bbR1)9JQv@z 6Ʀ.KD(%qB9Br?TuH'5;K_<1-d5pG-Ba1cƿ3Eˁ!8yu~4Th2xUFxr9s |"(c E1H'1!WNj /FUH\b2Jr!w Bx$ȅbӉcCGmtH9dŸT6$ IL x[Th?xQ6r}vu"/;$F . g2$M-Rdoc(z88|ȨMɜʸe1jWA.9_)EdƄO/c̈cR_$72v<,/VP'%`6 1CX'ޗm1cc23`jQGc!xb!T2w<>T@~2B}=bAch s` *GFD9h'R pQ5̪w/ !_pRAr\eS\Puu2#s^@*aN'*%1j38jpբBd0lh `_7t2(pd"V+ .9x/<Q;x$k։.E NTr5FOddT弣fu*W:3tc_ʦt»*F UpٕKK#+vH]+*>0Є,yntQʿ {ݶ+m\1^x|#4, *wcXG_NO>dl\;)AOe>sZ[tP$Ix8s\ a&yc1yOԡ#Y> *W|1;V#ݺ72VJ[Z<;b0 :0.RӲͪ_NJK혬xqiKŇ?5GI2mx< gKYVEw݁ZN揺|=Q`X* \ cHy u8qʰs:<|4܁"M! #FKXl}2kU4&߁QQfy[Ij, LaI)omun/ +GYE>EڢD$JJo 4 *ш^| (_ ALfAU1D?$1# 4ޜIb A>1i A,%Q7bfrQ6 ES Y"đE>?E|_cM9$cbc ɉeZ/h]&h5*9;J@vBE'@:q]onL*$aGqHAcP M )~6jug9Kh#tJ9|#aWTR~qBdibz<ׂBp(x5 A$DNnEuz \u[#k!c&l඙kU2A>Shc\6q 'mNʰqDoOst\u"Rp-t2gy YR-*֍tX| $[Š_ c'P6sů'Ѐfa"@it$7y` Zj*HLc]Ň. S21иppJ#\ӟuqا7.IpkJQU bSᥒHu1:E`@8!' 3?h|aFuckxE}q+'8,Ur81W ~+GW_/vޗUBnQco׭[gsA% y7lRsAuؔl,nϵB?BWWeY8 .:-1B4?=ʉJ D{Y|ElQ6T@v=*5!b8K~*{,Fx;\Kq@r^(T^_i(ƁVp9W;K#R="40b`.0\&Xv%dY+rʖ-FȺ\։<Oi>ə9~NH9m4"{J3y_6Gh-@fVΠ{PY#Co%^8nr+޳vaTp;xQs2zD*c+&WrAW b*vρ.>qGI9r3t}蹫|vÃ.URy3>~>O)fmK2|_~.( ѿ1M܆il녖b8LĎ]a Pv@!<9OT^źAJ˯e8/*wOc^v);{qEtŻN1㊸S$ |:c$b^tջkCчs|'IC>Ʒ+N aI4np@. T,p` H2O&-bvm,Q3wTAt̻u&,O%suʧ~\e6W5C;1"9KS}×u{鋧T$ A[=9IHh*E4vE^OAĠ3CL`Q]C% ()ۆvʑi/YnD{t:#r5'Ixcw<|b"`*?; tكDHG?`mR?!#")8YiQ.Ҏzy|NDjR-\H/syտs}apIRv&{wXɇ6͗t 1dL'AG-clsOno?ןq0l~ܳCCuXt2(v~SS&z]" t,e  ?YHY a'|?ׯ_o]zm)+++k.ǩ=U9(;8B4`)bL]9zhɟĹǒt@US^ڮ?CeETT?6Cvp[خ-c!CfќE8E;%k01c}Dôƅ@QէÛ4&ndyv59.WJOz\# T1 &@t9_YN8W@B<:"jrQB:y #9EEmU3ډZ8.9cat)b69Xw* %5|C!ŠnUǠhEK Gd@XNi<ֳӐh\_j$W 2xFW*|sT_Ҫ]_rAJf-S{;h/{DEiQEgj#MDR~{һG&Yԫ7J[o:\sb^$K<-Vrlj kóJq pؗ4 ~+Ѷ:<Ż-_~Wʠk.<V vx G; &:iA,!@QDC3vtʊjS JgrN;NKZ'>Pa .rnWQ.Ї|3t%9`H)3&ꠑ;4+_IJX 0!w~*#+/n0$DpIĉL*q}ҟfr iSS?n_R9]ukmqdhKD]nۘ^_J 3+9@ި)b%\8Q#(/dw)"RWy?MFk׭o70ZΕg% CKeI{7^bAW; ߹w!qȍbѐ6dyܬxP[pn-#PNtvn{Mq\Je*;v:p݇A954fd_!x"l5_lqp=)I.ŽGk'})vAmi[/p{YOfvՉ]n FlRMpVdu)#玩+tlGӍw}>6 n6>A s`-=}fmqN -K̘1}] 11> :~C!y\'Yς:RGsb[5;S\h )R&>n#nGƵ81qO"ÞWa/1#<&Wh>W,9"j4z} :,x`ڢ Ri|>勧DBΤ4 ),ɔ כnNx \H 8I1H̋dQnc7-諯u`;JS蚻z-2 X%hQÃ_s͂8[ʝR5R1%pŋLH =~ *⋆恔-4B苜$˯qo=p'"w)>ɘ6:It>G&Ne'?KkTi7)vl<"}5P4i4iǖ*cN=> zb;^6 j{]4y  $aI'R$+W>m ^H/{M9&q̴E?x%X2=g,ͬ/jv<*[.ZuaYor[{r{ѓn# B̋–ebR<xth"U`iYtG_E eYs{hev+o+s|f_w8 'VNŹ:<!oQx'z}ڎZw(C'(Ǡ%>i#I,mܴaN8p@v'N -5Xf]1r]ħ;ϝ3g'B8+\9p+ij1ى8D (;ҟ )#3*~tϼޅ 9 _ ()ڭ_z' uڏ^ta9(sJD.m0S] m U)Po%8NIOZSZ\UڨJ<[p ۄ2,p!. CeOKh:X1^'Eϛ~? 3J57fڿgT&=gCR_r$vIgMx&rr:9]Lz'/[fs? ŕ*D;;4 2S],W; 5X|w 2

$T[9kYlPRdWc7>x}ſohFm jۺ<42'p\d=:ȅ#eX JVh$u$l4d?L.Љ./h/g߷"!qKG46owD#ФOb9ßG_V"f1fv_hlβqTl(I0K_ݸtZ V_tbq_kbZė]tmT KFLo5Qd1bpDL\.|,.l'UQuz۾..XT$I7D.0Aś7 0 5΁ftG~2*:-@D{TtcmX;pɤ:J/x3;&ɋCeS0RGթ+pqsGR&iSn=(LH̙}DwV+گYPjL!ŸA8|H &~X%}r *꯱Eii.bb..M#H^XLʋ !^DL c )51M#wZhHI>D\LRgp!R͋(\0K)2H5.s@YyOa%T'#W[MwPEZ%7BCE Q}cRXK*CGC+ {γQ/]:ϼ:982ovEβGtO}oo̗oDq>cn{\9~G?W)S1;V Țb _]С#tSwG~ ^KqtArC*V^G7ϓER H&h uAJk{_{d{mo78!^xK ]S"ke@gD sg0Rd[h*8RGɴcyܲeݎUf7$wq5N-0Q7Y I<:ccc"t7|}YhQe#D858wGH[- &c_z}3pn}>^'eW%i)o7;$a]A&4j 9N'p)D`P M$ 4jʩCYT]Ew esDf*sHhZ] }1^ Bev! ξHŵ#jv#bu JnR|Y8ʼLKCkɻTt38+'Ӫ=D?(0~xYGrˤřtf˘I: ~-,_pW؞۶/eC:H|ӡD؆+7P0U^+TFOJt qt҅F D%_ɷ _ c|*[2/!n?*j:ʰ/K,c'*d+ɫX̑֍3{_sj$=znQ1 }K+8)ٔS-35ϻZOu 謟ӅNv6 ڈOەH1 b/h $D~(!i%/ ^`G RKy>b|:2y6zcpm F%f#YH-]❘frDd _W]_R$q&n7`G!2@u G+t14I|UNMs<)br,X;֓K:F#~cuB|ͯ1.^%_h5􄇶}w(G}wF*Y x ^Sh ʹ6DǸ0Z|yUQmH.YGQa*D \V';5= LJ^>Oq!Cw !c>:m˳'q[v"pW 7ޯPPb'F YkwąEtR'ؑK2Iz:~e=o+yuj^ǼM/GYD=N]XVVZ@,FSbb tA5N#C0 #/=W;`tf\63yvn;'dN_u2߽pP r }S\XWُJj@ \l~f_H⓾ tR':)$6)K"x@qϘB3vhKQJb t)"(jOCǦ7wB3 |O,϶.^_O-f;:je1#6L1gZ%90|"ļ{F~q\1BjZʻkTtnC!3˸UBN!,ShDD_mE5K'T)m +בydsģ_z۴vGԾpц )8oG?Z1eƳDN}$p“O@ŔGb|"tL / 1 _8c)a=RsN#ECn)\:09"^S7%#s/]ˀ:b'{_YF<옼R`ħW"J~Pwx3?# FR|I6 )=Ve1"6aCs>#1UfU>AJH{im{6x;?u^[DNe1  N.0O,)G!ku36[ >Yw 7\ ccЮbkj&ުOqQ-5}&aq*QN@DtgmL2!9*$#u@2\J5/LQP1|*|m]b2U'4,0YNf->VuiwǭXSWu+!ʱ!v()CC.Y\DYL#c=]_'Q W2HJ<;HV89>ND^IJvU@UOI,J t+/ 9ID(rՙ$ˢGo{iq.Fw-<;J QqTEpY9$Khcaf(Bk-Rϩ#U{G_NV8<B 7; Q`#wz1)ʓE8va+-nxBX35|Qئ 7!lR- XEa&iD X`4E`\Lc7E!+޻$'ˁjp #Q}&hqrRhQME'G`kwЭQm _ \D{%=U'z?ʗ50 *=*:_ ,jY'הHL+J*);N %+2\"Ԧ7lXXdPK7GJڼ滻j,u0̨܌R'?X6ݩ]{]oV:v 9PWx\hmn7S+"z_|ҽ(oL?bXPZ1|%v׸&|/GS-pG8FZs“ܿiǷ]4iD`Z I.v". !/S'J֚ MY٩X[ ߽tӱ g }ok{Vypav2?1Q9r:wam_[O{ E6Q:M]6S;֮mM3oh.$| 5;5JaGC7XL'B>&{ f7^U0M? lz;S DQaBhu!7\+$[<72 x!%=ߜ⏈!H%O-JYs:G`P.bL}iJE"A1S[CҪ` %oD:KFMkI~7|؄/f2j8WwN??w G1u0fF-lqIq^OGol xT(!U4q'g} _5@}RCxLvُg?vB{{?>Sa-}<~k|mQk3?F;}own~wNno~qX›{F{!T^aI'=6B“XvG%!Q7R@e@:/ƖOڨ̿$n~6;/6[ug_$7L 2 57{a;?~EuouvC??veS햇=x9[Aqxz{!7 k'[;?ͶǶms\Tۗ>v '}oڮrvȝnؤpE:[9hJ-~ex5ˀ |R ;`@ I I ~UZI'*:s" G<}\};m_L; gn_ߎ>\'՟?j1.`}wBpgc<ja_B5;שpX4ЮBsZIWV LCL+$ !wA)ωm}W> œy+ vX{߼.ׄ ԏ=h Hz0DZzdr3vf&%K/{R)/^q?k_|iOo =XCsBcy;&وo*W+{"2S•Π $Ϝ}u? )i) yLJ[xgڱ5L;lwLᣏּ8/J_o['MX:}:BN?kG-}{fҧv|C;p U \A^l&$-]Ũ#X!l'<*<({ㆁǼџ *'XRbR=jY,bx:*}'>J6q!Z_o;{_wRzd7坦#v"̥Nisi$tLWv<w\ۭ̋XR_}!Řf; `+AY焾]9cb򑴗ǓF\&t-U`g.|{dyZs9-wZ\׾GkNzdt''qZ{1hM|%g-X8K׊W}T\Nj/|s۹?W#6Q qlD(ۀ0.bz₲}-4L=-̏:AjX)8S8'g9>jy#"L@1olgmoZ{=nny/KDo탟}hm/zy;zV+:CԺ8㺳L]&IDH9p:_aCt )mʩeQ88`Mġ9*=5VF6Aˡ*r3ۣoi߯* {AA1sٷ)yI|ޫ=qءzw?}i6Zt39ypebֺpT$Ceɒdе# Y `ž]XEɝ !yUt.q+$NJ-wrkD%rr_O&tr%N L=m?W{qݱǵCлA_?vt^Mʾzm݅o?>TߎSۋ{3m}%U3{8͐'{,*7:67`z]6a 'f1M4+<=x 6oXbuY?^2m\N]b?xdJN=$E٠g~~~qS_N>'>B>/<y62>pJ>/ʠ(sr=0A%[P`o{+KAS͂E`sd0Ɓb}"47Oٽ3iouMm}m5=Ako |k"_}-Ȥ0&b]H&4X7w{Ëԙ>|Ʒ"M_Зb<Ĩ%b;!gI4yT:< ijTmGxDnתvS>'%C?n”3s(5_=bOvw^fw6C.O-#bGBx2X[&n u,`|Tf'v1ޙxs;JF)tA+AG=ݘb=H/`01P |T6HrL0|?t ,.d XV!Tʡ[&<C"3ډ ۟Q֧|bnnm wyHźv+QnՍepmňEWa]~;Q)2-J~A$D:I=|m͔ok)na?킋Nsz~ⲋ^:y~Voӊ톒]/~lۛOM@nqmƅh>|tآ-ТstޔuLn&R,0 (Fas$gC1=t%VztGk,'$C0mЬiY%0U!dT#P s>ŌSЩ1E}:mo))Ε|-`q(b H<26})dwopI*3wy!$q22)EF)+ģTB!Bt5IBȫF/B:}_;]6YP! UOإlFvNX UKkԍGmDʩp:)9v,:lY}5Vw?_/9~L(\2x 7fwHtysP-qV9s$ק]Ɍ}$[8&rStI:h6@IDAT%+jG6/=~ _}\ܲyA U[f03:2HkD}%B ؈y)`Dg XGyHq.,^ztoɯ'լ~h;l[9E{5A;YK,nvJB9;IcK_Vx:?#?~~VDƮ; PkmA7hee!͇tF*nW~2q Î|aj? l:nDq ҵ@Ld7$9sH&܌&Y?^rӚ9Qx*QO+gtLj%wy9 '9.,{PM /tBlL|He%K{@3/ˆgۙg[jy{Ӈo ˮ[IYr WoOg?Z.¯s]Sa ༘] #n',0u;>$_I[kϯAsoD~]㍫Yhn%+VO,4 x *91 %ʙ.c'~>KP1ΨyVZE}\ģ JsZ@1#=:1ծQo\SI5=-g־7s.۽釙<(OBa0l`j:LEic/d(mBh=͞?{2:/b? !.J(|VY IBAіNhoY%<hGߨ%hwWX^1J gP''kP)'\hй-r *e;N@1l b|~?*sη??{?]z pYVkk_SwcvߴZN&z7*;73~J;o|CICEF6<2HO!M&B)S贆v8EW١R(;V9K0ڸ'!\Yɷ|hryE4W dyLꜘN]3?N2F*n#޹nwLozWnWɋ]϶cv\~_lozicgOMڽvڷ.?^;ם}Α~ ܷ wxm7l/@\vXuxٶl#ܲ79nPs㙷Dq]ˋGJ|G,ܭNYѝOA9P8;FuG>K~R5)ǡXs/y*V;P33oy٣:#NyKچsNc{^{؝}Q};~ "f3aòs\DWE_EdQov,vr摜22yc:n*B_I^UJx-q '#v^BV`A7t sRc6J@ecz7< o^ণ9)fK?G xD-3 f7*(uc%m&&s+F#D䇯^ˀh! JLsڵ0= "=wb[O|pq =wul*ΧC.-!|˒̇]%sJ]KҊ?keШTB?{[6of"9qI:(k.4se, <ÇhnŲU0,$P!W }:9S% Pa5V@-b ٧I)wh.!ţkwkW/rPC'0i_UWbu Š<8oiYyc݃I:RCi ẅ:;TIIWϓC+{4vտSkX8j!+TZ7Okuzx~n'Iv\D[&,>Ҍj}_a3lg}A-5!11u>A$JJ s 6A:y D8|]y ;"ٜsOꝗ/qE7Z{`;f}/ιfG>i.=>+oV]t~;g{sO$/xu{kjtㇷcv/~Amآa .;h)Ql>ɱ,?mj[bOǑ/y%m:v;g -ߐ͜~[xcwS+s25QԪ>iz91]=7;\muPL&6żvTwڎW!S>C27l;jGCۦ{9ϟ.8yn/:?el%N\V,HEڬ /6fՆK.3uԪqUδHO ]#(Wڡn<׉aB]dxwٗ;s/e;3S˫_뫨Ժ}ڟbttRڝ;xB4~Nn{ď.m_vwӋ~ fr~F AV2Q*\PE8L=A5r<8p"`:J0{ )՝ޑ X DW J5P/ꭃŀ> 5xQ0(y6Z#ivCu:y7!<5(Ȗ.:xbgMt;sN !! A (W0 ^08 I "3dN$2\ $!9jM9g~ߪWժVUZUvM?p:1lё<,VAyQM"؟`<|Kr٭0;BD@%=ܷLƈ坹\A(.Dil0`|13w`]m\ЈE|N YÍoP)Gyl96Bz*_4xG(lq']!ՆMߤ)ul2@GXN" VTf%;eSX}uƏ_1;iG6g[4#]ȅ-^!7(V?Aθ9iF)` :-bD֬*#ɃgZKIOEa5%D5SVNvx-4X0U[&.5vC8h i?eVc.W۝|RshuP%ΰ':~Nt!F(+ɠ""´pWt[VEE2"2 FxE\BΈ?O10lTtp<I)a9IH"͋rxȈ#!8h:\BlJltlhQpRC}N|48Q%O0*\FncLdB-qd)`LT$ʆGB4x**A\3 +q52M1o*tE!A&>2WSSfHjE1_IlQqʱ'wER\'<6Ÿg{nek%; w!&xGMinղm Mu4Įk`Hrns9m1F|Ǵ9EHiGMA (?#i!*Sw^W!;-Lv>* 4(gJ-\lzV#Oq8!VƓ"QE(:5ķ=}yhD">:2l ʣ>YЃP IOA81a]9O zR ڸ=cӁaa @A$ mV#c21jކq*U M1gಅVtJ溘UDa.uqbd$Ɏ6@c hD ܦ3 -);GJt Z,U`| 9QI'\U&a40RHVDG~66lS6N}n :)Hy/uRYi*jDyVF!g+#BwadʏfDu\$Yvtnn*ن(J<_u؉BE)QaS"Ĕo~<*y=Jh} -E׸ [QwՏ=gCqN ZCFj g`.&>Y1۸fU/4asɮMԇ4u{z" = ի6 C"McW[ivN)4Wem^'7-K-ÕM\wΓ'0u\| !eA[-5ӌ: 7N2pTf@K Xl:j0`BގW+F MZbȳNn"%:'*GrUV8: z0jI8wG.Vb`͸yZ pP .:8 .ۧgga KN 6DTrEc|M6cSmD$|,T4}:/H?#玼Me2:grhzXB!ԏ#´pZ;arNeΎbMv#O1CmzTne v#ޟDX6$Ax<1dzA,Qִg6Wi91z([iL,%'PF6}cZ\/ti kyfv+,a!t,QF늂r-Q8=7Ȼ[늅շrG#ɼFR~<+с޻`C$vy8 7 |b0d_(-}F"ŊU4A\pY#xCy(^[l1v WUCFlOm<&-?N) ÷ְ3@;_lb^\zuR'~&weZHNT!pxD%Ѳ(NfAc['Gdm”dm*r1!*cƑj#a~!b7ˎmWUV!R5n,5vmO#luҶ-<}%R`!14۷LQsQvG}BU26L瓫@QI6xkt{R>0"iEH3 733oإ3(s<9^L[^#gmB L@WP\n (,׿& ǝ',wNZ.ksa6$쏎c,0v|(m2ΧY(+} BJtL1Jy)O\cU 2poZS7@bDE!mJ]|:vWކptHc$Aɱ %2mHB0e7bȄ !'7AUSH OH8i6޶/ӉCKаrNft_lYi!¦cl)6/Ah |ee<}qquD)H;B9Oeg!Ny Ά aYNG"h-p$0fGPHM d&LɑLL}nnf(Pwg`4 T Q:bgEl]胘߼`Q}/(ѳʒB[sL1< KN(E!J2I)qpj)A[2|͇l*(i~h$cEW;,Y5$^/p;O+UL*y>ă] qebU ?ƎMZ g٥Rd pt?Xs^La ˼:}Ob^!cNiu(M6|ķjTm\U>@5a< v;?͵A||+ v u: CE?q]D4\8,׿#.2q:g({ hc۲L. <%|U1dU&+–|Ɗ˥ZLzDh@zDգ,2MScDmTBBiGj\z,$i.dӂd;:Dҩ_eW>@e/PG !u0:It WQ"[6ycG\bb3-y<$0?a:31;,h]Cf=JAx{'*BJNq_ʣ4Bd;hUg M.`Ae>BwDOIfƺ 2.a7y~$GQ=nGzYgUC!s"{yJE @XƏ\fW=!i!XWNI" ckM έEP2J 'QHZ/,(GXBY˄ Q'+u''3h`:*xQH(yQI .|h#Pj䅠īݪל۾cbmcm[.Eb\U[i3(vڝdOGqXo%$3(v eȷW.,?B ԗSHf=䙿H9X `tu|K3lXIbCh˾_[Ol_4pIg@m6"?M y(TWq M=>C`Y6.:kj`R."7~,q€SbJh: qE>)3򂆌C$t'Pq#?0ؼ™y#пYBPNy;OUpgze`BWt(,E+m >BgY[؁R/pm~& ߭IH ? G<8L$Lk&D g׬ \ 0ʫ\(+ "zՅf4QRW:OL${7J8gDD$;`DkzX^&:A:ŴgS T*VnVփ 2^`%;P{wHӃ\ksFNSzaK 5!ȧ,B|26/,o#+T`WZ@T8( ՐUSak0߿#ZlBEΓ7r ΐ8BB xv A@Qn爫mCiIŶr|&sǁ FܒoMmet+ލm~ ;ÜP k^сMvdo`GVa\?Є+Bܵ&XEer8(b5 [m0Y-Eފ F<*ni/3/: fAcZ˪4'nˋ[n Xt$8kyqOپqȕpzddžE9!WZ t¿ؘ-xU@V1 4t[+ˮi 8)29Abk)s O4n Vn;dܤCE*O4eE_8N[0}KŨ,6PLWW.8ȴʃ-ѹK8qS) 3& NDkO6V@ Sp[km 5U-|7A_y'^ -]5|{4ͼ y,d}NJS*2K:.++m8try^!^cNM~Ɛ7D8-h ш{'^^g&td If"'VH8XΘeՀ;#[/ɸO,06`UdI$M¯| Lf Mamm[^sY؅Uդl剠>(.2ed"nC$>!Ui;ob͢Up^SAl{7ΓݬIghL{95)Ѩ"\L:~3oU_gu[^L=[zvz aÆr[ܢ\y[_ޚh~?gI׈Xڑ u6)QJN*nw+gqFַn}-oz͛7ֽYY]֓r;\4 p}qz}~gxܦ}bBveaGO/_M74:6M'8Ke; /o~+׽vT^׿^.2lr5ƹظqq6mrq7\ A}xғӶ#N^N'`{>k8OAIH9)YyPnu[y ['Ņ#!]Tch_, 8}wٶڊ:i y3oW[J:uL7:sI~}kSV)ZK#<+o&+=: dfsO/mYt'/-DWg(uŖ AHя~rnۗ:*[N*w}sہ~ i,rOmo5Yx:j_Rouhܾg!> o>=f.›!qw 4 W\qE79;'xby{S>{;VR@ L'M_92 LϾSV?X!08'CG >=+@? 9>$vlmsdy콖V; Utv^vBҁ: tk,*vf1I蟶r}q 4yK&,s=ö-@;MCx9R/sD팎G->Oo3 /l}_O~˩j]ouBHfN#K~>g:OT#' Šb12ځ-[rB^Ic!Sh+9v_ <8OGfh[ϐmEx@ 9{>V߻5}j_WJ_=G:}6vMqd:!}<)+ LwVg,:I[EoА}~_O{t/sml!feQ&im|=a}wnktܮzouCat]O/|NJ,S[휴r~kx 0Q.*tLd]膃@CcҭU:zơ]yB&6#__u][u<#D&-8m{ȟ",{:_ EH/y`މx6{"{RBH;ܾz6Z&L[s^yʁNxB i H/!>fGi h@K -6O'~=&D 6ya4ѫ^*˿=Q?հ;Z޿g>A'?Y>__Xه3 }C?9ZNO)iOYƒYȶ-ڊ=r'$;& $`vd\tȚy"YvGE4$!% $xFW)~[ ˁ_)sf.8Lݥ[zl&|/G\$?,H{׻޵< O({ߖ{ޅ7//}đ00̇9K<Y 衝S}n_%l훾kħinkv Hh B¤"0iO\9!8R;Hsчٯf< nRmMt}r# LǟtIݥDaG>&/R9c_r%ӟt93˟j{*y_i]zY/ɗ#qYL>Cqtq5ȀWw8 Ur @:oUd0oMq, R-'L`^e—\H'"IOBn["#=@kIutDz]zWy _ݦ?~a=}L~P'vޖ $a6<ܫ;OTJ$à##4q9H3ŃajI\4Kh[tص];h!!G.LVgl>i!2I4ju"8L 1W~ 7 7w_$" 3xдo&(A m[}mv6}s5.V>¾nRva+o^'dHLw5*%DLde|$.aMBhݴӴ468ddՄWUų>u5<9)o{mo{r. ir%x_ 92 ̃Z@yTʛa<Ҙ ,<$H<{c  .fӈ:bi@r5r2=0m9G ӦN[Oܾvxvx: J9Hy 7eژLgg^6/ۃ|;˯O}S裏_veK_ԧ>uAkωL{k=i-nҾ6{ZKeݫqnK[N\KG ӻ{Fqct.Ǜrdi840yzkP:8]zO/_ה?v2y7xYn\4mvt^Ӊph`9L-l)yB= R=.m>5i6V+^M7?/}tA+aZ__.D>}C-S6ۦ8KI+_hRIZjr6>>IkyZRZ<$=͝kw,\sMri&rq^˶}[Y]Jԫ@u]HWk9k`iW}cu֌=^ݷxwx{<>5إWgvoCKO<)ޭS.gˡ:M؎&idf '^[YgU9o|O7VT&`@IDATI&@}i:7k o-|#~W.r޶+f7ko H /p7w t  ];͛7O?RpwvR+dg}ʛ#< C@k;OǽSW~GQNAN=򒗼e]v*k55[4ov]{N\sMX׾~fϕKBCPٰaCWN@j{;ݩ\uU嬳v`zQ+-[>1?ֿނ)K_R;NiO{ڔ~4"rg,3ֆ6עkҗT>w{y;9hW 5^?G־?׿}_Q~ ^Pm^w t = g^M>g>Ex\Їg=Ye/|#\DC-*/׿rQGeî5<ՙ^ K~hY%@yn^*0)zk`i[9+ _W)Rw+et{Qܲ㙧O>o+>/mkk`mj;Ok_zPqR=G˟ٟmPv4:~!+ <~鵚B t駗-O48}_\UUw Q w5V7MKKM;[kė.kjh'koٲf๦ /'np JVZӭԆwH'pB=\޼X<-GO@r+(bH DZ;gb;<`@RmKѴߞ g~VKmC6پZ].6oKӨ4nn3F?Vy?]zW-nud?fh$.w7 Ïx`??6mev3OJ*''L҉K!q-x^I%΋}ы^Tg7t5*!L3t-g$}fv&̪\o|̰M%|ԣ眞+ fvZ[ldd-M>au5`5 pR%m[R6W^y~+md?F>8 >vnA2\*md=%MӉGq$׽6Xi總tq0?]{V=uWSNNtnf836i[4R0CJk[z8ޕޛV^0َVVV >zlSEӶf>iBn4;OSoSRu]W5W%,U1uk '2tAs-wYiy.흺i:s ^2??&t{_VE#6G>e/+62H"gGdx"4Н]߈\4rt{ŝN?]_.qjn?XvIJ|j|B`ׄa yꫯWEO3 j3%7~cH 17i;O#]2_@ګp7x9gfaGIZ=YlIYA'R,W+j5Zfb!f+Xft&=qcQ R ]bT8JG2C s!4ۓ LՉDŽE@p@ 'hY?([h/֙w?#u̻kPRE %k;jҏO_j]T-΂/.eO4;tӦrqd8Mew0K9,s6,[7B; vpp24[Ȑ |;c\|$@qxLmClQ. )E8Β Sz-Hsa` o ުp K&vCYN3|:ˠ|*w' Jy .vڋ蹵i]#*)@wWv!!^g(51$4p0Gvp*WǟvCT'3‘AFd[ v׃tOn੻W9LT򜔁 i)X,,bFOy &w͘W,9ƚ.r*ٱ計dKCQOuhBIeE#YL_ۅu6(sCtq{lj"-jK=c ;R>NoGO8KFaN/o9{T1lǮ]@NB|I<9oT(m '((q*e:+/<:"˺mP[EDžchJEF-8_E}V ĵæuA⩓ias8C:Mnk FwI @&\4ZWgED`u^֋e~ NX,S8lebq ( `%^t! &ƺY8"2"8 ł+>(h7&xՇi("q{!PMh)TND t6le›Q$ᬝ)RFƢ#Osp u⭝F/ؕKZm{CP(8ǖ2.h5TSΠ[ukzD]F;L<:߼Xul[i:ўm)zp5['x$A4;]JI@yVDy.l1Yȃa*+d8RQx fӯJ`G@%f꼃صAGpSpҍd,gWl;z|*CgRl>k<&]8Z)`^;Oxh4i^Db>&zvpإL^|xNxC<)`PsN4=f頉YYLpf7RyGZ4X#+蹍6q0P6Rfa?7gHإ▆()@{)uDv2lt:QIa۾[Oj/mnm4kGSR!}\3ZQ–c|FNByp$3yi7?v3dɋ UerCTd~$mĹM ͤewqA rX'>wg떚v8!~|K{N6λ\m.G??8œl]tD!XtJdW* 2WtҾm}Az`<-$DtOĔg&BDxIG)b[Adɕ xMHƑu+^PƟtK\=881ptvjNSCȓ|l.qթBd!7A.e(zg\K[( L 8Hm)SˈZiVwl z,׼m7&nO*ᠹR?$HhƱgv@ҔE?4ӔvJD0ljb8aBǴpiqۭiFr2)pmvM_fG91ᑎE;N̙DrWB ^ˌNbu&J \WOWWĢS ѳk{qRݤz-n -&t$S 8Z*Ԑ).F<䠿)8!io<w؎wtؓmE}h<:x?^;ߚ>~ZP)\nߡ.oGȢn) SO2\>!8ȚCӆ攌K`[ 3ҏ094[qzI,|XZ@YT t$$vͅoI&,f!n X@x.&i1)!۔{ON^beQRXS~6~u:JPCeӯHSQy7Wy.tC]Uyꦰr!IJvQI!hפ?&4Oő!U0΄ p]e 2;Y+ -vHlߖ꜠'N5w(,XԂ8xf(ߋYMiy'Ar5W@C3 \諨xm7q%:'⨰;S6 ]%gw\;)FфM_"K_U OA}yDBA嫩KN>`ͨXf2!$Q8)w,0AhKT9٭i<8`G5\,qzW KiY3z扂f]7vrPxLD'I"ϔ}vƍ觩@w4rBi\L20aǤ˹N:1QƿA'=q|, t1vi#}H_||$H#,K^B#%!(ΫݘȫXLYQH.HV!JTlj+ǣmR<(8F \,q#?8g˒܁J{ HOR=x:zɤ /*:l[\6æ҇ʋlQ"s58I[ٕ4A'A8ׁU~#I#!1UF.k;S̛6Y!vtvA(Pe Q-ѵFR|ְ6P:bPoGc~%܉lEN?O46BdJ{Hfa2uMh'|];Ɉ|vf(2̬ßNv4\yEh7ꈉ7)*O#/Ju+Xr][X cnM"kۺ*XW²{D.4 ބ-jWEٷjhf s zJFo!ӿ2R;tcNǼ*X$igk{,u("=c9f}|UAW!}fQ{@u;NcvPNǹI;ߤƃlr&l1 Yطn3&N+ԕ<]WjD{ 7bg&39>V90a)Ʈbp'8?m8ՉhCM9(`8T(b5 F.[+\A9oɜg^\;Y)X@jHTϳQYXdBh2hu7y^_ý*XUR6=ŗj8.-(J:':>lNlпa,Ϋ6[&g$|ㄎʅ9!NekG6z|Lk>8Nlv¡" C au#((5[Y0;N3yS2>"3i2ryϺ*LXEo-0[%yaP?F/SGxR- t] 0ys*|+jVc~ C:bi$ &EXXG5Qa ZRȥ~"r*ǔ;Z~^חޘ?m 9.)!Tʌۍ^hn|^̢!h62D[eFM@UsS~*jJ\mOCSV[ڠr3"״u`kik@|]@N  51XZLb4tqEȎlk&Ӏ㏝'M橎RϣhϷsTQ̤ޗ#RN?'xK,o9r)^>'w VqAy\jǪRJAs'y޹[ٽ0 )].KqYA9NA|Jֿj./(] ٟ-$海1Alw6i[{!YOT 2y,t;Eu Uq%Y@h aFN iՑyJSm4 ׿>_eKA;N)<]> Noo^V)ޙ}wc;Uy'R#Rr穴NT2Fdmd<ͫd԰HR#+JL]&\`r5t#"S.9>@ڥl'e'jە,\-AAJΐ'}sCWYrPU[ўXL;m\H ~vov牶iJOd:~Iu%g'*OIxd[ -q򶝝3;a -:'-eY!yse E)&)gꎓwDn,$bB wi܌vJ=dҡ̴mSzp>)l.`ےmSM2V/N0k&Li 04y/$hJbԃ:YSM>c;cj7q#" Ct6mLkbm>450r!IOL|8 Ra\0$ 8XXGa3́w)8_6xï|,/7 rY5PӺD0b>&UB-ǥ!?dMpxy\,/8;:[\Ch'?۾niI?i0׶x'@%R6L'lpj2 %T\gg -c+׻*LD ιc<y nQ壝l Cū߇=Q>~\Y״hdZgKPxf@N-<#>8M-4Н150,&-5Iyg'@gPLj%t9ױT9q irP^SX/%w*W^r\rYm}rQ\gn-ił^8`% ׊2\a[6T?MTU4=b7 E*вT<@kBG-Ù:-ٗ"XQOE)7I.% C ڂUt(ݬEi.w(v>/)t*u+_k@]5gllDoK 1P"/xei$zI n2>)K ;R99CKeM@DG^Fe! Cz ti::v!앸43,}hbNLL^ÕvHU|lOC`oD&RLܢJB5 2s]: X'Pca$H'q{LQ;/8K,*4y 8*^I+I@Ks$ ԏqY}< mSB BS%2R,0кl4Se Hb;~̚C'Ҷ}vuGԾ`!ǶҤm J!اq!z~:nY䨯+ˮ2{dL¯.?-{O`9Q^`%7C!Tt?D68<n牝);-(Z;ybW&36=uĶ.1Ύije_{pBv g<k 58k`2pP< yi͓׈&s11iFnNr"<^4jYCI#9$J!o9!'czLV𘻖~\tM!C;_THY28?qPy<8gYpHqD)PBQR1!cbj#6^2dEQ%q&QeHBt:EAbc[͗?V쇕}+?CcSprij4sC=S  MEyC%GPO "p9bFEu ,^.]vr&Rij+&: c"9\`2EW5Nše(|"+_sewLSjNW!/Pzˍ>^^?|^ٺ?|O/ʛk ^C5 uUumNྐlS\yI(i.}&F;e@R|ʩxDE2 6eZ#m<4K8wtS1)p`OzxdkUqLvN )aJ.K~X2+~9gU??9q/ˋ=B"M*^þXf71 6)'ӭ>㵻N,rx8u[y0[t,'..4Pi,ƙvxP^fr˫ʠRWK3%1(t`VH}G'; ti:y@ gbb!97d'$| Dk2DRD LBN)8`*`~ȻP[N@p޿KzXǁ[ }CniRAGK0ERroQ20#S / ^@p dWtp==,mT?Gnk~dZvǢnO !ȵ#QqNK@:JyW:mWVGČ_g0'&>"Y , 4ϳDCN5{fq(@)*!BjɥŃ~*%#MȝS1UdL>47 0=TRlaZ =W{!b pǃ/;N(iEp:aZnCfҲ;㼰w_<}:kbEEK^^}0w><紟+W Dx|4ٱΐC6^u h :)>LZCA9H4cpBQfNrBFbf=J dLVWjReZ`%fhe8ERqē~[s2QX~tէ_3N<hy*d9M?2'Ex׌ApW@H0G)A(AfMnh*5НU*o[L`SccR<'f5ve|fVvTvw>L,CSHaw^efWb2 ލL[}׼ ,x~HyvWTsz%i:`GJMŭ⃽X2xyA|džbɮqBbt*nձD_=t ; G1 k9C'38ËOJ^, DŽX5&N|Tq, ?{^rGO;Uv~bK!/nFYJnkQ㣺628t`:P E[I|cezypG4zDYH f 3 'A7p@SvD&1Qto /%4#u;O3\&Ofde$LCqԮB0AtS/b퉮mj~I%KGE_/';Q ] sU;)Nxgkɹ@I6\QQ]qQWrD+h@8s _"z9srs%<*{`,x{.Hwܣh򍌅*E+/C$8)~,"QdeGC.* em?о*Qix4PtH \l\ӪԺ#Hܔj5j> 0yV5)[tyNhRwZv Gc(*~(,wDO8aH'q+;H;M}00<(}_J@IDAT o89r*Δ8-NZj4DUiE"oo8uJϞi_EׄQN"/SUy$'_uhYl6eIքx̀¤@Mx25B)EYbZP> pϙ. 4)MX4MZWnUsS} IۣYdD޸]RRX4N p:uێ»'\G'ШJRr DQ)Ba(RSqJqs @!>5U 44Br7UnJA@ف*PH m@=giB"UDm|5PwYU KmW+{pDG[ESoNm{S79kyhYϙ."OHFmjŤsC=5Pj`5Pi54XjIP?zǮU o [cll;_hMB35)vmXׄUm׽vOdJoKMIS> D`" ID(wMxurn۽^Z+N-ˇ!?)85ap (剷I儐g9J>X:Z54PE,N0viH95#-INj/> YߵOǯ8{곿/vvZ[M6եnMWy5)#J޿5'^cL;Jw+|i8 Ou#hc#ԋ/+Ep9Cۤ/4m([B!#$}oȜiK$!ӞX`J9 %͠v⇏8cwqv&{zK[)2==~WhҶ5WJ{'$_z?Ixrǫ[/wS@V|.y#w>s隴*~G;Z .vZK~e"MK^T50ȏIU ҃E(eUEV~is{{fv$Io׾3Vz]v+=}qdbdy$K7i%mDKmxT9YnRDOڐKmX>5V`b`%+}4;mo6nxOv9τwӶ^{Ni|#.0# |bnQ` ۧ%7dO_:p}W;{/ީ%CMؔ34+^[kU󫁺4sh=Hq.Wv .ϡm_[ LJwٟ-\/ہ{NzuaN{77{?~ԪvJ_{"W@2O.%MC 6VWJcz}}&jLG'_ř[2xf*ϢT&\c`(8e ,6ְiM Buy/֚AEخ 9l/iɶ6Ya?5a}]ue:Pv^aGfHV3~E6@w2gnVu߁R?lKmv)ݾJm.=ؼNAYx}&W-\{\p<SoK }%wliѵi$ϼ4V@ S}N %D٥ 79z:66u_f4{lTD3a*pT(6ޱ+J9 CR쎻)*-,D7Bۥ'&Y6] L=ϟR:Z%o,]N '7>!DcW}xt{ɗ9S -HK8'l +wrX&ʤ l"9t4>yP͙9>.$sTstZ;Tjth%,;g'cٹ"pB~Aַ0{@ǟmK?cEvO+]vvӛ۾a5{9Wm]nf9ߴ?~q)v5vD=0}_o+;=39lb[v7g?F{[Y^=mClhˋ.M/]pgRW^nάڕ-tْ*RzI? .]X #i; 5zՉ<RsX[ḂG<[G?H=mmbvfnm[,,ExU($~A.} )}?]4f?Oض]f5wz.0òKP'E8g5CTy`5^Y榁ʋy83_@хu`|:Qn=8-W|;6pnCۆ;f{V'/}Cy§[sOmWzs[k~dsM&3t. ~$R Łh uz*:v@ӘS,(T Ti=XOp,cj`MpVYS=v5ڱ_˝`_nd;c/[OAtmfڭAf41q;'mÝ&bo2nvp{Nt]Ss/^&Ko̖U/6>>f~]=q;o5U C|.8YՓpc% H<.޵$l7`xq+jS6^ǦhM[W>~};{^e;m 6fR-\3p`-gBii=2Kmβfi(i{>e vN< q=e?^r_}O3-ecэ| 5ZsC/?s`=XΤ(E4P ^lVs:(7چC Yp̜<6O;'vM-S&^4{ֺ)277{=e붔z}m $]B)p&Wͦ,ge x̜i:llWq\_8쬏5 샇ʾuӎ>Ѯ~Ua!{kV}pD]~\pgG:4zKmb4Pwկpm}]by M;U$`lk;Lϳ ?ؙuuERr˗f/bS6XÖ"0$vۊ~/z}Ms] ugӝ}CڊqU Z8~8aOp[|Gͯ}my-mrLki/;ۋWP-{KLej) dls-)sX+@}^w\E- kTtEgAy-_~ۆOuW`$7{}%?οCӾ#lSٲ? > )6UvoS WRM 3ZP-= p+va{֟/OԞK?g,OAͫ_*#߾"]zl;Jq=t~;}kO1J78xы&po0o!jj`;OCV]eK, ܻB&D4ζۧ~}T{k}ۡ;X`OE{zN麚B_͆&۹69[v҇_iˎ՞xH'eؔq,P%Ͷ6vbWYp˾zM])^2'}o{znn;lv'N_8B{xqjsˎHvvYI:ݰk.<<W ^X#Խ3ϰ3mWk/4,VT0ٮ, |I솗ZB~/Lϕ<(I.macM[6ݾf"nqPڂD dFz;UIk,oJ{wXCmj?u+3~D`y"g[< Xkj` VVI8tT*g.q-,(~­7;}y;M_XF^7el7^q3qJ\V%No}!DŽ I+ ]wZ1V)dГ M{]aJV.r' [J ʴN<< s7)t3 z[YO:wrx f7_O^rp+Ϛ޺uW%6[q)F|̻!_0 {tu=[?~:g`V7yaGrrG]2ѩ-==Z0]r?`(nkqYڽ?.4hJ5N8'u:z_V5lԀ?j3(gB<tb\4+L"VY学o,;CyHlƴ-ΒI.Z$.vW$F8ҺZIw2g-&xmsqP??`쳯~v+$un z,D|-cѱШ(:r5ka>4PP^eKrRA,ЂK-dt69ӧkؖѦڵg{͖]{|RFz1q/w-*G#(1a䑢ʒg};gߩK Nc|;"}5_4X.yZD{LJNmx jWkip&]}> M2^Q=lcPmIoq/ڏ{xQ=|{EI6^c gk$_ 3)A H8Dpu`ךg vqTЛ\yI# ^X\yO+mn'q|ȎvO|ڞzY{/-%b vh<Ү6g@xYB30!F$~}r3أn{p+e#Gt=n=Sg^[ڮ-6՞ƞ_qs3\C[cj&?6QAwyc>]3NŮ*;]ҏU ]vC]SrRt+r2}ǝ(8Hg:HЫƢߝckԾtnvA_qv i;uk#|3qWrLHCV4eUykC_1#`px84vQؗg!ӉOW J^;ۛv{?mvgZCנz>fx[=Ӌyҕq +W>q~Gw6 'HW&v6|vД&~H5{LΓ>)c޵S_d7xl گ<Ȯ>飶]_±_#[w|7km{E,^I'n%._z4iLwּhJ皪[j ̒$((Ϙ1fj;^6mZO;[o:ʖ\v}7)@Ar 1VXЎ-5^.?Nc)oڣڃw=jOL격Ӻlװ5iMkՐ zޭ[ό_%^Ɩg+2ڇ.ɋNq-'NP"?%`ƗB8zd=[ln{l"ػb_ esxٽ]is1F?Z%|tlt\"d̞aa{)}ne)SkҲjkۺ-kKodI%gj޺lVD}6"o#=e{qn܄IUm kl#;B|}>;xzj’:.0`K3=ϰ ԛds=!͇&I!% [);Kmvꩧ +v2xݧccKl2iqwp=  *hkJb2[X]!r` d̃8}xtL׮FIP%W^6ZuUxz!%玨cZ^,xлK?M/v JSAr`LgӭAZҎ,I]`n m w)xvbܑ{#0nAO VN'?vV˅0֭i6rљfc-T Rj W WYNJ 6Ҫ-@9B6@&nuۤ״V׋<'~o&Ic蕅K1A8G7*dPYSޑDᏺhܨ3W؃oaء,{N GE Yn{6<'0#r [,Su+4pd g\84'."%zW;ׁ:o^@ R5w t:t"pwѤǍH$fQ)q3n=r9ly*r]8"'Yy .?n58u11"pC.BG1uR 9 K&ԛdp "|@\+тsLkuy6,7_~:]m,<ˤ? as[k}NAR!9QaVٟ{*~KAL;(H.]!E[/$_~!秼o,C̼g H=spGu0 ׃40zN b#A94|h'i'Qhٝ*'ʽΙ\fy: @ F|hu rZjFQIΙ@ǎR rV=&=_v1~w+R<%j@˿R,RZ<ʫ Xh7.O^AhZ9QEppS8mZGTā>WZ_.)Enա;Qz'i*tTCEx-wx{@[sؼLFuK.v5%i]lςV #e ^ ֫ٙ=Ni}_+]뷇7Ahtc׍M{k%:=dzp2hv/17sBzkOQk}hT(7"':Zx3gܼ;R)f_|413O.cG`@$(?N1/ض[jgGM*,*ح @w0wg&x` •&^}r2!C>6a[6 PhІuʾzDO(p6ZmQ.D6oih|è*syڂ&ѮW:|#[Hj r_!O7.оIs<|\6;*KkɂvN6I1C/$́3ףi;{[1]8v6: S >?D NI" Ѩ@,G*oYa lں-AS_*mŽѐ/mKhw< N_gvh < J+d'Nӧ{՛' Ŵq%4ƾ8S7n#tpԴxj`VǷl8繿g#W@ FitN"뙧.k_Y{:u3f|̙1v 9ɷڇsB"y[Xb _]s5ޏmVYeA)0 r)c;[e)L #jS5xH4tH8sqa|$rl mUy:i8n0,F'vڭjr9Be-y9Ry&M*m<呧m O~dkO#{~{t8rl)iND c9X2gN)w.9oɟyS-}Ž97S3G4/ 2O{=8cf6yvx=C.W_mGI9CG7͹MyL8嚪:5PNz:NA= +q2A\(X0Ņr3xBñ7:*ys9vs;N9>jq9zi9 )2|k>߮tn饗X7vg۽k_%/yɀǃN9;xvb&%@.)eg}#Z5x;{~ٻneHi%@) =rei~n it\G"t(tH8%h=ŁŅrš3risLEH9Ww9/X0G.@5Q''ecK6rEJ!9v>̓w92/2'iݚo?;k^u]H[OŞ)3o;w#9<ҁfyQ<@Y3!qLp \(Aj.&I yMç;$RF3_dμ|#O#%X)sƍ} R|ғC 43h"OrNҎsMvHE: iMN%, ҹB.ipNԛ @._9wHfr3#kN[SgcD79vl#`!Ǧg>wykm{k0~.vھ?>МSMM,0/:MYMtz'ώU@ Fm$2ǡq4iQ9st:\9r (NrRnsEΏp\  9M\\>T4%gHY')|eY`sz✠],3HJX.  r3O~r#!aɴ]^sGRNp YW~3? . 7ܰװf6 rs);Iy5U @ȅ 8:!'5R@ꚜŀBYL,#rR)Á)m52m:GB' NڔptriӦ٫^*Nў}Ϸ/6K+5mr(9f93OpӨ@ F ]x@sqhQp2䝋"35> 4>eR.eNS^tV5&p6Ii4Qdž,`C_)EG[Xc ~g-\K7i hvӶi\S@jԩZSͅf=悓&] N\k`5\@h)ͅ#MX=- JӖ{qnS/YO|“Y[O 9<߳6̍|Tvn[Kl9y:m2k^5jT`\ :t;n2̗rH!YkaI\'mGKi}y꦳}Ǿ̍tTniv*?"4~wUoʭ媁@ R5:P%V t.Nz'HˆyS}OSIgnV[gu:Ij?>ɓou]mlo܉N S#^5P5P55;6|s1O~v.,~.bo}zmŵŵUUU#@zN}#ZC~CW]uUS@yZXT T T '|6`{'rHTԟx6km뭷«MuiTYU T T ^=pb-Gp/ats]ﲷmƭ8N:RGP4Pwk#UUUsjo馾_z׾vN ؽ#|q [eW T T EGqNoxj4= &if?RU󥁺4_UUUCW^o|Ͷ& MPjiWYJ': AԄ ^iuǭVXz;cYɪ< LOjjj`5ֱN;Ϸ*_ goT50\*.MV9UUUs/w\X*j4p۷m2etM6yaZEv ԝnuUU E<+ x'(oSN{}C\uå4\r\`/bK.kꇲym oASe ԝ3uUU@3f̰>1ŸvxތKIyp@yUުyh gCV_}ul&MGE/ (}W~_ʫj`(;OCZq}Sr|35p)o|^=7E?jjYq@"0%n|%[B55?y?a7jj4/ U|@@@W_l'><`_v 'nF/Zyjyf~t 7ػP64PQ6uUUCư~;MӧOwGu ͮj{ ]cƌ|;?"/~Wj:Ah) (dM㎳s9X-? };Λyy&{7S+q4z5P;uUUo L,G}}w-ܲ zDi%/mF FW T Pܺ4iM6ma'OO=΃>o n~15PwFV T yN4sol o[MOG}?t iLrb@kӼ9ʂ38ßO/Z ̘1>/ؿ?]Qrmփ~O8 <-V\5P557,Wbv7? h`ʔ);_5N it{u@ 50Нɓ'~3;B%_k'w 4h<XP<4zٵ^k{ǼH+W\~7%_~OVՈ#ӈ:@vvqGomp7_-$ Ls=_> J44P7uDUUìyO|;]W^y[V_}un7l饗k?~sȑHs|,wM9w$C|Y7~@-UOXpf0,n%nA5xZgNs3Xf9IL -9? +>3,CkB೜$mfcÖF7iOXg}^9:ÍoM0a^6o֛e` o')iAkʯX\$\,SG=S&.9:uͺN3G>"AykⳜ2ˇJ^*vJJ{miߙ'.%l?}4i`YG}%M{΁ ':iر-Zx2ߙ©>\Xh.Kυ\} a?0|gX.85 s/hqi]zƛ§O{5曻<6s.lnsmj`X5bWY&H3j4_$o[xy9sfks3|tt46㢞cn9|,[n{֙{쁔byZڮmU ,@ ҙdzi/%`c r5n uVJ6vL'`cy?x7vC>JPr˜wY^P?r2)vYjqOXZ[5lw&Q:rhSHʅ!tىW]:$ۦ n՜@c]Y=k^]SgpXt OPhfOGCτC'A}$?'Wtj(a 3vmj`5G3z^SϴIJlI'#I  }r"h_x:c=>xbuD#e<uRm]̃'x\nl׹H=h([Dݘ_䐲?^8|ާ66 ?,N0pqfKE (0&E?ZW` ;S!SDgK}3w;iiں>y T5k H湘d=";K~E-g->2nT$_kmxX+WL9,/3eGT 2u7`OgEHG3ySf% T ͂+/xn]fBU.ϩ[~ӆ&XP@pA,,tw<:V{_6{bqen9B,z.)m:Gg.JK -JX2i ;A"K :H'ЩurxH ޖ0MRxyޚ mJ܂SV4yF=TPDV- >`IAblۃ. sȜG/ RƽMwْ=Á\VDMӗQf^sFD_:S :5RU/` t:\< g:errBye,&h tYp_Tݵ;c;q>뎅 7˄<&,t9} 7Ere;W.fcQQHD>F-#8rUM}w`L f{$"32BâꝄ"ctIW`$x .Ʃi qw8ul] Lx:}Uoy֜>ʦ taMn%hj`w&Z ]fTa~A9p6}G98nW!ct" | ?%ϗK+t2[F<#k&#pggSl]m@(O9K5X4ht=dqd '݆8pLYţssJrώ;KM.%Rl"WoA)^YNׯҴu`'9=ib#̓ϢkdbO>"bp/ӶC(RV< O<2hJS>3“)a-HЦy-@j '0b7 S**S2A3.,Zr/dy![t.y ^p]oiϡ|CPs[g ql!S⚶iAiʭX`1ys1)=/Jޣ3q~,ڪ oe&xKp 8x>EPeے#%/N^rwE H~5иMZ/4A xP%jBQdCgs[eҨ*L\R\{1e~s) .ڔ#M{O[ϜcXU)%%Ev|^B!x OK !StG ' R4< y"!HJ2O\l:,0݃B !|TA? X $6VT lڦk%>YKA'7 Ŝfp0(`2iQj]50D 9br!!H+xI 9<;~)`=X, .#\%BßEqp8G %>??j)1s 4 3iajU50ȅC֐ c.8e*G w'*^s}hu#=S?y+ FbI^ݯOE,UX5x! H"[A)Rv@8 k<3OoĜUf 'uzyn(GУѥ䶬e.@VLubA8f*^Dr8'|^IQ m.暞>V8]Ƅ"X#lZ e\*M|KHPzh Ԓ!G+ hXD8bא_ M,Ö3g~)iC? ʗ56 4 { :pcTTKFq2dK`|7 p{!pZ,T_[“DЅe+L ;̊\^x޶Yp8I }_6Du{W_k᫉PE b2[kT_NS{K}xTeunwlDyT-LgGX` $"r Jؠri ^tpD((rǞd|.?O;ĝ,tATV#p!gE?ӡ,Ÿ\ wRi(e9cϮN:^P.>q2Ƙ694U KshΘB}w<. & "Baу \)z$?oGTӖ~右n>ϡeg5gy^,|XsũsG鏀)?z2j(X @|b">"C  t?:%pD h%~͸TX/ѮP{ii],o=YN1)e9 8 Ra}bkKpHHaN99K.Kv hR^s[l?|1v G4{'w[;mllg{z IA 6L1?L?_& \!] A 2yթ?GWPrU9db$}+g:D'@71483\ѵ440 5ckSeT0*nM%w8S갪J|B6iJp4 |[<ڤAݔ;o+.ZL^V>Q5X0M #YĢA]]G9 8]*/e zBCJyN<>9 I7le y,wMeb!CeN4U i(sS* UI {v!$QȺn}AZ{᏷B[۳?tom:}(}ruaF>N]n: Ωr\ GғG ĨװT%莘_c)~W"A< ^ 0ڙ_I?E_h+vpqͯXzJv_1s禢~Q{Z(W"?%8f~30L+r6Wd:6?q ?m]bn8Ob3@LmJFE0|mVsWWNM z|O"JtҞ8I>Ym=8ArN&aXl+5ti}9FQD?iK/Q.;:Z7וCW_{q?)JccXڞ6ܦ @.p^/8}?js\ԗ хAԑKC}v*Qְty\L"ڠ]s~s׿.vvɥ[;A3fﵽgK;t|}P|b:wH b/FOǽ GzmA*Ǝ8(IOU o/ BR(+锿hJ39s3O[\_w0Of]ٮNu &{^B!\|2 H?ӁTDL;T.ӥ _h};v5NCm?v T&dA*rTIsIH_hFGpиB1uY.u\=.('rhȮvʑb/o{o}q[NIi;PLs"'"Vb J*ƽ1\Dp<;p,7} `G;kh*B,'whE9CNrk'n +=6#$d9- pސmG+#KYٞX7H>otaqms?;IJҎBoHDyU)]*GX0ZʸQd{hq^֗Xb^DqШ:%}`D^Rǚ{5 LF|DW&̽`̆pY"u?kAuJNUf5ڤ_Gln]o.;{/}ke_z}G7=c6)4h>1QcIgw`KX@PJ/1PFo]Km/*떚&҉w:CE|1L7t]ܚ_ЇxϻPd U2.™pM@‘hLxޟ>/ؗ/^Z "К7;www O~]΋?WDPĸQ9t5-5e,3S^Xm;9|@)HA1N4*J|,M<Ǒym q %ឣNa}*MQj=y "O\a_$żjGp+ e/T7lW~̎{n ژiuc 󼋯vݯ$;)5C'6&1!.tE/7C'<@FSL D-x6MIv']Vts SJG/< <8z䎖F;i6^>f[pjM H['6r;~t'ƾly;CV8"ITS/nSMMZś[SD90.Npw!4Q2Gi  ck F=ZMUxX|#rg~e_>y%]iPW(snoE+B˭@;93(\dPwyT~&m2'xFMih/yӦpq;BMנ1\m6Ct@>4% DExd6&v#N8TZwmJSk."^;cdΠ2YtF)E/`ʓiF]F5>P?fR6-sZi+uAq7 Y8*}\O;a%~{^3lK q+6%~uW~F`~᪻,c NIr ~T>wuii`5SKp徚dG'e>ѝ,(&L K;n3 JN'_ʎ>" |-cepx <|:^d2X4"<8El .WՂ '-,pk g5S2@yvUlXE9y4mA-<%ПГ37bAq. wrLE:L22%58{(3=*:Ey}҇4Y9|k=jIQŨj\q{MS<< ן,W_6QR=WV |ɫ'Y#sL4uO$+w37MmsēNh92xMEr}~NkPA }[tAұ~Bj?OI@G9`$|1"a%i-"rnDㄅdXN\Yyuboݓ=~@Wc'WLzt4{촩7Ѷaig|g[ͅECY"Go^%NW$hb@xh`Y).]XטspnbI}>ipȈ ñ$;j}cE"/9.z[hp}ڞ5)=H$~ ;PїX`Tj)hZ(/Ù*HC g%<ѱ|E@IDATlٽ@4)W&(̩Ku.'s P]wV!JA}8h~z:v{"on;q"hɈ-';4yJz}9kHi7Kx3*WbyIa3O:3_MDܙǪ]8?DzU&ÁocW (hX]^Bf~UY fnn[C̟>1Vz։_gm='~/s&^ǻ XHj@E_\TC6Q|nڷwQS*&24NxgTDB},7N'_ z(З?MUiTh [$mKMMM UN/%!*K( XxJnX5:|O:9\ O>6 ۉ_$/>HN;B0_L:|OsBW(v,QL|*H,];'I5iQ̕::(aaiEAv{c`^cA= yE[뺖,IʤR;\%^RyZ洍i.5/\hzMn1|L|p Q";eCU#~jߵ*I_ tT_M5${뗮*/m lf[o7z?o8 52[_c_ǟcR܇':'^c$rFƸ<5t!BCeP9BՂz=s+'%0A s)cWšáN &v^/۾o.zvnyog9 _"l {7ځMM/SGx_uIb4E(H!̶r|Ie-ykIO=?wM㮁] DitLy]SsSsE$T,)C)PuNCn8aQZkZ0_{w:Ie 9GAx_m…9-  :+2Uj)=}aiI(R]+.UiaTZZ ܝg KUIn=0-=+ʜ`2ۭ˴lct)%6¸|E>62J b"q}g;"9_ß!TR$u' 2h-xik g:׀!8V} &',M'w'Q mvPB 9)3¥ǂðp>GX eP %wֱq ~i-SlztnjNWޣ_Pn=MБ=,SUs@+ULސsI2 yl44p?@(.VEwɑ9 N=np76,|^:Gw}-|H3Zo&pwM]N_)7s_U*[_vlES ݀2%a:y>@˓#e-S0 ї{{W6KK1jPkiRnEA)6枧/Ucl!k˦>L oNZ7} R6r7-S-1&ُ|@vY >)5;΀~[p'7 H `IY9]!QfK<ԍ ׳.x'N~44k{\:*aUq1.#`>]@jNVnF.wXFw(m/acz,Wmi|٤5 4 ,rg# Sl8Œ煋C]%A} Jʾ%_H3ܦY  enLl༖qO>%Du@hJ9,tQm>(n |$^A0< 崴N5  ӻ+P+v?o|[vٗ6y}{w=l:.-9%36w~@?z?_@b.[!\N2Аy@<%/Jn8~[k?l=aGɷ/3go{-wD0eb2sU[olSXVG惜 !~[ʟnTj 7-+z}7ۜw .>#V[V,_ʫ\rghLW[y}[۽vZ}+9x[//_{*7v@'?;Wa{&ce)y.O6)Gһi4ēӺ40ťcrie2i K1~yulӵx: IsNk|ѡcT̮ՍN.|zu/7sVoI&0Km=ۮU??(u1KrT):=4)$/uo@jyuy OYV3VY}ᘳ2gmS5yNw䆮Jd\$/Gԁv֔ +"@ Vϐ&bbB_,lQɑ)SyabW@xjw5ڕn{wNMrW.8e}޽D<i!}VUtK*-prR{!]) I| V$73$/fvŻ+l)1͒?;¬l/y`9N  lw*[mLhه?uV]_Bi}pv7x"X+oT+cb/8axb9rə/;LMny3+`J=DGSPf8-xyijx "vݪHA9)T``[evU=jxS!fq?/b3ئrMmU:ǎ=G;gs#w EG}B}]qWXm_[^b_;+v7fs?¾O}+F뛧۞Եw:Lj7;h;%[\(F1|֋e!Gz[~7HuF}7z:|6-E0ed-{ҫVtS~%]؞Q_`'?f{Q}(8c߱C\vK<>wa\1z)Qnoo9vo_">?(ETGEG'!Zj;O:3_M1<;,b|ME9nxq~8|H7Nm9;5Ǎ4w~=rmlӭ7MKFֶvxWK=]/׼`+Hw,PxYO[|}G-~=];$Zik;S;Ji;3t^u5Uɾ|Ա3?{ݟi;๧vxZ[q::˲S䥔^˜==lFq vc_Mq}ؽmM8a?>ҧ)lڗ3ghG_v`uvu9ּ< ̴~5 LY¿$y'CRVX:FK;ة_7y)^co=Ev-\;;]= B>Rpcli%HRMЄw935JIAP|ld8_IDq/ϳc-m^oo>xGMغ_ fQJ.@d"ůӪ#$h: ܙ7@OÍo?ΞeWhh X Ko=@c}lOڙy閗#cOƧKpQÇ܂a֯ @<3n{Xx9]-i셧fylvǯv?>κFo(m_ԧ>o- =;LW:kɹ6$) *sDXxg3K:Qb+Fwo:My9ArI͹@jmʌ\v<&קIhut2G:m;%Z݁G&7ĈçۦPw+2`kFP Js# |AG{uhOH2{0X2ff?(b@}γP*㢔psP˖OuKḄۤļ>B`83^GmϭdWķaαZ]pICv._V߄`r7RECL"mM|]/աO}jf{?޼~ہڂ*j{̻wh :?9>R!b[;MMUYqxJO%DАnhouve/֮TF/:λ O8<5/?R4+j08ҭ6ALXG?6j#-zNoQk;!G_P c⅄Ox\9:^>C\$k;O[M+^pQyrA'*xwrozn*yQ<Z`4|h9O7_e\l,٨Gc O.}qzc<v n}vM6@o޾W%6>4UT&Fz]ȪcynQ;ع^__c u@[rk~Ђ!ֵ)X.ޙ'\X =}A,0A#'wVYw??;^xAY=`gpӥ !B.qd% iܱÔp`#GFB̹u3s{J?3;; <-:Xp" 1x2R,hYH]d F|f6h*f֑KO7fm^0?>-Vzvxl#JiKz7z ~E{|kS3Om.]"͹A+m}m+'-yLt;{&ҙWݡ=?9~>>~#ڻ9^@q0ƨ6/ЧOQ`i X:?m j8 .uXN'mxnPgpFgʮ~+loe1K$lWzm/Ev?ΰuL{bCR_5qwf |bbU0.{k@|}Mԙ޲z졶l>~{ /}Cv3w5_>B2DŮ׷=l;qQc_nw|-C7ҵzdxȣm:@]:-11=ɐZ4dҺ40>ppYJx=wعۋ~w ZiOw >dg^c7bVr}ZƉ[%K]xŝ}$'C,N.w1O;޾5rr )b8Aߗ"*|#OV@ua} ѳ򒦞ę{}eҳ?>6ՋD"w؞<ӾOkw6[®rX>n]u2Rnf6}ʾe?ra˯*,1:~ϾE'a/S*=*7hW!_?N<|Rϰa'ٓӎ-( dt[KӍZn8i`h]._c)Wk}sԻC\;S"K8vGt%3׳:f,'ig\B{='%';wR*Ip&2qLfUX0k5l49o W+حǾ/l k;"M'2p0evkeaAvا>c[]ݒx;~IG|}=Wr:9v{=>y|>26Ӂʎ uv;[qŗ|n#)ZUe{o}V

ۦ+fO/?"z+pK;XDw+/t,VQ@oس<Յ۬/ o9R\ o-/ou%~DF/;%څܞ'+^ [uUm̙6o<_6gg͚eٳgKS+9dJ6:$q쾶up~vm~vgێy=M/e ۙU8a)gr.TvNr 95#a. WUWZZ|BloG_!9쩖ϔ;ot&zscE<\ H?տngk ᪀*nkD#sn"k W\c7f̶U=` m67(#Y,HfS h(7y줓N7޸ul>m9OvAb>&*&JMnj ܥdݱ$L;f%!Q`cd;é XV8}qGSD#3gz̷ Ŕ MӦ*Rh*Uu5ȢvH*9SW_YKGբ -ŌDYhȗN8UB㔃Zn hޯl^k'mGJF;63Y,,0xȣ3bEU]IwWΐ|@/Hc2n5:9`aEk fm$z8XdqiN $WW l:_2v;c]Ȥ ^ [mhK2 PMB#GL_c}{#s~_AMPTL9_7V)_K.e!?7N5 4 pl"ó0NAܧh: .4PXT0ZCyZdQJuAtQzR(.=}TwhiIuTD3wFf:vɅ`Gz8WV;H?yzKP_/{dy4UrV+PGhcYɺ՚In8);j@zJpc}0kYQz2}:A;)cT $8hppKUh TΟ}RΏ F]5qw;[2qoo@))7s@i^a.-]h$O8hU]3\;vNE$5Sry/}9'>>ns_zl򫏨/^蜻u%/(Bo~4—x>桥ր3ֈ+.%ֵX6u!K9r#$`NQlgiˮR̫ 2 "kC,O[-6ׅۺc)W=W&^Sw# hz9$y*<ث>) N m/'Ij$ͦqӀye|;R ؇u4loc#d`?8)t<[|%:m$sЗm!s^ )8t^V1/XVXOAUR AՖ9pq"*HB:li:O;7gMRrO98Hq,0 Y~RVBF0hK">i觨ui`4R W gLN[NtXe}k:?6 #7V!n[[O*.֫"]㋐/Fȣ%UUtK{ɒDa'A|Ncr:4ԗDimm>44$_՛>.)N Ђ;N+z&q?vZ. .14A) r|gmD42*lV80GpvHB r0sYFV6&>:4 Ed@D!yh\cK~vx`"m uH{%R8[xоO`ZK~).wUTvzw8 !{=iY,U%`)A` :ÛjPQFU†N( hޒ$'xHs;l#|ߟS\u}JYoh/0O eȆހNs<]8['`|ERNΡ:6y2S;} 8i6_hE  yD)~HV\"qS}pn5ϊ*iEi40HN [ s҉ERcBOI;crpNk _([I'5I urt;ܾK-9ڈRN;a*|2̑q< .ɩ2:-dz‡=r#T!B cC#t\7w1c3@SziCY9)d W!PRHbTQrҐ=O xԝJԕ P`ITy'%yB'-xlMCt$uF9vViTGД%#_fGSiT=#)E+ꜢVw\JG} SN>';bC|3F)Ucgz%_LN zJe'u8w@nΫ2袽w1 I|8e-b1rcuܟZu9xB"8F"V) 7[\HnʧUVN-X0Ő<:`Q)z>X^qHk:o\/SWH@ɣEѦ G6YiH &t.#x+?ۼK-)u7Wuգ.@>K܊[5kG bQ;)q,xR|d$Dѹ,}w2R1X 48K\[4Ndxξ>I.gXs[ox%< /;y\e:q3bƸ} g1W4mLB& +fi2xIp&[Fzly)܃-yw:j7#i3yz?!yWrǩ`[Vp㕾 Yɿʹ5>Kމ[4nc Ƃ;m>@煖k&.rb 4Ȓ⑉v<$cAѧK{܁4 9B/"nbq^kG }!@`ϑiۗ y]KK~5d>:3y[1UF82C<~j (Œr秾ap= vʵs8uB¦%-zՔG!`eF_ιY{)9AG-M~ :k !s\vmi55 idJ'c뮻-Zdv-\nvy睶XXp'<*[h_11'9O,g̘_Ξ=f2t=fz;lrr-vwMƹK]+b|9/yWi86N>w\[o=&[",40t(EGDYZk-_0VYe_02bqa!%}}0gʃzl#qYOd10ִu^(Iڴw`Iw5[w),mLNpTey@f]6ȳ<.!-x5t0k  }Y8Hs'#wb.%<NZXcspYh32׋ z\uc臔JN 8fA{;gI)+t5RO{Ϡi(kZs[ws;~(4 rҙdEgC<k 蒆$z.adO}G yKSk%)3nz Y\~v e P5ɮa?zv;QeT`9 |E2bN2GBMN*!+)uGy0srl]CWi\5P&eΙxOԁx`)q=ւ{F40Łgu A.,ԡcz.&W%I?c_k|Q"rҐ210:v5i_%&Fms] gNޑb翖621#XZj I4 p,iSI90 (gД98C>eG9w1O0\,S z’K`J+)ǜV~U4e7 4l>5z󜳜r9b~r3"xQܬOtނp40Q҉q4?VE8  y<\X;r3/qbA>={)-x{5N Erx.HCk7"C$Isv8$.Kg;&k{vptEg^HYgY;O8}pj}dxivJ8rpG9q (%%o&@=ws:G.&Y9'_S%msvSIv ڼ2ت캻/Ǘ6}Hۥe;PɗY"H}M|b5 GJ.cooYml$i-O[N,'M]-<m˩|r~R+`w>^LN_''멟:J]հ ⤏_|P/ӑ&PA6!P&Xr_f1|F>NM?_;ᆏ3T?&DH ;D*_ P䃸0.*lB(}L6_f1B1f)_N-n/Ǒ(VTi @/L[m*L" B"w&x9rP|R?3t B' 1~F2@E#@${+nAsa_(iEل!P:$Jӯb VU-4|0؉۲f"奺  2A-r&9 lZDt8L6|SHbԴ'de Yd'9"2vĠ,ۂq[ (f|@MoLVK-ㅘ)c'}1%h6e?_RA@ ق"|TGQ!P c|=<آU|䏏- ia%&B<*B82!.s>_X]EuQ4_r!aIBDmBAA@9bfZ$"'L6Yl0bW8a=^,@~ kv\qAPOEH <,!4p^cMŷ$pt:@O_a!vː(uc9;K"XjGu'd3!@$LAT-ۺd"Hk+RCzM -lc"!B(l14BN" ̈́@3b )ȃ9wa$d$'cwٮ|~E!܈B"BaxAfAHYz0Ānnz ­0bBN/DߢyH -d'03E2Ajw8‰kMj:\{A]QoM sadJ{lB(=rivFPͩZ)Ƅ’>WLOVg}ץq~(ژ͈OHEOA0l0EYoi~l_Gډ]o@V x4ڰMiSC&?[mJOՑZ%5ѺG w[ptQ*E:%,I慐pL { -l)Z q9g뢭NJ0,klUQ(/!`VQ^U9./+)x{WF>y/BFn%=@sp'/ay1rOnB)J^qTH`696EKNNbx_,P7i 3r{z癴0(׷û UoR/B~j_Yx 3yXF짔+bҰj|Cڼ_\ _d½%խQ2'e?'+-.3I}-TD #8x*{Qin~]_᭰!@V} .0mĽEeg~2uCV/1`H\> /)<;IaB5E1RP͹.bkg]|G:Vie ^A5o] ySS$!Os&\!0x}vz`dF86 *|p[4I]J5 LY a:_#zJ^pJ0V <]u9M]O\p-] ~\|p!-p>YxW{<bn/#ly5)r? oL9IT[ٳ~bv9||{ Avز?jX`$5w⇤f͚hҤI )$ؿExK/HX ?_ڢ[Wl62Of۔%-}g .i6 mjR.2>14SWq:fĮE/u cODi;&M%Sg uŴ^X-? n\]]9W8-N*!띋UoAhk*f/RΟsc=N,D'AbUh[j%?b=#L*YYJ)>*aѩ_|Q`|h<Dߡx3x|o ͛ϰ|r$%%a"#x*|#A6 C:#y?IW?0F` rjA&,ݸ A+q1eR@}Xif&P>g @$Ù_~/$3]SfbA)&?+2N`;$*V C/v ƽ26|x%p~=\+~B]굴]`q,VnmCccSSܗnKkoF Ŀv~@8VL>Ge .o#9]$&'gY>4w})̝`{7ǧi)vQcShVՂ\Z#uJz:Jc]0޽{B֬Y7nRIWug|bMh%"J=0ȍ=c{p6a4{-+(9("iF\`cY>S` 8w:6c8+ܸa֞o^@bDɰɐr { X-qEiFo^Yǯ~1Fyzy!P<5z,u)uknG&!N#ɳ;jwh"8T@Bl85;R\~I G[ l˛Jx+IjA% $Drᅾ34, b^@0C)2( s|[;3l) Z3qDSK6:FT.LVT&}E;I8s >nY^Q˲8>I^W'Oh}Usk7`~fɾq CꁝgEӽ+VPUC\"JHρ0 򍱰~ȵx,ndTgUr.bIxv=K0p6X0%7 yZ Nd03 %gw/mmO2ȟ5L*_YQ]mWa.&}t-f;b>v2Œo4lQsԵ9P}z_zzWwTR|)8Bif*µ\:nf͵MsKvVnHR `KXn펳89Eu0ߒ?eW4ײG؎fUtߐʹ˃4\hz0%Jk"cLCXM)$+uD0ua8= Woik$ܣOVαC'㲳q.#P 8o 9!?ن6콨}о7oaeqvu<8pVnBҗ񇒦.:Ű ЮiuK৯bok: ^ah3v~{ε=ub?,Z5>|:ջ~ivNkç ?ÎU{Ϯm,,WN!~\ ֿL[5vdnr|rۡ6˓ZfbQ8xX!]vJ@Qǎ;9% = Cy IUT_z-p7#^,jJu -c, ې=\xMLy͵OfP5=nÔ~|gv־&@6i:7{6!LK ǔeٳVvVn17gy, c,m ($K*f:hTzA,X ;L@yzM߁vȑ#+?5&<+ Ca8.J7e,AK̉g D/ ߟ.`J ^X?nޖoK aqx tc,^)X_c ㇑#c8{)F# +FA0-ը+'0&؃kiN/O6 c&vHTU$E}=,IU_jD6.?ݚJӃlzI f9۷M=-bѨcb>"|hѐX&"A,v42rn/<0[3{_j\jnh%=C7QS(/9 |)Cݺ#PmvazPH~?[#flMi,`[^˗`oyZDA= *iQ7N5qWGw0ivbkT?p2q&8^g[OA[2[eSl bN,_aSC(zEľ80mFYJ),VAvPi9*e: *eAX0x6Rß5SBϫF}8%Fw|ןEkeDd+u6dSƜFՋ=7qNʢE[X3H~ M/dXc[vOk6 r+Wp'XޫoW_}-[СCg/ kƍ[Gw3Ǻ[+>,YumYG,)d6̳(Ј dPTݟ.|E#ڜ<0{{fkee#-=W.^˗y%$@}1(˃Kr5xzvFǥ߁A5|xmnk" lzݼvBY*Nڤ,tsuPLeg#i|Φ)S)[$w ;4ɕ"'G_a_P,F>/Wj凈cC"kTTlY"DZdqmZ#<;+L"܇:,axQLfN…վ=ˌg֎GۆU TԈ߭35mXrm* {vk`bm,=L ŁHjbކMSkpdɸR4u5Ęh_,PTbxmtv0e=h֑飥5ZN}*[}A(W@Nc RZ>c햡Qs-tE?~XݩZ28 #sy՘FNXy(3'fzw[S ^>i 9^(2)hV(YԬ x ǖ?&u{6Hw 6y 0r:u_ԩS6oތSNPBӧOGOOlvР&mc IPJIʛݺ7)K^4TJżl+wT~?h}#wbo+ݒC gԾlKS{i∩[[0G-~Ƌ)UWWL/[}*8$]ب'W-w#L\? S58HB85ϸʕv'w$YlIoadQsi{!7l][ew V|2|=!õ&rR_e/\ٺBC#ꬆfaTchȯ$ei\8YJY62ҒKEd?,mxdpwr_i~Д}ψĶmkS5lƍCHH~'lܸQYx5ۅO'EQG x6 _^6;Jpppk@v'K"kG,ܹ;mC뒔Tv l0|qk1iCk&Qq~V 1ڧ4`hH7 > 0p>Qӯd=bÈ\k㞞 [pD%Ҍfc<zrЬTAؔ Ө1q}s'ۖZꚖ*;JȖ0٨)Ђ͚嬣1Je̡]ǐ%ZGZ3E-/˲@\}zGW 4=v)ٗ"qNWЋ[s.MaLuvL?;kիW+D;v0 MCB+=C;1M6g (qh.kE܌aTrnrMv0aS+:֮_2J) G"Fh*}/~r2,T{]ѡW/5 +c@(Dp<NMCVV#)ذ(<c<5Gz)=hR.!== B[F w\]*O`odIz `l9 ٗKL[ 1oxCc{R(vEBPrFk'\+ hrl#>1CNuiQWbVNbӖSlkP2NDym;gȲin "'_82mQ!vm$1neں]@1*Vn<߯]? ^le2 M6U 9r/*SRrp9䉷vF%G;ۀ5mrl?|=| ؼ -?dt?vo4,F=}8BDp^p&Z5~I ͝sn6^\ {vz6i_h.d!V.4nI9}XM 0(X_?7TII4g"q[4SDb%o6c2#sO] U5ReE{.cKE?0]D&s&N}+1!3)l9\ o:- s^S'(D{X;, ܋ûN Net+mB&.wZ[ ^+C<Ʊvޘ6Lt| ci>]O*HΝ;w};w.оS%xNd,j)o>2gg42YȥZW_y 秖?w\?`! UQH7j*MQKc$\+S;Lb|]ۉ^P,ε>3䖊+gL:-ҍ\$N~9 Tg"v"xVEBV˨}Y+U V{%ٷŖ9 O 3j\s <0mّ0FLe11\a2ҒKEdç_6[]&GO ~˱ZݚezZԢ'KS6n>]̏Wi79a6Φ%y85#dV =_nGK- upo,=%`t1?cÅů`cVİ.l 3))w̎bEW'dg ]&@,L~u( ]02rl##Lh|_;xk\ٸzYd1☙ɴ Y#>=wg7v"rO+>c"zDh :ihvrT|'r-;'m a!5w !ZS; 8j&M:E;wҖkxr}ϱ|<Sv~:BnsP!_+\Tը- w쌍o'`A/L{Y&?nŢh&5|b'aO" ۔WQnW3lKOI ~$lp7W5kVc 71kpI.=ǮB2N`wqy|C1#Y9D<wgV Sf4ʇP%KvίO%5ps3lB+4hzFu.hK|gTl$AZKNc{]F;3qØ6E\gu89@ИP[aYRnMAhqMCq@R˂\IyaMcqpms-Temqk㉫Ξ&,jL2=qRj9%OoL .C\j&#$ǎBdE%Y8& ^#۝V 1*XSX-o-PMus V8tx[wgpVy2#X3/[BHF9]1~q^j EۑRvQEBV)%.[|} `W]PQxRq}Y:\FeM`v1QIjUCZ s3);>{md:ih]=ȓ/D"WT1sP1YkՋHVM?9 _}5I hY=w&M`r\EU2)Ïm̨Z"v֡ԜE@]Dkb> [:.\3Wq&VCЬU4TYsܢQ@ j]py]:IjaPB 4cLE留)v)XfMю]lgYG~Kt$4FJJu$xE `QE`@ueɆƵMF++T]"ad Su˗6К@I"vґԌAZ3kqo@ǽ;D?5eh**xBeeg6XpD MWRC#Ceo̴veL-D_*˴dBl\tջYM/eTry"@$<Ѧ*=|*}7RL@[a}lɛ@"HH &-YSrrU̳#>iw5H9+h*RVB@D#K`RB Ed5"Ceo,.l]YLN6@Q2 ?m3ɬml짵Iv$S!`U6V`qBUT|UT7!DB  1s]"Ceo  g jUr2 tܾ[!`FϏ> BMCk#/!Pb]&P4\~YO" ل h!ykg-Ls9 ƈ@i"`&0'.[ahJbHl8>AqENKnBL 4So,Wl@p --#Co,l@kd-h<JT !PrC*!cy@~>X m]+QhOO^ZL ;Z~oRQXƢV>0s[ S.B(_ċ vRqC;d܄@E"`VPX ڂ 40[5j@f&;Mړ$!P~F}e=q&̂@Q.ma0.,0!GF@!FPx.1a&*":i*Ā,ȠlicC`^r" @zq0bl~ !@$l=B9b`5'yDkOB!ߥ1^MAF䏇qEqD=F.rşj`A`m~!&.|d#" cAbLqDEvoH2B # k p '29nq hfhidsp '?!@8|x!|,0G6!P ԩ E@ |o[ < i6XF܄! cQA&CZlfwHrE@ =nE>Or*#3! 3"d@l3 @$ @2by,vqS>WnSE!`:%!|k[Bhyi&* "<[!g] mV)yHh  B@C c=p  @$,=Arź@1i_~!Ez X'1p?ᤐ !`&7HrE@ ̼RoByaD2dG@;yn9"̊@ U+oB9 ʺ@G6!@8|!1^DPyM"f<@ Lxe+Lv *1;dBh+BP!ܕ`:(P@D6!X/S " ͎@WfDPh`.lj Bkˬ;`BR#PQG-Dka! < y .eY E6!@8 pP3+1D+qC A>1%,ۂ$ڈsE+EQr;X#lc#(O'TWDbfE 5#`{KSeoOoQB B&C™ $Ez!/T[!@ÖJMFbJ&B dH(AnB舘hB JJU$PvӾ3t@T4\aSťRorBiQ}w2(qK(0=DME$P4fd!B m )&p B ʌi+sm )wȩBBtв`u TL8 t~V <"H @H`NU&C8:)6D etDؗA;̈́@ rVfV#++v0 4+H"@$RvB!@3Dwm@rXtK@%B !"ЋԆC(?&B`^!bFYlBp\12= @_ ^6!@!PDHXD(c#I 7MWRCB B(< ,Dk0|_TWYHٷ_{]XI،çN4c3 .׾O'4Y2Yc0?[1mkH޼ [-E}I6XrV])Ohgc͵S_c˰l&-)χÿRh7/Uq8p<»r&J@W4i)߀Mw ̺zp=4N‰kMj:\{A]`/5ٸ{.3227oTׯ_WWbҤIHOOǿ?/Z,k1+kg&,g}@Sr¹\t:?I'#}/<5)Reyo'| '/xҳ>Ăae;p `[akFcxIuṷmW5xD<Ңb " ap=:}'>4ڄò- Fh £ b'oΚ6u*cgxal״m?Ŀeh/Wⳙ6ljS_X9O sYx/:\m!ݼHLzk6xj:= 6Şv֫n>!-=!adT.j8>m~O ʉ@h+'eMbŢӐdTijWYa[ 9#\zݚm}&)6GBUň9;1@p|uas^i<`-8uro{-=K_S}Y}˂OVԟֲC aV`c#7'$.Xr 鲰4U[6n#Z廿ޅ<)4s itCCO Тș0.\HSƽ#O[TW(lYvaј<=@ר+kgP!.OB#P&J ܮpU"%kUFvD]"AUr]xZWK)VR}a왯J{,<1~0:W9<``B:R6cJ}V>=Д^r3ϗн(s("F{dYfyF>`ZlTӲ}шHPZ#4{xC;0tQWX;qpޖpm%+u֪DogNǐAСm4>z Ofe*Z ћ?>x-n-FR !|cr`Csp~z,<[u[5XKd,[v %%֫8ܤEz)8߈h5N^uw0?;3`ݞTut>H< {)(ֵ3‚7 L*f|ed՗y{DƊg7wEF zg>DŪrB1}s/EnqL R/{.)_}h~<7S>Zf,] ?x`*G{0/=.3}F{n \}z۸偛\UYyb'q]0z H-y4A3m:q-;i3Gnr=hw+u?p7 X4kWƸf዗jvaU44_nh*v󙎉m_RM'v1lgSAث8\zOڌ^"M6A>,&.\sJKlȅ@A#{ % 8<xaJN"cLCXMMLje%4_̌flWޔA(9Q" ˭`hg"}S{#QOR <ьO s%G.ȥ# _&qd =ScoY}k0Kڰ7UK_DOW  $D(a妒Lk7hxӧYk%腩 1fx3L0퓵4*2^)c"Gg&B2ap{4FNz;3oϥ˲z4sK\@Y>a<RY!Ɖb_y/<5]a7pr ~acuLvghTGSV} wA7<$QN+[c+mcM9܄!`~ʏ`At"BTZ W aqx tcZ\&$b&B(텆52 .axW Xhއv`bޘ02e 磋@IT\3\}mτ'aǎR6|$o:j--̭LT}#G@֘`0&f$ze-P5 >(t0NNgxOo;A_c 7}0r` oG&ߍ4FNPN6Sy˾M580S{;Vx_"ܧj2d!&pϷX&IOv+7fK4ejPC^f?zIyiPxJY'Kū\Ӆ To>#0~߇O>ۊ;OF7/x(>9/s gNKVƐPN3xx R?f,P kPNdkUg߸F!oc4+u.jmŤ$~ [m@vwH Bp} AȖ|gC2q=ux`FN6 l,7oNL\<ӹd+酯\e>F' ! b3^ZHmw>}2"kzYZgnva jqN?-?|n?,|= yv+[/#v ܽ#C_& 3+ӥA>y$ 5Yo_?]_2e:hݱ#j3Q`_ ™~L?^ n:œӣȻ_B/J^~7;`e4scc`ooq$`"1eB=u*urCWse48O0.~^1|@eÓ!aB}!ÈzΟW /&fcA}?\c`Xc,t]=uP2U ԯZ0<M~^ʎv?Ӝ\9,f;p_;'EYoM𱐵#IE+jk5;+2ͿQ5>=zJROWo{Qb}*< dZZ|ӏc3 !P#+&B$X/$فGl䄚l8n۸6CGF.CY=M.vyg?Ĝx]ԗW@; gexS!Aڠ0m)a:5ϸʕv'w$aY}sJBx} #% #Zɩ´2Uʰ]F<?{Wn Yߏ]yjja7)gdʄKcwx:ru/%EU;Ūaj_7-Ŏ@ݯe&Bj{gD |LӿFV&oۡv.i1hE-Z+F,@€p9}2ɩ6 MF K9يftSLǩtǹO{r]Z ~(+sb2YN6+]6֪01c8{2:kOK5Y5<6>͒Fq,ʧ5~ʒ_2ު WxgA Kc]Z27D;>OK؍w) .)CDS׬7wt,M]g kѨeQ>b!k./Mf_GpC7v\ &ώĆYJR*=MٸWlITa|W tfQ;hu &.K )T;"6NhӥEu%۪ 6]Yɩ_~mh rLƭ+W,stő 6h.#$7!@rvA~:_ǶX4{`DDE+)bhؚ#2@v7bZH=}6N"Oz ݾ 1ʺ?.`+zHn 0i9B0Wc5_-|B8;\z\3x9]>b}h +@%FH S ei}bȴUHIT0}~0 o0w)q! V%D˰+<"7j prL+hĈ-Y,SOs)>LvnoCg7oLb ěezzT96Zmkq ~+"zrl: Zc}#cPH◢OZF\eSQe@O\\vE'd!D}J\@!P&@b7>;O%"D(8ɾa_V֕KѨ(i]&T_/"i$cAyGQR%Ib@PH&(/ AETo@OJ@T,WEPRT"(RK "AHϳw;$w|.Sv3ٝ}v.D\- RbODS,a<Ŗn^F\g(JNw3x>ut,!@# L\"F_!{Ҧy`VG^qH5DWTüwcXf\{s,&M!bd۹8#'g"PFuoM뻴-#Yb4K,A%A9}*F CFij Mʹ5J3=n%yFڶoN:*386鯼{PxxҦ87}3.ED 8^kG^^xof?;;[;/}yY>}4.ڳ0mh[0&<},]4ZPYto*UhvŊ*#P'$$D #~l? xN[bP?V()^Z1 "')Dm]9 6룍?k[[3d/Ġm-5HnS!>07Wq +<1C6qKHBSiJIHb} p; {@<^2!LΊ 0&I `@DknF]`07_٘`Z@6˞ tRLW%^ad%A(lrωuu誶hPj\$.h'J@V3&m(Gc8}>-b["+3) VD)AdXKP;F@eME;B*sr]Xp5yZyC FJw%֥?ɳ 7aѨwy=o8XdgBFEl{HxH6eCOT+jx`3<= \Sl6aUq#[fe`O;X>ډ,@P(%cL >k#[?aȻ2exnHL^1M@a ܞo4uaLn\ZCcc=ZZj#,)rF^zooC˱p`<}g3g7 \>O}qY=؍<)bL x+^˙Vۢr^R;E1,ǁ^Bæz sUn&-9':Y!мG_Ԣf7tȌ=#kbnʷ(2E>( m#ࠞI%SCmz_F "U F/ØgcH? ?FKS t= 7({Z}}Ĵ'yZg ->87 ,9cQbH%((Pz?O{ƣԧQ>Mܢuwة|d@|ʉ/_[ OSwa`hd.~Oڝ J7:0Д@=]GIF>yYc?45Ĉ^@^vc.a@'b=z4׶Y9y±bԳb8L 2WF%\:wTWhm&9pΜ@?ptL]$ӡ PXi4$d(Mm!X&>Vg)|B;>+Posn|}9GqӘ* 4^?((6q͛!JUDFЛG]9A깠Z{<)M E^\ :s=+ٮ\+&$p_,=Pc_C["y;@).ӹd{#O HL 0 X"" y™ rbi;]:m܍[-p[Q<7cr@MTf#B=iAr.#U"ϓ)dZ\, p+L X%!z͑f3c 0uLvWZ}kb``rsXV!8vZ,~dNMF(O=sv0&ʌ,CΈ 2|1@?6V#PYv]UK {m_Ȧ(~z-~E_Vi-\!MpF/ K!;,E@d)X&&l8z- r% Z@1{ 2V˂"TMAUm,`L VA:%#˹3@C+`%J B!|:0&T{V5.^'@Bxc1sLx, H@Aq4&@&ڳHu>FaL čXUg%0ړkm3ۄ9&`}ZXB&lxc L @`%0PZ '&`YXiX07 &0h= 򓀫X S P(- ^\6V>,X tGdA<S 5|Rkr]|CG|ÙKaL 0`%Ыx9@#@Zr}AM`ݪX j˰\$@}?l >Cy+^~O``'׆ xB6a@@hEO pS\`L x+^&1@?6L /Zr}JU9(X ,RHq&` bHu`l3+ٮ\+/@/l@y"Z`yj-13VDZcVe^! @+(7xMHi*xχ2ښ@0&lx$0ZCy+^`1ȷjU pl@ `%0Z3&g &2V ,b= 0&=V V!`L 0&@x$dF x:XG&x$0h>*J`5)Wmœ?`L +e ҏ `Km@9+֢\Οo^E̙3&#\L``%00ڑkJCKCZ+Vj H 0& ޶+bE>L 0&p0Iy.H` %f%0 +-4 :rL 0&K6Un貪nRY Ѱ %A#W`%6 )+T lyQ=@Os:&x0 &閶$`p k\^ ;qVu%,a!(S<X893?`%ЏhkPM!* 0%Z>4}KB[+njf&#>*a^! Vδ<O?'|6L 03;@gH[-tgV!#Vi æ[mHEJ/L !Y鵖HKʠ$hay|FYvxxx83'|\`&PZ5m$Pf,gg?VE s',dKC9cOMMŁlŋ QQzifL:�'*VˆWJ\wuz?)ڷP8&`%Z5X쨩MЏ7ɐnݺN;ؤ^tIS2H6)r:c?;)&%R'%/22*U~R9$˾D)_YV0\g`%кmÒYS7wc_O7"s:ym&$Mj:5^鸼>I#LCeLGk>fiF@uj-]O7M#zO6P:Oi)a/$ `nQ5j:Uʑ']'eɦA Q@9L(L^'[(/U8V}E˱$yuޤ-ʠtK%P&7'EJ 0`$ sݝ]j\:N~i%vW=.uyݪ6]t-GH铊U%Ҫ?7Gn0+`% 2 FM!7ud@<24*@Ǥ2Hq RޔnFZ$T&< 82/it`iB9]O*dK7ť F%l3`%-[ɖ7R⨓'C8ӏn62\V)b9HOc 0F%)HtPs;|F&e:6]R2LͲFNwqX t 8!˟츩2L*yt짟~޽{5%FHɣ)Stc2ʛUA 1 ]SqRzsd>2̜Wq~z? S=U·rNieφ X+VhCI#?=c&CqƎcǎ\N. 08~8F_} #&7&`5ZEX# -#|Աӻ$$& **JFa 0/n]VϹ?zjJgGFF;;wNCȿK'V%%@@+3jLnɦx9DS;&m%fWвeKe 0/8y$\PyE\c3g d~C+d![-?$V% e>ݽDK#Z@N5rdM &E})ԗH?c4 ̥3X ,̄CC&?u<2@ H/L x#9 źXHťR"H'mH8"28{&`:叞  M;Ο0&=kvYﺣ~M ReB6/i3V\ 's1SgM8z':<ۗB+9@^jIל|crM Mad2yV-, 'r*IiOn0x.UG$tG$L=D'jIGd_C6&`%Z5XZI7eurDKW &&G|YJH~?!e<㜙gX *skMOGOև4"?tgN|:@J dC$/R!);T443eΛO&~l5fάʾC00 hVaJ@*ҦMOr} FFCCh 02%@יj5gN4'9@})NO X+Vi od'-mDv96mloNɮ-mVo\P,C $i0 CW<ʞ#9Ku=G9L}b0UzI x+˹[b4ubHnih]MMaL{蚳u'RٟmUT㜙gX  6We'NnOrOFӲ 0L5tY麣*dPG~ܴAD3daV#JZ)AS䦎[CaԍsW.iC|Y}Wʞl'wrL5Ɖc0ꨝc|#+E0 ?5F|ܮԩi'ԟڗ$YTi*sUY[uS/ -eL -5fN'n"BaҐAIm`%*-rX3W;<Zime L *^ վB>,ʰ2Y1`%kh9B@l˺XuDB6V {Oȩ`g& 2RssŻl +,DtB=ʧC&;iYcg~yL>??O"m&ʔ]gV̟5\?iaO gªO(fغvֱ5H[6% >;n]F ob$|9~׽+:đ;ty"ĖU:uJtVX^>w^H%4iI#&rKNIbdaxu<,ژH䉣1jX?v|:uR蜏B }(GYp*W6˛)>&G<(.:K]w_h99H+E;7eUώ@R"oN-'`EڹӸE^v%c;Օ?vv݀^T'bthL4jk+<&BOvox|j?eTĒA51ߌ'0kOI:ԪuwO^_7˳H8"{U#i]KhٓW%0Lls =ŋ'rQ% uK Ê]Q,BهW4 ݞ;du!.a ҅S1}blİ. p4LQ .-2w:*qIۮv4P',.{ 6C+rPF^ןaJdqFZ$ (Oh%lڕWi*Su1f!F[v[f6V_P X- ?[ c?uVq gA@~C&b_any=~JBq Tx{frT&bnjG!F6)urR3\szt%\<X+K Q“?>ZWV*uveIl\1n |]RlZqផQjJ9 K5Y&qr851܋Qqe9~b*';Ey) p˝^ų96PZʨ @@IDAT}}?|Cb odLC+2#Bdş0}XZD׾4k_Z[E l7~hzs'J4 iQ-{1,\wy'5kVT4܀!)iz qݝ($h}vz 4Ez8VXmt?X/ڭǶc}4*nCԊBO"Y(&G`UTfn9ԗ1REȴ1 ٙ3v(B>Cbˡ,%,l3NgtpfnX OTK=L笔"KǦ.Q<SG B6mD ;2N:+F ;-G_-Rn3WAW@~-C6!JR/Zf?i6 ` Z N\.{dw{9d: nM6C/O@+wbLdvY9s0GV)|:sA Q 4 s{Xj,Y=UI-X)X "dP$:G`ϱ"yeL hE>CbɆP5BaׅGtm*AL"wL.;;첲^N#iCr/\EPGhJ.isG~cĤڑ֌F|'u6?DsCJ+axgLxic6Y8PN\020wr =39<= )I7p6>3$)m~-+q3$%PHͩT34\  .P]oSbO=\smK|[^j!pՍ[aqG%Y w}Uls<$Z,S/o6}])}hnra0y&>s/w05oj;3Rl)ӃNCrcTAqӋ.9^_/"W>lvFL3gP ]_zbS.ڡTj(u*5+mVKN͵u *ōkyN7yl*.{vwB(t!֢j2c:vTJ<)׷!ވ?M;m'$DZg޿`PJ9bqlǛHl;k6=uvcжZܣ+0#gFo>ók$ Ða-^;44 T!Үibcpikn;px.vE &t~-krOykqbpZ0V/^ğZhxz+l>l>\9~ūi[8Gl7W܌qjz1&hU2$>JE*Uӱ|{شd~mЋdyPRː%ltoU|P'~;>g'p_{̞-fvn^\2l[Xbl\B aˑ+r@?66m u$0Tf\7)~{_ac1e+Q٧qBD1`6!>|8scVW!.cxwN,{oÊWf*mS}yal_1BqnF0cg`VAAY0h]˖ձmlWR&z":GRsﺋ5#F D-uvSOgGiO?;# 6h/.>{:&EcU ZRj_@9 Gٴlě>&߁w+f#+{G|3XԳ#jba.@whwNqcIhj瑘u*`Kw1 LqaN0a^d )^Vx%§BJza?rGp?YWmbx>wW(Fat*|z)L|_€nts.Jg_nˡ5o_j(1ObǔmM*"l7m;@RSDW#̟?jWi6Ы*r g1+,OW 4.R?xS(ـxsjE'#¦*m蛧*ڐ_? fpS)6[̚ kng{ Aja ˌZ٢j\ w<~ wزmsoVojbP1l/TXxT?w3^kvL'(=NՎMX+~UЎO: ՑkkΝInB&7- &o:Oe7mst1-،j*={|د~wRUIە.@mmLc.&~t:i~ a^@[XSힷVd$' EO!tbf>*aBďWW) fŐ uKc`P3qZ(^ּmix+m%4$Ne&'EjiGvw8D!TaP4OY;=LO|ߍG;ۇO,y& E\ |(y6vJ##ؠ uV ŵ^ۍj=5PV]=-=!ԯD=;i Oa#"[2,2{S[`,C|x|ݔ7bqocitKE:bkBs{m!_Cl-(a}`yJ2QD9t6J&x3O4zD!f D4mǯmupKx:o|rgrr$v+pN⌻I˹cI79(ZqV=!7cD{:jwp%0a- 9xE[XSPqvrSǏR*U'ݧ/. gy"{J۷9p$} hӑ팍.eahFdbmm(*'FCӧ6ϡuT _$4KD-R͚+Y8dR4qlУ 56]4" ' &_}Bx%#;f&ڇ? #E)*n'dzmP򁸪x1L^wL$Qq.e/v eZy#ڡSء",e>6e($NңCV%Ǵ OSڗ[9H֭[1az@sNUV#EwQW]$ tg[eJ@26G®_6UGX(fa˒&D-u4@ iKHѕ"ssl/HU"%k7azaY Ji7,P5<̖xg,m.YTpSdqƁpk)1BuU?`ؼx =Q5LRlv|ƇO% #CX#iZygxi$H/Qz=ں<#_1gDC&^tMS)q槖)e|1z.":ڧ|}t-b 1. ,1x[?#dK/#%egg[bEGR}@Yܸ{ !{Ó=޺n⺹?]Izp8ީG̝{Sex[1h>.Al,eIY=lc)0'k(X2 -F z?v>[8mƐ+Տ.:yqóhTWf>\8k<*flh#F0J6pt|ڈÚ#pe&vY.ްHEI헕y nQ&mt3=^# 9.eQ\#f&ov9#ww sL#^L%1eWsX&stbst*l2XҮۦ3.=ȲlGɯWd,Rx{Nͯ[Kج^à;9H=9:S Qp;9oLmFfZTZL&L]vEݑ%׭[MӃRn۶Pr"3q>rv6bHt6aN1ESҁZW˛*ʁS#饞5eY{h$e9A ~=;ŢN(Di Tia{sԮ.OU7㰝Fd\ #q'+x7YC|(6dPbTyYMO2qMȇoriXbF0FJ*!ʉ}h-^Kĩyb˂XT: Q5꣭x] FUc4YqXe$_U0Qy0OԼ\ͧ@|5#tϢvYef?SZg28'wB!;0hXg4J%5tf67=pe^  99Fݻ!k֬FdWlRW+a]INlqȑBMS.2$Xf^Ryf~ѸٕEXA~d#ں߿N:d;ya  /$/MQ-1cfkB#7)MN. X%VcW -&=v'$ q٤aX9q+šUs쟢Hchf1>bǣ0LidQ٩k$gte2{&[Ͽ;7)x 7B(Ѱx[(eEňO=x!5 _Rl; z6/bïFE#L a[AiEL/h6sU˫́/Vrhn;_K'Fzܖށ `xdO1K+)̌lV [JzGh\Ǩ.{W(}cǎI'h/ޱC*.hbn*(Lp!ؽiRC]򥹢eGWJr[y;l*Q %^^)%oM-ԫiJ r)V(f(/L Ht3{OԈW'a̡œ:E8#8qBCg¡b* {VE3D`BZw,R90qIjRZO豓ڴ킴_.mʤ&:&>ӧ'YU\  ~#qW} ,mbș>j`ذgΏ \?d0{v[#,F9vWXL%E9+vfXs$j(_2Z5оX?xn ,CsqN ]OdG{nK6sOYQ5xN|xTF95#oŚڞmvdnJ榘c1ލu<2wWh!rmXJg7)Xc6P>͌ EZ_/z>Q76D>wZ_xGJ0ۤTNmwp U W6Ov)Fڔڠ1nQ?䶸>eW&<7=͍֣ "DznBiϖDQ EDt3\e2Q +oiעz$ l/'+$=-P΅8%+0NĒ#c\y?~<&NM6i[b.\Ko|f<$~Q y!̗*$MYCg(qgs0~i7綳F.]bFMNp$S!ӵ9 !EJ.5/+Vt%G([̹lH a=IaTq\6z<g&'.O¡m O t8F j/╃1N( gD8aaDl=Ƭi:ˁMJ@jeBj딛unXzōq5o5_!ᒥiJ#qD8KIv{|:e2ƿG?nya8qO{*KM/kEf+%zJA Gi9V.li811QSw̛7;}nES12&$c#XdjpԵ{ңJVŧ`@ iO Ǜ7/`bY,MYVUD2X_EeMͳgdXiY3Q],ζ$ᕍ63V3pGꋵ+ Dƞ3QU k4lkbQ-Q述@cX|)T <4F®#(yw;ƞx+6PΑ57r0>#GNbڭFuoM˟X[wc߷?㒘@"^knqVD@llԛa$nK[6͏(^fN|qtmic*167'{V5FLۀ䱇oj6mKgj݆h{bj+7*bn?.Bq\#b;vm1 '#K\m sGݱ(?S\ZH#)Db߅~ؿk+GP1{nq82TB E u ٴ6s =ArǏBlWdՈd|.e)&"n0.*DvmT5Aꋊwp{0D1DظG&oPXCM*hld aLm RyfziytTPA_<Y!Z"~bTj J(>H4ϹEǥi{fFoak_tz{;_O'/SV5S=|yx8OSžL6mM{܃dDnAn'-@K^sWP.zl`FbP w Zw(zFNY3(DH5e 2ŢٳkԺIhP_UO.`X䧗g}yOӧOc{&0 ,6gqV|#,"*׮k>MS{Ҩ}+G9ؐlQW:-^ D Ts?ٲχΞ#7?b%,iGڴ?-<mP tbŊ-HStblHcf&75?ѻMžebѸu8p/  t beaaHO1I3bQ>\yBy/fUZ󈷘t`TIk>F b1(7XO47h Un_6 ^~1\KBH}1y\TɫT2/)lo˟=Vu%;X ,WbLY:;_8Ӳ!eñ,s t_1M 4+Ggi{ߧsCcX]g)tSٸյe#R3R-BTS%`ږo*ܬDLGaЪH8%E~!ƽ)e"gRzbY"ǑJ/9ף 6^Ͳ) ůakP{%ߛWSXIיj蚳ugH%''Ħ8iFhtu zWʝ@g9Gq1^#@#kx=8TX-_v}W;ڃI, "R [IK6e$>(+`%0XvhC ,;eSFt=~?>i6kUC:Mue<[FYgMywipL{X [9 EQgyRzuq ]uVõ,nKX vt#/^/#vaL{:S ]sJ T[+Xv/|.< 5fQ 8'Js.!c1ug=[7VQHuJJ,"(WbM`WK# ՖfV'J[<]H 8k`@ 6L u(/;ľ1*(}l3& kjם o5,$$DE'Γ +%uN?GzfL  LטmM 0KFdL`%Yf~f>S}^?'uwɱ -˖vڪ}h#mُxl3_`%З,0wĪ_vRXFr+~l5Fc{ܸ%EPUCb0?`%йHPI ҥKV?Q hծ;)H4j!L*X JK~'@jC O#wlRb 0 $0g4%0""BU=z,p B|\e " AaQ줥MneN6&@Q܇~0@S:fF7ԧ aL x >~.I>lUh`9|F@vȲÖRq18>v0&dL)aX)AnQZaX, !FnꬥQzp(Qd0L  Z3L8~Dul3`%ПGG_LKRR\iT c +eZuֲCV$ ]~B @;@P}g'f7c?%V}I˲H%S:SRpJ*o2m&d>E3A WM7-h`YB:kdvR T ;dž 0 &`=6C*gF@cQ-A J!Վ~V &$/RNJ$Uh`9B@vR铝I(խMV\( $D ~*L@`%P`;hP,;nRȐ?,,L$?šBkxx(aM4@sos *X JK~#`ɯ_ Qɰ )9(/9HDTEO?WX ph' ;pΛ䥛$QB6L 03P29lh`YJ@R;nP*/f5!t\*p+D:ji~f^}gw ;x>9Te!x.\rGrd,7P'M?R UŰPM?+hΓ K_ ٟeY&J`@7/Wgjӓ41D` 1A ?>C'*!RYIT X u.̊e #~o; ] T 04N䓼TM?o i %9( iǂW\`%\4 EvL&O@'/%KJ$J`8BjK4 0=,@0@ 7&PXZe kSo~ eL>X\<p+AM@|~l^.8x>jJ`(ǫx Ыx9s&!V}*B#!L4di =\ 2&pB@'P8 E _|ZN0&xM`}՜@kQw 28w&`> J sC7N[rM`N`?`-=^ "ub%0(+11\wqB&AЈ\+|"0wH;8.`L X+n͂@ 6 |H'|&VI8<pMbL -Vo{B0" ڰ̭u ;8  <@Ua%0۟k&~W8:`L X+m̒xQ%b>%#>ͅy+c9"VUNL 0$J`P6;WSh~Y8 hGJ L @ OA2$}@6jpVlwx:Sr 0&,Faq`L 0&|@G} qh6L /~Uh}՜GE>L 0&p0I@ǫ%@Pـl@4br`L 0&P ,fhG  & -~EwrL 0&s9X Ю@Z@ynA g9X+h)6|S^5Z_Y': pLʸΗEZbfG9Dow9/}?rjo WTt=Y8&.u6l@c3jsSwL׶h1'47bp!;67Wys{4v~z|Ҩ}0LS}EX SEJk+^E՗*%## Vy|) X+i <`u_wRU]R|gypXPwOӕTe@X , 3(|#rgJp -C@= 癚*j:TAu+&*bV&%0;Q7REE ޺Bdgg!'EtQ.2.G .vCBrB,;7"d+$p׎ƑKa,]=nZh{^\S+x+_ &Z?w7n1:l| ]O[]nKhi(j¥}mu=k8\w5pg[3˶OYt&Z\`!{`v;o}7FH+6Q :‐cKUBnB=g$7O @*V?ێw>BB^]SlLO >|(,Ѥ'&78Bi7â&Ffn;;m/J`Gس}V_4in-]-mZuӬjho9f% $Z];&T7[*_lYM߻܎ޝnB=";]Tˤ=3.e+;n@2gd<#.-hִ`eDbt:5oqP{8M0_<:ĐWٯ&ƿ5jds;F۽4/O|>ȣ(WǰT4d݆nܤ6z?B]D1;zyo ßi&cƒ +WFDD.?VRE+VPDFFB Z-la$ƅWl` Y;!hѢZ4h=#qq˚5tfI +!hU]Z56SKlp)瑊y6 ,Q&a^Xv`@f 9F}?A /C)ԪlUlxXl_vBqOϸxx ^ >cBIF:]e12>7[l{U]P6"u[L,e|z#sr~OSVx`x*z1Gdlo(1=uO|Z#EZ0>N%eO)bC @?KUqWd+F01o|(kԲǾf6vt~WAѡnɟan)G|6bw;\vdh~XhGZ_nO=E|uh_UxMu ﱏڼ)kS=W等t_/ȋm?sLETEpCFDWރ-ĚpSC]86 /ѭ l^}1Jz諏04ע n{h#۷mġڥ ^#? [Js_2񷦂ǥC*4~lк; iȥՃ)a->{ FVt|=oDsm8פb} a c)1sd?Z`, pWFzE@QS6kd0iL;tFӐz$S1oIgGB<(+j"WQlzͨgt;q;.ٿƿS~qy OO%1rr^̨&:ig;b8& F.miUscO.@ohq=,h`_l 'r$LKN?.e%fPe#٧22(]?. ibv>_2[T:퐦Z{< x:6Ӧ 8KFk$c]b]cѤr-JZL |E\ }RMPXt0YI[=_N/;,_ ׎q㡍0O7oqef址_Fi ra\-샻utK^C+a#1o,]n }~/> lY漹ߟh-s/!jSw_7dm,¸T!~?bÑul ?2VMR de!K_ێ(gcp[|aHkVƽ?c\g툓 %/Nìsr'Bg}a6y_%.A'CCD=/Nh77ŷC9{jS{i'Wg#UM\fE]DCWW`Eu\PYbP9QA%" @^uwt&䘙+ի_uWyutt,Dsyͥw0m*):ڳufa,(###} tVo`iy_1aHt'L)cѬ_ɘ1wOp"kxıėMҤx f@J\,_>)Jӆtb,7a2s+#Vǥcģ"}Zx`aBߴ*}x F @vL4,K.u^UbQҬ$HoJXt]?̺ OYy˸P4PVd1rJeT-2—MK+u9d3\zuMZ7Q3ۭ@PΣfKxk!Z;,]zneWL/eXYr΅x龸D^ =r$`e4ڦ0ZZ-G^@q`q-av<-^x7 YG ,QrhS2,wz-nn;D;B&{͗8ݵZ}$ ,WmFθ&%-JGҧtF6(nwfLZf&YjSoy'pxhBP?4$OO}H?]qJO乓Д$?y e˒C?HX0o $2lДpBVmz,5઄_7Cz_d]M7큔t ?ߏ=c˧`㘾8x[Zi?Ш^=rGoH))vM[KR=ߌHX)`޺ˇtGv@ɣ#:w:x7f7yz͏%po֫r$-h4 [ҥEp16qs vPAdסX eoA͑wf7˧oyTĐ6`Mvgez.(;2U'PwŹs,[>PbE%Y>K-Y>RG=;߱dbai&\/it9X9MOt75sJ£}Z5a/}-qLY)3`(kJ@sU'י֛n%˖#V-tjD'ԶHnlͧ8,˾vY7Zm; .ƥW\X\cVձqF%ڦdU^xQR]Dݵb'J }! kU'g -{yY.xf [ hK_5x&֬9,s-33TMtAk>Eoo8}{v}i\t:]=pqF #ma,`宽$;"˖U >\>aAOchx+u2vJ*!%%,`}GfWn>u2̴߰Č<4hYXiʠL"hHU&R\O*-Y\3>}5R4ArfN;2J %f0T$.Av=&%+9GōFVD\4KH>"}Z?qHIk~sH ďSgb8emYFUqWl>I|J\]zf]Ոc%t5]Ɲ6T2v5t3,}W Cy +Bb)%xKZpSl+F)6.-ߚ %XhŶtC:ܭYfଵ Ɯ3階+LK+g!{2uqכ|qgOtlz;6bd6G Ѹ~K|E.H n*&:Vo!W#+L,:ͮ1ol%ܳ_%|+4yK7q.ꍀ@U)wlІ P"BѶ s9&Ŕ5<zpQ{IMGh?OvAnɴđ9aW%]o~asXrbbW.SNtCx|gHѨt=і > ;;QYBsuJB 9 ?ۂG~G+]ϢnCCK$%O5GmԻ&01y~p=1fӊ}͈L75Gemxj? Yt))7d7.yN>;H8qd/0(.} }[кGK9WuEw1)9w/X ^8Dz1?5BR^8ڵXB܅I+#Ƥe!jm"q0{ sAֲnۮ".DU KumX8wFOa}n~8VO T/+:CǍɘHa?򩮂?ϡGހ/yOrT%h։&_37Z[>eI5m8v*љӾ%RQ68=JGxcLww}Q69.:)SFӠL{-{N]̊2 Z(v+9}VMrL!I u^ aǺRIO'J({ ЖS\+]}u_}񒖵wO\(A̼^_>XsN`02йu:)EpЂewQewj(}E(Yv"|],5'gԘlYs/3 ,o-y&b۽n"n+K . wlPB0t~'f\M}~)΂eAom{m1lYs?u`&/2_[VBN^(cO ݰcڸwu_x녘}?\ ~[&|LFJ%0l4C8Ecdu[yyyڵ"s )$6عyqIU}Ec8~:UGU\Jlp検@p]U$[~ N..ff}ajG m1ivXq0U8 o6:ִXiMrQ&Ooʕ SH]Q}AɊ_(-FP2\MOb1plliT͢Ltp,]z1fjӏK ^A]^hRDGՌӄcK]HM#c)*r -=oxO5˹ULDk12Wz5Jp4E>,XMe49 {YDj>l2LSA'0o/ni+zץXVpIvZ pPOag9TKh ET;6 O6"FqxÁlrAp.ZġmXΩLz&1n)z]f[QA#}FsN*`4lm60SiAi\Դ ]2Jcijʓؖ \J9`IjDڸZ$5ɢ8wDi.y|U 2Bh֦RQBL&> PTU2U@2ܜJ́Grqs#i62>vs|#q.c[ oun03D+9;\ u`̜ncT>+[ytcݒF)g:a3)0﹏A^܂9*OԪNRT j>-,*zF !u`hPh#Sq,Ϛ)4W:a/q,B)Σ}vBשķ37a ҂KLB{Y E;6 {!UD|u&emDW2iWXR2$3gcQjDyX g`}-:"}8 w9VpȜPKT}qp\;kշ-ս/][k@j~ qxw6v?BGOF]Z(ݒbG-B5 4 z70T NG15yhBh@GJc |]($?z"Z%ؔ%?aް6ȌHmA]]G{H}?//-~vt}رȥ{hͿ> cK8~v8yFK!1"} g>$ml6at-g֭uAZ=5kj45j҄/.v/̛!:KC%?m)Q]#lLk)}NG}C!1 9Ȝ+dEj@,<*ҧALC.NZ,gI';6$pIq)*#z_ΆR{x+F֤ YGsƩ(p&oNLeX O =+Y;#0w[%0ƻ3'#N\Ɉ:W(M^e\,_${%$LFX y?/!sU*mBԈs`b\,xae-`[ Xg-ŬSD1 19#gg_%4(:37;}8~F-1bњE1r.$0ԎsٕqȰrp9J28o=='}y\ TcYp&h4F\X.ؾIt#]bbb$C4/ 3q]3>1JNu63>N?072%0(quH&7Mՙ/#ah{ޏ!6s2W5l4Kg=77] <5+Zѽ|7قBEZA8+m ,{`~tϙNu*Z\PEF$B?m8b["J--b.9׹^#K"_]/Lh|e-3߅WoV,dE Y JP :Et ut1xݞ/[ %SDto˷s1+st•ג(ӉG _DB@FPa.0@Dn)cGp>>X*}1Lzyiś&v쫯7܃ƚu<80`Kejq6Vv>*5|:}SchiLǷ˯A:tBu4c}[=bJx$˟Ӑ=F`<+bA8/ c:o YYԼ_!YFc !hB{.ZX6xn[>U\GA:O#ǕiGY&B@v5TsX {w}zskS^SS&kFk= ևsq4r2rN]V,cpQ I%xrV(ba"J`ycF@=F?q$lGX ~=c&Yƒ]*i>D~H\5#PX j\&p V.N۝r*ڢn ?hEע_OFYPE B NjgAV 7.X -ZݩxK*sKiwQk1HhQ,+ jְWgso(d\;#P.X ,\LmK|w~hIB2ڋ wWF:!o&EB{A_ky)b^}m/XF\X.8i t,~⺟ ~Cڡ]J 鍚_qGggQ/>} _ʢANu8ՐIxʪط\, #P^X ,/bLhWOf 4ŹB)Y=%[EC^BA2:{ͧxyݛh{ ZQ/99a'Vy ˑ]8y#"?V=cPy4D4O)=6C@l& V:5.A\@ TQOMWnYW:gBW<*<m^7((:myzX4}%WɐB{KSaf@B@| ԯש[%}pw쑽xxPQg@Ewⅇ~{&)y)x7S OU6;/P{Ì@uF-չXv# "ƿ[T6V5.cGX cLEw۷oX2F`r!J`bG@m8$$oi>+ӗo @`+mX t*&d1%oF `%0ߏZJu&7!s #0A@̵l0@ǀ El+ʶv x 5WYX ,?W=@1|x1m`%ж]Â~ضkX0F``%}o ᛀ`x6A@Inw@f@qcE}g-g%:a:Af#0@@ou <7] a*+ ڬCX{#hNbF`B@`b"F@G;F`x_ɭ0%u0{F`F A?}-a*[+ڬCX#@wxV2W X \ :t%70V:.h3X Y86G@w0#.1vN {l?j}M?j 7`F`FM&PLh"C#,l خw] (|0/ (̜;<ؽX>7`%M(A@1#0VyFL<mй>F^%^TV+  H/zn4#0+֣Q%'ü$P">#(?](qӫVNbN:[3#Pp\C5җ$ָLg6zqYҩ"2#. 9v.*+ձX*E:xx͚5!.9k%Jgf@uFX2:eo!ݿܺJ puP;.0~;ㄤs9l W9@K˟תUKZ~?H#0P1vD@; 1`-;9p˸TMڵkꫯg}fn Qgꇀ:.Ȱ+E2MȴKԠouvC@.\@aa!Ο?ϝ;4???_sssQPP>}V"̙3+yD#J_M&|_*pZXy!!!/"aaaZXE~z ʋ4 zW _uz"@+"@,/18K bNj\˗T&AYVUpe4"!9+빓 _DXU u.ヸDX$?˱W8p@IX20;@|]:u/igg3%Rs%j WRS:C3,ӬeԸ_A4"rf+vȁYr/|/-W)d_4",/.i tl `?@E<I_-$-NͯhXԥ^r@Ͽ _jb|c(#LWy3D@_u u0/#Re('U>ְҗeg3..Q_2M';5Oɲbʝ :'òEYv@" չ\X˩Д@!TEX'/R-;FKn#2,~ ',~"MZ 1+|Μ9hѲ @B T.Fm6yҥ]u୷e˵BH ձE/"^g$J$Hs Pu"Wuԩc!pQ'7 vq|)'DPD\!i;"J{e(b,ɰKZ *sH ,>#T-gLĭiU[cĮYjqy "9ΨcY`%{1(,%yt'igG@.x V=,5BE:Қ@qc!`}܉T'᤯#1al+6_׼;wP `&r`gˎu !O|aH(z"M8ipǦTY)`?>F@wW[,Pf'.1K E4=|@0@@'ЄϙvNcU/Ì`%Nx`-+WEXp<,Qb9Sĸ -", 'Aa jgV ,-a5.ie1D>#!CTO KXTO)bI>#KX %\-T/8N m T1g~@Ǣ;%PrP@+U|0*A*3΃8y?3?uy$yQSDA_M\giX:XrK^%i<6N>#s:+R+X"2Ì(%0л ($o|!v]"<֧sx`yʃ@y2-#*g=N'=Lm̕׃<'8bxWxcRGRfL1!0ყcFbF*:#жM4+U%;k\K_ڤ +v#9.9?c♳sgUR]!!K9԰D}_"K+Qwl]iõ+co슨XZDUJoF7MLĖS^LN f98 %rEP+b* 5 "eD)o_]yztϽ8/ G﹦XYzVP_`W$B@ F_l8]cdc{KҎ Hw  GJ)@ݛKo 9#'LF'%a;01"s۵j4\G Gp Kt{dԪRC%eF5FM!J%,FeѵkQ34~&M{ rTD%P_>ݙ]`? mdv\ @_%07lLL Θ9s] 4y8svc3b|Ӫ&݇6r6潄OOM0Qhx`BmÎņ1uZg\Ӡnpb^ ^~~>lB~qw )ѝk16?¸dd<1 )…x2_w|ӱD嫿fmꅡ&Y.w : ! k1a\Yg1￝1i8@Žr=w/ `磽t[|hXS:ÌS+r3lUR,]ܽXנ h:$uv>Pww37,=n{Қy]e(P'AT'® T"6-\+p=FGeG뒐EBg.)-!)-h8~\=R:HY胎k7ysw<1ObØ|K=k|b !~) Ǎf7Ma1%aRzx+^wpqmp ( ؑF;Ĕ fxshRbtH-b|8/6نU]5&V( `&dLF+c1}U0N/%EwK8|4b&K b9ލN#;=z|9p .q'ur40$a1{e- oťk}A.Mw݀Mkk)ue\Smz\o Ʀ#n4>?ǻım g[tOR[dBi_hg$.DCD9d9?goEΘ0I \"k,T[ij#|_|׌>>1?+5uwvƉ̙3xpBL>={t/wıCbUy.FK!.qDh1l3_StY7bL8f0b~R 8r/r:+q)- V!'&m&٤OtRRG+錿 s8K2m98%7s%eM-Aq#z64ѳy}M?4h*ۜؕ69׽הegƒR#ltGk(/sd!55`z_b{w-BWoZFY0aLHA}1IOUCJ`ƁO :-chcqxHϻ){`  ):PcckH.0=]r*% ]8xshP!ן2.xۧQ룕%<]'|ֈÇSaaKm 9x9 ׯ\()E( 2Ȝݴ DŽ+..M.%X[_NtPzQoڼy-[ O֪:uDpύtVg`KQ3s|;|%e0ݝ`ҒЬYW*Z&N‚wtp3\R~o%k/QNX SsG=zjTPW=?Lff7W%+LPUcdzh8 sD勑,t6s?6-.g(d؛kkĂ A4 [?Cəw<(fѨŽ#_nS{Vڣ/ 1Jɗ;Ų})$cȚ0iBɽfoF;@?yL p#=,eC݌E~qYO-(aArF߄[aY(|@uP;Ο7-zw;"saS0/0nZ3dxpk!A/3ӡG3i ҀhSJ w~`%/(;K8gs*8ŋ^޽{+;en};WKt3]{țO [v3lή 6܇,hU, %N7%ˡju#a$ic*?$PLv}f CwCStX0LMӴ µ#`B}JV('h]0ckTݣhJhP4DQݰuQMM;bOux_]Hď &! ?U,#@`Rtlt v/xݡ1oR#4͍K?N?y4=>JM y^R]Zrp}@IDAT]['U>Zf@!C&X-|Wq1ݛI?q]Qz'<|δ}oY֚[%N‹2aʜO@~#Y`V8 l%Q1{Zp#6Ma@WXAib8t"wA!#q׀vر}=}m#؜ytj寨S" 1ɰd{zy~e㕹֊-ҽH}.tv+ޠEiL$wntvKmk4Gd@;NP q˔/Z(jB3WE3G5e#[4}|#J:,:ͻfu>ZTA S²hS{?tLO;э= m |3co\q鎾2~`E6@#< a89%~Sp\hks0KwNG+Ev FMpSi)`IlΝ5|Q$%BYj]ܕv8"n^v$ѵr*TvQ2L&ȂhI)Lͪcb0uqlZd:9 ()#/Kb ߞ\9]аO:q/-;p簾=d/P":Eӏ?%qiX񾉸 49>tȯu)GSde~zA|ݿ0m{x&֍>o@K"]dG9zwYSСC_r-Xdω`X>w ݫ_ܮG Ot)xeN#q_SSŒE^Gu@RRE!TɏP6n҆tx^F]:>m*Ahg֡ ccHG-8_i*1f̙SѧLa<7Z_ʝZw/Å-zs=I֍mJQ2ٙR@te_K2Ń4ckN@Ȓy:rp`Cl %Y7AIH I(BE"a$9=~mt(9'VܞnJw{b/H8^:27oWqtq)Ż5N뛣~Fd#7?rWKݧiEDLX:]1sOw-rQ\6?7w>׷U[qkU}E\jc3'>P9*Oz/\t3Ul9yڴi#~jt ~׉ 杻*Aeg@֮Y#ϵ^ ؿ1Sl S6O+V I^v eeZ8GuF6|#hH৭3s!!p=cp,ä^Le9*[% 6boy@)͢WY>7|MmC(L52$MB^)61:7;8QFQ2BBY߻ϼ%КDBt!>Y~< =@JՈkXh26j>F/r| q;O/Pۿt+p)W\jPyq)E.q.TNpbGrlWkTYκs*z`BkgψgպJaB_uE^({⪰(XGT>z*{ũJKCҥKi&)?$A&=nW=u_fid<@_+XJݙȮLP/F 6CJRJ Ȏ: Gc0eoAD aPZD\U}(Ҷ3!cVbp`qR6=ymeQ3qobGX;WJBkivKL-؊U❨g|n)Y8ǻdpF)!=J3gLe2WK5 8_+1ZP_w#%0_>!qF!ډԷLsБ1\@H8CG9c)HW k2}F-Ԧof#995.*2uMnr*#"\`3ZC >xe.j/K}(w/; &JP]vĘo_őQm)-{L07;"qݩT ԫWÆ K4+?\b1w3.Rԯ_]bt;vx•wӫ C7jRFu]IGe elbrQۭc͙ظJO̸4!V;l9k"L5"'7~ G<]I8zm硫[ZWvZ]zPx7isY< s`[ƽϽ'o+[ytcܜJ}8}F }'p6^ 12q.pYwiALÀ]$iÁb|OiNC{O@UTMqpv6@p_O){ar] \>^?Cvp")qDZS߅CgqW bYN;jtN| =Yhwo?NYN_m1+%' P?exT9ltƓm`eNFV ɢM:)1IK zgѶICDD4tRG݆aXD)!W)15(nhvlIAxj\ph05jvyEcj B٦Ǡ#ҥ s r82f]<tA%e+eY3ObGx_+s(w:4Y_/_bcu%_Zۢ)X.N?5-?-K:?O-&˅#xo0vrASBKOM(Ya:d XKcX;uIk仇U 4RSNxW_a޼yQnV|.As!+y>Y/5vats?+wYPlV_xO'Ep }7yMW0ؕQ _%Cڲ@S"%3laOIS1eLbJd%f,ƢԮP$H+$ηM93S?e!)iG,['a.2ꙉ95AaA 8 :H/5RM\"; [Fg_wYKt7b2zO[c̔͟Gjf\~xdB-8,^OŞ DAjG;5TeYeخ tGC"cl V0˚Ab^I.԰h*791.vC@>+vA+tW>Ǧ Ebeˑ&p H[o41*'(/q.BݨD ]娯yp2ϹBKC/Mv^)n}kYvTH 1d3hυk{ m/"+K.ruX3TcSǤ,^x;py O.v'[n+1k,m… Y$)_9mtZN z>YzBlw/ &wk_Im 2yܶY KN3i<ů;ZfMBlx!ZA#U8:0f7o8⍖ؼq*, >iNSSk"6sB@>t|%)+ #͒Gut'QaF`{hn,.7w)B`F#1M+>.؈5tQtFnsnh;Ϲ6us11]|뭷j}NN(~LM^ M/7f[4LH_wCfQ.8ͧcF`sз{+ LgM/.Fib?pU`FNaQ'Bj -=ވ'g,D̴_;z`xz w4|)\ 7Z>1c6 +@<Ţ1^л˖898qfr P.Z^nxQ uoc7Es0ԭ5rD}uX/,,6ˈUտQQhaUV}+FsW%!.=_^ _4)oy+}ӦMCi׶mЬY3+Iō iZm mZׇ[76NDky1,s&6D3@rzH-Ks0烈AKc2O\Dj$r^sF-]%lڰp2l; ]i`)>@BPR U^j*t.Y/#5=/AMZC8xGyG~ƊG_Ab`B qu]yp%.n޼ ַpujiCbldLH,]ǪIIW=T`45Nr$y3-++AfRFM@tr]q5W_TdHQM˦3i36u@cIc 3 t@fHp ;kY[`,%b:cg"5}M|;R$+' ɢG=B\9CDS&_,;v,rP+ ~WqZa,ꞎ3؉{^x ?agϠNM snޙIII"""Gh`͚5M!$A֫FZ7Z qŎaNa8{5m6XQfduU#7VX;B:18NRfl;qcv{X \ߗ9vXBiI6)*u"nZTOT0+~ґ }6a0C@L2ƾ/ծ;Kl>+I%IGr3*PENĭiNԭmH>*e%ﺔIRZ*7#X1=w<Jt%7"6sZܱ;z YY^8mF1vA3ՉgltfUwrc<&Ѓ̟X-mU^c#V^c}@}fN͎`G@[nW6/@Mci=̺b\#{X } tF1>csWs3XNܶhۮal@}5 eװP@Gfܒ@G@B@(.v#9Ϙg:Y;!"Jge~!{V[96Cz_њ@ TV+  DZ ^=m&5wh:Nϝobu1U+U&6ԨQU\͓amZwK8gmj :FLWîh9&zmH_ix:UϘh?eP8JV( VKC9#u~Tq\c#%P~JRDtjXV}\m+O )d}FzJ;Ǫ@1n*[bXV92@JE 1׬H+mƾ5q=jt/5=(PDZ촰p$slѣG5+TޙGQoH9Ā!AaP9VA * * ʡ+UPAE\$ \** rI3S3@2df:o=OWw 8$oSzֿu"rsG&NI8''Ow53$+Ǐ8N8Wx*Bcŏ@A( "xO0g3!Ø>}h$@Q$(Ys漂ssα gpcyap @)@meWx^zehڴiLmee$@"nZ +dlɌlÒP8Eƫ(lwXZ>_X#p@<-_8>"lQI%@XR{v{B.Dee  *Š) Zjߍ8ئK"-?z"YMggP/ |Zjg':!(Z걥䷞-p@7&rZ`׿OY pʄFڗtBMЀA˾z:"d_:mrlP:GhOR e7/13 8IXX]FO$@O;nAYMps@́2VƘ7Y1 @j c^c- b=[a|6GuMNz7&&=NHeТϤ̴qI (IuǜD z$lrp`'B  B/2=v8BGN$@^MQ'`A3,6ZJ|nnnЯ{KF:V@$PRqB =~q(5 N!@蔞q!/|s?H ]g2V4^wN%@Ԟ]Q%eכX)erNj! ^ΑA[wrĕD._$_ ?+d,1_~|f$E`~&}ڦs&𴈘\O p_}G>NB")=A;GW {U4bJ@Q4.IJ$ci+ DծѨe 9f cTt_"7Lzm(vm`>\Y (D)KT#h, (< v,=HfX ȱa$@Q!`/*P(e.%@v,E$@#@>gπ5cVp ▞|;(= @Q(ĘGcԫ-jϳL`DؘHH()4ɹ@N8h Ā`H c$5|Ytв`   p.:oh '8I$3AYE`3e.&{]ܹl x=l. < " )Bz&%p>j(lwD{#L$@.!]ґlgy@9^Im8l{8ٮg#!p6: n߻nQ'|=DTp  hV@HKwxr@(U ĥ"f$@$@1"@#Ьlt$@%[Bnk9Ez.NF/K' fEn!@$A7r@ -r0N:sh @P {pgu+g{O螾dKb@ dVAN'@}$@XHPLFB3<HyE[z y kBN%1=CH"l= Ezm:Y,@9p2NVEŴ'` MovnM%tp(KtM,҅H$$@$@$@$@.#@u(]yy@ё xnk9Ez:.E1+ GqE @XXLJ|[4 +[P'َCߚ%_Ć Ǎo5W@I]M g_??Z-C*l @TD'?eBۡFTjC9 vuڼFF ;;ǟ7IIEK{bڥks |6[ Ǟ _Se2/ R n"Vmj89.itZwڶ"bB *aG{J#g@%콻@b*5XG@Z>"C>Oㅩs@1{wj8?x~,M*[L<T `ٓ0ς:շ9q|FmXcW_Ƭ;;ˀ+ N \'1CM6"#MJheZĪNARZvhl bSL -c:,la#SSj )OUک\yԷ !A{_>Wz@7zj}5G\ PraH# TcSc^k `6O s*ي? L.QdCn ;$T<ҮH@5񡮀[l#QMlm\6y1Nik1h.k;3ZܚIklvzKˍ a=ESHb1F]% zN@ cH`Vy>HHF>z7 ?߶՘3Qvm6ﯶN. @$PJPi6!"2!k!Zj|0nbϋqp׀81zȄATY@gw7:1Iv<ޫF#8=\'RG~ze#Z'~ɭ4<= ίgWnD1َf ;NǾ_v!# 3j߫:gܪ=xXh܏:U=pm}45>U}ΑV9(5(:v4;G>u_q ?r䈵eСCqbQ\bwS<Ա=XM쎙+_ +Jˏnnuƒ)",O-_tX[w[ǡy1gu&i!܃a,y&gdQF܃l[G[8[|4CK]x}[CuoDZn3F K>~X7&F;xn{m7TM8 K'bR-4Yſչ?fsik\8?xiP󦖻h*LsoؖlB ԏ^mq1rU_u}~z~ N:YcCJJ ʖ-Tuvw|_\9)SF" KҔ*Uʊ_6:'y 1|ZĴQ6cS_h 1j4LDV˕n?f&aڤQ0'=R>|we(6h8ZɁPM铆љgR{عs栅n}Ӂ<ႃ&M1hM0{!"wm̂ V'^CN#>!1|\]̟n͜!qؖ7 &WojTF-i{aٌlR; 7k&zaĜ՘pUNj=FkO\𹷼E_ŀpUxrP;G2'񁘱l/:ws9v?hW_i Meˍ{C𗵟m~'{+V 0ONΗEmz>J\xwSzѾd).="N۠Μ@ 6ޜuESYW?A \$@#P, 8ǟ /u|=z ٷd9d >4VNžOU[]!+Cb̔ =Ϡ{;1 a}15uRliLAsM)0-s:?gn2\ݨ M?>[*@!ȑq?Å/`j^fAF&>?aWvp +w)a u.Z479u> 󖽜hҺyDا_, La_SLuB뺡gʅkޖ6Pau=PTJ:5QZɫ ۢtPYq#s{,W>yz-ꨥL~жn{Z"75f]nuIf~X2,spZ}ewvyj.o ν֍.@Wx־˿ڶT'jw]|5z6CE5eJ= _1ucF$s;OUQb}h~:r꾽bC uvCѦ-T;G.cjXsԵk}ɋ8Ϛ:=ٸ?a3( tMLz!2L~-xp*8ޝP/C8rTCx~\@Ѥ|SK-;a~蟺i*˟5lۧ$nl.I7\Oߏ*ݕcOOiR>F[5 ƍ¸fSmO@e |$9-J~TVrCgwCr<ڡK!6_Z!O,8n=v^;R,Mu;޶opY@*˃v#Q]9+@vdV_Uʦ?nŭW\5@֯98Y?x n<)5m~b;=f-a}aeܥs;BmM1;yNh I$s\Q=,֦zaR{B27U,ъvU864g4q[g ˱2TCjʀYA蝂quhX([tI?R%@K&l&gh1z >P3ˢƁ*o+ Q/so6׎:ہ>W] 2;=Խ7B`AL4y41ޟj5^}\ms[Dmk4}'!557ߌE k[QڶeÚ>Rzj}FJL)ʀ~Mj"jUT5d46ᔜ ^qhĚTߴNu0fS>層FlxGĒiJb7M׭{NYD`O'n =͞TLܛ/̋Koh߇;o}ڰhӦWΙ~ڣQݪH,G?w4qnݰۖ\5ԨÏ̔zƲ1uVkA崶?QPI(_άCGqVX0/%aUfyug?iO"VERY%|Io;VUl=ow/73^_--q&KYG1fha}Ԭ*~S&No7(ʣoS"j5U+ _tS3S=t,˾a.Le'UIC{g`UOhy῿ƭ[N,TBI1z z&l .CgЧ ixx>\oބY[Ⴡuqg^jL*KJ\gl)ܑϰn>*&`L rexnkQ-k2Bƅ;<Wz fzf/˪t lc\L˔KJ/eeh[N[ >_nWOW}3b<2,}/he=S|*,gbumK}CP g)D݅c6}$j_%;!KvC^Wr=zib;zr jY|>HP)d+MIXOp\{|:O%@D`2G &b*%Y'= ϸ*oO_jh@8~SV.i<ܚ"JvKzAvudcb5r ƫ 짂P#l8Fg`Ue)x2 Şoj]vD^xaKM6ñg4;V rkwJTpsSY^6z0kQ[-GJӅxŘGli,݀ku +nK^X~`5$:IDAT{9xhxd 9lFd{ݾ7_mۆcx6^1^PЬMZԶx|* nX#v]>sJ0$\ܽc Ԑā1j]26Тs \=~:tDX_}6Oa.24ፏ=߅;]/v)0+/\nzwtTRZwi'ޥ &`zj>5k,i"L)~O1@ `b~>2w3^5\ӨŧL+p[o5hRll]<vrqp.k},\y:^uQmY_qOuҷ;u:q_7o,lR=F=)m4'*orz돽W8/ofxZ4m yPf9co2Vlٚw?⯧VEfͽɫ߫Wlm>G&xc}\&csRt<'  @I#+ӮVJX釫գeϏQOVIP_ۄ熶 |C}5#~Yd#pS,sX<8oG0dB^>!UN SD݃wGVUq0s2]=|q62:=Thozڡ@D#o@+)7Ǟ@q<}s#>Mm\*T24̛x WƮưZzjQNq(x,#vMx  mBegmXb%Vm۷3rkѺz;gIcB#*POKL~q֓=~.OzM+9E%?˟qxz9)q>~[&/zg xQ܂] & *.~|aPvV{G9 5P,w(KMYFd-1 <:0 ͺ|?Wmyܭao֭v 9 1qtʩШjlNȺ!Sޝs-٩/!6͒n}.sLo4_ +u>_@#3Z~> %li,F)ݣY59)FmL0&̫gt΀oc9sXլ>[T5H}ýBNk '{. i:7žo!h΃-Zs![$HDZjšȼԽbκx2A׶;]S`H e|!^ʯgT1A~j3,&ʖ ]6WD:K OQ)5.׾p_404l{a@Qf JbְeJ !&7Gⱹy%:DsՄ ͗m;my֡偺!g.%H8H=4Qpփ- T_| 2aB^|hbYΗjgb$i~ i=̓2ŹD1JmtƄS`bOeJg58~`P UgN{ b ;mAakPoývk(̾C;> kX? |/L>]|*a'm@F]TJG%.#v:ggzujA-KR} :wR3wes8jjS~x[m>'AJ;Wǝ:*?닷WGee4D۝ntBruԮqĐ:E٢ƍr5Pyn 27R}+8TBZ8VJRFZYyF`ןC*D:SK|:Tow#GOAfa6UoR[?+U{᜴H.ޏ>q_ g(h16n֝{ԧʪ*Nh^-}Hf0JPK3z&ch2oGYܻZ}R߭RL:{+>/>&~([_gW@}hxaK1m@hZNnÌ N#>oqq\ g ӕQ}<檗Xggg[9bg|'؇CzqN0c0mxm@H "Ξ^N:YcCx˪1,5UV]gʗ/oʩwR)#I(]z[ĉ/ ē@tmQՉtQo8阻$SDhFPF@Cpy`iVUú_Mg_{*(ŞG$}歭dd&'3)ø$6Ǔ@fN\bq'`OI={/ԷLeYܸkC%][R ,a+}w4 -O3kXEcxyW]I# Y͖Kêt$ ,Eb(iV]y[ȋHc{0Uɘ{:{.M0L_蝭]kgeKRY_&њ0v> p ׊@$53߯B1?i^8h:f=skȽN1ih[1cӈX"ʁ!ċ 8+\>V\eT`WǣfWJW6/v`a zYgIH=>E*b/2zvzO#] PR&V*Ax wZ,{xF^Xm$).GJHHF"iiO%@Xr@qq@" 6Č S1 85z 3Ǽ# ?g?o}U}u~?T9G5qv[Ý ,/v,@v #(k 170j\ ;=6ŜejAYSt>\f|UCеm$'^&/-p60D%gKlxI<YgSAS^b }YǷc'5čӯe];l%8yℕk7˒poWԳi4A>h M"B,$(&#!|4edpobVɨ|P3ס3ImU%+9'Ʊc~ %wSY("bRxp }t~:q8+td#{p(g)9 #Uw("bb0^gӁ&KN04a|z.x첓 q#+3_  b$@X0Y ȓy|:ؑ$NO`՚=ׯa_.|ϥ]6`>*4υаe況 `"h DH"0BpQ2 Η~1:]?߀Z̡U=lq#FH-_Iè_\KT l{άLM @1,f,k[ZgNJŎXJ|[=u y's֏Mqǔк~%_u $&we!,/8Fl j.l?^٫Mqw.TOzR+Kŗ:kyy^Ʃ}Y*"r E"P|N)F ms^+N4; U~~w ڄwz.l4kxkګ'jC?oy5 R ob!H:*W~Fe8vi4@"DQ:<1Omg[ME>;!g{'gsP5$$,Ae2o8Y7tRRRTEjj*Q|y/Wʔ)$uV7JRJYqFG$xg$@$Xu)ж* 8Da!Ti0 cɒ<@@^leIY~&)(Kf8{'x|VK$@$P(' s;"= 1E KF?J   (V ,V,dϑl +5xE[z \ jVB%@ܾeE"@X$\LuqyO#1{}SgٮL`TP  8tVYr Xwґ xo n߻|:m= @!p&4y2OkI8~wc)ثlSe$@$@1%@Sܬ8H8ݾw[)֣lOT "f$@$@1"@#Ьd L"$ #7tC/ 1#`roVDN$!B"!@ 5,$g '@ .!@蒎d3bC"06Y 85{_]ZLK$@$@$@.!@t$|Ytl8p2ޡmE!@XZLK' KP#ٌWCaZH8Ԟ]E%@XTbLi~0ӧO|a<tMW! `=L ԬK;ohYP { x4  p@7"3@L3ଈH@:p@7"3r0fE$D|0ĉB"!@ 5.H\D"EɦD5`   gJ`&A/ёPنMc͚H(3(=N@LO6(= E[z 95+!خaE$@XD`Lm\ v$@$&nM%( ="XHd$ `d  p@t"; kDN%@ **czoPx`IH-(ғlGLaHK$vZ^easHHHH A3$$ EFG$]%Ļ}ﶖSGٞ!QID,D# A$$@$@$@$6 t[=Q'Y#f$@$@1 @Ȭ=j#.n߻\v[=$@$@$@$P ,$&!M W=, w p1}ﶖs&m= @!p&4(7iINr dnU)j>5,HH (cU|2pd H p" 1P:;hL,*U i ĥpdG$J@-Cu<}5Xg} :׆.x~RJNCH;L7N}$dN栭ámgm ZUB~,o:=q P:7h#a2gt} oc9Fao`kK2{X ZV5 @VHJs >}p @=@"ʔ)q ğ[m#dKc޷3@#@9%:(6gBvl5 #QcqJ"Щ=CNfeZ ㉉yyy͵| ˦_ckdB}IO@47-7eˢcǎjVI]OAiO$@Kڬ˱́Y~݋x3k:t'믿8r%%,z3EGG$<]ʕ+gIIIHHH>dkKII ' ɫ98$$N 322#(N.O]NN_I73#p=q@%,g@ٗ@6Mu^]ui5-!@ 'hӗ[ /".q^u:$@" DIX_~A)}8_<@< PƓ> s 8e@aٗ_@'3ɾ@- ӑ 8@x zFP|M’Μ1@iq[>}p @)s@-3w/9kq(M"PAHZwZ'z}%Na+H!(4#DikʗYA="%^ D)SeZH)(#/M;}!2e1g谤 8bk&rL|_oz_|I7ݺ2uOGN"@ޠ-1# EɾE.i_Ⱦg JN/qRb0VD$Pd7ߗ 4Š^ k()L:p@}[\/8%=I#O%,)u?$@#řY 8v'IΫIu\i (  XnעNz ˽>DEA>@e3K'> @ eO"q@o/id_'RLHI(%d\7=pK83"$H^3,t$@ [6-D1ٗM׾-t_V O"0<ƺE[Dy4zO’V҉gLxtX|Ӆ&SIXoZԉ/qC=+*p4˒> 8EzĔ e`c"L_X-2MiX @D8E"qZЙBO¡T[DF1 DE`xo2(ayW_DJX|=@#aq,緞  z,"_q/[qRuz+?$P2`V}Lcşiѧ}]ӑ 8 /zLоN rZeEW)/l}/WNe_ z/4ezIM@=-Z-$,M7áie_}#'Lz6ĝE6Jxq"d_ |t9IK@߇%.t/4^;8`G h=}d_X}$@% "N;.t?Tf:)Kr铀Sp&)=A;F@Z}=ƋZiNo1L$Pr1@,aCz> 8Ezč@耭E@3=BG@fN@fIޡmq!*No3q1 pN>ҙi&LS{v9@A^gT@'`oTBrL3NF$@$@$@Q"{E g$@$@$@$@$@~U$@$@$@$UQIHHH(/HHHJ"0xY8 8E3V @T PF/ '   gtf*   *e$@$@$@$LZE$@$@$@Q%@U,HHHI"ЙBHHHH ( 3 P:_h DE`Tp   p&@g "   *^N$@$@$@$@~U$@$@$@$UQIHHH(/HHHJ"0xY8 8E3V @T PF/ '   gtf*   *e$@$@$@$LZE$@$@$@Q%W@mޙIENDB`orc-format-1.1.0/specification/img/BloomFilter.png000644 000765 000024 00000170677 14777360722 023123 0ustar00dongjoonstaff000000 000000 PNG  IHDRd,DiCCPICC Profile8UoT?o\?US[IB*unS6mUo xB ISA$=t@hpS]Ƹ9w>5@WI`]5;V! A'@{N\..ƅG_!7suV$BlW=}i; F)A<.&Xax,38S(b׵*%31l #O-zQvaXOP5o6Zz&⻏^wkI/#&\%x/@{7S މjPh͔&mry>k7=ߪB#@fs_{덱п0-LZ~%Gpˈ{YXf^+_s-T>D@קƸ-9!r[2]3BcnCs?>*ԮeD|%4` :X2 pQSLPRaeyqĘ י5Fit )CdL$o$rpӶb>4+̹F_{Яki+x.+B.{L<۩ =UHcnf<>F ^e||pyv%b:iX'%8Iߔ? rw[vITVQN^dpYI"|#\cz[2M^S0[zIJ/HHȟ- Ic 1 L'Y@IDATx^E?|@BB :"5.MPPPPE Mx_; *XP 4H/I=@{6[;gܹy͆W$sgN?3sȚXkz`M5=ҿ[}=PL9 b' sG'2k_Sv yo?:19?0EU^@-p8P@^` `|%/嘼]9~,=.9J7! >F&dO usT'q﫨3^B*3 {r]KoB,3)gׅgAmkA}{98lesu&e:\'P` c,dRzadF҇2Iop|s@^䫐}0OE0 /Ff2/\B52 #dd\āf"g-d: /G ]d~o r_AΨ^>`{?W bd./L 7"3NBvCP7 sGfz 푷AfĀ.O\ΘDr}~#Ff@@{+d5F>LAkH;he0=(n k(?,|gEPgq M@<LCr CDA*7 (7cQ1%W5/&&zBB{ ]9E~n9"O@> {F^f&>YK;'.?(9 B@sLtd:e.x1"3|>E1T2ȸ Rmރ:Oo!sRYIo0@4L%U+?o"3q&:A}U#/A%Zd._CFlDt ȣ7CHL{"Dw?<̠̹12mn|1c<5X> >;p™ᯠ;䧑B,2 A[dҨ}2n@2Ðۑ!3qt}lț s#o)s)uӐ;5cu&^'jdS##) E rLL9OIupdf<7(u^o:6 A=%IwN:nHTVj:]_jq^zqh F5Up@40u*`"KK_/&w%}r=O} rp2teqM;{ KF^=?SHg66^Y];gD5\oyZU;,U56Zm6Vo2N;!uNDk:VT aU:NT$u  E:S'y9y26C<2!/@Y{Ðyق&! /a7D+hSdɝ̫ a!<y2/ɿ ȼy߇i A uʊtBW.oEv+Q_L(A^? K^mrvG q-jOw8Ap<7 ~#oƾIc6G]#L#mPǗ}jF:vs)2>N/k{Q?yX7E>]qF90x7”<>^G>G}/OD;>8P<#$ 0$aD@A@NC>Q-a ƎiLf;>A|>y%(:moM PLS'vsk&΄!?@2@NgL7#mګQS&2,.5uTInѕ)ogg]Cu,(fv)둘T@#'% ,qyZ$N0 z`Wߑ΄uM?y*as>\^Z*8cq?[bxBOݑ$ Z8!kۖ2zW\/5UT|ѝ|irT6{ˑ3-v:U۬V~Rs[#SҌ"޶S לוx4hhX[$+W<*E&.ҺYUy`_Js}^Ҏ׽$iUpȯJq\Z'0KoWJO|):c֯)TinhyCk[E rLXۀ["QdNJDƋQu:R_ׁh޲tP(\hlKQ{YF\J:[usX:VźtwnZ_Ȼ*8%RUY%)-RȤfUwwh_qDim^$!C2>G93^uRT([xЯ.)91`pUqwUb mgTNjzlE3ȧ飠zV(*SZp^Σ&:1AyYr:б6 z#="fb 9&z 5НOiG|U@24MڪSU ,Ϋ$U tA-'2H.DMʠL.AQ2L6ӟz=-U3"6uŎBUlvI"h#_Mxq,Ai6FmYopt]JVc=,` wǚIk`,#sVYc"\C񱆤APF9#k R^~2= &G&V,%)+W -s9E X ّ >"zݞ+%3B2 kRvT?Js{6-IիUw3Uz ,mq2p)6do\ lrYYT#Z "3eqO~T7y]q}*gL<,Yd UZ&5Xa8cx2fXd>l:m0I!@xlkf)%Bm.0GMCӐ4F(1\Fj|:plp:gJi]yKHZU:%uK8T!ZrY/a/gz+ҝZ_^ WMgWm֦R< 9I{,n03",)Xiɮi^z")Du& dPmCE3@&GOԋg"C0^W8'tjB4fp0&HK 8Խ M86> o0Ge7S|8$˯:Dۣ2)dg`G5#1~5|SYFI .3gzAğ ,-u&1;P:HI\k5}62)&9ovJ:_cu;Eq TeџT[ q`wmp|NuJcq\͉6u\;xT%SZ.\QbZ:]:@&ғ! 202^oYQ>.xt^TOȧ) "R#2U砓cf' (SF 0Ij5*KL "V\)!{a݃3+ \U^09{jԠ2WP0 n4a;, C:a:}"_E°RNm'B"enJAijﱩ;8JS2ғGv<m oT)faH4E$<=0XMQ+ b+US3_/)RmBzuAW"Y* nSHBn-\m8wN?|rimm>zB~NzP:I1%] ߰4"lŋ 0n%Q?yQځD)k3i38aV-4Fž.tB<8ض &sGKX- qs1^:a٠Bt0;#M^imF2t`jWzܠs@0!ayrKr^B~4z l &#?%QҫP&=9Ml3t 9{M`b6eܗ!Ϟ+{:e#Qeg5h`V,JG<%Wx#:hXXG#XGHHi`>t"w̙$|rD+l]H:OF|Õ#o#oG!q'd*>I;fyՁ-XD|WT'ڀ~.:,AMAofcYխe*N߽Kv;tگAg+н )]&?͟)/Pzd.8am=+N`?ۈd}ExGyLPJ=*j@aA73֟*Q?Map$6 [VʇfKҧ_rFtq'0eKj :ZVhP5YJM ؇}zz5.˖-[deh294\f̑z8-ʼn`j~`;ʘ_5g(쾣|_]\=lZT6K;`|գWJŗ-]3WwnKhvGs9] _zڔm5'@`MS)_ ߕ=pm *uŌ1'dQpvX\ݭo!cw@z|`i3".BଐKwD]ZCŒ\#}xKJǿQr{ОȽ?% YWn҈_>Q^?7ݩpW?ۛɒy { {2g`sg>-:1rKH{4e瞪"e.ߠ0|}GF¬.zw֓vN+Yx,Éq{ʱG <>ESwI4_Kg+|p|ī ѯCnΥ/Ngwu%)|J%xK^l+/YڛQxmSEmK2qg]Tf\wrb]\%"<6 >{8W jU[e$6r喖Kp^yePpMW~^[ΒSʿsGW,z2nبnml475{(/[ Jtԗf,s9G`16)O#M/2U%^ ,ߎHV5K*L):]eg/,0gđ9XjJzi5pT3]vLIO?2gҩ_\hw+?>tCE>VPfbVyAÀtާK:FKJGB_CuV,X(͸:hmy9hAGqgQ=Q;-&}hz+6,cCn,tbAo@]l~Y?vG͹.yCٌ62@T~˲,C^tIf5Cn6R>#6+f,icϼI>Ö2Ww +L~' zm X7(S6}jx=#vNI@hf** pK~.=< (=&.՟fȭ-.9Џd ll~[V/=y2o[y98 VȼQ.giy{k҄.f0\ K;gO/ΐ~4u^WMߵ v|Gor_8Zvv3;Yf% xA gv=FT3#pƣ?#_04g>\,`xLn1\ރX E ~\8Xه+̦@ӏ9@@c8Jr~dغd2p@ $^|rߑTq|;#u4pwW9e2H A}Ic|V|}Lm^W< cbsC^Avۦ|E?~ ( DAψL+P֥8Q6`/XRXޓ2 I < TJjĒ:;Y*3x`.Utc0fp*1ȡaX:Ď &^IJ1m_o%5Hu"i1_*EPؽnS'wVnmmwV\k}C_*g8[,q1'Qf6&!;s&  }n,#ulG)-pԜ0a& CVR*zHbZEǻ uR|1,c$ E9]FSuP6hj,^wyRQN J6:>0'-`OyzR Hśx:#*M xo?(p> \ږ*.¼G;_ȖHyL,q:+S!2T;EQA$qERPLOqTtgA C9= rTȱmaPfE+11G(W I@֜Z* 'X'CZp}:1.Tu ܯi%9yefx{rN.O/׸WMĞ3dvH'ޕ_ %0ymQ;.sTHS|KubSO%'8a C'/z2z m6\f&6 {=\Ν@6+NvjPzD:={$^uLq4ºV)XOi.qάPXV2 q\R5Qa!sI (g@3TFs9YitY)qx\3)\χպ;+ 7ԅ2jMy|9k- ‘&~ў鱳[7=7 |"o}n+Y?x6_)/F?H`wz0|r)* {,*E4Ӣ|Ђ _ZK/J8?=9P _8?;| q?'-.\ಫKD/x638inF[x'.cVGw5e%uzW*T%!Ct dYm 8UCQ1mgR$:TKVЍǜ AF+ȯ#r2ѺG+꣗L"-ڒr⬭.C>;TGB4Q;W^ Ydn2>l '$>Il2w>'}r;C0N{yx}9pOjv%BCq죴}dהbpjؕoLa46 ~P`}MqśЦBbkM4|tE18ӥ<),RҪU_h ge_+|lor;~ ux̷e/^xx-lo8#|?f Q}'*9ryy<>S/K^UX'd-ci_9_ʛp<: Lj23?(|/Opl?uoxn2mփdꋴچL$R,/ʥ1ޢ$x#@(ŨX<0H "͔Qt9ma^up>82 6_.2 =Q6">gm3fC{]; l {V*;و!^v;"_?C=v,K.-SXAAc&g=ImCxS -VT`_|{r(w"W챈,$j2T*3?G{u6Fb(.#.1G-klӘh^MQA]6P.~=_}̫£ 2A\xĞx!!hi Wc֢ 9> mP667Yw8uhG Hyy~Zz-BV(8 |WL"iQXĐ9* @0>Uo?URBzCqBx8hVB"{u {=}] EDz3R:<9:Ԫe2 G|63yj ijBw|+44.s{ܚxA>J =hm_Z\zrCS^c3!?;NLvՍ`?vny_KW!mAbO Bj.\e<"RU502gJ ;2-؞(saj_f;)Yט-Y0.o+9.ǎ&O8E$4xWk0眰/j*S%kÑ֕fϗ=W;n=J369S;C~]zjֽ8Bޅ\q 4|6XI>b-c*~4)\[&O r:.i-]Yq}.ClŒMŏ)q@½?=TXF7II;6ܳx,&QS9_=$L%ƌӷOob9G22 xKW)xXX{.xsaYa躵>u1<`Mp?0VGOVqI{el3J9sۚ~"J!J,2#.H]*4ifِZpD7P:F˕M|ʽyTfyutr TU­`QzoMR{e2{%fᨴהx`6"|./(FyϦ41NBw=̅)Zn>vyp3-ڐ@r lEM ^ xZ߮K,B"N~ pn/"Tl#/":^Y/1ȫN5 6xhJPID"l%-Yi33QGB )D{^49ד/-UET}Jh"90LG=(J6fEdX6JHl gJ)T ʼng(. nzD"Ac$FGʨGQe]ˁ7/mpdqq~6K' 7zodb`Uyя&? EjV@3KY2m?)L 2:. HVD8H@A)w*O^ˌicrӆljDQ(82dKm_ vjL}n*pRW 1h8jPd$ ~b R@VR#IZ% Ȕf/h_)pMMy j6RnTd~b cd[PqKy'DGG@&4z形e Z8k})VX_G>@V9ky`).KU1TĜCjWs(x[275UNzFJP D*uoGഝ .Xs%0[s:y)b^FOM&zkތ1մ; ^٪%uתwf7rdRxPXסc {x Tpf\&uuK%g$Ǒ?Z8%."Ir}r"8Q4޼w&@ }z~JI뮃t}TP'7կp#hKN8ؼ HU OP/FRU 6/\$|"e3y;)鞥B?j\yc.fƨdv@9 )J:TM*I63цt(<6R~5I*YP$8eБdu9U tR3g?9qlÚǡ{8SXT(+t\eXڧ :g$ePt,x)hk~QٱԤzÕFV$Mь07+ >V \Q|t5im&Z?Q)x:zYIVZ6>Dɦ<sHa ]HlYe!g×s[n)Ql8DC晴QaOtu}XED%)r[393^П Gan/je\GApg,[ 34do Գ_ȫGSg RG.V]? 6tQkƖ WͦndέFTie5qPЋ9h`d/XܼB"iT2"^؝Nɜ4䭪"oB]!.G~}}*'yU\EJ)Sdld pR @>Ն]ђ|E]Eި Y,./~^t Eb2pz)RToX+me5;ގ,͵n4`m z +&Pjo[Zһf$u"!s1(X[%]Z&Y\(+mŔ|Κjs2.S0xW?@WFpY?AEH_sǯ +5MmN Y@JqL e׌ʹ@Q3 (&2]ޥϜcrʭ#rmH߆H!AY# 1818229C\ȵMEr%`EE>jh:0*4T-94+(4H CQ5iNY5LeRzQyXzyX^WZ6:xIHMzrH֪Cs~I u|흶!}ڙ]By634*mB:hϚ+XR-q˿ZVmDldA373< AOjӓ sjŁ95{6 A]@MV*Tol,JSffl'~O\agr]AKک~ZmDYUV@q5wR8y! %΃PpuioJ] 3 3#rJO9芨lхhvQ [%r5̵:7tB-ZxwKtQV%veNnml?QFd~l,X>%hT5h9:z:bG"* UGhVq~~4ǥpW|IԪSw1!qDZ2{Dr]kS+X @4hvE{+J'6 DW%7ԏAQKH~&m52ztK٪:=&.2UVRU&򕔆:AθxzoS^.o \#2+g3?A5KemO\qy@N[jzUw-)/qx}qXUNc^M9eNL*9R:E82B9x 7Ӗ=V]3c,:}};dTz+(#w2 r j:csZ6v]^R4vfuV=ձz5zQt󤲉fI6UOq\_8oJ';_Gjkw^5i2B&Z٠x;Q?ܩ|_hЀADנ&JjS>Rt.ȠOճ/Y.NL8^牑n4'ŁgJswTA}vqG^S2N(3[UdOE{nv~.P"O̴^wr8P=@G5!q,%d%.`0kGf>1; Hx1OS,x!^Ǽ7gQ% AeY$ϖOMݵ:|`z D#"v;#>H2(ըͦjo4d[_(NQ]&~B`gl^'o҂`Q6bmBݚJr_nysf>OV,W&=Ӄra,U4ro7u?I2m7==z˻o͖A_U@IDAT,[n_kDqd P"[S$sgACʘ-F3t|kO}/0_ܟa|Uհ#:E/( ?Jb/==V4>(s4ht6P %y}#Gy 3kƙjg? ̺ŋdтzo&yB rɩò™=ꕷ?@`OCk\44HqՃw/8X9dCϟ7WN{wyۯ&}\1۲oniY!o|M>5CWAu&m&m|5-?6/mh}OW7ʤ)>+lo'8cPZU,hgC"9u|M9e=E;p"|XѨcА:lC#nb3pէK߼ ;:I,Z=Kf&9MsA}d~W%/~Q,[2_peС,Ёln.Wޔ'&> 710Nën MBN>"rwG;f'?dO(Ӟ"'וg׿/2hB?8',=)OrQ>d9rMю+x#dw`敭] ]L>iH8ZlES(;%`ҧXYq݊x; {~|I}G`D@4Dr7|X&˳y<чʟ9C7XGN3Rk 2|™_^{ ng^e|*HK/|ק*ԫՎȮ:aG]dX~e|o8f2a;Ezr̗*:.xN cqdYgNRHJqvƷs{$ PDZ/^ܴf0?P"='%fc\Z8~i{,-Z\.-ŏvջf(,f+GTWv|6`o ?k}(13:F7?@4:Ɨi{,!SXذJC,0$s8@1ǂNq5(o8*oᯐS@Þs[/~S7GOHwߜiW/"6I&!%4 +nJ~Ʈ>CDϸb6U<\o#ۀr^Nm}=Q ̔Fv}DMJF)2{{E ֕'=͙fU2nmzmk38QՠIz@]`b?pŶix*|fgLDXuKNJ&C H:gTbXJs9s׏8@N96kɤ=r9ʧ>^~p />fQ~KNyl" pɾb2D\o+eÎn0 Z'3.0`~%#͛a6lG j_{q5eA01 詏?[x{,͞ri_]t(9ϔxM~B彷Y|C=]|zzs4\![\vK˸g}H/:NWowX'7bϞ"v|7|?J,Dy0 gx )[%dH~vB/F>x'yf"JB'4Κ.2v=G>2ʳSet>Rc%o͘A8OUMKue05Ȩ| :O#dUŖ5\/+1[V tn20ҞKR\ 2%p~=yp6W-W]Mݛp5I $#6Tp7ߔ{oLrY.؜sZdcq%l~26S/Do2 1Con2v;9KgOqae޳AW8A65FĶ >\o9h}#LJS<~*7oIϽx=߀3\X'{&uZkCn~<}@7OUr#taN$@c0qQorU"i\/m Q%x:M/7%ܓyX?enRAXS+V g ag7VyrاY2S9H vf3Xl,_*{b Q-M/U+JwN\ GL\IRL&cc^0U WfXIǵp*'JJb5V_f {=TiJs҂nxҘ)ookJB?V k9 V?J%4+3æ˯>[|۫bLl: vCR9S󼄜RnSM0f; -G9ӜA~D#ddI&X݌j:ʨyIFrq'.I"Nx?qaFpħ.C^/360=%S<tdXͱ=QYގ7I2}0-B&guv=F <F5?fɼgNNS:F˸2M):.2<ֿ&8{ʐ*P W2m*KјUHeHf:  =9*}rz

joa$JpWF(TXR!9YƔFYA0jW הg%z^usXV}}9Q>sĞqo4 AێusފW,DsLKA7U ͠Z&E_Fwa9s?/w!7()b]FQGo\ǍȭwZ2|Ykk!XͧHOiqiO8Sޱ^ua$'g\G Xo s>{Z|NJ!Ob3L`g'Ɏt)}Fw҂ Q 1 -gW]Hƫ^[K)R-[l<|P9#5[l2v}ȳ); E7b |>VWd)_8B9X[y~t&2Q;j*⦔kΝ)rq|(KV1˖j00覞;\(;蔯zǫ_o½,xyÕ+eõq_o'e[0~Ӝqs!`v'iGWlJpdb9@tT}ف#gcɧƩǡnui DAPuQ4\J-+،"e$`oT1;l֊&t^~:y&3^"|e㕯[S+^vlb|ڐᬭq^Yë)>`e MtiiQ0* lsJ wY D6Vs'XyߥXT %Qࢸ-+[n:3Wee,]loo*?6 l6L`*#*F<]Ir8pӑDc"AKw"0xIZ5}GreGLKYw<9Mi0<mT *P%AG:Ӣj Ӽ~K$N?%⹪"e^:j߁(XK|)(;1Ucv&.8(FO\GZ9ȧ:\5]_K|.kW} rK~^92#gI˻BLevQC?y/Herks.P)`O@<dCSaO;J㪖@VwE<'+~LQWw.gu2}_wE?_ 6N; 0)rps悎lX#4IdRLhvjQ"OYPn|(چga XF 5X{"_P/qhԽ:cpt|!>OBpI+(2|ElC*^d3Q?SvN<>LJ'& 6T Hrw3"E1>nj5n %Z2NFBq! .')[TV<@R\ *ڌi%UtA^]E@_0bSOd+]PZ+:dύ*6STUA?ͻ8.EwirK!ZlAWFV[?ҕḸ*c`mr&d{TIEmJ˩T  R5ER'#Jz/2U6$ƣ*EŝNK@-# jhq"C/{,ylqEPqd ({ WU4QU…ީ/H;k/={@ի=EƎ>VS=>~jQj] LYoѽ %\g_evQڰ:2Gx?₿B˛ne`QsL5 }+{SO=ԆfJ*}\ǻR\Zw)Oʤ-^uڴixVma/ ..?@0aB˦bs]3[y~%6aB\+y7>F=&]Jz ćȡ ?^E>NKNzo@z EZHJx-\[\JQ(A"MI-=!$rZfD}d{fVgfϞoڧue}2oGkf޾ڏ1K> 5nyޫ:A~+Qt?a:w@< elW;AjxΟ˄G ݢ?;b}'yҴHaLy;]d.Nitz3t.tQwgd9O m%x00:S)$mB)`nۇSVx yF Zm N3x:-84l;l^BπMwï1Ww u4θ|YZYnn_g+^}iSZm?U,x/ʏ)WtFOUxxm3޺R_77(ْ4v;w'mG6_.|:_d;uKlpy寋?_VMwIWM]=Ȼc{j+KtG$2ITV19fqFGYT;b>YB`!]RNGPF:(3r0jN#Q+A*Vc\ D;_yf(i)VKS:"|7 8? ]Pk ͱtiG"ڬ-4bx}-Pe$Ъ)9iYƧy"'Pޜzf:rgh'2y'd(O6L-*!/&E h]N3  :hGU p/I<|6g s~@ǘuyJv:pM_SӠams:SVB8ஃM*:y #hUp`nA%0ȫwjN\HB(5DŽR 0ّUQ)k* +<I@ fgSԑC& "+t?XEBI lv ';չ~ Zuڂ tfBVOfSfxmnh? tD XqА>:8̱wlc9lh"pզyV;DR^A^$'BןA#{ htO~`ŹA6NR8o::ʕS]TҳSu28Tסlژa^CcL!IcKItBhTUTڃyft9Rg9*!M.$mCe4Y1䗃Eg2X.K!F9fGW\lߚ\2&JBӴ"gNx\`F12GQx5gqWt_C@;w~ig&i<6IK~!O; Qp`s8uJl^as*ޗJT/.ʄ2K\ݧ8NЫ؀rc~;~d@rC5.t;P\{d]F{Wx; FѤճiv:cRDq4bͱ|-p̱~$ױ(y!*}F"0HuVX)w>{Nn;ʑ-={vǏ$[Q2Z h^~-psᴜ7h4G>jG^3St "ٻ]Fyy)9p1C,`{ ZBgllh;~\ޞ6K _9x_r'k© aBφL+,l18单Ib=E`CLD05rHF8x A2C`'=eZ(yB_bObr9WO=/GrOi^?t8Y !ao;8tOsaR5Wݵ~KT5Y2_5={HMw!Ң!ɧƤ}o;]}9}e1;I~_}ij#^h+ϯ_r,jKeϐΔ*ɯqVnj+ i62/&?U`Zl^mۨr[Z=C4ɫV@h F ۚKױܩ4Vh8CN>[Jp;̞@zUK'9W :Ềo#{tWRT ٴf1uK?h[I_4M6/5%_{c?dh@}ǭ1M}ol| ޽l/ 6 {7~u#ߝ1GijrQ"U+Wltk$4*mF]%칓^?lxJ|(,4-3o—r38p|#y:+e* ;l5Jh4ۋW݈/>\ d>+Bg2 dc`5(҄ 5c*qNp@4\-w\㥾_iƧDZ/.]k_4<,_Ε2;{|cnjbO2wrMwsp"At9*Ͻwȏq)OP'L p~k9y=3ryʂ>^VO(?1ULа5نQ> *?,6,{XwHv7R>cyE0~d[yU2c<>]DZwB=\z?:I5Y)g^zE.?_`,EЭmi:<ifA^lGJmkG'; +XsE `tD ц0?@r8s(Lys*FZae"-6H)[n:_40J& lJy`Oas,^wG:,&&) W |Q{S)&BQ`?hȮ| |0}6~b;38լˇ3b9R~d>65c v=RUn-2{Ag0x̝@|E$3ۘW: ;%j9ǵ/d'7߅Zw+K1o\;>^ ^K+'Xǎ#&O>}plcdႅR ӆzAb=w 3S HyQzo[}IJ =60*ZXmW+czܐc.rs,W%.Oⓠ5oy O)Bzy,0xN~v9^y+']#Žګr:5m9nڳw9_-cHx9{&@`/?;wS:<iaXs4L|V=0YF XLwV}/q.Wr.ct.U~6}isTTᐧu\~]r}w~r2y <+f'1N/-F =JuOqؠ~rmg̫H2[gmXȷYa1{},4p0^qVSΕw<;k6 ӀEo@"r8菎Ezڕ 7-1w>*n;Jf~ђ'I!֮i^|U` .Yt[m&sg/p),WQ e|Cbܕ9u˶hC:tM^ü04k2#ѵ M 5#/^. 4a}~۲-z(y/^1?e5Wu[:UX,F0r wfhnKOryduäCMvɚ.,^lvnJ\x>7˽/8n&7H_Y`{ }$z3yV*0c]{g&;±Q-HT1<"zp>ၽz#]=hQKlX[%sZ4hDUPmM-EK>2QZN@*llA̫.0káz Qԧ7 ؉am6l5pQ& י=ò )]7:ah 2 zrP[%R_4U8EX:abY/;.ԪC+B5AG$V $/Cko^@JG;Վ)oh?%--( 1Ift Ju*466"'*Dz9BiD÷deyJko 8Q3՟D-b4nǬ( +d 4~0Zu'y>,_5&Fmp͇`t /I+,s5$AUі4+^AvQBsUr"tpXna'$QI4HL+ @ϪQSW, Eԕ&_gaQo9rV86+I-<licz .PQO҇λ9z)7_o3 t,%DLBlOKN:9Vq4xkl(2_Fj1 ! m$NP*"]!DBb: A6E{f- Nf5b5sQ2F*'=y\2Q(6O!Pg0{̉c ,5F>'X| *Hlˆqa63!q p8bV"utV}I |S'Q\ļqY.ҽv+;F]Rժ44hvDƄ95B: #<*]:1M tuzG:}[AY'Rӫ.;=`=;F_8)OcNL%qg /o\+[-G|yO[kXG|iG,+6Z/WG:,]UPgP.IӴCP7H2l1qIva4`L'qCHWW̻J22tr>ĺ⍱f9vHPڏe%zx|忔ex60^paS}E'5-> 6uݬP6+!WG,o4Y-tfJ[k=ѹ|o~mϹ'2c ,8-;Ǻ 8Bd7@\Y7hH*=Iz>9vVe+*N)nCEAl$:HUzX6⹃ :8\:Ǣ#Fke-W  t5adEqOJCzR4(V?:*ˣ\\*Xypmmk12 ;+>@_g⮋F>F5olpQڌ hi+wi2Bӌbt''Uaqd5P>F:O;aRHRj$s,ltմ9-ѱna!cyHpD8%ЀX\tF#1wQFdH!k@:c*!XOLf%1#b5؋\V8G]wb2!B,du<^E'%t3060ҺdϴRPk Y%x3L?"ϱC}btX/z&XA@1W>@+15 gv'nr 3( .U3t p\tX7MRW>R㥙!('gOKUdd=D<9IÊTP%HBLp.hwr8V~$rrɭS 0!s Bdtݨނe!K% # %,M+:V1ID"dP69H$BBa.3"L,yCMS{\IC>|eJE X-3R|,*e83:=ݍH2^"r/sOo=]VvHr{ILR^ser2I.?5[U4=fI1i.#r-9_~ﱌX}.pRpXhP%<8`Nu(ʟ[iRaYe|oFa6vLQ'M4;d ԥq%~2M*cd30rRoOlrvcj8{BH:IX)=ԅ^Aēɴ(d9w:3, 8KP~ qN&2%db^Pj5)W,gZ`nl  zΠF289eǎÊ9@Ѩ „PS SBn5P'4Tm'JJDLR1VyؔF8h&vP| =ܬ[Œk0Z`^$$ɳfR@*@kDOfZ t;^NDL"BsZ6ݿA3YI!?Tv5y Ĉh4-V9D"mR:RRr6 Y`psױbE! gNnOS[\oili֞jfXrNqek,Gf|gRizC|S]fL"3vL3TF]zN&Eg%9g%h| _=@xȯ <9`^k80I[8ǀ'߯H|trxY5qbŰ3`|=DfnB|&3P]݆76ßOĉ'o+9~7ykۉ7=q̯1#gOpc#?1dwCWr/݉B7=ȋ?s[[M{}ZՄϕ#bs} BsZXW;F+XqZZ[۪# KBbޅ✮$ӑp%6vFt%[++ɬDix'UNVv~jiO/rj/󄶶)Xr0)\/id@Ƒ!N4ƃSRB'Jq#A'%KDZ\#xJAQ9t?F4MUUt(k8.cnU@>9Ȟ0cCA@uRD\Lx4 }LFl^,VLtOy)MH!)7\~fp…HǺ L΂,349 qig8Өi 7(Z[HT2RQ[[%HCA7>Y^QNE ̃$0|Ph HG(`!ϲZ;5H-&nsǔPKK̇P|"GzAڔ?M -!3JLL!xc˙E&®]GOīZPcݦ)6XHS_85d]|C.Yjj,׿ZG9uXGA%sa'B 4qHt~=ׯ=ة3 l "vLz5I2,f2頄$fM2xI,dff:٤N'Ҧe(#!ȳLL2) [`C̟8dCqG"M'ia1N@*Xi 騏$aJhM_̧Dg)SI>E|Eep[,t<.G3"]!aԙg|7>2s) cǐf41#R1KHdP9D iF9)M ^ %<Ο i!"1+$qBЊS$HRnL{"#"#ڝIgjUxK]ԕw%! `k%DۧyyˬJ aKS;1T^.JLq.\2Rxt9OC:r|%~{6&ssڢqfxq%s;0'xܻc|[D'܊#o4QS\qE}:\n+W";l(C$O/-hc*?# |._HO{*gAiE]!Nq8&@ERڌPYm I*Y$IcH<\g>2eS.C)*MG=vD#f"^ySTXtBLP m=:|SWݙcCk>H dpa&0kx;;G_Wi4e6^)\)-ahv]z\wWJyxR|QG*si09VqTtW4U8T`^, NƮ儊!XWJwV;aAAp]E;ΛLL67W4ip]g;sUSs^: qu  q\H<&i-:j@DFJ`VČyN`hɝ'1/d\?n+G/%(-pzu"FM;aO,'6*_]XY k4InG4Bv~Z6:[ .Mgɪ,C3 ]0wZ1)_x-+ o:W,[2/c->{[O(e?oy㍲fjoLer]cʤM)egV^3ߛ!]8[\>x UA&V Ʋ(Zjjj!G-Ӣ.{}=Lϙ-;FFl/ߴෝhSЅ]fSrůmwM~r1_*`gxȲb~c 3X"]5e:"ش~:0cjjd9Y*o(K*܉e' @1@ 1'BB…1 7kl+O4s|T^{m2߳/Y8dt=1I{3Nv?u!>cyf4+n 寏?"}W֮nG'+:FFCdO7Qq'9t2䡻nw= 1{ʒEo=7r+?s:l:vԥ`U:{탞uRn_N<j7{7_~C ' =tT:M7MGo-[ -O:M{sȎ܂wk^'7_Cʁ|N6b3~D{^WyY#veGJ>=dFyGeMFʌ߄=/ѧQFm<ʴ^C?Ivk/ckiD=X&X55Oܚ7oy#Ҋ+EVC>_UߺPS;E'VU sE2?ϒUpBh{n9}L&ypdqJy/{xLrmߕK3` @C~ܙs0``YVj`Cb܅\=7֮^U^@@9GﰓlV Gl_\"_5ye#W9.D]-}2IOr8v {"aU[7O/s&n Zdm/|zo I] t-W=3mMCcU!8N<# Ibwjr6^Щ/\"b~%c>rerzQoM;1 *J GyAo|GgX)qjӁ:si]t'zɏ>#zR{Qf$ڕ!EfiwQmo]3֣@E.:3q/zeҭzeo]-yeϗ~up9rg ML~_ͷZ{ /FNҩλe-G1]gw_{V(jNۨނH]nc Ͽc1s2ᔛcA5UbvJFԢƻ o9s2ܧqWbx+kWYjhF,${|ӆ+0[C CccqޫQ}Qz+AҭGO޳bKY YȏĐE8S$Qo5g'˷?Lp~ҸjdĨY~6xu]ȗy|䁷gc"v͕Z*| zSO?/˗.Ztn{4b }q㏃mj?|]{#G \' mXW,OޞrVHQBcqAkBDKJ 6.)JREt.=H:ψ-F7v֫wZ5RߣBQj8<p4`h!. 2cwAoЫSsKF5Ch!Ѐp&>91a;ݱ 2Àn=kdڛ3ǸQ@ !oAC.6bwQrxmk/Un*,U++Ͻ$ dO緲fM;&k叿qһ?zիPhPʹТecYeiOQ ܊0z 9|Yiɻ6*+{C0h@YS=B=uK`RCބ6G@E;m<>N9pasĆkW]?VG/QS~*~\Ƽ79W^q3n7b] O֍ԉ<8QSH3# q(|$Kl1p54_ŊJ,*d7Wom:\~OI\(˹?Z2W{ҷ[C=0/g_CeA 1|8's{ys^s} +ӯ?.n.t]F+0=>!s'}[.dw3]pŵһ_Gǰ5Ne{|],4 ` 0dMO[T17']$ȦСk4o_ᄃ|-K/1 XWctҋ/*ޗonE` E[YnFq|P GXuucp/|&hT0+-D=^;逪o9;w9U؄1:PYl.  g(V-_E #?>Bٌu:B/_B>5+- 1X=Q_,0REϛ9STk1T κL'!e>ۈߠp*Yr5h\].Hu3.,! mpnùhq[&Q"tH,hoְ>T!#]X%OcC3>CoqaB{Nش{CPX)`Y8/oXzMu[*4´B]_s\qcn|nYaQM}:@=~DDu' ep&=6}کHWMV$C9b(|ZX(uf\}ӊ#}}u 'V{[|nz7M6|aF(北ރӑT>׫v#y vRatlix 1L&}jFrp؋ ͑ʵ:,lvp:’0zf^UjNEXCZ`c#Yw2oK"$Zs$\*"9ǚL++Rp@!fxQĈ\r VzRq| \Z4HsEh婢3Z<*0N ̈́">4 ]\%ۭBGK\^L:ӑex7ȏ=8nlY.|| ('x;'IG^zu)ݪ?|YjJ਌,бvȲ'(0U,O#CPHj$W@465r ,%XMMAT!Lb*0S&eiz-+Y(.+ 9f!.f%tÌ,w9A(.G^ց*YXAv^k~=W#f ||E^qK.o}3ro`]l{v\S`;͊]ֽ'xP k4`qunVt`2tԑp"?]*Ϟ52!Etq=TsAc{<<\_%/>\xݍ#b 7 `lͧœ)$-Lx]?f/+Udgs:L`hЀC&W𩼔.$p^0ZQμQ2Lmr>e0 Mң_wcj[;f5رpM??usֹr[K/aQN Ws%]Ǵ>^R!-WZʗ+ADFe<Oy=P!c# oipGxc|Nyey{cb!l1ms,zJ8VG 02%0U$ryS`Hhpf90vڈ(H?^<{ZHvI:+|SJԋ w\yy9忾/'%r5?}N(ǟ_ZA,V`JB Éy4i4([N&aPfE2\8|D.(h <č~55Ǡqhc]q<R*WHmq)ҹWu,A9*4E;tČ!޾q'jx' T60΃N%:/|KlKe!'aYW\E7a_`g\"c;ntW9[8PpǗQ1ÐKdz f)yd !t{QJ -@{,Ș!ta2NWqZƕhN"?qKӤ-'\qrI;2qq^nHt]7l9%c,ޮ?6qE7١2!¹ -͗6Yxv B ™.sKKviy94x|qU]*[fR]nnS erdHBW''SKE\i6בTL7ݑ 8.X8sEN[sy*pweS`|F1#) <>z!αZZbuJ  yBnEɬUZMFS&8Y~JJƴ a%ِ&F<2DVҠR4"#Kx@0vKLPds4cpN[OJC  )αjk{XDY!.0>I7\%IT,ѕC\6FL"mY@B|9@WN>i]ȆϠ:FA>d9齌SQ>t;?qqֶ/cqY: Ϥ   2Eb@J)@r4`$at+0&(ME5cL<-dyWȐF8{!c:ͧ*7Jpױ.? ^lwye} exsvRvp4#X#b.I0?TL%^C"ft= gp} xV3!Qhkai\Da gQT.7 l$p?\gcuVޱ"IQ fgHX.nH]6rc &ӹbiI0`.']O@"N0u;Rc (eZ(W*vZƤ/Ҕ;}G9r0Q{m.SalNqZn|r.ƴGfpNS^4<ʠt|E9VcۡY dC!,18cy`ZL z:E4Or4+]/Šy08i+ g ) yёNW4u:_Jt`)oQ/>'^bVwx`[g(5rӱ~CCԳH8E K#$ 5ӣ@WY*ү+_NGeƁS4$YQ;.Lr:[W<9αNDv*Gp̱PC\hg0/ NZ{TIBaM|љc=?;+#Oqs-sp+@H'|7"Qmԩ<$ Ǒ# 9-ƴm.b &K{pGO/jj:$b(-uIia;%hX1Pe 'z!S=˯P0 [etUQ'=TcUwZI::a궵fk3{'OPe O vC*q%PoC3;DvN? ɚW4l\Aƅ]ʭsq151vĜ.wK{zs${n_YWf=8f3fq,u e ҳs1IA;2~Z8;6ń{ikHL7n#}UaoY_~q¤I܃Kp8ږ 0 O!p k㓸:t X mK=oժZQ F0QsOo{nn5楪]1aThw"ƾQͱX?5l h'5-}hϾ{]X~^8ZĆuRz-%/VL6{yɳ9dOj'[MsŐ3xXࡣECjV}=tr!#}J)iNPUou|ڐlx+5x3^ 忄Vkc} Y[m3Sװ]2,?⁰NיM92"m%KYpEy2pg[#-M-8nhjܦ"TU@Z66ߵ HSF,[u+DaA{Z Y[<)} aLZwөDS ?qT?Ҵ#z)(Stp ryIv ʢ$;$[z"eCOc]詮y$a5$p5>4'|3\᤿Nx\iA|xU;oZaQOڴ5@Ǣ)&wF(#8 $6Sw^U.".DgHbspTI-+IDATcR R 4.m(ʏ2< ;&t#TwЧ1;gB0&rg0(Ќ& 08XB:Vɫ"djpE&z'eݤHow>:OX^BKuF ‰3h .Dr;ֆ蔖1ЌpLy0c2qV% tt.=G:rz2dLgZb\ s,\3?`c]8̱(T?h3Kg>48‘1xRN tndflق[ 5˘r2k238bh=e8fM.cl4vt8eX>+40gr~4 ae.s>8%9_5QfrnL: Di djIPh4IBj=VqΛ.0O.ZD" =!`HNhA: EA`P-,Y'_"@@EDF4H8Q;Aж-а CMhXo%ʵTXwṟm$*N+w94FIM%:gE^\INL'r:"ByrD|N+H"p+Sa)NiaJX#z2T_`|,G zGoijVZ4ֽ+5K? ` l08B:wJ):Gx PT\s>| .3ɷ|&?[2XR2;q٨R̈́N3V'qtsmlQHz4XuM9f9~/5cL \2- I)@ywp}(m5NDIѳ !C&H;pJE;S,OxS+^UV9Fl Z%kSy\0!LkPơ$P l2XCϭб̓BVQ PcG{5iwxb~akxϓcdk2^`ӎ-\;"i);E@#@5_v,獰P c:=aiӤc aNKC :霯s)-?l5,Nֱ؝YH'4+u,K40y` P6OC._/uE?:F-^*Zca$:U?w,YBvvKhPj,Hw*JiI'fȀW;X_"[@v:Q !3z _#+О9w|jdU!kp.WHUK"-Z#%L3챎Y}>SQXB$?ZL)猆NXrSI]m3fG9|ܧ{nvte#)>\yQGr(;v=q .(-HC8{\љw4lYȨo6׮^#<9k:* KY@ Jh"`-ȋQQƨO& _KD%Ċ1(v, RYs;EM{̜>gΝ;߽߷k_'7:h*-I)?8IK)flҊro=s%z|;RZY l9H^*ɧ: s9j{ 8?^l >»㪃" ֭[/_uT4-Y/\"?EfX !Q¾7}pI,Aвo_}+SBcp!L>-&B8c5Z01u=*M'U/cz\Rȑ? -8vd3@)to̹Y*Ы~ A ԴImUxj3} izo% @iӪTb2j0~lfoR(31m)/X,~*Crs<g`e;%\^8K,}5k5P+zsiwm9d`(@sN싯K^x y懳eڬҾ15պuWS|dn GKjuj=om18pEt i^9RE}2aHKlFRPcN՜"Y%.8P壮Wxc,>:iTqEURg٬}<-'yLԋW^ѣ.O.=n+'ZM6S<;e7!2䊛@x] eZn&Kv1gJ,Tgu_f:YJ~432lp \:r wk[w5IV4ʊV[^&yI9+4Xj[L1[Nwy\|zz}R7d+7&/G ͖6EcGN־ڔ'i>&XdE *A &UdUED:R OL~60*χaVpYwUb\3ɿ8}ԉ:l)Hs.j&b}Qs=)0}Bu<h!2gʛ~ݫLX\qO0^nj +?8@܅b%'O'{oCaFށ}{6xh_;=%5E{y09"}3\!=''̙H>YDOO%Ks1+,ˋ=w-1Se=VIހ~)Euu~MOCrЦn8r4ʃ̉澽I3Yͪ#p$2_}W㠝:K\Z=d 賽.h{Ax.\ /d5.BLG8 i hH5~0>.I,Ae6T{ 3;A=i{?7} v-76UىGmY+\8Hz;^E2e{ӥm6}tv\)'LA3u in8-1 eZ'0E$MX9 p$]Pj"NW蒷LiKl+.0uʊ*R T*Ǭ*}6ygVe⒍j M .Ae:<džͨ߰*rë`O;Jۉ`YܼuKv¹vl詃K "eZhN+|w]a7k7{v.lk%*ʡqj m ={GIY; |IZl.:UUGhz4$RGM1e Hav&r=֯R9 q7,qR\!ÙNˀwBMMҴYE+-9MϞ$ʓIɧh`xɧ&8_^x=١˶ܴ&2%Id=J<]`IԄ78W:\h։ǒ2 wG(FIW8# & rW|\Rai=%!6Gɞz%Yx|+⮸ y ɲ{|oƺɟ_x-ީ;һ{%c)ݡkǤoNRVoY-Za4̠ml0~~lW2E7jG!Qm8cq F)"XFK~ڻd~piyZ bV/ZN;y2Z"Հo)6" O/>ϔs9jEKq.~ 3,zY]<K/F!_sruc1L )3Aw+wPe=Сg].c deX:h>]':C#_qؼls<|O4:NjPR sԋdXF FL~MSirTî8`=i2Db#8.tWx>TF^<]f]A(WpQ{&M*![#gY`Y)Ի_#K}knmܾϝ5w]dzB#̀>qNlgrtA'{w ,Md:;5*~ּE#w _)zjjnnI`N7/˲e+d3d;H6(d[ȷp3dz"6yLYq]*#ܑ҇{F,sLJ 0^Z(+߭{kܙ#vM.^~b-*B[vliޘ6dEM46A+8){-xɧ8궁E ZCZ 0~u \􏑰|z(ڃzx\,53Gq^F{@N6f |AOkmPYC/`}O@&}žc"nga%5s&#βdHYrɄZa/LK`*2'tB/*dKKC;T L'JۯGTM$JEp<Hy@t$ LI̱׀"-N_3soŀ(~YЉ<]*)W8mvQF4 | LGSo4?Nٴs\ۦ(2FG5Z&(VQ2Ƙn4 GgE|"GsivDpGAYVr)s\Mۈ%n ;&0 ؁RY}UUB۲?/sÎV҃\薔&=Jh 0`8hC'#f☋IM$ʏt1AM*4)*+8D{VrZjQ30kV jP8l7 K'KB# Hhp:@hs0av2';n#̒͑Ç}ѧ_[/Aӹ8z$+Uޜ2S>bArA{$p<maΖJmdrt <>c5"#&cnÁrnz(4Wi: b[LkS&8-q{5 |"Ze4K؅w6toZ}2`ry'ʰe)ɻnǝ{ʄߐ#|ׯLw}2or~Wd,s+i/`*ۼJloBО$;s`Xn}6Ge&Kl2O>21>g:>̏s&Ch}aUM<羢j(8c|ob T= ZZ=jp؁WYm|.1)SCi2OOZs:r&:MOs~ff ގsD3J,ħuwRƒxb?U"ϽTQ3Gcdӯ?QsÄt٬ap'w)=nRkX.krߌwOKyz3b`ͯᠧ'^5JYNz(M07J=Ⲅ;Fؗ-WJxP|'A<c zA6btg1:~4xa}sO>4,<ޡF}p$5,/ `r`(fń9: ٕL9Ax vTPm IJqgvX78Cf>x',H-&ĤzaIQnu9\ hk$k=гA;}rdOY.>s;w>!r|],]:l+#~~?Z[=xdú;+c$.\ >vG+hSbx }, QlktƁiR^aln7qS\kZ Z"8(Uj0T8Hڳ@XNi*NpOnD=UbO6QfAcGRAzGYTbŭBx$ALYcڑfPix(ǗsOI+erHJ,(mtXOb鴎>rY NGVOJ &UVw1QO!B^HO=PO=`LU,*Ql^OfT2d`e|d\of˩:1…5Z$V ݁U,Wam2FΫS7XJd1>D'09SG9Eg:,e 3,,H<$:}Jqq&jN|,<A:5a/ppZ-|~ ohJg+8cC)tfQ̋n9"`4q:RLK*sۤuPB "1D_PQ$9V6jo֥3j$za(Jd`ɨ!1Bfpxhht@nҁs'A%XsSiYEuRD zs:COj_Pt ,2_WPGBN"x8N"Yׂ,CX$/銓C`b\dX7& t A{rgHkf{2"7)ӹc<9oF2'0Ct~6W38o{gSJ&Ag͔#)6%u%_X y:},ܑ(`HXxoB`%i(hp*ȢP(6 0ZLᕇDjC_xc6h(58M@Xƛ(?cb5yYM^#oNry&xBS,1|1W4c_Ck9(ܻ k? b=VJu,e]pM^^W71<:7AL:S\k4b7#]&'ϕWuf4N<954EdSಊˌ:x@`Q<j%^2zHwh~rϹƶ!Ex*20xW䢴$9: =\EHHkjgDqMwNvMOAnMBGhdxS{ h\J@> 2 n2B:}D R\(JX)&}&(P0|8M&h>>^kd]8>x6Zc!qƺCk_zD- fP"I@Qt9Od&`g MJz$#tHI"-I?Ϻiub~MG+%0X6廽&F|#^uC0|U_%/ZYK e:{˳ b\3ulRFü݉ƒom=65"}fW)Q7GQN+:R'f[+`ĥ:EbCBԇ_3i\?ة8G}iiYe rC'7Mq&. K~J寞Q.) HMwPɪU,GJ=\T'? CC9H;#ߍ moD=2"߉^q)H=oC5f!82DCNEoalb& r'䛑o@fؗ>2]Lt22}ǗI(>dLW W"qr{r+9FEog}˥fr'?IENDB`orc-format-1.1.0/specification/img/Direct.png000644 000765 000024 00000175620 14777360722 022110 0ustar00dongjoonstaff000000 000000 PNG  IHDRWB/sRGB IDATx^ Tř ".!7TP6e42qQ㊉kDQ n\q%u\AC\pTϯ3o{O귞>Z߯v?@ @ @hZ/2C @ @W @ @ Z4@ @ @@\e@ @ @j(@ @ @q9@ @ @ U@ @ @ U @ @ * V" @ @W @ @ Z4@ @ @@\e@ @ @j(@ @ @q9@ @ @ U@ @ @ U @ @ * V" @ @W @ @ Z4@ @ @@\e@ @ @j(@ @ @q9@ @ @ U@ @ @ U @ @ * V" @ @W @ @ Z4@ @ @@\e@ @ @j(@ @ @q9@ @ @ U@ @ @ U @ @ * V" @ @W @ @ Z4@ @ @@\e@ @ @j(@ @ @q9@ @ @ U@ @ @ U @ @ * V" @ @W @ @ Z4@ @ @@\e@ @ @j(@ @ @q9@ @ @ U@ @ @ U @ @ * V" @ @W @ @ Z4@ @ @@\e@ @ @j(@ @ @q9@ @ @ U@ @ @ U @ @ * V" @ "ͣ> a3/򐚲ﯼ9sovfoJ! Y,k"^ @(ɓ'|мk3cre> )S?lkׯ_|dHG~0o;SO=e̙c~u]>o߾}*CK.p QK̮Zۄwaq_|qk!Cmi̙fذaQp9#ݍcm>5We/z @ jFmyv͜qVp2}OkSPϿs5טoيIi3K-Tk&=s=3~mb6̮_>}D\b+U䵶Ykֵ#fM @ & A7~~ӟqƙ5X#3^?)b=%r}.Mª~ʥ:Csět(3S/ج4ކZo̱yˆZc/:Sٳg[l1+3v-j:;V+ϵbA\͏=-C @r衇y*Ygeco*IZ%Kj _\%f&XKVs4iR&뮻\~QC5vi׮]m;Wvěte.,ʬx02'tRooǗ\rt 1j(f}ƮqVd @h:s'w=at_b/qtm["OORް}R#y1R>}Mݣnjm޹sLxLvZqMǎ)%HHϞ=x2LRW_}eO>qիWTʟzQ"oe2鈺֢S^]9T5{-^O} v-֧|Gv)4I3(jD @hJ:#%\\qxx .9?x :ĝgny*-2Gs뭷K/{mC{\o~¶/I̺ꪫts`վ}&}RD[_E[=3)mhOL>_V%h)%͉wъx~LVϵvPIb/tQ?oC8$₽"ϑvVS/wүKyWdwռ. @ M] |&Qu%Ƹ~)EG|g,$1ئc쳏{2]_uY% q_SW^{m4b駟nLs$)<]IH6,T?ʕ%|n?YnH*9s|Dy%O7ضwFތfnk;6'O}b/7gt^"Z>C @ G?_*SSc\rbc=]SӨfmh'!%!CwO5k8Bܺ渶&*+>tbw1" ͠cǎqo];c$bilywU7SÇ› ^AJCM4bM!{qUD_$; _jCY)q+{a/C[zm<\heZ>J l<]pD˖BZ,֧Rd=Yo ^gqp @hY&o6w/F_b۰aâ/Ҋɧ. 05Ǝ%%BQ~ 0zh۰dJDM?L[G8./<Yo>:*U ]:/U_.!>^{m},s$YKqqտims*?c7ڢ) 2_tw]-J:!qTx @@"UUҥ7o 먾I%J.REⷚq)B)4ەg~$+r!VL(駟Z_Hs{^N\ _&QP+-+qU6m%>l%~ۺJ^Vgza">4.(Iތ{@ko4_(^(v}㒄:Չ6::(ʑ4ЭO^˙gibTޡ2 Սq:n @ _o_1nūtBLґ`ϔP&UIgܸq h$~X'}%]Q\hU~%]s]wK\>|+*!M.h͒|q\^($yN"CEW\URLN1_)ݩS'#a{1~$+O\\Z>SԩSm} uqWI%vymլOʳ^{~`6Z«fYm'j[ RlȓG2э:ҩ/xSL1~a"R֯_C@^j{wgT˛DBhc;Êl}VC 1n"_]tb;J~+ۿm݌ֲuBqPV{9MBoa/rNYgu0؏jS6'_qb}OR4W$H+uJ_yw$[o=j7c jQl+[WEئec]pU1dj:WNb[֧vk"$y2ӧjn+Wƌc~a[?j[EY@Fqh Pw:h&_M:OHsf{JeJ:#ZD1\r1%拫\$q;M}%#0`@f n(@x2n4h<0uLS6*9xoIY&q IDAT O_|I<#t$H/> 9K/+fdt  "  @ G/I7JtIœ|~V?&/mZ~ٺq2˴ztX⭎~2Kty0v r~y1SB \>s-.;q{S<&(._rIި;cT ^  4f6c ({K! fΜB,|gR륗^jt.9ryggmǍfn ?P/htٞɏ*ң:jK|8ͅVjwޱDե) jlF!@ +D+W^zC4tcСpyVz9I&-"l}O[/jZR@:iGZ*Dg}f4p" 5 6|j=1[j wrqE'\JG\ ԛN4N[ReW+En@hB~93nvI[neonw<￈ȡC'QI UFTUyɩy=öW\^|*ڄ!*y!E r=%yqFJn:w_ȻU?Gt_~}k /Ь Q zP#J"iFMSy @ ?fͲwsNN(/_hfgԩf„ _ r '9!@ /|}y䑑.9c#a"x~j$B(qE.0h {ֳW^FB,?|#aԏlCtuzq]wٗ. >x-?N*@׮]_;Cl98]tO?mËة\}U_v}sؗ['O6> n{GE|f$/&ߐ9s[ϾD|#'[W%9b]{wiz)N|u׵wz]4@/ZS3mu^)g=;=ܳH8%'9!@ [!Эgmk?.DN?ol;<3qĨ#Ci*K,DWª;D¾hSO=Պ>ʻ? }@#xqiv<嵪=A^JIFy䁺2ؗ;CIҞ/~UfM_vNdոt!DٳgGi\{v V*nݺ38 ie]"jزr-7g3X_/?p@.%~B!myC\|wquHJSE\% @ H@Qw0 I?ÈV/}o3˽ oX6':duֱuզEzZX#ITћi}衇Otk 6^oUId ЦqRkV/3V\:蠃~i zj _.qO«y/W?Ty@y晒$^a*I;ɣ-.j %O4CJձTO˺ oc8DžT$qAU?4'@u5]-b*!Wz$/W_=fEDvO# 2~4a 8܍P/nᆒWƼLojr64{)xĈ6tƓO>igϒ^zWf ':OEsvӧ%kK!E\ Ѫ jF@1գc`qO/5xJݻw~ǫB uYKC~/1TquL^i7tS(/:^=z(9BzCp=P3T &$ U7%~̘1 "L:Ç"_~}Y{E~O8ʪ}Dk_^V]tY2ι˭0tV{mCtԩ -!+wQW H/|AN^ =Ƃ~Z=ez[UӿDTza.0uҥC;dJPtќ_ZǏf*V $ky.k:ΝkK@:V*!DGx& w}i :t|e5i& [ϺY/>C0j>־|<#tP{X~ +M!QEJ]cŒ)fh˒}^Kv'ܹs} rmmmc.jz=tGsIg=kJO>9E)%yҷx_ttM:2dlBS6zѕf/wt@nJ/ܺB{{}^gzhm!gUjL @h2:"*6]/-Q2&Md`.oqʟFF^qUݗ^zɞP=t'p@#i򍸚nBu;\ 9RhԩQi eYRPvay0Ǔ<͹4DHt&.<# 4Ʈ W)VX-~ iRh"xkgCxVT˧{ o%~leщ)y0">_aN[omaT[?t"U[ZWÙV @ |֔|[xR[ S.I8䓭8s7ڐ.a|6#7m|1 WmjՏ p9Jm)/8y`~B(eMYe)_o~b=+N#3<ö^$kףN(X?.6lX١$V'Ol_%wQz'$+Ṛ?oC/{_ZvTqjt @ /x TGN:E<ޱcZA_tV[u]׊$@_ƸۚѣGΦRAy5d/ T\K x.Sk]vLwh %z{GܫV/g>l;\m%xB q5yR]SX~x0H$s5q5{@ TI@B/F2 jZ3/Qg. /hP.ߊ.>Tt+=1,yܷe1T+6}0 VC2 @@M˜$wW6rSxJs۸r/'?FZJ r&AQI8zK$C<$~GO٪s#yɓ7W/RykM땷~bk}W\UWyTc^!E BB1Wug/V\s=.8l-%8O"zkM)L@@T$kW4"O~d}y䑑w*kf*o/^ 3 1N2_}?ϏQۥV9oô\Yd;ue1SS♻M^OƍִJ,?|#1Ty_ޫW]weSPz"QU/c $:U/QN9#ԥx$xW}F).*.9''=.4ˣ6WKֹ/oVV+j9BZ93J@ O_n o$P7$*6fmfk?.k^{Y[nŊ8.n֫QZ/gBbjZEy ӟ+hQߣVT2v?p!yiӦYy"ݺu33.%KN =Sj 4<4ł}Ǣ#0*o|0W[_ysw}d_=F\Mm)#jQ PL!|)&yz #}Gl5vɔכnvI7%H~?g{瞋[ ʼK[>tWސ:j+Ip )$Ȼ䋥P šx+WUsyJSx%X"5ַ5܍gB54x *6~^1ǰ0KYO<fB!;8JI¨Ną={ZoiU W.j:omך_:٠tzڞPΡVl{ն3@@T8a4 ' أ] ryW_tڵx Ɏme{hꂫJ?~~F gEN@@0xX Ɣ ` ä1 ;f= ED{˿֭cWӳ"' @ <,cJ?aR"kև=_ֱozˆY  1%@p؟0)v ÎYy5|Þu7=a @K@ 8Oa;aǬGȚha|׺u웞0jzV C`L@ 0Lðc֣`^dM4gk:MOq5=+rB!R0d  @Ȝ#E\Mϊ `) @2'HWӳ"' @ <,cJ@ Hq5G4 @ȋj^i @jHd, @ @@ 5 A @ @!@\ ɚ @ @պ!@ @ @ $!Y@ @ @u#Z74@ @ Dq5$k2@ &lb3g,ر9^n̋r9,m ֎-5C @z4;vlP-Eȸy1P+,*MߚK/Լ GN0={̛oiz)Ӿ}{3`ӣG*[X^ysFn IDAT{fʔ)棏>2z2[mY|C @z;aǬGȚha|׺u웞0jzV-r~O—+l.j#4?cƏow^e 6,`8o w8qb'hv}Q0&@ ` e.ðc֣`^dM4gk:MOq5=9ˉ{3fLTF]vY,X`ݱc"vaܚ_:Ȼե!C?,b ;&:KŰ@3` 1 ;f= ED{˿֭cWӳH\}̱k}[?;vYnlO?5ӦM3 p/IP^Zko:sWځKP=SN;FԝKuGN@JO)A5x6ʩ{̋רYY# R-Mo*Wo:uڵr-|\ꫯF\؀jJf̘az>+/ @[ VjEVd[/v/Ƽ({T\7WӳX\(Z3W ZKhu b`*;#Ԝ3/²; ˞hoz"`W_?iza/R .JQm,jG~Z$>W/}ꪫΝ;jRΝkf͚e+iL+bxWM7ᇦCgϞJ1տw}׎Aӟʥ|1'r6UϞ=ێ;nZ .4|svL^Kr-W/CGƳ =E)ðc֣`^dM4gk:MOqV.O.ʹk#FI&)SKpKjf:~{/s%E5}~qǙnq*#a.Z?zk{Ҥ$MS/bo/Eb] ~;뮻i7v?\sMsG7߼ȚN0wLKiO;4ii]*L{ml:uخD|ƫl6Ȏ%S.C3%uYo{a9D/]sqӟԢ?D!# P7<, 5 A`Xfǎ jż7=3`aA\-wޱ l(UjJ+d&L(I(8ڤnK7nOtyʐg3<<%ۗx'wzZ*nkz뭉h%W;~'alѣ/ߢ] \s)6`/&\T\@?伕ze't]j^użKLj7YrBQ Ԩ_Ss;aǬGȚha|׺u웞0j+yV9<3->h'A>Xjn݌;%c3 kol^~eswF'Ew:$$JnCHSR\wgm&OK{ 8[R}eMJ/Z}F\M`CYO>$3QbD;k xy@Io7|c {]bhpv90N@x\ b ۷g}ֆp>?蠃qvw]+r喳岊Oc9&sO@cUP-X+>b&#%X20.m669k/ 0 a Uyy6D~lWTVef̘M;0K:$k$U\x:fzvBKHV_ߛkJA\MɒJF ؟˜1 ;f= ED{˿֭cW=VpI⩺ƜKĵzNWx;*1҅x qɏ?}ёo~s衇ZL:tELY>K]<%Z+Q/Bꋫ*Y!\׫AP(PՎ뮳a\ r]wYAեAYՎ;W^yrvkmEx%-cu⪄_W-;v)>[k%q=j+s[\J y/IT\u]\ib&V3~]2_}ÇJP|ZbS+qUuK1bRnL~̲.k͛gf̘ao_;wg]W^jfؤOq5{h~'Ju]p1g\V[lի*_}U+Z]zWkēJF޲~aA? g:$N0E> 5̙zR_{}ѣ57$ q' @ @M@q5^邫;#Es#Wkc笼0UFWJb~֋UQyzfꧼ?ca嗷bz%}ZB/y)A6XΧqB7F Bc/$Ә@ @j3[C 7x}Q gf6/  @ 43f>c1^^"8Nkq!mj<@ @B"5  8zQ]ł]c5mYŞuiM61cǎH @O.Eԙːjb^dMcgXd4@\%!˪J JgmV_} @hL|YoLT+X)ϼ3,{2 Vώ.kKe7{キկ~e[n @h\|Yo\T3X ˼3,{틸9!$ 0yף0?͚kize:v @G/sgjz~EX6ƞaqz{"Vώ aS&Ǝa1Q0/&o}3_n'9!@a)S2G) b0(Yͷ>/Z}F\Mϊ `)#Icvz̋[̗[Ǿ #gEN@@0xX Ɣ ` ä1 ;f= ED{˿֭cWӳ"' @ <,cJ?aR"kև=_ֱozˆY  1%@p؟0)v ÎYy5|Þu7=a @K@ 8Oa;aǬGȚha|׺u웞0jzV C`L@ 0Lðc֣`^dM4gk:MOq5=+rB!R0d S&Ŏa1Q0/&o}3_n'9!@a)S2G) b0(Yͷ>/Z}F\Mϊ `)#Icvz̋[̗[Ǿ #gEN@@0xX Ɣ ` ä1 ;f= ED{˿֭cWӳ"' @ <,cJ@ }!=R @K@ @ s|_Hq5=+rB!R0d  @@WsO  Ev!@  dM@ @ ԍjP @ @ ՐX @ @ @\j @ @B"5  @ @ P7uCMC @ @@HWC&c @@ l&-F0ŝ9Fͼ(GXcbً֎jRs ,XСCӾ}6Fq@ "zTرd{As @$zҮ][رvl\3[3,{"VoOQKFtL:ƭR= psؙQB؟h5D0VQkϸ-`zҮ[7=sYg}[w{As$RveTSVpV~Y#̓~ƾ#gE:Ooڽ{w3eʔ: I0ʨ ;{yֈ=_ozƈYfϞmviՕVZuAKaڕQA O!Xq5 +f? wL{ImcWӳ"g |f]wZO~b: I0ʨ ;{yֈ=_ozƈY}3x՟s/h@xX Ӯ !` aX1Qgg3Oog9Lw1_ꫛν9@aa)L2*@)+"aGΞi5b<׾m웞1jzV35{WZken: I0ʨ ;{yֈ=_ozƈY^u>DL0ν9@aa)L2*@)+"aGΞi5b<׾m웞1jzV3_~pQ뭷  &´+@؟B"jV~Y#̓~ƾ#gE:x̯ 7s/h@xX Ӯ !` aX1Qgg3Oog9L`̙fذaQZW_}u{As$RveTSVD\ Êُ=3zϻ첋9S 5: @ @ .pm[M4ɜq8 dFUq1@ @ 0 a G?uY؆ bFX @ @@ fMo݌7.{aF4g @ l&-=sfP1c›&`^knbp@\m0Н#p-G{ͱ "@ e= b0(Yͷ>/Zoc z馛E]v3Gu @&0ðc֣`^dM4gk:MOq5=+r֙u]g.첨աC?ν9@ z\=i׮-X;EyQd-w=`E\Mϊu&p5ט+2j2rH{As$RveTSV4;aǬGȚha|׺u웞0jzV3 X]*@m'RR POZZc=E1씶3-bþ톸9LK/52T> IDAT_}af<: I0ʨ jV~Y#̓~ƾ#gE:eV%]fKH v<,!5@!T;֛x1c^Ni{=Ӓ*f>nYƏon喨c=uAKaڕQA O!X0(X3ͳF'ڷ}3F\Mϊu&0n8sGf=s/h@xX Ӯ !` aX1Qgg3Oog9Lଳ2VGi R^ 0 ]B Wðb`}g4gk6Mq5=+r֙ga&M:j(3hР: I0ʨ ;{yֈ=_ozƈYFmᄄSO=.uAKaڕQA O!Xq5 +f? wL{ImcWӳ"g r)Z3fq  &´+@؟B"jV~Y#̓~ƾ#gE:8餓C=:vX3`: I0ʨ ;{yֈ=_ozƈY3Cg63-XӡCӱcGԩSV9ӿ {AUKk{FF'J?옎Sb^eq=`E\MϊyWqڵ3O~."/ &!RaB @ |_H q5=+rfH7ΰFc~ߛ 70: @xX ղ  @m' Wӳ"g?p3mڴj{LϞ=3 L @ z@\iYj?L(F룏>jYfL@@\ Œ @zPDYz! @ @ @\jJ"0|p3}69r2dH@ @ %jB`„ .vڙVX\fW B @ @R#f͚eئ:lN>6Aa@ @ TJqRbϜj}٪=L~.OA@ @ TCqjɔ7l.ªӧQy @ @Mqio|u]"sAC9 @h<lIN͜9:Ie5eEXfǞaٓTOqzv̐3fTTc̍7hz]Q92C 4.7m*vVe^ek=MWgG H$+q:@E  @n^75m;oa+g^tǞa Mo_YC;\Q #G4C !@_>i{Ӓj|̋=ò'jD\%3&0l0&VvLmfvq/@sa9(!PDOEڢ}Ǝa1Q0/&o}3_n'9kLoN}SNq@xX ׶ E'Tt 1 ;f= ED{˿֭cWӳ"g ̞=NZQ|OL (@`jTT/Xfͼ3,{틸9@ࠃ2=\-L0 @a)\22S-c0(Yͷ>/Z}F\Mϊu .h>(>+ 'R( ԖSm֫vX/jyQ,{-,G؟cC\Mϊu GvءdK۷7wqY} .µ-#@ ?݂?v ÎYy5|Þu7=aY' /ږ[ni.:f Kpm PtOE j(XߵW3/i猸9D[o5~bkvy .µ-#@ ?݂aX6`}׆k^bϼק]웞3jzV?g[nfҤISNu @KږA؟nA0,XQk5Zg^.Mq5=+rW]u@ @ fΜnqkRgO>̚5+XMϞ= @ @\-m2M;  6M @ @ jCE'W& @  UPrCW f>vws={}=zdF(^r%#袋B@] 4Kfg]'A @J9!"|j7V%Ι34m]$6 j؂@2HF@ Sվ%b֞qp-s+vȐ!Vd%&@vEtlqf73  @ MP,YqsyV\m߾}GXWg3zܸ6  @-zj>IjG\`ZBͲ. Z qVd 63 @ |B!%8Zal q5%(A @ Iͧr"VάKo 6MQq v @h4!VάKo 6MQq v @h4!VάKo 6MQq v @h4!VάKo 6MQq v0v H"k^`ϰFS]W+g%Xh7W&xH,9 aF`h>qrfM_xSqlBKڎCa`Ǝa`0mk>n3g s q5VjYqlBKڎCa`Ǝa`0mZ]W+g%Wo 6MQq 4Cb3Cy ?a{"kև=_W+'Z9/xSqlBKYeŝK) c0(Yͷ>/ZZ9Yʙ5} ƛgzT\,,Lh^Oa;aǬGȚha|תu"VάK 6@\m<Уhfgqg"=@` 1 ;f= ED{˿V#VNqrfM_qjل@<$68;9Sǎa1Q0/&o}3_jqr3k7W&!YYܙH!м؟°=v ÎYy5|ÞU눫E\Yӗ@\m)x6G%,2Dz%cvz̋[̗ZG\,j̚jMƳ =*.fyHlqw&s4/0lðc֣`^dM4gk:jdW+g%Wo 6MQq 4Cb3Cy ?a{"kև=_W+'Z9/xSqlBKYeŝK) c0(Yͷ>/ZZ9Yʙ5} ƛgzT\,,Lh^Oa;aǬGȚha|תu"VάK 6@\m<Уhfgqg"=@` 1 ;f= ED{˿V#VNqrfM_qjل@<$68;9 @Oqr戫3k7W&Etlqw&s@ ԟjW+g%WSLo`Ѵ>E VΕ̼/f:wƘY`_,پ]5TT&6+`,c9E^ȘiŜ1>4fcZ٘K @Zh>C\YӗB?}l>y ?rHDͲkv6=^hT.Xh޺gGbeRQfnq?5O~1|w/4dNڛ/u2mlf[瓯̷ 0 YG5k>3O|1thٳEץ*uoT ,Vdu-E齣NJH] S+>2쀸 rAyyE^;Cg_j: LȻ pB\Y;zZZyIHH &45:ܺ&rܷ2I&Vnw5[źbJ7g~_5 &~ۦnYu~V^-M+OΘD΋:*ʜE{#Mq4\\! E~\Z&+wfiEF/dz"{=,}Pr<WO]&Vovvgu"/Tdg)eFqI, @*OzAWYV|ɡU7kL6<* BėY\p\ iu}vraҳU6+Dʧf.Ε+"~U}`\~5 qԍھLY<=Ld$eo] 0>WȻy4Fi"O/O٣)EmVϾJqФUW`TP)C^;]jm*V~|?WsjDz @O>WSkgI_hMr6[I-8)61goeMؖZVm k :V89U~~࿃[iVȅ7|U!n];U[4b<3s=o,SzԱ\пgs!=>}@f.J\|<4mWt$)&gL\4r+V!t(9(wȊEM18\de#y=oўƘ("hX?oVdbqקP(gDZƸO|J#Dͫ)Vv٤ٟW.2(aΠjo`Qm-Mq~@Nʗ⪁oYHHE i'_Kp$/SȻ׎%U0ЧluҶ{&,WZGLj"v٠ :cCg㫤w$>ܪ*^;q!O)޼Ȱ(Rɼ2yiݲY39Oٻ[D]ӅKiK®YXIμ%yŢ{W\9M2W8W䣫+WA|ֿQ ka"> !j{QfqG{r-. ^(ltȎתs/] *Ȗ0n^"GWևȻC"oBDG?g4dPdQnaD>~s-#iqy]J?LzwAP\ː @. $䲃)Eq57؅Z{ˤקW ط ҪcjUZ󇾒/NX_~DݰbJy1 UYK6 6,X"0CzVWBX=WgqU#fڶ-;U>Y4О͚Iu2ӗ +q ~;vZտ^I:HaG\9M.ļؗ:]{Vw~\Wd7Xŧ㰼۞7hOcT-$9Bu?Z^\.TM7՛T$$I! k +=$esEu^j6HHH&|jb}mNJq6 }֤.}&b'h2ocd7vݨl}RPt.H›t`s+H )puəgP }5mVY 3?s+oҾ\ؿCbS d*wmV]_*sUG唵țsˋVJ\EMI1G{:ݜM#qfDe_&+'`oۄcgү%eqcE^?N۞7hOc}xțV]7y<+A"+<6X;|WcյokۂzlEן|v?S8! gdսw|>gWܲRZƫ,a\i.R\OٕfJ8qi]2{}ŧdV fDO[~{[uj)]mW=m3yNE~mZʟ%Ӥ2b ZKZCw( Qu5Q;KI\}wCzvX9]!Z+R$bꫧTm꽖߹Pd$Wͩwfi"رt?TOc+E6=ꯟn[hZdPlf=@dm"O!2u67T+BT]{~f-UzS*WS\o [H~j!2tqaO$=ڗGH]) qu rG^m{D \?*u-~6Фe!wU}w%6T&_R{vc OμrW3eU F~_&;Mo珛&V=vpVRZ\v^R$-f}NgB\̓}O!Wr-5UsDij Flcּtmϛ}1T/^0Q}(} IDATmrG67UCկ(/KT"/"liZ* q9[wP\5ҔM~ZvuqAE5WMqk!^%!~d'"[_*?^_l∡Y6Sߍ&Ӗ5xl] cg 3˭9ٗoޝ刐Mg-U~$)\LR/"."shrˎ"<. "KfWck}fmٮ7hOt^"_iVbrVcufp*2Ǖ@!w(6je#}",“+i|Ud 9^<Wu KT3S2.=i?P\5+UsfZmܥ_ۘ/BV,i\۪CK|&Ҿ0g `ZmO/S1[m 獝*6ڥK{:i!⺎⪚`e\m_Dj(FtCMɸ9]Cy4IR4*7%a"CRƊZmP=4WDzrȷh'"}1oϴUSb,!LT#4LAmR\5UsfW\]t3u-d֗[u1xyOeټ -O@mllWϘ\;LoJ.]`67nZ.[iSS\"$Q/2f<ءk*q?sd2rfitJh/]ѓfTIk@*r[D6:1I"UmT,=L&5 OIMS\5Oq՜YkWUPh\towPm69z=cLeڄjm?4m5ٓ+RDƦVgө4Hqjj+`| x2#ە7hOTBs*A-?"Tm62?xY";-[X}Wg3D&`||&V,En+Ψ%({9׈+f(n"m{ƿj*yd*wuߞkf/?O.o]\sHrN@ خX͞ZzJVʥJq5sqE>qDUHƓٮܼG{݄O)\a5V>{}aݐJ E{߬)ʡuͺjjLFv4%-N&M4Q\5UsfW\9f|priNq7p: 헩lWy.6TY$N)#">M\(bl g5g!E pj39h⪹(3+}4ntA?(2[(ƔI\mULMv^]TWijB5]6IT B1s=<ڨ9]K\]|1*w/=*q5Ί8J춥ȰDZw5X. =(F#`tI 39$9gL9Nq1W͙yP\cԣQ_*mR$L4gl]j2ęjƋ3%`t2E^jά5"ULEqUJ\m[W'MwjP\xeWT+[!H^WEm4JӴf⪮}yUk{WZ Sd#1Y\ϋw3OV^}+h|J0[A~⪌ KO7WJq՜Yk!vQԵWZ%*jf>]dnU*7j:kqN ?mR$Evz?2AXV%jncϜٮ%֐2-@Q].>XW;o r"zGG ++W2!`t"$yBr6ПɱSKWͽAq՜Yk!ꓻ˷oL tUG %f"φVW) Vpܓ1v>7 qk5dWlOZ-"."sh ݕilh"o2,){ ,C$@$@$#W͝Aq՜YkW?[>mZѸK|\q9>hڙִKWNU#2g\;q,[.-{J6-31-^un&YTd^"_G\U EHU3gloұG{*]"Qo&WPc0$IQߵE>ȞFI-KW `Y   d P\5Iq՜YkWg+\(Zw&ҦK+sEQs܊ٱy{1j*_߆vr4{\?q,[(iB.KlI:W/嫐}FigT+@d-՗ȳXX_ss~v%G{ݔ8s Ŋf: #]!+#WMh, )+Bq:ߡ©K+>e 7۪CK|&ҾW,_BFmQ\h޺NA+ݶ"CfgS%3E*2h'"}15ް &XHHH@@\GjKP mټUʢK#.DނX;/6A;'ϑKL U q(~JqUEXt4 s3Vk%>M_>*2"H+!z+&AVLdLjBeIHH4|4Na]ֹ4ŽАkk?_aFG+}w1_J3бo{|Ңm6Y\}filY>3~C]:n5G=:ߝ*Uu3a/ ܿbY.lx\Qmϛ}1UyN9U564UK-rT9`Phȁt\OϞ8(ơǺ$@$@$@ q52BZFsgO/Oנ[sGN-*,~h\8~,X٘+m]_7ܩ)VMiV4ԋږщ})R\\\Ul~#EzmoΪӣs۞7hOcT>ůk!2Nԉ2mVdEZv0G%Gm)F:$@$@$@U$ 0ղy<&qMy{||8Y)}2K;ůyˌOsw6k&]zkքcWK/`!=;O\+sɵg2iR.K:3j+NaW3W/yrim<5Vnw瘅JT=aDZv4kKtmϛ}2;Ld+DvY'B]Dr=:#rK+E!2r?eXI qfVn[_bNWc=   Ih>eKqlOI\hȷ_d"Xym:_?WtAU_tiz=.Eq5.A'  HD)U%sxMBɪ卫Xzu8iرpy1dֲ[ɖ'o 6V=mWZ-珛*ȿ=oJ<@$ ;`ԬSp=VGwjJi M2iۗW'ZH68W䣫+W_dχVDmϛ}2~^9I+O6H>ш^)fvRd " 'a}%իEd_ۂU#>,IT\M}N?۩J~d0. .IJ󱓎WWԅQ?_xVoH.d36k\d|ϱ{M6+_BЌ*:rٲܳ\.uU]trY+_/un()-^]e2IYRLyWzW"p;^?>S3ޭ_ydFe{TO(RdEMJyDY VqH}\B_|ؔn3<j߳JV2f'1P!3nH܈4 qWs으6yM_RM6<ަ[t_ʜ+舲i3-իr|`IN[th#g*=ZmrߔČX銲i⪚le\m_&Dh| Uʹu&l= ||X 舲qn{=Zuv656EjqL*eWzS|"߻HdD{`+'LxRXeP\M*L@&ӄle3`\d:3џYP~ǵ`h;ٛ3R\͵{i\* dS*͚^tZ^Y2guŲzrf͛G+}v2#eWm¥r2gE(<6k&i)i)]Z6wR|x,X;}۴?)][6OMR\U3J[ Liۗ$q"#\vzl#NF|.=U)oT~EϚy=oўh@:r5"]61X"Aڅ*LN}#@O_?2Հ^pHD b}//86?Gd+X.hX+O3 OER$?$mUsW͙Fyf|zϗ2MVV7<ݥNT˔E\Y$7|3K+DSkn)!=}\u&U⪚de\m_I/qyo-fv~v-@dZlRn~E"oNk^9j{ ľv:=֢e?'UsW͙F*^Z>|5jrUՀ#}FG+nd$' iVhutl#YZ˃*U'>y3IC]nAG"͛}u uWD߬^ҫEZ՛r# HE6?zvNq5=M@"md`\d<3ҟiҭ]WS\5gVi.TQd bmުNܮ GZuhM\+V]Sȫsɢ*X!jB U^iWI"]*"Kg#ϠBdlJJ5(fitz@lv ֿ脦yPJ9 ',U˃ "}Aa"UӀѸV&db-OEV9 Bq՜8Usf]6x`+fW!m/ꢋ 9뮓3<[k&nbӪ/-o6dm[L6Zvܮ)2@M'-HY6rlI")!3C#X=7A^گGY]]>"k@"׋H/gEx6_>"k"{?& EDkY[i9YJ_jBj|BK,IJHI8>{?& EDkY[i9YJ_jBj|BK,IJHI8>{?& EDkY[i9YJ_jBj|BK,IJHI8>{?& EDkY[i9YJ_jBj|BK,IJHI8>{?& EDkY[i9YJ_jBj|BK,IJHI8>{?& EDkY[i9YJ_jBj|BK,IJHI8>{?& EDkY[i9YJ_jBj|BK,IJHIHHHH {W͙S\5gVWWZT\eF"-'    P\5gNq՜YkP\_P\͟OhQq Et,K?HHHH'@ǜ9Usf -!@q5>E%Pѱ,,n$r    Ȟ5sW͙/E #@ǜUsf -!@q5>E%@q$@$@$@$@$@P1Gq՜YkB_P\͟OhQq P\-h9 @<|Q\5gVWZT\W;ZN$@$@$@$@$5s~W͙/ #@ǜUsf -!@q5>E%@q$@$@$@$@$@P1Gq՜YkB_P\͟OhQq P\-h9 8ӏv`/Tx}]t{CܯW͙/'-'aUc㵝>cWJ_ZBj|BK A0h1N5G jyj|BK A0h1NS\5+UsfAq5!@q5>E%PIbYYH$P^=h"im-Nq՜,UsfAq5!@q5>E%PIbYYH$P^=h"im-Nq՜,UsfAq5!@q5>E%PIbYYH$P^=h"im-Nq՜,UsfAq5!@q5>E%PIbYw IDATYH$P^=h"im-Nq՜,UsfAq5!@q5>E%PIbYYH$P^=h"im-Nq՜,UsfAq5!@q5>E%PIbYYH$P^=h"im-Nq՜,UsfAq5!@q5>E%PIbYYH$P^=h"im-Nq՜,UsftL L>]&N`A=o߾5&      ѣmJ8RjC       p P\ N P\5F $@$@$@$@$@$@$@$PXW)6xh8+w^mW]u.Fx4[4ec/"y? ռ{ pV$ոYO{Dc5tV7k֌HDx=xo'4_{| kq](OHfϞ-{^Z|6K^ SO$`?^>&ݺe 9s^M>rHA%@w:ӿ:WqQ>*cHrDGK.Ȇ4H pA_vD? 8UbJ?IZ "+X25%VrYWu( dDNU϶N;5\E< ?!z`ǎ'N:7$`1O>Yyewyg-]1kq}(SH+ /e H,&L<V>N0rB/C95z_~9fMh,[N6My!pm 7Plrda@5UoɌ W ,J$`7>Zƌ-Bnv,D$@iz:yǤO>i¶I  [n%}a_ۿQ{ǸJzW+{E$P0a;m7t <ؤ ˒ @V\){キ̞=;lcߨY<\&Tl q. Fsϕ_|1V{챇\ve`d|>OǷ~ /dcrwHvTge|§/r$a . RݼTŏA<ߨqV<\&Tl q. B`ɲnUVNj0̃t pKT9O"f|ѕ ӷ~+Æ Ν;w-HP?Geoߛ%eo8aZYH"+Xڙg){l"mrd~N~f|Y_ن{*;<9CbQ61=OT/YƸ( ոYH"8餓dkWV0$ dI \s5r]wӫW/Aj/a|:ދ!CW\ZVAU[z2E7N(%$@$.GydUj5'KuM z'Nm'6;c#Pi̘1rGvL͝?oqj@ČMy ̿yYoK5.$j *[nŰVWi}c,YT:ꫯgH{/I-6bO7pvm83Έ#C"4Rt?u *y ̿yYoK5.$j 8eر(& qT?G]Y}3H۶miCӡ*ǏO!n)n~ EƋk߼Ӭ7eoqBq5 lH [rꩧ+ʕzX'KS ._͛gZ5ȑ#w514T7ߔO?=Qg^d?9y ܿyyo5eoRqBq5)lH4 >$a+q7W=i'K%u|n1B'5&$۲@'t 4ƊǠӿ#qA74F M*N(&E @x3K( b@8s_4V_.[m1˗;g̘ EW8!E>+$ L f)ҝU:ɓ(㥗^;&,#xgKWGA7T L -{\yA?(bI Ȕof._sy&F:t&LY z@8YL#@+P@TEsz*9u " ޤi`|ImS\-s}Y$[DL*SIE+U o9u "$@qAxgTon;Ψ%eze)2HH xΩch U { xJI1Lc*bjv&(# &5qH .\K@wLҿv`Tx3.(2HH xΩch @  '{8"ppFe,(+Lq1@$@9%tNCH(2H c+@UNa"U;WkW5A dM7鬉|$@q pj\_e{"qAq1@$@9%tNCH P\ep$Asc,|Y{On9'Eco9=#(8ޤ @O%$@qNO˶lm*ѣGpɢO:rȃj1U(sHzXbv#@q:֤ClUOzP'UWϊ%IH Se'#H ?,,_eUt>E_Oȃn^fH Kº3 Iqp.˥O 0R(f /MWã%(% @ pR@dWU S)Y96Q\eZjK'=դcQ\-h7 8Y5 㫦=9Uk]illUW32kzgam`kwQ d@7 ;?ŮS\Mn}|W)R\-π],̣r_a;(XH2 YK| Wb)DM>>?W)g.xQ[9گ0FjjC$@,%>OWS[mlUW3`e< lW?Nq5 5! fUbu)-QӶO*U2yV+̟Q~ @x3rO*S:ᖨi'Gq* eS\e @N &S, A P-bHƀgqUƅUMP,F$@YM:k< @\\ 뗁v{&ީg\P\e $Bj"K߈ ߺW~]?#zR1jo3   ȔLq[{2Rmm*ѣG[{FXGY:Aq5*j{W9M$@$@$@9#@q5g)9??Wmr>nqսD(bI    *(2< `ÜJqj#a1(x [9گ0FjjC$@$@'RS)13Q\Jq`n s2! g)F:$@$@$Pp,܁95jNS0llUW 60,Y"[9گ0FjjC$@$@'RS)13Q\Jq`n s2! g)F:$@$@$Pp,܁95jNS0llUW 60,Y"[9گ0FjjC$@$@'RSqu7o95fǧ9#)c xWe\\ޟr_i\WӠ6IHH 8Yʹ jՂ:.gfs|ʙC"C?Fgy5ƅ]?){Cq5:;$  d˵Ws0j(h"im-Nϊ%IHH,Y\ujQXc8>uӏv1^0.&ZO>aXHH!ɒ5dGH:p)h"im-Nϊ%IHH,YJv#ҏv1^0.&ZO>aXHH!ɒ5dGH:p)h"im-Nϊ%IHH,YJv#ҏv1^0.&ZO>aXHH!ɒ5dGHHHHH q|^GJqUK 58Yƕ $N H)bI  'Kָ!    !5S @P\yHHHHH&Wm&B$@$@$@$@$@$@$@$@$HHHHHHHHHl"@q&o/$@$@$@$@$@$@$@$@$@jHHHHHHHHH&Wm&B$@$@$@$@$@$@$@$@$HHڵkG,$@$@,YjӦFi!    lP\͆3BVXx<2uT8p?VZ? uv}w9c@e˖_/~C6̸*̚5KxyGe̙i[h!7tlVYh)sg;|3ܹseРA2x`ӰE ':u$o߾I4_6&N(]v̛7ϱO>ry 4i~2jԨ^{mk_~y5v$6T0z-z-Џs2.# OZ,k36{}# @+nh7zFgI'P㎓Fm0V0Or^7n8 Ǐ7n\3D>y#6>^kUի6=G&LeM7t,ZHF ㎲+ZJ}YꪫYc5屢~vl2d;ñkʾk,ǩ [ X|MOүjaº"']wz X|x;ydkֽ{뭷w]8ړq ]nB_r}Xb g6lticʕ駟s=SQv]w֭[ӝ{?x`z'D=S P{xX_tsk%|f͚53c~ +ω`=sO:tPQ~歈{[LQ4hbӂ yjA\3gy'qrK/:s;vme:ײ*V;0'^kyƅuӹ'j}~xM]׹{޸שi}!{~ IDATGyD^|E lG?ܷ۶m4bI&(#䬳sC9D~_9a*+d$8fa*oDcǎmhRW*oѹ1Purf.\rSv<|'1o+{LxMB\ Y8'c9FyzpE!D9Oe*&8ZlY"BsΑ?IW/>pjc~ %`/ ƹ*Đ?U/3px)[nM+Nx`,ݻw|HaLK=Up8͛7('#.߭޺g͠djT:>I?FϨ5.ܿ!FP!~~3KPFxK>cksСs@{[nqYuQCAuL:Ϥ^?q5gti&=c8t}1Ϩ4ۣ&]Mp`ߨ:*|Qӿ¦H*SO=y8ǁkb-d…$cǎU9>es<(Cx:*>S($mV>39+z!d6j0_a*8Oh?裏3tD̘1yHr 74Y_$qKH[nguʌ3TBh %ts.X#.q]vMtW!lȑʇR9_lLNa6ŜɹL︷);WI0+@q`=+7J5[ay_bo}ߤNx}Wm Ӹ:/L럸ZԟQϣgrǽNO" [1Lh-dd,($` G hԟIerǽNO"1W_}؀5H'xk5UĉʽVjo-Q\%}JH8LEx|~2&/ˆYaW^ڑ8;aO<`s3D~KuWaEl|U@&GVgVQ %Y\?\er]^0< Ʊn9ViPfϞ-۷o"UX=9Vu W6942N0+Vo}X 1{jI<@!m]^Awq͸4$hOy^#= ~ {W.-P_!">tC k.^g& ,k~qt^X/a_\ĭ~6gD&y4n>!%{S|MxNSCa8ZեZ+b 'CDMt jumX,T=>6PQ(*R @v \WbOXk5+MU8b\oH/aI4 LtV*Zx@9w+WWXŗD\{v*1ӰxIU"i(4.ÏX8I?V>\| ULUC"6Ӊ#w E?;a_xNsVH3a`Z6 q{`P 䃸^\zrSq)́jڟr\׸ސF B$arW՗0>9j."?3r@QYwu_G)׳w^Xް/ևi?/QԟI:{ƭjqi7; a6/~6ҵoNq5], PX{wanO|*F O1Iul~7>5ٳg<bwH_2d3]5m# wԇMAvwNK\Ex7õ'tRi*q95/`otC(⪊8L65{#l ׫wCj MVWUvĵ_ǿY AxyOq|BSp3 ̣؁x\A V[mU~a R0Nj3\Xc:S4.չ!J98|2u:E%tUIm^gz&[Ekjc„ MNR\E菻K/EIEXa~Eȭ߀ >NcmD\V(E|҈UtnqWVh |6A+23؜ g(d&q/D%%79|M'-wes`YR ?ڸpx(*wy/|@6W>7sp7qjRU=w Zo^NnV//xn: qտ.V Ҙ1cBU؉ H!R!|gV*|}P}b8#Ir# {1'~H G*, ( Zmz_EIۯYx}Xsjj>t+b__@p9$$W_PqA~FW6850O0GϦeL"yF/0CڜμG&MiҶl{__㪕 ,>J!0 O-Uj)e1>e|42Qmv:}s9Ta5¦$#dG2oW'V{s{wWMfW#Q]{*q_ Y-.k]vqT0NcCKVD6C3qo (H.]BFjJ_lNGxa5le5D+հ 7Ջ5U/ICirWR4EWݾV/{7E4/iw9=q>>蠃d7v<#v泺>Mi\$5/tm׽KB\MIۆ??]IQ0 Ʊ/Ou)t 6^'xC:g&?g+T5c ,] raWa)݇jz@z o|UWU"VaŎ;WX?4In{!"ϯ{@z7 YEI5PΟ'˻4LSGu~ț / e,U7XYܺ_xWYjQN񮈧8lӵEZ}TŘu/⊫Ͻ9suVzpRqb 0׭C^A~7eW^q?ޔX c}0lA_|I;"5@=0^:ײ$=-?~/بĿRH31Xq^e`CZ񶚿6^^c3B߂4~[4.v^q%!&7\7n}UuЭiO>i܆nnf0|M!);jxC>$LqmyWC v vsPbRU*ừ0)usj7tE\5yp XbRϓ[R5-Şt_N0qj>WX9'sw/76q1/xc&G8ZpbhIgi<㭪g'4p/Ħ_}ŧ"Ȼ;>wR 7&RA8îFZ]͆Qeri?t7B#M=+t{{%1A/>RHܴJ*ț3>7] AZmڴiy0a:'2N$d^L?tp i?Un`:s[~ġ.R+a%:^ 2|mԙGF)u(3jX ܣ0Ä'0nb*?elLDi!oNJx 83\Mvu(&'L^D~[%V{Xrj_3H>p>H)3Kcp-cqU.5ˑE'yīqW Ap _umdL8/jTߢ?^tjPֱc:ET>3$^Q; UA6Ő_1yOz|R \Cq1y12&zW"pNwrs-ejn(tWuU㟓 Lq*õT?'~!5bGTvU&Lu&&Bgr[<Ø?('OM"z"3u A7N}&qRa!6Ml{YyjgOƊqr>>UC./1+(٥wEW| <PmXTM\9ڄ iUFgEXY\vѫ&U`&s5hC, j$WzSV$k6d8w5?g}1+lu֩j+f>t].A᰼0VA&CnZu8+WWMsNʦ{򗿬+ՅK `u?nf'~mM3qE ;ѹϫ^_~^ƛ?NrǠ8K$d^럸x?'O qsA_]'Wot%|9%xyV)[އFta[n-OP|9lu]A"W=.74w0VO9Q&A^q?*prѫa',m۶u{}Y%w AQ Q>twPpoV>muUF/|xPc0Y 믿t_\ěw#|Zk匏8tǠj׿3ȟc4rsQ x9rꩧ:~ħεG\U@䂑IDATXR{씁qհ1Iu^(#6jD8;'NtRݻS=F:(3c M@(EdO?uE\C;*ALƛٰ3f8uAPzr76W!Xbۤ|*N>a%ۛoYV ?m`^UL + TAݕf2|0yT5(  90*$ XUy[b`߿a R b ?U:xpGjZOq 1]ؿ_w z-3tK xQúΆt6:b9'VPڅ{ɨu2k?g+!}㤓Njh:hV~›u/Tr?6L(UဍoП{キɪbG~Y  }(+Jf|X!ڃo]q ad &>N50>C~XOvG;+vM&*=MKmç=tUǪ\\@^5^IŪvpm6TA9bu}k+ZnȉͮGX^cP cƌqb `[\n>lWmk{ εsC=_:K\8a/ƬxI= *Gg܊۟BoʌaqU?/G\XMS[5@9 εM%)>νLg Hg믿3NwS|;_:(']WΝMּl$Z?ܑ)s{ƭ>8۝9=(EP\e(@ `%d1IgإpFR+?SCl0;$sp|2|G'WHPB >sH IMd7w\'0qJ <]#^M?BL?ISnQWT} q(0^߱_\.c>ѯ@o?4m>`=mŸA ]cMLhßPY{tZ86&akRms$u"羔~&; "0cwǸU$[ B$$rgl2BX!! f!!eOe#c<LUN=s=~NvXmbYm>SoNӿ:>_#~})) pbCx9w/_~aQC͉q߿h؍n?kmh/^<|j|kÇϞ=;vy @>>{+ @_X/gY]xxsM曗^"۷9~K޽{`߾}{IZRg|c#;Ke> $ 97?g'Ԫ @,Y!@ja|oh|ި{&)@y>}xx~x9_~o/!#W`h~zׯ__y&[wj=^6=wY82sh<4~ !:Ov,k*.vFO-47Al`sn5竹Z28,DqO1#UE{g[\[IbbT8H嘑*٢ɳ k֭$@1K1Q*@SFrqvlzuօ5WVF @(B N)#R9f8 bh|_|šu+#  @@RL !'3r]}1[w>y^]uaպ @ Fa)&JpʈT9ή¾-;<{W.ߺjH #B ?eD*njgWa_OWo]Xsne$pXR!ܟ2"cF/f'^ի˷.Z28,DqO1#UE{g[\[IbbT8H嘑*٢ɳ k֭$@1K1Q*@SFrqvlzuօ5WVF @(B N)#R9f8 bh|_|šu+#  @@RL !@ 0]:jH #B @LyNZ28,D @4W-M4WK @@jRj!@ @ @`6j  @ @ $Z @ @&B @ @$ h& @ @ hn @ @IIi @.//csy+/WN@su  @CDDi,9s2+z\8 @<32cF/f'^ի˷.Z2 @>-47Al`sn5竹Z28,DqO1#UE{g[\[IbbT8H嘑*٢ɳ k֭$@1K1Q*@SFrqvlzuօ5WVF @(B N)#R9f8 bh|_|šu+#  @@RL !'3r]}1[w>y^]uaպ @ Fa)&JpʈT9ή¾-;<{W.ߺjH #B ?eD*njgWa_OWo]Xsne$pXR!ܟ2"cF/f'^ի˷.Z28,DqO1#UE{g[\[IbbT8H嘑*٢ɳ k֭$@1K1Q*@SFrqvlzuօ5WVF @(B N)#R9f8 bh|_|šu+#  @@RL !@ 0]:jH #B @LyNZ28,D @4W-M4WK @@jRj!@ @ @`6j  @ @ $Z @ @&B @ @$ h& @ @ hn @ @IIi @.//csy+/WN@su  @CDDi,9s2+z\8 @<32cF/f'^ի˷.Z2 @>-47Al`sn5竹Z28,DqO1#UE{g[\[IbbT8H嘑*٢ɳ k֭$@1K1Q*@SFrqvlzuօ5WVF @(B N)#R9f8 bh|_|šu+#  @@RL !@ 0]:jH #B @LyNZ28,D @4W-M4WK @@jRj!@ @ @`6j  @ @ $Z @ @&B @ @$ h& @ @ hn @ @IIi @ @mۨ-D @ @@jRj!@ @ @`6j  @ @ $Z @ @&B @ @$ h& @ @ hn @ @IIi @ @mۨ-D @ @@jRj!@ @ @`6j  @ @ $Z @ @&B @ @$ h& @ @ hn @ @IIi @ @mۨ-D @ @@jRj!@ @ @`6j  @ @ $Z @ @&B @ @$ h& @ @ hn @ @IIi @ @mۨ-D @ @@jRj!@ @ @`6j  @ @ $Z @ @&B @ @$ h& @ @ hn @ @IIi @ @mۨ-D @ @@jRj!@ @ @`6j  @ @ $Z @ @&B @ @$ h& @ @ hn @ @IIi @ @mۨ-D @ @@jRj!@ @ @`6j  @ @ $? } L&IENDB`orc-format-1.1.0/specification/img/OrcFileLayout.png000644 000765 000024 00000371644 14777360722 023423 0ustar00dongjoonstaff000000 000000 PNG  IHDRD7zVD5&iCCPICC ProfileXXPMw#쒖s9 "䜳DE$I " HA%P$#A% w}uuUw5t;<k39<<F@Hht.>g^ (`*dpkkse2"c?mV});+)  `x63FR&H~bpO5Vg‘ɑ~PQ^~;8(PPx)X˟ exHHOAžblzI&/ &'/`4\hOn(mٛo[:ơVoѺD=?v $ZƑ1qTw37?zC8 ϳx2OEpL%DG\?h^zIJІEPUUebS\:E?б 06 0@mJ+`q8 RA:\p460 4`/` 4 Bb, iB9d 9C @cP: CP tuC4@1¸`$L3`DqX&V kuÞaU&p"\ ׃[]Hx^ {cY+ x51ᅈ@Ad W1bGr"ŐH>2,@V![E ŌB)QΨ@AT UBPh4 -@[ht*=^DoSQSPRRPRPP]K5JDbT1VoL& s ӎ,bvX!=-a`_`7UmQQ1Dqz8W\ .W=mx^gk/4Io$VQZAZZ7D&!5: NLw$&=^ފ>>*ce48E{ 8G"#\"< ,2M3231039230ae3M'wXXtX|XNԱlrjֳdaG۰DZgȡő)iy"g?&7W89{\k܁ywWx<<Ɋzɖ>%ɵ}?/?@PP8У]QI1RNqEI@CTiRQZ9C REW%IWUEhFjjAjWՖՅ}//hi5*4f5y5=45gZdJym~mo*%@k:uu#u[tTu   ^)42FOpxԘ*6o33+6754oYZxa)hjy XXAX۔ؼ=dkGsj^>~A!ơǑձqI)ivԾ8;8]]\6߿:q@@nnnwiMH'VJ򦧉g纗WתwOϒoﲟY-‏ƁCB8uCsuWxIO:l|(hсܔǜ:||щTɓj'/B 85xZ?Ҽҥ ҿexe9Stf/7s0K1|6*;4{"G+J.}nbYyyiy\(8}[xnI})gҭ2.p]HSP>UaTZI,{%K/TWW}b{~RMUΫYژڕk׆_ogOo 1 ooxܘh4kiRnkl.m!B 7oζ92Ӯ!Q}xӝػu&vnvwuu/Lw}էw~A!aZcc<}2n9>2015:9;=,w_ _|YJU9yQ-SijT,|{pe᫻kߕ~ACŏ>elmTܳiKȗݭm+_8,}C+.ُ{!{{H`| a,_g8:B* AQ+IW9'јFӕO5YDCH^b&_#{LFV}{'>'1&yOELa@yGmEQ%7E~fRcZ:BtyrEveŖK}_U}BUyUVuS 7*k[:[|6pk}cWw_wvm1~кQ㴾'#C7GvF>ߜ8m _NOxՃهs} 3W7e [U5wzM>FsA_Էh^mMޱ%~=Ǟ޿/EnPK5H hiz7L瘟,Optq~q 6M%q "Ԣb2ceKICqԙ#nKM?}&%3.+$//7ld^b³E%*kJJ[n|u%e*j+5Wke_/wcUrzv^6]N.n{}Xhlߧ~ iHaXw|n˸ۤ3i %׬\ŋo:gV޽{Ar]6>wo9庭뗝݆og0/sLQ@/Χxu b!]y$z!Q]N#6ddɵW)+SP>bƯN9եݤsE\D? QqI-NρĹ͙مa?}:6y MCO Iˆ(iEDGG'V݈JJ9zh, ;I(Y'zROJ;FNP>ßI=]|΋ܩyS &M?-+):?pa|br/T#krגI^SjлhФ߬ۢݪqSM\Tmܝ]=$+=}hqp_쓤S9EC+F*GJLO:,yش vgm="^,濹Ա<2{?n~-Ul;~H~ RS^ p^  xUL7 LQ O Ā $QjJa!" CaPT =a(0̜RQ58/#(%2RRhQ&4AJOIGݩGpxQy&3T't'qgjJ^F'%fjr%a`6,[-%gRN# rn j^"O./hK"ƅ=DDމ6%kI$$Kee^ɶe++*q+ThTXԉRZZvځ:u+ Ff&';,,l4l};V)lҼ{G-y֋'wğ/ơ#I GeR˝qRTUwzBfN6}NYŽs I/ Ws^JUku7rZ"nܒ=+g}ǭOb\FtǤDž'e9L[<;?ܔz]_+Rn 4`ChR (uC03ra7p\  "Ȉˈ5<2 9B9ѱ1J-G*a٨DG|~f?$#$~y -fB &Ss! }F}0:NW.;~'$z3JQXx$ZT 7YU96 -JWTT;4vtѫ3{d[`,e\Oܴ]vpruvs_:ߣҋ;Ч ÆDGF7 ŕ'p&<\$ܒw oӈ g42g;9+Tyn`a<'.W^ݼBCBSR+GZ{dzG}F<#_&['|>緐xviej [wW~+'+}@8]/6Hs["x@W_r $f"L߼2ޑ;ZAbP[> IDATxYy˪:}Acm@RHeDxdږ,ńƾ1~G8<~8b!=)GLI&)p'A@cF׳֒PU9}fO >UYʪ/ZkM1bĈ#] c3#F1bĈڈ1bĈ#]X #F1b1bĈ#]X #F1b1bĈ#]X #F1b1bĈ#]X #F1b1bĈ#]X #F1b1bĈ#]X #F1b1bĈ#]X #F1b1bĈ#]k3#F1nmzB,Bb'b(F1JR<V =a̹X1bXe(j211m۵P G1VQGaA6d2i` D1bĈD(ƍR)LӬi `&g{H)k7nr P&kAz߭a <_B)iўs "l|c."GG?d˲jZ8LraZ)%y<\tl6& "JCӃeY5!(.b/b0,:ҌGk 1:2PJ1>>9HAgg'b׮]-ZfȶmǡX,S_y}{s 7GC\T*Q.IRX -D#D`K0dYZw/|rpRDZq\ץX,R* ]]]<<ȜE8ضMTbvvL:g#O!x|szZ_M[4!AFKCKiX8_,J5aԦ:= D BQVu]sxlA! E,"H@͞%lc>\errI&&&ejj"pMl©Sjui˖-%k`w*Z9+˥k @ *}l68H)@,avRJQ֤irܒ:P;y^M m7-Hp&> s ^6=k;PAPMA"n5K;裏r=uyGD{!8rJ/*ٶMRRJWző}m]Tat}BiVrAahZɚ$t'. B/<\ej+684UG,A(رcJ% ܹs[ܹ￟t:4BR0;;KaB({FLЬJrW.@qCX ZSSSWѣ,my[zuV1tGA"<ߩ5ȗh)LS.zz]G& | (ף\,0lM\Ѽ Tl̄E2lJEJ)yT*juk7^;jDy'ٱcJ3"lXǩ D?-Oyh' 4ꉦ(2M{%,yR0==M>'͒L&c~@P_^駟kpjvWpTڥ*mPѺ5/LOr7pEL ~ihZykɥyw>T@hB`_)Za @)RFZh Tc޵e|cF2knւ3(t4D5x[+ CQx`Ҟ;!CCCOd2.\YV,)e`ktMPk%sѰt;FU ]n+ŧk+6~C<55@.#JVƫbvv_~7x#G/}鶄"Ԋz(4+0&6J O4ڋktw^y羇ٓǮ8\0oO^m^q_ n\Lq3ΐg32DHLOg w]B]y6l߈Ђ#ISLN n\G^a (_Ww</JJ+Ie .ڵk; 3(e:wo+]JYtvBt8wO]Ig{hؼs o(vEiEyD~cfbT*~ΞQa(Ҧqx8'_xT:OOU4zPe!Z՗m#t8%4r^._ ZojƸ5x뭷ضmo+͙*_B |j4vִ[D'4\3R\~'Oo|>VR G8ŕN_3("MC 0X_jO5ͥS1~|wL3Oss;r?43f.JBÂ`7΅#]*N]LM~]GU:8Eq9xEip=γx6o!m -hW”ڊڨBpBE aJU^,ao!_t*ʮODklNBP[pi\`Q'gؾg+t*Ѐ,W{'zVr.r'ϡBiA2i3my\(L.aWv- _`B,EXtuugϞ6 UZfD(4h6ž:E5ɮ4oݟ?5[̔=ܵJ컳ʧz2]CzRNNauV;nJH_J[88T=tp[x 0JllY\\*ʭ -)p`MXh7Ȯaoj5(vq=*:VkQ1p-XP*!ExyoP199ɻl+t՟ >1oNibrenLtoaC`,ܻK.ʧ|h15D"eѻtfV:-6ܷ@G{${3l<4Bѳ}+iR01ѐdoun ՛YzmfL07F0??,fRiuDk@t std~I.oصbD 7GDZe/)f tvuv,$9GP&ӕƵq* R)ry\c` [Biȕ #߶Cҹ ݎ9?}oc˽8W~:l4| ^ LNN%Ro~蠡ܖ[B.7шRĥKghh @"HZPj|C[@[:(_IY; ̞^k`%rU:Mr]QCt(\Y]":첨j!=_p77%');"\tqd"H\U $"C7lZGV=p*x\!0O cxC~ϐtm0`̍Ǧ @) j G;!2.sjYLϯep^꿟kJ[nM(B, Рٱk–%ז6hlsTHi?_hR59ތьJrUva>BaQI0ӠFiWފ_f5\7 [9Ȧ[!bh "8~C0@&@]xGP<;ls]yZbx.'qK+sb\9=2 mKHwp}Lޘ!>_y_? eDK=._7ULKP)2(nbӾa&S-z*nR*P#י&ݕ٫T#F@i\ꅫggn2px`UǥV.J:/0]٤Âr}>GJpc5DòګZ" ([.*6_0M۔$B{1V dE:ΨKMmwMо `᭾{S!͖|`X# ]ȪK; ~6F:l_,H=D&2g:-UA>I 0 LHY8ʡsS~NJ"JXtGC@~]f:m:),+AlJn *|| Z6DmLNN2886ќ]K^B{%@y:Xa|`uk9G2("[On85hbغnTXҠΈnx׼F_#q\ O{ : R&"&;̘35Ci Ht8 aՑӲ1} ]i%#7]I)D`3`d3h4JC;F&՝&S fD|nE ӉhEUMb4qfffh ٫<9ɧٖކQG>%%U{[yzF=h~@`'5PwS_£a2, B|O IDAT|-#2y\j<ԱQBR"$ϯCڔgXkM__/ٯȣ`{Np` V&Eb\~V26x |_K77eُ矞{.(b.ԊqT>lu(2MANޅx_KZB)8dU7!H3{;j]dv B=5_ ~};vPkcy=z}߲,_C7mHXFHjF,%PZhWyOt$4kpz&RQVA*F1OPϧW _."BD,%Ph\Zwh r_yww U?Em GyT+]Hc?{6G^ |sʨyIP1b.=Ɠ 0,'kM-@j8jD(u7b妽>A#?kV&: }Ǎ]!Ja=Q,fmePEM0B)Gi"܊U.i5.װ \V ۰cVU6245𗓆Ƣ A܆j妽ՑWH!\kxo˒˵]*?p#(b_?K,Vo/!JR-WAhrJ69h{@㣘<>:5Y7wYeW`E`&Aiw@`6Zky]j܊wչՀZrJ[][+y 7}xҥJ)l&HŔYtyL+\]eТc/co͇j9{4R!h}a<5Ufic%=t/fڷw8=GN4!<}2\)p[bF,_+Wc4\~84ZB&Z#+k#k[›^Zę]n+_y9!a)%ۦ,i8ŖrWA<-B!D俏Pxٓxǿ&ϰn:ʥ W._E*<"?O7/Nvރ\B-: Fԋ̻@3;=+?{K.'wx? %|mz-xUj5bs \Cek@p]套^"Lru:~ٱcǼsZkCjO_Ъ[IZZf|X$wiZ˻OL2{Sg{7Zk!HvVjh $21o>r/Z3>6/NZ?:==TJe>:;ŕ#YxZkgmQ.eĥK`X  WQZQ,Ь4Da}]948i2 7FPRe6ƴ̚Zux4}y ;Q'Uvp=cOk @p]IR{9r_|W^y>l7%Hgۿ;$jzfpJ'ZȻ_V[09۠u]d[L;u&Za+[ 3F;Mk‚J9|;1ʥs~r :ӹd*N^j{dYN<͍qي$es9i>8|| wKW_$ LGfvrmG p'O/KGWwz@vP-ru{k+ŖXvfsV6U,EoG, 6n d\.W;oF0088?EgVAmĭDF_{y7jL&ߚ#"˲B V^r'H/-B _׮ RTuP62NYLř2< HppHweІƓrDPV1ATCP+ Ep苇^|}-{_ $Ifg lص r1ڒ&ՓbhFο{ gcяxTˣ\*BhnM`L:6|1F@YPul&oN,%q=p(R p+%N^@Jm$ \TFe\ <4q[l X9{nUr-SxkdXS6R?z"/_frr'|d29/4VWϢϠ>7m>Mr^A{mpOs`/3e#6^4U"Vg-s//XuJLiĎOwLx~I76؆1Q"L"䭟F:\.ӗE$La+P8AYajߟV V۹0QV6IGǹ|"<# ލ}l=`0ɖ|\5sX js8;wׯ}aӰ̾y EY_| _F! ;Y|!ĒM{fj0VQ#nG֖?՝ .}_}^T˰l7L-zrcG&lyx;lF%?+aO3靌N&tuͱ=؅Kn}{t?fWRlzp+@OOv(Gų1>uPt|3|>p_tGճu9eҢjeįyj& %5X jsH)/~__Of||رc޽f65-Q0BؠkD`Izi^*winMR:;"J4JAn)| #-Cǎn܊00"a& &IZѻr߿޽ah{7 lu]}5aTFJ-h(2Zlsϖ V) niEmXEիJhRJ&&&H$(H8CP,7o{Ͽ˿dz>[㘦٠!; x!xMDí_ CvbY妽2w%?2V~hmwk<$[9= UZHx6XJ𛹦T< Dm ( dYǹx"tRġC,^)3i.oh~XxD7r V/-ܴWoݼ  ;mZX3!*Z֭Ref45^I~+%M[vG,!֌_gy)%hq]t:i|S{Ų!&Q1#k›ԮK.7epW;-F DkC;j C;Rʚ`r:PZ ~}V28&WPsU'm[qMmbk^f1bM!ujee˖=֚D"07n "F5 zWpD[Ƒ2M{ݼcoL!#ܽڈ!ZVU%5ZtXۤVފff;BcrNu-z Dm!|_%HP(;dyih|HsGFEёS-]ڕ%ph x`ߡ`RʶЖEh~WEpZb*P/^n-@p{ܩ!= Ug\ *.wc eIRԩS$ :;;rߘ&3F ƅMowo5]"wiw*_᪻~Ыa)t^i DjLAW37q͔Iq@Zk,ˆ6aӟ1z{{kO=[jPW94sE©' tK.7k1:j-{Վ躤1,#F&k͈z֬}#*Ϲ_ʹW߂ke 6`.r6i|scΝ(j;u[հl!j]C$DP#)`>= X2wi?l'd޵/7хj*;vO={b!w@GxcǏ﷝#ap=pȑQ4\<6>_d-xm@8254r^~}̻ gyaiy^[w _x#=[my^n;v0N5#n?LaљC,)\~I{9կZ^c޽|]P25?5 &y:XpǬns]n+_yG6D1amAE;w5R)N,Suy9ȿ],'f}ox|'t"eS4Y"RJ^u|M7o ߿6)3:$Qk{jZSk4hjZM{ys܈PKύ}B cFhC.;7 AQ($| Qs7ܭ ߊ@NfX,'bMa6mZO裏L&kG[tHH5 e@^*wi/jKn7U C$b4 .[!Z]%JO9 )f Y5`P|oh޵rVKx >qF,)ٳT*Gի>}4ٺu+4Behj ~9lq]nG8 bX=Hͅj h16Df0 U.t9}g+Rq="[4/tZcZJk @J>ϻ0}- >ҟ UO=Q<~o|J222BWWymm1:2Б["PRPo2jv ,ܴWżKZƫYn˲R*^{7tfhJ3Ef'Q :r;r_~rD:Fj BL+Uؕ uq6rt&CGo'hMqefKӿk;[LɛGߤ*Jru{]z7 g#TmmVK#9Lߜ,[m'ߕGPul.=ϵWR4!Zl2GiP-t@] 08ar]y~tўffz<ϐ&kcW!7}b?kWǻ7"\DJQj(F{#am6>Σ>o'N_C5κPHDD0Nw妽5wūi$Ifggb켯[:T*']uUq"ѨuZܒ/@)$7n)J!o={mN?L =qq^ڽ8<8ڻ$}~Nگ_0e^}TwGټk+^+l{`;=zg;W?Kabw_yYilkxHYEiݒ\O*77퍾X jS}^{Ri&N:ŋ/?ΡC=PJ?f& Q:%q hޅұ0t !nYY5e};h4osgx"Ģ'q9BH<ܪi~|d6#p7o{~RHP(Gz8R \"hSi0>289} T֓HYlw"?7?drbN͌AgKg/11q(+KTƵ!Re hşSn6X jSɓO>ݻq!r<3޽ۺgUmX5H<Ԥfnh? nru!ZaL&ʆh>h/*/\y7掿9lhC062gx1͕.J+=R4V.Aٮ$J8Di$b6fU.F¤3gat e`L\tP7VB$J[9 (q*YɿC IDAT#]O/ʹKl= }u*W)ܹ4ƚA,)tvvo߾͛7i&RmSrOj`1Fyی`-T=?BvvB)\JiS0BnXq?43f*zӅ"u\x4pKũ r}8ZUHQ.WS.JH%qKճx6_kV6xRrοs "N licK¡QUC`0&+eWy< Dk dr\YЭaM-ag\7~_]뉗]n+G뵝%B mmcT=?!^hҬ.jYOv|h;XmřW?L`Q*}w~$ikTO qQi 3EZ%ݑ R]i_lےxRChly&;\׳@PIYx>O"` au>/_ D. 2D~]U8m{a;5׮]#LAם#򨬬ꪾOt7'q$HJ;kP2[ۏ; mCqd"9EH D>ﳪ23wqddVVuU%+ YwEF?#ϟwuuTK H8z|Vϭ6Y]ȺEmLX7 ҷt1BD-D5f^R-D͋@?ևvqen\Q{vBA@+{8s|LCzoGgMH:hdLNAm};)h5EׁMz(аD„;1NJw)AN1j|p:{ߋT6ŭrRbkJ6,bF… {!9z(CCC$ Ne2CSf%&u!s9KZ2_H8,r5Kq ?^<:]{qjB$̺9tC bIqʎ}3U# ܷX9T]lKLkf{mc! ڲdBwg?2tͻI$R$R TwL%< [ۅh4 Û@J{Hf9T`'֑S9,lfGf0R -53΅֯ZSkڞV)BTm~?~&}]?w(7î]m)o0UEhj^z_Up{>gC]5*ii5ҡ(—z9(~Lr(?1BVyQ17:ZZR.0pDkhL145<_*ٜDiM^)0R/@4 5$+lCj+-Bg)fKr*}uWZU!K96V6$bftt^z~^\eppet*%hUKc[mkg] ?M}(iYCiM(+Dݖ'( s(V䭋J _5v!bl4 Q¶mhjj61 !---ض}Et`!L %B`5(zͧd玕rͻj>enC+&\*֑kBJjƇ(TO%MNZH~ץZ?( ַ_5Kw_ǨM QBk˗G&رc fffp]ӧO#ְkK~Ï*HAnGRj d2C+E+{eGf @+l*/bqI7jQ %csWp׀lc"lV,DAy2PԤ 2O9z(ΉISe][F.{%x0 ,ec 6ZY1QEgg'w}7Ν0 v܉a;v !dpppE ۴"J|i)WY?Bpf~~o54 ZعNR7-%eԉ7`ن66즳g3R!ˬȵ9 9$Si_XUWok7J(j1*Bk]r책2$vEF#bۯ$΋_?]֑?</!II ~g1G ào|XfxV?=+'R. Ř= gEiE+@tvӿ0Oxq~704 0J: 2xUfy,ʹ̎o Vm/GxK=)0jfڬD ΡiYO`D&U8&xX, Go5V] !y7ap0>Q֚ioqYoٲe B\0;UKM@9D~ )}. suVzI$LNHa&R*\9?/dZq]Ο=ɷr1;_ y/hllap!túL$dZhn&SL&ĥ ':7ʑ_ e8[wb|cF!ן$if&$u={U_i^Bype6]T |/KEZ,*ie__/3=Bgv:gضtxyټ Z^U[d`ƪ :6dhjrmk^(򨐎g::o8:p(-e^RJܔ L.,N1j BTӜ9ssqu=ŋoE~Dҏi\=J_ |ҫFV0?70affTRI"_ݿ{F;֝wq#"Hq _9>orǽajjp]QTxʂZ 3 ʐJa&.p+\?mѐm%i ؊HճQǮ36ze[fܼު P.`?Z2 W0FʏTmc;V$^J .~y%W'.HQ-?;VjBT0 ,>|W~8C?Wtd;@Ăĺ#᪹*н"Lbl2GWx([;}oNaRRW??s Zzihj%)B( L`IZ9K<:;0Sf:{{TԄ wL)d!Z jt% om ihƇ[˹FBf%FC(fffxr Agg'>(;v젫L&B"YA)kݾbOK h}_+pŕL c6y~}o.]:oH&ݼo O>8==[=Ɔ/ڹ;>94&d˼ڳ\rɩqƆ/޽ >xͻ0MCGf&Fv> X^U[oGK0 LĶ효@)*-JjK98jԍpx5nƯ6Z/J`kכ6bի_CCC۷CgϞ%HpgϞe)Eo!J( .1BfnD/t@c"}[ra&ع&vLC>=}@tl _&މHq'>OgV{ҷ iM-ϑ&Hشe/݃HfdkLOͰstoI]M@][/09z9nt0S#wz+;^_ӈn߱ QT8.%l([:H_PQ*aәg&(+kPZa (4z~8'_0vx}N43/gI~W /A(X)M Q BA}}=_4MLNNie-qPx[ĤeV8OOOOjӿ0嶺g;f2A*mGnn3"Є&U3-XԺGoz$"\WXʮ[.7b!??.:)kPBV6e&VX^%yޯG{*h 3Sa$~'I$hlDICfʷДo`$"_9@BjLe7)+ PhRc/٫EBC*X{u׻(@Q*FSyr2"B눧=x+DK/b|ǒ?q~{}8@So ccfLFk;ugN^d8sbiv r,Ο{CdZ pwycmLޘ$LʦA{_;ןNѫ78)'O\1TkƇǸv]R6ڷWK]6TS<*%pC-G8=,qCJ&;/l񑖯 ƕL8SVíQF.3G^QPѽ +\+o85P%Z|$B'@AZH,Ms)$>ytSq5<4!/䙝sG럼'  ?$RLзs~A ?x7H4"gyindsSױ]/e CG;(ҝ)j,ίMh7JuG0 /2/_fbbB@kk+mmmqرc>DORZ::le߀Eԟ%[Vٰe~1*BA"@JYBJ=KpCT. PFowUbPH`339̍IG'il{{ v2r7@Ilejo\B8EJD]},m}lڻ־vmzUǦhnn !)r[ݯ*+D5 ۶#I]]p/#GO"@#DŽ f'(oV7nٽ:\2 weHjGvrjf+4={zY?Ck#sW`|b8FZ X\+7hԎ% R6rp6F$tʥ, Ak\ akWw~>RLMOQ [Ҩ ˲TSstR*\F616bVow]NfffVt?/iS\8V7pمq_$)Zl UNt(?R"P= єbmܸxY`嘝e=i >K ܂7BN%k yWk0?-݁ =!&%l  כ6:a`B H@ێNvt #eRא *>؊덢%CenB%,%,Fm"VjD'|gysىir9^Q"Q_rȠb$᪸FI|ÕV:v  Q>Ai)9'96Y#Ci(N a IDATFxA|׊,{x\dz~LswѻyU fu,b]tG&} b&F[{0|4Nc[f{CCW3.ɰ&۴9aIvn? sn=qTgyDI&z[l0 VQ췼ȴQ/(7$K˛!+D5d2ɗe~_r9.^m444׾5۷T 1#!N,AE ͕r{hî]_B`rYP%ygN#ݲ("%/ɛ4mkõl̤J!da4 zLǡ>ԤҴFr8G۾n̄0L/Mh:z6$ZtzPZwVV̹9D`ӽ(kAݦFқE'0.˭ԛi4†X!Q!hll_*׮]cttqLdϞ=tvvNWtOo!ȣ88]˫VKdF$ |! 1B"Ɩk#im"J3Abz]"m0Pp E~Zwk]݄_i0GӮ"ia!ה'CDBTpw} ȑ#pIv?lHLE:Ff࠳ WCq&XV~x0 #UhllrB+oJo|)_Z"E--~ɽָe\_ДK&F#Vj|~я~ěowMP6]]]8p`fJo -Zvq K3P?6dcӥ2eHj *+U{f=7G%x0e.?7c=ǎ㭷bS H4H?ķ#k: Dӯ[mk>#=H(U"HյPVr-i{NR.r*": *Uyyi(7,@2fE2L,Tܵ8Fm"Vjd d2ituui@[;hvGS.lZ+U )_ ڼ0p^{)/N,-rփoK]Ac,D`!(+~JCA;䴍B`Eb\aҞ*֍&[E=-jme\S' UQ|Qa~W$ ^uv /ŋ׿eDVEzO W"%AVSv r^G!כ. ί_K"\cAQ>Day@.3$3([QK|9ϕjz22IG7ci Q"J\t ۶?SZ[[r<ܹs Supo1q EZTŭ6(dUpKƪK>eV+nlŢ$icq=?׻(1VX!QÇ`zzzHR|S4Mǹ|(e#`xE).KDWڼ.;$j+("O߄汎|(K#Xv_ Sf@"9g{vu ү 7F"VjJ)/~իWtwwo}lY DtA貘:CEW8V˭6.ȽV ։oϡZ~1*V9_( @kMcs|1|!todv]| בТlW(7a$H>3cC VjӟawßkF[[ۊT]W>E񷩂[mkߠe׈ ciԊuBj rHw$nDweJܴ.Zx;Ǩ- Qu]{9/G}'O<|+_!Na)| 3픬-ztRv=Wí6UK"貿DV]Oobo,~v% AdwXOz]nyQtnIpwXb6+D5 0޽|f˖-ήf!jFK_LN<q~5jO>z5H"-<LQB}+`˾R$.6\ZE"੧ʕ+?.\G?QrMh?z G(%s^ `}j^~lȲkϧ*VD- JqjZ(b)[9q_M oZyᓮ}CPJ ^1֋pZ"cTX!Q$I|I::: N/}t:MWW+6W!yQ(L[mkeD-2e>)/ۺ-`Q_3ݗzE4 9)+ ρ_hZmD 4t+{e7Hy K|:i<'<.&4^P*}jBTBŗ%ǩzaݸ Fb/iؑO/Krj潖 [vxsכVDQN % =`ei!eR!`eVrLޘ ?C-uCi5x!67RR׮Z) \.דiܷ+̿)vB;!m QCAGGGɹt: Qu,z|XE+:Ví65oвcxbhy tFP.t˂o,(n4Fc9%uɨ%rn|azlw_yΣH)og])` J)&ycg.P:\i- e@H588V˭6SUBi*c,ZQ+ W8R^FK[5Gx9@g_'玟_^晚hhnYΞ8E}Sg~6G:Bdk>`m,V0']5s3$&ss -Me3%89;om]h4R^0a[%V`+'Zk{4bc#͹Č9 aaYыJny!ݏ(chIhq]wE  |La[9le s`,~:ek؛Gij'.[2;;Kr< g=w0 )Ņsv&UbSh]˥+`[=g=OK:?L}CclݷÏA2-M7GwmtvmFAcm&: W++.Uj%ZBȷ8 W,eác(1iNu6bihihRb溏˷눖GMAq~gȹUkW219Q>u&3Y.o_۶"L/133Ǟ;vP8õk8iw59u:w^yT:Ŗ۶21<ɉ 9v&zo^c`>sfZ{۽XMrs\9n\!c]nܖ+r@[&Y(Fm#V>&Ѐ-ntEhODd4+HFJ:X^%FEd]kRybRb6d&Ŭ "fw_@ſh_6BMHRpmc!MI(J8efjA =_|`a轳4v6 QH V[ v!mJM[!3\<}og&ƮrU[PHwsw0|q1:J]WCw ב}xƶH >x:"&ҤZSȕ!Z0x!V6 bc[:[~/iO9GF yj^+F.*2[Zk!HBG:do -D'4R F. .ki:t5rIeӘ$n!O2B$ p.JKR6ec& lecLId$S45iBH'q][0R4u7Sd&rخ0 Ҙwu dr|k#LOlN-?p?Z1jB1Rhƚ@1 nyW/WWí651R uk^!RJak[:8҉" dE>Z]h,Ґ&i…tNq!>|4Ƒ6ӳs v`iHlw L[KR(Fpjh5QQu1zrhJW]GZ_ ڼh[nBT SfKA͜#BCT(/fKM3kkSy.@Sw3m;e)K\;{FR-IRhL oSp SX;yr, M-9,@yS;9,ic;Nj$@h޿`p%6hI2/ b],ޢRQ62۰oi@ kdBNLt]D:I"`ˣ;IX¦7˶݈ބd*O!#/ ɎO,* <TddZ)<,TXRnu;Po` Q*QF"rp>+Vě͔kÕBkeYt}(K=j裸`zǬ/h0ihl&6# #mZ[(0 -(h%EcsʛJa6P@A9$muAkјI̶ R+\e# Hjp+ѐ1=!p}Ϊ}uvBcq GEA0h#B8LY-[7Xl)a5j^K~6^م0A`-PjYjK>'Ʉe"4Kz5JJn^P韏~џVK8HM5$[2o[F -ZvN1@Д4ʍh,/z0e[: c V>HB?^J}I% W˭6írߔ/H1ڍdXfE Q}}}ME.`iPR^\N[-/y[]tqE @E}P @9hB7@!"χP(P__QB +leʕB(oxo~%7XuRְkBEjVͭ6oԲ|_.v^RJ lvn6s o߷N(ZC-`E$xuo^;) ;O+ aSVUgBb" !H%lArurXn&C,#]lǥTECy 85a!Re(6W_9QKтlb=7GFB0s|A8~c,b#cײf'ї˹ڼoc]D.хQER.ЪBi4g`P Kc e__5 }@ƨ] Gwkl$M8)%?/*] %=hg=(,L&C"]_zoP &xKKv2ﲼ46H[nH?{%m-z6ֿWa񆦽e@!рQ"^?eYLNN\sKߍi44J|ݸ`_p{ʭ ފ˕^2R447-x߱Ŷ+D![BSm::%Р#4Jf|6l IY48e166FKKKMXeZ+ &,lZ 5adMT8^z?E&EJbr>"j*--)o%h`Lj}7/U4@db{o|B]7z1H,C8G|S/269itp׾0;?,}f"icq8~ X$]4G9ܬW7B`A[K3KGK 2⳱KQZs0-4fK=_o{e6JʈӼ)b)wήR(hkkUfQKBi<"\,i(_!ґP%{)'N]&_-.3t44g|w/'a\'Wv0;';v%EiRk"N<ǰ,ψ1 K׮sY&fhj}inh`._3<ꮜ+DV01X!@,Qg~sIˏEspse\axHHy@GM}`zz\I颣Lg^|G9o%;oYH[s#?^=[{z8>t.{ܷ\{/*ƶmGop%&a66շxw,:]xI^z:;5S<e15507r"=HSo㐨O6ZHgҜ;}W~2 gf||ݛBQ ?ss |zylۿ_.Y&nLJHgކ4hm癿1q?ɓU}+`jj+/۸r -mtv}uG0UVY0۶DX!@\2 #ti RghZ%5l?{g [{sN6r-\v{v²._Cy^&rC:SSX_n\/|w3g_xmlQ {ٹy\hs]$L׏{>wߧ>_}-Z/WSܸ㭄y._?N]]z(ĽRݻD"ϓ[47bI WmO[3zm/ɗI$ٯy[5BJ|~Y v5Bi:ڸSp9^ |;K?| ϒ&w[?~ ?x$zUbjz+|1l"HqSwӌT&OBIpSǨM e[hq=kCSEooD'I˸ AZh~޻m`##\W~II Ӡ>ex΃19}ױIؿs;?{o%uyn,YUYFb#6JEْ%ђnxl?}fO4~>sΜLkimy%QHAD b r.YU@E*S@,ƍq!vng~[F8/K..!g/]bp?&!@JG0>0ȁRff5|?̸lGK<{ṛG.)f31uc\&8,,.pezy^y+U]ޭ |FJbbG`5#>ZBbŠv|!" Kf+R077ĦuOh""GZhSqƦ,ec *2 %BRu@$`%f晝I@û(ϗ:)\G1Z#u6_:@*,d]&N2s"}#}w .J ՠJ3G"q2.s >,! hc{'᝗͇o``=MR$lFFlQT7mE/ #k6Zm!uHԋ1sʔ&E6$&nQ~GH)9}Gm>ן&ʧ4&2u 122~Bk R \*7:HZEA˧wnO~ /^pm~g\-lOU9lDJ&뀣,C52LL`=iW=7I|ym<_NX%:V:S>R)4Ɉ[YH2]-d,ͥ9|Vht~}BOn!P!𤏯,ׂ&Dj m n%4AԌ@"D1|EhBBQ}G %"#(NEMsnޘr "Vƨ4jrx6ZmaT#96l4\||GO!o MPȑB 1ZGšH ^ C>|Rjcαwl #}1A.N t=/ֱX飵A!*ȨZCcS8\qNsY.]8غ%P e v/]7:(U=LSSOWG_ yN8>7yVTG?8ɣ#dlT,F4,%~'=ۺ S3 cHÔ R FrNF:7 8e }=gSVr^2B0ZOc/+|EJǵ79<1#Pe !"[~9}4/BD(*ڣVP2sh>! i;5Omk!R[|^ < ?8 (pz3F?%וeqqmMeDHEUƆ( U)Kˊ/ȁq^W)v2}OF*aemma<(VD[ zUhrȧLEqOą+,(d<>>¾-t:AEo=4)dg?a@otMm;Gg5y0o:KiiGyd0HC.x1F{zz* } ݽΌW.ctgoъ% 8||aKɗMWݎӟ>Ėʂ>rQ^o+"Z*4 ڵk(4f*=dlȦٚ%'X_@x^>@T!ӝe'8Î/a42-LO`UB{>MW_l~i]Etwȗt(G1Ie`SbW1Z 0rUp}{ a rCFMq'w@1)~Qu@@'K8~-JkzZ?1,aEa4pV ao]\!DFOFWEk0QQH_2}so>Y.&3Y"VjmWFӝqxvV4VbYy t=xAkYd\mғ<112XM)˺|avRHO5z}5> e[JannǏ#088͹#:QqޕVRW[]] k勌o=; }X8h xCt:Сq2d:cC;m6c"36 {k;DByync]!۵xʿk_kѴ/G:TmC(۽ Z 5h"Od' ո BZ`WI_H;+@`0èC&>li[tu+} T!`WR#oETj \-jU'Z333ɓ'wCX&C}*47Hc˦q#A&e[~!&i m[]ۅe0FE\#֑PiǪnUƠ/z2)H1q6B$6"4w˽]s[Б͠o_,j\A{.Jͱ27c|Ji?1kZ k.2F7iP{yh D|9xjFW+ mٶ7AcC[ zX4ʋoT28o; q jpT QrR߿s'!7f֚/կ~nC`"(hd<֤t̯%lߖk(TB@@ l16۷SZ^KOO_~i揲syoZA=\ZB=ʱcVV3ocs-GhޣR\.;D Mdǎ۷ibQ BK 1b6-Lb4ljJP3!g;zW|. `},~PUJ_׼Kܹo}[ot| gCm!ԇ c͍@tQ*t 8þ}?~1Qn@kE5R5AyM @bU2/~[ݬKڇwPwį5qsvi񩵮i͇@t!`dd BOA&AkM"&/U۶B82e/O]#L`cjv4~;xsW޺?nŶǤ q& /rQ{=&''7r?d@Ba oFֽ_ww¯UuQDhJ~Zm>BAOO===fm2 GRm=mqd2<Չ뺸8Zkfgg9s 7n'೟,[l5'M"!UY%a c5bRLOqFqNuUi,z9붧dt퓁tds > XTKJ#Զ!h DI϶# A.#˗%(T* @Jֺ- eQqd2d2"]]]LNNdfg0͛\zǏs ַšC( u#=Y2$T>Ym,I  "ew)% q^UB,aa-#1Q_YXV"%mwzk7-F6 Z6ZmC2%d.{2;;H- 7͒fkP( El68 C<ϣZR*XZZb~~˗/syJ===JJ8tttP(eǎ ƘX,~"}*0F_GZ"n̓6^Q֚i#}|//t{CÜy KY~AX029cOa!uȅsv?L.ˇ~FGxWx![(/q}nSdrNX`M2;?ʧ7v =#}|GJsnܘat t`y,*}k4(zh DҶ%P7RrE|[ƽy+>ul6[0֔J%* rr\^$z"H) Ai=rmPꢻ!zzzZNJ#cMdTJFF 62q-; mZinޜe XS*"ı1clggNT*gPxA+W9I =qc [c\71gΞ"==菏241v0=S3G-#}VvR^,s5:{<]ޚN$U4Vw IDATLG[ z~UBz{{yjbE5b=_wWݟ?|n.qZ09PJ-륵\v}x aX[M۶) tvv6xHlJI Ė)~ÈDheW*%YEcD>%'Zd_oT PBadЭ'`qnS||Y8{,]E~Q BBvst"dˣ޸ɥD q|q w\9Wa4?ɕKk[ ,jZia-}֚K.y^mI&/˲`w#A0Ծ}@*oݺ&5x#} TW_r,[V}=pHh`"jUJo"wttCCC/1v(Q| 7CUzTdPɔ,'ĚZ)B[ǗѻcazK^@+Eū+ t8HG_e旖 |#U}T|۵*;c3uNryzҏS̒J&2}c6syzA,۪=CN3a*o?#Z_Zb#nÏuO[(h D!ѣٳ!lF)Ş={dBLl5 XHFq}G/e4m1wu>una(J%ǩϳ<  ڃh*ZH jatXpxKז^.,=y μw>˞'ӝeK:`qq lAP+.aY6Eh$T S7"4m ҄x'!o<(H(|IeGD;Ɏ۱6WnݼAW*|e҄1DB@t!`֭ aHZ?)>,O>d-z*jBBB$l+D!Z,n,t}-vKHQ)A8 C 6|ڶΝ;컮ml Px:$y I"4VxfVۛcx_aJHPU*{#~-dr n}9@RT9;qyLw@2$P! uH|*? a@ C|ȸNح5s~>iMqمSt(N2w;C@'[O"r6} d]: g5]yжaN[ v q{2 yA`)v  aI2L- Ov:@v*NǴ&CgcmhvS^/j!cUAgB Osw]o|.J*(T*tvvӳ(QqBJE_i~rdE2Vm'mkz뾗m0F!BiU;<@ۨ ,BD0>8(@ꬸV>˦. D4+e[d;ϡmB#. &u폪('bJ.8}YRRkdh㲵;vw&ZR]b`JJV@Bk0/Jh*  w`$FS4FƸ[z|[B6et'qL:PFhIUh٥ L󑞽Ӯ&kw .Y Uk[>^+p;CdcUP$ZD8U'Vs0-;宷{i JIkAiMe!Jn"Uskپ^f#m:4m m}Zi@GKf&96>WK)H rwXvzWq1`elThzEۅeNC%J8-;(uW[BA}" 'm-Q@EE{, Z:[1Xy,+Nh D~uk?(2QL\:Mvǹ3\ s\6Uvu BN=;(n\OEKc`g\d|g$5K%%(:lgMm_E):D6ӂP[KNYȅWe]$l\;rX66㱻<%KmJQĆX3A2&e̤tkYw|_?P,1H?r(-W7ߓ!*uPav* _ǿ?A!Fv͑?I#cGKh(d0[Ȱؖ@86Di T -a%QP&ԩkFרbޜh4j U|-'oaoZ`C~՝ZV^Ə5ϱmS¸~|kָ\z쵵Dma@,HtPiͮŝD)#㤬H EKvM\J]KKyX gT܍9J(ʜ=v0T mNJs\8stkPXi4,{\YfѲ^9G Bж>К?AlG0wbqXئG[ zH`xڏ ZڗP"I6\He!`48WN]g̗X m~ҫtAK%B#_\篑+-x/G'o=ϫ?7nȰH"Sp)9ЉU9{4uwʵydzxi 3צ1 N~O?ciD6!x57k M)6Vj|P:HO tY]<%cRMDF6miCfNP+-=$3 l҂O NF4 5q- @i _+nLMs)?|"+y^~ݗx<>>z/>8?~ߧ;/?ad^r-}m5 BȨ\iV1h( w晹vD8K?pi ۆfrOS*/a]<n{Nj"n։8z}5>D_n6mc3A3m̳ԛ5Eh,SCuC ⿦2&V{5o⺖?K|{CkXmcs-=$Ѐ$i˚F:'RvRnMVر$TL>|O';'6ԕ)n\mߵ-+2Ӧ-"Od]"}xoO­7ȽsuߚXPI[@F"MbhƃV"^˷Z&N|hEX`ܬC\eqn߅q ٮv%T͛PqOH!ۑƵ亲8 ~ū F!"D"r^fLѻ}RW_'NMF!4 XC;b#w~_/ֲd 4 j@+b|Gl ۞Y$ vVD[ zHEUp; ,DH<P ڎ6 t!1\t#L]NyqkB#/<1^e\9sO μ}g.001 y&z]")(\cK~1N%,C=\>s  F!_G$|iNyH|-O-\Zmy)! )  v oX4ޫs%j @QUA|4 R>Q-jZI OR* T*>H O(-t9l?|x'AZ8G:YG^ctO31?{'|:M䖫o~ؔKܼ|iʋοW92Mr9ʅϣ"g=Q eٞT?of>Ve5D-!}!h'*5LΩ'a25_`I۾&~3>:e`YVEhM5XuEϣӴV4)Ie?'r*][yH@'b#~kg <>0`!v>^S{@mi`iʥLgݟ-{& . %]qB&?% ]X937 <[OR]$Ԫ޿J|G1k/VA9Hh#G\4?'sv߀(= VFħ޺CkWf׸ 4*I>S7h Dڋs5FBpҿk?< rxHK1{'F؁NnFOCILiܬKbw3/zv@l)cc;6+難q!n>e"[^H.mJۙ[?_Gn{Vrh~: aL5(^7i%k˧5I4#00mtM[/DM# ֝}7m&KEYI8BiIUZ 6Hb{E[ zH/|SQd -y!Ֆq$h>FXQHgV_TvTFj`ʄce10( |BPql$h9D ub l#,QN)dtm% 9A&A h.F0Opsx.Nk_V 6+Kg|- DF0ҏ`F']?C&~#u~|W8)*FhGsx[FPJEc]ɸڿ$I*{vm Rs'"dx|A\7ӰeM;,sU>uQW QZ}mkZm!BZIϷMFɷ#YaP? uT^#4m7oVi{3/mb)_ &mCJHOѪd?^2[QLEW<1&U*;y}eLA**/^7i `YQ:y.G #"'JKtƠE\8"he2į.^' fwfV@K Ij E@@EKH+ipñr޺e.FT{ɬe#2hB Nz&RʍUm47oׯI\o3K\̱~ W/_grNC{0 U._,Ó# (vsUV,-y&žnv= {,B뗮]r8]B0sc_>?Ķ҆Є#͉{h D Qx'H\x:3HD⮷{oնiV4ncS"f,X;ЄZȆăK?E HL{[0i=[Pawvzvd9{G ^J>8css?:/8g,<<v =Ig_'ssd3(*s%D72K#1se|  >iV4FjN6?Ci$U*ť!+͝r[j--y:l'`W>eUFJp[_+O(C(+PF˜K,335CGG,k\|i$<#uHEUA B%*;0wC,cd8=X*(%'e͍tɞZ鹅Y||+n>SWe~i7ܓ~k%upVmP3f\C__jk٤_ 5TU\V]o_^-cT&\H[J+ʧz(,ǏH?͒J*|45Wp WB4ݝС+ 1ɂB_:"=tKnΡ}P*|$NA:MP>J@EWhV)UlK Ʌ~:__#ۑ嵿.uz;[Rls Bݺn}m!B۹k_Ȇ)JWF+-mr8÷m8W\_?&%`YIWP%U zw]oݟ0?9EtZ()) ۶mL7:@*)]Ek[5k{Y6ѦG_%} 5|eǎ۷!_Nzm@ZC!Yq[?jz䮷{oͶ'EǚZj Ѓ !|k_c׮]G?xg•'d[(*9Ui!5b2'D2kec#nU9rf|D (},a- # mhC)/~ /{YN>ͱcطo_C/x9&F+?{o$q{~g07"q ) )$2EJ,Ox?F» N'JD(R" HA3]GVUW3L7Xoevue/W4TW̟[i Ƨ]0 YmvZxO~B*bǎ骾au; 68rV`J"{Oӟ,QghfNĘDQAV3!j===qb1pԞ|$ou-_[c1::ʏ~#ٻw/ݼ5X ۶cquQ3uB@"B@m 赗H.#ew]yz*.}J^(~xk! ħ <ϵkhoog֭]62&d|0P(UJZZkl+X%Һ_mm (6ZEoo/?8?xgb~dwǃ%J'8f1X,$eu a3gwkhh PWWG:&LIL?ZB$U!\zg}/~8pK.ib=˖-+2?K#$U A>EP>AIr\ǭhۥ)e?nv/3Wk.:::hhhhRJ}df}$d:(md2I6%"snR L&D73i#X,p$oRGYb%})`( J>_WpFZ QG/`˲Xl?8/"l޼ 6-?`Ϟ=lٲ%uH$>eYi&&&fl8tL&Ccc#MMM@k| QF$U!}.X3 6l(RϧR9 zƤ⍻h,o RAdi(DXW1onu/ߏŶ[f)'O裏tR>C<ȁhoo.,YIbX0fr9N>ͷ-8vncqRo)jH$HRd2u$L"HC6wFHR"T/"Ja6 LMMq"=Sutt:h/ύ**⊢DcAhuplJ^0~ڮq룾{rsN:ϟѣeY~!t:0kB\ѣ{Wٿ?+WdΝlܸ;wsNz{{ǶmR* в,Q nwd2I".6|H nDQß>s bٴi:6++?,)ae o/Һ_mFě_mϞ=ڵa._̕+Wv|qfLLL0::or]cǎil֜-[6,BW EڡB8N> LP*R7|7xG8SΟ?}7kR~M`ա}_e}Dnۃ(h }6lڵkfŊEu&,.߿/z Y'sn6eu/$a2 sO/*.@T,+Wŋ{AfjO}Sl޼yNjX%MY[B`E֔X,ڵk?c:;;QkB~h$-<#lټyZa!K/32:B6ejjd2Yki@Thkk̙3<~~W֪pS`Y---̋kf1rg*s3a!Y{k6LLL322J$2GDNu]~''466>ˆ RTJ0j:V2Tk&__ wnVpZ][F|%@GQf5,0s$\ޓbnPz\2en"葾u dpoP\㗛I$Jk,CCC%p4DՍH Bht=_᷿-'O//inn9t;Rhh(WhP^/:*7Һ_+TۅDk~o2b||Q\U8 D@_ۋ/nxM9s3׊ ㌏L&q]7JY#*R~{ill7 ۷ogǎ$ 6nϾ}fG@d ,|-S'(|ֽP|_TmGY#| 8rl*/Z˵Th.}=,&.W+T|arbiKDnDQBA]]X u^_*Di2s" }X,:ͭnۅ̢wnMR!lJԯ%J+rg:Wuc&hu]xI5lV*eYZL&Ï~#,btt]vqU^y}~ Q㍠)0|M6gyrh(7N PҺ_mZn'zFK͢•J F5`DBx1 ]ќ$xTD:{:וd&]#5D0T*ESS;k8_ȑ#+<l߾}a d.o]MHR??_nu/?_cmf!B wMqEXF>_!Ҝ)`qr|Kk4DRw3kF^DQ"qF<c=ƺuhjj5Mg5/!gze+@ Bk7Һ =- Ng7oQ^?`˃֚ q\U<(a3/^~"#p]RŚ!ߵ!2U7"Q__ڵkC"4C @)$DO ުO?P*tA1Onu/Kud~&C2g6[ FķJ4B#j x|\eVN[.:v!4Rlf5p@DA+m]p\XLZQ:qd|FxhɴSym5HWheXT(%Vl=C&F|]13Y+~( D#EY53>ۃ1"V/Һ+n{<^6Wa&r-Ҟ|έIL,0s4Z0VkJ9q9N{ bIGkNsk;#vj˗Xb=R9= %l'$i-z4 ӑbj\Ic$"ٳ$IH6!?Q5s}?[ i%*VZBCj\{1RQ[J# N7BX(JgO_&Fij]Bvj9ӧӏoAaAF\emNfȻfYn;}o~IXVzk̜P"lo=zf<|}wdž UĂőZO7(]Q`0P ԕp_m#Q×Q\ 9dVdZxNaM~b&Rk^̱z\ ;YϒiΝg $Ru$m>::"w9y'"݃!X^!\ێ166Hsk'Z)&G>Winn~-pkXr7Kd=+zU]R)Wh pE9D9ܪZ #<—%x ֮]Ob||q;(A6+q]ohg$SMzuN8]>Ν~-Zv88]+6p@X6ZX$Ruر4ROaǒ+\ZU|6K<%HgZbiFՑX,N&ӂqx۲%99yYޥRFƱȲ %)"$"J̙3|{#Lo3>>p9^[Q砂,sΏkYW~&G!41;NCoT:}gva|kLN` VXGg*r(aFrd&o$Lz9~*o 7c11  i+j\X9wGgPukeIZN{zGb=_dlt0<2t%CCĄMKrö,1\e*G3ŕinqMJirBJ xҴug<ӡUBi;ѐJߥ[#/FCH Rttto>._ ۱m'Np]wjժYW/ /oHa|';n"0-@(=/6[ɼ(u IDATe밅Ԋ|61lD23@WIJmQR&A\̎Zaa2'+ɿߴ,bM_8"'_CurB?ѳt-c\8w+еtc|>Sշd\.O*]G_4r9:KEq)EK15'+qI^z|%JrJڎ)z=dN}X3~Dj@T,nQFUBg+R^k_Q؁ǟy" ea~\z'xp} X )K{g?xKKWn`:uX{#8۬ݰt]gO8yVي.ZHxm;=_^~i5=sKiofc zE~9O;dS>.hljg۩4Uzg+h fqyT(h. ӏ  +NWFv͙G2Z5Big}\:!ImfS XdB{r:ٰ~ZDam"nF[1˲I7tQ؅+!j`)E̯ijc}4:wV+]DQBk͵k/~A.(Z mxl2+HA5X" Rw3.ڼ:2FX!,KJ֡D{OCk[N>CGN/ww7VvVݎԮS),aJՑk"KvNOo2xWOJ36:5֮5F`2;c ~$ul߽~"">]M8&pdѡŨ ),, ,>s[&Vn+n'75A<.HNw6 +ߍB4H$X zӽE, #elGhn[NCc7v<ւe`il61;NĒMlaběغ>l"yY;se"Ҋd5H Bh.ǎcݺul۶իWcYJu|b- :BW>?] z9\ĶmF/(-x?39>7l޶?{Fdž9~d,Z3+4[4/D-hHzqy?ȡ]q VN*Հ˳Oݷ_|%VoI"|wn+K/0-Mxw"_.߰(*17~xD - a|t}Zh9oYku4t 0ϩVx()0" ` $$X$K@zqu̦B`HK/`*w,uÚE$U!,ˢ??1$d+W~zH&7+D\W#a _K)Y`pa3,\s\ޚjN`cFXr9+|n[Xq'{?ҹs[##WYj+yR)U0He'Rp/r 3$He8=+r.sY&Gsq7oE!><] `\uht!eJaTr.ßKmᗫ{+jgg_"---|K_bll'NpQ.^țo{GOOBA%a>LӞqݱiFz4}6m݋B4H֓HYf+ r8yKzd06͔Zບ$W/aIRf?K>8}7UJk WRM*arbDx o|*3.D#'JڡWs*=:'̤ 9I"D6ZZZضm<?zvk 4ܷJL|!,]g4DjhKMHt@.s,~9,\87\Y7 ]DQC)(~!ǎ… #tR.]:'?"ףTѡrCg}\ Uڬ;g V !`h2bY1zoʥSl~4Kgy+R^w \f*;%:V}gAdx etd+ѵln囈S8&p9Ʈ]4vcY޷J{yKqZf)5h_|+2iɣssgM|p: qDQbxx~I$}v֯_Ogg'XlNyϤ3TQT&]v4KԠ\Cieom'Xi## _!nk%J t-w~XnV,Ɏ;g--Kp K+[WɎ>J_FzWlͳeǧI}o[ihꠥw?:WǸr,;>òU[%R/*fo`HEt@Y(iL0JbO?X20 M*]jͪ2E,_~~rj|?ʡHO1Bm"J).^__ƍپ};9r#Gٻw/6mcxř5A-)ϙkқ}@ճΞ e|lx*E2 &hT{?|vn8јXcKɠMa+X1J&K`T1w?D6;A<ĶH`YXf}*|/N? 5QD-I!a_$,\]p/)s(5H B!+_ l0BTP$3[2X{xh`-J,i>\ ^Nzc"DS rK0@@ ~ĖeY^Tx--;nP#3e#26!2cMSSoA 7Mۏ'R6F/R," !?? !J)^i/_@y|}y$\JWpBȩPK,xUiu5OtњZ22nBS ŒOi&,+-3~Q !*]Y B#eQWW]Oe*@*l@ 5)`pۅ̢f$`U%Ӟ떹Ŭ{!R]@TC($> soNRïa]dxfys+{,bj"94%I''|jfɃmmXDb׭ &% ׎9dSD^յH r.۶I&"(xMjB{"Xl0?nu/(F.I@9m*FDGʱ3u6mK?^k:2_I)_Ε+"b ^:L{| ]O}FnDQctt_~s100@.fvM㳺ƨ㕦uZ>sB ɻK8VZBf.Y-JU]{BHh Mq>`kVw/b"oyÇcP*8<8p.Z[[bضͅ x뭷?SVZ5;je!2h Һ_m$eC}{FG9l~7u"hG/õlhllԩfF DU qo>,Ym(8y$gYbŬ#͔&y_e{Ep+{BDmd0I4( lR)<\6袁Xh.`hJ"=8KK%LzlGidaB$U18b Rt:͒%KET٨0:;Kxq+{Ej"Q٭U&w+}F̫E/f /Õ޺hf||A)@T|_'Nd2LLLgϞ9!r}7e&X#Yu#~+Wm6N:Eoo/wq|ߤo}N $`̻c%'̯[}n!p-NAI+1 $xtJйE/f!Q%eşε0΅. >H b\rD.?O ^xw9p[n@3i ^"X VhO(ϭam]zk  p]M](K13pn61^(~r˲p% ב@T[*F*ŋ>}۱m)%MMMNxyW--gޛo '@ɂr.5J{t+\|skޱ櫋ȁ DUD"׾5Ξ=K>g͚5455!q򕯰f͚Y DZ3KK#-̋SJ7V]|7 +=+c 7GN带ۀB#f~5H 2ytBu7Y*=ρÃLeA [hjn'L׀ʻLMM",Ak.dtpԥ3$ :̌u>Uܖ-ѪXQ+: DU ˲ؼy3\vzڈ<("Lz"]R!U0axZ ay,V{J/yR>5u=nE{/n8.e@c#|LwJ+Fx緯paVh4e]lz"3 a!03Z ]{J>g9a Va#B~䤒)/l@c +hFq?{'6Ѷwӽ+c ;^GBPm!J)?~3.\@gg''پ};K,ضm{@b]^m:^i@J Tлɼ%ͭ{WDWФqfnq7o PED|^ At7򊰶y`L`n8&yl޺&''9y0YZ](cCh4odttGC}|1:A,'DhXR 8$xVPL_ÎŘ fRa ^/~mI7 ϑN՛k q( DU u0[n|;tuuƁ DyՁ^tFCaQo2cgJ^ ~ ]{ |K@kT\o6ExXM)5W\>$z<}kیw^lmhaٸRsI.g݆$Si~tt/w_C:y&'pY:{W25>ƕhjjeϑLxgpu"IVwO<LW <{3MMmaӝtvg@Pk&oTk@Tp]_|??g߾};vۿg_Le>̀V;K =?[nu/ V)wqC`B1fOAQ4xKO݈/dxxW/g @gZ[zЮy^M*]LJGe|bͷ݅9s|ptC)O@+ʥ9W[f{g?M=-_+)]Xr ##xWϰr6:ku-@OzFLJp\X,"F.)Ž×J EJ DUx< gΜa7Y|9sWB6p=q +V vaf 4 ])MGAGP0xZ̎\Kbr5&j1РXQ:ύ,a^~$u4tдhhc;%'YS,J2"l L'ٴs$iڶvkFg HǨk$B2b3.^ 5|.ڋ:H2$S-zlō[JXFIj@1Ҡ<}0)FLs2㿄BJȟX-]yBP495I̘Bfj(/K;GEx"(<'s :ZQJ"ܥ'CFXqvAC )% ,#h 2uhq%Ҥ3(-Q.$mkFki#؃BwdX.4ѥk@IErk@y:f` k?U"\DLͫ;(E6 xKO΁O!&4U!|+B#>&g0EP5xvszeޟ ֽpn]ڄׁ|^"e~=O0>.MOn$A2MЇ5>3pP D#f[SZ9\""]j|u4Z VA5mYp+{apۥ$DYPn h 9i2K U\S{g^h~ǵej@t _lͤ6fҳ%74H/tT ST([% +VZu ;u!2 L=@{_@Tn-=c+@uO+͂_4G~SO !W[Nh:ƾ{ȟ CPMJׅ])\O蘉{ú/48 ?@T(m6)2p1QQJ1PX.,=b9ukQPק҅C&VP9)Ubz"˲,@[;y3Q!Qc7lAB϶oys+{BSmG lbi@[b\(=XHRHV L̰-BOS7ͪ_nd ylρOYnxAJPs[ Qy_[4 ^r_z.(Mv$C.\ ϳf͚H(BMeƑ";~?{p, ga1YX%/ b|5KY(""T7"C8:eKc[l_/ea6?${nn|lڼ - ?ڋP ȯ@!ӄӹ‚W_}BIUT>j@tTNo}ka!3رX [Eoo/'9s %e͆ X|9]]],Yt:ㇰvXϞ޽{ɻ`Z قlvÇOM#"B BƓ|yWq6Dž[i a ]Gyew,V.]Ν;ի\v˗/{~r\d2I]]TL&&$d ̂PmV݈[~;mhm:>O!!W TĠuJ뮸^9GC.B(&"-WȄpс֚\.(LNN255E6%255E.#͒RFJ8hQJR"D)\5+N__k֬a۶mtvvaf(md,zC>rap7LzG\)YPr/(EBQu"nQ#@:fGA;!!^fV\|* شWʓMqC) m/_œi&k{L.R0n ˅B8)%\]?Ta#„zoxDi ڋ9s+{=uWBrQ%k& 7B3@"(߄udbbtǏoohjj說aJv/vq5ST5EOʆ4L7XԶϦ~Ɵ+bIk4>"Yu#n!-l0P ]tZ6ZLtS(3?nu/$V.@K JCπ:v~t:er]l6 Νѣ??9_+zAk8Y:3Lf:w33-i2U+=]),DBQu"n!ʨsYTޡO8$UY䜠r+{vKtЎf_"HH$7cy/O~Em@Lj!rac o[UEA[/"1x TʟURTe,H Ew@_K\ˆ qIS8Fɉsk_smG BI73jeY$ iiiaŊY^xG\f.(F{\ެx,>Zi.bbY=)hZCT) BH XÎF(h7MYf]AbuÝ]ҺOEn GEoSmVvMoo//_-(рȕ)uBI,] X#?{o%q{"}߰ q'͔Ų,YƖ'ͱo,̇9>gV{#?-IK")}A HH@h]̬̇ʪ]s%Q7nܸw(oVX 5ҙF+d F1Ԓ _|b@}!1Tj)hXkC8MthQkjbL?l ?E%@ƪ8W_0ۮCi/^LSS79rG4f]{K}*-}*lLx& dp&۩ *fn0reҳ IE|ktCnjkDhKM v&o+_w -:tZ tk!~i{1˔T.!B Ew4YyϴG$V 4DBPuRJ:;;yB3Ƀ>8g8O盒h:A:>8G7vZFxy5gTjs0 >pŏ|GC k PDybUSCksCs[;8w~ 勆89rO~r2t !/[$y y.@ѱc|Ǐq)|#Y68ȗ~}h[H?hxYxhA}||!@{Im B۹9{,?aÆ snLL~gcޟo ֫䧯`g}xZ,M9ٰ| fghtH&<_Q82A*0) >v V+$L:E{._(zڂ#d!,ddbk Ud!!5+c-T!dibYw UXǑ!dp-B|wQOBFGGwKoo/] kMqra0P ]4 ?^d`h9Nn#=; mOba 7sD#\=ὬY+tw?^@˙SG0ưbFNX̽D"ONށ=6n['N#X蹳r_ 8v#~Wzo/ºSҔ뮊;s=Ŭ:BC '0~Gh{DԱ vmѵBر'9~m,Xk2z2Z+|{?{>s-%sct,"LrlWZdIH!<-^{Qxd2ҹV\Փ ^jrQ)b z.ui9L2Q|Mq4 =xO&-|궛oZtuڔgIO'(N{%C|p8nv(gwYҊCGO[oӔL춷?oEZË;{y )r)g/g1]nIH;o=In^k|{sݍܳn "S[n5n7lZIo0ӍV߼N,^4PZT*4` {|o={o244Tm.APK JM7sǗmIb' =K)`ӦM<_+Vv>~`ۺr**ֲc.cTtw㺁Wh<#kٓB)H'EsǏ`(%P޶]O࠵77h8ISC86UR= CK8=Ny[;[XH4:FC H**o9 6|{ѱEx([&R|(1"8BO@Qd{(0'IC{+}$eW+ e{t5YJSj2)I.dyr9OLОkfAg;>:D0\qn|ZcOZ~-ܴl1JkNI2w;fZi e-fk v7};vd׍Y+}E/ݏO=_X~xYb##}۳x˒g+|'xL:cH[hXL"Ie,Lrýyx~M)CQYoPzQYk|2x^h<'֑Le8}(mZzq=}>LWke+̽0]Dc)6+qT5bEFXZ$O6,^#%#0Mr٠s hG=)_Dy97Y`۞ܺr1=-y>% ~~!,XW -& Qoe7'λoZþ#jN7AuQ}N=kVX9êN[9qfPp]~>e#0vbx} pg?WD!hkkcڵ|sҖ(K}eQ~mBOmhK+F$,] \XhֻL&IWroGhi$kfGt3LEd2-<7in$i"އ)vD2RMm 'LR:X"N:ДYI> "D1!$~:z_Zinb͆p9ݻw`̂Dlʺݔu1+@šKCOY&ϟ#O _[:r#au֍Dr]L-w ̓H&2$iyH R-X݋ZnUt*_oe[{yl ʔ|s79ud:Cs{/MV|mKը;Y+{ƾEC /㾘zcV1\;7+$_twXyZYZyښ3\?`3v8;1AG6cL`lt/y)yprnbooAjơ>ӓ&RВNaoݾ} -yd)[[iM%ijk'I56_ 5cb%(atww{nlB{{lcƆCJLkBEHB@] j!^_Hߊ)$R$PFa!5`FzT k-I5uBm3 < ,\6ݥt'`@cUHax) 2=7ujL!~-*`cM9}%|! \ 4%3x4QjpVwZYؔ'a2Xw`0 &0^ f"Y)hˤX֌AU di[3#W+ʞ@ҙA;%I dg"c%%m-9Ue UR,ГI`Ze(lޅv ϻTrq<3\0a4yq'Ѿ ccBE\/~ܙ}5Q/e`>HAss3?~B@.b}L(e1/qw8U]?'8|spu{ߖ&WħvHЦረ |)Lb|΄BQ8͈D%lXfhv%ܙ}:+AydUVqQFFF@dAYpKQ\K3~k)y4Tu1q5_]> h!$L^,Fh?rgë;GBǕqgo _ Z[t˵sQ(>}.k岢2{$~^|E~m$~;3",Q+,8F@5Xu.Q_]uܙ}Pe-+@=!*ȎqFFFPJe)CEm$3UzFINal ^ǿyZNt2֤P8-BP}z:5k} 䥔SVɶ|lvB@(rP$Pp,ؽ3>ag½Ԕ|g/hZUA%a…:uZ]=\k!AkÇdNH$H$%\E>X D(dF_?u!p?"!]Kj \hDs v JfdF|\1JZ\ zS̤'#L=8C2, EsYCH$Xx1۷ogtttsBwشy,K?>^z A) ETT*E{{;? g06:q]yh!@KI*&Idimi0U(H0003g8l"Dljd.[ ]Wl65'8Sѧ6AC C"a(NhiiqH'di\}|?}ejB$R)2 |:;;"͒HR%P$kzGTpJi| oc(ْTƯWk_*e[a3]qoO1Ჵ.јp@!1DQ2$NNijj5RJ4b7:D\ N477Fss3LT*8%-\#ܹsK&S)a/<x~|` +_0Ys\G T䨺P@4fNI&d2;Lqr`#Jy_._"脵ؾ]v#H$pgNk"8COOOfrr.% i-Z|D.G1O8=kkƟKK_Is!~Ub4ahwZm'O49 L~FupT}\)uAʸ3BeY)gIwnOP\2Su_Z&87.*lݫF+p.{hDQS,L&A.]zE<h1ƠuKq::'.y~qg_oe$l4F;[*ǡq&''g8i߉ ~53, Qԃ{q!y74[U{4+Br{mn.!]CXk9}4[nٳH)ygYf }}}hY`"Ti@$Sh<탠2zȍBEXBV] 6~%ܙ}oم ޯ ,AG6D&Ayef2߷hr ђMikQ:^56΀TsU@t !;G?+W[nZKoo C@I#MEn*Z׸Tu?|Jq.;Ӽ D[LNNJJ軘DRJJ>{@24NT 6$E@0[(Cږ=&Z ~il&|G֑0%*]!5NZZZ299I>glڴ kmϘ+AL>yBӊrGlJOp4l L0tܙ}mمKX`<pJ)I&?aS" J[|55vX qZpmqM@c(|"^u5Y`ða7$]nAv%ܙ}-{i R,}$EQ )%LNN4 cWǖ̈J|;7͟q&ٿ]x & .;>ࢥx_DSҩ oJ.d]bhmm55W#J* ipi :h"a(Z& g}|kg^.(oTICnIC4f걱1\׭kK塻ƃ.s>[<kº wȉIϩGXd5dc%wr.18~)`M>ywp w^"ocmt7K݈NEּٕu>J_^<.\JM*Ǣu/49hY\82Xm )K5&nD9Wٯ_`@3bqZZZ+M*1|3b BT:g^o57I[Z+24KVnwTݻ3?D&47+1::՛֡+}ަkl]!Xr/<8ʼnqzq2-S9x\S'xߣ?GJeR0r$GH*T٩;VTMG7p%2ќVu@4P 5ZB3&gpbC@I;eq-L9Hs@qI|H(?Z'Rd*r,րQW]6@5c^nf>_oo|Q[BʱcZ ȆTTi5/ZFԓm}*X@"DWO#c#o7^~FSK֖D1B& B0Q(r~]= p|g;?ϬA.ZsO'`|tEob}¹hkht,C>cm %!28e$5`t,@$G)ٿo'o{?ی8c.2QmjF'nrʵʆ6Dse49j(RzFk!$6n|._AXXB!$6R~ DC?do7 p*zWN"%-kpZ:qI;zVN&|8 H\5ѺЇyo{|~d*عqv.ǎ/?B[wȤDp\>{K FX"0*5ڢ|ku:mʹާc,ԞuA(B!* u㋨&V}|lRY\/N2 H܃X5'~η^'GA&Qڠ R?_Ogo;= x2Y`9r ?<įW_T6Ȉ(cIȴeYz!Z};ԋ8$=yWpn2MTS'Nc1MGg3/YZZXtR#.Xo31;u[|9!.W*m ϕ8H^yX/ %!mcŚ9~d/|ZM=Ż۟ߐkn-XAd"}Bt/:pjNB+x1y&HiO'Z91sgp]J2݊ԩa)"j[1CaY^S[(n( huO cM72-0dhG)j]DHid5ipFZ;[90{˂uKyg/? ܰl{ ǻٓ#|OJ"$Ք[>s;k7#;(c:pk1h0F7D9M&c(Yfx|CV E:uk޽kaeS>z ̤@Ǖ442}7_&֠%!L&Un '奙HQm7K+.oqY.31yLt/tq{ށ$SY6k8$^n7>yLL6GSs~wiiw>hnC$294tgk:4[zxsLwbȋ;D:tխ-\C{5o/ 5~{)}<1hCc}!@Yi IDAT?ЍJ$I8 a_of|lpRAċM4ǗB`Rb{ *K7h?jD;UeKx+22C{2}8Ytp}L7x=R*H`-,C8tk12@ 'up/HJ!ZC[RDG{:U+.Zy>M=z ^K "p/繥 J{hqJ|0Μg>{.ӺT.m} &U}o~{Xy%-ݭc3n yot|!]f֣ $IleF[=?0P>S>l[M|\D thJ!lb1V}ey"pڮ(0 0.;D l,: K:̴es#6?jq&p@!X~6^\+RGCohk m-=$2 eWq} Kϲvo}Ճ ?;x8s4_ccmrC((Gɳ>h9}> Ee{8O"ORp'Q(cQV*;jb'Vcsc}`]=3G6׆ Qss3뢵q.ҕv2Np0M82\f|S UJFR ^5|Xe|o4G>8C'j'lm}1q3{k7޻=Dj9ee )j.X,[DuB6UFmlkp@n 1ڣ U \rK@EU m"ќG6`E% xPMt/!eD:=_{Oa|M& +t v"6&Ύ;,!Bko'km6,&Ց0>I%G:arlfZijT&MN [IfLiMQԅL_6Ϝ'R u_ Ee)6!ԈW~UI]1=]S~.~>S ]f_ \hD(X˝V|[XugQL /zrdhiik  Ks_3d,l]Vd*R0/줥 m5l )$XK~V͓ɣe9*k#`L7S4)I e մ#З@8!%mi8R@P87>]ʹާ 4dY|߯fM5x?*b*i< NջS2Bkb~ hFԪuqWKDpF4eK F8bC^&tA u$ QXFVÊI4aAV_Lh9-Ǣ%iL}:k;h}ܶna$J[|xBOXatB1K|Q"E4_VR]Sk%m:FC 'P 섊-J 3jBb5S5b|C!N@e6~?*Y{W3rQpKT]hDVZss7hbӁ4ձee+4ErK`\XM m~znx" 93BY *-p}C5a|Zv WMR(,kwIίxV Ĉi h@?!jS4WiW_e"XSSyƮ{"E6!tJ|8] *H玥N41~J?DB)G \hDZ&TerxXKZ鮄{=BP+*:Z۩l.;Ӽd\ektvCJI6^C@yΟC.t{vA()_bW? 7H3Y8_;Qu@Tg( [< S9?* E9mż+4ȯS٥F~rѨ:To_8ӻ hJM_:jEw׼&$G2)a*!͒q|>?mhvl .qNyVʹ3jK V[\4N8yud] oذY.]'z'xrvr>zFC aa ; ͒H$mJi#͑ى1&,gOAOFUH;aw:5ŽZvX&^m9iE*82d)7߈JI{vH,lg3ɯM$C"Nsx__y8y$?gƺu;K;HKd:Æ{TG ,:+D J&hf 2QjQ/)\Al Bf7u5[n;wիWvZnʭJ*ɵ6KceE|5.}n3ϗj$ՓQu-h ʀAkbB<=%BNx6UO& <[>Q;lE'u!|GxǎСC,_B;Ak]Z2npSй]fy kY$Bfvܙ}\vpywg{ot:]j{0)<(Jy<^ Gimk׎_!Gw_]ՆPt}!R===p tuu188Hggg8ZD3bh(JX !rܙ=k+ŸFmN$ AzFնXéOPnȯOhƝ+_~ \hD9ּ<3?~bl޼봴Tf]=j"4*:a;`vC)e9τ;ӼRe7_k|JEd.|CL;f굒 sUJg-BІ</mn!]p]o|<|+_Z˱c n6 CQJ(]ڨC8 /"Pˆ좤+\^.wy_-~yn %)؍ sJv{ mQ|eJo=jyF<DP+GbgݖR^m~jRM ZBye4:ٳg;7<T( BR$!JE,Y-O"YnItOzz̜q:-K,M-B7 @}ˌ!2{ bd9@ˌFdf,7nܸFOѣG{thf=]ب()EJed=HšrPt' 'XH2]/QN((:v b|Ghx Uv:0cui.ͳ(Zmj?_J&U9R{n< \zÇaenJ0d^Ӛ0*8Z~۷6Ξ=˗yxW:@R8Bphc\ͼ_ $JԒ%""$*|G)X6y/:@4 # C9" r]0;EE h򎎏?^ fp[Í7}w?qU EBSMJjQbllǏ388ڵkYo*+W244DGG/n;T:(M-AooހRל͞[i /9׼ec=k JQVZ*sM -yR^=ƞW,F(`[C0;Uv7xobJFFxnz\Ws̛Bn:;z}.]D.gdd4( eq&FE[{'㌍\~ʕS^k9MmvMUqЫtv ӷ1涞XKUQ"K@8 @H*:2CM Bcx" 8sLl. Op}m6qAft(Kbȕ=E#c)/Ҽ*.rٵc_`wZFՎ$ƨDm/~pBC ~[Ot{֓YΟ;k08o84&zVaܙ<|YeAny r{>GGsR {~E H>?y핧9uX-k15buٰol7gwb`-ǎ勌ONodÍiwtOrZp\7X7MG}c"ߝݕZL*jQC)Eww7O=7#(Jkktvvn,}Ј2\k[bRro%v|]Y;ӚDKaą. ?}#]!.$B^ z(l! ԵDZ#/sUZMq ld1| &&ѱpҴs(vopry.^w~hll=LMMq뭷^W( 1SPcZ )iA:pK %sn+3R[I9`בA,fw,Wnf]=_%[Mwdt-[Ǚq1a;uu-x7Lݜ|EMzꧩg#.-+ټC7,C4k784мlyu-zGhn_+EcS7~NߏX.V m}.2\xIrWj2+[t..v<-]?0f*U=VދWX4!JQHuIIIs+@Rdnh8 +hvyJLRnن LȴʢapQgto0Hme+2d:ce^>wWv_C"Qpyf'OD)`A0#R )P/RoQv&9Ҽ+[%w׈‰ XLx,AkqB{"eXbwXa!U.\iCoa\P/ һh?8xw,%6c]+o)[be3Cك{"Y_qN4+P"Çw}GWW_ٽ{7l޼OӳQml ut.6)J+%TJ3P :. IDATf:v˂&VkĺJHh@T0pQ9|rQ__'?Iٿ?cʕ#jV_/8HRRn:I'dfAzXN$jyfZKjX4y8^?Mղyc$$lPZ(`͆ \Q@T|MVXT_lݺ^2 cf' U8 ؠl:cuwB~%J^ $:HjI3\RJMMb{,|szi,W( DUhzxxWyg=rرceuZ>ڮM v I4:q+{Ė]i<3&2vY)/x>RsXAE_|m!ؕ Rϕ_+Jj_EM B8Yne׾5N89%xPX)"cv[i w*.rٕ!c,e2wiC3h Q4P/SRfೈy/4\WOKYB IBM R444|{266ƍٳ444/~ 6Z 2KfC!i"O{޹s+{AF[v~{mBb!+}D垡\Xw˝[,~t $vR,͑㦌B:;BsNGM R8Æ Xr%Zkd2 Cww7LfN4&tb X$Wc+k2Ony/$?e7i#ixFk ?Ctjڑ9%in|[g>5W$}A+8!Y)5*eF,]MJjQ#NGA*C6" .H5_CPB7ony/?]Ȳ+j&]C@pԡiF)ӍpݠPH/Eۗ78ET*&osS2*M]@0G Mq_ 7~$hϙ[i O`ٕQъRG(  nV05v4p7nބ֊Ck\M/f3kKS੧bnD&U)<?J)>} .;g?;mImFhm׸CDrM$]*2.Gpܲ;NVA…%7WRfrM;u׻R9\TTMѾ]?벣HX^`DFO179 X+]f7QNٲ_(3t'׻f;:|6~\[2n*Rkr9>E>Ou9&p PӠAUI0AQ%yrp`d[|_wƼgQv%p~WGf\Vul| >:|˗;@cc+ּ;(%6ESFd؎ÿ*|d: #3"3b>Mc-k\q}\ @@M B(hnnf֭h]^gc -sFCW&Hռ^0M,< >(w6mىJy)ů{n$"cs 9hcbtd7xobb*G??7q{yDBhéGsi\A)h1&u{Wj|J]fk4ۈjdcVt{t,]|Q񃞬B"<<*1GL4ٵk׬DV΅pEX;_87+ Y޿ HeZ34OW_yT*KO?F~rw9s ~^{iIJ@tClq'SStǏ5O=7l^|Q^,}~ׇhlj~}{>0O?}.=Fw*;>{|Q DJ(k̂]*|/vp/”XPbidoS DYUr/yC(ujk(FM Rd2Ν;/۹#Gr9u?(4_'|A6aU M`4>9p7g?'Ƚ*{C:SO]ġWUndÍX;t6^պ@-(PTή,_g8s( 7m}_óOmk9v}+pȤܺ}q}z'hji46|Jݵ L(`HcuTÊ6ؒ`|o)R"1/޾ AoLbgh*}7vtZ GՏ@Tp~OSNK/o>-]wŦMHs}̔* *p5o-*X h)Y .s~qRO2|OƝlzS;ggg9{ .]8É7^w _~57skI WBBnK7(pu 8nQ:s]fڛx^æ-wӿ$ghmXCK[o?C{hlZf틮*}31_Xp$A tV(-E>Toa5x#c#7 PoGًԬX/( /uKj~*E6eӦM[-[pe|Mǟɟ>9l2kjdz,Ą`"1Js\qyaPcW7_O+Vn'5T=z<#45-<ǹ'_WryzW=kP r9\ץёKo7?o2 @*}|W(2姤 D j=&*ƅh͞/"\=yj}s{?ʍݙ%|ų{g7r g& UvQ02|\8ܺmݽ+[tx̿ \G> BICM rihkkCDسg 0>>>HNo Rv$0?K0 go!ʐOrێ9rx?Ԅ] cMeXV^y_bÖ;ُ+/<(zZ\ĩSIgHY^|'\GWAD̩> r\&&&9qM-xZqZ#(L~(#APu]Db<~SMǥ#F/ٳ] *ͮ|7ݕ|Y&U)DIΝ;O?3<ŋwwb```!)xnz?ZUp͇5s:ȅ+ H9YV rAC=rp }~GP Cwشy|_;|C VN3frbWz,/>N?̮~щa._>KG}+ʾGAk}W.+moZxGbZ*}3}3Ǫ!Q3VkxTXlq4EƵ(zW NeihjC/11>0/>syavq?Z(<Cxӝdu(}+yi/Zs)Ѭp+.W$)g8Knƍioov_3- 5%~9r @T MAerSlWw2,T 7މR.@XVtnYqGxG0::̏~(pY)kneY_cclq?|Ν9`MA) {~77 [#knaM4=Y5!]|=?~~n'0|FF98_z+unCTW3-~/g"{(Ր*py{1|M8p8mwJKd˂xkJXR {!\|4,Cb.mn~hXƧ~piZXG}c"c? Mp4Inنf }_|khzqSudTmw}DܺQvOGicS5ڂg9J{ ²ԌHckA_3m,RJM] -nbᆩ^'SD6RPy+Jq}B1r2GDจr>yߐֆ\C)\G)7lck{8}07m{+sYΟ;ͲU 7-OoZ?sԷv:~ ;sNMgy|va\ǝճNHֻ V슸 %-i*RիWơ0444뙰6T#㖶a] צ^Ά P_FCh}+7ݷuQn*]14t8τ7@X$@k}ƦeTLѥg0bfikC.J9Y:>? P1fJB- u߸P~(LbW_k7ΝBfblsg12|$m=7-Ls[J9 _0а6v k=9; ]44wN[gm}d5i<ߐٳl M,S8Զ}{0UC[)%j0 DU---ر oq34qID)VB.1:|OBk3 E m Z['".y ڷ ] )hllZںrqbNwWkz*R u{2H͙;J~(yp"C(<<ucZ|[yzYw]<7yvX5t+W.X~'?ű#pg5p fZ$Tgrj7NSoa{Vp}Ô/7\9u9!L&3I٦Z8|E:8y0]46˛" ߛ=*\ר J EM J*lOp &\<ƶ^̗[i 'ew`ἫG Ucwy]*')B w2K>F ¹LeܱWkꤳo-W_hiw~2&iXI6-HgilATl} *E NVDhnBT6pZX T 4IM>?@44sǻ4[M~ٿ; \QV L DU axxqƘl65DB`EF-s!#q+{ӿd]+eCzhYRC`"O[CnAj 7aZÁ-=qxB>񴰬k->|h[CS[(Irkhf[#nTt:ˮ|lQz6462l}/u:ؿχ -hJ7r-泥g=y?Gkk7m]xD[. \$&%EM RO8tΝCkMkk+ݼ={率av#K{U)ہX)vph˭4'60.iryo[L clA@}N|KξV18J8i|)r4,1Izlw""x&EOc78 똢E3(zHg;z0ri{19DP7ew:obmZ<B]ݕ#>~\!i DU|>2{ E<ȟ;fQP*p5H(K@;W#VBH ,G҆R*;Bhm}Y6`tv q9{6g|e77^oB,ep/3S&53\=e'AYЩńkb.JG@TZOf֭444DC+VGeϞ=vmm,Dm9.` hCXa#T)Ώ[i Ol١!"$ IDAT$ lpD  3b1NJ*.,Js5&U)RCss3r ttt)t1)XAWc\eXH!˜潐5IT .c|MqL$8>rx]" RʍK@T.i @M Rd2~~ݻnR9sf237c^(=ś"`L|+ҼWΡ"!8󅩼XbA]~Fuۚwd|sRTt*ܹ<ȩSbÆ 6x'<zbbOÉn^I,K>+!osH5D!b }, ?vL& fJiΧ  uB IEM Rcz*311C|2m @ Ca0 g?:11D@܈R){=W­4' 0;/h >_1 ;JSx"V_ w~3%_̋Oq@#$&U)<_2'b|K_bbbn?M[[۬i %4^M$־Ap۰@ngdA "(TSX )B"x;Diގ4#j~)Bz-['5J}/V_:|ʕ+7oH$ ªLM*V5M" j8:C.MCޥS9Q4U§bZ,7%%5$ 5"*{//ٴiccclٲCqN 27T6K34/f"qXfhh|yYKaj4ي+[KRH:m(\jW3kn*F]]/\r/bԩS\x;s!NbT٢d7nUI7o4eE5 D!RQySƗ,(<΄HNL"ּSs6JWLB*|˚ *E*⡇W_ o>vɏ~#O1::1ƐJؼy3=ܷF!Et.4r%wN=37<|Uwi#e>%RԤܤ@̦]%JjQB)Ess3'NqF4۷oÜ9s+V̪?c-ё Ҩ7T Ѡiʭ4n3 "} !4<˱8|`,! 6DB6ږ-vQj%Μdө` BIK5Jg[W^xzl6˷-n/_>ه%BBH! EMAsB,mpJ^0~ˮPfc$l/=/_>vkB+2$.gX\OrgrÏջP*E>_*vnرc|ߠm۶qEg A{S2@F h!hb>J^(~Rڠ֖,2ZvR4]]=Z=D/sMϔτ;ZFڌ־J͇_ HzzzIiEM R糟,7x#;wf͚5Rstbab{(k \r+{!Uv9vm%Q|œ߀=^Li.LXc"̵ę͖_cE(P EՉ@Tp]}kk|c G8x {0Al,;ò>q(Xi%Z@h2ny/?eGI C Dc'Xy_%H k済$=/u]o u.[%5JN-~rDN~7g``YF u9kt\*)39r+{A -k0_l][v+fs|ӕ\N-vlR Շ@Tp˗q֬YïsIfH!Z(%/`Iv"8_rtiJ^8~b.x u]Si|'X(f(.Y_Qe3?GAMǸPT[2^*F:\lGOww7~K*#mΥf?y% [ĭN~.bj(DI|m~L XF*o7$2\_+LjP2PrԙLfn71vK3qb\cE L, A0_ny/?]IJ+Gе%3>t:1Q"1#6Nγ u08kqUY'?3r ^ QEF Տ@ ]Dt]Dź OjU-Y6DIRTyܶuD X8| ġxR?QuN8Tj(&-!xƪᡰ?MSoZ ksVB񩀻eW 0+/s`"z`vM v k,X5c0gFH $ooc5VTw v_,P DK`;W_puV%0\Wc%ͭ4⇒E"ˎ5T(HRv)F0}c|m[#B} *Cx\8=[ 8M@ S؄ xݿW8^kPkM b(c~#S VR71|P),1_(E17el\4K5h !ܽ5רfCtLL*,(@ԁxؒP -X$&Us92(Q λdŪ^?l<#W/pfy.9ٖ]9ϡ/ǎC-z@)2gxx/辰[Q`qRXn*8)uZt` b| yat|sڐ7Jq46Ҷ1]ݕrI IEM ZB7! h욼¼Hl(xh6XA1gny|bw6pgzE+MYUvf'_(#- %J3nں5nq\@!ʥs;|ҥ3\|U{{(.];,er}N8k2QrQ@ ij +֨q+{A-j=U'Q(R: 1x^Qu(]|._̩r]/Gk,C[YֽL?Tv{g a6DRLz>'N{i\N}] _[ 'yanZZ;6IOJ~ÿU>:gϜ擿=]BGOy6p-kfʛF6zw3{Ώ.r}`{P DK:p-Vc MآcJmCr+{!-{0Q%T5Dֆy:iu]abb Z;z|R@*Dgw#9y/˿+{hn0Zbtd2b|jzVrr \]5Xf3jzw +iA xV%:l?̀D,_s+{I.;JăK.8yT {m Aeqc'H a_ 2FxBKI^\r>zV 11>JWjΜ>΅(T+6ӷ,:ij^GGM3::rc.~| 3JU@T%np?$&Qvb"j>7H ~3*VwE|f_+A?8߼OB `a0wYJH:!|& .,Ae%f|:*E|Zᦳqp1im4QN_|:)2uhcHXH+䇏2Y DxJKI0 d*Ϸ qT(@uHi3fLJL}+CƗ^|C!Z;W"/8_/N>cpR 97Cs &&'>-m\|5xZs/=M>?e#=ܔ 9?G>|MuNbFFևg//(L8T>_44k &Qr셿w8GVH .%w$"Xq-a XU .˺p#Lo{ )ngO.:[C*Sw}MÎ{hjn?KKk'8zVl|^T-GAss߲gƖ.KGj|Q81_srv-+M9 ܴsk'Ǹ:Ld wJ`_36 ;٨ 7[i /yDQ<<ǗF(#KɁA”gО˦/ ^wtwh^C~t>Jd3(%L3={*eqR)Dk  ,IpM9t6fg:W+H6L.j;ppƦ&^ pTl a(}2_ny/$?eWbלx ~c(?Ly։#Ye_)ת&fQ(\M7¥9'XTay)NpP?{%Ǖy^DzSP-At6Zm(-7ҬzsF+3+}93gv~NϑtVT5d7M$Ȇ 4A$()̈x0UP"#?Ȍx{}W00'X4\K窟MG1܍ίx"LYDh!\~L_{+%F86!o:Hs@M|h*ɏ L(_ H1ѠB8Ű,kjVk"GMaKhfEW_f sj "x4F*#vB4O@^;Bakuq'!>W]D z#  Iȏ!m{J "kK71&ZsbjRşc?C1L3; iz?hZ (&|:f}#SuZTHeA͒s_$aR)*ʔDJCєmQ5ji³wGO>XCy|U pGfsǴC$-k Qn6z}o_dU Zi3f!PAɪ{R8 NsI23 cxIՑqs\jZŵ(V-ssد̯i LՇZ:g"DՉP%deZռwTppt"E& Hh0Jk8RS,_];5V->MD]r3>_ᠥH0M|>O\Aa7$dNg˚5N"\^y^z'HYFh D3JjTeYIxؾ: ^)@gW6ρǹtV!Zxxݼ-Z?g6ng.1 ͑gp2/+09v }Σֱk.RUȊEŒӖB*#00@ IDAT6;moqe6kpŞCI&{ܻ^`/gȪs1D9ڻh°Z65F ם6x0 G058J Fk1,]u ѡ4qȾo(874JkjVM-Dh@ISTͦˡT uP#p5?TbVC۸G-~~;<㗹k̰-iʥY8l _!xB˗m N [Cܤ cG_xľTc~ d;nJewa#D3mUjs@O^$ABxp4xis==s9^~g'o~xSlIk6MJhfws.6a8ڶHEg6B+l?yJš!ǣ {mo}K%[\2;hHİ+Dhf,mo' R8Vڲi]g߽ic]-LislCnw͡gVtЀ!-Ck,_/rj3Db˗'m`zZUX #8Wz\HTHM)B!|bX- )54TOJ#TMspsW֬by\"MRHg(d$󧿼 1LR+Jf -B~\~iblۢP!fK}hg(PW szRIk` >{̓!ˢqCW*ExB 1Y{7PfV:\sn`T.r#4vi(HQBhe &80iQ,<5؎Ʋ5p[/pn6"Ai0 lEMZLVHFٶ{P7cBèsdc&󘆉i(QV! MD+MAk.MbKiʤ\Dki87*3X\dnSS!U3fSd(ձ{=3XҌRnBq :9!04MM Ҡ< +CILkZt@X>*_H"=!L̥K&l@o!܀y)5Q5åǯMOcZh>9 6e.u6u ѶUSY{ce=րJR`Akj~R27_K/p]"ķ?| |Mܢb;ucGj(FsGn?{:?jBnM6 0|] !ܥt$IZZZ|2bɂpb)@hoٽtGG2hVG|a=>a R:h nQ(7h|C HwFW;F+O]5v븎tCQꩁHH*p*~Htƻ}3ߞqpo-a C'7O_!\ sc@N%A"m&u." !򃪥؎ƖYzƗ*ZyN:PhAsk;Hgs()|qM^ SPlnwKpcǮG\p) 90]ʵ|]up)^\3"-\qdrLVH5y8pmW^ZN - XcOp7/Z)hO$ImIJK-;C0{Y!}\e(k5𥖜;{>xG*bw{!H"00LK0 H18pahByh^2<-mAk.#n&ԃA.[t+0==x'ϱlZR,v [ Z:q}3_95O`*u\CB<2 viYA.>(dITzw.(G(@&aܹ?~!&zH5Ri,Gy!5n5V;{v0魬u#䋊X2Kk[R=?!=w1wD&]abǑ{M2Yvxs/c2CA ,bphh(_#?rF.tw/He\/ 8{$~qr M{"KbDp*Bg:Ajnr}TMS 1P芅dCw4K>4Smt]Ꮇşc(hn&_FB6eܹ۔J5q8i (jr͏GTi%nc3RŨT,P͊ճ*%3~6>F:[w^˖\pӧN0xK $ݧ0 A#G1n{3Ǐ|^!ޱշoʾ};Yx5sG9yC{k+޾Y 6 dXjJǐv|tPk]u1"H54Am0e [2v?xixߨMNFT;7q7"D> ;}h@J }oaX8\_K-%JTl/Bʲ%.$39֬{ܹnyS' 7GjH,JHV1 e՚I&>keE=ދ= $Yr+WCcsv =44v`&#Xs *RT,0e / mQ` X ~WbHM0  _Vږ'Exuw׉x+Jo7ϔ;Uf1<+r9ZZZYlLfuUR(3t$0Gѯ/F P30q;4Ld:K\!aa Vni;hDj0bq6Tpy,Y³>---=Bk 1VG2Y,YIfw-gyن.\KR޷wHe?|C|; TxP? L3>"`Ul*CŁe86KQ4vA)AqXreSq$;$%m}e2N;@ˬy2X%瑙1= !b˗S.B466dZ9.ZXb179]<p4eZBZinX4kLE2?NЀteaX9F.W7St- !t 1ɚ_y\rvV#Ay|T eYb\C;, +gcI4Y˹ 2oZ_KS>#rJ"At!5XFJa֚xX?.0zi&@s\b,^q?CCn2tXH\lw՜ύ0 i,L(JJ%ցX*JضY(|kf-444dHRЏS( zl߾#GP,'LҔmnLora@>73h.e?8>zUnV:u iY,#fm˲Gb1%T*H)#140k4͒f) 0QxLi̝;Kkt[L!˒n M Ӟ?GxjjNF+ h>ZJ|u-|Fjp"cF$‚(HNT*y.]?˗ː-Ԅ`1R Í'*6Yn=?x.,D.ZZZظq#O޽{뮻nN1BPXIx a'?nL#9F :]eW$Vh c " Dt:p޽?-Gxk5F-\['];H_`{;x'ju>sH$Xlr /K.y5 Z)PJSޅ-ڳL ʲ;,k-|V=_m?2W 7QHM31D(J&ضE̋5WvսIh5sOձ% M\)+~{Jhjj'䥗^_%*RQRBPM4~#՝~9@tj"L`7p5n S fWM'cF*2XviD{sOޘfx" 6L):XM8]gx%Kyfyyo8|7樵jP5 > ]w}vi傼&}#r ==N_ n<8T*ضM,+0 :;;y'5k .=w}57d֭=zݻwi&>\uY؊OxRI7CRoD\"dh?g0yȫfԈ]_a"Dz)%eaU*ʗIDAT$oAT #Bl4_ik{}|F;-O^:Q3A|ai1Crx<䚊pAGGioog|.sa…r9HӔ >|;v`6={g~ax÷$I.玵8`7咅m_rjedL:E{Wa3=KTB$! P)8ȍA)jMെ~$XF؅pTqoAJO#}- àuֱd9‰'8s { ,J[/ŋ:t(xAv#Gرc>(+Vwd/ZH>ҥK S*! aaJd477J>'Lm64E;Y|2 MJ( % 4µ,|=};v-Ц@:nQPU! NIKK WcYV`arM~8[nT)y9}4|~ EV2$N(X5I&T*QI{K$$I2L%P(H$QY&7"A4%Jt]f/p.p &denke 溹>B#$hPTճ5w܀Ä#PZǩ#!&|>, /xbJŋrJ-[Ƃ hmm%2o޼QKR)lPbG)Ԫ1[eōB+Qg0 i\k7Fڠu ~ X.jup5LXosy{+?lO0=Us4S?vGY|_k"tF{8;֖6gy{n,_n/}[V|rH$,Y * awY̎2Tr9Jr9AarDX,e2|`%JӁ(E$G$Nՠj?z sMٹ⿧ 5BB+kV݉tca@ҩ}3}e!dYF#1b&6B&Q`"cr@)TxݵH7DD"q]\ j,#040qM"/,lL&C* ,Da^ɉH0H 7Q_e(1V9]U5='8ph?kWwSR^GO}̜y<_cVK;H`W4,a(VfS'Oמɏl˧6>ʪŷ2X䃽;ܷ!֬-?vThe^_d1/KϳݭYϞB7mJ|C ֪0%b|7Y}L8p  C*HEH hV8ƝI=[oڹBh+eMϹ._/7#_CI7klT⟟{rݛ8q(??^F_(Gb[<̎]oa9aF&G[y`#;>ϽgioM.G/%OӾl"˯=϶_leɢ5_C Ͻ/䲍[(;l?o= Jir0 R;%H.4qPOj TE0QkET n N"oQn}Wj4JA΃Cfr513VŦ vy/,VsQO95tWJ  ֎A*t*=w<ٱ{;>{&^xWZ30gqٷ}6m|Y,X"ū?{5qžߣkbz{{ݷm$OV+Rhh0i"%LBŎo Ebhj!D3 qT'BO8=b`չHeGN[lCHЎ[ T>{?{,Vy8q- Մ2yn[G)q ||t?}ugӐ)p}jNJt4͡rnn ._9͇}6Ysi,4lj$yy/hY"|?EGDA [S IPi)k4*ؔj\TAb\-Ҩlk_܎.7B@`ڵ$9GBLۛ-|!KP܎TJӳ i)Fb'K殤b CdS9e i)h :fua ˕^-MBH2E)Ʊ nٴ3ܾ|=|A-CČBQ6^Ďxޮ~ޯo#ԄoU#AS LQ8ҷB&XoZN, ~&aM޾nAKCFsm>̫[ PąnrBDS7Tho359{CL8{%iBImY Xe9T[ LNQH.F=ovGT=q4 6BH ;y'WO%%- ۾6UM h+7Y#ڍ/1#&t_{|O~K}YVV[y5-()]V8BRd[ka_`Yudi*R4|O"LV`13m>)߇t"mMTʃ,x'I4BƄH$(Ʊ< n&A5h W+:V'SȴT$0m ;q{ !l,w+{(d۾c8V581|OȤn!o|)3Ƶf^{)[l)nZȗ0M[g0 i ~?Z sӲB;.!H1k I17 |{ޯB!BƄH h@ hן Z_ r3&Jd׶DzR@k1Դ;ܷr4TKߊc[ny!p,Y-]#ndyWq$F ikL#Ngs9 qZla is[ .al@Z~!]Kiy/H#A!BׁHxs\;.F8ʠMc^32_7~JG"Dä C`!j`"dF Bz=o-BH:2Q|! /.B"\+"A4cAc1&~ Z'e;1{W&o7ca߭r"=!BcE$fu ߬8Za߾NxQ|kpv(?9d"DfDh&AmirehF+6GhwëD*CB*B"\"A4hG!eپ˟_^Ucpjr'-_O᱃ET4B aF;yו"ׅ,}U\w}2|+}' wZIUf"D0vDh¯\+& EN^"lq5p'ǯrmjؾѹ>( ] ~*"DHM3-"_7j[ -ÝTk{nH+p⎷TH[WMD#DaL4DRr)9x}K#CxM9\+o7?Bh@pKPd!B i 5RJR\pj']훌FZmQ&6cbu& QZwhBTi͵pH5}`ƍYA>c,ˢE9v ϟٳgygx"+V`֬Y>ŋ>|-[0w\կ϶mhoogɒ%]e˖M0b5.m!BWFd!FE_MFA_f׮]o|̞=ۿ￟T*/}Kc6Nr-~R):;;qVJ>|.VXKصkwy's+V`ضʕ+y9y$J%8˖-{參o}GKK 477sbve "D f)z2I:sx4inn&sY,X@*0 :::PJa&_x'G̙]wŲeQذa駟&ϳn:VZmtvvL&imm%NC2bHwww;;;ihh Fww7R 4'_XE!B4C71o]fryDilذzgyvl͛R/dVZE6EJl6˱c8p;wd߾}<#R)LӤe˖ /h"N>ӧyGp˲ٶeٺu++Vt:bR EB(Bu?4CaO}aatuuC/I\~H$}|d2׿u2 r ۷oСCZ^zr96nիillw矧ロEh"* BÉ"㴴f"5ΝҥKi:;;bsidY"BAΜ9CP q l&͒dhmmŲ,N>MR!LR,\t 5---ez{{BO200>9 T68\pCCCX,ڊiAp "D02"A4bq8LfL$ɐfeWuBM$BOԤG.$$$d'njv8笜.׫bjBIfZkcTJI5h퐟J)E@̔jh0fRJN',eHzi6MӤyUJQι0*gxЫfև0n1gmж_l ?kA+3;[}y_~~yؕ>{hDʏ.Fj/}maG?ө BDđKğ&xz@@,DIENDB`